From 812e6c78c10970d0c5e7e5f3d1ed54dc95736244 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Wed, 10 Aug 2022 16:15:29 -0400 Subject: [PATCH 1/6] ospfd: Increase packets sent at one time in ospf_write ospf_write pulls an interface off the ospf->oi_write_q then writes one packet and places it back on the queue, keeping track of the first one sent. Then it will stop sending packets even if we get back to the first interface written too but before we have sent the full pkt_count. I do not believe this makes a whole bunch of sense and is very restrictive of how much data can be sent especially if you have a limited number of peers but large amounts of data. Why be so restrictive? Signed-off-by: Donald Sharp --- ospfd/ospf_packet.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/ospfd/ospf_packet.c b/ospfd/ospf_packet.c index 4b3f30a3f1..907cb15ed5 100644 --- a/ospfd/ospf_packet.c +++ b/ospfd/ospf_packet.c @@ -623,7 +623,6 @@ static void ospf_write(struct thread *thread) { struct ospf *ospf = THREAD_ARG(thread); struct ospf_interface *oi; - struct ospf_interface *last_serviced_oi = NULL; struct ospf_packet *op; struct sockaddr_in sa_dst; struct ip iph; @@ -664,13 +663,7 @@ static void ospf_write(struct thread *thread) ipid = (time(NULL) & 0xffff); #endif /* WANT_OSPF_WRITE_FRAGMENT */ - while ((pkt_count < ospf->write_oi_count) && oi - && (last_serviced_oi != oi)) { - /* If there is only packet in the queue, the oi is removed from - write-q, so fix up the last interface that was serviced */ - if (last_serviced_oi == NULL) { - last_serviced_oi = oi; - } + while ((pkt_count < ospf->write_oi_count) && oi) { pkt_count++; #ifdef WANT_OSPF_WRITE_FRAGMENT /* convenience - max OSPF data per packet */ @@ -853,11 +846,9 @@ static void ospf_write(struct thread *thread) list_delete_node(ospf->oi_write_q, node); if (ospf_fifo_head(oi->obuf) == NULL) { oi->on_write_q = 0; - last_serviced_oi = NULL; oi = NULL; - } else { + } else listnode_add(ospf->oi_write_q, oi); - } /* Setup to service from the head of the queue again */ if (!list_isempty(ospf->oi_write_q)) { From fe61ceaee75dbba770f39af7670aa85b8d6ccacb Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Wed, 10 Aug 2022 18:14:23 -0400 Subject: [PATCH 2/6] ospfd: Cleanup indentation surrounding oi->nbr Signed-off-by: Donald Sharp --- ospfd/ospf_flood.c | 38 +++++---- ospfd/ospf_interface.c | 22 ++--- ospfd/ospf_packet.c | 179 +++++++++++++++++++---------------------- ospfd/ospf_sr.c | 15 ++-- ospfd/ospf_vty.c | 151 +++++++++++++++++++--------------- 5 files changed, 211 insertions(+), 194 deletions(-) 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, From 14fad76ce215c79152f0fa4bbc6a86af1d01fa26 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Wed, 10 Aug 2022 21:49:37 -0400 Subject: [PATCH 3/6] ospfd: When a neighbor goes down clear the oi->obuf if we can When a neighbor goes down on an interface and that interface has no more neighbors in a viable state where packets should be being sent, then let's clear up the oi->obuf associated with the interface the neighbor is on. Signed-off-by: Donald Sharp --- ospfd/ospf_nsm.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/ospfd/ospf_nsm.c b/ospfd/ospf_nsm.c index 333389596b..1373e5e1bb 100644 --- a/ospfd/ospf_nsm.c +++ b/ospfd/ospf_nsm.c @@ -382,6 +382,10 @@ static void nsm_clear_adj(struct ospf_neighbor *nbr) static int nsm_kill_nbr(struct ospf_neighbor *nbr) { + struct ospf_interface *oi = nbr->oi; + struct ospf_neighbor *on; + struct route_node *rn; + /* killing nbr_self is invalid */ if (nbr == nbr->oi->nbr_self) { assert(nbr != nbr->oi->nbr_self); @@ -407,6 +411,42 @@ static int nsm_kill_nbr(struct ospf_neighbor *nbr) ospf_get_name(nbr->oi->ospf)); } + /* + * Do we have any neighbors that are also operating + * on this interface? + */ + for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) { + on = rn->info; + + if (!on) + continue; + + if (on == nbr || on == oi->nbr_self) + continue; + + /* + * on is in some state where we might be + * sending packets on this interface + */ + if (on->state > NSM_Down) { + route_unlock_node(rn); + return 0; + } + } + /* + * If we get here we know that this interface + * has no neighbors in a state where we could + * be sending packets. Let's flush anything + * we got. + */ + ospf_fifo_flush(oi->obuf); + if (oi->on_write_q) { + listnode_delete(oi->ospf->oi_write_q, oi); + if (list_isempty(oi->ospf->oi_write_q)) + THREAD_OFF(oi->ospf->t_write); + oi->on_write_q = 0; + } + return 0; } From fb617d1874f817cde053560c8b13cff5d5ce1d12 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Wed, 10 Aug 2022 21:56:40 -0400 Subject: [PATCH 4/6] ospfd: Refactor fifo_flush for the interface Signed-off-by: Donald Sharp --- ospfd/ospf_interface.c | 25 +++++++++++++++---------- ospfd/ospf_interface.h | 2 ++ ospfd/ospf_nsm.c | 9 +-------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c index a4f4cd216a..2a758d5583 100644 --- a/ospfd/ospf_interface.c +++ b/ospfd/ospf_interface.c @@ -494,6 +494,20 @@ struct ospf_interface *ospf_if_lookup_recv_if(struct ospf *ospf, return match; } +void ospf_interface_fifo_flush(struct ospf_interface *oi) +{ + struct ospf *ospf = oi->ospf; + + ospf_fifo_flush(oi->obuf); + + if (oi->on_write_q) { + listnode_delete(ospf->oi_write_q, oi); + if (list_isempty(ospf->oi_write_q)) + THREAD_OFF(ospf->t_write); + oi->on_write_q = 0; + } +} + static void ospf_if_reset_stats(struct ospf_interface *oi) { oi->hello_in = oi->hello_out = 0; @@ -505,19 +519,10 @@ static void ospf_if_reset_stats(struct ospf_interface *oi) void ospf_if_stream_unset(struct ospf_interface *oi) { - struct ospf *ospf = oi->ospf; - /* flush the interface packet queue */ - ospf_fifo_flush(oi->obuf); + ospf_interface_fifo_flush(oi); /*reset protocol stats */ ospf_if_reset_stats(oi); - - if (oi->on_write_q) { - listnode_delete(ospf->oi_write_q, oi); - if (list_isempty(ospf->oi_write_q)) - THREAD_OFF(ospf->t_write); - oi->on_write_q = 0; - } } diff --git a/ospfd/ospf_interface.h b/ospfd/ospf_interface.h index e441016406..51fc1bf3c3 100644 --- a/ospfd/ospf_interface.h +++ b/ospfd/ospf_interface.h @@ -351,6 +351,8 @@ extern void ospf_if_interface(struct interface *ifp); extern uint32_t ospf_if_count_area_params(struct interface *ifp); extern void ospf_reset_hello_timer(struct interface *ifp, struct in_addr addr, bool is_addr); + +extern void ospf_interface_fifo_flush(struct ospf_interface *oi); DECLARE_HOOK(ospf_vl_add, (struct ospf_vl_data * vd), (vd)); DECLARE_HOOK(ospf_vl_delete, (struct ospf_vl_data * vd), (vd)); diff --git a/ospfd/ospf_nsm.c b/ospfd/ospf_nsm.c index 1373e5e1bb..a27550853b 100644 --- a/ospfd/ospf_nsm.c +++ b/ospfd/ospf_nsm.c @@ -439,14 +439,7 @@ static int nsm_kill_nbr(struct ospf_neighbor *nbr) * be sending packets. Let's flush anything * we got. */ - ospf_fifo_flush(oi->obuf); - if (oi->on_write_q) { - listnode_delete(oi->ospf->oi_write_q, oi); - if (list_isempty(oi->ospf->oi_write_q)) - THREAD_OFF(oi->ospf->t_write); - oi->on_write_q = 0; - } - + ospf_interface_fifo_flush(oi); return 0; } From f54b256b93cae90201052868ced053072e07e0ca Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Thu, 11 Aug 2022 07:39:33 -0400 Subject: [PATCH 5/6] ospfd: Add how many packets the interface has queued to send In `show ip ospf interface traffic` how many packets this interface has queued to send. Signed-off-by: Donald Sharp --- ospfd/ospf_vty.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c index 74ee37b182..a6572794aa 100644 --- a/ospfd/ospf_vty.c +++ b/ospfd/ospf_vty.c @@ -4008,13 +4008,15 @@ static void show_ip_ospf_interface_traffic_sub(struct vty *vty, oi->ls_ack_in); json_object_int_add(json_interface_sub, "lsAckOut", oi->ls_ack_out); + json_object_int_add(json_interface_sub, "packetsQueued", + listcount(oi->obuf)); } else { vty_out(vty, - "%-10s %8u/%-8u %7u/%-7u %7u/%-7u %7u/%-7u %7u/%-7u\n", + "%-10s %8u/%-8u %7u/%-7u %7u/%-7u %7u/%-7u %7u/%-7u %12lu\n", oi->ifp->name, oi->hello_in, oi->hello_out, oi->db_desc_in, oi->db_desc_out, oi->ls_req_in, oi->ls_req_out, oi->ls_upd_in, oi->ls_upd_out, - oi->ls_ack_in, oi->ls_ack_out); + oi->ls_ack_in, oi->ls_ack_out, listcount(oi->obuf)); } } @@ -4030,14 +4032,14 @@ static int show_ip_ospf_interface_traffic_common( if (!use_json && !display_once) { vty_out(vty, "\n"); - vty_out(vty, "%-12s%-17s%-17s%-17s%-17s%-17s\n", "Interface", - " HELLO", " DB-Desc", " LS-Req", " LS-Update", - " LS-Ack"); - vty_out(vty, "%-10s%-18s%-18s%-17s%-17s%-17s\n", "", + vty_out(vty, "%-12s%-17s%-17s%-17s%-17s%-17s%-17s\n", + "Interface", " HELLO", " DB-Desc", " LS-Req", + " LS-Update", " LS-Ack", " Packets"); + vty_out(vty, "%-10s%-18s%-18s%-17s%-17s%-17s%-17s\n", "", " Rx/Tx", " Rx/Tx", " Rx/Tx", " Rx/Tx", - " Rx/Tx"); + " Rx/Tx", " Queued"); vty_out(vty, - "--------------------------------------------------------------------------------------------\n"); + "-------------------------------------------------------------------------------------------------------------\n"); } else if (use_json) { if (use_vrf) json_vrf = json_object_new_object(); From 4e5c95be91728c40b6afd789d229994cc9a7c9a7 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Thu, 11 Aug 2022 13:40:50 -0400 Subject: [PATCH 6/6] ospf6d: Remove unused variable last_serviced_oi is always NULL. Remove Signed-off-by: Donald Sharp --- ospf6d/ospf6_message.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/ospf6d/ospf6_message.c b/ospf6d/ospf6_message.c index 93a062b215..360a9db0d6 100644 --- a/ospf6d/ospf6_message.c +++ b/ospf6d/ospf6_message.c @@ -2086,7 +2086,6 @@ static void ospf6_write(struct thread *thread) { struct ospf6 *ospf6 = THREAD_ARG(thread); struct ospf6_interface *oi; - struct ospf6_interface *last_serviced_oi = NULL; struct ospf6_header *oh; struct ospf6_packet *op; struct listnode *node; @@ -2106,9 +2105,7 @@ static void ospf6_write(struct thread *thread) assert(node); oi = listgetdata(node); - while ((pkt_count < ospf6->write_oi_count) && oi - && (last_serviced_oi != oi)) { - + while ((pkt_count < ospf6->write_oi_count) && oi) { op = ospf6_fifo_head(oi->obuf); assert(op); assert(op->length >= OSPF6_HEADER_SIZE); @@ -2221,7 +2218,6 @@ static void ospf6_write(struct thread *thread) list_delete_node(ospf6->oi_write_q, node); if (ospf6_fifo_head(oi->obuf) == NULL) { oi->on_write_q = 0; - last_serviced_oi = NULL; oi = NULL; } else { listnode_add(ospf6->oi_write_q, oi);