Previously, if an address alias is configured on an interface, and

this address alias has a prefix matching that of another address
configured on the same interface, then the ARP entry for the alias
is not deleted from the ARP table when that address alias is removed.
This patch fixes the aforementioned issue.

PR:		kern/139113
MFC after:	3 days
This commit is contained in:
Qing Li 2009-10-02 01:34:55 +00:00
parent 46aba52a50
commit fa3cfd39ff

View File

@ -1060,6 +1060,8 @@ in_scrubprefix(struct in_ifaddr *target)
!(target->ia_ifp->if_flags & IFF_LOOPBACK)) { !(target->ia_ifp->if_flags & IFF_LOOPBACK)) {
error = ifa_del_loopback_route((struct ifaddr *)target, error = ifa_del_loopback_route((struct ifaddr *)target,
(struct sockaddr *)&target->ia_addr); (struct sockaddr *)&target->ia_addr);
/* remove arp cache */
arp_ifscrub(target->ia_ifp, IA_SIN(target)->sin_addr.s_addr);
} }
if ((target->ia_flags & IFA_ROUTE) == 0) { if ((target->ia_flags & IFA_ROUTE) == 0) {
@ -1082,8 +1084,6 @@ in_scrubprefix(struct in_ifaddr *target)
prefix = target->ia_addr.sin_addr; prefix = target->ia_addr.sin_addr;
mask = target->ia_sockmask.sin_addr; mask = target->ia_sockmask.sin_addr;
prefix.s_addr &= mask.s_addr; prefix.s_addr &= mask.s_addr;
/* remove arp cache */
arp_ifscrub(target->ia_ifp, IA_SIN(target)->sin_addr.s_addr);
} }
IN_IFADDR_RLOCK(); IN_IFADDR_RLOCK();