From 1a0770e387bccdaadc6b4d48ba505d3d332034b6 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Fri, 18 Aug 2017 14:57:37 -0400 Subject: [PATCH] eigrpd: Only put 1 packet at a time on send queue When we have received an ack for the last reliable packet we must only put 1 packet onto the send queue. Signed-off-by: Donald Sharp --- eigrpd/eigrp_packet.c | 43 +++++++++++++++++++------------------------ 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/eigrpd/eigrp_packet.c b/eigrpd/eigrp_packet.c index f38b759e9f..dde553d53f 100644 --- a/eigrpd/eigrp_packet.c +++ b/eigrpd/eigrp_packet.c @@ -628,35 +628,30 @@ int eigrp_read(struct thread *thread) /* New testing block of code for handling Acks */ if (ntohl(eigrph->ack) != 0) { + struct eigrp_packet *ep = NULL; + nbr = eigrp_nbr_get(ei, eigrph, iph); - /* neighbor must be valid, eigrp_nbr_get creates if none existed - */ + // neighbor must be valid, eigrp_nbr_get creates if none existed assert(nbr); - struct eigrp_packet *ep; - ep = eigrp_fifo_next(nbr->retrans_queue); - if (ep) { - if (ntohl(eigrph->ack) == ep->sequence_number) { - if ((nbr->state == EIGRP_NEIGHBOR_PENDING) - && (ntohl(eigrph->ack) - == nbr->init_sequence_number)) { - eigrp_nbr_state_set(nbr, - EIGRP_NEIGHBOR_UP); - zlog_info("Neighbor(%s) adjacency became full", - inet_ntoa(nbr->src)); - nbr->init_sequence_number = 0; - nbr->recv_sequence_number = - ntohl(eigrph->sequence); - eigrp_update_send_EOT(nbr); - } - ep = eigrp_fifo_pop(nbr->retrans_queue); - eigrp_packet_free(ep); - if (nbr->retrans_queue->count > 0) { - eigrp_send_packet_reliably(nbr); - } + if ((ep) && (ntohl(eigrph->ack) == ep->sequence_number)) { + ep = eigrp_fifo_pop(nbr->retrans_queue); + eigrp_packet_free(ep); + + if ((nbr->state == EIGRP_NEIGHBOR_PENDING) + && (ntohl(eigrph->ack) == nbr->init_sequence_number)) { + eigrp_nbr_state_set(nbr, EIGRP_NEIGHBOR_UP); + zlog_info("Neighbor(%s) adjacency became full", + inet_ntoa(nbr->src)); + nbr->init_sequence_number = 0; + nbr->recv_sequence_number = + ntohl(eigrph->sequence); + eigrp_update_send_EOT(nbr); } + else + eigrp_send_packet_reliably(nbr); } ep = eigrp_fifo_next(nbr->multicast_queue); if (ep) { @@ -1073,7 +1068,7 @@ int eigrp_unack_multicast_packet_retrans(struct thread *thread) /* Get packet from tail of fifo. */ struct eigrp_packet *eigrp_fifo_pop(struct eigrp_fifo *fifo) { - struct eigrp_packet *ep; + struct eigrp_packet *ep = NULL; ep = fifo->tail; -- 2.39.5