static void e1000_polltimer(int argc, uint32_t arg, ...) { struct e1000_dev *e1000 = (struct e1000_dev *)arg; int tail = e1000->tx_ring.tail; /* Check if there is room in the send another TX packet. We cannot perform * the TX poll if he are unable to accept another packet for transmission. */ if (!e1000->tx_ring.desc[tail].desc_status) { return; } /* If so, update TCP timing states and poll uIP for new XMIT data. Hmmm.. * might be bug here. Does this mean if there is a transmit in progress, * we will missing TCP time state updates? */ (void)uip_timer(&e1000->uip_dev, e1000_uiptxpoll, E1000_POLLHSEC); /* Setup the watchdog poll timer again */ (void)wd_start(e1000->txpoll, E1000_WDDELAY, e1000_polltimer, 1, arg); }
static void vnet_polltimer(int argc, uint32_t arg, ...) { FAR struct vnet_driver_s *vnet = (FAR struct vnet_driver_s *)arg; /* Check if there is room in the send another TX packet. We cannot perform * the TX poll if he are unable to accept another packet for transmission. */ if (vnet_is_txbuff_full(vnet->vnet)) { #ifdef CONFIG_DEBUG cprintf("VNET: TX buffer is full\n"); #endif return; } /* If so, update TCP timing states and poll uIP for new XMIT data. Hmmm.. * might be bug here. Does this mean if there is a transmit in progress, * we will missing TCP time state updates? */ (void)uip_timer(&vnet->sk_dev, vnet_uiptxpoll, VNET_POLLHSEC); /* Setup the watchdog poll timer again */ (void)wd_start(vnet->sk_txpoll, VNET_WDDELAY, vnet_polltimer, 1, arg); }
static void slip_txtask(int argc, char *argv[]) { FAR struct slip_driver_s *priv; unsigned int index = *(argv[1]) - '0'; uip_lock_t flags; ndbg("index: %d\n", index); DEBUGASSERT(index < CONFIG_SLIP_NINTERFACES); /* Get our private data structure instance and wake up the waiting * initialization logic. */ priv = &g_slip[index]; slip_semgive(priv); /* Loop forever */ for (;;) { /* Wait for the timeout to expire (or until we are signaled by by */ usleep(SLIP_WDDELAY); /* Is the interface up? */ if (priv->bifup) { /* Get exclusive access to uIP (if it it is already being used * slip_rxtask, then we have to wait). */ slip_semtake(priv); /* Poll uIP for new XMIT data. BUG: We really need to calculate * the number of hsecs! When we are awakened by slip_txavail, the * number will be smaller; when we have to wait for the semaphore * (above), it may be larger. */ flags = uip_lock(); priv->dev.d_buf = priv->txbuf; (void)uip_timer(&priv->dev, slip_uiptxpoll, SLIP_POLLHSEC); uip_unlock(flags); slip_semgive(priv); } } }
static void skel_polltimer(int argc, uint32_t arg, ...) { FAR struct skel_driver_s *skel = (FAR struct skel_driver_s *)arg; /* Check if there is room in the send another TX packet. We cannot perform * the TX poll if he are unable to accept another packet for transmission. */ /* If so, update TCP timing states and poll uIP for new XMIT data. Hmmm.. * might be bug here. Does this mean if there is a transmit in progress, * we will missing TCP time state updates? */ (void)uip_timer(&skel->sk_dev, skel_uiptxpoll, skeleton_POLLHSEC); /* Setup the watchdog poll timer again */ (void)wd_start(skel->sk_txpoll, skeleton_WDDELAY, skel_polltimer, 1, arg); }
void uipdriver_loop(void) { /* netdev_read will return 0 on a timeout event and >0 on a data received event */ g_sim_dev.d_len = netdev_read((unsigned char*)g_sim_dev.d_buf, CONFIG_NET_BUFSIZE); /* Disable preemption through to the following so that it behaves a little more * like an interrupt (otherwise, the following logic gets pre-empted an behaves * oddly. */ sched_lock(); if (g_sim_dev.d_len > 0) { /* Data received event. Check for valid Ethernet header with destination == our * MAC address */ if (g_sim_dev.d_len > UIP_LLH_LEN && up_comparemac(BUF->ether_dhost, &g_sim_dev.d_mac) == 0) { /* We only accept IP packets of the configured type and ARP packets */ #ifdef CONFIG_NET_IPv6 if (BUF->ether_type == htons(UIP_ETHTYPE_IP6)) #else if (BUF->ether_type == htons(UIP_ETHTYPE_IP)) #endif { uip_arp_ipin(&g_sim_dev); uip_input(&g_sim_dev); /* If the above function invocation resulted in data that * should be sent out on the network, the global variable * d_len is set to a value > 0. */ if (g_sim_dev.d_len > 0) { uip_arp_out(&g_sim_dev); netdev_send(g_sim_dev.d_buf, g_sim_dev.d_len); } } else if (BUF->ether_type == htons(UIP_ETHTYPE_ARP)) { uip_arp_arpin(&g_sim_dev); /* If the above function invocation resulted in data that * should be sent out on the network, the global variable * d_len is set to a value > 0. */ if (g_sim_dev.d_len > 0) { netdev_send(g_sim_dev.d_buf, g_sim_dev.d_len); } } } } /* Otherwise, it must be a timeout event */ else if (timer_expired(&g_periodic_timer)) { timer_reset(&g_periodic_timer); uip_timer(&g_sim_dev, sim_uiptxpoll, 1); } sched_unlock(); }