diff --git a/ospfd/ospf_flood.c b/ospfd/ospf_flood.c index 848f340750..fb3fb21e08 100644 --- a/ospfd/ospf_flood.c +++ b/ospfd/ospf_flood.c @@ -638,13 +638,15 @@ int ospf_flood_through_interface(struct ospf_interface *oi, if (oi->type == OSPF_IFTYPE_NBMA) { struct ospf_neighbor *nbr; - for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) - if ((nbr = rn->info) != NULL) - if (nbr != oi->nbr_self - && nbr->state >= NSM_Exchange) - ospf_ls_upd_send_lsa( - nbr, lsa, - OSPF_SEND_PACKET_DIRECT); + for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) { + nbr = rn->info; + + if (!nbr) + continue; + if (nbr != oi->nbr_self && nbr->state >= NSM_Exchange) + ospf_ls_upd_send_lsa(nbr, lsa, + OSPF_SEND_PACKET_DIRECT); + } } else ospf_ls_upd_send_lsa(oi->nbr_self, lsa, OSPF_SEND_PACKET_INDIRECT); @@ -991,18 +993,20 @@ static void ospf_ls_retransmit_delete_nbr_if(struct ospf_interface *oi, struct ospf_lsa *lsr; if (ospf_if_is_enable(oi)) - for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) + for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) { /* If LSA find in LS-retransmit list, then remove it. */ - if ((nbr = rn->info) != NULL) { - lsr = ospf_ls_retransmit_lookup(nbr, lsa); + nbr = rn->info; - /* If LSA find in ls-retransmit list, remove it. - */ - if (lsr != NULL - && lsr->data->ls_seqnum - == lsa->data->ls_seqnum) - ospf_ls_retransmit_delete(nbr, lsr); - } + if (!nbr) + continue; + + lsr = ospf_ls_retransmit_lookup(nbr, lsa); + + /* If LSA find in ls-retransmit list, remove it. */ + if (lsr != NULL && + lsr->data->ls_seqnum == lsa->data->ls_seqnum) + ospf_ls_retransmit_delete(nbr, lsr); + } } void ospf_ls_retransmit_delete_nbr_area(struct ospf_area *area, diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c index 633ab05131..a4f4cd216a 100644 --- a/ospfd/ospf_interface.c +++ b/ospfd/ospf_interface.c @@ -66,15 +66,16 @@ int ospf_interface_neighbor_count(struct ospf_interface *oi) for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) { nbr = rn->info; - if (nbr) { - /* Do not show myself. */ - if (nbr == oi->nbr_self) - continue; - /* Down state is not shown. */ - if (nbr->state == NSM_Down) - continue; - count++; - } + if (!nbr) + continue; + + /* Do not show myself. */ + if (nbr == oi->nbr_self) + continue; + /* Down state is not shown. */ + if (nbr->state == NSM_Down) + continue; + count++; } return count; @@ -315,10 +316,11 @@ void ospf_if_cleanup(struct ospf_interface *oi) } /* send Neighbor event KillNbr to all associated neighbors. */ - for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) + for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) { if ((nbr = rn->info) != NULL) if (nbr != oi->nbr_self) OSPF_NSM_EVENT_EXECUTE(nbr, NSM_KillNbr); + } /* Cleanup Link State Acknowlegdment list. */ for (ALL_LIST_ELEMENTS(oi->ls_ack, node, nnode, lsa)) diff --git a/ospfd/ospf_packet.c b/ospfd/ospf_packet.c index 907cb15ed5..c5e26fa371 100644 --- a/ospfd/ospf_packet.c +++ b/ospfd/ospf_packet.c @@ -3349,49 +3349,44 @@ static int ospf_make_hello(struct ospf_interface *oi, struct stream *s) stream_put_ipv4(s, BDR(oi).s_addr); /* Add neighbor seen. */ - for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) - if ((nbr = rn->info)) - if (nbr->router_id.s_addr - != INADDR_ANY) /* Ignore 0.0.0.0 node. */ - if (nbr->state - != NSM_Attempt) /* Ignore Down neighbor. */ - if (nbr->state - != NSM_Down) /* This is myself for - DR election. */ - if (!IPV4_ADDR_SAME( - &nbr->router_id, - &oi->ospf->router_id)) { - /* Check neighbor is - * sane? */ - if (nbr->d_router.s_addr - != INADDR_ANY - && IPV4_ADDR_SAME( - &nbr->d_router, - &oi->address - ->u - .prefix4) - && IPV4_ADDR_SAME( - &nbr->bd_router, - &oi->address - ->u - .prefix4)) - flag = 1; + for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) { + nbr = rn->info; - /* Hello packet overflows interface MTU. */ - if (length + sizeof(uint32_t) - > ospf_packet_max(oi)) { - flog_err( - EC_OSPF_LARGE_HELLO, - "Oversized Hello packet! Larger than MTU. Not sending it out"); - return 0; - } + if (!nbr) + continue; - stream_put_ipv4( - s, - nbr->router_id - .s_addr); - length += 4; - } + /* Ignore the 0.0.0.0 node */ + if (nbr->router_id.s_addr == INADDR_ANY) + continue; + + /* Ignore Down neighbor */ + if (nbr->state == NSM_Attempt) + continue; + + /* This is myself for DR election */ + if (nbr->state == NSM_Down) + continue; + + if (IPV4_ADDR_SAME(&nbr->router_id, &oi->ospf->router_id)) + continue; + /* Check neighbor is sane? */ + if (nbr->d_router.s_addr != INADDR_ANY && + IPV4_ADDR_SAME(&nbr->d_router, &oi->address->u.prefix4) && + IPV4_ADDR_SAME(&nbr->bd_router, &oi->address->u.prefix4)) + flag = 1; + + /* Hello packet overflows interface MTU. + */ + if (length + sizeof(uint32_t) > ospf_packet_max(oi)) { + flog_err( + EC_OSPF_LARGE_HELLO, + "Oversized Hello packet! Larger than MTU. Not sending it out"); + return 0; + } + + stream_put_ipv4(s, nbr->router_id.s_addr); + length += 4; + } /* Let neighbor generate BackupSeen. */ if (flag == 1) @@ -3772,54 +3767,44 @@ void ospf_hello_send(struct ospf_interface *oi) struct ospf_neighbor *nbr; struct route_node *rn; - for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) - if ((nbr = rn->info)) - if (nbr != oi->nbr_self) - if (nbr->state != NSM_Down) { - /* RFC 2328 Section 9.5.1 - If the router is not - eligible to become Designated - Router, - it must periodically send - Hello Packets to both the - Designated Router and the - Backup Designated Router (if - they - exist). */ - if (PRIORITY(oi) == 0 - && IPV4_ADDR_CMP( - &DR(oi), - &nbr->address.u - .prefix4) - && IPV4_ADDR_CMP( - &BDR(oi), - &nbr->address.u - .prefix4)) - continue; + for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) { + nbr = rn->info; + if (!nbr) + continue; - /* If the router is eligible to - become Designated Router, it - must periodically send Hello - Packets to all neighbors that - are also eligible. In - addition, if the router is - itself the - Designated Router or Backup - Designated Router, it must - also - send periodic Hello Packets - to all other neighbors. */ + if (nbr == oi->nbr_self) + continue; - if (nbr->priority == 0 - && oi->state == ISM_DROther) - continue; - /* if oi->state == Waiting, send - * hello to all neighbors */ - ospf_hello_send_sub( - oi, - nbr->address.u.prefix4 - .s_addr); - } + if (nbr->state == NSM_Down) + continue; + + /* + * RFC 2328 Section 9.5.1 + * If the router is not eligible to become Designated + * Router, it must periodically send Hello Packets to + * both the Designated Router and the Backup + * Designated Router (if they exist). + */ + if (PRIORITY(oi) == 0 && + IPV4_ADDR_CMP(&DR(oi), &nbr->address.u.prefix4) && + IPV4_ADDR_CMP(&BDR(oi), &nbr->address.u.prefix4)) + continue; + + /* + * If the router is eligible to become Designated + * Router, it must periodically send Hello Packets to + * all neighbors that are also eligible. In addition, + * if the router is itself the Designated Router or + * Backup Designated Router, it must also send periodic + * Hello Packets to all other neighbors. + */ + if (nbr->priority == 0 && oi->state == ISM_DROther) + continue; + + /* if oi->state == Waiting, send + * hello to all neighbors */ + ospf_hello_send_sub(oi, nbr->address.u.prefix4.s_addr); + } } else { /* Decide destination address. */ if (oi->type == OSPF_IFTYPE_VIRTUALLINK) @@ -4291,14 +4276,18 @@ void ospf_ls_ack_send_delayed(struct ospf_interface *oi) struct ospf_neighbor *nbr; struct route_node *rn; - for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) - if ((nbr = rn->info) != NULL) - if (nbr != oi->nbr_self - && nbr->state >= NSM_Exchange) - while (listcount(oi->ls_ack)) - ospf_ls_ack_send_list( - oi, oi->ls_ack, - nbr->address.u.prefix4); + for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) { + nbr = rn->info; + + if (!nbr) + continue; + + if (nbr != oi->nbr_self && nbr->state >= NSM_Exchange) + while (listcount(oi->ls_ack)) + ospf_ls_ack_send_list( + oi, oi->ls_ack, + nbr->address.u.prefix4); + } return; } if (oi->type == OSPF_IFTYPE_VIRTUALLINK) diff --git a/ospfd/ospf_sr.c b/ospfd/ospf_sr.c index 2c7c80686c..3a71e55710 100644 --- a/ospfd/ospf_sr.c +++ b/ospfd/ospf_sr.c @@ -756,13 +756,14 @@ static struct ospf_neighbor *get_neighbor_by_addr(struct ospf *top, for (ALL_LIST_ELEMENTS_RO(top->oiflist, node, oi)) for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) { nbr = rn->info; - if (nbr) - if (IPV4_ADDR_SAME(&nbr->address.u.prefix4, - &addr) - || IPV4_ADDR_SAME(&nbr->router_id, &addr)) { - route_unlock_node(rn); - return nbr; - } + if (!nbr) + continue; + + if (IPV4_ADDR_SAME(&nbr->address.u.prefix4, &addr) || + IPV4_ADDR_SAME(&nbr->router_id, &addr)) { + route_unlock_node(rn); + return nbr; + } } return NULL; } diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c index 1c22fad669..74ee37b182 100644 --- a/ospfd/ospf_vty.c +++ b/ospfd/ospf_vty.c @@ -4476,19 +4476,22 @@ static void show_ip_ospf_neighbor_sub(struct vty *vty, struct ospf_neighbor *nbr, *prev_nbr = NULL; for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) { - if ((nbr = rn->info)) { - /* Do not show myself. */ - if (nbr == oi->nbr_self) - continue; - /* Down state is not shown. */ - if (nbr->state == NSM_Down) - continue; + nbr = rn->info; - prev_nbr = nbr; + if (!nbr) + continue; - show_ip_ospf_neighbour_brief(vty, nbr, prev_nbr, json, - use_json); - } + /* Do not show myself. */ + if (nbr == oi->nbr_self) + continue; + /* Down state is not shown. */ + if (nbr->state == NSM_Down) + continue; + + prev_nbr = nbr; + + show_ip_ospf_neighbour_brief(vty, nbr, prev_nbr, json, + use_json); } } @@ -5402,14 +5405,17 @@ static int show_ip_ospf_neighbor_id_common(struct vty *vty, struct ospf *ospf, ospf_show_vrf_name(ospf, vty, json, use_vrf); for (ALL_LIST_ELEMENTS_RO(ospf->oiflist, node, oi)) { - if ((nbr = ospf_nbr_lookup_by_routerid(oi->nbrs, router_id))) { - if (is_detail) - show_ip_ospf_neighbor_detail_sub( - vty, oi, nbr, NULL, json, use_json); - else - show_ip_ospf_neighbour_brief(vty, nbr, NULL, - json, use_json); - } + nbr = ospf_nbr_lookup_by_routerid(oi->nbrs, router_id); + + if (!nbr) + continue; + + if (is_detail) + show_ip_ospf_neighbor_detail_sub(vty, oi, nbr, NULL, + json, use_json); + else + show_ip_ospf_neighbour_brief(vty, nbr, NULL, json, + use_json); } if (use_json) @@ -5498,16 +5504,19 @@ static int show_ip_ospf_neighbor_detail_common(struct vty *vty, struct ospf_neighbor *nbr, *prev_nbr = NULL; for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) { - if ((nbr = rn->info)) { - if (nbr != oi->nbr_self) { - if (nbr->state != NSM_Down) { - show_ip_ospf_neighbor_detail_sub( - vty, oi, nbr, prev_nbr, - json_nbr_sub, use_json); - } + nbr = rn->info; + + if (!nbr) + continue; + + if (nbr != oi->nbr_self) { + if (nbr->state != NSM_Down) { + show_ip_ospf_neighbor_detail_sub( + vty, oi, nbr, prev_nbr, + json_nbr_sub, use_json); } - prev_nbr = nbr; } + prev_nbr = nbr; } } @@ -5668,27 +5677,29 @@ static int show_ip_ospf_neighbor_detail_all_common(struct vty *vty, struct ospf_nbr_nbma *nbr_nbma; for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) { - if ((nbr = rn->info)) { - if (nbr != oi->nbr_self) - if (nbr->state != NSM_Down) - show_ip_ospf_neighbor_detail_sub( - vty, oi, rn->info, - prev_nbr, - json_vrf, use_json); - prev_nbr = nbr; - } + nbr = rn->info; + + if (!nbr) + continue; + + if (nbr != oi->nbr_self) + if (nbr->state != NSM_Down) + show_ip_ospf_neighbor_detail_sub( + vty, oi, rn->info, prev_nbr, + json_vrf, use_json); + prev_nbr = nbr; } - if (oi->type == OSPF_IFTYPE_NBMA) { - struct listnode *nd; + if (oi->type != OSPF_IFTYPE_NBMA) + continue; - for (ALL_LIST_ELEMENTS_RO(oi->nbr_nbma, nd, nbr_nbma)) { - if (nbr_nbma->nbr == NULL - || nbr_nbma->nbr->state == NSM_Down) - show_ip_ospf_nbr_nbma_detail_sub( - vty, oi, nbr_nbma, use_json, - json_vrf); - } + struct listnode *nd; + + for (ALL_LIST_ELEMENTS_RO(oi->nbr_nbma, nd, nbr_nbma)) { + if (nbr_nbma->nbr == NULL || + nbr_nbma->nbr->state == NSM_Down) + show_ip_ospf_nbr_nbma_detail_sub( + vty, oi, nbr_nbma, use_json, json_vrf); } } @@ -5853,19 +5864,25 @@ static int show_ip_ospf_neighbor_int_detail_common(struct vty *vty, } for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next(rn)) { - if ((oi = rn->info)) { - for (nrn = route_top(oi->nbrs); nrn; - nrn = route_next(nrn)) { - if ((nbr = nrn->info)) { - if (nbr != oi->nbr_self) { - if (nbr->state != NSM_Down) - show_ip_ospf_neighbor_detail_sub( - vty, oi, nbr, - NULL, - json, use_json); - } - } - } + oi = rn->info; + + if (!oi) + continue; + + for (nrn = route_top(oi->nbrs); nrn; nrn = route_next(nrn)) { + nbr = nrn->info; + + if (!nbr) + continue; + + if (nbr == oi->nbr_self) + continue; + + if (nbr->state == NSM_Down) + continue; + + show_ip_ospf_neighbor_detail_sub(vty, oi, nbr, NULL, + json, use_json); } } @@ -8019,13 +8036,17 @@ static void ospf_nbr_timer_update(struct ospf_interface *oi) struct route_node *rn; struct ospf_neighbor *nbr; - for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) - if ((nbr = rn->info)) { - nbr->v_inactivity = OSPF_IF_PARAM(oi, v_wait); - nbr->v_db_desc = OSPF_IF_PARAM(oi, retransmit_interval); - nbr->v_ls_req = OSPF_IF_PARAM(oi, retransmit_interval); - nbr->v_ls_upd = OSPF_IF_PARAM(oi, retransmit_interval); - } + for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) { + nbr = rn->info; + + if (!nbr) + continue; + + nbr->v_inactivity = OSPF_IF_PARAM(oi, v_wait); + nbr->v_db_desc = OSPF_IF_PARAM(oi, retransmit_interval); + nbr->v_ls_req = OSPF_IF_PARAM(oi, retransmit_interval); + nbr->v_ls_upd = OSPF_IF_PARAM(oi, retransmit_interval); + } } static int ospf_vty_dead_interval_set(struct vty *vty, const char *interval_str,