]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Handle route-maps properly for `default-originate route-map` command
authorDonatas Abraitis <donatas.abraitis@gmail.com>
Thu, 29 Oct 2020 19:41:12 +0000 (21:41 +0200)
committerDonatas Abraitis <donatas.abraitis@gmail.com>
Thu, 5 Nov 2020 20:10:59 +0000 (22:10 +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 2c15143ee46fd1f757623a46dc4b2229a1939e66..d7a8c371d5c0fadde6c810ff086eb0c238ba78c0 100644 (file)
@@ -1531,7 +1531,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 7532dc123aece438233ccaf7d95467e7d5c4dc63..b53a31f24aa4f93e8a0bfdfc2b09d27ad0160c49 100644 (file)
@@ -680,4 +680,5 @@ extern int bgp_best_path_select_defer(struct bgp *bgp, afi_t afi, safi_t safi);
 extern bool bgp_update_martian_nexthop(struct bgp *bgp, afi_t afi, safi_t safi,
                                       uint8_t type, uint8_t stype,
                                       struct attr *attr, struct bgp_node *rn);
+void subgroup_announce_reset_nhop(uint8_t family, struct attr *attr);
 #endif /* _QUAGGA_BGP_ROUTE_H */
index b4606908491f4b971a78ff1b985c612e7425e5e5..afa3c6bd91fd6241bee9fc39f63bff36c7f09454 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_node *rn;
@@ -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
@@ -781,20 +773,48 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw)
                 */
                for (rn = bgp_table_top(bgp->rib[afi][safi]); rn;
                     rn = bgp_route_next(rn)) {
-                       ret = route_map_apply(peer->default_rmap[afi][safi].map,
-                                             bgp_node_get_prefix(rn), RMAP_BGP,
-                                             &bpi_rmap);
+                       if (!bgp_node_get_bgp_path_info(rn))
+                               continue;
+
+                       for (pi = bgp_node_get_bgp_path_info(rn); 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, rn, pi,
+                                                   pi->peer, &tmp_attr);
+
+                               ret = route_map_apply(
+                                       peer->default_rmap[afi][safi].map,
+                                       bgp_node_get_prefix(rn), RMAP_BGP,
+                                       &tmp_pi);
 
-                       if (ret != RMAP_DENYMATCH)
+                               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
@@ -871,8 +891,6 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw)
                        subgroup_default_update_packet(subgrp, new_attr, from);
                }
        }
-
-       aspath_unintern(&aspath);
 }
 
 /*