]> git.puffer.fish Git - mirror/frr.git/commitdiff
lib: Allow doing match/set tag untagged
authorDonatas Abraitis <donatas@opensourcerouting.org>
Wed, 8 May 2024 19:25:38 +0000 (22:25 +0300)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Fri, 10 May 2024 06:50:18 +0000 (09:50 +0300)
In route-map: `match tag untagged`.

E.g. Cisco/Juniper allows that, but they use `match tag 0` instead.

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
doc/user/ripngd.rst
doc/user/routemap.rst
lib/routemap_cli.c
yang/frr-route-map.yang

index f898bed57a1002d27ec079121cd9f6b77dbc728f..f55ee39445700bcb425c932ec8774abf5cf3a3ae 100644 (file)
@@ -136,7 +136,7 @@ functionality.
    range is very large for compatibility with other protocols. For RIPng, valid
    metric values are from 1 to 16.
 
-.. clicmd:: set tag (1-4294967295)
+.. clicmd:: set tag <untagged|(1-4294967295)>
 
    Set a tag on the matched route.
 
index 791762aa7b88742a21306b8f270a26479fe41b66..1d2f4e352f38dc364568066e840df87d14155f5a 100644 (file)
@@ -176,10 +176,9 @@ Route Map Match Command
 
    Matches the specified `metric`.
 
-.. clicmd:: match tag TAG
+.. clicmd:: match tag <untagged|(1-4294967295)>
 
-   Matches the specified tag value associated with the route. This tag value
-   can be in the range of (1-4294967295).
+   Matches the specified tag (or untagged) value associated with the route.
 
 .. clicmd:: match local-preference METRIC
 
@@ -241,9 +240,10 @@ Route Map Set Command
 
 .. program:: configure
 
-.. clicmd:: set tag TAG
+.. clicmd:: set tag <untagged|(1-4294967295)>
+
+   Set a tag on the matched route.
 
-   Set a tag on the matched route. This tag value can be from (1-4294967295).
    Additionally if you have compiled with the :option:`--enable-realms`
    configure option. Tag values from (1-255) are sent to the Linux kernel as a
    realm value. Then route policy can be applied. See the tc man page.  As
index a12a07c14fbc67d54082db0d745d891f0b01149d..8e2e497e0940026c243d5c8d86728d93269d205d 100644 (file)
@@ -490,29 +490,33 @@ DEFPY_YANG(
 
 DEFPY_YANG(
        match_tag, match_tag_cmd,
-       "match tag (1-4294967295)$tag",
+       "match tag <untagged$untagged|(1-4294967295)$tagged>",
        MATCH_STR
        "Match tag of route\n"
+       "Untagged route\n"
        "Tag value\n")
 {
        const char *xpath =
                "./match-condition[condition='frr-route-map:match-tag']";
        char xpath_value[XPATH_MAXLEN];
+       char value[64];
 
        nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, NULL);
        snprintf(xpath_value, sizeof(xpath_value),
                 "%s/rmap-match-condition/tag", xpath);
-       nb_cli_enqueue_change(vty, xpath_value, NB_OP_MODIFY, tag_str);
+       snprintf(value, sizeof(value), "%lu", tagged ? tagged : 0);
+       nb_cli_enqueue_change(vty, xpath_value, NB_OP_MODIFY, value);
 
        return nb_cli_apply_changes(vty, NULL);
 }
 
 DEFPY_YANG(
        no_match_tag, no_match_tag_cmd,
-       "no match tag [(1-4294967295)]",
+       "no match tag [<untagged|(1-4294967295)>]",
        NO_STR
        MATCH_STR
        "Match tag of route\n"
+       "Untagged route\n"
        "Tag value\n")
 {
        const char *xpath =
@@ -581,9 +585,15 @@ void route_map_condition_show(struct vty *vty, const struct lyd_node *dnode,
                        yang_dnode_get_string(dnode,
                                              "./rmap-match-condition/metric"));
        } else if (IS_MATCH_TAG(condition)) {
-               vty_out(vty, " match tag %s\n",
-                       yang_dnode_get_string(dnode,
-                                             "./rmap-match-condition/tag"));
+               uint32_t tag =
+                       strtoul(yang_dnode_get_string(dnode,
+                                                     "./rmap-match-condition/tag"),
+                               NULL, 10);
+
+               if (!tag)
+                       vty_out(vty, " match tag untagged\n");
+               else
+                       vty_out(vty, " match tag %u\n", tag);
        } else if (IS_MATCH_IPv4_PREFIX_LEN(condition)) {
                vty_out(vty, " match ip address prefix-len %s\n",
                        yang_dnode_get_string(
@@ -973,28 +983,32 @@ DEFPY_YANG(no_set_max_metric, no_set_max_metric_cmd,
 
 DEFPY_YANG(
        set_tag, set_tag_cmd,
-       "set tag (1-4294967295)$tag",
+       "set tag <untagged$untagged|(1-4294967295)$tagged>",
        SET_STR
        "Tag value for routing protocol\n"
+       "Untagged route\n"
        "Tag value\n")
 {
        const char *xpath = "./set-action[action='frr-route-map:set-tag']";
        char xpath_value[XPATH_MAXLEN];
+       char value[64];
 
        nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, NULL);
        snprintf(xpath_value, sizeof(xpath_value), "%s/rmap-set-action/tag",
                 xpath);
-       nb_cli_enqueue_change(vty, xpath_value, NB_OP_MODIFY, tag_str);
+       snprintf(value, sizeof(value), "%lu", tagged ? tagged : 0);
+       nb_cli_enqueue_change(vty, xpath_value, NB_OP_MODIFY, value);
 
        return nb_cli_apply_changes(vty, NULL);
 }
 
 DEFPY_YANG(
        no_set_tag, no_set_tag_cmd,
-       "no set tag [(1-4294967295)]",
+       "no set tag [<untagged|(1-4294967295)>]",
        NO_STR
        SET_STR
        "Tag value for routing protocol\n"
+       "Untagged route\n"
        "Tag value\n")
 {
        const char *xpath = "./set-action[action='frr-route-map:set-tag']";
@@ -1101,8 +1115,15 @@ void route_map_action_show(struct vty *vty, const struct lyd_node *dnode,
                        yang_dnode_get_string(dnode,
                                              "./rmap-set-action/max-metric"));
        } else if (IS_SET_TAG(action)) {
-               vty_out(vty, " set tag %s\n",
-                       yang_dnode_get_string(dnode, "rmap-set-action/tag"));
+               uint32_t tag =
+                       strtoul(yang_dnode_get_string(dnode,
+                                                     "rmap-set-action/tag"),
+                               NULL, 10);
+
+               if (!tag)
+                       vty_out(vty, " set tag untagged\n");
+               else
+                       vty_out(vty, " set tag %u\n", tag);
        } else if (IS_SET_SR_TE_COLOR(action)) {
                vty_out(vty, " set sr-te color %s\n",
                        yang_dnode_get_string(dnode,
index 7cb13b60f2fc2b271e4946ea7a61979b02774f95..26d56acc039b0b16817d2d4e1dd5d147ad7dd0db 100644 (file)
@@ -268,7 +268,7 @@ module frr-route-map {
           when "derived-from-or-self(../condition, 'match-tag')";
           leaf tag {
             type uint32 {
-              range "1..4294967295";
+              range "0..4294967295";
             }
           }
         }