]> granicus.if.org Git - esp-idf/commitdiff
ipv6 interface: add branch for ipv6 interface
authortzx <tianzhongxing@espressif.com>
Thu, 10 Nov 2016 03:24:31 +0000 (11:24 +0800)
committerWu Jian Gang <wujiangang@espressif.com>
Mon, 21 Nov 2016 03:06:51 +0000 (11:06 +0800)
components/esp32/include/esp_event.h
components/lwip/api/sockets.c
components/lwip/core/ipv4/autoip.c
components/lwip/core/ipv6/nd6.c
components/lwip/core/netif.c
components/lwip/include/lwip/lwip/autoip.h
components/lwip/include/lwip/lwip/nd6.h
components/lwip/include/lwip/lwip/netif.h
components/lwip/include/lwip/port/lwipopts.h
components/tcpip_adapter/include/tcpip_adapter.h
components/tcpip_adapter/tcpip_adapter_lwip.c

index 55575b13a861b5dfdb7cbc7e77c15e1c8d3824a3..06e35d6ad6ae3ce2519d1d804ad564e6d92f76c1 100644 (file)
@@ -44,6 +44,7 @@ typedef enum {
     SYSTEM_EVENT_AP_STACONNECTED,          /**< a station connected to ESP32 soft-AP */
     SYSTEM_EVENT_AP_STADISCONNECTED,       /**< a station disconnected from ESP32 soft-AP */
     SYSTEM_EVENT_AP_PROBEREQRECVED,        /**< Receive probe request packet in soft-AP interface */
+    SYSTEM_EVENT_AP_STA_GOT_IP6,           /**< ESP32 station or ap interface v6IP addr is preferred */
     SYSTEM_EVENT_MAX
 } system_event_id_t;
 
@@ -79,7 +80,11 @@ typedef struct {
 
 typedef struct {
     uint8_t pin_code[8];         /**< PIN code of station in enrollee mode */
-}system_event_sta_wps_er_pin_t;
+} system_event_sta_wps_er_pin_t;
+
+typedef struct {
+    tcpip_adapter_ip6_info_t ip6_info;
+} system_event_ap_sta_got_ip6_t;
 
 typedef struct {
     uint8_t mac[6];           /**< MAC address of the station connected to ESP32 soft-AP */
@@ -106,6 +111,7 @@ typedef union {
     system_event_ap_staconnected_t             sta_connected;      /**< a station connected to ESP32 soft-AP */
     system_event_ap_stadisconnected_t          sta_disconnected;   /**< a station disconnected to ESP32 soft-AP */
     system_event_ap_probe_req_rx_t             ap_probereqrecved;  /**< ESP32 soft-AP receive probe request packet */
+    system_event_ap_sta_got_ip6_t              got_ip6;            /**< ESP32 station or ap ipv6 addr state change to preferred */
 } system_event_info_t;
 
 typedef struct {
index 1529382f5061e22930996547d54b62e900bba201..4acf518cc900691fc2bedbdd2734151a6861dfd5 100755 (executable)
@@ -2775,8 +2775,12 @@ lwip_setsockopt_impl(int s, int level, int optname, const void *optval, socklen_
   case IPPROTO_IPV6:
     switch (optname) {
     case IPV6_V6ONLY:
-      /* @todo: this does not work for datagram sockets, yet */
+      /* @todo: this does not work for datagram sockets, yet */ 
+#if CONFIG_MDNS
+      //LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_TCP);
+#else
       LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_TCP);
+#endif
       if (*(const int*)optval) {
         netconn_set_ipv6only(sock->conn, 1);
       } else {
index 19b19283689967ce9b684be0d89827d21747a5bd..faac4957ca27b4833b5c7dbd9f20bf0028dcba8d 100755 (executable)
@@ -72,6 +72,7 @@
 #include "lwip/netif.h"
 #include "lwip/autoip.h"
 #include "netif/etharp.h"
+#include "lwip/dhcp.h"
 
 #include <stdlib.h>
 #include <string.h>
@@ -269,6 +270,12 @@ autoip_bind(struct netif *netif)
   netif_set_addr(netif, &autoip->llipaddr, &sn_mask, &gw_addr);
   /* interface is used by routing now that an address is set */
 
+#if ESP_LWIP
+  struct dhcp *dhcp = netif->dhcp;
+  if (dhcp->cb != NULL) {
+    dhcp->cb();
+  }
+#endif
   return ERR_OK;
 }
 
index 36f8f78c35241295edd4d38d2c04069efb8d6265..1cec55db9ef12c257c4d8ad409dc7b702a31069e 100755 (executable)
@@ -632,6 +632,22 @@ nd6_input(struct pbuf *p, struct netif *inp)
   pbuf_free(p);
 }
 
+#ifdef ESP_LWIP
+
+/** Set callback for ipv6 addr status changed .
+ *
+ * @param netif the netif from which to remove the struct dhcp
+ * @param cb    callback for dhcp
+ */
+void nd6_set_cb(struct netif *netif, void (*cb)(struct netif *netif, u8_t ip_index))
+{
+  LWIP_ASSERT("netif != NULL", netif != NULL);
+
+  if (netif != NULL && netif_is_up(netif)) {
+      netif->ipv6_addr_cb = cb;
+  }
+}
+#endif
 
 /**
  * Periodic timer for Neighbor discovery functions:
@@ -797,6 +813,12 @@ nd6_tmr(void)
         if ((netif->ip6_addr_state[i] & 0x07) >= LWIP_IPV6_DUP_DETECT_ATTEMPTS) {
           /* No NA received in response. Mark address as valid. */
           netif->ip6_addr_state[i] = IP6_ADDR_PREFERRED;
+#ifdef ESP_LWIP
+          if (netif->ipv6_addr_cb != NULL) {
+              netif->ipv6_addr_cb(netif, i);
+          }
+#endif
+
           /* TODO implement preferred and valid lifetimes. */
         } else if (netif->flags & NETIF_FLAG_UP) {
 #if LWIP_IPV6_MLD
index 5c308a957c14837831f2da94d2ce2877896e5b94..f745f29ac5dd8fcada16a4be926c783b28877bba 100755 (executable)
@@ -968,9 +968,6 @@ netif_create_ip6_linklocal_address(struct netif *netif, u8_t from_mac_48bit)
     }
   }
   
