Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/ethip/atrans.c

    r69a93df7 r5c2e8d0  
    4949static FIBRIL_CONDVAR_INITIALIZE(atrans_cv);
    5050
    51 static ethip_atrans_t *atrans_find(iplink_srv_addr_t *ip_addr)
     51static ethip_atrans_t *atrans_find(addr32_t ip_addr)
    5252{
    53         list_foreach(atrans_list, link) {
    54                 ethip_atrans_t *atrans = list_get_instance(link,
    55                     ethip_atrans_t, atrans_list);
    56 
    57                 if (atrans->ip_addr.ipv4 == ip_addr->ipv4)
     53        list_foreach(atrans_list, atrans_list, ethip_atrans_t, atrans) {
     54                if (atrans->ip_addr == ip_addr)
    5855                        return atrans;
    5956        }
     
    6259}
    6360
    64 int atrans_add(iplink_srv_addr_t *ip_addr, mac48_addr_t *mac_addr)
     61int atrans_add(addr32_t ip_addr, addr48_t mac_addr)
    6562{
    6663        ethip_atrans_t *atrans;
     
    7168                return ENOMEM;
    7269
    73         atrans->ip_addr = *ip_addr;
    74         atrans->mac_addr = *mac_addr;
     70        atrans->ip_addr = ip_addr;
     71        addr48(mac_addr, atrans->mac_addr);
    7572
    7673        fibril_mutex_lock(&atrans_list_lock);
     
    8885}
    8986
    90 int atrans_remove(iplink_srv_addr_t *ip_addr)
     87int atrans_remove(addr32_t ip_addr)
    9188{
    9289        ethip_atrans_t *atrans;
     
    106103}
    107104
    108 int atrans_lookup(iplink_srv_addr_t *ip_addr, mac48_addr_t *mac_addr)
     105static int atrans_lookup_locked(addr32_t ip_addr, addr48_t mac_addr)
    109106{
    110         ethip_atrans_t *atrans;
     107        ethip_atrans_t *atrans = atrans_find(ip_addr);
     108        if (atrans == NULL)
     109                return ENOENT;
    111110
    112         fibril_mutex_lock(&atrans_list_lock);
    113         atrans = atrans_find(ip_addr);
    114         if (atrans == NULL) {
    115                 fibril_mutex_unlock(&atrans_list_lock);
    116                 return ENOENT;
    117         }
    118 
    119         fibril_mutex_unlock(&atrans_list_lock);
    120         *mac_addr = atrans->mac_addr;
     111        addr48(atrans->mac_addr, mac_addr);
    121112        return EOK;
    122113}
    123114
    124 int atrans_wait_timeout(suseconds_t timeout)
     115int atrans_lookup(addr32_t ip_addr, addr48_t mac_addr)
    125116{
    126117        int rc;
    127118
    128119        fibril_mutex_lock(&atrans_list_lock);
    129         rc = fibril_condvar_wait_timeout(&atrans_cv, &atrans_list_lock,
    130             timeout);
     120        rc = atrans_lookup_locked(ip_addr, mac_addr);
    131121        fibril_mutex_unlock(&atrans_list_lock);
     122
     123        return rc;
     124}
     125
     126static void atrans_lookup_timeout_handler(void *arg)
     127{
     128        bool *timedout = (bool *)arg;
     129
     130        fibril_mutex_lock(&atrans_list_lock);
     131        *timedout = true;
     132        fibril_mutex_unlock(&atrans_list_lock);
     133        fibril_condvar_broadcast(&atrans_cv);
     134}
     135
     136int atrans_lookup_timeout(addr32_t ip_addr, suseconds_t timeout,
     137    addr48_t mac_addr)
     138{
     139        fibril_timer_t *t;
     140        bool timedout;
     141        int rc;
     142
     143        t = fibril_timer_create(NULL);
     144        if (t == NULL)
     145                return ENOMEM;
     146
     147        timedout = false;
     148        fibril_timer_set(t, timeout, atrans_lookup_timeout_handler, &timedout);
     149
     150        fibril_mutex_lock(&atrans_list_lock);
     151
     152        while ((rc = atrans_lookup_locked(ip_addr, mac_addr)) == ENOENT &&
     153            !timedout) {
     154                fibril_condvar_wait(&atrans_cv, &atrans_list_lock);
     155        }
     156
     157        fibril_mutex_unlock(&atrans_list_lock);
     158        (void) fibril_timer_clear(t);
     159        fibril_timer_destroy(t);
    132160
    133161        return rc;
Note: See TracChangeset for help on using the changeset viewer.