summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_route.c7
-rw-r--r--bgpd/bgp_routemap.c74
2 files changed, 81 insertions, 0 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 4f21232191..ac820fb34f 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -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);
diff --git a/bgpd/bgp_routemap.c b/bgpd/bgp_routemap.c
index 811ff619a3..d360161cfe 100644
--- a/bgpd/bgp_routemap.c
+++ b/bgpd/bgp_routemap.c
@@ -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);