From 5708743c5a9ae9ad6e88f273308fa7e94cf7f563 Mon Sep 17 00:00:00 2001 From: zhangwenxu Date: Wed, 10 May 2023 15:25:09 +0800 Subject: [PATCH 1/2] lwip: add a hook for ip6 source address selection --- components/lwip/Kconfig | 20 +++++++++++++++++++ components/lwip/lwip | 2 +- .../lwip/port/hooks/lwip_default_hooks.c | 12 ++++++++++- .../lwip/port/include/lwip_default_hooks.h | 6 ++++++ 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/components/lwip/Kconfig b/components/lwip/Kconfig index 95c1c72f393..843cb90289f 100644 --- a/components/lwip/Kconfig +++ b/components/lwip/Kconfig @@ -1024,6 +1024,26 @@ menu "LWIP" endchoice + choice LWIP_HOOK_IP6_SELECT_SRC_ADDR + prompt "IPv6 source address selection Hook" + depends on LWIP_IPV6 + default LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE + help + Enables custom IPv6 source address selection. + Setting this to "default" provides weak implementation + stub that could be overwritten in application code. + Setting this to "custom" provides hook's declaration + only and expects the application to implement it. + + config LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE + bool "No hook declared" + config LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT + bool "Default (weak) implementation" + config LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM + bool "Custom implementation" + + endchoice + choice LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE prompt "Netconn external resolve Hook" default LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT if OPENTHREAD_DNS64_CLIENT diff --git a/components/lwip/lwip b/components/lwip/lwip index dafc8225313..57c29648ff4 160000 --- a/components/lwip/lwip +++ b/components/lwip/lwip @@ -1 +1 @@ -Subproject commit dafc8225313a1ce00fb0b497d09f43ec7073857d +Subproject commit 57c29648ff40e2a19a51683717928aaf766a0495 diff --git a/components/lwip/port/hooks/lwip_default_hooks.c b/components/lwip/port/hooks/lwip_default_hooks.c index 2e92d364588..251aae0f485 100644 --- a/components/lwip/port/hooks/lwip_default_hooks.c +++ b/components/lwip/port/hooks/lwip_default_hooks.c @@ -41,7 +41,17 @@ const ip6_addr_t *__weak lwip_hook_nd6_get_gw(struct netif *netif, const ip6_add LWIP_UNUSED_ARG(netif); LWIP_UNUSED_ARG(dest); - return 0; + return NULL; +} +#endif + +#ifdef CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT +const ip_addr_t *__weak lwip_hook_ip6_select_source_address(struct netif *netif, const ip6_addr_t *dest) +{ + LWIP_UNUSED_ARG(netif); + LWIP_UNUSED_ARG(dest); + + return NULL; } #endif diff --git a/components/lwip/port/include/lwip_default_hooks.h b/components/lwip/port/include/lwip_default_hooks.h index 6c273bd3ab8..bdc54064a92 100644 --- a/components/lwip/port/include/lwip_default_hooks.h +++ b/components/lwip/port/include/lwip_default_hooks.h @@ -43,6 +43,12 @@ const ip6_addr_t *lwip_hook_nd6_get_gw(struct netif *netif, const ip6_addr_t *de #define LWIP_HOOK_ND6_GET_GW lwip_hook_nd6_get_gw #endif /* CONFIG_LWIP_HOOK_ND6_GET_GATEWAY... */ +#if defined(CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM) || defined(CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT) +const ip_addr_t *lwip_hook_ip6_select_source_address(struct netif *netif, const ip6_addr_t *dest); + +#define LWIP_HOOK_IP6_SELECT_SRC_ADDR lwip_hook_ip6_select_source_address +#endif /* CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR... */ + #if defined(CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM) || defined(CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT) int lwip_hook_netconn_external_resolve(const char *name, ip_addr_t *addr, u8_t addrtype, err_t *err); From 65f7e1ec131557491652997bf85464458f71d393 Mon Sep 17 00:00:00 2001 From: zhangwenxu Date: Thu, 11 May 2023 13:26:15 +0800 Subject: [PATCH 2/2] openthread: add source address selection hook --- .../port/esp_openthread_lwip_netif.c | 23 +++++++++++++++++++ examples/openthread/ot_br/sdkconfig.defaults | 1 + examples/openthread/ot_cli/sdkconfig.defaults | 1 + 3 files changed, 25 insertions(+) diff --git a/components/openthread/port/esp_openthread_lwip_netif.c b/components/openthread/port/esp_openthread_lwip_netif.c index b05eb2912f2..29be440ae09 100644 --- a/components/openthread/port/esp_openthread_lwip_netif.c +++ b/components/openthread/port/esp_openthread_lwip_netif.c @@ -15,6 +15,7 @@ #include "lwip/esp_netif_net_stack.h" #include "lwip/netif.h" #include "lwip/pbuf.h" +#include "lwip_default_hooks.h" #include "openthread/error.h" #include "openthread/ip6.h" #include "openthread/link.h" @@ -143,3 +144,25 @@ static err_t openthread_netif_init(struct netif *netif) return ERR_OK; } + +const ip_addr_t *lwip_hook_ip6_select_source_address(struct netif *netif, const ip6_addr_t *dest) +{ + const ip6_addr_t *cur_addr; + uint8_t idx = 0; + // Only process with ot netif. + if (!(netif->name[0] == 'o' && netif->name[1] == 't')) { + return NULL; + } + // Currently, prefer the address with the same prefix of the destination address. + // If no address found, return NULL for selection source address using the default algorithm. + for (idx = 0; idx < LWIP_IPV6_NUM_ADDRESSES; idx++) { + if (!ip6_addr_isvalid(netif_ip6_addr_state(netif, idx))) { + continue; + } + cur_addr = netif_ip6_addr(netif, idx); + if (ip6_addr_netcmp_zoneless(cur_addr, dest)) { + return netif_ip_addr6(netif, idx); + } + } + return NULL; +} diff --git a/examples/openthread/ot_br/sdkconfig.defaults b/examples/openthread/ot_br/sdkconfig.defaults index 369bdb00f6b..d2ee6928f0c 100644 --- a/examples/openthread/ot_br/sdkconfig.defaults +++ b/examples/openthread/ot_br/sdkconfig.defaults @@ -43,6 +43,7 @@ CONFIG_LWIP_NETIF_STATUS_CALLBACK=y CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT=y CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT=y CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM=y +CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM=y CONFIG_LWIP_IPV6_AUTOCONFIG=y # end of lwIP diff --git a/examples/openthread/ot_cli/sdkconfig.defaults b/examples/openthread/ot_cli/sdkconfig.defaults index 9ea24974eb8..e6b4e2c9331 100644 --- a/examples/openthread/ot_cli/sdkconfig.defaults +++ b/examples/openthread/ot_cli/sdkconfig.defaults @@ -43,6 +43,7 @@ CONFIG_OPENTHREAD_DNS64_CLIENT=y CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=4096 CONFIG_LWIP_IPV6_NUM_ADDRESSES=8 CONFIG_LWIP_MULTICAST_PING=y +CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM=y # end of lwIP #