]> git.kernelconcepts.de Git - karo-tx-redboot.git/blobdiff - packages/net/lwip_tcpip/v2_0/src/ecos/init.c
unified MX27, MX25, MX37 trees
[karo-tx-redboot.git] / packages / net / lwip_tcpip / v2_0 / src / ecos / init.c
index 129e0a3e1216512c4a8b4b3ec57a930d24247424..3f559423ba6d787dca03458dd819d86fd8ecb74a 100644 (file)
@@ -34,6 +34,7 @@
  * init.c - misc lwip ecos glue functions 
  */
 #include <pkgconf/system.h>
+#include <pkgconf/net_lwip.h>
 #include "lwip/opt.h"
 #include "lwip/sys.h"
 #include "lwip/memp.h"
@@ -75,12 +76,6 @@ void inline IP_ADDR(struct ip_addr *ipaddr, char a, char b, char c, char d)
 }
 
 
-void tcpip_init_done(void * arg)
-{
-       sys_sem_t *sem = arg;
-       sys_sem_signal(*sem);
-}
-
 struct netif mynetif, loopif;
 void lwip_set_addr(struct netif *netif);
 #if PPP_SUPPORT
@@ -116,6 +111,51 @@ ppp_trace(int level, const char *format,...)
 struct netif ecos_loopif;
 #endif
 
+#ifdef CYGPKG_LWIP_ETH
+static void
+arp_timer(void *arg)
+{
+  etharp_tmr();
+  sys_timeout(ARP_TMR_INTERVAL, (sys_timeout_handler) arp_timer, NULL);
+}
+#endif
+
+#if LWIP_DHCP
+static void lwip_dhcp_fine_tmr(void *arg)
+{
+    dhcp_fine_tmr();
+    sys_timeout(500, (sys_timeout_handler) lwip_dhcp_fine_tmr, NULL);
+}
+
+static void lwip_dhcp_coarse_tmr(void *arg)
+{
+    dhcp_coarse_tmr();
+    sys_timeout(60000, (sys_timeout_handler) lwip_dhcp_coarse_tmr, NULL);
+}
+#endif
+
+
+//
+// This function is called when tcpip thread finished initialisation.
+// We start several timers here - these timers are all handled in the
+// tcpip thread. That means that also the DHCP stuff is handled in the
+// TCPIP thread. If this causes any trouble than it may be necessaray to
+// use an own DHCP thread insted.
+//
+void tcpip_init_done(void * arg)
+{
+#ifdef CYGPKG_LWIP_ETH
+    sys_timeout(ARP_TMR_INTERVAL, (sys_timeout_handler) arp_timer, NULL);
+#endif
+#ifdef CYGOPT_LWIP_DHCP_MANAGEMENT
+       sys_timeout(500, (sys_timeout_handler) lwip_dhcp_fine_tmr, NULL);
+       sys_timeout(60000, (sys_timeout_handler) lwip_dhcp_coarse_tmr, NULL);
+#endif
+       sys_sem_t *sem = arg;
+       sys_sem_signal(*sem);
+}
+
+
 /*
  * Called by the eCos application at startup
  * wraps various init calls
@@ -123,7 +163,9 @@ struct netif ecos_loopif;
 int
 lwip_init(void)
 {
+#if LWIP_HAVE_LOOPIF
        struct ip_addr ipaddr, netmask, gw;
+#endif
        static int inited = 0;
        sys_sem_t sem;
        if (inited)
@@ -167,22 +209,45 @@ lwip_init(void)
        return 0;
 }
 
+
+err_t lwip_dummy_netif_init(struct netif *netif)
+{
+    return ERR_OK; 
+}
+
+
 void
 lwip_set_addr(struct netif *netif)
 {
        struct ip_addr ipaddr, netmask, gw;
+  
+#if LWIP_DHCP
+    IP4_ADDR(&gw, 0,0,0,0);
+    IP4_ADDR(&ipaddr, 0,0,0,0);
+    IP4_ADDR(&netmask, 0,0,0,0);
+
+    netif_add(netif, &ipaddr, &netmask, &gw, netif->state, lwip_dummy_netif_init, tcpip_input);
+    netif_set_default(netif);
+    netif_set_up(netif);        // new step from lwip 1.0.0
+#else
+       IP_ADDR(&gw, CYGDAT_LWIP_SERV_ADDR);
+       IP_ADDR(&ipaddr, CYGDAT_LWIP_MY_ADDR);
+       IP_ADDR(&netmask, CYGDAT_LWIP_NETMASK);
+
+       netif_add(netif, &ipaddr, &netmask, &gw, netif->state, lwip_dummy_netif_init, tcpip_input);
+    netif_set_default(netif); 
+    netif_set_up(netif);        // new step from lwip 1.0.0
+#endif 
+}
 
-       IP_ADDR(&gw, CYGPKG_LWIP_SERV_ADDR);
-       IP_ADDR(&ipaddr, CYGPKG_LWIP_MY_ADDR);
-       IP_ADDR(&netmask, CYGPKG_LWIP_NETMASK);
-       netif_set_addr(netif, &ipaddr, &netmask, &gw);
-       netif->next = netif_list;
-       netif_list = netif;
-       
-       netif->input = tcpip_input;
-       //netif->input = ip_input;
+void lwip_dhcp_init(struct netif *netif)
+{
+#ifdef CYGOPT_LWIP_DHCP_MANAGEMENT
+    dhcp_start(netif);
+#endif
 }
 
+
 #ifdef CYGPKG_LWIP_ETH
 //io eth stuff
 
@@ -222,6 +287,7 @@ input_thread(void *arg)
 
 }
 
+
 // Initialize all network devices
 static void
 init_hw_drivers(void)
@@ -238,22 +304,20 @@ init_hw_drivers(void)
   }
 }
 
-static void
-arp_timer(void *arg)
-{
-  etharp_tmr();
-  sys_timeout(ARP_TMR_INTERVAL, (sys_timeout_handler) arp_timer, NULL);
-}
-
+extern struct netif *netif_default;
 
 static void
 ecosglue_init(void)
 {
-  cyg_semaphore_init(&delivery, 0);
-  init_hw_drivers();
-  sys_thread_new(input_thread, (void*)0, CYGPKG_LWIP_ETH_THREAD_PRIORITY);
-  etharp_init();
-  sys_timeout(ARP_TMR_INTERVAL, (sys_timeout_handler) arp_timer, NULL);
+    etharp_init();
+    cyg_semaphore_init(&delivery, 0);
+    //
+    // start input thread before hardware drivers are initialized because
+    // init_hw_drivers() calls dhcp_init() if DHCP support is configured 
+    // and dhcp_init() requires a running input thread
+    //
+    sys_thread_new(input_thread, (void*)0, CYGNUM_LWIP_ETH_THREAD_PRIORITY);
+    init_hw_drivers();
 }
 
 #endif //CYGPKG_LWIP_ETH