From 8755598a08fd60cc30a7ed0b76512498244d63df Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Thu, 25 May 2017 21:11:24 -0400 Subject: [PATCH 1/2] zebra: Store commonly used values instead of regenerating the ipv4_ll address used for 5549 routes does not need to be figured out every single time that we attempt to install/remove a route of that type. Signed-off-by: Donald Sharp --- zebra/kernel_netlink.c | 2 ++ zebra/rt_netlink.c | 27 +++++++++++++++++---------- zebra/rt_netlink.h | 1 + 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); From 66d4272752e3d10fe26de78343ee888471dcbfdc Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Thu, 25 May 2017 21:22:03 -0400 Subject: [PATCH 2/2] zebra: Remove string operations from non-debug path Signed-off-by: Donald Sharp --- zebra/rt_netlink.c | 46 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c index 4f1131809a..55d48f7c61 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c @@ -711,6 +711,12 @@ _netlink_route_build_singlepath( 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) @@ -734,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++; } } @@ -913,6 +922,12 @@ _netlink_route_build_multipath( 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) @@ -936,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++; } }