/* This function is similar to the 'tcpip_thread' function defined in the tcpip.c module */ void lwip_process_timers (void) { unsigned int CurrentTickCnt; #if LWIP_TCP static unsigned int lwip_tcp_timer = 0; #endif #if LWIP_ARP static unsigned int lwip_arp_timer = 0; #endif CurrentTickCnt = TickGet (); #if LWIP_DHCP static unsigned int lwip_DHCP_fine_timer = 0; static unsigned int lwip_DHCP_coarce_timer = 0; #endif #if LWIP_AUTOIP static unsigned int lwip_autoip_timer = 0; #endif #if LWIP_ARP /* Process the ARP timer */ if(TickGetDiff (CurrentTickCnt, lwip_arp_timer) >= TICKS_IN_MS(ARP_TMR_INTERVAL)) { lwip_arp_timer = CurrentTickCnt; etharp_tmr(); } #endif #if LWIP_TCP /* Process the TCP timer */ if (TickGetDiff (CurrentTickCnt, lwip_tcp_timer) >= TICKS_IN_MS(TCP_TMR_INTERVAL)) { lwip_tcp_timer = CurrentTickCnt; /* Increment fast (incremented every 250ms) and slow (incremented every 500ms) tcp timers */ tcp_tmr (); } #endif #if LWIP_DHCP /* Process the DHCP Coarce timer */ if (TickGetDiff (CurrentTickCnt, lwip_DHCP_coarce_timer) >= TICKS_IN_MS(DHCP_COARSE_TIMER_MSECS)) { lwip_DHCP_coarce_timer = CurrentTickCnt; dhcp_coarse_tmr (); } /* Process the DHCP Fine timer */ if (TickGetDiff (CurrentTickCnt, lwip_DHCP_fine_timer) >= TICKS_IN_MS(DHCP_FINE_TIMER_MSECS)) { lwip_DHCP_fine_timer = CurrentTickCnt; dhcp_fine_tmr (); } #endif #if LWIP_AUTOIP /* Process the DHCP Fine timer */ if (TickGetDiff (CurrentTickCnt, lwip_autoip_timer) >= TICKS_IN_MS(AUTOIP_TMR_INTERVAL)) { lwip_autoip_timer = CurrentTickCnt; autoip_tmr (); } #endif }
/** * Timer callback function that calls autoip_tmr() and reschedules itself. * * @param arg unused argument */ static void autoip_timer(void *arg) { LWIP_UNUSED_ARG(arg); LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: autoip_tmr()\n")); autoip_tmr(); sys_timeout(AUTOIP_TMR_INTERVAL, autoip_timer, NULL); }
/**************************************************************************//** * @brief SysTick_Handler * Interrupt Service Routine for system tick counter. *****************************************************************************/ void SysTick_Handler(void) { ++g_ulLocalTimer; ++tick_count; /*Service the host timer.*/ #if HOST_TMR_INTERVAL if ((g_ulLocalTimer - g_ulHostTimer) >= HOST_TMR_INTERVAL) { g_ulHostTimer = g_ulLocalTimer; } #endif /* Service the ARP timer.*/ #if LWIP_ARP if ((g_ulLocalTimer - g_ulARPTimer) >= ARP_TMR_INTERVAL) { g_ulARPTimer = g_ulLocalTimer; etharp_tmr(); } #endif /* Service the TCP timer.*/ if ((g_ulLocalTimer - g_ulTCPTimer) >= TCP_TMR_INTERVAL) { g_ulTCPTimer = g_ulLocalTimer; tcp_tmr(); } /* Service the AutoIP timer.*/ #if LWIP_AUTOIP if ((g_ulLocalTimer - g_ulAutoIPTimer) >= AUTOIP_TMR_INTERVAL) { g_ulAutoIPTimer = g_ulLocalTimer; autoip_tmr(); } #endif /* Service the DCHP Coarse Timer. */ #if LWIP_DHCP if ((g_ulLocalTimer - g_ulDHCPCoarseTimer) >= DHCP_COARSE_TIMER_MSECS) { g_ulDHCPCoarseTimer = g_ulLocalTimer; dhcp_coarse_tmr(); } #endif /* Service the DCHP Fine Timer.*/ #if LWIP_DHCP if ((g_ulLocalTimer - g_ulDHCPFineTimer) >= DHCP_FINE_TIMER_MSECS) { g_ulDHCPFineTimer = g_ulLocalTimer; dhcp_fine_tmr(); } #endif }
static void lwIPServiceTimers(void) { // // Service the MDIX timer. // if((EthernetPHYRead(ETH_BASE, PHY_MR1) & PHY_MR1_LINK) == 0) { // // See if there has not been a link for 2 seconds. // if((g_ulLocalTimer - g_ulMDIXTimer) >= 2000) { // // There has not been a link for 2 seconds, so flip the MDI/MDIX // switch. This is handled automatically by Fury rev A2, but is // harmless. // HWREG(ETH_BASE + MAC_O_MDIX) ^= MAC_MDIX_EN; // // Reset the MDIX timer. // g_ulMDIXTimer = g_ulLocalTimer; } } else { // // There is a link, so reset the MDIX timer. // g_ulMDIXTimer = g_ulLocalTimer; } // // Service the host timer. // #if HOST_TMR_INTERVAL if((g_ulLocalTimer - g_ulHostTimer) >= HOST_TMR_INTERVAL) { g_ulHostTimer = g_ulLocalTimer; lwIPHostTimerHandler(); } #endif // // Service the ARP timer. // #if LWIP_ARP if((g_ulLocalTimer - g_ulARPTimer) >= ARP_TMR_INTERVAL) { g_ulARPTimer = g_ulLocalTimer; etharp_tmr(); } #endif // // Service the TCP timer. // #if LWIP_TCP if((g_ulLocalTimer - g_ulTCPTimer) >= TCP_TMR_INTERVAL) { g_ulTCPTimer = g_ulLocalTimer; tcp_tmr(); } #endif // // Service the AutoIP timer. // #if LWIP_AUTOIP if((g_ulLocalTimer - g_ulAutoIPTimer) >= AUTOIP_TMR_INTERVAL) { g_ulAutoIPTimer = g_ulLocalTimer; autoip_tmr(); } #endif // // Service the DCHP Coarse Timer. // #if LWIP_DHCP if((g_ulLocalTimer - g_ulDHCPCoarseTimer) >= DHCP_COARSE_TIMER_MSECS) { g_ulDHCPCoarseTimer = g_ulLocalTimer; dhcp_coarse_tmr(); } #endif // // Service the DCHP Fine Timer. // #if LWIP_DHCP if((g_ulLocalTimer - g_ulDHCPFineTimer) >= DHCP_FINE_TIMER_MSECS) { g_ulDHCPFineTimer = g_ulLocalTimer; dhcp_fine_tmr(); } #endif // // Service the IP Reassembly Timer // #if IP_REASSEMBLY if((g_ulLocalTimer - g_ulIPReassemblyTimer) >= IP_TMR_INTERVAL) { g_ulIPReassemblyTimer = g_ulLocalTimer; ip_reass_tmr(); } #endif // // Service the IGMP Timer // #if LWIP_IGMP if((g_ulLocalTimer - g_ulIGMPTimer) >= IGMP_TMR_INTERVAL) { g_ulIGMPTimer = g_ulLocalTimer; igmp_tmr(); } #endif // // Service the DNS Timer // #if LWIP_DNS if((g_ulLocalTimer - g_ulDNSTimer) >= DNS_TMR_INTERVAL) { g_ulDNSTimer = g_ulLocalTimer; dns_tmr(); } #endif }
//***************************************************************************** // //! Service the lwIP timers. //! //! This function services all of the lwIP periodic timers, including TCP and //! Host timers. This should be called from the lwIP context, which may be //! the Ethernet interrupt (in the case of a non-RTOS system) or the lwIP //! thread, in the event that an RTOS is used. //! //! \return None. // //***************************************************************************** static void lwIPServiceTimers(struct netif *netif) { LWIP_DRIVER_DATA* drv_data = (LWIP_DRIVER_DATA*)netif; MAC_Type* mac = (MAC_Type*)netif->state; // // Service the MDIX timer. // if(drv_data->timer_main > drv_data->timer_mdix) { // // See if there has not been a link for 2 seconds. // if((EthernetPHYRead(mac, PHY_MR1) & PHY_MR1_LINK) == 0) { // There has not been a link for 2 seconds, so flip the MDI/MDIX // switch. This is handled automatically by Fury rev A2, but is // harmless. // mac->MDIX ^= MAC_MDIX_EN; if (netif->flags & NETIF_FLAG_LINK_UP) { #if LWIP_DHCP autoip_stop(netif); dhcp_start(netif); #endif netif_set_link_down(netif); } } else netif_set_link_up(netif); // // Reset the MDIX timer. // drv_data->timer_mdix = drv_data->timer_main + 2048; } // // Service the host timer. // #if HOST_TMR_INTERVAL if(drv_data->timer_main > drv_data->timer_host ) { drv_data->timer_host = drv_data->timer_main + HOST_TMR_INTERVAL; lwIPHostTimerHandler(); } #endif // // Service the ARP timer. // #if LWIP_ARP if(drv_data->timer_main > drv_data->timer_arp) { drv_data->timer_arp = drv_data->timer_main + ARP_TMR_INTERVAL; etharp_tmr(); } #endif // // Service the TCP timer. // #if LWIP_TCP if(drv_data->timer_main > drv_data->timer_tcp) { drv_data->timer_tcp = drv_data->timer_main + TCP_TMR_INTERVAL; tcp_tmr(); } #endif // // Service the AutoIP timer. // #if LWIP_AUTOIP if(drv_data->timer_main - drv_data->timer_autoIP) { drv_data->timer_autoIP = drv_data->timer_main + AUTOIP_TMR_INTERVAL; autoip_tmr(); } #endif // // Service the DCHP Coarse Timer. // #if LWIP_DHCP if(drv_data->timer_main > drv_data->timer_DHCPCoarse) { drv_data->timer_DHCPCoarse = drv_data->timer_main + DHCP_COARSE_TIMER_MSECS; dhcp_coarse_tmr(); } #endif // // Service the DCHP Fine Timer. // #if LWIP_DHCP if(drv_data->timer_main > drv_data->timer_DHCPFine) { drv_data->timer_DHCPFine = drv_data->timer_main + DHCP_FINE_TIMER_MSECS; dhcp_fine_tmr(); } #endif }
/*..........................................................................*/ QState LwIPMgr_running(LwIPMgr *me, QEvt const *e) { switch (e->sig) { case Q_ENTRY_SIG: { #if (LWIP_DHCP != 0) dhcp_start(me->netif); /* start DHCP if configured */ /* NOTE: If LWIP_AUTOIP is configured in lwipopts.h and * LWIP_DHCP_AUTOIP_COOP is set as well, the DHCP process will * start AutoIP after DHCP fails for 59 seconds. */ #elif (LWIP_AUTOIP != 0) autoip_start(me->netif); /* start AutoIP if configured */ #endif QTimeEvt_postEvery(&me->te_LWIP_SLOW_TICK, (QActive *)me, (LWIP_SLOW_TICK_MS * BSP_TICKS_PER_SEC) / 1000U); return Q_HANDLED(); } case Q_EXIT_SIG: { QTimeEvt_disarm(&me->te_LWIP_SLOW_TICK); return Q_HANDLED(); } case SEND_UDP_SIG: { if (me->upcb->remote_port != 0U) { struct pbuf *p = pbuf_new((u8_t *)((TextEvt const *)e)->text, strlen(((TextEvt const *)e)->text) + 1U); if (p != (struct pbuf *)0) { udp_send(me->upcb, p); pbuf_free(p); /* don't leak the pbuf! */ } } return Q_HANDLED(); } case LWIP_RX_READY_SIG: { eth_driver_read(); return Q_HANDLED(); } case LWIP_TX_READY_SIG: { eth_driver_write(); return Q_HANDLED(); } case LWIP_SLOW_TICK_SIG: { /* has IP address changed? */ if (me->ip_addr != me->netif->ip_addr.addr) { me->ip_addr = me->netif->ip_addr.addr; /* save the IP addr. */ BSP_displyIP(ntohl(me->ip_addr)); } #if LWIP_TCP me->tcp_tmr += LWIP_SLOW_TICK_MS; if (me->tcp_tmr >= TCP_TMR_INTERVAL) { me->tcp_tmr = 0; tcp_tmr(); } #endif #if LWIP_ARP me->arp_tmr += LWIP_SLOW_TICK_MS; if (me->arp_tmr >= ARP_TMR_INTERVAL) { me->arp_tmr = 0; etharp_tmr(); } #endif #if LWIP_DHCP me->dhcp_fine_tmr += LWIP_SLOW_TICK_MS; if (me->dhcp_fine_tmr >= DHCP_FINE_TIMER_MSECS) { me->dhcp_fine_tmr = 0; dhcp_fine_tmr(); } me->dhcp_coarse_tmr += LWIP_SLOW_TICK_MS; if (me->dhcp_coarse_tmr >= DHCP_COARSE_TIMER_MSECS) { me->dhcp_coarse_tmr = 0; dhcp_coarse_tmr(); } #endif #if LWIP_AUTOIP me->auto_ip_tmr += LWIP_SLOW_TICK_MS; if (me->auto_ip_tmr >= AUTOIP_TMR_INTERVAL) { me->auto_ip_tmr = 0; autoip_tmr(); } #endif return Q_HANDLED(); } case LWIP_RX_OVERRUN_SIG: { LINK_STATS_INC(link.err); return Q_HANDLED(); } } return Q_SUPER(&QHsm_top); }
/*..........................................................................*/ QState LwIPMgr_running(LwIPMgr *me, QEvent const *e) { switch (e->sig) { case Q_ENTRY_SIG: { QTimeEvt_postEvery(&me->te_LWIP_SLOW_TICK, (QActive *)me, (LWIP_SLOW_TICK_MS * BSP_TICKS_PER_SEC) / 1000); return Q_HANDLED(); } case Q_EXIT_SIG: { QTimeEvt_disarm(&me->te_LWIP_SLOW_TICK); return Q_HANDLED(); } case SEND_UDP_SIG: { if (me->upcb->remote_port != (uint16_t)0) { struct pbuf *p = pbuf_new((u8_t *)((TextEvt const *)e)->text, strlen(((TextEvt const *)e)->text) + 1); if (p != (struct pbuf *)0) { udp_send(me->upcb, p); printf("Sent: %s\n", ((TextEvt const *)e)->text); pbuf_free(p); /* don't leak the pbuf! */ } } return Q_HANDLED(); } case LWIP_RX_READY_SIG: { eth_driver_read(); return Q_HANDLED(); } case LWIP_TX_READY_SIG: { eth_driver_write(); return Q_HANDLED(); } case LWIP_SLOW_TICK_SIG: { /* has IP address changed? */ if (me->ip_addr != me->netif->ip_addr.addr) { TextEvt *te; uint32_t ip_net; /* IP address in the network byte order */ me->ip_addr = me->netif->ip_addr.addr; /* save the IP addr. */ ip_net = ntohl(me->ip_addr); /* publish the text event to display the new IP address */ te = Q_NEW(TextEvt, DISPLAY_IPADDR_SIG); snprintf(te->text, Q_DIM(te->text), "%d.%d.%d.%d", ((ip_net) >> 24) & 0xFF, ((ip_net) >> 16) & 0xFF, ((ip_net) >> 8) & 0xFF, ip_net & 0xFF); QF_PUBLISH((QEvent *)te, me); } #if LWIP_TCP me->tcp_tmr += LWIP_SLOW_TICK_MS; if (me->tcp_tmr >= TCP_TMR_INTERVAL) { me->tcp_tmr = 0; tcp_tmr(); } #endif #if LWIP_ARP me->arp_tmr += LWIP_SLOW_TICK_MS; if (me->arp_tmr >= ARP_TMR_INTERVAL) { me->arp_tmr = 0; etharp_tmr(); } #endif #if LWIP_DHCP me->dhcp_fine_tmr += LWIP_SLOW_TICK_MS; if (me->dhcp_fine_tmr >= DHCP_FINE_TIMER_MSECS) { me->dhcp_fine_tmr = 0; dhcp_fine_tmr(); } me->dhcp_coarse_tmr += LWIP_SLOW_TICK_MS; if (me->dhcp_coarse_tmr >= DHCP_COARSE_TIMER_MSECS) { me->dhcp_coarse_tmr = 0; dhcp_coarse_tmr(); } #endif #if LWIP_AUTOIP me->auto_ip_tmr += LWIP_SLOW_TICK_MS; if (me->auto_ip_tmr >= AUTOIP_TMR_INTERVAL) { me->auto_ip_tmr = 0; autoip_tmr(); } #endif return Q_HANDLED(); } case LWIP_RX_OVERRUN_SIG: { LINK_STATS_INC(link.err); return Q_HANDLED(); } }
static void lwIPServiceTimers(void) { // // Service the host timer. // #if HOST_TMR_INTERVAL if((g_ui32LocalTimer - g_ui32HostTimer) >= HOST_TMR_INTERVAL) { g_ui32HostTimer = g_ui32LocalTimer; lwIPHostTimerHandler(); } #endif // // Service the ARP timer. // #if LWIP_ARP if((g_ui32LocalTimer - g_ui32ARPTimer) >= ARP_TMR_INTERVAL) { g_ui32ARPTimer = g_ui32LocalTimer; etharp_tmr(); } #endif // // Service the TCP timer. // #if LWIP_TCP if((g_ui32LocalTimer - g_ui32TCPTimer) >= TCP_TMR_INTERVAL) { g_ui32TCPTimer = g_ui32LocalTimer; tcp_tmr(); } #endif // // Service the AutoIP timer. // #if LWIP_AUTOIP if((g_ui32LocalTimer - g_ui32AutoIPTimer) >= AUTOIP_TMR_INTERVAL) { g_ui32AutoIPTimer = g_ui32LocalTimer; autoip_tmr(); } #endif // // Service the DCHP Coarse Timer. // #if LWIP_DHCP if((g_ui32LocalTimer - g_ui32DHCPCoarseTimer) >= DHCP_COARSE_TIMER_MSECS) { g_ui32DHCPCoarseTimer = g_ui32LocalTimer; dhcp_coarse_tmr(); } #endif // // Service the DCHP Fine Timer. // #if LWIP_DHCP if((g_ui32LocalTimer - g_ui32DHCPFineTimer) >= DHCP_FINE_TIMER_MSECS) { g_ui32DHCPFineTimer = g_ui32LocalTimer; dhcp_fine_tmr(); } #endif // // Service the IP Reassembly Timer // #if IP_REASSEMBLY if((g_ui32LocalTimer - g_ui32IPReassemblyTimer) >= IP_TMR_INTERVAL) { g_ui32IPReassemblyTimer = g_ui32LocalTimer; ip_reass_tmr(); } #endif // // Service the IGMP Timer // #if LWIP_IGMP if((g_ui32LocalTimer - g_ui32IGMPTimer) >= IGMP_TMR_INTERVAL) { g_ui32IGMPTimer = g_ui32LocalTimer; igmp_tmr(); } #endif // // Service the DNS Timer // #if LWIP_DNS if((g_ui32LocalTimer - g_ui32DNSTimer) >= DNS_TMR_INTERVAL) { g_ui32DNSTimer = g_ui32LocalTimer; dns_tmr(); } #endif // // Service the link timer. // #if LWIP_AUTOIP || LWIP_DHCP if((g_ui32LocalTimer - g_ui32LinkTimer) >= LINK_TMR_INTERVAL) { g_ui32LinkTimer = g_ui32LocalTimer; lwIPLinkDetect(); } #endif }
void lwIPServiceTimers(void) { // // Service the host timer. // #if HOST_TMR_INTERVAL if((g_ulLocalTimer - g_ulHostTimer) >= HOST_TMR_INTERVAL) { g_ulHostTimer = g_ulLocalTimer; lwIPHostTimerHandler(); } #endif // // Service the ARP timer. // #if LWIP_ARP if((g_ulLocalTimer - g_ulARPTimer) >= ARP_TMR_INTERVAL) { g_ulARPTimer = g_ulLocalTimer; etharp_tmr(); } #endif // // Service the TCP timer. // if((g_ulLocalTimer - g_ulTCPTimer) >= TCP_TMR_INTERVAL) { g_ulTCPTimer = g_ulLocalTimer; tcp_tmr(); } // // Service the AutoIP timer. // #if LWIP_AUTOIP if((g_ulLocalTimer - g_ulAutoIPTimer) >= AUTOIP_TMR_INTERVAL) { g_ulAutoIPTimer = g_ulLocalTimer; autoip_tmr(); } #endif // // Service the DCHP Coarse Timer. // #if LWIP_DHCP if((g_ulLocalTimer - g_ulDHCPCoarseTimer) >= DHCP_COARSE_TIMER_MSECS) { g_ulDHCPCoarseTimer = g_ulLocalTimer; dhcp_coarse_tmr(); } #endif // // Service the DCHP Fine Timer. // #if LWIP_DHCP if((g_ulLocalTimer - g_ulDHCPFineTimer) >= DHCP_FINE_TIMER_MSECS) { g_ulDHCPFineTimer = g_ulLocalTimer; dhcp_fine_tmr(); } #endif }