Merge pull request #8614 from opensourcerouting/msdp-fixes

pimd: MSDP trivial fixes
This commit is contained in:
Donald Sharp 2021-05-04 07:21:51 -04:00 committed by GitHub
commit 2fd97fd87d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 171 additions and 449 deletions

View File

@ -154,20 +154,6 @@ Certain signals have special meanings to *pimd*.
urib-only urib-only
Lookup in the Unicast Rib only. Lookup in the Unicast Rib only.
.. clicmd:: ip msdp mesh-group [WORD]
Create or Delete a multicast source discovery protocol mesh-group using
[WORD] as the group name.
.. clicmd:: ip msdp mesh-group WORD member A.B.C.D
Attach or Delete A.B.C.D to the MSDP mesh group WORD specified.
.. clicmd:: ip msdp mesh-group WORD source A.B.C.D
For the address specified A.B.C.D use that as the source address for
mesh group packets being sent.
.. clicmd:: ip igmp generate-query-once [version (2-3)] .. clicmd:: ip igmp generate-query-once [version (2-3)]
Generate IGMP query (v2/v3) on user requirement. This will not depend on Generate IGMP query (v2/v3) on user requirement. This will not depend on
@ -308,28 +294,44 @@ caution. Most of the time this will not be necessary.
Multicast Source Discovery Protocol (MSDP) Configuration Multicast Source Discovery Protocol (MSDP) Configuration
======================================================== ========================================================
.. clicmd:: ip msdp mesh-group [WORD] member A.B.C.D MSDP can be setup in different ways:
Include a MSDP peer as a member of a MSDP mesh-group. * MSDP meshed-group: where all peers are connected with each other creating
a fully meshed network. SAs (source active) messages are not forwarded in
this mode because the origin is able to send SAs to all members.
.. clicmd:: ip msdp mesh-group [WORD] source A.B.C.D This setup is commonly used with anycast.
Create a MSDP mesh-group, defining a name for it and an associated local source * MSDP peering: when there is one or more peers that are not fully meshed. SAs
address. may be forwarded depending on the result of filtering and RPF checks.
This setup is commonly consistent with BGP peerings (for RPF checks).
* MSDP default peer: there is only one peer and all SAs will be forwarded
there.
.. note::
MSDP default peer and SA filtering is not implemented.
Commands available for MSDP:
.. clicmd:: ip msdp mesh-group WORD member A.B.C.D
Create or update a mesh group to include the specified MSDP peer.
.. clicmd:: ip msdp mesh-group WORD source A.B.C.D
Create or update a mesh group to set the source address used to connect to
peers.
.. clicmd:: ip msdp peer A.B.C.D source A.B.C.D .. clicmd:: ip msdp peer A.B.C.D source A.B.C.D
Establish a MSDP connection with a peer. Create a regular MSDP session with peer using the specified source address.
Remove a MSDP peer member from a MSDP mesh-group.
Delete a MSDP mesh-group.
Delete a MSDP peer connection.
.. _show-pim-information: .. _show-pim-information:
Show PIM Information Show PIM Information

View File

