From f90f65a242e18ad2ae1229853f904227cc36900a Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Thu, 17 Aug 2017 19:03:46 -0400 Subject: [PATCH] eigrpd: Cleanup FIFO The FIFO really was a LIFO for some reason. Push new packets onto the top, always pull from the bottom. This allows eigrp neighbors to come up. Topotests eigrp-topo1( in a topotest PR ) now form neighbors with itself. With this commit. Signed-off-by: Donald Sharp --- eigrpd/eigrp_hello.c | 4 +-- eigrpd/eigrp_packet.c | 57 +++++++++++------------------------------ eigrpd/eigrp_packet.h | 6 ++--- eigrpd/eigrp_query.c | 2 +- eigrpd/eigrp_reply.c | 2 +- eigrpd/eigrp_siaquery.c | 2 +- eigrpd/eigrp_siareply.c | 2 +- eigrpd/eigrp_update.c | 8 +++--- 8 files changed, 27 insertions(+), 56 deletions(-) diff --git a/eigrpd/eigrp_hello.c b/eigrpd/eigrp_hello.c index 4654ead434..67f75c536b 100644 --- a/eigrpd/eigrp_hello.c +++ b/eigrpd/eigrp_hello.c @@ -707,7 +707,7 @@ void eigrp_hello_send_ack(struct eigrp_neighbor *nbr) inet_ntoa(nbr->src)); /* Add packet to the top of the interface output queue*/ - eigrp_fifo_push_head(nbr->ei->obuf, ep); + eigrp_fifo_push(nbr->ei->obuf, ep); /* Hook thread to write packet. */ if (nbr->ei->on_write_q == 0) { @@ -755,7 +755,7 @@ void eigrp_hello_send(struct eigrp_interface *ei, u_char flags, if (ep) { // Add packet to the top of the interface output queue - eigrp_fifo_push_head(ei->obuf, ep); + eigrp_fifo_push(ei->obuf, ep); /* Hook thread to write packet. */ if (ei->on_write_q == 0) { diff --git a/eigrpd/eigrp_packet.c b/eigrpd/eigrp_packet.c index 9f3de10141..cd677f1ae6 100644 --- a/eigrpd/eigrp_packet.c +++ b/eigrpd/eigrp_packet.c @@ -336,7 +336,7 @@ int eigrp_write(struct thread *thread) #endif /* WANT_EIGRP_WRITE_FRAGMENT */ /* Get one packet from queue. */ - ep = eigrp_fifo_head(ei->obuf); + ep = eigrp_fifo_next(ei->obuf); assert(ep); assert(ep->length >= EIGRP_HEADER_LEN); @@ -437,7 +437,7 @@ int eigrp_write(struct thread *thread) /* Now delete packet from queue. */ eigrp_packet_delete(ei); - if (eigrp_fifo_head(ei->obuf) == NULL) { + if (eigrp_fifo_next(ei->obuf) == NULL) { ei->on_write_q = 0; list_delete_node(eigrp->oi_write_q, node); } @@ -636,7 +636,7 @@ int eigrp_read(struct thread *thread) struct eigrp_packet *ep; - ep = eigrp_fifo_tail(nbr->retrans_queue); + ep = eigrp_fifo_next(nbr->retrans_queue); if (ep) { if (ntohl(eigrph->ack) == ep->sequence_number) { if ((nbr->state == EIGRP_NEIGHBOR_PENDING) @@ -651,17 +651,17 @@ int eigrp_read(struct thread *thread) ntohl(eigrph->sequence); eigrp_update_send_EOT(nbr); } - ep = eigrp_fifo_pop_tail(nbr->retrans_queue); + ep = eigrp_fifo_pop(nbr->retrans_queue); eigrp_packet_free(ep); if (nbr->retrans_queue->count > 0) { eigrp_send_packet_reliably(nbr); } } } - ep = eigrp_fifo_tail(nbr->multicast_queue); + ep = eigrp_fifo_next(nbr->multicast_queue); if (ep) { if (ntohl(eigrph->ack) == ep->sequence_number) { - ep = eigrp_fifo_pop_tail(nbr->multicast_queue); + ep = eigrp_fifo_pop(nbr->multicast_queue); eigrp_packet_free(ep); if (nbr->multicast_queue->count > 0) { eigrp_send_packet_reliably(nbr); @@ -843,13 +843,13 @@ void eigrp_send_packet_reliably(struct eigrp_neighbor *nbr) { struct eigrp_packet *ep; - ep = eigrp_fifo_tail(nbr->retrans_queue); + ep = eigrp_fifo_next(nbr->retrans_queue); if (ep) { struct eigrp_packet *duplicate; duplicate = eigrp_packet_duplicate(ep, nbr); /* Add packet to the top of the interface output queue*/ - eigrp_fifo_push_head(nbr->ei->obuf, duplicate); + eigrp_fifo_push(nbr->ei->obuf, duplicate); /*Start retransmission timer*/ thread_add_timer(master, eigrp_unack_packet_retrans, nbr, @@ -911,7 +911,7 @@ void eigrp_packet_header_init(int type, struct eigrp_interface *ei, } /* Add new packet to head of fifo. */ -void eigrp_fifo_push_head(struct eigrp_fifo *fifo, struct eigrp_packet *ep) +void eigrp_fifo_push(struct eigrp_fifo *fifo, struct eigrp_packet *ep) { ep->next = fifo->head; ep->previous = NULL; @@ -927,14 +927,8 @@ void eigrp_fifo_push_head(struct eigrp_fifo *fifo, struct eigrp_packet *ep) fifo->count++; } -/* Return first fifo entry. */ -struct eigrp_packet *eigrp_fifo_head(struct eigrp_fifo *fifo) -{ - return fifo->head; -} - /* Return last fifo entry. */ -struct eigrp_packet *eigrp_fifo_tail(struct eigrp_fifo *fifo) +struct eigrp_packet *eigrp_fifo_next(struct eigrp_fifo *fifo) { return fifo->tail; } @@ -949,27 +943,6 @@ void eigrp_packet_delete(struct eigrp_interface *ei) eigrp_packet_free(ep); } -/* Delete first packet from fifo. */ -struct eigrp_packet *eigrp_fifo_pop(struct eigrp_fifo *fifo) -{ - struct eigrp_packet *ep; - - ep = fifo->head; - - if (ep) { - fifo->head = ep->next; - - if (fifo->head == NULL) - fifo->tail = NULL; - else - fifo->head->previous = NULL; - - fifo->count--; - } - - return ep; -} - void eigrp_packet_free(struct eigrp_packet *ep) { if (ep->s) @@ -1030,14 +1003,14 @@ int eigrp_unack_packet_retrans(struct thread *thread) nbr = (struct eigrp_neighbor *)THREAD_ARG(thread); struct eigrp_packet *ep; - ep = eigrp_fifo_tail(nbr->retrans_queue); + ep = eigrp_fifo_next(nbr->retrans_queue); if (ep) { struct eigrp_packet *duplicate; duplicate = eigrp_packet_duplicate(ep, nbr); /* Add packet to the top of the interface output queue*/ - eigrp_fifo_push_head(nbr->ei->obuf, duplicate); + eigrp_fifo_push(nbr->ei->obuf, duplicate); ep->retrans_counter++; if (ep->retrans_counter == EIGRP_PACKET_RETRANS_MAX) @@ -1067,13 +1040,13 @@ int eigrp_unack_multicast_packet_retrans(struct thread *thread) nbr = (struct eigrp_neighbor *)THREAD_ARG(thread); struct eigrp_packet *ep; - ep = eigrp_fifo_tail(nbr->multicast_queue); + ep = eigrp_fifo_next(nbr->multicast_queue); if (ep) { struct eigrp_packet *duplicate; duplicate = eigrp_packet_duplicate(ep, nbr); /* Add packet to the top of the interface output queue*/ - eigrp_fifo_push_head(nbr->ei->obuf, duplicate); + eigrp_fifo_push(nbr->ei->obuf, duplicate); ep->retrans_counter++; if (ep->retrans_counter == EIGRP_PACKET_RETRANS_MAX) @@ -1098,7 +1071,7 @@ int eigrp_unack_multicast_packet_retrans(struct thread *thread) } /* Get packet from tail of fifo. */ -struct eigrp_packet *eigrp_fifo_pop_tail(struct eigrp_fifo *fifo) +struct eigrp_packet *eigrp_fifo_pop(struct eigrp_fifo *fifo) { struct eigrp_packet *ep; diff --git a/eigrpd/eigrp_packet.h b/eigrpd/eigrp_packet.h index 890fc33c0f..040204a7fc 100644 --- a/eigrpd/eigrp_packet.h +++ b/eigrpd/eigrp_packet.h @@ -48,11 +48,9 @@ extern void eigrp_packet_checksum(struct eigrp_interface *, struct stream *, u_int16_t); extern struct eigrp_fifo *eigrp_fifo_new(void); -extern struct eigrp_packet *eigrp_fifo_head(struct eigrp_fifo *); -extern struct eigrp_packet *eigrp_fifo_tail(struct eigrp_fifo *); +extern struct eigrp_packet *eigrp_fifo_next(struct eigrp_fifo *); extern struct eigrp_packet *eigrp_fifo_pop(struct eigrp_fifo *); -extern struct eigrp_packet *eigrp_fifo_pop_tail(struct eigrp_fifo *); -extern void eigrp_fifo_push_head(struct eigrp_fifo *, struct eigrp_packet *); +extern void eigrp_fifo_push(struct eigrp_fifo *, struct eigrp_packet *); extern void eigrp_fifo_free(struct eigrp_fifo *); extern void eigrp_fifo_reset(struct eigrp_fifo *); diff --git a/eigrpd/eigrp_query.c b/eigrpd/eigrp_query.c index 92bc792c6a..d6299ad923 100644 --- a/eigrpd/eigrp_query.c +++ b/eigrpd/eigrp_query.c @@ -207,7 +207,7 @@ void eigrp_send_query(struct eigrp_interface *ei) for (ALL_LIST_ELEMENTS(ei->nbrs, node2, nnode2, nbr)) { if (nbr->state == EIGRP_NEIGHBOR_UP) { /*Put packet to retransmission queue*/ - eigrp_fifo_push_head(nbr->retrans_queue, ep); + eigrp_fifo_push(nbr->retrans_queue, ep); ep_saved = true; if (nbr->retrans_queue->count == 1) { diff --git a/eigrpd/eigrp_reply.c b/eigrpd/eigrp_reply.c index c96c3008ca..1a4af15900 100644 --- a/eigrpd/eigrp_reply.c +++ b/eigrpd/eigrp_reply.c @@ -144,7 +144,7 @@ void eigrp_send_reply(struct eigrp_neighbor *nbr, struct eigrp_prefix_entry *pe) ep->sequence_number = nbr->ei->eigrp->sequence_number; /*Put packet to retransmission queue*/ - eigrp_fifo_push_head(nbr->retrans_queue, ep); + eigrp_fifo_push(nbr->retrans_queue, ep); if (nbr->retrans_queue->count == 1) { eigrp_send_packet_reliably(nbr); diff --git a/eigrpd/eigrp_siaquery.c b/eigrpd/eigrp_siaquery.c index a5df2381ca..215df7b8ee 100644 --- a/eigrpd/eigrp_siaquery.c +++ b/eigrpd/eigrp_siaquery.c @@ -153,7 +153,7 @@ void eigrp_send_siaquery(struct eigrp_neighbor *nbr, if (nbr->state == EIGRP_NEIGHBOR_UP) { /*Put packet to retransmission queue*/ - eigrp_fifo_push_head(nbr->retrans_queue, ep); + eigrp_fifo_push(nbr->retrans_queue, ep); if (nbr->retrans_queue->count == 1) { eigrp_send_packet_reliably(nbr); diff --git a/eigrpd/eigrp_siareply.c b/eigrpd/eigrp_siareply.c index 0b684b498b..32f0c8be33 100644 --- a/eigrpd/eigrp_siareply.c +++ b/eigrpd/eigrp_siareply.c @@ -152,7 +152,7 @@ void eigrp_send_siareply(struct eigrp_neighbor *nbr, if (nbr->state == EIGRP_NEIGHBOR_UP) { /*Put packet to retransmission queue*/ - eigrp_fifo_push_head(nbr->retrans_queue, ep); + eigrp_fifo_push(nbr->retrans_queue, ep); if (nbr->retrans_queue->count == 1) { eigrp_send_packet_reliably(nbr); diff --git a/eigrpd/eigrp_update.c b/eigrpd/eigrp_update.c index 3c82fdfde8..3af5524b87 100644 --- a/eigrpd/eigrp_update.c +++ b/eigrpd/eigrp_update.c @@ -497,7 +497,7 @@ void eigrp_update_send_init(struct eigrp_neighbor *nbr) ep->length, ep->sequence_number, inet_ntoa(ep->dst)); /*Put packet to retransmission queue*/ - eigrp_fifo_push_head(nbr->retrans_queue, ep); + eigrp_fifo_push(nbr->retrans_queue, ep); if (nbr->retrans_queue->count == 1) { eigrp_send_packet_reliably(nbr); @@ -528,7 +528,7 @@ static void eigrp_update_place_on_nbr_queue(struct eigrp_neighbor *nbr, ep->length, ep->sequence_number, inet_ntoa(ep->dst)); /*Put packet to retransmission queue*/ - eigrp_fifo_push_head(nbr->retrans_queue, ep); + eigrp_fifo_push(nbr->retrans_queue, ep); } void eigrp_update_send_EOT(struct eigrp_neighbor *nbr) @@ -731,7 +731,7 @@ void eigrp_update_send(struct eigrp_interface *ei) if (nbr->state == EIGRP_NEIGHBOR_UP) { packet_sent = true; /*Put packet to retransmission queue*/ - eigrp_fifo_push_head(nbr->retrans_queue, ep); + eigrp_fifo_push(nbr->retrans_queue, ep); if (nbr->retrans_queue->count == 1) { eigrp_send_packet_reliably(nbr); @@ -980,7 +980,7 @@ static void eigrp_update_send_GR_part(struct eigrp_neighbor *nbr) ep->length, ep->sequence_number, inet_ntoa(ep->dst)); /*Put packet to retransmission queue*/ - eigrp_fifo_push_head(nbr->retrans_queue, ep); + eigrp_fifo_push(nbr->retrans_queue, ep); if (nbr->retrans_queue->count == 1) { eigrp_send_packet_reliably(nbr); -- 2.39.5