diff options
Diffstat (limited to 'pimd/pim_msdp.c')
| -rw-r--r-- | pimd/pim_msdp.c | 146 |
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", |
