Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset f303f2cf in mainline


Ignore:
Timestamp:
2014-07-17T08:38:22Z (6 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
071a2c60
Parents:
78192cc7
Message:

Make sure we wait the specified time before giving up on ARP translation.

Location:
uspace/srv/net
Files:
5 edited

Legend:

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

    r78192cc7 rf303f2cf  
    119119                return rc;
    120120       
    121         (void) atrans_wait_timeout(ARP_REQUEST_TIMEOUT);
    122        
    123         return atrans_lookup(ip_addr, mac_addr);
     121        return atrans_lookup_timeout(ip_addr, ARP_REQUEST_TIMEOUT, mac_addr);
    124122}
    125123
  • uspace/srv/net/ethip/atrans.c

    r78192cc7 rf303f2cf  
    103103}
    104104
    105 int atrans_lookup(addr32_t ip_addr, addr48_t mac_addr)
     105static int atrans_lookup_locked(addr32_t ip_addr, addr48_t mac_addr)
    106106{
    107         fibril_mutex_lock(&atrans_list_lock);
    108107        ethip_atrans_t *atrans = atrans_find(ip_addr);
    109         if (atrans == NULL) {
    110                 fibril_mutex_unlock(&atrans_list_lock);
     108        if (atrans == NULL)
    111109                return ENOENT;
    112         }
    113        
    114         fibril_mutex_unlock(&atrans_list_lock);
     110
    115111        addr48(atrans->mac_addr, mac_addr);
    116112        return EOK;
    117113}
    118114
    119 int atrans_wait_timeout(suseconds_t timeout)
     115int atrans_lookup(addr32_t ip_addr, addr48_t mac_addr)
    120116{
     117        int rc;
     118
    121119        fibril_mutex_lock(&atrans_list_lock);
    122         int rc = fibril_condvar_wait_timeout(&atrans_cv, &atrans_list_lock,
    123             timeout);
     120        rc = atrans_lookup_locked(ip_addr, mac_addr);
    124121        fibril_mutex_unlock(&atrans_list_lock);
    125        
     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
    126160        return rc;
    127161}
  • uspace/srv/net/ethip/atrans.h

    r78192cc7 rf303f2cf  
    4545extern int atrans_remove(addr32_t);
    4646extern int atrans_lookup(addr32_t, addr48_t);
    47 extern int atrans_wait_timeout(suseconds_t);
     47extern int atrans_lookup_timeout(addr32_t, suseconds_t, addr48_t);
    4848
    4949#endif
  • uspace/srv/net/inetsrv/inet_link.c

    r78192cc7 rf303f2cf  
    465465        list_foreach(inet_links, link_list, inet_link_t, ilink) {
    466466                id_list[i++] = ilink->svc_id;
    467                 log_msg(LOG_DEFAULT, LVL_NOTE, "add link to list");
    468467        }
    469468
    470469        fibril_mutex_unlock(&inet_links_lock);
    471470
    472         log_msg(LOG_DEFAULT, LVL_NOTE, "return %zu links", count);
    473471        *rid_list = id_list;
    474472        *rcount = count;
  • uspace/srv/net/tcp/tqueue.c

    r78192cc7 rf303f2cf  
    5959static void tcp_tqueue_timer_clear(tcp_conn_t *conn);
    6060
    61 #include <stdio.h>
    6261int tcp_tqueue_init(tcp_tqueue_t *tqueue, tcp_conn_t *conn)
    6362{
    64         printf("tcp_tqueue_init\n");
    6563        tqueue->conn = conn;
    6664        tqueue->timer = fibril_timer_create(&conn->lock);
     
    8078void tcp_tqueue_fini(tcp_tqueue_t *tqueue)
    8179{
    82         printf("tcp_tqueue_fini\n");
    8380        if (tqueue->timer != NULL) {
    8481                fibril_timer_destroy(tqueue->timer);
Note: See TracChangeset for help on using the changeset viewer.