/** * Timer callback function that calls dns_tmr() and reschedules itself. * * @param arg unused argument */ static void dns_timer(void *arg) { LWIP_UNUSED_ARG(arg); LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip: dns_tmr()\n")); dns_tmr(); sys_timeout(DNS_TMR_INTERVAL, dns_timer, NULL); }
void poll_networking(void) { uint64_t now; if (!netif) return; /* poll interface */ netfrontif_poll(netif, LWIP_NETIF_MAX_RXBURST_LEN); /* process lwIP timers */ now = NSEC_TO_MSEC(NOW()); TIMED(now, ts_etharp, ARP_TMR_INTERVAL, etharp_tmr()); TIMED(now, ts_ipreass, IP_TMR_INTERVAL, ip_reass_tmr()); TIMED(now, ts_tcp, TCP_TMR_INTERVAL, tcp_tmr()); TIMED(now, ts_dns, DNS_TMR_INTERVAL, dns_tmr()); }
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 }
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 }
static void dns_tmr_cb(void *ctx) { dns_tmr(); }
//***************************************************************************** // // Periodic Tick for the Ethernet client // // This function is the needed periodic tick for the Ethernet client. It needs // to be called periodically through the use of a timer or systick. // // \return None. // //***************************************************************************** void EthClientTick(uint32_t ui32TickMS) { uint32_t ui32IPAddr; int32_t i32Ret; if(HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DHCP_EN)) { lwIPTimer(ui32TickMS); } if(HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DNS_EN)) { dns_tmr(); } if(HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_TCP_EN)) { tcp_tmr(); } // // Check for loss of link. // if((g_sEnet.eState != iEthNoConnection) && (lwIPLocalIPAddrGet() == 0xffffffff)) { // // Reset the connection due to a loss of link. // EthClientReset(); // // Signal a disconnect event. // g_sEnet.pfnEvent(ETH_EVENT_DISCONNECT, 0, 0); } else if(g_sEnet.eState == iEthNoConnection) { // // Once link is detected start DHCP. // if(lwIPLocalIPAddrGet() != 0xffffffff) { EthClientDHCPConnect(); g_sEnet.eState = iEthDHCPWait; } } else if(g_sEnet.eState == iEthDHCPWait) { // // Get IP address. // ui32IPAddr = lwIPLocalIPAddrGet(); // // If IP Address has not yet been assigned, update the display // accordingly. // if((ui32IPAddr != 0xffffffff) && (ui32IPAddr != 0)) { // // Update the DHCP IP address. // g_sEnet.sLocalIP.addr = ui32IPAddr; g_sEnet.eState = iEthDHCPComplete; // // Stop DHCP timer since an address has been provided. // HWREGBITW(&g_sEnet.ui32Flags, FLAG_DHCP_STARTED) = 0; } } else if(g_sEnet.eState == iEthDHCPComplete) { if(g_sEnet.pcProxyName == 0) { // // Resolve the host by name. // i32Ret = EthClientDNSResolve("api.openweathermap.org"); } else { // // Resolve the proxy by name. // i32Ret = EthClientDNSResolve(g_sEnet.pcProxyName); } if(i32Ret == ERR_OK) { // // If the address was already returned then go to idle. // g_sEnet.eState = iEthIdle; // // Notify the main routine of the new Ethernet connection. // g_sEnet.pfnEvent(ETH_EVENT_CONNECT, &g_sEnet.sLocalIP.addr, 4); } else if(i32Ret == ERR_INPROGRESS) { // // If the request is pending the go to the iEthDNSWait state. // g_sEnet.eState = iEthDNSWait; } } else if(g_sEnet.eState == iEthDNSWait) { // // Check if the host name was resolved. // if(HWREGBITW(&g_sEnet.ui32Flags, FLAG_DNS_ADDRFOUND)) { // // Stop calling the DNS timer function. // HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DNS_EN) = 0; g_sEnet.eState = iEthIdle; // // Notify the main routine of the new Ethernet connection. // g_sEnet.pfnEvent(ETH_EVENT_CONNECT, &g_sEnet.sLocalIP.addr, 4); } } else if(g_sEnet.eState == iEthTCPConnectWait) { } else if(g_sEnet.eState == iEthTCPConnectComplete) { err_t eError; g_sEnet.eState = iEthTCPOpen; eError = EthClientSend(g_sWeather.pcRequest, g_sWeather.ui32RequestSize); if(eError == ERR_OK) { // // Waiting on a query response. // g_sEnet.eState = iEthQueryWait; } else { g_sEnet.eState = iEthIdle; } } }