-#if ESP_LWIP
-    ip6_addr_set( ip_2_ip6(&netif->link_local_addr), ip_2_ip6(&netif->ip6_addr[0]) );
-#endif
 
   /* Set address state. */
 #if LWIP_IPV6_DUP_DETECT_ATTEMPTS
@@ -1022,44 +1019,6 @@ netif_add_ip6_address(struct netif *netif, const ip6_addr_t *ip6addr, s8_t *chos
   return ERR_VAL;
 }
 
-
-#if ESP_LWIP
-void
-netif_create_ip4_linklocal_address(struct netif * netif)
-{
-#if 1
-       ip_addr_t linklocal;
-       ip_addr_t linklocal_mask;
-       ip4_addr_t addr = {0};
-       /* Link-local prefix and mask. */
-       IP4_ADDR(ip_2_ip4(&linklocal), 169, 254, 0, 0);
-       IP4_ADDR(ip_2_ip4(&linklocal_mask), 255, 255, 0, 0);
-
-       if (!ip4_addr_netcmp( ip_2_ip4(&linklocal), ip_2_ip4(&netif->link_local_addr), ip_2_ip4(&linklocal_mask) ) &&
-               !ip4_addr_isany(ip_2_ip4(&netif->ip_addr)) ) {
-               IP4_ADDR( ip_2_ip4(&netif->link_local_addr), 169, 254, ip4_addr3( ip_2_ip4(&netif->ip_addr) )
-                                    , ip4_addr4( ip_2_ip4(&netif->ip_addr) )  );
-               return;
-       }
-
-       while ( !(addr.addr) || !ip4_addr4(&addr) )
-               //os_get_random((unsigned char *)&addr, sizeof(addr));
-            addr.addr = LWIP_RAND();
-
-
-       if ( ip_2_ip4(&netif->netmask)->addr > IP_CLASSB_NET &&
-               !ip4_addr_isany( ip_2_ip4(&netif->ip_addr) )) {  // random host address
-               IP4_ADDR( ip_2_ip4(&netif->link_local_addr), 169, 254, ip4_addr3( ip_2_ip4(&netif->ip_addr))
-                                , ip4_addr4(&addr));
-       } else {
-               IP4_ADDR( ip_2_ip4(&netif->link_local_addr), 169, 254, ip4_addr3(&addr), ip4_addr4(&addr) );
-       }
-#endif
-}
-
-#endif
-
-
 /** Dummy IPv6 output function for netifs not supporting IPv6
  */
 static err_t
