Changeset ebb1489 in mainline for uspace/srv/net/inetsrv/addrobj.c


Ignore:
Timestamp:
2024-10-13T08:23:40Z (8 weeks ago)
Author:
GitHub <noreply@…>
Children:
0472cf17
Parents:
2a0c827c (diff), b3b79981 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
git-author:
boba-buba <120932204+boba-buba@…> (2024-10-13 08:23:40)
git-committer:
GitHub <noreply@…> (2024-10-13 08:23:40)
Message:

Merge branch 'HelenOS:master' into topic/packet-capture

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/inetsrv/addrobj.c

    r2a0c827c rebb1489  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4141#include <io/log.h>
    4242#include <ipc/loc.h>
     43#include <sif.h>
     44#include <stdio.h>
    4345#include <stdlib.h>
    4446#include <str.h>
     
    211213}
    212214
     215/** Count number of non-temporary address objects configured for link.
     216 *
     217 * @param ilink Inet link
     218 * @return Number of address objects configured for this link
     219 */
     220unsigned inet_addrobj_cnt_by_link(inet_link_t *ilink)
     221{
     222        unsigned cnt;
     223
     224        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_cnt_by_link()");
     225
     226        fibril_mutex_lock(&addr_list_lock);
     227
     228        cnt = 0;
     229        list_foreach(addr_list, addr_list, inet_addrobj_t, naddr) {
     230                if (naddr->ilink == ilink && naddr->temp == false)
     231                        ++cnt;
     232        }
     233
     234        fibril_mutex_unlock(&addr_list_lock);
     235        return cnt;
     236}
     237
    213238/** Send datagram from address object */
    214239errno_t inet_addrobj_send_dgram(inet_addrobj_t *addr, inet_addr_t *ldest,
     
    282307}
    283308
     309/** Load address object from SIF node.
     310 *
     311 * @param anode SIF node to load address object from
     312 * @return EOK on success or an error code
     313 */
     314static errno_t inet_addrobj_load(sif_node_t *anode)
     315{
     316        errno_t rc;
     317        const char *sid;
     318        const char *snaddr;
     319        const char *slink;
     320        const char *name;
     321        char *endptr;
     322        int id;
     323        inet_naddr_t naddr;
     324        inet_addrobj_t *addr;
     325        inet_link_t *link;
     326
     327        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_load()");
     328
     329        sid = sif_node_get_attr(anode, "id");
     330        if (sid == NULL)
     331                return EIO;
     332
     333        snaddr = sif_node_get_attr(anode, "naddr");
     334        if (snaddr == NULL)
     335                return EIO;
     336
     337        slink = sif_node_get_attr(anode, "link");
     338        if (slink == NULL)
     339                return EIO;
     340
     341        name = sif_node_get_attr(anode, "name");
     342        if (name == NULL)
     343                return EIO;
     344
     345        log_msg(LOG_DEFAULT, LVL_NOTE, "inet_addrobj_load(): id='%s' "
     346            "naddr='%s' link='%s' name='%s'", sid, snaddr, slink, name);
     347
     348        id = strtoul(sid, &endptr, 10);
     349        if (*endptr != '\0')
     350                return EIO;
     351
     352        rc = inet_naddr_parse(snaddr, &naddr, NULL);
     353        if (rc != EOK)
     354                return EIO;
     355
     356        link = inet_link_get_by_svc_name(slink);
     357        if (link == NULL) {
     358                log_msg(LOG_DEFAULT, LVL_ERROR, "Link '%s' not found",
     359                    slink);
     360                return EIO;
     361        }
     362
     363        addr = inet_addrobj_new();
     364        if (addr == NULL)
     365                return ENOMEM;
     366
     367        addr->id = id;
     368        addr->naddr = naddr;
     369        addr->ilink = link;
     370        addr->name = str_dup(name);
     371
     372        if (addr->name == NULL) {
     373                inet_addrobj_delete(addr);
     374                return ENOMEM;
     375        }
     376
     377        inet_addrobj_add(addr);
     378        return EOK;
     379}
     380
     381/** Load address objects from SIF node.
     382 *
     383 * @param naddrs SIF node to load address objects from
     384 * @return EOK on success or an error code
     385 */
     386errno_t inet_addrobjs_load(sif_node_t *naddrs)
     387{
     388        sif_node_t *naddr;
     389        const char *ntype;
     390        errno_t rc;
     391
     392        naddr = sif_node_first_child(naddrs);
     393        while (naddr != NULL) {
     394                ntype = sif_node_get_type(naddr);
     395                if (str_cmp(ntype, "address") != 0) {
     396                        rc = EIO;
     397                        goto error;
     398                }
     399
     400                rc = inet_addrobj_load(naddr);
     401                if (rc != EOK)
     402                        goto error;
     403
     404                naddr = sif_node_next_child(naddr);
     405        }
     406
     407        return EOK;
     408error:
     409        return rc;
     410
     411}
     412
     413/** Save address object to SIF node.
     414 *
     415 * @param addr Address object
     416 * @param naddr SIF node to save addres to
     417 * @return EOK on success or an error code
     418 */
     419static errno_t inet_addrobj_save(inet_addrobj_t *addr, sif_node_t *naddr)
     420{
     421        char *str = NULL;
     422        errno_t rc;
     423        int rv;
     424
     425        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_save(%p, %p)",
     426            addr, naddr);
     427
     428        /* id */
     429
     430        rv = asprintf(&str, "%zu", addr->id);
     431        if (rv < 0) {
     432                str = NULL;
     433                rc = ENOMEM;
     434                goto error;
     435        }
     436
     437        rc = sif_node_set_attr(naddr, "id", str);
     438        if (rc != EOK)
     439                goto error;
     440
     441        free(str);
     442        str = NULL;
     443
     444        /* dest */
     445
     446        rc = inet_naddr_format(&addr->naddr, &str);
     447        if (rc != EOK)
     448                goto error;
     449
     450        rc = sif_node_set_attr(naddr, "naddr", str);
     451        if (rc != EOK)
     452                goto error;
     453
     454        free(str);
     455        str = NULL;
     456
     457        /* link */
     458
     459        rc = sif_node_set_attr(naddr, "link", addr->ilink->svc_name);
     460        if (rc != EOK)
     461                goto error;
     462
     463        /* name */
     464
     465        rc = sif_node_set_attr(naddr, "name", addr->name);
     466        if (rc != EOK)
     467                goto error;
     468
     469        free(str);
     470
     471        return rc;
     472error:
     473        if (str != NULL)
     474                free(str);
     475        return rc;
     476}
     477
     478/** Save address objects to SIF node.
     479 *
     480 * @param cnode SIF node to save address objects to
     481 * @return EOK on success or an error code
     482 */
     483errno_t inet_addrobjs_save(sif_node_t *cnode)
     484{
     485        sif_node_t *naddr;
     486        errno_t rc;
     487
     488        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobjs_save()");
     489
     490        fibril_mutex_lock(&addr_list_lock);
     491
     492        list_foreach(addr_list, addr_list, inet_addrobj_t, addr) {
     493                if (addr->temp == false) {
     494                        rc = sif_node_append_child(cnode, "address", &naddr);
     495                        if (rc != EOK)
     496                                goto error;
     497
     498                        rc = inet_addrobj_save(addr, naddr);
     499                        if (rc != EOK)
     500                                goto error;
     501                }
     502        }
     503
     504        fibril_mutex_unlock(&addr_list_lock);
     505        return EOK;
     506error:
     507        fibril_mutex_unlock(&addr_list_lock);
     508        return rc;
     509}
     510
    284511/** @}
    285512 */
Note: See TracChangeset for help on using the changeset viewer.