]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: Added support for vni filtering
authorMitesh Kanjariya <mitesh@marvel-07.cumulusnetworks.com>
Wed, 21 Jun 2017 09:00:24 +0000 (02:00 -0700)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Tue, 8 Aug 2017 14:09:37 +0000 (10:09 -0400)
1. provision to add match clause with a vni under route-map

Ticket: CM-16349
Review: CCR-6190
Unit-test: Manual (logs attached to ticket)

Signed-off-by: Mitesh Kanjariya <mitesh@cumulusnetworks.com>
bgpd/bgp_route.c
bgpd/bgp_routemap.c

index 4f2123219114f0d6d0845a1894e581d484100752..ac820fb34fb835aa9d7fccfb12e372d7987e0e80 100644 (file)
@@ -1580,11 +1580,18 @@ int subgroup_announce_check(struct bgp_node *rn, struct bgp_info *ri,
        /* Route map & unsuppress-map apply. */
        if (ROUTE_MAP_OUT_NAME(filter) || (ri->extra && ri->extra->suppress)) {
                struct bgp_info info;
+               struct bgp_info_extra dummy_info_extra;
                struct attr dummy_attr;
 
                info.peer = peer;
                info.attr = attr;
 
+               if (ri->extra) {
+                       memcpy(&dummy_info_extra, ri->extra,
+                              sizeof(struct bgp_info_extra));
+                       info.extra = &dummy_info_extra;
+               }
+
                /* don't confuse inbound and outbound setting */
                RESET_FLAG(attr->rmap_change_flags);
 
index 811ff619a3b78b9184883ab9e85360a1f9b27510..d360161cfef92bfb57a0f7faad4f04657e521160 100644 (file)
@@ -620,6 +620,54 @@ struct route_map_rule_cmd route_match_mac_address_cmd = {
        "mac address", route_match_mac_address, route_match_mac_address_compile,
        route_match_mac_address_free};
 
+/* `match vni' */
+
+/* Match function should return 1 if match is success else return
+   zero. */
+static route_map_result_t route_match_vni(void *rule, struct prefix *prefix,
+                                         route_map_object_t type, void *object)
+{
+       vni_t vni = 0;
+       struct bgp_info *bgp_info = NULL;
+
+       if (type == RMAP_BGP) {
+               vni = *((vni_t *)rule);
+               bgp_info = (struct bgp_info *)object;
+
+               if (vni == label2vni(&bgp_info->extra->label))
+                       return RMAP_MATCH;
+       }
+
+       return RMAP_NOMATCH;
+}
+
+/* Route map `vni' match statement. */
+static void *route_match_vni_compile(const char *arg)
+{
+       vni_t *vni = NULL;
+       char *end = NULL;
+
+       vni = XMALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(vni_t));
+       if (!vni)
+               return NULL;
+
+       *vni = strtoul(arg, &end, 10);
+       if (*end != '\0')
+               return NULL;
+
+       return vni;
+}
+
+/* Free route map's compiled `vni' value. */
+static void route_match_vni_free(void *rule)
+{
+       XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);
+}
+
+/* Route map commands for vni matching. */
+struct route_map_rule_cmd route_match_evpn_vni_cmd = {
+       "vni", route_match_vni, route_match_vni_compile, route_match_vni_free};
+
 /* `match local-preference LOCAL-PREF' */
 
 /* Match function return 1 if match is success else return zero. */
@@ -3070,6 +3118,29 @@ DEFUN (no_match_mac_address,
                                      RMAP_EVENT_FILTER_DELETED);
 }
 
+DEFUN (match_evpn_vni,
+       match_evpn_vni_cmd,
+       "match evpn vni (1-16777215)",
+       MATCH_STR
+       "Match VNI\n"
+       "VNI ID\n")
+{
+       return bgp_route_match_add(vty, "evpn vni", argv[2]->arg,
+                                  RMAP_EVENT_MATCH_ADDED);
+}
+
+DEFUN (no_match_evpn_vni,
+       no_match_evpn_vni_cmd,
+       "no match evpn vni (1-16777215)",
+       NO_STR
+       MATCH_STR
+       "Match VNI\n"
+       "VNI ID\n")
+{
+       return bgp_route_match_delete(vty, "evpn vni", argv[3]->arg,
+                                     RMAP_EVENT_MATCH_DELETED);
+}
+
 DEFUN (match_peer,
        match_peer_cmd,
        "match peer <A.B.C.D|X:X::X:X>",
@@ -4427,6 +4498,7 @@ void bgp_route_map_init(void)
        route_map_install_match(&route_match_interface_cmd);
        route_map_install_match(&route_match_tag_cmd);
        route_map_install_match(&route_match_mac_address_cmd);
+       route_map_install_match(&route_match_evpn_vni_cmd);
 
        route_map_install_set(&route_set_ip_nexthop_cmd);
        route_map_install_set(&route_set_local_pref_cmd);
@@ -4459,6 +4531,8 @@ void bgp_route_map_init(void)
        install_element(RMAP_NODE, &no_match_ip_route_source_prefix_list_cmd);
        install_element(RMAP_NODE, &match_mac_address_cmd);
        install_element(RMAP_NODE, &no_match_mac_address_cmd);
+       install_element(RMAP_NODE, &match_evpn_vni_cmd);
+       install_element(RMAP_NODE, &no_match_evpn_vni_cmd);
 
        install_element(RMAP_NODE, &match_aspath_cmd);
        install_element(RMAP_NODE, &no_match_aspath_cmd);