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:
parent
46aba52a50
commit
fa3cfd39ff
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user