mbed IP library over Ethernet

Dependencies:   lwip-eth Socket lwip lwip-sys

Dependents:   denki-yohou_b Network-RTOS NTPClient_HelloWorld temp_FIAP ... more

Legacy Networking Libraries

This is an mbed 2 networking library. For mbed 5, the networking libraries have been revised to better support additional network stacks and thread safety here.

Files at this revision

API Documentation at this revision

Comitter:
emilmont
Date:
Fri Feb 15 17:01:20 2013 +0000
Parent:
25:a0ee3ae75cfa
Child:
27:2124eae946f3
Commit message:
Correct Ethernet initialization with static IP

Changed in this revision

EthernetInterface.cpp Show annotated file Show diff for this revision Revisions of this file
lwip.lib Show annotated file Show diff for this revision Revisions of this file
--- a/EthernetInterface.cpp	Mon Aug 13 09:38:08 2012 +0000
+++ b/EthernetInterface.cpp	Fri Feb 15 17:01:20 2013 +0000
@@ -31,21 +31,30 @@
 /* TCP/IP and Network Interface Initialisation */
 static struct netif lpcNetif;
 
-static Semaphore tcpip_inited(0);
-static Semaphore netif_inited(0);
+static char ip_addr[16] = "\0";
+static bool use_dhcp = false;
 
-static char ip_addr[16];
-static bool connected;
-static bool use_dhcp = false;
+static Semaphore tcpip_inited(0);
+static Semaphore netif_linked(0);
+static Semaphore netif_up(0);
 
 static void tcpip_init_done(void *arg) {
     tcpip_inited.release();
 }
+
+static void netif_link_callback(struct netif *netif) {
+    if (netif_is_link_up(netif)) {
+        netif_linked.release();
+    }
+}
+
 static void netif_status_callback(struct netif *netif) {
-    strcpy(ip_addr, inet_ntoa(netif->ip_addr));
-    connected = netif_is_up(netif) ? true : false;
-    netif_inited.release();
+    if (netif_is_up(netif)) {
+        strcpy(ip_addr, inet_ntoa(netif->ip_addr));
+        netif_up.release();
+    }
 }
+
 static void init_netif(ip_addr_t *ipaddr, ip_addr_t *netmask, ip_addr_t *gw) {
     tcpip_init(tcpip_init_done, NULL);
     tcpip_inited.wait();
@@ -53,6 +62,8 @@
     memset((void*) &lpcNetif, 0, sizeof(lpcNetif));
     netif_add(&lpcNetif, ipaddr, netmask, gw, NULL, lpc_enetif_init, tcpip_input);
     netif_set_default(&lpcNetif);
+    
+    netif_set_link_callback  (&lpcNetif, netif_link_callback);
     netif_set_status_callback(&lpcNetif, netif_status_callback);
 }
 
@@ -64,11 +75,14 @@
 
 int EthernetInterface::init(const char* ip, const char* mask, const char* gateway) {
     use_dhcp = false;
+    strcpy(ip_addr, ip);
+    
     ip_addr_t ip_n, mask_n, gateway_n;
     inet_aton(ip, &ip_n);
     inet_aton(mask, &mask_n);
     inet_aton(gateway, &gateway_n);
     init_netif(&ip_n, &mask_n, &gateway_n);
+    
     return 0;
 }
 
@@ -76,14 +90,20 @@
     NVIC_SetPriority(ENET_IRQn, ((0x01 << 3) | 0x01));
     NVIC_EnableIRQ(ENET_IRQn);
     
+    int inited;
     if (use_dhcp) {
         dhcp_start(&lpcNetif);
+        
+        // Wait for an IP
+        // -1: error, 0: timeout
+        inited = netif_up.wait(timeout_ms);
     } else {
         netif_set_up(&lpcNetif);
+        
+        // Wait for the link up
+        inited = netif_linked.wait(timeout_ms);
     }
     
-    // -1: error, 0: timeout
-    int inited = netif_inited.wait(timeout_ms);
     return (inited > 0) ? (0) : (-1);
 }
 
@@ -101,5 +121,5 @@
 }
 
 char* EthernetInterface::getIPAddress() {
-    return (connected) ? (ip_addr) : (NULL);
+    return ip_addr;
 }
--- a/lwip.lib	Mon Aug 13 09:38:08 2012 +0000
+++ b/lwip.lib	Fri Feb 15 17:01:20 2013 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/lwip/#00bf89892c76
+http://mbed.org/users/mbed_official/code/lwip/#b061c4dba951