Changeset 8d48c7e in mainline for uspace/lib/nettl/src/amap.c


Ignore:
Timestamp:
2015-06-02T16:00:42Z (9 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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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
Note: See TracChangeset for help on using the changeset viewer.