mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-14 14:17:20 +00:00
Merge pull request #8614 from opensourcerouting/msdp-fixes
pimd: MSDP trivial fixes
This commit is contained in:
commit
2fd97fd87d
@ -154,20 +154,6 @@ Certain signals have special meanings to *pimd*.
|
||||
urib-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)]
|
||||
|
||||
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
|
||||
========================================================
|
||||
|
||||
.. 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
|
||||
address.
|
||||
* MSDP peering: when there is one or more peers that are not fully meshed. SAs
|
||||
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
|
||||
|
||||
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
|
||||
|
539
pimd/pim_cmd.c
539
pimd/pim_cmd.c
@ -3828,6 +3828,31 @@ static void clear_interfaces(struct pim_instance *pim)
|
||||
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,
|
||||
clear_ip_interfaces_cmd,
|
||||
"clear ip interfaces [vrf NAME]",
|
||||
@ -6906,25 +6931,13 @@ DEFUN (ip_pim_spt_switchover_infinity,
|
||||
"SPT-Switchover\n"
|
||||
"Never switch to SPT Tree\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char spt_plist_xpath[XPATH_MAXLEN];
|
||||
char spt_action_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(spt_plist_xpath, sizeof(spt_plist_xpath),
|
||||
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 name\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char spt_plist_xpath[XPATH_MAXLEN];
|
||||
char spt_action_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(spt_plist_xpath, sizeof(spt_plist_xpath),
|
||||
FRR_PIM_AF_XPATH, "frr-pim:pimd", "pim", vrfname,
|
||||
@ -7006,25 +7007,13 @@ DEFUN (no_ip_pim_spt_switchover_infinity,
|
||||
"SPT_Switchover\n"
|
||||
"Never switch to SPT Tree\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char spt_plist_xpath[XPATH_MAXLEN];
|
||||
char spt_action_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(spt_plist_xpath, sizeof(spt_plist_xpath),
|
||||
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 name\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char spt_plist_xpath[XPATH_MAXLEN];
|
||||
char spt_action_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(spt_plist_xpath, sizeof(spt_plist_xpath),
|
||||
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"
|
||||
"Prefix-List name\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char reg_alist_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(reg_alist_xpath, sizeof(reg_alist_xpath),
|
||||
FRR_PIM_AF_XPATH, "frr-pim:pimd", "pim", vrfname,
|
||||
@ -7214,22 +7181,12 @@ DEFUN (ip_pim_rp_keep_alive,
|
||||
"Keep alive Timer\n"
|
||||
"Seconds\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char rp_ka_timer_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(rp_ka_timer_xpath, sizeof(rp_ka_timer_xpath),
|
||||
FRR_PIM_XPATH, "frr-pim:pimd", "pim", vrfname);
|
||||
@ -7252,26 +7209,15 @@ DEFUN (no_ip_pim_rp_keep_alive,
|
||||
"Keep alive Timer\n"
|
||||
"Seconds\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char rp_ka_timer[5];
|
||||
char rp_ka_timer_xpath[XPATH_MAXLEN];
|
||||
|
||||
snprintf(rp_ka_timer, sizeof(rp_ka_timer), "%d", PIM_KEEPALIVE_PERIOD);
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(rp_ka_timer_xpath, sizeof(rp_ka_timer_xpath),
|
||||
FRR_PIM_XPATH, "frr-pim:pimd", "pim", vrfname);
|
||||
@ -7292,22 +7238,12 @@ DEFUN (ip_pim_keep_alive,
|
||||
"Keep alive Timer\n"
|
||||
"Seconds\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char ka_timer_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(ka_timer_xpath, sizeof(ka_timer_xpath), FRR_PIM_XPATH,
|
||||
"frr-pim:pimd", "pim", vrfname);
|
||||
@ -7328,25 +7264,15 @@ DEFUN (no_ip_pim_keep_alive,
|
||||
"Keep alive Timer\n"
|
||||
"Seconds\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char ka_timer[5];
|
||||
char ka_timer_xpath[XPATH_MAXLEN];
|
||||
|
||||
snprintf(ka_timer, sizeof(ka_timer), "%d", PIM_KEEPALIVE_PERIOD);
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(ka_timer_xpath, sizeof(ka_timer_xpath), FRR_PIM_XPATH,
|
||||
"frr-pim:pimd", "pim", vrfname);
|
||||
@ -7428,22 +7354,12 @@ DEFUN (ip_pim_v6_secondary,
|
||||
"pim multicast routing\n"
|
||||
"Send v6 secondary addresses\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char send_v6_secondary_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(send_v6_secondary_xpath, sizeof(send_v6_secondary_xpath),
|
||||
FRR_PIM_AF_XPATH,
|
||||
@ -7465,22 +7381,12 @@ DEFUN (no_ip_pim_v6_secondary,
|
||||
"pim multicast routing\n"
|
||||
"Send v6 secondary addresses\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char send_v6_secondary_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(send_v6_secondary_xpath, sizeof(send_v6_secondary_xpath),
|
||||
FRR_PIM_AF_XPATH,
|
||||
@ -7503,7 +7409,6 @@ DEFUN (ip_pim_rp,
|
||||
"ip address of RP\n"
|
||||
"Group Address range to cover\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
int idx_rp = 3, idx_group = 4;
|
||||
char rp_group_xpath[XPATH_MAXLEN];
|
||||
@ -7539,20 +7444,9 @@ DEFUN (ip_pim_rp,
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
}
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(rp_group_xpath, sizeof(rp_group_xpath),
|
||||
FRR_PIM_STATIC_RP_XPATH,
|
||||
@ -7576,24 +7470,12 @@ DEFUN (ip_pim_rp_prefix_list,
|
||||
"Name of a prefix-list\n")
|
||||
{
|
||||
int idx_rp = 3, idx_plist = 5;
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char rp_plist_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(rp_plist_xpath, sizeof(rp_plist_xpath),
|
||||
FRR_PIM_STATIC_RP_XPATH,
|
||||
@ -7623,24 +7505,12 @@ DEFUN (no_ip_pim_rp,
|
||||
char group_list_xpath[XPATH_MAXLEN + 32];
|
||||
char group_xpath[XPATH_MAXLEN + 64];
|
||||
char rp_xpath[XPATH_MAXLEN];
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
const struct lyd_node *group_dnode;
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(rp_xpath, sizeof(rp_xpath), FRR_PIM_STATIC_RP_XPATH,
|
||||
"frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4",
|
||||
@ -7683,23 +7553,13 @@ DEFUN (no_ip_pim_rp_prefix_list,
|
||||
int idx_plist = 6;
|
||||
char rp_xpath[XPATH_MAXLEN];
|
||||
char plist_xpath[XPATH_MAXLEN];
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
const struct lyd_node *plist_dnode;
|
||||
const char *plist;
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(rp_xpath, sizeof(rp_xpath), FRR_PIM_STATIC_RP_XPATH,
|
||||
"frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4",
|
||||
@ -7736,22 +7596,12 @@ DEFUN (ip_pim_ssm_prefix_list,
|
||||
"group range prefix-list filter\n"
|
||||
"Name of a prefix-list\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char ssm_plist_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(ssm_plist_xpath, sizeof(ssm_plist_xpath), FRR_PIM_AF_XPATH,
|
||||
"frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4");
|
||||
@ -7771,22 +7621,12 @@ DEFUN (no_ip_pim_ssm_prefix_list,
|
||||
"Source Specific Multicast\n"
|
||||
"group range prefix-list filter\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char ssm_plist_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(ssm_plist_xpath, sizeof(ssm_plist_xpath),
|
||||
FRR_PIM_AF_XPATH,
|
||||
@ -7808,27 +7648,14 @@ DEFUN (no_ip_pim_ssm_prefix_list_name,
|
||||
"group range prefix-list filter\n"
|
||||
"Name of a prefix-list\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
const struct lyd_node *ssm_plist_dnode;
|
||||
char ssm_plist_xpath[XPATH_MAXLEN];
|
||||
const char *ssm_plist_name;
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(ssm_plist_xpath, sizeof(ssm_plist_xpath),
|
||||
FRR_PIM_AF_XPATH,
|
||||
@ -7982,22 +7809,12 @@ DEFUN (ip_ssmpingd,
|
||||
{
|
||||
int idx_ipv4 = 2;
|
||||
const char *source_str = (argc == 3) ? argv[idx_ipv4]->arg : "0.0.0.0";
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char ssmpingd_ip_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(ssmpingd_ip_xpath, sizeof(ssmpingd_ip_xpath),
|
||||
FRR_PIM_AF_XPATH,
|
||||
@ -8019,24 +7836,14 @@ DEFUN (no_ip_ssmpingd,
|
||||
CONF_SSMPINGD_STR
|
||||
"Source address\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
int idx_ipv4 = 3;
|
||||
const char *source_str = (argc == 4) ? argv[idx_ipv4]->arg : "0.0.0.0";
|
||||
char ssmpingd_ip_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(ssmpingd_ip_xpath, sizeof(ssmpingd_ip_xpath),
|
||||
FRR_PIM_AF_XPATH,
|
||||
@ -8057,22 +7864,12 @@ DEFUN (ip_pim_ecmp,
|
||||
"pim multicast routing\n"
|
||||
"Enable PIM ECMP \n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char ecmp_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(ecmp_xpath, sizeof(ecmp_xpath), FRR_PIM_XPATH,
|
||||
"frr-pim:pimd", "pim", vrfname);
|
||||
@ -8090,22 +7887,12 @@ DEFUN (no_ip_pim_ecmp,
|
||||
"pim multicast routing\n"
|
||||
"Disable PIM ECMP \n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char ecmp_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(ecmp_xpath, sizeof(ecmp_xpath), FRR_PIM_XPATH,
|
||||
"frr-pim:pimd", "pim", vrfname);
|
||||
@ -8124,23 +7911,13 @@ DEFUN (ip_pim_ecmp_rebalance,
|
||||
"Enable PIM ECMP \n"
|
||||
"Enable PIM ECMP Rebalance\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char ecmp_xpath[XPATH_MAXLEN];
|
||||
char ecmp_rebalance_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(ecmp_xpath, sizeof(ecmp_xpath), FRR_PIM_XPATH,
|
||||
"frr-pim:pimd", "pim", vrfname);
|
||||
@ -8166,22 +7943,12 @@ DEFUN (no_ip_pim_ecmp_rebalance,
|
||||
"Disable PIM ECMP \n"
|
||||
"Disable PIM ECMP Rebalance\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char ecmp_rebalance_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(ecmp_rebalance_xpath, sizeof(ecmp_rebalance_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"
|
||||
"local ip address\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char temp_xpath[XPATH_MAXLEN];
|
||||
char msdp_peer_source_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(msdp_peer_source_xpath, sizeof(msdp_peer_source_xpath),
|
||||
FRR_PIM_AF_XPATH,
|
||||
@ -9905,23 +9662,13 @@ DEFUN (no_ip_msdp_peer,
|
||||
"Delete MSDP peer\n"
|
||||
"peer ip address\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char msdp_peer_xpath[XPATH_MAXLEN];
|
||||
char temp_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(msdp_peer_xpath, sizeof(msdp_peer_xpath),
|
||||
FRR_PIM_AF_XPATH,
|
||||
@ -9947,23 +9694,13 @@ DEFUN (ip_msdp_mesh_group_member,
|
||||
"mesh group member\n"
|
||||
"peer ip address\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char msdp_mesh_group_name_xpath[XPATH_MAXLEN];
|
||||
char msdp_mesh_group_member_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(msdp_mesh_group_name_xpath, sizeof(msdp_mesh_group_name_xpath),
|
||||
FRR_PIM_AF_XPATH,
|
||||
@ -9996,7 +9733,6 @@ DEFUN (no_ip_msdp_mesh_group_member,
|
||||
"mesh group member\n"
|
||||
"peer ip address\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char pim_af_xpath[XPATH_MAXLEN];
|
||||
char mesh_group_xpath[XPATH_MAXLEN + 32];
|
||||
@ -10007,18 +9743,9 @@ DEFUN (no_ip_msdp_mesh_group_member,
|
||||
const char *mesh_group_name;
|
||||
const struct lyd_node *member_dnode;
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(pim_af_xpath, sizeof(pim_af_xpath), FRR_PIM_AF_XPATH,
|
||||
"frr-pim:pimd", "pim", vrfname, "frr-routing:ipv4");
|
||||
@ -10084,23 +9811,13 @@ DEFUN (ip_msdp_mesh_group_source,
|
||||
"mesh group local address\n"
|
||||
"source ip address for the TCP connection\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char msdp_mesh_source_ip_xpath[XPATH_MAXLEN];
|
||||
char msdp_mesh_group_name_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(msdp_mesh_group_name_xpath, sizeof(msdp_mesh_group_name_xpath),
|
||||
FRR_PIM_AF_XPATH,
|
||||
@ -10133,7 +9850,6 @@ DEFUN (no_ip_msdp_mesh_group_source,
|
||||
"mesh group source\n"
|
||||
"mesh group local address\n")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
char msdp_mesh_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];
|
||||
const char *mesh_group_name;
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
snprintf(msdp_mesh_xpath, sizeof(msdp_mesh_xpath),
|
||||
FRR_PIM_AF_XPATH,
|
||||
@ -10207,24 +9914,14 @@ DEFUN (no_ip_msdp_mesh_group,
|
||||
"Delete MSDP mesh-group\n"
|
||||
"mesh group name")
|
||||
{
|
||||
const struct lyd_node *vrf_dnode;
|
||||
const char *vrfname;
|
||||
const char *mesh_group_name;
|
||||
char xpath[XPATH_MAXLEN];
|
||||
char msdp_mesh_xpath[XPATH_MAXLEN];
|
||||
|
||||
if (vty->xpath_index) {
|
||||
vrf_dnode =
|
||||
yang_dnode_get(vty->candidate_config->dnode,
|
||||
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;
|
||||
vrfname = pim_cli_get_vrf_name(vty);
|
||||
if (vrfname == NULL)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
if (argc == 5) {
|
||||
snprintf(xpath, sizeof(xpath), FRR_PIM_AF_XPATH, "frr-pim:pimd",
|
||||
|
@ -1562,6 +1562,26 @@ int pim_msdp_config_write(struct pim_instance *pim, struct vty *vty,
|
||||
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
|
||||
* config. Till then MSDP should just stay quiet. */
|
||||
static void pim_msdp_enable(struct pim_instance *pim)
|
||||
|
@ -234,6 +234,8 @@ char *pim_msdp_peer_key_dump(struct pim_msdp_peer *mp, char *buf, int buf_size,
|
||||
bool long_format);
|
||||
int pim_msdp_config_write(struct pim_instance *pim, struct vty *vty,
|
||||
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_sa_ref(struct pim_instance *pim, struct pim_msdp_peer *mp,
|
||||
struct prefix_sg *sg, struct in_addr rp);
|
||||
|
@ -176,6 +176,7 @@ int pim_global_config_write_worker(struct pim_instance *pim, struct vty *vty)
|
||||
else
|
||||
snprintf(spaces, sizeof(spaces), "%s", " ");
|
||||
|
||||
writes += pim_msdp_peer_config_write(vty, pim, spaces);
|
||||
writes += pim_msdp_config_write(pim, vty, spaces);
|
||||
|
||||
if (!pim->send_v6_secondary) {
|
||||
|
Loading…
Reference in New Issue
Block a user