index c89fe3ff128fd5aaf0970a20ce3810221989d556..3bb413f493df7ede9f22952d6d93e43468e28b56 100755 (executable)
@@ -68,8 +68,13 @@ extern "C" {
 #define ANNOUNCE_NUM             2   /*          (number of announcement packets)       */
 #define ANNOUNCE_INTERVAL        2   /* seconds  (time between announcement packets)    */
 #define ANNOUNCE_WAIT            2   /* seconds  (delay before announcing)              */
+#if CONFIG_MDNS
+#define MAX_CONFLICTS            9   /*          (max conflicts before rate limiting)   */
+#define RATE_LIMIT_INTERVAL      20  /* seconds  (delay between successive attempts)    */
+#else
 #define MAX_CONFLICTS            10  /*          (max conflicts before rate limiting)   */
 #define RATE_LIMIT_INTERVAL      60  /* seconds  (delay between successive attempts)    */
+#endif
 #define DEFEND_INTERVAL          10  /* seconds  (min. wait between defensive ARPs)     */
 
 /* AutoIP client states */
index d0646f1b4eabb3c99d7e1670a8776e7fe26d36a7..27a4c8137af8cf094f82178ad9c8c17412dbe004 100755 (executable)
@@ -352,6 +352,10 @@ err_t nd6_queue_packet(s8_t neighbor_index, struct pbuf * p);
 void nd6_reachability_hint(const ip6_addr_t * ip6addr);
 #endif /* LWIP_ND6_TCP_REACHABILITY_HINTS */
 
+#if ESP_LWIP
+/** set nd6 callback when ipv6 addr state pref*/
+void nd6_set_cb(struct netif *netif, void (*cb)(struct netif *netif, u8_t ip_index));
+#endif
 #ifdef __cplusplus
 }
 #endif
