Ignore:
File:
1 edited

Legend:

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

    r5c2e8d0 rfeeac0d  
    103103}
    104104
    105 static int atrans_lookup_locked(addr32_t ip_addr, addr48_t mac_addr)
     105int atrans_lookup(addr32_t ip_addr, addr48_t mac_addr)
    106106{
     107        fibril_mutex_lock(&atrans_list_lock);
    107108        ethip_atrans_t *atrans = atrans_find(ip_addr);
    108         if (atrans == NULL)
     109        if (atrans == NULL) {
     110                fibril_mutex_unlock(&atrans_list_lock);
    109111                return ENOENT;
    110 
     112        }
     113       
     114        fibril_mutex_unlock(&atrans_list_lock);
    111115        addr48(atrans->mac_addr, mac_addr);
    112116        return EOK;
    113117}
    114118
    115 int atrans_lookup(addr32_t ip_addr, addr48_t mac_addr)
     119int atrans_wait_timeout(suseconds_t timeout)
    116120{
    117         int rc;
    118 
    119121        fibril_mutex_lock(&atrans_list_lock);
    120         rc = atrans_lookup_locked(ip_addr, mac_addr);
     122        int rc = fibril_condvar_wait_timeout(&atrans_cv, &atrans_list_lock,
     123            timeout);
    121124        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 
     125       
    161126        return rc;
    162127}
Note: See TracChangeset for help on using the changeset viewer.