diff options
| author | Donald Sharp <donaldsharp72@gmail.com> | 2024-07-29 10:25:14 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-07-29 10:25:14 -0400 |
| commit | 1877596ebc79e03f0b02ccb345d35c9e2c70d3cd (patch) | |
| tree | e09786d8be65aa52c4f680c898db03179436af8f /pimd/pim_cmd.c | |
| parent | bc50bcb4cfeb20093aa6c727bac36b300a1de490 (diff) | |
| parent | 7b650fb8369d180198f6b78e0dd36c9b28c933ed (diff) | |
Merge pull request #12484 from opensourcerouting/msdp-filter
pimd: MSDP SA filtering support
Diffstat (limited to 'pimd/pim_cmd.c')
| -rw-r--r-- | pimd/pim_cmd.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index 92214eced4..1e3e090868 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -6486,6 +6486,69 @@ DEFPY_ATTR(no_ip_pim_msdp_peer, return ret; } +DEFPY(msdp_peer_sa_filter, msdp_peer_sa_filter_cmd, + "msdp peer A.B.C.D$peer sa-filter ACL_NAME$acl_name <in|out>$dir", + CFG_MSDP_STR + "Configure MSDP peer\n" + "MSDP Peer address\n" + "SA access-list filter\n" + "SA access-list name\n" + "Filter incoming SAs\n" + "Filter outgoing SAs\n") +{ + const struct lyd_node *peer_node; + char xpath[XPATH_MAXLEN + 24]; + + snprintf(xpath, sizeof(xpath), "%s/msdp-peer[peer-ip='%s']", + VTY_CURR_XPATH, peer_str); + peer_node = yang_dnode_get(vty->candidate_config->dnode, xpath); + if (peer_node == NULL) { + vty_out(vty, "%% MSDP peer %s not yet configured\n", peer_str); + return CMD_SUCCESS; + } + + if (strcmp(dir, "in") == 0) + nb_cli_enqueue_change(vty, "./sa-filter-in", NB_OP_MODIFY, + acl_name); + else + nb_cli_enqueue_change(vty, "./sa-filter-out", NB_OP_MODIFY, + acl_name); + + return nb_cli_apply_changes(vty, "%s", xpath); +} + +DEFPY(no_msdp_peer_sa_filter, no_ip_msdp_peer_sa_filter_cmd, + "no msdp peer A.B.C.D$peer sa-filter ACL_NAME <in|out>$dir", + NO_STR + CFG_MSDP_STR + "Configure MSDP peer\n" + "MSDP Peer address\n" + "SA access-list filter\n" + "SA access-list name\n" + "Filter incoming SAs\n" + "Filter outgoing SAs\n") +{ + const struct lyd_node *peer_node; + char xpath[XPATH_MAXLEN + 24]; + + snprintf(xpath, sizeof(xpath), "%s/msdp-peer[peer-ip='%s']", + VTY_CURR_XPATH, peer_str); + peer_node = yang_dnode_get(vty->candidate_config->dnode, xpath); + if (peer_node == NULL) { + vty_out(vty, "%% MSDP peer %s not yet configured\n", peer_str); + return CMD_SUCCESS; + } + + if (strcmp(dir, "in") == 0) + nb_cli_enqueue_change(vty, "./sa-filter-in", NB_OP_DESTROY, + NULL); + else + nb_cli_enqueue_change(vty, "./sa-filter-out", NB_OP_DESTROY, + NULL); + + return nb_cli_apply_changes(vty, "%s", xpath); +} + DEFPY(pim_msdp_mesh_group_member, pim_msdp_mesh_group_member_cmd, "msdp mesh-group WORD$gname member A.B.C.D$maddr", @@ -8259,6 +8322,8 @@ void pim_cmd_init(void) install_element(PIM_NODE, &no_pim_msdp_peer_cmd); install_element(PIM_NODE, &pim_msdp_timers_cmd); install_element(PIM_NODE, &no_pim_msdp_timers_cmd); + install_element(PIM_NODE, &msdp_peer_sa_filter_cmd); + install_element(PIM_NODE, &no_ip_msdp_peer_sa_filter_cmd); install_element(PIM_NODE, &pim_msdp_mesh_group_member_cmd); install_element(PIM_NODE, &no_pim_msdp_mesh_group_member_cmd); install_element(PIM_NODE, &pim_msdp_mesh_group_source_cmd); |
