mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-06-06 22:22:46 +00:00
Merge pull request #1010 from donaldsharp/reliable_eigrp
Reliable eigrp
This commit is contained in:
commit
de4ddd13aa
@ -628,22 +628,21 @@ 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);
|
||||||
|
eigrp_packet_free(ep);
|
||||||
|
|
||||||
if ((nbr->state == EIGRP_NEIGHBOR_PENDING)
|
if ((nbr->state == EIGRP_NEIGHBOR_PENDING)
|
||||||
&& (ntohl(eigrph->ack)
|
&& (ntohl(eigrph->ack) == nbr->init_sequence_number)) {
|
||||||
== nbr->init_sequence_number)) {
|
eigrp_nbr_state_set(nbr, 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;
|
||||||
@ -651,13 +650,9 @@ int eigrp_read(struct thread *thread)
|
|||||||
ntohl(eigrph->sequence);
|
ntohl(eigrph->sequence);
|
||||||
eigrp_update_send_EOT(nbr);
|
eigrp_update_send_EOT(nbr);
|
||||||
}
|
}
|
||||||
ep = eigrp_fifo_pop(nbr->retrans_queue);
|
else
|
||||||
eigrp_packet_free(ep);
|
|
||||||
if (nbr->retrans_queue->count > 0) {
|
|
||||||
eigrp_send_packet_reliably(nbr);
|
eigrp_send_packet_reliably(nbr);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
ep = eigrp_fifo_next(nbr->multicast_queue);
|
ep = eigrp_fifo_next(nbr->multicast_queue);
|
||||||
if (ep) {
|
if (ep) {
|
||||||
if (ntohl(eigrph->ack) == ep->sequence_number) {
|
if (ntohl(eigrph->ack) == ep->sequence_number) {
|
||||||
@ -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;
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user