]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: add "set label-index" route-map option
authorDon Slice <dslice@cumulusnetworks.com>
Fri, 2 Jun 2017 19:22:53 +0000 (12:22 -0700)
committerDon Slice <dslice@cumulusnetworks.com>
Tue, 6 Jun 2017 13:48:53 +0000 (06:48 -0700)
Added the ability to set the label-index value based on criteria other
than the network statement.  Manual testing looks good and added to the
ticket.

Ticket: CM-16513
Signed-off-by: Don Slice <dslice@cumulusnetworks.com>
Reviewed-by: CCR-6339
bgpd/bgp_route.c
bgpd/bgp_routemap.c

index b3e1f8b27e36846a23b4828e358e7c07b165e1f5..fd5e7f2633887fff6ecf7542bc869b72faa7be78 100644 (file)
@@ -5017,7 +5017,7 @@ DEFUN (bgp_network_mask_natural_backdoor,
 
 DEFUN (bgp_network_label_index,
        bgp_network_label_index_cmd,
-       "network A.B.C.D/M label-index (0-4294967294)",
+       "network A.B.C.D/M label-index (0-471788)",
        "Specify a network to announce via BGP\n"
        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
        "Label index to associate with the prefix\n"
@@ -5032,7 +5032,7 @@ DEFUN (bgp_network_label_index,
 
 DEFUN (bgp_network_label_index_route_map,
        bgp_network_label_index_route_map_cmd,
-       "network A.B.C.D/M label-index (0-4294967294) route-map WORD",
+       "network A.B.C.D/M label-index (0-471788) route-map WORD",
        "Specify a network to announce via BGP\n"
        "IP prefix\n"
        "Label index to associate with the prefix\n"
@@ -5117,7 +5117,7 @@ DEFUN (no_bgp_network_mask_natural,
 
 ALIAS (no_bgp_network,
        no_bgp_network_label_index_cmd,
-       "no network A.B.C.D/M label-index (0-4294967294)",
+       "no network A.B.C.D/M label-index (0-471788)",
        NO_STR
        "Specify a network to announce via BGP\n"
        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
@@ -5126,7 +5126,7 @@ ALIAS (no_bgp_network,
 
 ALIAS (no_bgp_network,
        no_bgp_network_label_index_route_map_cmd,
-       "no network A.B.C.D/M label-index (0-4294967294) route-map WORD",
+       "no network A.B.C.D/M label-index (0-471788) route-map WORD",
        NO_STR
        "Specify a network to announce via BGP\n"
        "IP prefix\n"
@@ -5164,7 +5164,7 @@ DEFUN (ipv6_bgp_network_route_map,
 
 DEFUN (ipv6_bgp_network_label_index,
        ipv6_bgp_network_label_index_cmd,
-       "network X:X::X:X/M label-index (0-4294967294)",
+       "network X:X::X:X/M label-index (0-471788)",
        "Specify a network to announce via BGP\n"
        "IPv6 prefix <network>/<length>\n"
        "Label index to associate with the prefix\n"
@@ -5179,7 +5179,7 @@ DEFUN (ipv6_bgp_network_label_index,
 
 DEFUN (ipv6_bgp_network_label_index_route_map,
        ipv6_bgp_network_label_index_route_map_cmd,
-       "network X:X::X:X/M label-index (0-4294967294) route-map WORD",
+       "network X:X::X:X/M label-index (0-471788) route-map WORD",
        "Specify a network to announce via BGP\n"
        "IPv6 prefix\n"
        "Label index to associate with the prefix\n"
@@ -5209,7 +5209,7 @@ DEFUN (no_ipv6_bgp_network,
 
 ALIAS (no_ipv6_bgp_network,
        no_ipv6_bgp_network_label_index_cmd,
-       "no network X:X::X:X/M label-index (0-4294967294)",
+       "no network X:X::X:X/M label-index (0-471788)",
        NO_STR
        "Specify a network to announce via BGP\n"
        "IPv6 prefix <network>/<length>\n"
@@ -5218,7 +5218,7 @@ ALIAS (no_ipv6_bgp_network,
 
 ALIAS (no_ipv6_bgp_network,
        no_ipv6_bgp_network_label_index_route_map_cmd,
-       "no network X:X::X:X/M label-index (0-4294967294) route-map WORD",
+       "no network X:X::X:X/M label-index (0-471788) route-map WORD",
        NO_STR
        "Specify a network to announce via BGP\n"
        "IPv6 prefix\n"
index 570fcc1a34da8b40e77ca12791fd86e0f969740a..f3f71253b1845e66ac54b7271f58cd2f023d59fc 100644 (file)
@@ -2207,6 +2207,41 @@ static struct route_map_rule_cmd route_set_tag_cmd =
   route_map_rule_tag_free,
 };
 
+/* Set label-index to object. object must be pointer to struct bgp_info */
+static route_map_result_t
+route_set_label_index (void *rule, struct prefix *prefix,
+                       route_map_object_t type, void *object)
+{
+  struct rmap_value *rv;
+  struct bgp_info *bgp_info;
+  u_int32_t label_index;
+
+  if (type == RMAP_BGP)
+    {
+      /* Fetch routemap's rule information. */
+      rv = rule;
+      bgp_info = object;
+
+      /* Set label-index value. */
+      label_index = rv->value;
+      if (label_index)
+        {
+          (bgp_attr_extra_get (bgp_info->attr))->label_index = label_index;
+          bgp_info->attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_PREFIX_SID);
+        }
+    }
+
+  return RMAP_OKAY;
+}
+
+/* Route map commands for label-index set. */
+static struct route_map_rule_cmd route_set_label_index_cmd =
+{
+  "label-index",
+  route_set_label_index,
+  route_value_compile,
+  route_value_free,
+};
 
 /* `match ipv6 address IP_ACCESS_LIST' */
 
@@ -3654,6 +3689,33 @@ DEFUN (no_set_weight,
                              argv[idx_weight]->arg);
 }
 
+DEFUN (set_label_index,
+       set_label_index_cmd,
+       "set label-index (0-471788)",
+       SET_STR
+       "Label index to associate with the prefix\n"
+       "Label index value\n")
+{
+  int idx_number = 2;
+  return generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), "label-index",
+                          argv[idx_number]->arg);
+}
+
+DEFUN (no_set_label_index,
+       no_set_label_index_cmd,
+       "no set label-index [(0-471788)]",
+       NO_STR
+       SET_STR
+       "Label index to associate with the prefix\n"
+       "Label index value\n")
+{
+  int idx_label_index = 3;
+  if (argc <= idx_label_index)
+    return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index),
+                               "label-index", NULL);
+  return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), "label-index",
+                             argv[idx_label_index]->arg);
+}
 
 DEFUN (set_aspath_prepend_asn,
        set_aspath_prepend_asn_cmd,
@@ -4549,6 +4611,7 @@ bgp_route_map_init (void)
   route_map_install_set (&route_set_ip_nexthop_cmd);
   route_map_install_set (&route_set_local_pref_cmd);
   route_map_install_set (&route_set_weight_cmd);
+  route_map_install_set (&route_set_label_index_cmd);
   route_map_install_set (&route_set_metric_cmd);
   route_map_install_set (&route_set_aspath_prepend_cmd);
   route_map_install_set (&route_set_aspath_exclude_cmd);
@@ -4565,6 +4628,7 @@ bgp_route_map_init (void)
   route_map_install_set (&route_set_ecommunity_rt_cmd);
   route_map_install_set (&route_set_ecommunity_soo_cmd);
   route_map_install_set (&route_set_tag_cmd);
+  route_map_install_set (&route_set_label_index_cmd);
 
   install_element (RMAP_NODE, &match_peer_cmd);
   install_element (RMAP_NODE, &match_peer_local_cmd);
@@ -4594,7 +4658,9 @@ bgp_route_map_init (void)
   install_element (RMAP_NODE, &set_local_pref_cmd);
   install_element (RMAP_NODE, &no_set_local_pref_cmd);
   install_element (RMAP_NODE, &set_weight_cmd);
+  install_element (RMAP_NODE, &set_label_index_cmd);
   install_element (RMAP_NODE, &no_set_weight_cmd);
+  install_element (RMAP_NODE, &no_set_label_index_cmd);
   install_element (RMAP_NODE, &set_aspath_prepend_asn_cmd);
   install_element (RMAP_NODE, &set_aspath_prepend_lastas_cmd);
   install_element (RMAP_NODE, &set_aspath_exclude_cmd);