Merge branch 'bugfix/ppp_enable_ipv6' into 'master'
esp-netif: make the IPv6 configurable for PPP netifs Closes IDFGH-2712 and WIFI-860 See merge request espressif/esp-idf!7772
This commit is contained in:
commit
8b9a7ce67a
7 changed files with 82 additions and 22 deletions
|
@ -21,6 +21,8 @@
|
||||||
#include "esp_event.h"
|
#include "esp_event.h"
|
||||||
#include "esp_netif_ppp.h"
|
#include "esp_netif_ppp.h"
|
||||||
#include "esp_netif_lwip_internal.h"
|
#include "esp_netif_lwip_internal.h"
|
||||||
|
#include "lwip/ip6_addr.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
ESP_EVENT_DEFINE_BASE(NETIF_PPP_STATUS);
|
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) {
|
switch (err_code) {
|
||||||
case PPPERR_NONE: /* Connected */
|
case PPPERR_NONE: /* Connected */
|
||||||
ESP_LOGI(TAG, "Connected");
|
ESP_LOGI(TAG, "Connected");
|
||||||
|
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;
|
||||||
|
|
||||||
evt.ip_info.ip.addr = pppif->ip_addr.u_addr.ip4.addr;
|
dest_ip = dns_getserver(0);
|
||||||
evt.ip_info.gw.addr = pppif->gw.u_addr.ip4.addr;
|
if(dest_ip != NULL){
|
||||||
evt.ip_info.netmask.addr = pppif->netmask.u_addr.ip4.addr;
|
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));
|
||||||
|
|
||||||
dest_ip = dns_getserver(0);
|
|
||||||
if(dest_ip != NULL){
|
err = esp_event_post(IP_EVENT, netif->get_ip_event, &evt, sizeof(evt), 0);
|
||||||
ns1.addr = (*dest_ip).u_addr.ip4.addr;
|
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;
|
||||||
}
|
}
|
||||||
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);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
|
|
||||||
case PPPERR_PARAM:
|
case PPPERR_PARAM:
|
||||||
ESP_LOGE(TAG, "Invalid parameter");
|
ESP_LOGE(TAG, "Invalid parameter");
|
||||||
|
|
|
@ -543,6 +543,17 @@ menu "LWIP"
|
||||||
|
|
||||||
PPP over serial support is experimental and unsupported.
|
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
|
config LWIP_PPP_NOTIFY_PHASE_SUPPORT
|
||||||
bool "Enable Notify Phase Callback"
|
bool "Enable Notify Phase Callback"
|
||||||
depends on LWIP_PPP_SUPPORT
|
depends on LWIP_PPP_SUPPORT
|
||||||
|
|
|
@ -611,6 +611,14 @@
|
||||||
|
|
||||||
#if PPP_SUPPORT
|
#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.
|
* PPP_NOTIFY_PHASE==1: Support PPP notify phase.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -3176,8 +3176,10 @@ static void _mdns_handle_system_event(esp_event_base_t event_base,
|
||||||
case IP_EVENT_GOT_IP6:
|
case IP_EVENT_GOT_IP6:
|
||||||
{
|
{
|
||||||
mdns_if_t mdns_if = _mdns_get_if_from_esp_netif(interface);
|
mdns_if_t mdns_if = _mdns_get_if_from_esp_netif(interface);
|
||||||
_mdns_enable_pcb(mdns_if, MDNS_IP_PROTOCOL_V6);
|
if (mdns_if != MDNS_IF_MAX) {
|
||||||
_mdns_announce_pcb(mdns_if, MDNS_IP_PROTOCOL_V4, NULL, 0, true);
|
_mdns_enable_pcb(mdns_if, MDNS_IP_PROTOCOL_V6);
|
||||||
|
_mdns_announce_pcb(mdns_if, MDNS_IP_PROTOCOL_V4, NULL, 0, true);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -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,
|
static void on_got_ipv6(void *arg, esp_event_base_t event_base,
|
||||||
int32_t event_id, void *event_data)
|
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;
|
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));
|
memcpy(&s_ipv6_addr, &event->ip6_info.ip, sizeof(s_ipv6_addr));
|
||||||
xEventGroupSetBits(s_connect_event_group, GOT_IPV6_BIT);
|
xEventGroupSetBits(s_connect_event_group, GOT_IPV6_BIT);
|
||||||
}
|
}
|
||||||
|
|
|
@ -203,6 +203,11 @@ static void on_ip_event(void *arg, esp_event_base_t event_base,
|
||||||
ESP_LOGI(TAG, "GOT ip event!!!");
|
ESP_LOGI(TAG, "GOT ip event!!!");
|
||||||
} else if (event_id == IP_EVENT_PPP_LOST_IP) {
|
} else if (event_id == IP_EVENT_PPP_LOST_IP) {
|
||||||
ESP_LOGI(TAG, "Modem Disconnect from PPP Server");
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,3 +3,5 @@ CONFIG_LWIP_PPP_SUPPORT=y
|
||||||
CONFIG_LWIP_PPP_NOTIFY_PHASE_SUPPORT=y
|
CONFIG_LWIP_PPP_NOTIFY_PHASE_SUPPORT=y
|
||||||
CONFIG_LWIP_PPP_PAP_SUPPORT=y
|
CONFIG_LWIP_PPP_PAP_SUPPORT=y
|
||||||
CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=4096
|
CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=4096
|
||||||
|
# Do not enable IPV6 in dte<->dce link local
|
||||||
|
CONFIG_LWIP_PPP_ENABLE_IPV6=n
|
||||||
|
|
Loading…
Reference in a new issue