Index: sys/netinet/if_ether.c =================================================================== --- sys/netinet/if_ether.c +++ sys/netinet/if_ether.c @@ -87,7 +87,6 @@ ARP_LLINFO_DELETED, /* LLE is deleted */ }; -SYSCTL_DECL(_net_link_ether); static SYSCTL_NODE(_net_link_ether, PF_INET, inet, CTLFLAG_RW, 0, ""); static SYSCTL_NODE(_net_link_ether, PF_ARP, arp, CTLFLAG_RW, 0, ""); Index: sys/netinet/in.c =================================================================== --- sys/netinet/in.c +++ sys/netinet/in.c @@ -85,6 +85,12 @@ VNET_DECLARE(struct inpcbinfo, ripcbinfo); #define V_ripcbinfo VNET(ripcbinfo) +static VNET_DEFINE(int, arpaccept) = 0; +#define V_arpaccept VNET(arpaccept) +SYSCTL_INT(_net_link_ether, OID_AUTO, arp_accept, CTLFLAG_VNET | CTLFLAG_RW, + &VNET_NAME(arpaccept), 0, + "Define behavior for gratuitous ARP frames who's IP is not already present in the ARP table"); + static struct sx in_control_sx; SX_SYSINIT(in_control_sx, &in_control_sx, "in_control"); @@ -1316,7 +1322,7 @@ * verify this. */ if (!(flags & LLE_IFADDR) && - in_lltable_rtcheck(ifp, flags, l3addr) != 0) + in_lltable_rtcheck(ifp, flags, l3addr) != 0 && !V_arpaccept) return (NULL); lle = in_lltable_new(sin->sin_addr, flags); Index: sys/netinet/in_var.h =================================================================== --- sys/netinet/in_var.h +++ sys/netinet/in_var.h @@ -316,6 +316,7 @@ } #ifdef SYSCTL_DECL +SYSCTL_DECL(_net_link_ether); SYSCTL_DECL(_net_inet); SYSCTL_DECL(_net_inet_ip); SYSCTL_DECL(_net_inet_raw);