]> git.proxmox.com Git - mirror_frr.git/blobdiff - bgpd/bgp_routemap.c
bgpd: conditional advertisement - other match rules support
[mirror_frr.git] / bgpd / bgp_routemap.c
index dd22a47c89eccae1e52faf110fc0869c5c861a8b..e4a9c29000675b40e5c6ec8c9f7c50f1728cf72e 100644 (file)
@@ -3695,9 +3695,22 @@ static void bgp_route_map_process_peer(const char *rmap_name,
        if (filter->usmap.name && (strcmp(rmap_name, filter->usmap.name) == 0))
                filter->usmap.map = map;
 
+       if (filter->advmap.aname
+           && (strcmp(rmap_name, filter->advmap.aname) == 0)) {
+               filter->advmap.amap = map;
+       }
+
+       if (filter->advmap.cname
+           && (strcmp(rmap_name, filter->advmap.cname) == 0)) {
+               filter->advmap.cmap = map;
+       }
+
        if (peer->default_rmap[afi][safi].name
            && (strcmp(rmap_name, peer->default_rmap[afi][safi].name) == 0))
                peer->default_rmap[afi][safi].map = map;
+
+       /* Notify BGP conditional advertisement scanner percess */
+       peer->advmap_config_change[afi][safi] = true;
 }
 
 static void bgp_route_map_update_peer_group(const char *rmap_name,
@@ -3746,6 +3759,7 @@ static void bgp_route_map_process_update(struct bgp *bgp, const char *rmap_name,
                                         int route_update)
 {
        int i;
+       bool matched;
        afi_t afi;
        safi_t safi;
        struct peer *peer;
@@ -3845,26 +3859,35 @@ static void bgp_route_map_process_update(struct bgp *bgp, const char *rmap_name,
                        if (!aggregate)
                                continue;
 
+                       matched = false;
+
                        /* Update suppress map pointer. */
                        if (aggregate->suppress_map_name
                            && strmatch(aggregate->suppress_map_name,
                                        rmap_name)) {
-                               if (!aggregate->rmap.map)
+                               if (aggregate->rmap.map == NULL)
                                        route_map_counter_increment(map);
 
                                aggregate->suppress_map = map;
+
+                               bgp_aggregate_toggle_suppressed(
+                                       aggregate, bgp, bgp_dest_get_prefix(bn),
+                                       afi, safi, false);
+
+                               matched = true;
                        }
 
-                       if (!aggregate->rmap.name
-                           || (strcmp(rmap_name, aggregate->rmap.name) != 0))
-                               continue;
+                       if (aggregate->rmap.name
+                           && strmatch(rmap_name, aggregate->rmap.name)) {
+                               if (aggregate->rmap.map == NULL)
+                                       route_map_counter_increment(map);
 
-                       if (!aggregate->rmap.map)
-                               route_map_counter_increment(map);
+                               aggregate->rmap.map = map;
 
-                       aggregate->rmap.map = map;
+                               matched = true;
+                       }
 
-                       if (route_update) {
+                       if (matched && route_update) {
                                const struct prefix *bn_p =
                                        bgp_dest_get_prefix(bn);
 
@@ -4043,32 +4066,64 @@ DEFUN (no_match_mac_address,
                                      RMAP_EVENT_FILTER_DELETED);
 }
 
+/*
+ * Helper to handle the case of the user passing in a number or type string
+ */
+static const char *parse_evpn_rt_type(const char *num_rt_type)
+{
+       switch (num_rt_type[0]) {
+       case '1':
+               return "ead";
+       case '2':
+               return "macip";
+       case '3':
+               return "multicast";
+       case '4':
+               return "es";
+       case '5':
+               return "prefix";
+       default:
+               break;
+       }
+
+       /* Was already full type string */
+       return num_rt_type;
+}
+
 DEFUN (match_evpn_route_type,
        match_evpn_route_type_cmd,
-       "match evpn route-type <macip | multicast | prefix>",
+       "match evpn route-type <macip|2|multicast|3|prefix|5>",
        MATCH_STR
        EVPN_HELP_STR
-       "Match route-type\n"
-       "mac-ip route\n"
-       "IMET route\n"
-       "prefix route\n")
-{
-       return bgp_route_match_add(vty, "evpn route-type", argv[3]->arg,
+       EVPN_TYPE_HELP_STR
+       EVPN_TYPE_2_HELP_STR
+       EVPN_TYPE_2_HELP_STR
+       EVPN_TYPE_3_HELP_STR
+       EVPN_TYPE_3_HELP_STR
+       EVPN_TYPE_5_HELP_STR
+       EVPN_TYPE_5_HELP_STR)
+{
+       return bgp_route_match_add(vty, "evpn route-type",
+                                  parse_evpn_rt_type(argv[3]->arg),
                                   RMAP_EVENT_MATCH_ADDED);
 }
 
 DEFUN (no_match_evpn_route_type,
        no_match_evpn_route_type_cmd,
-       "no match evpn route-type <macip | multicast | prefix>",
+       "no match evpn route-type <macip|2|multicast|3|prefix|5>",
        NO_STR
        MATCH_STR
        EVPN_HELP_STR
-       "Match route-type\n"
-       "mac-ip route\n"
-       "IMET route\n"
-       "prefix route\n")
-{
-       return bgp_route_match_delete(vty, "evpn route-type", argv[4]->arg,
+       EVPN_TYPE_HELP_STR
+       EVPN_TYPE_2_HELP_STR
+       EVPN_TYPE_2_HELP_STR
+       EVPN_TYPE_3_HELP_STR
+       EVPN_TYPE_3_HELP_STR
+       EVPN_TYPE_5_HELP_STR
+       EVPN_TYPE_5_HELP_STR)
+{
+       return bgp_route_match_delete(vty, "evpn route-type",
+                                     parse_evpn_rt_type(argv[4]->arg),
                                      RMAP_EVENT_MATCH_DELETED);
 }