]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Convert attr->evpn_overlay to accessor functions
authorDonald Sharp <sharpd@nvidia.com>
Mon, 2 Nov 2020 17:55:45 +0000 (12:55 -0500)
committerDonald Sharp <sharpd@nvidia.com>
Sun, 15 Nov 2020 14:49:14 +0000 (09:49 -0500)
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 <sharpd@nvidia.com>
bgpd/bgp_attr.c
bgpd/bgp_attr.h
bgpd/bgp_evpn.c
bgpd/bgp_mac.c
bgpd/bgp_route.c

index 002d078d559964ecd2d1a5e013e54a6fc075e5fa..0eb73089b6cecf26b854898c2814f03c12a20e71 100644 (file)
@@ -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));
 }
 
index cfbf5d2534c7d0330e0fbae649e0602b6f5115d2..e154b9eefd61c50a73fbfbb7ba5dcb19c5a1e0f4 100644 (file)
@@ -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 */
index 21eb371ec6b717c3f20e7839fb4e3de65a13f112..10237d859532a61e98b1ef2513cd5a171245558b 100644 (file)
@@ -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);
index 8e4212a5ef653ec705f26dd6f7c0efdb2f26bdd8..ec73ebb2964132545b1c056dca5bdad78638225d 100644 (file)
@@ -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);
index d9a1280d4cda98ad96ef3b425a4b5f5f0931bfa1..d550cc9a7fdf42326f34a51dd6d3b77a24c49cc3 100644 (file)
@@ -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);