Ignore:
File:
1 edited

Legend:

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

    r5c2e8d0 rd8b47eca  
    5151static ethip_atrans_t *atrans_find(addr32_t ip_addr)
    5252{
    53         list_foreach(atrans_list, atrans_list, ethip_atrans_t, atrans) {
     53        list_foreach(atrans_list, link) {
     54                ethip_atrans_t *atrans = list_get_instance(link,
     55                    ethip_atrans_t, atrans_list);
     56
    5457                if (atrans->ip_addr == ip_addr)
    5558                        return atrans;
     
    103106}
    104107
    105 static int atrans_lookup_locked(addr32_t ip_addr, addr48_t mac_addr)
     108int atrans_lookup(addr32_t ip_addr, addr48_t mac_addr)
    106109{
     110        fibril_mutex_lock(&atrans_list_lock);
    107111        ethip_atrans_t *atrans = atrans_find(ip_addr);
    108         if (atrans == NULL)
     112        if (atrans == NULL) {
     113                fibril_mutex_unlock(&atrans_list_lock);
    109114                return ENOENT;
    110 
     115        }
     116       
     117        fibril_mutex_unlock(&atrans_list_lock);
    111118        addr48(atrans->mac_addr, mac_addr);
    112119        return EOK;
    113120}
    114121
    115 int atrans_lookup(addr32_t ip_addr, addr48_t mac_addr)
     122int atrans_wait_timeout(suseconds_t timeout)
    116123{
    117         int rc;
    118 
    119124        fibril_mutex_lock(&atrans_list_lock);
    120         rc = atrans_lookup_locked(ip_addr, mac_addr);
     125        int rc = fibril_condvar_wait_timeout(&atrans_cv, &atrans_list_lock,
     126            timeout);
    121127        fibril_mutex_unlock(&atrans_list_lock);
    122 
    123         return rc;
    124 }
    125 
    126 static 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 
    136 int 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);
    160 
     128       
    161129        return rc;
    162130}
Note: See TracChangeset for help on using the changeset viewer.