]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: Handle route-maps properly for `default-originate route-map` command 7451/head
authorDonatas Abraitis <donatas.abraitis@gmail.com>
Thu, 29 Oct 2020 19:41:12 +0000 (21:41 +0200)
committerDonatas Abraitis <donatas.abraitis@gmail.com>
Wed, 4 Nov 2020 07:19:44 +0000 (09:19 +0200)
The problem is that only prefixes were handled and any other `match`
commands were ignored. Let's do not forget them as well.

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
bgpd/bgp_route.c
bgpd/bgp_route.h
bgpd/bgp_updgrp_adv.c

index 7ad0580678b05189fab61a6f87c62014bff4faa0..1c646c03e3281b17970d517a66d2ad0de4e6ce54 100644 (file)
@@ -1613,7 +1613,7 @@ void bgp_attr_add_gshut_community(struct attr *attr)
 }
 
 
-static void subgroup_announce_reset_nhop(uint8_t family, struct attr *attr)
+void subgroup_announce_reset_nhop(uint8_t family, struct attr *attr)
 {
        if (family == AF_INET) {
                attr->nexthop.s_addr = INADDR_ANY;
index 3f734d26724bebcfaa0d27763ba10c5237090797..9b711a1444961814ddf9a40c500d7477faca9ae3 100644 (file)
@@ -684,4 +684,5 @@ extern bool bgp_update_martian_nexthop(struct bgp *bgp, afi_t afi, safi_t safi,
                                       struct attr *attr, struct bgp_dest *dest);
 extern int bgp_evpn_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new,
                             struct bgp_path_info *exist, int *paths_eq);
+extern void subgroup_announce_reset_nhop(uint8_t family, struct attr *attr);
 #endif /* _QUAGGA_BGP_ROUTE_H */
index 76bf2db05b3b1b413317d5ed23fd39099d03d726..4524d1be71e7d9ad2e009c7f4d2b28ab55ad6e3c 100644 (file)
@@ -726,7 +726,6 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw)
        struct bgp *bgp;
        struct attr attr;
        struct attr *new_attr = &attr;
-       struct aspath *aspath;
        struct prefix p;
        struct peer *from;
        struct bgp_dest *dest;
@@ -751,7 +750,6 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw)
        from = bgp->peer_self;
 
        bgp_attr_default_set(&attr, BGP_ORIGIN_IGP);
-       aspath = attr.aspath;
 
        attr.local_pref = bgp->default_local_pref;
 
@@ -767,12 +765,6 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw)
        }
 
        if (peer->default_rmap[afi][safi].name) {
-               struct attr attr_tmp = attr;
-               struct bgp_path_info bpi_rmap = {0};
-
-               bpi_rmap.peer = bgp->peer_self;
-               bpi_rmap.attr = &attr_tmp;
-
                SET_FLAG(bgp->peer_self->rmap_type, PEER_RMAP_TYPE_DEFAULT);
 
                /* Iterate over the RIB to see if we can announce
@@ -784,20 +776,45 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw)
                        if (!bgp_dest_has_bgp_path_info_data(dest))
                                continue;
 
-                       ret = route_map_apply(peer->default_rmap[afi][safi].map,
-                                             bgp_dest_get_prefix(dest),
-                                             RMAP_BGP, &bpi_rmap);
+                       for (pi = bgp_dest_get_bgp_path_info(dest); pi;
+                            pi = pi->next) {
+                               struct attr tmp_attr;
+                               struct bgp_path_info tmp_pi;
+                               struct bgp_path_info_extra tmp_pie;
+
+                               tmp_attr = *pi->attr;
+
+                               prep_for_rmap_apply(&tmp_pi, &tmp_pie, dest, pi,
+                                                   pi->peer, &tmp_attr);
 
-                       if (ret != RMAP_DENYMATCH)
+                               ret = route_map_apply(
+                                       peer->default_rmap[afi][safi].map,
+                                       bgp_dest_get_prefix(dest), RMAP_BGP,
+                                       &tmp_pi);
+
+                               if (ret == RMAP_DENYMATCH) {
+                                       bgp_attr_flush(&tmp_attr);
+                                       continue;
+                               } else {
+                                       new_attr = bgp_attr_intern(&tmp_attr);
+                                       new_attr->aspath = attr.aspath;
+
+                                       subgroup_announce_reset_nhop(
+                                               (peer_cap_enhe(peer, afi, safi)
+                                                        ? AF_INET6
+                                                        : AF_INET),
+                                               new_attr);
+
+                                       break;
+                               }
+                       }
+                       if (ret == RMAP_PERMITMATCH)
                                break;
                }
                bgp->peer_self->rmap_type = 0;
-               new_attr = bgp_attr_intern(&attr_tmp);
 
-               if (ret == RMAP_DENYMATCH) {
-                       bgp_attr_flush(&attr_tmp);
+               if (ret == RMAP_DENYMATCH)
                        withdraw = 1;
-               }
        }
 
        /* Check if the default route is in local BGP RIB which is
@@ -876,8 +893,6 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw)
                        subgroup_default_update_packet(subgrp, new_attr, from);
                }
        }
-
-       aspath_unintern(&aspath);
 }
 
 /*