mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-09 05:58:17 +00:00
zebra: Allow FreeBSD to set and delete addresses from an interface
This series of events: $ sudo ifconfig lo0 add 4.4.4.4/32 $ sudo ifconfig lo0 inet 4.4.4.4/32 delete would end up leaving the 4.4.4.4/32 address on the interface under freebsd. This all boils down to the fact that the interface is not considered connected yet we have a destination. If the destination is the same and we are not connected ignore it on freebsd. I am sure there are other fun scenarios that someone will have to squirrel out. Signed-off-by: Donald Sharp <sharpd@nvidia.com>
This commit is contained in:
parent
25580c2c3c
commit
8d20ecbd88
@ -868,6 +868,7 @@ int ifam_read(struct ifa_msghdr *ifam)
|
|||||||
{
|
{
|
||||||
struct interface *ifp = NULL;
|
struct interface *ifp = NULL;
|
||||||
union sockunion addr, mask, brd;
|
union sockunion addr, mask, brd;
|
||||||
|
bool dest_same = false;
|
||||||
char ifname[INTERFACE_NAMSIZ];
|
char ifname[INTERFACE_NAMSIZ];
|
||||||
short ifnlen = 0;
|
short ifnlen = 0;
|
||||||
char isalias = 0;
|
char isalias = 0;
|
||||||
@ -894,6 +895,10 @@ int ifam_read(struct ifa_msghdr *ifam)
|
|||||||
rely upon the interface type. */
|
rely upon the interface type. */
|
||||||
if (if_is_pointopoint(ifp))
|
if (if_is_pointopoint(ifp))
|
||||||
SET_FLAG(flags, ZEBRA_IFA_PEER);
|
SET_FLAG(flags, ZEBRA_IFA_PEER);
|
||||||
|
else {
|
||||||
|
if (memcmp(&addr, &brd, sizeof(addr)) == 0)
|
||||||
|
dest_same = true;
|
||||||
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* it might seem cute to grab the interface metric here, however
|
/* it might seem cute to grab the interface metric here, however
|
||||||
@ -910,13 +915,14 @@ int ifam_read(struct ifa_msghdr *ifam)
|
|||||||
if (ifam->ifam_type == RTM_NEWADDR)
|
if (ifam->ifam_type == RTM_NEWADDR)
|
||||||
connected_add_ipv4(ifp, flags, &addr.sin.sin_addr,
|
connected_add_ipv4(ifp, flags, &addr.sin.sin_addr,
|
||||||
ip_masklen(mask.sin.sin_addr),
|
ip_masklen(mask.sin.sin_addr),
|
||||||
&brd.sin.sin_addr,
|
dest_same ? NULL : &brd.sin.sin_addr,
|
||||||
(isalias ? ifname : NULL),
|
(isalias ? ifname : NULL),
|
||||||
METRIC_MAX);
|
METRIC_MAX);
|
||||||
else
|
else
|
||||||
connected_delete_ipv4(ifp, flags, &addr.sin.sin_addr,
|
connected_delete_ipv4(ifp, flags, &addr.sin.sin_addr,
|
||||||
ip_masklen(mask.sin.sin_addr),
|
ip_masklen(mask.sin.sin_addr),
|
||||||
&brd.sin.sin_addr);
|
dest_same ? NULL
|
||||||
|
: &brd.sin.sin_addr);
|
||||||
break;
|
break;
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
/* Unset interface index from link-local address when IPv6 stack
|
/* Unset interface index from link-local address when IPv6 stack
|
||||||
|
Loading…
Reference in New Issue
Block a user