Changeset 8d48c7e in mainline for uspace/lib


Ignore:
Timestamp:
2015-06-02T16:00:42Z (11 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
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/inet.c

    rab6326bc r8d48c7e  
    177177       
    178178        dgram.tos = IPC_GET_ARG1(*icall);
     179        dgram.iplink = IPC_GET_ARG2(*icall);
    179180       
    180181        ipc_callid_t callid;
  • uspace/lib/c/generic/iplink.c

    rab6326bc r8d48c7e  
    4747static void iplink_cb_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg);
    4848
    49 int iplink_open(async_sess_t *sess, iplink_ev_ops_t *ev_ops,
     49int iplink_open(async_sess_t *sess, iplink_ev_ops_t *ev_ops, void *arg,
    5050    iplink_t **riplink)
    5151{
     
    5656        iplink->sess = sess;
    5757        iplink->ev_ops = ev_ops;
     58        iplink->arg = arg;
    5859       
    5960        async_exch_t *exch = async_exchange_begin(sess);
     
    234235       
    235236        return (int) retval;
     237}
     238
     239void *iplink_get_userptr(iplink_t *iplink)
     240{
     241        return iplink->arg;
    236242}
    237243
  • uspace/lib/c/include/inet/iplink.h

    rab6326bc r8d48c7e  
    4444        async_sess_t *sess;
    4545        struct iplink_ev_ops *ev_ops;
     46        void *arg;
    4647} iplink_t;
    4748
     
    8182} iplink_ev_ops_t;
    8283
    83 extern int iplink_open(async_sess_t *, iplink_ev_ops_t *, iplink_t **);
     84extern int iplink_open(async_sess_t *, iplink_ev_ops_t *, void *, iplink_t **);
    8485extern void iplink_close(iplink_t *);
    8586extern int iplink_send(iplink_t *, iplink_sdu_t *);
     
    9091extern int iplink_get_mac48(iplink_t *, addr48_t *);
    9192extern int iplink_set_mac48(iplink_t *, addr48_t);
     93extern void *iplink_get_userptr(iplink_t *);
    9294
    9395#endif
  • 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.