diff options
| -rw-r--r-- | bgpd/bgp_fsm.c | 12 | ||||
| -rw-r--r-- | bgpd/bgp_route.c | 6 | ||||
| -rw-r--r-- | pimd/pim_register.c | 10 |
3 files changed, 25 insertions, 3 deletions
diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c index b0d2a8fe0e..786e953843 100644 --- a/bgpd/bgp_fsm.c +++ b/bgpd/bgp_fsm.c @@ -2137,6 +2137,7 @@ bgp_establish(struct peer_connection *connection) struct peer *other; int status; struct peer *peer = connection->peer; + struct peer *orig = peer; other = peer->doppelganger; hash_release(peer->bgp->peerhash, peer); @@ -2146,6 +2147,17 @@ bgp_establish(struct peer_connection *connection) peer = peer_xfer_conn(peer); if (!peer) { flog_err(EC_BGP_CONNECT, "%%Neighbor failed in xfer_conn"); + + /* + * A failure of peer_xfer_conn but not putting the peers + * back in the hash ends up with a situation where incoming + * connections are rejected, as that the peer is not found + * when a lookup is done + */ + (void)hash_get(orig->bgp->peerhash, orig, hash_alloc_intern); + if (other) + (void)hash_get(other->bgp->peerhash, other, + hash_alloc_intern); return BGP_FSM_FAILURE; } diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 629df2b480..c8271bf5ce 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -12793,6 +12793,8 @@ DEFPY(show_ip_bgp, show_ip_bgp_cmd, rpki_target_state = RPKI_VALID; else if (argv_find(argv, argc, "invalid", &idx)) rpki_target_state = RPKI_INVALID; + else if (argv_find(argv, argc, "notfound", &idx)) + rpki_target_state = RPKI_NOTFOUND; } /* Display prefixes with matching version numbers */ @@ -15571,8 +15573,8 @@ DEFUN (show_bgp_peerhash, struct bgp *bgp; for (ALL_LIST_ELEMENTS_RO(instances, node, bgp)) { - vty_out(vty, "BGP: %s\n", bgp->name); - hash_iterate(bgp->peerhash, show_bgp_peerhash_entry, + vty_out(vty, "BGP: %s\n", bgp->name_pretty); + hash_iterate(bgp->peerhash, show_bgp_peerhash_entry, vty); } diff --git a/pimd/pim_register.c b/pimd/pim_register.c index b3e312e047..1f69175829 100644 --- a/pimd/pim_register.c +++ b/pimd/pim_register.c @@ -494,6 +494,7 @@ int pim_register_recv(struct interface *ifp, pim_addr dest_addr, struct pim_interface *pim_ifp = ifp->info; struct pim_instance *pim = pim_ifp->pim; pim_addr rp_addr; + struct pim_rpf *rpg; if (pim_ifp->pim_passive_enable) { if (PIM_DEBUG_PIM_PACKETS) @@ -602,7 +603,14 @@ int pim_register_recv(struct interface *ifp, pim_addr dest_addr, } } - rp_addr = (RP(pim, sg.grp))->rpf_addr; + rpg = RP(pim, sg.grp); + if (!rpg) { + zlog_warn("%s: Received Register Message %pSG from %pPA on %s where the RP could not be looked up", + __func__, &sg, &src_addr, ifp->name); + return 0; + } + + rp_addr = rpg->rpf_addr; if (i_am_rp && (!pim_addr_cmp(dest_addr, rp_addr))) { sentRegisterStop = 0; |
