summaryrefslogtreecommitdiff
path: root/zebra/rt_netlink.c
diff options
context:
space:
mode:
Diffstat (limited to 'zebra/rt_netlink.c')
-rw-r--r--zebra/rt_netlink.c73
1 files changed, 49 insertions, 24 deletions
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index 3c4f3171ff..55d48f7c61 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,10 +707,16 @@ _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;
}
+ /*
+ * label_buf is *only* currently used within debugging.
+ * As such when we assign it we are guarding it inside
+ * a debug test. If you want to change this make sure
+ * you fix this assumption
+ */
label_buf[0] = '\0';
/* outgoing label - either as NEWDST (in the case of LSR) or as ENCAP
* (in the case of LER)
@@ -723,13 +740,16 @@ _netlink_route_build_singlepath(
{
bos = ((i == (nh_label->num_labels - 1)) ? 1 : 0);
out_lse[i] = mpls_lse_encode (nh_label->label[i], 0, 0, bos);
- if (!num_labels)
- sprintf (label_buf, "label %d", nh_label->label[i]);
- else
- {
- sprintf (label_buf1, "/%d", nh_label->label[i]);
- strcat (label_buf, label_buf1);
- }
+ if (IS_ZEBRA_DEBUG_KERNEL)
+ {
+ if (!num_labels)
+ sprintf (label_buf, "label %d", nh_label->label[i]);
+ else
+ {
+ sprintf (label_buf1, "/%d", nh_label->label[i]);
+ strcat (label_buf, label_buf1);
+ }
+ }
num_labels++;
}
}
@@ -883,10 +903,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,10 +918,16 @@ _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;
}
+ /*
+ * label_buf is *only* currently used within debugging.
+ * As such when we assign it we are guarding it inside
+ * a debug test. If you want to change this make sure
+ * you fix this assumption
+ */
label_buf[0] = '\0';
/* outgoing label - either as NEWDST (in the case of LSR) or as ENCAP
* (in the case of LER)
@@ -929,13 +951,16 @@ _netlink_route_build_multipath(
{
bos = ((i == (nh_label->num_labels - 1)) ? 1 : 0);
out_lse[i] = mpls_lse_encode (nh_label->label[i], 0, 0, bos);
- if (!num_labels)
- sprintf (label_buf, "label %d", nh_label->label[i]);
- else
- {
- sprintf (label_buf1, "/%d", nh_label->label[i]);
- strcat (label_buf, label_buf1);
- }
+ if (IS_ZEBRA_DEBUG_KERNEL)
+ {
+ if (!num_labels)
+ sprintf (label_buf, "label %d", nh_label->label[i]);
+ else
+ {
+ sprintf (label_buf1, "/%d", nh_label->label[i]);
+ strcat (label_buf, label_buf1);
+ }
+ }
num_labels++;
}
}