Merge pull request #1000 from donaldsharp/eigrp_packet_stuff

Eigrp packet stuff
This commit is contained in:
Jafar Al-Gharaibeh 2017-08-18 00:13:58 -05:00 committed by GitHub
commit 3b09001eb1
10 changed files with 79 additions and 114 deletions

View File

@ -333,7 +333,7 @@ int eigrp_get_fsm_event(struct eigrp_fsm_action_message *msg)
*/
int eigrp_fsm_event(struct eigrp_fsm_action_message *msg, int event)
{
zlog_info("EIGRP AS: %d State: %d Event: %d Network: %s\n",
zlog_info("EIGRP AS: %d State: %d Event: %d Network: %s",
msg->eigrp->AS, msg->prefix->state, event,
eigrp_topology_ip_string(msg->prefix));
(*(NSM[msg->prefix->state][event].func))(msg);

View File

@ -614,7 +614,7 @@ static struct eigrp_packet *eigrp_hello_encode(struct eigrp_interface *ei,
u_int16_t length = EIGRP_HEADER_LEN;
// allocate a new packet to be sent
ep = eigrp_packet_new(ei->ifp->mtu);
ep = eigrp_packet_new(ei->ifp->mtu, NULL);
if (ep) {
// encode common header feilds
@ -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) {

View File

@ -299,18 +299,6 @@ int eigrp_check_sha256_digest(struct stream *s,
return 1;
}
/*
* eigrp_packet_dump
*
* This routing dumps the contents of the IP packet either received or
* built by EIGRP.
*/
static void eigrp_packet_dump(struct stream *s)
{
// not yet...
return;
}
int eigrp_write(struct thread *thread)
{
struct eigrp *eigrp = THREAD_ARG(thread);
@ -322,6 +310,7 @@ int eigrp_write(struct thread *thread)
struct msghdr msg;
struct iovec iov[2];
u_int16_t opcode = 0;
u_int32_t seqno, ack;
int ret;
int flags = 0;
@ -347,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);
@ -357,6 +346,25 @@ int eigrp_write(struct thread *thread)
memset(&iph, 0, sizeof(struct ip));
memset(&sa_dst, 0, sizeof(sa_dst));
/*
* We build and schedule packets to go out
* in the future. In the mean time we may
* process some update packets from the
* neighbor, thus making it necessary
* to update the ack we are using for
* this outgoing packet.
*/
eigrph = (struct eigrp_header *)STREAM_DATA(ep->s);
opcode = eigrph->opcode;
seqno = ntohl(eigrph->sequence);
ack = ntohl(eigrph->ack);
if (ep->nbr && (ack != ep->nbr->recv_sequence_number)) {
eigrph->ack = htonl(ep->nbr->recv_sequence_number);
ack = ep->nbr->recv_sequence_number;
eigrph->checksum = 0;
eigrp_packet_checksum(ei, ep->s, ep->length);
}
sa_dst.sin_family = AF_INET;
#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
sa_dst.sin_len = sizeof(sa_dst);
@ -412,8 +420,9 @@ int eigrp_write(struct thread *thread)
if (IS_DEBUG_EIGRP_TRANSMIT(0, SEND)) {
eigrph = (struct eigrp_header *)STREAM_DATA(ep->s);
opcode = eigrph->opcode;
zlog_debug("Sending [%s] to [%s] via [%s] ret [%d].",
zlog_debug("Sending [%s][%d/%d] to [%s] via [%s] ret [%d].",
lookup_msg(eigrp_packet_type_str, opcode, NULL),
seqno, ack,
inet_ntoa(ep->dst), IF_NAME(ei), ret);
}
@ -425,22 +434,10 @@ int eigrp_write(struct thread *thread)
iph.ip_len, ei->ifp->name, ei->ifp->mtu,
safe_strerror(errno));
/* Show debug sending packet. */
if (IS_DEBUG_EIGRP_TRANSMIT(0, SEND)
&& (IS_DEBUG_EIGRP_TRANSMIT(0, PACKET_DETAIL))) {
zlog_debug(
"-----------------------------------------------------");
eigrp_ip_header_dump(&iph);
stream_set_getp(ep->s, 0);
eigrp_packet_dump(ep->s);
zlog_debug(
"-----------------------------------------------------");
}
/* 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);
}
@ -615,12 +612,16 @@ int eigrp_read(struct thread *thread)
start of the eigrp TLVs */
opcode = eigrph->opcode;
if (IS_DEBUG_EIGRP_TRANSMIT(0, RECV))
zlog_debug(
"Received [%s] length [%u] via [%s] src [%s] dst [%s]",
lookup_msg(eigrp_packet_type_str, opcode, NULL), length,
IF_NAME(ei), inet_ntoa(iph->ip_src),
inet_ntoa(iph->ip_dst));
if (IS_DEBUG_EIGRP_TRANSMIT(0, RECV)) {
char src[100], dst[100];
strcpy(src, inet_ntoa(iph->ip_src));
strcpy(dst, inet_ntoa(iph->ip_dst));
zlog_debug("Received [%s][%d/%d] length [%u] via [%s] src [%s] dst [%s]",
lookup_msg(eigrp_packet_type_str, opcode, NULL),
ntohl(eigrph->sequence), ntohl(eigrph->ack), length,
IF_NAME(ei), src, dst);
}
/* Read rest of the packet and call each sort of packet routine. */
stream_forward_getp(ibuf, EIGRP_HEADER_LEN);
@ -635,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)
@ -643,24 +644,24 @@ int eigrp_read(struct thread *thread)
== nbr->init_sequence_number)) {
eigrp_nbr_state_set(nbr,
EIGRP_NEIGHBOR_UP);
zlog_info(
"Neighbor adjacency became full");
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_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);
@ -826,13 +827,14 @@ void eigrp_fifo_reset(struct eigrp_fifo *fifo)
fifo->count = 0;
}
struct eigrp_packet *eigrp_packet_new(size_t size)
struct eigrp_packet *eigrp_packet_new(size_t size, struct eigrp_neighbor *nbr)
{
struct eigrp_packet *new;
new = XCALLOC(MTYPE_EIGRP_PACKET, sizeof(struct eigrp_packet));
new->s = stream_new(size);
new->retrans_counter = 0;
new->nbr = nbr;
return new;
}
@ -841,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,
@ -901,7 +903,7 @@ void eigrp_packet_header_init(int type, struct eigrp_interface *ei,
// eigrph->sequence = htonl(3);
eigrph->flags = htonl(flags);
if (IS_DEBUG_EIGRP_TRANSMIT(0, RECV))
if (IS_DEBUG_EIGRP_TRANSMIT(0, PACKET_DETAIL))
zlog_debug("Packet Header Init Seq [%u] Ack [%u]",
htonl(eigrph->sequence), htonl(eigrph->ack));
@ -909,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;
@ -925,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;
}
@ -947,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)
@ -1028,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)
@ -1065,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)
@ -1096,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;
@ -1121,7 +1096,7 @@ struct eigrp_packet *eigrp_packet_duplicate(struct eigrp_packet *old,
{
struct eigrp_packet *new;
new = eigrp_packet_new(nbr->ei->ifp->mtu);
new = eigrp_packet_new(nbr->ei->ifp->mtu, nbr);
new->length = old->length;
new->retrans_counter = old->retrans_counter;
new->dst = old->dst;

View File

@ -36,7 +36,7 @@
extern int eigrp_read(struct thread *);
extern int eigrp_write(struct thread *);
extern struct eigrp_packet *eigrp_packet_new(size_t);
extern struct eigrp_packet *eigrp_packet_new(size_t, struct eigrp_neighbor *);
extern struct eigrp_packet *eigrp_packet_duplicate(struct eigrp_packet *,
struct eigrp_neighbor *);
extern void eigrp_packet_free(struct eigrp_packet *);
@ -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 *);

View File

@ -159,7 +159,7 @@ void eigrp_send_query(struct eigrp_interface *ei)
char has_tlv;
bool ep_saved = false;
ep = eigrp_packet_new(ei->ifp->mtu);
ep = eigrp_packet_new(ei->ifp->mtu, NULL);
/* Prepare EIGRP INIT UPDATE header */
eigrp_packet_header_init(EIGRP_OPC_QUERY, ei, ep->s, 0,
@ -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) {

View File

@ -84,9 +84,7 @@ void eigrp_send_reply(struct eigrp_neighbor *nbr, struct eigrp_prefix_entry *pe)
plist = e->prefix[EIGRP_FILTER_OUT];
alist_i = nbr->ei->list[EIGRP_FILTER_OUT];
plist_i = nbr->ei->prefix[EIGRP_FILTER_OUT];
zlog_info("REPLY Send: Filtering");
zlog_info("REPLY SEND Prefix: %s", inet_ntoa(nbr->src));
/* Check if any list fits */
if ((alist
&& access_list_apply(alist, (struct prefix *)pe2->destination_ipv4)
@ -106,15 +104,13 @@ void eigrp_send_reply(struct eigrp_neighbor *nbr, struct eigrp_prefix_entry *pe)
zlog_info("REPLY SEND: Setting Metric to max");
pe2->reported_metric.delay = EIGRP_MAX_METRIC;
} else {
zlog_info("REPLY SEND: Not setting metric");
}
/*
* End of filtering
*/
ep = eigrp_packet_new(nbr->ei->ifp->mtu);
ep = eigrp_packet_new(nbr->ei->ifp->mtu, nbr);
/* Prepare EIGRP INIT UPDATE header */
eigrp_packet_header_init(EIGRP_OPC_REPLY, nbr->ei, ep->s, 0,
@ -144,7 +140,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);

View File

@ -123,7 +123,7 @@ void eigrp_send_siaquery(struct eigrp_neighbor *nbr,
struct eigrp_packet *ep;
u_int16_t length = EIGRP_HEADER_LEN;
ep = eigrp_packet_new(nbr->ei->ifp->mtu);
ep = eigrp_packet_new(nbr->ei->ifp->mtu, nbr);
/* Prepare EIGRP INIT UPDATE header */
eigrp_packet_header_init(EIGRP_OPC_SIAQUERY, nbr->ei, ep->s, 0,
@ -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);

View File

@ -122,7 +122,7 @@ void eigrp_send_siareply(struct eigrp_neighbor *nbr,
struct eigrp_packet *ep;
u_int16_t length = EIGRP_HEADER_LEN;
ep = eigrp_packet_new(nbr->ei->ifp->mtu);
ep = eigrp_packet_new(nbr->ei->ifp->mtu, nbr);
/* Prepare EIGRP INIT UPDATE header */
eigrp_packet_header_init(EIGRP_OPC_SIAREPLY, nbr->ei, ep->s, 0,
@ -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);

View File

@ -311,6 +311,8 @@ struct eigrp_packet {
/* EIGRP packet length. */
u_int16_t length;
struct eigrp_neighbor *nbr;
};
struct eigrp_fifo {

View File

@ -463,7 +463,7 @@ void eigrp_update_send_init(struct eigrp_neighbor *nbr)
struct eigrp_packet *ep;
u_int16_t length = EIGRP_HEADER_LEN;
ep = eigrp_packet_new(nbr->ei->ifp->mtu);
ep = eigrp_packet_new(nbr->ei->ifp->mtu, nbr);
/* Prepare EIGRP INIT UPDATE header */
if (IS_DEBUG_EIGRP_PACKET(0, RECV))
@ -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)
@ -546,7 +546,7 @@ void eigrp_update_send_EOT(struct eigrp_neighbor *nbr)
struct prefix_ipv4 *dest_addr;
u_int32_t seq_no = nbr->ei->eigrp->sequence_number;
ep = eigrp_packet_new(nbr->ei->ifp->mtu);
ep = eigrp_packet_new(nbr->ei->ifp->mtu, nbr);
/* Prepare EIGRP EOT UPDATE header */
eigrp_packet_header_init(EIGRP_OPC_UPDATE, nbr->ei, ep->s, EIGRP_EOT_FLAG,
@ -571,7 +571,7 @@ void eigrp_update_send_EOT(struct eigrp_neighbor *nbr)
seq_no++;
length = EIGRP_HEADER_LEN;
ep = eigrp_packet_new(nbr->ei->ifp->mtu);
ep = eigrp_packet_new(nbr->ei->ifp->mtu, nbr);
eigrp_packet_header_init(EIGRP_OPC_UPDATE, nbr->ei, ep->s, EIGRP_EOT_FLAG,
seq_no, nbr->recv_sequence_number);
@ -635,7 +635,7 @@ void eigrp_update_send(struct eigrp_interface *ei)
u_int16_t length = EIGRP_HEADER_LEN;
ep = eigrp_packet_new(ei->ifp->mtu);
ep = eigrp_packet_new(ei->ifp->mtu, NULL);
/* Prepare EIGRP INIT UPDATE header */
eigrp_packet_header_init(EIGRP_OPC_UPDATE, ei, ep->s, 0,
@ -684,13 +684,9 @@ void eigrp_update_send(struct eigrp_interface *ei)
&& prefix_list_apply(plist_i,
(struct prefix *)dest_addr)
== PREFIX_DENY)) {
zlog_info("PROC OUT: Skipping");
// pe->reported_metric.delay = EIGRP_MAX_METRIC;
zlog_info("PROC OUT Prefix: %s",
inet_ntoa(dest_addr->prefix));
continue;
} else {
zlog_info("PROC OUT: NENastavujem metriku ");
length += eigrp_add_internalTLV_to_stream(ep->s,
pe);
has_tlv = 1;
@ -731,7 +727,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);
@ -762,8 +758,6 @@ void eigrp_update_send_all(struct eigrp *eigrp,
pe->req_action &= ~EIGRP_FSM_NEED_UPDATE;
listnode_delete(eigrp->topology_changes_internalIPV4,
pe);
zlog_debug("UPDATE COUNT: %d",
eigrp->topology_changes_internalIPV4->count);
}
}
}
@ -835,7 +829,7 @@ static void eigrp_update_send_GR_part(struct eigrp_neighbor *nbr)
}
}
ep = eigrp_packet_new(nbr->ei->ifp->mtu);
ep = eigrp_packet_new(nbr->ei->ifp->mtu, nbr);
/* Prepare EIGRP Graceful restart UPDATE header */
eigrp_packet_header_init(EIGRP_OPC_UPDATE, nbr->ei, ep->s, flags,
@ -980,7 +974,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);