From 1f5cd930a4159bd52f23f341176c59b40a47cf26 Mon Sep 17 00:00:00 2001 From: wenquan1 Date: Thu, 11 Sep 2025 14:24:25 +0800 Subject: [PATCH] net/arp: support ARP entry learned on gratuitous ARP response learn arp when received gratuitiout arp Signed-off-by: wenquan1 --- net/arp/arp_input.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/net/arp/arp_input.c b/net/arp/arp_input.c index 351e1fab70f..9f5571f6dac 100644 --- a/net/arp/arp_input.c +++ b/net/arp/arp_input.c @@ -181,6 +181,23 @@ static int arp_in(FAR struct net_driver_s *dev) arp_notify(net_ip4addr_conv32(arp->ah_sipaddr)); } +#ifdef CONFIG_NET_ARP_GRATUITOUS + else if (net_ipv4addr_cmp(sipaddr, ipaddr) && + !net_ipv4addr_cmp(sipaddr, INADDR_ANY)) + { + /* Gratuitous arp sender ip should same with target ip, + * and ignore IPv4 duplicate address detection packet (RFC2131) + */ + + /* Gratuitous request arp the sender ip should be a unicast ip */ + + if (net_ipv4addr_cmp(sipaddr, dev->d_draddr) || + net_ipv4addr_maskcmp(sipaddr, dev->d_ipaddr, dev->d_netmask)) + { + arp_hdr_update(dev, arp->ah_sipaddr, arp->ah_shwaddr); + } + } +#endif /* CONFIG_NET_ARP_GRATUITOUS */ break; }