summaryrefslogtreecommitdiff
path: root/pimd/pim_msdp.c
diff options
context:
space:
mode:
Diffstat (limited to 'pimd/pim_msdp.c')
-rw-r--r--pimd/pim_msdp.c146
1 files changed, 45 insertions, 101 deletions
diff --git a/pimd/pim_msdp.c b/pimd/pim_msdp.c
index 095c6de549..da8916ddbf 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("<peer?>", mp->peer, peer_str, sizeof(peer_str));
- if (long_format) {
- pim_inet4_dump("<local?>", 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];
@@ -937,7 +918,7 @@ static void pim_msdp_peer_hold_timer_setup(struct pim_msdp_peer *mp, bool start)
THREAD_OFF(mp->hold_timer);
if (start) {
thread_add_timer(pim->msdp.master, pim_msdp_peer_hold_timer_cb,
- mp, PIM_MSDP_PEER_HOLD_TIME, &mp->hold_timer);
+ mp, pim->msdp.hold_time, &mp->hold_timer);
}
}
@@ -963,7 +944,7 @@ static void pim_msdp_peer_ka_timer_setup(struct pim_msdp_peer *mp, bool start)
if (start) {
thread_add_timer(mp->pim->msdp.master,
pim_msdp_peer_ka_timer_cb, mp,
- PIM_MSDP_PEER_KA_TIME, &mp->ka_timer);
+ mp->pim->msdp.keep_alive, &mp->ka_timer);
}
}
@@ -1025,9 +1006,9 @@ static void pim_msdp_peer_cr_timer_setup(struct pim_msdp_peer *mp, bool start)
{
THREAD_OFF(mp->cr_timer);
if (start) {
- thread_add_timer(
- mp->pim->msdp.master, pim_msdp_peer_cr_timer_cb, mp,
- PIM_MSDP_PEER_CONNECT_RETRY_TIME, &mp->cr_timer);
+ thread_add_timer(mp->pim->msdp.master,
+ pim_msdp_peer_cr_timer_cb, mp,
+ mp->pim->msdp.connection_retry, &mp->cr_timer);
}
}
@@ -1063,11 +1044,10 @@ static void pim_msdp_addr2su(union sockunion *su, struct in_addr addr)
}
/* 11.2.A1: create a new peer and transition state to listen or connecting */
-static enum pim_msdp_err pim_msdp_peer_new(struct pim_instance *pim,
- struct in_addr peer_addr,
- struct in_addr local_addr,
- const char *mesh_group_name,
- struct pim_msdp_peer **mp_p)
+struct pim_msdp_peer *pim_msdp_peer_add(struct pim_instance *pim,
+ const struct in_addr *peer,
+ const struct in_addr *local,
+ const char *mesh_group_name)
{
struct pim_msdp_peer *mp;
@@ -1076,14 +1056,17 @@ static enum pim_msdp_err pim_msdp_peer_new(struct pim_instance *pim,
mp = XCALLOC(MTYPE_PIM_MSDP_PEER, sizeof(*mp));
mp->pim = pim;
- mp->peer = peer_addr;
+ mp->peer = *peer;
pim_inet4_dump("<peer?>", mp->peer, mp->key_str, sizeof(mp->key_str));
pim_msdp_addr2su(&mp->su_peer, mp->peer);
- mp->local = local_addr;
+ mp->local = *local;
/* XXX: originator_id setting needs to move to the mesh group */
- pim->msdp.originator_id = local_addr;
+ 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));
@@ -1112,10 +1095,7 @@ static enum pim_msdp_err pim_msdp_peer_new(struct pim_instance *pim,
} else {
pim_msdp_peer_connect(mp);
}
- if (mp_p) {
- *mp_p = mp;
- }
- return PIM_MSDP_ERR_NONE;
+ return mp;
}
struct pim_msdp_peer *pim_msdp_peer_find(struct pim_instance *pim,
@@ -1127,43 +1107,6 @@ struct pim_msdp_peer *pim_msdp_peer_find(struct pim_instance *pim,
return hash_lookup(pim->msdp.peer_hash, &lookup);
}
-/* add peer configuration if it doesn't already exist */
-enum pim_msdp_err pim_msdp_peer_add(struct pim_instance *pim,
- struct in_addr peer_addr,
- struct in_addr local_addr,
- const char *mesh_group_name,
- struct pim_msdp_peer **mp_p)
-{
- struct pim_msdp_peer *mp;
-
- if (mp_p) {
- *mp_p = NULL;
- }
-
- if (peer_addr.s_addr == local_addr.s_addr) {
- /* skip session setup if config is invalid */
- if (PIM_DEBUG_MSDP_EVENTS) {
- char peer_str[INET_ADDRSTRLEN];
-
- pim_inet4_dump("<peer?>", peer_addr, peer_str,
- sizeof(peer_str));
- zlog_debug("%s add skipped as DIP=SIP", peer_str);
- }
- return PIM_MSDP_ERR_SIP_EQ_DIP;
- }
-
- mp = pim_msdp_peer_find(pim, peer_addr);
- if (mp) {
- if (mp_p) {
- *mp_p = mp;
- }
- return PIM_MSDP_ERR_PEER_EXISTS;
- }
-
- return pim_msdp_peer_new(pim, peer_addr, local_addr, mesh_group_name,
- mp_p);
-}
-
/* release all mem associated with a peer */
static void pim_msdp_peer_free(struct pim_msdp_peer *mp)
{
@@ -1188,36 +1131,38 @@ static void pim_msdp_peer_free(struct pim_msdp_peer *mp)
}
/* delete the peer config */
-static enum pim_msdp_err pim_msdp_peer_do_del(struct pim_msdp_peer *mp)
+void pim_msdp_peer_del(struct pim_msdp_peer **mp)
{
+ if (*mp == NULL)
+ return;
+
/* stop the tcp connection and shutdown all timers */
- pim_msdp_peer_stop_tcp_conn(mp, true /* chg_state */);
+ pim_msdp_peer_stop_tcp_conn(*mp, true /* chg_state */);
/* remove the session from various tables */
- listnode_delete(mp->pim->msdp.peer_list, mp);
- hash_release(mp->pim->msdp.peer_hash, mp);
+ listnode_delete((*mp)->pim->msdp.peer_list, *mp);
+ hash_release((*mp)->pim->msdp.peer_hash, *mp);
if (PIM_DEBUG_MSDP_EVENTS) {
- zlog_debug("MSDP peer %s deleted", mp->key_str);
+ zlog_debug("MSDP peer %s deleted", (*mp)->key_str);
}
/* free up any associated memory */
- pim_msdp_peer_free(mp);
-
- return PIM_MSDP_ERR_NONE;
+ pim_msdp_peer_free(*mp);
+ *mp = NULL;
}
-enum pim_msdp_err pim_msdp_peer_del(struct pim_instance *pim,
- struct in_addr peer_addr)
+void pim_msdp_peer_change_source(struct pim_msdp_peer *mp,
+ const struct in_addr *addr)
{
- struct pim_msdp_peer *mp;
+ pim_msdp_peer_stop_tcp_conn(mp, true);
- mp = pim_msdp_peer_find(pim, peer_addr);
- if (!mp) {
- return PIM_MSDP_ERR_NO_PEER;
- }
+ mp->local = *addr;
- return pim_msdp_peer_do_del(mp);
+ if (PIM_MSDP_PEER_IS_LISTENER(mp))
+ pim_msdp_peer_listen(mp);
+ else
+ pim_msdp_peer_connect(mp);
}
/* peer hash and peer list helpers */
@@ -1272,6 +1217,7 @@ void pim_msdp_mg_free(struct pim_instance *pim, struct pim_msdp_mg **mgp)
if ((*mgp)->mbr_list)
list_delete(&(*mgp)->mbr_list);
+ SLIST_REMOVE(&pim->msdp.mglist, (*mgp), pim_msdp_mg, mg_entry);
XFREE(MTYPE_PIM_MSDP_MG, (*mgp));
}
@@ -1319,7 +1265,7 @@ void pim_msdp_mg_mbr_del(struct pim_msdp_mg *mg, struct pim_msdp_mg_mbr *mbr)
{
/* Delete active peer session if any */
if (mbr->mp) {
- pim_msdp_peer_do_del(mbr->mp);
+ pim_msdp_peer_del(&mbr->mp);
}
listnode_delete(mg->mbr_list, mbr);
@@ -1342,10 +1288,8 @@ static void pim_msdp_src_del(struct pim_msdp_mg *mg)
/* SIP is being removed - tear down all active peer sessions */
for (ALL_LIST_ELEMENTS_RO(mg->mbr_list, mbr_node, mbr)) {
- if (mbr->mp) {
- pim_msdp_peer_do_del(mbr->mp);
- mbr->mp = NULL;
- }
+ if (mbr->mp)
+ pim_msdp_peer_del(&mbr->mp);
}
if (PIM_DEBUG_MSDP_EVENTS) {
zlog_debug("MSDP mesh-group %s src cleared",
@@ -1396,8 +1340,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, "default"))
+ /* Skip meshed group peers. */
+ if (mp->flags & PIM_MSDP_PEERF_IN_GROUP)
continue;
vty_out(vty, "%sip msdp peer %pI4 source %pI4\n", spaces,
@@ -1504,8 +1448,8 @@ void pim_msdp_mg_src_add(struct pim_instance *pim, struct pim_msdp_mg *mg,
/* Create data structures and start TCP connection. */
for (ALL_LIST_ELEMENTS_RO(mg->mbr_list, mbr_node, mbr))
- pim_msdp_peer_add(pim, mbr->mbr_ip, mg->src_ip,
- mg->mesh_group_name, &mbr->mp);
+ mbr->mp = pim_msdp_peer_add(pim, &mbr->mbr_ip, &mg->src_ip,
+ mg->mesh_group_name);
if (PIM_DEBUG_MSDP_EVENTS)
zlog_debug("MSDP mesh-group %s src %pI4 set",
@@ -1524,8 +1468,8 @@ struct pim_msdp_mg_mbr *pim_msdp_mg_mbr_add(struct pim_instance *pim,
/* if valid SIP has been configured add peer session */
if (mg->src_ip.s_addr != INADDR_ANY)
- pim_msdp_peer_add(pim, mbr->mbr_ip, mg->src_ip,
- mg->mesh_group_name, &mbr->mp);
+ mbr->mp = pim_msdp_peer_add(pim, &mbr->mbr_ip, &mg->src_ip,
+ mg->mesh_group_name);
if (PIM_DEBUG_MSDP_EVENTS)
zlog_debug("MSDP mesh-group %s mbr %pI4 created",