]> git.proxmox.com Git - mirror_frr.git/commitdiff
eigrpd: Only put 1 packet at a time on send queue
authorDonald Sharp <sharpd@cumulusnetworks.com>
Fri, 18 Aug 2017 18:57:37 +0000 (14:57 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Fri, 18 Aug 2017 19:00:40 +0000 (15:00 -0400)
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 <sharpd@cumulusnetworks.com>
eigrpd/eigrp_packet.c

index f38b759e9f178e2c3db17b0f6b6ae0ae1c7ac0ad..dde553d53f9bdd409c973bd21133d668ddb039cb 100644 (file)
@@ -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;