From 0ce04a08a3b6fc39d638e47203c78de74315b6fb Mon Sep 17 00:00:00 2001 From: Rafael Zalamena Date: Thu, 6 May 2021 11:41:08 -0300 Subject: [PATCH] pimd: allow MSDP group name 'default' Don't assign a default group name for non meshed group peers, instead use a flag. Signed-off-by: Rafael Zalamena --- pimd/pim_cmd.c | 11 +++++++---- pimd/pim_msdp.c | 28 ++++++---------------------- pimd/pim_msdp.h | 11 ++++------- pimd/pim_msdp_packet.c | 15 +++++++++------ pimd/pim_nb_config.c | 3 +-- 5 files changed, 27 insertions(+), 41 deletions(-) diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index 41d70bd274..544cc6630d 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -10149,8 +10149,10 @@ static void ip_msdp_show_peers_detail(struct pim_instance *pim, struct vty *vty, json_row = json_object_new_object(); json_object_string_add(json_row, "peer", peer_str); json_object_string_add(json_row, "local", local_str); - json_object_string_add(json_row, "meshGroupName", - mp->mesh_group_name); + if (mp->flags & PIM_MSDP_PEERF_IN_GROUP) + json_object_string_add(json_row, + "meshGroupName", + mp->mesh_group_name); json_object_string_add(json_row, "state", state_str); json_object_string_add(json_row, "upTime", timebuf); json_object_string_add(json_row, "keepAliveTimer", @@ -10174,8 +10176,9 @@ static void ip_msdp_show_peers_detail(struct pim_instance *pim, struct vty *vty, } else { vty_out(vty, "Peer : %s\n", peer_str); vty_out(vty, " Local : %s\n", local_str); - vty_out(vty, " Mesh Group : %s\n", - mp->mesh_group_name); + if (mp->flags & PIM_MSDP_PEERF_IN_GROUP) + vty_out(vty, " Mesh Group : %s\n", + mp->mesh_group_name); vty_out(vty, " State : %s\n", state_str); vty_out(vty, " Uptime : %s\n", timebuf); diff --git a/pimd/pim_msdp.c b/pimd/pim_msdp.c index 4ceee29599..e50f86dfe8 100644 --- a/pimd/pim_msdp.c +++ b/pimd/pim_msdp.c @@ -761,25 +761,6 @@ char *pim_msdp_state_dump(enum pim_msdp_peer_state state, char *buf, return buf; } -char *pim_msdp_peer_key_dump(struct pim_msdp_peer *mp, char *buf, int buf_size, - bool long_format) -{ - char peer_str[INET_ADDRSTRLEN]; - char local_str[INET_ADDRSTRLEN]; - - pim_inet4_dump("", mp->peer, peer_str, sizeof(peer_str)); - if (long_format) { - pim_inet4_dump("", mp->local, local_str, - sizeof(local_str)); - snprintf(buf, buf_size, "MSDP peer %s local %s mg %s", peer_str, - local_str, mp->mesh_group_name); - } else { - snprintf(buf, buf_size, "MSDP peer %s", peer_str); - } - - return buf; -} - static void pim_msdp_peer_state_chg_log(struct pim_msdp_peer *mp) { char state_str[PIM_MSDP_STATE_STRLEN]; @@ -1082,7 +1063,10 @@ struct pim_msdp_peer *pim_msdp_peer_new(struct pim_instance *pim, /* XXX: originator_id setting needs to move to the mesh group */ pim->msdp.originator_id = *local; pim_msdp_addr2su(&mp->su_local, mp->local); - mp->mesh_group_name = XSTRDUP(MTYPE_PIM_MSDP_MG_NAME, mesh_group_name); + if (mesh_group_name) + mp->mesh_group_name = + XSTRDUP(MTYPE_PIM_MSDP_MG_NAME, mesh_group_name); + mp->state = PIM_MSDP_INACTIVE; mp->fd = -1; strlcpy(mp->last_reset, "-", sizeof(mp->last_reset)); @@ -1355,8 +1339,8 @@ bool pim_msdp_peer_config_write(struct vty *vty, struct pim_instance *pim, 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, MSDP_SOLO_PEER_GROUP_NAME)) + /* Skip meshed group peers. */ + if (mp->flags & PIM_MSDP_PEERF_IN_GROUP) continue; vty_out(vty, "%sip msdp peer %pI4 source %pI4\n", spaces, diff --git a/pimd/pim_msdp.h b/pimd/pim_msdp.h index b9b6e0cc36..1a133fd260 100644 --- a/pimd/pim_msdp.h +++ b/pimd/pim_msdp.h @@ -97,7 +97,9 @@ enum pim_msdp_peer_flags { PIM_MSDP_PEERF_NONE = 0, PIM_MSDP_PEERF_LISTENER = (1 << 0), #define PIM_MSDP_PEER_IS_LISTENER(mp) (mp->flags & PIM_MSDP_PEERF_LISTENER) - PIM_MSDP_PEERF_SA_JUST_SENT = (1 << 1) + PIM_MSDP_PEERF_SA_JUST_SENT = (1 << 1), + /** Flag to signalize that peer belongs to a group. */ + PIM_MSDP_PEERF_IN_GROUP = (1 << 2), }; struct pim_msdp_peer { @@ -231,8 +233,6 @@ void pim_msdp_peer_pkt_rxed(struct pim_msdp_peer *mp); void pim_msdp_peer_stop_tcp_conn(struct pim_msdp_peer *mp, bool chg_state); void pim_msdp_peer_reset_tcp_conn(struct pim_msdp_peer *mp, const char *rc_str); int pim_msdp_write(struct thread *thread); -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, @@ -282,16 +282,13 @@ struct pim_msdp_mg_mbr *pim_msdp_mg_mbr_add(struct pim_instance *pim, */ void pim_msdp_mg_mbr_del(struct pim_msdp_mg *mg, struct pim_msdp_mg_mbr *mbr); -#define MSDP_SOLO_PEER_GROUP_NAME "default" - /** * Allocates MSDP peer data structure and starts state machine. * * \param pim PIM instance * \param peer_addr peer address * \param local_addr local listening address - * \param mesh_group_name mesh group name (or `MSDP_SOLO_PEER_GROUP_NAME` for - * peers without group). + * \param mesh_group_name mesh group name (or `NULL` for peers without group). */ struct pim_msdp_peer *pim_msdp_peer_new(struct pim_instance *pim, const struct in_addr *peer_addr, diff --git a/pimd/pim_msdp_packet.c b/pimd/pim_msdp_packet.c index 48f1c864af..6d49708827 100644 --- a/pimd/pim_msdp_packet.c +++ b/pimd/pim_msdp_packet.c @@ -522,12 +522,15 @@ static void pim_msdp_pkt_sa_rx_one(struct pim_msdp_peer *mp, struct in_addr rp) * If the message group is not set, i.e. "default", then we assume that * the message must be forwarded.*/ for (ALL_LIST_ELEMENTS_RO(mp->pim->msdp.peer_list, peer_node, peer)) { - if (!pim_msdp_peer_rpf_check(peer, rp) - && (strcmp(mp->mesh_group_name, peer->mesh_group_name) - || !strcmp(mp->mesh_group_name, - MSDP_SOLO_PEER_GROUP_NAME))) { - pim_msdp_pkt_sa_tx_one_to_one_peer(peer, rp, sg); - } + /* Not a RPF peer, so skip it. */ + if (pim_msdp_peer_rpf_check(peer, rp)) + continue; + /* Don't forward inside the meshed group. */ + if ((mp->flags & PIM_MSDP_PEERF_IN_GROUP) + && strcmp(mp->mesh_group_name, peer->mesh_group_name) == 0) + continue; + + pim_msdp_pkt_sa_tx_one_to_one_peer(peer, rp, sg); } } diff --git a/pimd/pim_nb_config.c b/pimd/pim_nb_config.c index d91aa61e78..3afa6e7e16 100644 --- a/pimd/pim_nb_config.c +++ b/pimd/pim_nb_config.c @@ -1121,8 +1121,7 @@ int routing_control_plane_protocols_control_plane_protocol_pim_address_family_ms yang_dnode_get_ip(&peer_ip, args->dnode, "./peer-ip"); yang_dnode_get_ip(&source_ip, args->dnode, "./source-ip"); mp = pim_msdp_peer_new(pim, &peer_ip.ipaddr_v4, - &source_ip.ipaddr_v4, - MSDP_SOLO_PEER_GROUP_NAME); + &source_ip.ipaddr_v4, NULL); nb_running_set_entry(args->dnode, mp); break; }