From 6c924775b52e9a636f6e2e4d45f844ee998bc5b6 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Mon, 2 Nov 2020 12:55:45 -0500 Subject: [PATCH] bgpd: Convert attr->evpn_overlay to accessor functions Convert usage of the attr->evpn_overlay to get/set functionality. Future commits will allow us to abstract this data to when we actually need it for the `struct attr`. Signed-off-by: Donald Sharp --- bgpd/bgp_attr.c | 4 +++- bgpd/bgp_attr.h | 13 +++++++++++++ bgpd/bgp_evpn.c | 8 +++++--- bgpd/bgp_mac.c | 7 ++++--- bgpd/bgp_route.c | 33 +++++++++++++++++++-------------- 5 files changed, 44 insertions(+), 21 deletions(-) diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c index 002d078d55..0eb73089b6 100644 --- a/bgpd/bgp_attr.c +++ b/bgpd/bgp_attr.c @@ -403,7 +403,9 @@ static bool overlay_index_same(const struct attr *a1, const struct attr *a2) return false; if (!a1 && !a2) return true; - return !memcmp(&(a1->evpn_overlay), &(a2->evpn_overlay), + + return !memcmp(bgp_attr_get_evpn_overlay(a1), + bgp_attr_get_evpn_overlay(a2), sizeof(struct bgp_route_evpn)); } diff --git a/bgpd/bgp_attr.h b/bgpd/bgp_attr.h index cfbf5d2534..e154b9eefd 100644 --- a/bgpd/bgp_attr.h +++ b/bgpd/bgp_attr.h @@ -502,4 +502,17 @@ static inline void bgp_attr_set_cluster(struct attr *attr, { attr->cluster1 = cl; } + +static inline const struct bgp_route_evpn * +bgp_attr_get_evpn_overlay(const struct attr *attr) +{ + return &attr->evpn_overlay; +} + +static inline void bgp_attr_set_evpn_overlay(struct attr *attr, + struct bgp_route_evpn *eo) +{ + memcpy(&attr->evpn_overlay, eo, sizeof(struct bgp_route_evpn)); +} + #endif /* _QUAGGA_BGP_ATTR_H */ diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c index 21eb371ec6..10237d8595 100644 --- a/bgpd/bgp_evpn.c +++ b/bgpd/bgp_evpn.c @@ -3944,11 +3944,13 @@ static void evpn_mpattr_encode_type5(struct stream *s, const struct prefix *p, else stream_put(s, &p_evpn_p->prefix_addr.ip.ipaddr_v6, 16); if (attr) { + const struct bgp_route_evpn *evpn_overlay = + bgp_attr_get_evpn_overlay(attr); + if (IS_IPADDR_V4(&p_evpn_p->prefix_addr.ip)) - stream_put_ipv4(s, - attr->evpn_overlay.gw_ip.ipv4.s_addr); + stream_put_ipv4(s, evpn_overlay->gw_ip.ipv4.s_addr); else - stream_put(s, &(attr->evpn_overlay.gw_ip.ipv6), 16); + stream_put(s, &(evpn_overlay->gw_ip.ipv6), 16); } else { if (IS_IPADDR_V4(&p_evpn_p->prefix_addr.ip)) stream_put_ipv4(s, 0); diff --git a/bgpd/bgp_mac.c b/bgpd/bgp_mac.c index 8e4212a5ef..ec73ebb296 100644 --- a/bgpd/bgp_mac.c +++ b/bgpd/bgp_mac.c @@ -156,7 +156,7 @@ static void bgp_process_mac_rescan_table(struct bgp *bgp, struct peer *peer, struct prefix_rd prd; uint32_t num_labels = 0; mpls_label_t *label_pnt = NULL; - struct bgp_route_evpn evpn; + struct bgp_route_evpn *evpn; if (pevpn->family == AF_EVPN && pevpn->prefix.route_type == BGP_EVPN_MAC_IP_ROUTE @@ -209,14 +209,15 @@ static void bgp_process_mac_rescan_table(struct bgp *bgp, struct peer *peer, continue; } - memcpy(&evpn, &pi->attr->evpn_overlay, sizeof(evpn)); + memcpy(&evpn, bgp_attr_get_evpn_overlay(pi->attr), + sizeof(evpn)); int32_t ret = bgp_update(peer, p, pi->addpath_rx_id, pi->attr, AFI_L2VPN, SAFI_EVPN, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, label_pnt, num_labels, - 1, &evpn); + 1, evpn); if (ret < 0) bgp_dest_unlock_node(dest); diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index d9a1280d4c..d550cc9a7f 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -3384,17 +3384,22 @@ static void overlay_index_update(struct attr *attr, if (!attr) return; if (gw_ip == NULL) { - memset(&(attr->evpn_overlay.gw_ip), 0, sizeof(union gw_addr)); + struct bgp_route_evpn eo; + + memset(&eo, 0, sizeof(eo)); + bgp_attr_set_evpn_overlay(attr, &eo); } else { - memcpy(&(attr->evpn_overlay.gw_ip), gw_ip, - sizeof(union gw_addr)); + struct bgp_route_evpn eo = {.gw_ip = *gw_ip}; + + bgp_attr_set_evpn_overlay(attr, &eo); } } static bool overlay_index_equal(afi_t afi, struct bgp_path_info *path, union gw_addr *gw_ip) { - union gw_addr *path_gw_ip, *path_gw_ip_remote; + const struct bgp_route_evpn *eo = bgp_attr_get_evpn_overlay(path->attr); + union gw_addr path_gw_ip, *path_gw_ip_remote; union { esi_t esi; union gw_addr ip; @@ -3403,7 +3408,7 @@ static bool overlay_index_equal(afi_t afi, struct bgp_path_info *path, if (afi != AFI_L2VPN) return true; - path_gw_ip = &(path->attr->evpn_overlay.gw_ip); + path_gw_ip = eo->gw_ip; if (gw_ip == NULL) { memset(&temp, 0, sizeof(temp)); @@ -3411,7 +3416,7 @@ static bool overlay_index_equal(afi_t afi, struct bgp_path_info *path, } else path_gw_ip_remote = gw_ip; - return !!memcmp(path_gw_ip, path_gw_ip_remote, sizeof(union gw_addr)); + return !!memcmp(&path_gw_ip, path_gw_ip_remote, sizeof(union gw_addr)); } /* Check if received nexthop is valid or not. */ @@ -4507,7 +4512,8 @@ static void bgp_soft_reconfig_table(struct peer *peer, afi_t afi, safi_t safi, if (num_labels) label_pnt = &pi->extra->label[0]; if (pi) - memcpy(&evpn, &pi->attr->evpn_overlay, + memcpy(&evpn, + bgp_attr_get_evpn_overlay(pi->attr), sizeof(evpn)); else memset(&evpn, 0, sizeof(evpn)); @@ -8965,13 +8971,12 @@ void route_vty_out_overlay(struct vty *vty, const struct prefix *p, } } - if (is_evpn_prefix_ipaddr_v4((struct prefix_evpn *)p)) { - inet_ntop(AF_INET, &(attr->evpn_overlay.gw_ip.ipv4), buf, - BUFSIZ); - } else if (is_evpn_prefix_ipaddr_v6((struct prefix_evpn *)p)) { - inet_ntop(AF_INET6, &(attr->evpn_overlay.gw_ip.ipv6), buf, - BUFSIZ); - } + const struct bgp_route_evpn *eo = bgp_attr_get_evpn_overlay(attr); + + if (is_evpn_prefix_ipaddr_v4((struct prefix_evpn *)p)) + inet_ntop(AF_INET, &eo->gw_ip.ipv4, buf, BUFSIZ); + else if (is_evpn_prefix_ipaddr_v6((struct prefix_evpn *)p)) + inet_ntop(AF_INET6, &eo->gw_ip.ipv6, buf, BUFSIZ); if (!json_path) vty_out(vty, "/%s", buf); -- 2.39.5