Changeset 8d48c7e in mainline for uspace/lib/nettl


Ignore:
Timestamp:
2015-06-02T16:00:42Z (10 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
2c4bb828
Parents:
ab6326bc
Message:

Find the association to deliver the datagram using amap.

Location:
uspace/lib/nettl
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/nettl/include/nettl/amap.h

    rab6326bc r8d48c7e  
    9696    inet_ep2_t *);
    9797extern void amap_remove(amap_t *, inet_ep2_t *);
    98 extern int amap_find(amap_t *, inet_ep2_t *, void **);
     98extern int amap_find_match(amap_t *, inet_ep2_t *, void **);
    9999
    100100#endif
  • uspace/lib/nettl/include/nettl/portrng.h

    rab6326bc r8d48c7e  
    4646        /** Port number */
    4747        uint16_t pn;
     48        /** User argument */
     49        void *arg;
    4850} portrng_port_t;
    4951
     
    6062extern int portrng_alloc(portrng_t *, uint16_t, void *,
    6163    portrng_flags_t, uint16_t *);
     64extern int portrng_find_port(portrng_t *, uint16_t, void **);
    6265extern void portrng_free_port(portrng_t *, uint16_t);
    6366extern bool portrng_empty(portrng_t *);
  • uspace/lib/nettl/src/amap.c

    rab6326bc r8d48c7e  
    510510}
    511511
    512 int amap_find(amap_t *map, inet_ep2_t *epp, void **rarg)
    513 {
    514         log_msg(LOG_DEFAULT, LVL_NOTE, "amap_find()");
    515         return EOK;
     512/** Find association matching an endpoint pair.
     513 *
     514 * Used to find which association to deliver a datagram to.
     515 *
     516 * @param map   Association map
     517 * @param epp   Endpoint pair
     518 * @param rarg  Place to store user argument for the matching association.
     519 *
     520 * @return      EOK on success, ENOENT if not found.
     521 */
     522int amap_find_match(amap_t *map, inet_ep2_t *epp, void **rarg)
     523{
     524        int rc;
     525        amap_repla_t *repla;
     526        amap_laddr_t *laddr;
     527        amap_llink_t *llink;
     528
     529        log_msg(LOG_DEFAULT, LVL_NOTE, "amap_find_match(llink=%zu)",
     530            epp->local_link);
     531
     532        /* Remode endpoint, local address */
     533        rc = amap_repla_find(map, &epp->remote, &epp->local.addr, &repla);
     534        if (rc == EOK) {
     535                rc = portrng_find_port(repla->portrng, epp->local.port,
     536                    rarg);
     537                if (rc == EOK) {
     538                        log_msg(LOG_DEFAULT, LVL_NOTE, "Matched repla / "
     539                            "port %" PRIu16, epp->local.port);
     540                        return EOK;
     541                }
     542        }
     543
     544        /* Local address */
     545        rc = amap_laddr_find(map, &epp->local.addr, &laddr);
     546        if (rc == EOK) {
     547                rc = portrng_find_port(laddr->portrng, epp->local.port,
     548                    rarg);
     549                if (rc == EOK) {
     550                        log_msg(LOG_DEFAULT, LVL_NOTE, "Matched laddr / "
     551                            "port %" PRIu16, epp->local.port);
     552                        return EOK;
     553                }
     554        }
     555
     556        /* Local link */
     557        rc = amap_llink_find(map, epp->local_link, &llink);
     558        if (epp->local_link != 0 && rc == EOK) {
     559                rc = portrng_find_port(llink->portrng, epp->local.port,
     560                    rarg);
     561                if (rc == EOK) {
     562                        log_msg(LOG_DEFAULT, LVL_NOTE, "Matched llink / "
     563                            "port %" PRIu16, epp->local.port);
     564                        return EOK;
     565                }
     566        }
     567
     568        /* Unspecified */
     569        rc = portrng_find_port(map->unspec, epp->local.port, rarg);
     570        if (rc == EOK) {
     571                log_msg(LOG_DEFAULT, LVL_NOTE, "Matched unspec / port %" PRIu16,
     572                    epp->local.port);
     573                return EOK;
     574        }
     575
     576        log_msg(LOG_DEFAULT, LVL_NOTE, "No match.");
     577        return ENOENT;
    516578}
    517579
  • uspace/lib/nettl/src/portrng.c

    rab6326bc r8d48c7e  
    118118
    119119        p->pn = pnum;
     120        p->arg = arg;
    120121        list_append(&p->lprng, &pr->used);
    121122        *apnum = pnum;
     
    123124            pnum);
    124125        return EOK;
     126}
     127
     128int portrng_find_port(portrng_t *pr, uint16_t pnum, void **rarg)
     129{
     130        list_foreach(pr->used, lprng, portrng_port_t, port) {
     131                if (port->pn == pnum) {
     132                        *rarg = port->arg;
     133                        return EOK;
     134                }
     135        }
     136
     137        return ENOENT;
    125138}
    126139
Note: See TracChangeset for help on using the changeset viewer.