Merge pull request #1010 from donaldsharp/reliable_eigrp

Reliable eigrp
This commit is contained in:
Donnie Savage 2017-08-19 06:33:29 -04:00 committed by GitHub
commit de4ddd13aa
2 changed files with 22 additions and 26 deletions

View File

@ -628,35 +628,30 @@ int eigrp_read(struct thread *thread)
/* New testing block of code for handling Acks */ /* New testing block of code for handling Acks */
if (ntohl(eigrph->ack) != 0) { if (ntohl(eigrph->ack) != 0) {
struct eigrp_packet *ep = NULL;
nbr = eigrp_nbr_get(ei, eigrph, iph); 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); assert(nbr);
struct eigrp_packet *ep;
ep = eigrp_fifo_next(nbr->retrans_queue); ep = eigrp_fifo_next(nbr->retrans_queue);
if (ep) { if ((ep) && (ntohl(eigrph->ack) == ep->sequence_number)) {
if (ntohl(eigrph->ack) == ep->sequence_number) { ep = eigrp_fifo_pop(nbr->retrans_queue);
if ((nbr->state == EIGRP_NEIGHBOR_PENDING) eigrp_packet_free(ep);
&& (ntohl(eigrph->ack)
== nbr->init_sequence_number)) { if ((nbr->state == EIGRP_NEIGHBOR_PENDING)
eigrp_nbr_state_set(nbr, && (ntohl(eigrph->ack) == nbr->init_sequence_number)) {
EIGRP_NEIGHBOR_UP); eigrp_nbr_state_set(nbr, EIGRP_NEIGHBOR_UP);
zlog_info("Neighbor(%s) adjacency became full", zlog_info("Neighbor(%s) adjacency became full",
inet_ntoa(nbr->src)); inet_ntoa(nbr->src));
nbr->init_sequence_number = 0; nbr->init_sequence_number = 0;
nbr->recv_sequence_number = nbr->recv_sequence_number =
ntohl(eigrph->sequence); ntohl(eigrph->sequence);
eigrp_update_send_EOT(nbr); 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);
}
} }
else
eigrp_send_packet_reliably(nbr);
} }
ep = eigrp_fifo_next(nbr->multicast_queue); ep = eigrp_fifo_next(nbr->multicast_queue);
if (ep) { if (ep) {
@ -1073,7 +1068,7 @@ int eigrp_unack_multicast_packet_retrans(struct thread *thread)
/* Get packet from tail of fifo. */ /* Get packet from tail of fifo. */
struct eigrp_packet *eigrp_fifo_pop(struct eigrp_fifo *fifo) struct eigrp_packet *eigrp_fifo_pop(struct eigrp_fifo *fifo)
{ {
struct eigrp_packet *ep; struct eigrp_packet *ep = NULL;
ep = fifo->tail; ep = fifo->tail;

View File

@ -529,6 +529,9 @@ static void eigrp_update_place_on_nbr_queue(struct eigrp_neighbor *nbr,
/*Put packet to retransmission queue*/ /*Put packet to retransmission queue*/
eigrp_fifo_push(nbr->retrans_queue, ep); eigrp_fifo_push(nbr->retrans_queue, ep);
if (nbr->retrans_queue->count == 1)
eigrp_send_packet_reliably(nbr);
} }
void eigrp_update_send_EOT(struct eigrp_neighbor *nbr) void eigrp_update_send_EOT(struct eigrp_neighbor *nbr)
@ -567,7 +570,6 @@ void eigrp_update_send_EOT(struct eigrp_neighbor *nbr)
if ((length + 0x001D) > (u_int16_t)nbr->ei->ifp->mtu) { if ((length + 0x001D) > (u_int16_t)nbr->ei->ifp->mtu) {
eigrp_update_place_on_nbr_queue (nbr, ep, seq_no, length); eigrp_update_place_on_nbr_queue (nbr, ep, seq_no, length);
eigrp_send_packet_reliably(nbr);
seq_no++; seq_no++;
length = EIGRP_HEADER_LEN; length = EIGRP_HEADER_LEN;
@ -615,7 +617,6 @@ void eigrp_update_send_EOT(struct eigrp_neighbor *nbr)
} }
eigrp_update_place_on_nbr_queue (nbr, ep, seq_no, length); eigrp_update_place_on_nbr_queue (nbr, ep, seq_no, length);
eigrp_send_packet_reliably(nbr);
} }
void eigrp_update_send(struct eigrp_interface *ei) void eigrp_update_send(struct eigrp_interface *ei)