mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-05 04:14:19 +00:00
zebra: Use the kernel flags from the IFA_FLAGS if it is available
The ifa_flags value in the netlink message was originally a uint8_t value. The linux kernel quickly ran out of 8 bits of data to pass and the IFA_FLAGS value was added to the netlink message to allow more than 8 bits of data to be passed. So replace the ifa_flags with the IFA_FLAGS value if it exists in the interface netlink message. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
b539a22f5a
commit
9254efede1
@ -925,6 +925,7 @@ int netlink_interface_addr(struct nlmsghdr *h, ns_id_t ns_id, int startup)
|
||||
char *label = NULL;
|
||||
struct zebra_ns *zns;
|
||||
uint32_t metric = METRIC_MAX;
|
||||
uint32_t kernel_flags = 0;
|
||||
|
||||
zns = zebra_ns_lookup(ns_id);
|
||||
ifa = NLMSG_DATA(h);
|
||||
@ -961,12 +962,18 @@ int netlink_interface_addr(struct nlmsghdr *h, ns_id_t ns_id, int startup)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Flags passed through */
|
||||
if (tb[IFA_FLAGS])
|
||||
kernel_flags = *(int *)RTA_DATA(tb[IFA_FLAGS]);
|
||||
else
|
||||
kernel_flags = ifa->ifa_flags;
|
||||
|
||||
if (IS_ZEBRA_DEBUG_KERNEL) /* remove this line to see initial ifcfg */
|
||||
{
|
||||
char buf[BUFSIZ];
|
||||
zlog_debug("netlink_interface_addr %s %s flags 0x%x:",
|
||||
nl_msg_type_to_str(h->nlmsg_type), ifp->name,
|
||||
ifa->ifa_flags);
|
||||
kernel_flags);
|
||||
if (tb[IFA_LOCAL])
|
||||
zlog_debug(" IFA_LOCAL %s/%d",
|
||||
inet_ntop(ifa->ifa_family,
|
||||
@ -1023,7 +1030,7 @@ int netlink_interface_addr(struct nlmsghdr *h, ns_id_t ns_id, int startup)
|
||||
}
|
||||
|
||||
/* Flags. */
|
||||
if (ifa->ifa_flags & IFA_F_SECONDARY)
|
||||
if (kernel_flags & IFA_F_SECONDARY)
|
||||
SET_FLAG(flags, ZEBRA_IFA_SECONDARY);
|
||||
|
||||
/* Label */
|
||||
@ -1070,7 +1077,7 @@ int netlink_interface_addr(struct nlmsghdr *h, ns_id_t ns_id, int startup)
|
||||
* time, Quagga
|
||||
* does query for and will receive all addresses.
|
||||
*/
|
||||
if (!(ifa->ifa_flags
|
||||
if (!(kernel_flags
|
||||
& (IFA_F_DADFAILED | IFA_F_TENTATIVE)))
|
||||
connected_add_ipv6(ifp, flags,
|
||||
(struct in6_addr *)addr,
|
||||
|
Loading…
Reference in New Issue
Block a user