summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--zebra/kernel_netlink.c2
-rw-r--r--zebra/rt_netlink.c27
-rw-r--r--zebra/rt_netlink.h1
3 files changed, 20 insertions, 10 deletions
diff --git a/zebra/kernel_netlink.c b/zebra/kernel_netlink.c
index 3efad44acb..e23801169b 100644
--- a/zebra/kernel_netlink.c
+++ b/zebra/kernel_netlink.c
@@ -817,6 +817,8 @@ kernel_init (struct zebra_ns *zns)
thread_add_read(zebrad.master, kernel_read, zns, zns->netlink.sock,
&zns->t_netlink);
}
+
+ rt_netlink_init ();
}
void
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index 3c4f3171ff..4f1131809a 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -102,6 +102,21 @@ struct gw_family_t
union g_addr gate;
};
+char ipv4_ll_buf[16] = "169.254.0.1";
+struct in_addr ipv4_ll;
+
+/*
+ * The ipv4_ll data structure is used for all 5549
+ * additions to the kernel. Let's figure out the
+ * correct value one time instead for every
+ * install/remove of a 5549 type route
+ */
+void
+rt_netlink_init (void)
+{
+ inet_pton (AF_INET, ipv4_ll_buf, &ipv4_ll);
+}
+
static inline int is_selfroute(int proto)
{
if ((proto == RTPROT_BGP) || (proto == RTPROT_OSPF) ||
@@ -678,10 +693,6 @@ _netlink_route_build_singlepath(
(nexthop->type == NEXTHOP_TYPE_IPV6
|| nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX))
{
- char buf[16] = "169.254.0.1";
- struct in_addr ipv4_ll;
-
- inet_pton (AF_INET, buf, &ipv4_ll);
rtmsg->rtm_flags |= RTNH_F_ONLINK;
addattr_l (nlmsg, req_size, RTA_GATEWAY, &ipv4_ll, 4);
addattr32 (nlmsg, req_size, RTA_OIF, nexthop->ifindex);
@@ -696,7 +707,7 @@ _netlink_route_build_singlepath(
if (IS_ZEBRA_DEBUG_KERNEL)
zlog_debug(" 5549: _netlink_route_build_singlepath() (%s): "
"nexthop via %s if %u",
- routedesc, buf, nexthop->ifindex);
+ routedesc, ipv4_ll_buf, nexthop->ifindex);
return;
}
@@ -883,10 +894,6 @@ _netlink_route_build_multipath(
(nexthop->type == NEXTHOP_TYPE_IPV6
|| nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX))
{
- char buf[16] = "169.254.0.1";
- struct in_addr ipv4_ll;
-
- inet_pton (AF_INET, buf, &ipv4_ll);
bytelen = 4;
rtnh->rtnh_flags |= RTNH_F_ONLINK;
rta_addattr_l (rta, NL_PKT_BUF_SIZE, RTA_GATEWAY,
@@ -902,7 +909,7 @@ _netlink_route_build_multipath(
if (IS_ZEBRA_DEBUG_KERNEL)
zlog_debug(" 5549: netlink_route_build_multipath() (%s): "
"nexthop via %s if %u",
- routedesc, buf, nexthop->ifindex);
+ routedesc, ipv4_ll_buf, nexthop->ifindex);
return;
}
diff --git a/zebra/rt_netlink.h b/zebra/rt_netlink.h
index 0e305beb37..4ec5f18535 100644
--- a/zebra/rt_netlink.h
+++ b/zebra/rt_netlink.h
@@ -34,6 +34,7 @@
#define RTPROT_RIP 189
#define RTPROT_RIPNG 190
+void rt_netlink_init (void);
extern void
clear_nhlfe_installed (zebra_lsp_t *lsp);