feat(lwip): Add support for PPP server

Added support PPP_SERVER option in LWIP
Added support for configuring preferred addresses of PPP endpoints.
This commit is contained in:
David Cermak 2023-10-04 17:35:57 +02:00
parent c143e68c9f
commit a9265db5f1
4 changed files with 46 additions and 1 deletions

View File

@ -28,6 +28,10 @@ typedef struct esp_netif_ppp_config {
* The current session must be closed, settings will be applied upon connecting. * The current session must be closed, settings will be applied upon connecting.
* */ * */
#endif // CONFIG_LWIP_ENABLE_LCP_ECHO #endif // CONFIG_LWIP_ENABLE_LCP_ECHO
#ifdef CONFIG_LWIP_PPP_SERVER_SUPPORT
uint32_t ppp_our_ip4_addr; /**< Set our preferred address, typically used when we're the PPP server */
uint32_t ppp_their_ip4_addr; /**< Set our preferred address, typically used when we're the PPP server */
#endif // CONFIG_LWIP_PPP_SERVER_SUPPORT
} esp_netif_ppp_config_t; } esp_netif_ppp_config_t;
/** @brief event id offset for PHASE related events /** @brief event id offset for PHASE related events

View File

@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2019-2023 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2019-2024 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@ -33,6 +33,10 @@ typedef struct lwip_peer2peer_ctx {
bool ppp_error_event_enabled; bool ppp_error_event_enabled;
#ifdef CONFIG_LWIP_ENABLE_LCP_ECHO #ifdef CONFIG_LWIP_ENABLE_LCP_ECHO
bool ppp_lcp_echo_disabled; bool ppp_lcp_echo_disabled;
#endif
#ifdef CONFIG_LWIP_PPP_SERVER_SUPPORT
uint32_t ppp_our_ip4_addr; // our desired IP (0 if no preference)
uint32_t ppp_their_ip4_addr; // their desired IP (0 if no preference)
#endif #endif
ppp_pcb *ppp; ppp_pcb *ppp;
} lwip_peer2peer_ctx_t; } lwip_peer2peer_ctx_t;
@ -247,13 +251,29 @@ esp_err_t esp_netif_start_ppp(esp_netif_t *esp_netif)
ppp_ctx->ppp->settings.lcp_echo_fails = LCP_MAXECHOFAILS; ppp_ctx->ppp->settings.lcp_echo_fails = LCP_MAXECHOFAILS;
} }
#endif #endif
#ifdef CONFIG_LWIP_PPP_SERVER_SUPPORT
if (ppp_ctx->ppp_our_ip4_addr != 0) {
// Set our preferred address, and accept the remote
ppp_ctx->ppp->ipcp_wantoptions.ouraddr = ppp_ctx->ppp_our_ip4_addr;
ppp_ctx->ppp->ipcp_wantoptions.accept_remote = 1;
}
if (ppp_ctx->ppp_their_ip4_addr != 0) {
// Set their preferred address, and accept the local
ppp_ctx->ppp->ipcp_wantoptions.hisaddr = ppp_ctx->ppp_their_ip4_addr;
ppp_ctx->ppp->ipcp_wantoptions.accept_local = 1;
}
#endif // CONFIG_LWIP_PPP_SERVER_SUPPORT
#if ESP_IPV6_AUTOCONFIG #if ESP_IPV6_AUTOCONFIG
ppp_ctx->ppp->netif->ip6_autoconfig_enabled = 1; ppp_ctx->ppp->netif->ip6_autoconfig_enabled = 1;
#endif #endif
ESP_LOGD(TAG, "%s: Starting PPP connection: %p", __func__, ppp_ctx->ppp); ESP_LOGD(TAG, "%s: Starting PPP connection: %p", __func__, ppp_ctx->ppp);
#ifdef CONFIG_LWIP_PPP_SERVER_SUPPORT
esp_err_t err = ppp_listen(ppp_ctx->ppp);
#else
err_t err = ppp_connect(ppp_ctx->ppp, 0); err_t err = ppp_connect(ppp_ctx->ppp, 0);
#endif
if (err != ESP_OK) { if (err != ESP_OK) {
ESP_LOGE(TAG, "%s: PPP connection cannot be started", __func__); ESP_LOGE(TAG, "%s: PPP connection cannot be started", __func__);
if (ppp_ctx->ppp_error_event_enabled) { if (ppp_ctx->ppp_error_event_enabled) {
@ -308,6 +328,10 @@ esp_err_t esp_netif_ppp_set_params(esp_netif_t *netif, const esp_netif_ppp_confi
obj->ppp_error_event_enabled = config->ppp_error_event_enabled; obj->ppp_error_event_enabled = config->ppp_error_event_enabled;
#ifdef CONFIG_LWIP_ENABLE_LCP_ECHO #ifdef CONFIG_LWIP_ENABLE_LCP_ECHO
obj->ppp_lcp_echo_disabled = config->ppp_lcp_echo_disabled; obj->ppp_lcp_echo_disabled = config->ppp_lcp_echo_disabled;
#endif
#ifdef CONFIG_LWIP_PPP_SERVER_SUPPORT
obj->ppp_our_ip4_addr = config->ppp_our_ip4_addr;
obj->ppp_their_ip4_addr = config->ppp_their_ip4_addr;
#endif #endif
return ESP_OK; return ESP_OK;
} }
@ -324,5 +348,10 @@ esp_err_t esp_netif_ppp_get_params(esp_netif_t *netif, esp_netif_ppp_config_t *c
#ifdef CONFIG_LWIP_ENABLE_LCP_ECHO #ifdef CONFIG_LWIP_ENABLE_LCP_ECHO
config->ppp_lcp_echo_disabled = obj->ppp_lcp_echo_disabled; config->ppp_lcp_echo_disabled = obj->ppp_lcp_echo_disabled;
#endif #endif
#ifdef CONFIG_LWIP_PPP_SERVER_SUPPORT
config->ppp_our_ip4_addr = obj->ppp_our_ip4_addr;
config->ppp_their_ip4_addr = obj->ppp_their_ip4_addr;
#endif
return ESP_OK; return ESP_OK;
} }

View File

@ -952,6 +952,13 @@ menu "LWIP"
help help
Enable Microsoft Point-to-Point Encryption (MPPE) support Enable Microsoft Point-to-Point Encryption (MPPE) support
config LWIP_PPP_SERVER_SUPPORT
bool "Enable PPP server support"
depends on LWIP_PPP_SUPPORT
default n
help
Enable to use PPP server
config LWIP_ENABLE_LCP_ECHO config LWIP_ENABLE_LCP_ECHO
bool "Enable LCP ECHO" bool "Enable LCP ECHO"
depends on LWIP_PPP_SUPPORT depends on LWIP_PPP_SUPPORT

View File

@ -1105,6 +1105,11 @@ static inline uint32_t timeout_from_offered(uint32_t lease, uint32_t min)
*/ */
#define MPPE_SUPPORT CONFIG_LWIP_PPP_MPPE_SUPPORT #define MPPE_SUPPORT CONFIG_LWIP_PPP_MPPE_SUPPORT
/**
* PPP_SERVER==1: Enable PPP server support (waiting for incoming PPP session).
*/
#define PPP_SERVER CONFIG_LWIP_PPP_SERVER_SUPPORT
/** /**
* PPP_MAXIDLEFLAG: Max Xmit idle time (in ms) before resend flag char. * PPP_MAXIDLEFLAG: Max Xmit idle time (in ms) before resend flag char.
* TODO: If PPP_MAXIDLEFLAG > 0 and next package is send during PPP_MAXIDLEFLAG time, * TODO: If PPP_MAXIDLEFLAG > 0 and next package is send during PPP_MAXIDLEFLAG time,