Browse Source

Merge branch 'bugfix/ppp_enable_ipv6_v4.1' into 'release/v4.1'

esp-netif: make the IPv6 configurable for PPP netifs (v4.1)

See merge request espressif/esp-idf!8200
Angus Gratton 5 years ago
parent
commit
a41bcacf31

+ 49 - 21
components/esp_netif/lwip/esp_netif_lwip_ppp.c

@@ -21,6 +21,8 @@
 #include "esp_event.h"
 #include "esp_netif_ppp.h"
 #include "esp_netif_lwip_internal.h"
+#include "lwip/ip6_addr.h"
+#include <string.h>
 
 ESP_EVENT_DEFINE_BASE(NETIF_PPP_STATUS);
 
@@ -57,28 +59,54 @@ static void on_ppp_status_changed(ppp_pcb *pcb, int err_code, void *ctx)
     switch (err_code) {
         case PPPERR_NONE: /* Connected */
             ESP_LOGI(TAG, "Connected");
-
-            evt.ip_info.ip.addr = pppif->ip_addr.u_addr.ip4.addr;
-            evt.ip_info.gw.addr = pppif->gw.u_addr.ip4.addr;
-            evt.ip_info.netmask.addr = pppif->netmask.u_addr.ip4.addr;
-
-            dest_ip = dns_getserver(0);
-            if(dest_ip != NULL){
-                ns1.addr = (*dest_ip).u_addr.ip4.addr;
-            }
-            dest_ip = dns_getserver(1);
-            if(dest_ip != NULL){
-                ns2.addr = (*dest_ip).u_addr.ip4.addr;
-            }
-            ESP_LOGI(TAG, "Name Server1: " IPSTR, IP2STR(&ns1));
-            ESP_LOGI(TAG, "Name Server2: " IPSTR, IP2STR(&ns2));
-
-
-            err = esp_event_post(IP_EVENT, netif->get_ip_event, &evt, sizeof(evt), 0);
-            if (ESP_OK != err) {
-                ESP_LOGE(TAG, "esp_event_send_internal failed with code %d", err);
+            if (pcb->if4_up && !ip_addr_isany(&pppif->ip_addr)) {
+                evt.ip_info.ip.addr = pppif->ip_addr.u_addr.ip4.addr;
+                evt.ip_info.gw.addr = pppif->gw.u_addr.ip4.addr;
+                evt.ip_info.netmask.addr = pppif->netmask.u_addr.ip4.addr;
+
+                dest_ip = dns_getserver(0);
+                if(dest_ip != NULL){
+                    ns1.addr = (*dest_ip).u_addr.ip4.addr;
+                }
+                dest_ip = dns_getserver(1);
+                if(dest_ip != NULL){
+                    ns2.addr = (*dest_ip).u_addr.ip4.addr;
+                }
+                ESP_LOGI(TAG, "Name Server1: " IPSTR, IP2STR(&ns1));
+                ESP_LOGI(TAG, "Name Server2: " IPSTR, IP2STR(&ns2));
+
+
+                err = esp_event_post(IP_EVENT, netif->get_ip_event, &evt, sizeof(evt), 0);
+                if (ESP_OK != err) {
+                    ESP_LOGE(TAG, "esp_event_post failed with code %d", err);
+                }
+                return;
+#if PPP_IPV6_SUPPORT
+            } else if (pcb->if6_up && !ip_addr_isany(&pppif->ip6_addr[0])) {
+                esp_netif_ip6_info_t ip6_info;
+                ip6_addr_t lwip_ip6_info;
+                ip_event_got_ip6_t ip6_event = { .esp_netif = pppif->state, .if_index = -1 };
+
+                ip6_addr_set(&lwip_ip6_info, ip_2_ip6(&pppif->ip6_addr[0]));
+#if LWIP_IPV6_SCOPES
+                memcpy(&ip6_info.ip, &lwip_ip6_info, sizeof(esp_ip6_addr_t));
+#else
+                memcpy(&ip6_info.ip, &lwip_ip6_info, sizeof(ip6_addr_t));
+                ip6_info.ip.zone = 0;   // zero out zone, as not used in lwip
+#endif /* LWIP_IPV6_SCOPES */
+                memcpy(&ip6_event.ip6_info, &ip6_info, sizeof(esp_netif_ip6_info_t));
+
+                ESP_LOGI(TAG, "Got IPv6 address " IPV6STR, IPV62STR(pppif->ip6_addr[0].u_addr.ip6));
+                err = esp_event_post(IP_EVENT, IP_EVENT_GOT_IP6, &ip6_event, sizeof(ip6_event), 0);
+                if (ESP_OK != err) {
+                    ESP_LOGE(TAG, "esp_event_post failed with code %d", err);
+                }
+                return;
+#endif /* PPP_IPV6_SUPPORT */
+            } else {
+                ESP_LOGE(TAG, "Unexpected connected event");
+                return;
             }
-            return;
 
         case PPPERR_PARAM:
             ESP_LOGE(TAG, "Invalid parameter");

+ 11 - 0
components/lwip/Kconfig

@@ -542,6 +542,17 @@ menu "LWIP"
 
             PPP over serial support is experimental and unsupported.
 
+    config LWIP_PPP_ENABLE_IPV6
+        bool "Enable IPV6 support for PPP connections (IPV6CP)"
+        depends on LWIP_PPP_SUPPORT
+        default y
+        help
+            Enable IPV6 support in PPP for the local link between the DTE (processor) and DCE (modem).
+            There are some modems which do not support the IPV6 addressing in the local link.
+            If they are requested for IPV6CP negotiation, they may time out.
+            This would in turn fail the configuration for the whole link.
+            If your modem is not responding correctly to PPP Phase Network, try to disable IPV6 support.
+
     config LWIP_PPP_NOTIFY_PHASE_SUPPORT
         bool "Enable Notify Phase Callback"
         depends on LWIP_PPP_SUPPORT

+ 8 - 0
components/lwip/port/esp32/include/lwipopts.h

@@ -611,6 +611,14 @@
 
 #if PPP_SUPPORT
 
+/**
+ * PPP_IPV6_SUPPORT == 1: Enable IPV6 support for local link
+ * between modem and lwIP stack.
+ * Some modems do not support IPV6 addressing in local link and
+ * the only option available is to disable IPV6 address negotiation.
+ */
+#define PPP_IPV6_SUPPORT				CONFIG_LWIP_PPP_ENABLE_IPV6
+
 /**
  * PPP_NOTIFY_PHASE==1: Support PPP notify phase.
  */

+ 4 - 2
components/mdns/mdns.c

@@ -3176,8 +3176,10 @@ static void _mdns_handle_system_event(esp_event_base_t event_base,
             case IP_EVENT_GOT_IP6:
             {
                 mdns_if_t mdns_if = _mdns_get_if_from_esp_netif(interface);
-                _mdns_enable_pcb(mdns_if, MDNS_IP_PROTOCOL_V6);
-                _mdns_announce_pcb(mdns_if, MDNS_IP_PROTOCOL_V4, NULL, 0, true);
+                if (mdns_if != MDNS_IF_MAX) {
+                    _mdns_enable_pcb(mdns_if, MDNS_IP_PROTOCOL_V6);
+                    _mdns_announce_pcb(mdns_if, MDNS_IP_PROTOCOL_V4, NULL, 0, true);
+                }
 
             }
                 break;

+ 5 - 1
examples/common_components/protocol_examples_common/connect.c

@@ -65,8 +65,12 @@ static void on_got_ip(void *arg, esp_event_base_t event_base,
 static void on_got_ipv6(void *arg, esp_event_base_t event_base,
                         int32_t event_id, void *event_data)
 {
-    ESP_LOGI(TAG, "Got IPv6 event!");
     ip_event_got_ip6_t *event = (ip_event_got_ip6_t *)event_data;
+    if (event->esp_netif != s_example_esp_netif) {
+        ESP_LOGD(TAG, "Got IPv6 from another netif: ignored");
+        return;
+    }
+    ESP_LOGI(TAG, "Got IPv6 event!");
     memcpy(&s_ipv6_addr, &event->ip6_info.ip, sizeof(s_ipv6_addr));
     xEventGroupSetBits(s_connect_event_group, GOT_IPV6_BIT);
 }

+ 5 - 0
examples/protocols/pppos_client/main/pppos_client_main.c

@@ -203,6 +203,11 @@ static void on_ip_event(void *arg, esp_event_base_t event_base,
         ESP_LOGI(TAG, "GOT ip event!!!");
     } else if (event_id == IP_EVENT_PPP_LOST_IP) {
         ESP_LOGI(TAG, "Modem Disconnect from PPP Server");
+    } else if (event_id == IP_EVENT_GOT_IP6) {
+        ESP_LOGI(TAG, "GOT IPv6 event!");
+
+        ip_event_got_ip6_t *event = (ip_event_got_ip6_t *)event_data;
+        ESP_LOGI(TAG, "Got IPv6 address " IPV6STR, IPV62STR(event->ip6_info.ip));
     }
 }
 

+ 2 - 0
examples/protocols/pppos_client/sdkconfig.defaults

@@ -3,3 +3,5 @@ CONFIG_LWIP_PPP_SUPPORT=y
 CONFIG_LWIP_PPP_NOTIFY_PHASE_SUPPORT=y
 CONFIG_LWIP_PPP_PAP_SUPPORT=y
 CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=4096
+# Do not enable IPV6 in dte<->dce link local
+CONFIG_LWIP_PPP_ENABLE_IPV6=n