* 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"
}
-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
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
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)
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
}
+
// Initialize all network devices
static void
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