index 666f77eb96731ac0be07fdc2f2519eb1fc507c78..34e6d4489784c347652149ea170d51b6aac0da5f 100755 (executable)
@@ -190,11 +190,6 @@ struct netif {
   /** pointer to next in linked list */
   struct netif *next;
 
-#if ESP_LWIP
-//ip_addr_t  is changed   by marco  IPV4, IPV6
-  ip_addr_t link_local_addr;
-#endif
-
 #if LWIP_IPV4
   /** IP address configuration in network byte order */
   ip_addr_t ip_addr;
@@ -207,6 +202,10 @@ struct netif {
   /** The state of each IPv6 address (Tentative, Preferred, etc).
    * @see ip6_addr.h */
   u8_t ip6_addr_state[LWIP_IPV6_NUM_ADDRESSES];
+#if ESP_LWIP
+  void (*ipv6_addr_cb)(struct netif* netif, u8_t ip_idex); /* callback for ipv6 addr states changed */
+#endif
+
 #endif /* LWIP_IPV6 */
   /** This function is called by the network device driver
    *  to pass a packet up the TCP/IP stack. */
index 26bdc3a4e90d7ffb99660e8960272ab5c50201cd..b63fc80e57714c0c86568fe51ae64cb6426d0ecb 100755 (executable)
@@ -65,8 +65,8 @@
  */
 #define SMEMCPY(dst,src,len)            memcpy(dst,src,len)
 
-extern unsigned long os_random(void);
-#define LWIP_RAND      rand
+#define LWIP_RAND       rand
+
 /*
    ------------------------------------
    ---------- Memory options ----------
@@ -200,13 +200,35 @@ extern unsigned long os_random(void);
  */
 #define LWIP_DHCP                       1
 
+#define DHCP_MAXRTX                     0
 
-#define DHCP_MAXRTX                                            0   //(*(volatile uint32*)0x600011E0)
 /*
    ------------------------------------
    ---------- AUTOIP options ----------
    ------------------------------------
 */
+#if CONFIG_MDNS
+ /**
+  * LWIP_AUTOIP==1: Enable AUTOIP module.
+  */
+#define LWIP_AUTOIP                     1
+
+/**
+* LWIP_DHCP_AUTOIP_COOP==1: Allow DHCP and AUTOIP to be both enabled on
+* the same interface at the same time.
+*/
+#define LWIP_DHCP_AUTOIP_COOP           1
+
+/**
+* LWIP_DHCP_AUTOIP_COOP_TRIES: Set to the number of DHCP DISCOVER probes
+* that should be sent before falling back on AUTOIP. This can be set
+* as low as 1 to get an AutoIP address very quickly, but you should
+* be prepared to handle a changing IP address when DHCP overrides
+* AutoIP.
+*/
+#define LWIP_DHCP_AUTOIP_COOP_TRIES     2
+#endif
+
 /*
    ----------------------------------
    ---------- SNMP options ----------
@@ -308,6 +330,19 @@ extern unsigned long os_random(void);
    ---------- LOOPIF options ----------
    ------------------------------------
 */
+#if CONFIG_MDNS
+/**
+ * LWIP_NETIF_LOOPBACK==1: Support sending packets with a destination IP
+ * address equal to the netif IP address, looping them back up the stack.
+ */
+#define LWIP_NETIF_LOOPBACK             1
+
+/**
+ * LWIP_LOOPBACK_MAX_PBUFS: Maximum number of pbufs on queue for loopback
+ * sending for each netif (0 = disabled)
+ */
+#define LWIP_LOOPBACK_MAX_PBUFS         8
+#endif
 
 /*
    ------------------------------------
@@ -414,6 +449,15 @@ extern unsigned long os_random(void);
  */
 #define SO_REUSE                        CONFIG_LWIP_SO_REUSE
 
+#if CONFIG_MDNS
+/**
+ * SO_REUSE_RXTOALL==1: Pass a copy of incoming broadcast/multicast packets
+ * to all local matches if SO_REUSEADDR is turned on.
+ * WARNING: Adds a memcpy for every packet if passing to more than one pcb!
+ */
+#define SO_REUSE_RXTOALL                1
+#endif
+
 /*
    ----------------------------------------
    ---------- Statistics options ----------
index 45d6ade305cc4191346ddd45faa6d1544b347ffa..f7063a8e17ee9e8f1190edbffb7e4ce5e0a68f64 100644 (file)
@@ -64,18 +64,22 @@ typedef struct {
     ip4_addr_t gw;
 } tcpip_adapter_ip_info_t;
 
+typedef struct {
+    ip6_addr_t ip;
+} tcpip_adapter_ip6_info_t;
+
 typedef dhcps_lease_t tcpip_adapter_dhcps_lease_t;
 
 #if CONFIG_DHCP_STA_LIST 
 typedef struct {
     uint8_t mac[6];
     ip4_addr_t ip;
-}tcpip_adapter_sta_info_t;
+} tcpip_adapter_sta_info_t;
 
 typedef struct {
     tcpip_adapter_sta_info_t sta[ESP_WIFI_MAX_CONN_NUM];
     int num;
-}tcpip_adapter_sta_list_t;
+} tcpip_adapter_sta_list_t;
 #endif
 
 #endif
@@ -211,6 +215,35 @@ esp_err_t tcpip_adapter_get_ip_info(tcpip_adapter_if_t tcpip_if, tcpip_adapter_i
  */
 esp_err_t tcpip_adapter_set_ip_info(tcpip_adapter_if_t tcpip_if, tcpip_adapter_ip_info_t *ip_info);
 
+/**
+ * @brief  create interface's linklocal IPv6 information
+ *
+ * @note this function will create a linklocal IPv6 address about input interface,
+ *       if this address status changed to preferred, will call event call back ,
+ *       notify user linklocal IPv6 address has been verified
+ *
+ * @param[in]  tcpip_if: the interface which we want to set IP information
+ *
+ *
+ * @return ESP_OK
+ *         ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS
+ */
+esp_err_t tcpip_adapter_create_ip6_linklocal(tcpip_adapter_if_t tcpip_if);
+
+/**
+ * @brief  get interface's linkloacl IPv6 information
+ *
+ * There has an IPv6 information copy in adapter library, if interface is up,and IPv6 info
+ * is preferred,it will get IPv6 linklocal IP successfully
+ *
+ * @param[in]  tcpip_if: the interface which we want to set IP information
+ * @param[in]  if_ip6: If successful, IPv6 information will be returned in this argument.
+ *
+ * @return ESP_OK
+ *         ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS
+ */
+esp_err_t tcpip_adapter_get_ip6_linklocal(tcpip_adapter_if_t tcpip_if, ip6_addr_t *if_ip6);
+
 #if 0
 esp_err_t tcpip_adapter_get_mac(tcpip_adapter_if_t tcpip_if, uint8_t *mac);
 
index 3edc90509effee8b6de0cd8adfa1c1b94016a88f..25c801bd0183ae7b4e2e715db76cc0dda2158487 100644 (file)
@@ -23,7 +23,8 @@
 #include "lwip/tcpip.h"
 #include "lwip/dhcp.h"
 #include "lwip/ip_addr.h"
-
+#include "lwip/ip6_addr.h"
+#include "lwip/nd6.h"
 #include "netif/wlanif.h"
 
 #include "apps/dhcpserver.h"
@@ -32,6 +33,7 @@
 
 static struct netif *esp_netif[TCPIP_ADAPTER_IF_MAX];
 static tcpip_adapter_ip_info_t esp_ip[TCPIP_ADAPTER_IF_MAX];
+static tcpip_adapter_ip6_info_t esp_ip6[TCPIP_ADAPTER_IF_MAX];
 
 static tcpip_adapter_dhcp_status_t dhcps_status = TCPIP_ADAPTER_DHCP_INIT;
 static tcpip_adapter_dhcp_status_t dhcpc_status = TCPIP_ADAPTER_DHCP_INIT;
@@ -234,6 +236,69 @@ esp_err_t tcpip_adapter_set_ip_info(tcpip_adapter_if_t tcpip_if, tcpip_adapter_i
     return ESP_OK;
 }
 
+static void tcpip_adapter_nd6_cb(struct netif *p_netif, uint8_t ip_idex)
+{
+    tcpip_adapter_ip6_info_t *ip6_info;
+
+    if (!p_netif) {
+        TCPIP_ADAPTER_DEBUG("null p_netif=%p\n", p_netif);
+        return;
+    }
+
+    if (p_netif == esp_netif[TCPIP_ADAPTER_IF_STA]) {
+        ip6_info = &esp_ip6[TCPIP_ADAPTER_IF_STA];
+    } else if(p_netif == esp_netif[TCPIP_ADAPTER_IF_AP]) {
+        ip6_info = &esp_ip6[TCPIP_ADAPTER_IF_AP]; 
+    } else {
+        return;
+    }
+
+    system_event_t evt;
+
+    ip6_addr_set(&ip6_info->ip, ip_2_ip6(&p_netif->ip6_addr[ip_idex]));
+
+    //notify event
+    evt.event_id = SYSTEM_EVENT_AP_STA_GOT_IP6;
+    memcpy(&evt.event_info.got_ip6.ip6_info, ip6_info, sizeof(tcpip_adapter_ip6_info_t));
+    esp_event_send(&evt);
+}
+
+esp_err_t tcpip_adapter_create_ip6_linklocal(tcpip_adapter_if_t tcpip_if)
+{
+    struct netif *p_netif;
+
+    if (tcpip_if >= TCPIP_ADAPTER_IF_MAX) {
+        return ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS;
+    }
+
+    p_netif = esp_netif[tcpip_if];
+    if(p_netif != NULL && netif_is_up(p_netif)) {
+        netif_create_ip6_linklocal_address(p_netif, 1);
+        nd6_set_cb(p_netif, tcpip_adapter_nd6_cb);
+
+        return ESP_OK;
+    } else {
+        return ESP_FAIL;
+    }
+}
+
+esp_err_t tcpip_adapter_get_ip6_linklocal(tcpip_adapter_if_t tcpip_if, ip6_addr_t *if_ip6)
+{
+    struct netif *p_netif;
+
+    if (tcpip_if >= TCPIP_ADAPTER_IF_MAX || if_ip6 == NULL) {
+        return ESP_ERR_TCPIP_ADAPTER_INVALID_PARAMS;
+    }
+
+    p_netif = esp_netif[tcpip_if];
+    if (p_netif != NULL && netif_is_up(p_netif) && ip6_addr_ispreferred(netif_ip6_addr_state(p_netif, 0))) {
+        memcpy(if_ip6, &p_netif->ip6_addr[0], sizeof(ip6_addr_t));
+    } else {
+        return ESP_FAIL;
+    }
+    return ESP_OK;
+}
+
 #if 0
 esp_err_t tcpip_adapter_get_mac(tcpip_adapter_if_t tcpip_if, uint8_t mac[6])
 {