summaryrefslogtreecommitdiff
path: root/pbrd/pbr_vty.c
diff options
context:
space:
mode:
authorStephen Worley <sworley@cumulusnetworks.com>2019-09-27 16:38:31 -0400
committerStephen Worley <sworley@cumulusnetworks.com>2019-11-21 16:59:42 -0500
commitbe3b67b5ef82d2f1f9f0f63190dd65c2bc47ebbf (patch)
tree47fdc3253148c9b0e9f31ebf8e71afcc7993e99f /pbrd/pbr_vty.c
parent2d7ef3bba7eeb00adf2aceeca4747b59f4ac5fc7 (diff)
pbrd: Add `set vrf NAME` and `set vrf unchanged`
`set vrf NAME` allows the pbr map to point to an arbitrary vrf table. `set vrf unchanged` will use the interface's vrf for table lookup. Further, add functionality for pbr to respond to interface events such as interface vrf changes & interface creation/deletion. Ex) ubuntu_nh# show pbr map pbr-map TEST valid: 1 Seq: 1 rule: 300 Installed: 3(1) Reason: Valid SRC Match: 3.3.3.3/32 VRF Unchanged (use interface vrf) pbr-map TEST2 valid: 1 Seq: 2 rule: 301 Installed: 3(2) Reason: Valid SRC Match: 4.4.4.4/32 VRF Lookup: vrf-red root@ubuntu_nh:/home# ip rule show 0: from all lookup local 300: from 3.3.3.3 iif dummy2 lookup main 300: from 3.3.3.3 iif dummyVRF lookup 1111 301: from 4.4.4.4 iif dummy1 lookup 1111 301: from 4.4.4.4 iif dummy3 lookup 1111 Signed-off-by: Stephen Worley <sworley@cumulusnetworks.com-
Diffstat (limited to 'pbrd/pbr_vty.c')
-rw-r--r--pbrd/pbr_vty.c98
1 files changed, 90 insertions, 8 deletions
diff --git a/pbrd/pbr_vty.c b/pbrd/pbr_vty.c
index e0fd147b0e..bc4aa947a9 100644
--- a/pbrd/pbr_vty.c
+++ b/pbrd/pbr_vty.c
@@ -193,14 +193,17 @@ DEFPY(pbr_map_match_mark, pbr_map_match_mark_cmd,
pbr_map_check(pbrms);
return CMD_SUCCESS;
- }
+}
+
+#define SET_VRF_EXISTS_STR \
+ "A `set vrf XX` command already exists, please remove that first\n"
DEFPY(pbr_map_nexthop_group, pbr_map_nexthop_group_cmd,
- "[no] set nexthop-group NHGNAME$name",
- NO_STR
- "Set for the PBR-MAP\n"
- "nexthop-group to use\n"
- "The name of the nexthop-group\n")
+ "[no] set nexthop-group NHGNAME$name",
+ NO_STR
+ "Set for the PBR-MAP\n"
+ "nexthop-group to use\n"
+ "The name of the nexthop-group\n")
{
struct pbr_map_sequence *pbrms = VTY_GET_CONTEXT(pbr_map_sequence);
struct nexthop_group_cmd *nhgc;
@@ -211,16 +214,22 @@ DEFPY(pbr_map_nexthop_group, pbr_map_nexthop_group_cmd,
return CMD_WARNING_CONFIG_FAILED;
}
+ if (pbrms->vrf_lookup || pbrms->vrf_unchanged) {
+ vty_out(vty, SET_VRF_EXISTS_STR);
+ return CMD_WARNING_CONFIG_FAILED;
+ }
+
nhgc = nhgc_find(name);
if (!nhgc) {
vty_out(vty, "Specified nexthop-group %s does not exist\n",
name);
- vty_out(vty, "PBR-MAP will not be applied until it is created\n");
+ vty_out(vty,
+ "PBR-MAP will not be applied until it is created\n");
}
if (no) {
if (pbrms->nhgrp_name && strcmp(name, pbrms->nhgrp_name) == 0)
- pbr_map_delete_nexthop_group(pbrms);
+ pbr_map_delete_nexthops(pbrms);
else {
vty_out(vty,
"Nexthop Group specified: %s does not exist to remove",
@@ -272,6 +281,11 @@ DEFPY(pbr_map_nexthop, pbr_map_nexthop_cmd,
return CMD_WARNING_CONFIG_FAILED;
}
+ if (pbrms->vrf_lookup || pbrms->vrf_unchanged) {
+ vty_out(vty, SET_VRF_EXISTS_STR);
+ return CMD_WARNING_CONFIG_FAILED;
+ }
+
if (vrf_name)
vrf = vrf_lookup_by_name(vrf_name);
else
@@ -372,6 +386,61 @@ DEFPY(pbr_map_nexthop, pbr_map_nexthop_cmd,
return CMD_SUCCESS;
}
+DEFPY(pbr_map_vrf, pbr_map_vrf_cmd,
+ "[no] set vrf <NAME$vrf_name|unchanged>",
+ NO_STR
+ "Set for the PBR-MAP\n"
+ "Specify the VRF for this map\n"
+ "The VRF Name\n"
+ "Use the interface's VRF for lookup\n")
+{
+ struct pbr_map_sequence *pbrms = VTY_GET_CONTEXT(pbr_map_sequence);
+ int ret = CMD_SUCCESS;
+
+ if (no) {
+ pbr_map_delete_vrf(pbrms);
+
+ /* Reset all data */
+ pbrms->nhs_installed = false;
+ pbrms->vrf_name[0] = '\0';
+ pbrms->vrf_lookup = false;
+ pbrms->vrf_unchanged = false;
+
+ goto done;
+ }
+
+ if (pbrms->nhgrp_name || pbrms->nhg) {
+ vty_out(vty,
+ "A `set nexthop/nexthop-group XX` command already exits, please remove that first\n");
+ ret = CMD_WARNING_CONFIG_FAILED;
+ goto done;
+ }
+
+ if (pbrms->vrf_lookup || pbrms->vrf_unchanged) {
+ vty_out(vty, SET_VRF_EXISTS_STR);
+ ret = CMD_WARNING_CONFIG_FAILED;
+ goto done;
+ }
+
+ if (vrf_name) {
+ if (!pbr_vrf_lookup_by_name(vrf_name)) {
+ vty_out(vty, "Specified: %s is non-existent\n",
+ vrf_name);
+ ret = CMD_WARNING_CONFIG_FAILED;
+ goto done;
+ }
+
+ pbrms->vrf_lookup = true;
+ strlcpy(pbrms->vrf_name, vrf_name, sizeof(pbrms->vrf_name));
+ } else
+ pbrms->vrf_unchanged = true;
+
+ pbr_map_check(pbrms);
+
+done:
+ return ret;
+}
+
DEFPY (pbr_policy,
pbr_policy_cmd,
"[no] pbr-policy PBRMAP$mapname",
@@ -500,6 +569,12 @@ DEFPY (show_pbr_map,
pbrms->internal_nhg_name),
pbr_nht_get_table(
pbrms->internal_nhg_name));
+ } else if (pbrms->vrf_unchanged) {
+ vty_out(vty,
+ "\tVRF Unchanged (use interface vrf)\n");
+ } else if (pbrms->vrf_lookup) {
+ vty_out(vty, "\tVRF Lookup: %s\n",
+ pbrms->vrf_name);
} else {
vty_out(vty,
"\tNexthop-Group: Unknown Installed: 0(0)\n");
@@ -662,6 +737,12 @@ static int pbr_vty_map_config_write_sequence(struct vty *vty,
if (pbrms->mark)
vty_out(vty, " match mark %u\n", pbrms->mark);
+ if (pbrms->vrf_unchanged)
+ vty_out(vty, " set vrf unchanged\n");
+
+ if (pbrms->vrf_lookup)
+ vty_out(vty, " set vrf %s\n", pbrms->vrf_name);
+
if (pbrms->nhgrp_name)
vty_out(vty, " set nexthop-group %s\n", pbrms->nhgrp_name);
@@ -737,6 +818,7 @@ void pbr_vty_init(void)
install_element(PBRMAP_NODE, &pbr_map_match_mark_cmd);
install_element(PBRMAP_NODE, &pbr_map_nexthop_group_cmd);
install_element(PBRMAP_NODE, &pbr_map_nexthop_cmd);
+ install_element(PBRMAP_NODE, &pbr_map_vrf_cmd);
install_element(VIEW_NODE, &show_pbr_cmd);
install_element(VIEW_NODE, &show_pbr_map_cmd);
install_element(VIEW_NODE, &show_pbr_interface_cmd);