@ -3828,6 +3828,31 @@ static void clear_interfaces(struct pim_instance *pim)
return CMD_WARNING_CONFIG_FAILED; \ return CMD_WARNING_CONFIG_FAILED; \
} }
/**
* Get current node VRF name.
*
* NOTE:
* In case of failure it will print error message to user.
*
* \returns name or NULL if failed to get VRF.
*/
static const char *pim_cli_get_vrf_name(struct vty *vty)
{
const struct lyd_node *vrf_node;
/* Not inside any VRF context. */
if (vty->xpath_index == 0)
return VRF_DEFAULT_NAME;
vrf_node = yang_dnode_get(vty->candidate_config->dnode, VTY_CURR_XPATH);
if (vrf_node == NULL) {
vty_out(vty, "%% Failed to get vrf dnode in configuration\n");
return NULL;
}
return yang_dnode_get_string(vrf_node, "./name");
}
DEFUN (clear_ip_interfaces, DEFUN (clear_ip_interfaces,
clear_ip_interfaces_cmd, clear_ip_interfaces_cmd,
"clear ip interfaces [vrf NAME]", "clear ip interfaces [vrf NAME]",
@ -6906,25 +6931,13 @@ DEFUN (ip_pim_spt_switchover_infinity,
"SPT-Switchover\n" "SPT-Switchover\n"
"Never switch to SPT Tree\n") "Never switch to SPT Tree\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char spt_plist_xpath[XPATH_MAXLEN]; char spt_plist_xpath[XPATH_MAXLEN];
char spt_action_xpath[XPATH_MAXLEN]; char spt_action_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(spt_plist_xpath, sizeof(spt_plist_xpath), snprintf(spt_plist_xpath, sizeof(spt_plist_xpath),
FRR_PIM_AF_XPATH, "frr-pim:pimd", "pim", vrfname, FRR_PIM_AF_XPATH, "frr-pim:pimd", "pim", vrfname,
@ -6957,25 +6970,13 @@ DEFUN (ip_pim_spt_switchover_infinity_plist,
"Prefix-List to control which groups to switch\n" "Prefix-List to control which groups to switch\n"
"Prefix-List name\n") "Prefix-List name\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char spt_plist_xpath[XPATH_MAXLEN]; char spt_plist_xpath[XPATH_MAXLEN];
char spt_action_xpath[XPATH_MAXLEN]; char spt_action_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(spt_plist_xpath, sizeof(spt_plist_xpath), snprintf(spt_plist_xpath, sizeof(spt_plist_xpath),
FRR_PIM_AF_XPATH, "frr-pim:pimd", "pim", vrfname, FRR_PIM_AF_XPATH, "frr-pim:pimd", "pim", vrfname,
@ -7006,25 +7007,13 @@ DEFUN (no_ip_pim_spt_switchover_infinity,
"SPT_Switchover\n" "SPT_Switchover\n"
"Never switch to SPT Tree\n") "Never switch to SPT Tree\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char spt_plist_xpath[XPATH_MAXLEN]; char spt_plist_xpath[XPATH_MAXLEN];
char spt_action_xpath[XPATH_MAXLEN]; char spt_action_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(spt_plist_xpath, sizeof(spt_plist_xpath), snprintf(spt_plist_xpath, sizeof(spt_plist_xpath),
FRR_PIM_AF_XPATH, "frr-pim:pimd", "pim", vrfname, FRR_PIM_AF_XPATH, "frr-pim:pimd", "pim", vrfname,
@ -7056,25 +7045,13 @@ DEFUN (no_ip_pim_spt_switchover_infinity_plist,
"Prefix-List to control which groups to switch\n" "Prefix-List to control which groups to switch\n"
"Prefix-List name\n") "Prefix-List name\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char spt_plist_xpath[XPATH_MAXLEN]; char spt_plist_xpath[XPATH_MAXLEN];
char spt_action_xpath[XPATH_MAXLEN]; char spt_action_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(spt_plist_xpath, sizeof(spt_plist_xpath), snprintf(spt_plist_xpath, sizeof(spt_plist_xpath),
FRR_PIM_AF_XPATH, "frr-pim:pimd", "pim", vrfname, FRR_PIM_AF_XPATH, "frr-pim:pimd", "pim", vrfname,
@ -7104,22 +7081,12 @@ DEFPY (pim_register_accept_list,
"Only accept registers from a specific source prefix list\n" "Only accept registers from a specific source prefix list\n"
"Prefix-List name\n") "Prefix-List name\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char reg_alist_xpath[XPATH_MAXLEN]; char reg_alist_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(reg_alist_xpath, sizeof(reg_alist_xpath), snprintf(reg_alist_xpath, sizeof(reg_alist_xpath),
FRR_PIM_AF_XPATH, "frr-pim:pimd", "pim", vrfname, FRR_PIM_AF_XPATH, "frr-pim:pimd", "pim", vrfname,
@ -7214,22 +7181,12 @@ DEFUN (ip_pim_rp_keep_alive,
"Keep alive Timer\n" "Keep alive Timer\n"
"Seconds\n") "Seconds\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char rp_ka_timer_xpath[XPATH_MAXLEN]; char rp_ka_timer_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(rp_ka_timer_xpath, sizeof(rp_ka_timer_xpath), snprintf(rp_ka_timer_xpath, sizeof(rp_ka_timer_xpath),
FRR_PIM_XPATH, "frr-pim:pimd", "pim", vrfname); FRR_PIM_XPATH, "frr-pim:pimd", "pim", vrfname);
@ -7252,26 +7209,15 @@ DEFUN (no_ip_pim_rp_keep_alive,
"Keep alive Timer\n" "Keep alive Timer\n"
"Seconds\n") "Seconds\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char rp_ka_timer[5]; char rp_ka_timer[5];
char rp_ka_timer_xpath[XPATH_MAXLEN]; char rp_ka_timer_xpath[XPATH_MAXLEN];
snprintf(rp_ka_timer, sizeof(rp_ka_timer), "%d", PIM_KEEPALIVE_PERIOD); snprintf(rp_ka_timer, sizeof(rp_ka_timer), "%d", PIM_KEEPALIVE_PERIOD);
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(rp_ka_timer_xpath, sizeof(rp_ka_timer_xpath), snprintf(rp_ka_timer_xpath, sizeof(rp_ka_timer_xpath),
FRR_PIM_XPATH, "frr-pim:pimd", "pim", vrfname); FRR_PIM_XPATH, "frr-pim:pimd", "pim", vrfname);
@ -7292,22 +7238,12 @@ DEFUN (ip_pim_keep_alive,
"Keep alive Timer\n" "Keep alive Timer\n"
"Seconds\n") "Seconds\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char ka_timer_xpath[XPATH_MAXLEN]; char ka_timer_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(ka_timer_xpath, sizeof(ka_timer_xpath), FRR_PIM_XPATH, snprintf(ka_timer_xpath, sizeof(ka_timer_xpath), FRR_PIM_XPATH,
"frr-pim:pimd", "pim", vrfname); "frr-pim:pimd", "pim", vrfname);
@ -7328,25 +7264,15 @@ DEFUN (no_ip_pim_keep_alive,
"Keep alive Timer\n" "Keep alive Timer\n"
"Seconds\n") "Seconds\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char ka_timer[5]; char ka_timer[5];
char ka_timer_xpath[XPATH_MAXLEN]; char ka_timer_xpath[XPATH_MAXLEN];
snprintf(ka_timer, sizeof(ka_timer), "%d", PIM_KEEPALIVE_PERIOD); snprintf(ka_timer, sizeof(ka_timer), "%d", PIM_KEEPALIVE_PERIOD);
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(ka_timer_xpath, sizeof(ka_timer_xpath), FRR_PIM_XPATH, snprintf(ka_timer_xpath, sizeof(ka_timer_xpath), FRR_PIM_XPATH,
"frr-pim:pimd", "pim", vrfname); "frr-pim:pimd", "pim", vrfname);
@ -7428,22 +7354,12 @@ DEFUN (ip_pim_v6_secondary,
"pim multicast routing\n" "pim multicast routing\n"
"Send v6 secondary addresses\n") "Send v6 secondary addresses\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char send_v6_secondary_xpath[XPATH_MAXLEN]; char send_v6_secondary_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(send_v6_secondary_xpath, sizeof(send_v6_secondary_xpath), snprintf(send_v6_secondary_xpath, sizeof(send_v6_secondary_xpath),
FRR_PIM_AF_XPATH, FRR_PIM_AF_XPATH,
@ -7465,22 +7381,12 @@ DEFUN (no_ip_pim_v6_secondary,
"pim multicast routing\n" "pim multicast routing\n"
"Send v6 secondary addresses\n") "Send v6 secondary addresses\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char send_v6_secondary_xpath[XPATH_MAXLEN]; char send_v6_secondary_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(send_v6_secondary_xpath, sizeof(send_v6_secondary_xpath), snprintf(send_v6_secondary_xpath, sizeof(send_v6_secondary_xpath),
FRR_PIM_AF_XPATH, FRR_PIM_AF_XPATH,
@ -7503,7 +7409,6 @@ DEFUN (ip_pim_rp,
"ip address of RP\n" "ip address of RP\n"
"Group Address range to cover\n") "Group Address range to cover\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
int idx_rp = 3, idx_group = 4; int idx_rp = 3, idx_group = 4;
char rp_group_xpath[XPATH_MAXLEN]; char rp_group_xpath[XPATH_MAXLEN];
@ -7539,20 +7444,9 @@ DEFUN (ip_pim_rp,
return CMD_WARNING_CONFIG_FAILED; return CMD_WARNING_CONFIG_FAILED;
} }
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(rp_group_xpath, sizeof(rp_group_xpath), snprintf(rp_group_xpath, sizeof(rp_group_xpath),
FRR_PIM_STATIC_RP_XPATH, FRR_PIM_STATIC_RP_XPATH,
@ -7576,24 +7470,12 @@ DEFUN (ip_pim_rp_prefix_list,
"Name of a prefix-list\n") "Name of a prefix-list\n")
{ {
int idx_rp = 3, idx_plist = 5; int idx_rp = 3, idx_plist = 5;
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char rp_plist_xpath[XPATH_MAXLEN]; char rp_plist_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(rp_plist_xpath, sizeof(rp_plist_xpath), snprintf(rp_plist_xpath, sizeof(rp_plist_xpath),
FRR_PIM_STATIC_RP_XPATH, FRR_PIM_STATIC_RP_XPATH,
@ -7623,24 +7505,12 @@ DEFUN (no_ip_pim_rp,
char group_list_xpath[XPATH_MAXLEN + 32]; char group_list_xpath[XPATH_MAXLEN + 32];
char group_xpath[XPATH_MAXLEN + 64]; char group_xpath[XPATH_MAXLEN + 64];
char rp_xpath[XPATH_MAXLEN]; char rp_xpath[XPATH_MAXLEN];
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
const struct lyd_node *group_dnode; const struct lyd_node *group_dnode;
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(rp_xpath, sizeof(rp_xpath), FRR_PIM_STATIC_RP_XPATH, snprintf(rp_xpath, sizeof(rp_xpath), FRR_PIM_STATIC_RP_XPATH,
"frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4", "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4",
@ -7683,23 +7553,13 @@ DEFUN (no_ip_pim_rp_prefix_list,
int idx_plist = 6; int idx_plist = 6;
char rp_xpath[XPATH_MAXLEN]; char rp_xpath[XPATH_MAXLEN];
char plist_xpath[XPATH_MAXLEN]; char plist_xpath[XPATH_MAXLEN];
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
const struct lyd_node *plist_dnode; const struct lyd_node *plist_dnode;
const char *plist; const char *plist;
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(rp_xpath, sizeof(rp_xpath), FRR_PIM_STATIC_RP_XPATH, snprintf(rp_xpath, sizeof(rp_xpath), FRR_PIM_STATIC_RP_XPATH,
"frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4", "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4",
@ -7736,22 +7596,12 @@ DEFUN (ip_pim_ssm_prefix_list,
"group range prefix-list filter\n" "group range prefix-list filter\n"
"Name of a prefix-list\n") "Name of a prefix-list\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char ssm_plist_xpath[XPATH_MAXLEN]; char ssm_plist_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(ssm_plist_xpath, sizeof(ssm_plist_xpath), FRR_PIM_AF_XPATH, snprintf(ssm_plist_xpath, sizeof(ssm_plist_xpath), FRR_PIM_AF_XPATH,
"frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4"); "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4");
@ -7771,22 +7621,12 @@ DEFUN (no_ip_pim_ssm_prefix_list,
"Source Specific Multicast\n" "Source Specific Multicast\n"
"group range prefix-list filter\n") "group range prefix-list filter\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char ssm_plist_xpath[XPATH_MAXLEN]; char ssm_plist_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(ssm_plist_xpath, sizeof(ssm_plist_xpath), snprintf(ssm_plist_xpath, sizeof(ssm_plist_xpath),
FRR_PIM_AF_XPATH, FRR_PIM_AF_XPATH,
@ -7808,27 +7648,14 @@ DEFUN (no_ip_pim_ssm_prefix_list_name,
"group range prefix-list filter\n" "group range prefix-list filter\n"
"Name of a prefix-list\n") "Name of a prefix-list\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
const struct lyd_node *ssm_plist_dnode; const struct lyd_node *ssm_plist_dnode;
char ssm_plist_xpath[XPATH_MAXLEN]; char ssm_plist_xpath[XPATH_MAXLEN];
const char *ssm_plist_name; const char *ssm_plist_name;
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(ssm_plist_xpath, sizeof(ssm_plist_xpath), snprintf(ssm_plist_xpath, sizeof(ssm_plist_xpath),
FRR_PIM_AF_XPATH, FRR_PIM_AF_XPATH,
@ -7982,22 +7809,12 @@ DEFUN (ip_ssmpingd,
{ {
int idx_ipv4 = 2; int idx_ipv4 = 2;
const char *source_str = (argc == 3) ? argv[idx_ipv4]->arg : "0.0.0.0"; const char *source_str = (argc == 3) ? argv[idx_ipv4]->arg : "0.0.0.0";
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char ssmpingd_ip_xpath[XPATH_MAXLEN]; char ssmpingd_ip_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(ssmpingd_ip_xpath, sizeof(ssmpingd_ip_xpath), snprintf(ssmpingd_ip_xpath, sizeof(ssmpingd_ip_xpath),
FRR_PIM_AF_XPATH, FRR_PIM_AF_XPATH,
@ -8019,24 +7836,14 @@ DEFUN (no_ip_ssmpingd,
CONF_SSMPINGD_STR CONF_SSMPINGD_STR
"Source address\n") "Source address\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
int idx_ipv4 = 3; int idx_ipv4 = 3;
const char *source_str = (argc == 4) ? argv[idx_ipv4]->arg : "0.0.0.0"; const char *source_str = (argc == 4) ? argv[idx_ipv4]->arg : "0.0.0.0";
char ssmpingd_ip_xpath[XPATH_MAXLEN]; char ssmpingd_ip_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(ssmpingd_ip_xpath, sizeof(ssmpingd_ip_xpath), snprintf(ssmpingd_ip_xpath, sizeof(ssmpingd_ip_xpath),
FRR_PIM_AF_XPATH, FRR_PIM_AF_XPATH,
@ -8057,22 +7864,12 @@ DEFUN (ip_pim_ecmp,
"pim multicast routing\n" "pim multicast routing\n"
"Enable PIM ECMP \n") "Enable PIM ECMP \n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char ecmp_xpath[XPATH_MAXLEN]; char ecmp_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(ecmp_xpath, sizeof(ecmp_xpath), FRR_PIM_XPATH, snprintf(ecmp_xpath, sizeof(ecmp_xpath), FRR_PIM_XPATH,
"frr-pim:pimd", "pim", vrfname); "frr-pim:pimd", "pim", vrfname);
@ -8090,22 +7887,12 @@ DEFUN (no_ip_pim_ecmp,
"pim multicast routing\n" "pim multicast routing\n"
"Disable PIM ECMP \n") "Disable PIM ECMP \n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char ecmp_xpath[XPATH_MAXLEN]; char ecmp_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(ecmp_xpath, sizeof(ecmp_xpath), FRR_PIM_XPATH, snprintf(ecmp_xpath, sizeof(ecmp_xpath), FRR_PIM_XPATH,
"frr-pim:pimd", "pim", vrfname); "frr-pim:pimd", "pim", vrfname);
@ -8124,23 +7911,13 @@ DEFUN (ip_pim_ecmp_rebalance,
"Enable PIM ECMP \n" "Enable PIM ECMP \n"
"Enable PIM ECMP Rebalance\n") "Enable PIM ECMP Rebalance\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char ecmp_xpath[XPATH_MAXLEN]; char ecmp_xpath[XPATH_MAXLEN];
char ecmp_rebalance_xpath[XPATH_MAXLEN]; char ecmp_rebalance_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(ecmp_xpath, sizeof(ecmp_xpath), FRR_PIM_XPATH, snprintf(ecmp_xpath, sizeof(ecmp_xpath), FRR_PIM_XPATH,
"frr-pim:pimd", "pim", vrfname); "frr-pim:pimd", "pim", vrfname);
@ -8166,22 +7943,12 @@ DEFUN (no_ip_pim_ecmp_rebalance,
"Disable PIM ECMP \n" "Disable PIM ECMP \n"
"Disable PIM ECMP Rebalance\n") "Disable PIM ECMP Rebalance\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char ecmp_rebalance_xpath[XPATH_MAXLEN]; char ecmp_rebalance_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(ecmp_rebalance_xpath, sizeof(ecmp_rebalance_xpath), snprintf(ecmp_rebalance_xpath, sizeof(ecmp_rebalance_xpath),
FRR_PIM_XPATH, FRR_PIM_XPATH,
@ -9863,23 +9630,13 @@ ALIAS(no_ip_pim_bfd, no_ip_pim_bfd_param_cmd,
"Source address for TCP connection\n" "Source address for TCP connection\n"
"local ip address\n") "local ip address\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char temp_xpath[XPATH_MAXLEN]; char temp_xpath[XPATH_MAXLEN];
char msdp_peer_source_xpath[XPATH_MAXLEN]; char msdp_peer_source_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(msdp_peer_source_xpath, sizeof(msdp_peer_source_xpath), snprintf(msdp_peer_source_xpath, sizeof(msdp_peer_source_xpath),
FRR_PIM_AF_XPATH, FRR_PIM_AF_XPATH,
@ -9905,23 +9662,13 @@ DEFUN (no_ip_msdp_peer,
"Delete MSDP peer\n" "Delete MSDP peer\n"
"peer ip address\n") "peer ip address\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char msdp_peer_xpath[XPATH_MAXLEN]; char msdp_peer_xpath[XPATH_MAXLEN];
char temp_xpath[XPATH_MAXLEN]; char temp_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(msdp_peer_xpath, sizeof(msdp_peer_xpath), snprintf(msdp_peer_xpath, sizeof(msdp_peer_xpath),
FRR_PIM_AF_XPATH, FRR_PIM_AF_XPATH,
@ -9947,23 +9694,13 @@ DEFUN (ip_msdp_mesh_group_member,
"mesh group member\n" "mesh group member\n"
"peer ip address\n") "peer ip address\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char msdp_mesh_group_name_xpath[XPATH_MAXLEN]; char msdp_mesh_group_name_xpath[XPATH_MAXLEN];
char msdp_mesh_group_member_xpath[XPATH_MAXLEN]; char msdp_mesh_group_member_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(msdp_mesh_group_name_xpath, sizeof(msdp_mesh_group_name_xpath), snprintf(msdp_mesh_group_name_xpath, sizeof(msdp_mesh_group_name_xpath),
FRR_PIM_AF_XPATH, FRR_PIM_AF_XPATH,
@ -9996,7 +9733,6 @@ DEFUN (no_ip_msdp_mesh_group_member,
"mesh group member\n" "mesh group member\n"
"peer ip address\n") "peer ip address\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char pim_af_xpath[XPATH_MAXLEN]; char pim_af_xpath[XPATH_MAXLEN];
char mesh_group_xpath[XPATH_MAXLEN + 32]; char mesh_group_xpath[XPATH_MAXLEN + 32];
@ -10007,18 +9743,9 @@ DEFUN (no_ip_msdp_mesh_group_member,
const char *mesh_group_name; const char *mesh_group_name;
const struct lyd_node *member_dnode; const struct lyd_node *member_dnode;
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(pim_af_xpath, sizeof(pim_af_xpath), FRR_PIM_AF_XPATH, snprintf(pim_af_xpath, sizeof(pim_af_xpath), FRR_PIM_AF_XPATH,
"frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4"); "frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4");
@ -10084,23 +9811,13 @@ DEFUN (ip_msdp_mesh_group_source,
"mesh group local address\n" "mesh group local address\n"
"source ip address for the TCP connection\n") "source ip address for the TCP connection\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char msdp_mesh_source_ip_xpath[XPATH_MAXLEN]; char msdp_mesh_source_ip_xpath[XPATH_MAXLEN];
char msdp_mesh_group_name_xpath[XPATH_MAXLEN]; char msdp_mesh_group_name_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(msdp_mesh_group_name_xpath, sizeof(msdp_mesh_group_name_xpath), snprintf(msdp_mesh_group_name_xpath, sizeof(msdp_mesh_group_name_xpath),
FRR_PIM_AF_XPATH, FRR_PIM_AF_XPATH,
@ -10133,7 +9850,6 @@ DEFUN (no_ip_msdp_mesh_group_source,
"mesh group source\n" "mesh group source\n"
"mesh group local address\n") "mesh group local address\n")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
char msdp_mesh_xpath[XPATH_MAXLEN]; char msdp_mesh_xpath[XPATH_MAXLEN];
char source_xpath[XPATH_MAXLEN]; char source_xpath[XPATH_MAXLEN];
@ -10141,18 +9857,9 @@ DEFUN (no_ip_msdp_mesh_group_source,
char mesh_group_name_xpath[XPATH_MAXLEN]; char mesh_group_name_xpath[XPATH_MAXLEN];
const char *mesh_group_name; const char *mesh_group_name;
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
snprintf(msdp_mesh_xpath, sizeof(msdp_mesh_xpath), snprintf(msdp_mesh_xpath, sizeof(msdp_mesh_xpath),
FRR_PIM_AF_XPATH, FRR_PIM_AF_XPATH,
@ -10207,24 +9914,14 @@ DEFUN (no_ip_msdp_mesh_group,
"Delete MSDP mesh-group\n" "Delete MSDP mesh-group\n"
"mesh group name") "mesh group name")
{ {
const struct lyd_node *vrf_dnode;
const char *vrfname; const char *vrfname;
const char *mesh_group_name; const char *mesh_group_name;
char xpath[XPATH_MAXLEN]; char xpath[XPATH_MAXLEN];
char msdp_mesh_xpath[XPATH_MAXLEN]; char msdp_mesh_xpath[XPATH_MAXLEN];
if (vty->xpath_index) { vrfname = pim_cli_get_vrf_name(vty);
vrf_dnode = if (vrfname == NULL)
yang_dnode_get(vty->candidate_config->dnode, return CMD_WARNING_CONFIG_FAILED;
VTY_CURR_XPATH);
if (!vrf_dnode) {
vty_out(vty,
"%% Failed to get vrf dnode in candidate db\n");
return CMD_WARNING_CONFIG_FAILED;
}
vrfname = yang_dnode_get_string(vrf_dnode, "./name");
} else
vrfname = VRF_DEFAULT_NAME;
if (argc == 5) { if (argc == 5) {
snprintf(xpath, sizeof(xpath), FRR_PIM_AF_XPATH, "frr-pim:pimd", snprintf(xpath, sizeof(xpath), FRR_PIM_AF_XPATH, "frr-pim:pimd",

View File

@ -1562,6 +1562,26 @@ int pim_msdp_config_write(struct pim_instance *pim, struct vty *vty,
return count; return count;
} }
bool pim_msdp_peer_config_write(struct vty *vty, struct pim_instance *pim,
const char *spaces)
{
struct pim_msdp_peer *mp;
struct listnode *node;
bool written = false;
for (ALL_LIST_ELEMENTS_RO(pim->msdp.peer_list, node, mp)) {
/* Non meshed peers have the group name set to 'default'. */
if (strcmp(mp->mesh_group_name, "default"))
continue;
vty_out(vty, "%sip msdp peer %pI4 source %pI4\n", spaces,
&mp->peer, &mp->local);
written = true;
}
return written;
}
/* Enable feature including active/periodic timers etc. on the first peer /* Enable feature including active/periodic timers etc. on the first peer
* config. Till then MSDP should just stay quiet. */ * config. Till then MSDP should just stay quiet. */
static void pim_msdp_enable(struct pim_instance *pim) static void pim_msdp_enable(struct pim_instance *pim)

View File

@ -234,6 +234,8 @@ char *pim_msdp_peer_key_dump(struct pim_msdp_peer *mp, char *buf, int buf_size,
bool long_format); bool long_format);
int pim_msdp_config_write(struct pim_instance *pim, struct vty *vty, int pim_msdp_config_write(struct pim_instance *pim, struct vty *vty,
const char *spaces); const char *spaces);
bool pim_msdp_peer_config_write(struct vty *vty, struct pim_instance *pim,
const char *spaces);
void pim_msdp_peer_pkt_txed(struct pim_msdp_peer *mp); void pim_msdp_peer_pkt_txed(struct pim_msdp_peer *mp);
void pim_msdp_sa_ref(struct pim_instance *pim, struct pim_msdp_peer *mp, void pim_msdp_sa_ref(struct pim_instance *pim, struct pim_msdp_peer *mp,
struct prefix_sg *sg, struct in_addr rp); struct prefix_sg *sg, struct in_addr rp);

View File

@ -176,6 +176,7 @@ int pim_global_config_write_worker(struct pim_instance *pim, struct vty *vty)
else else
snprintf(spaces, sizeof(spaces), "%s", " "); snprintf(spaces, sizeof(spaces), "%s", " ");
writes += pim_msdp_peer_config_write(vty, pim, spaces);
writes += pim_msdp_config_write(pim, vty, spaces); writes += pim_msdp_config_write(pim, vty, spaces);
if (!pim->send_v6_secondary) { if (!pim->send_v6_secondary) {