summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2017-10-10 18:19:37 +0200
committerGitHub <noreply@github.com>2017-10-10 18:19:37 +0200
commit5d920111b9d5b460052a257656f58d8c093c236f (patch)
tree74d5c1722575843d62d95f32f41729cf32854d8a
parentMerge pull request #1315 from dslicenc/bgp-interface (diff)
parentzebra: use a switch statement in nexthop_set_resolved() (diff)
downloadfrr-5d920111b9d5b460052a257656f58d8c093c236f.tar.xz
frr-5d920111b9d5b460052a257656f58d8c093c236f.zip
Merge pull request #1210 from opensourcerouting/misc-mpls-bgp-lu-fixes
Misc BGP-LU fixes
-rw-r--r--bgpd/bgp_route.c6
-rw-r--r--zebra/rt_netlink.c18
-rw-r--r--zebra/zebra_rib.c44
-rw-r--r--zebra/zserv.c2
4 files changed, 35 insertions, 35 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 762519715..0c2a2f6fe 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -11464,12 +11464,6 @@ void bgp_route_init(void)
install_element(BGP_IPV6M_NODE, &ipv6_bgp_network_cmd);
install_element(BGP_IPV6M_NODE, &no_ipv6_bgp_network_cmd);
- install_element(BGP_IPV6L_NODE, &bgp_table_map_cmd);
- install_element(BGP_IPV6L_NODE, &ipv6_bgp_network_cmd);
- install_element(BGP_IPV6L_NODE, &ipv6_bgp_network_route_map_cmd);
- install_element(BGP_IPV6L_NODE, &no_bgp_table_map_cmd);
- install_element(BGP_IPV6L_NODE, &no_ipv6_bgp_network_cmd);
-
install_element(BGP_NODE, &bgp_distance_cmd);
install_element(BGP_NODE, &no_bgp_distance_cmd);
install_element(BGP_NODE, &bgp_distance_source_cmd);
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index 0e4ae0433..0cc2e0217 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -845,7 +845,7 @@ static void _netlink_route_build_singlepath(const char *routedesc, int bytelen,
{
struct nexthop_label *nh_label;
mpls_lse_t out_lse[MPLS_MAX_LABELS];
- char label_buf[100];
+ char label_buf[256];
/*
* label_buf is *only* currently used within debugging.
@@ -876,12 +876,13 @@ static void _netlink_route_build_singlepath(const char *routedesc, int bytelen,
0, 0, bos);
if (IS_ZEBRA_DEBUG_KERNEL) {
if (!num_labels)
- sprintf(label_buf, "label %d",
+ sprintf(label_buf, "label %u",
nh_label->label[i]);
else {
- sprintf(label_buf1, "/%d",
+ sprintf(label_buf1, "/%u",
nh_label->label[i]);
- strcat(label_buf, label_buf1);
+ strlcat(label_buf, label_buf1,
+ sizeof(label_buf));
}
}
num_labels++;
@@ -1044,7 +1045,7 @@ static void _netlink_route_build_multipath(const char *routedesc, int bytelen,
{
struct nexthop_label *nh_label;
mpls_lse_t out_lse[MPLS_MAX_LABELS];
- char label_buf[100];
+ char label_buf[256];
rtnh->rtnh_len = sizeof(*rtnh);
rtnh->rtnh_flags = 0;
@@ -1080,12 +1081,13 @@ static void _netlink_route_build_multipath(const char *routedesc, int bytelen,
0, 0, bos);
if (IS_ZEBRA_DEBUG_KERNEL) {
if (!num_labels)
- sprintf(label_buf, "label %d",
+ sprintf(label_buf, "label %u",
nh_label->label[i]);
else {
- sprintf(label_buf1, "/%d",
+ sprintf(label_buf1, "/%u",
nh_label->label[i]);
- strcat(label_buf, label_buf1);
+ strlcat(label_buf, label_buf1,
+ sizeof(label_buf));
}
}
num_labels++;
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index 1a9bd5a58..d46e0730e 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -325,9 +325,11 @@ static void nexthop_set_resolved(afi_t afi, struct nexthop *newhop,
resolved_hop = nexthop_new();
SET_FLAG(resolved_hop->flags, NEXTHOP_FLAG_ACTIVE);
- /* If the resolving route specifies a gateway, use it */
- if (newhop->type == NEXTHOP_TYPE_IPV4
- || newhop->type == NEXTHOP_TYPE_IPV4_IFINDEX) {
+
+ switch (newhop->type) {
+ case NEXTHOP_TYPE_IPV4:
+ case NEXTHOP_TYPE_IPV4_IFINDEX:
+ /* If the resolving route specifies a gateway, use it */
resolved_hop->type = newhop->type;
resolved_hop->gate.ipv4 = newhop->gate.ipv4;
@@ -337,9 +339,9 @@ static void nexthop_set_resolved(afi_t afi, struct nexthop *newhop,
if (newhop->flags & NEXTHOP_FLAG_ONLINK)
resolved_hop->flags |= NEXTHOP_FLAG_ONLINK;
}
- }
- if (newhop->type == NEXTHOP_TYPE_IPV6
- || newhop->type == NEXTHOP_TYPE_IPV6_IFINDEX) {
+ break;
+ case NEXTHOP_TYPE_IPV6:
+ case NEXTHOP_TYPE_IPV6_IFINDEX:
resolved_hop->type = newhop->type;
resolved_hop->gate.ipv6 = newhop->gate.ipv6;
@@ -347,18 +349,17 @@ static void nexthop_set_resolved(afi_t afi, struct nexthop *newhop,
resolved_hop->type = NEXTHOP_TYPE_IPV6_IFINDEX;
resolved_hop->ifindex = newhop->ifindex;
}
- }
-
- /* If the resolving route is an interface route,
- * it means the gateway we are looking up is connected
- * to that interface. (The actual network is _not_ onlink).
- * Therefore, the resolved route should have the original
- * gateway as nexthop as it is directly connected.
- *
- * On Linux, we have to set the onlink netlink flag because
- * otherwise, the kernel won't accept the route.
- */
- if (newhop->type == NEXTHOP_TYPE_IFINDEX) {
+ break;
+ case NEXTHOP_TYPE_IFINDEX:
+ /* If the resolving route is an interface route,
+ * it means the gateway we are looking up is connected
+ * to that interface. (The actual network is _not_ onlink).
+ * Therefore, the resolved route should have the original
+ * gateway as nexthop as it is directly connected.
+ *
+ * On Linux, we have to set the onlink netlink flag because
+ * otherwise, the kernel won't accept the route.
+ */
resolved_hop->flags |= NEXTHOP_FLAG_ONLINK;
if (afi == AFI_IP) {
resolved_hop->type = NEXTHOP_TYPE_IPV4_IFINDEX;
@@ -368,12 +369,13 @@ static void nexthop_set_resolved(afi_t afi, struct nexthop *newhop,
resolved_hop->gate.ipv6 = nexthop->gate.ipv6;
}
resolved_hop->ifindex = newhop->ifindex;
- }
-
- if (newhop->type == NEXTHOP_TYPE_BLACKHOLE) {
+ break;
+ case NEXTHOP_TYPE_BLACKHOLE:
resolved_hop->type = NEXTHOP_TYPE_BLACKHOLE;
resolved_hop->bh_type = nexthop->bh_type;
+ break;
}
+
resolved_hop->rparent = nexthop;
nexthop_add(&nexthop->resolved, resolved_hop);
}
diff --git a/zebra/zserv.c b/zebra/zserv.c
index fd2c5dd97..f88820781 100644
--- a/zebra/zserv.c
+++ b/zebra/zserv.c
@@ -825,6 +825,7 @@ static int zserv_fec_register(struct zserv *client, int sock, u_short length)
while (l < length) {
flags = stream_getw(s);
+ memset(&p, 0, sizeof(p));
p.family = stream_getw(s);
if (p.family != AF_INET && p.family != AF_INET6) {
zlog_err(
@@ -875,6 +876,7 @@ static int zserv_fec_unregister(struct zserv *client, int sock, u_short length)
while (l < length) {
// flags = stream_getw(s);
(void)stream_getw(s);
+ memset(&p, 0, sizeof(p));
p.family = stream_getw(s);
if (p.family != AF_INET && p.family != AF_INET6) {
zlog_err(