Ignore:
File:
1 edited

Legend:

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

    rd8b47eca r5c2e8d0  
    5151static 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 
     53        list_foreach(atrans_list, atrans_list, ethip_atrans_t, atrans) {
    5754                if (atrans->ip_addr == ip_addr)
    5855                        return atrans;
     
    106103}
    107104
    108 int atrans_lookup(addr32_t ip_addr, addr48_t mac_addr)
     105static int atrans_lookup_locked(addr32_t ip_addr, addr48_t mac_addr)
    109106{
    110         fibril_mutex_lock(&atrans_list_lock);
    111107        ethip_atrans_t *atrans = atrans_find(ip_addr);
    112         if (atrans == NULL) {
    113                 fibril_mutex_unlock(&atrans_list_lock);
     108        if (atrans == NULL)
    114109                return ENOENT;
    115         }
    116        
    117         fibril_mutex_unlock(&atrans_list_lock);
     110
    118111        addr48(atrans->mac_addr, mac_addr);
    119112        return EOK;
    120113}
    121114
    122 int atrans_wait_timeout(suseconds_t timeout)
     115int atrans_lookup(addr32_t ip_addr, addr48_t mac_addr)
    123116{
     117        int rc;
     118
    124119        fibril_mutex_lock(&atrans_list_lock);
    125         int rc = fibril_condvar_wait_timeout(&atrans_cv, &atrans_list_lock,
    126             timeout);
     120        rc = atrans_lookup_locked(ip_addr, mac_addr);
    127121        fibril_mutex_unlock(&atrans_list_lock);
    128        
     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);
     160
    129161        return rc;
    130162}
Note: See TracChangeset for help on using the changeset viewer.