From bfdfbc10ab0280524a957bfa31a6fd6796a1bac2 Mon Sep 17 00:00:00 2001 From: wangjunfeng3 Date: Sat, 20 Jan 2024 16:59:09 +0800 Subject: [PATCH] net:Compatible with cellular network cards of lladdr generation In the context of cellular networks, lladdr should use the interface identifiers from PDN. Signed-off-by: wangjunfeng3 --- net/icmpv6/icmpv6_linkipaddr.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/net/icmpv6/icmpv6_linkipaddr.c b/net/icmpv6/icmpv6_linkipaddr.c index 0116cc18586..5af02a43d3c 100644 --- a/net/icmpv6/icmpv6_linkipaddr.c +++ b/net/icmpv6/icmpv6_linkipaddr.c @@ -28,6 +28,7 @@ #include "netdev/netdev.h" #include "icmpv6/icmpv6.h" +#include "inet/inet.h" #ifdef CONFIG_NET_ICMPv6 @@ -38,18 +39,35 @@ static inline void icmpv6_linkipaddr_0(FAR struct net_driver_s *dev, net_ipv6addr_t ipaddr) { + FAR const uint16_t *current = netdev_ipv6_srcaddr(dev, g_ipv6_unspecaddr); + ipaddr[0] = HTONS(0xfe80); ipaddr[1] = 0; ipaddr[2] = 0; ipaddr[3] = 0; - ipaddr[4] = 0; - ipaddr[5] = 0; - ipaddr[6] = 0; + + if (!net_ipv6addr_cmp(current, g_ipv6_unspecaddr)) + { + /* Keep current interface indentifier */ + + ipaddr[4] = current[4]; + ipaddr[5] = current[5]; + ipaddr[6] = current[6]; + ipaddr[7] = current[7]; + } + else + { + /* Try to generate interface identifier */ + + ipaddr[4] = 0; + ipaddr[5] = 0; + ipaddr[6] = 0; #ifdef CONFIG_NETDEV_IFINDEX - ipaddr[7] = HTONS(dev->d_ifindex); + ipaddr[7] = HTONS(dev->d_ifindex); #else - ipaddr[7] = 0; + ipaddr[7] = 0; #endif + } } static inline void