mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-07-27 03:33:43 +00:00
Merge pull request #1000 from donaldsharp/eigrp_packet_stuff
Eigrp packet stuff
This commit is contained in:
commit
3b09001eb1
@ -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);
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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 *);
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -311,6 +311,8 @@ struct eigrp_packet {
|
||||
|
||||
/* EIGRP packet length. */
|
||||
u_int16_t length;
|
||||
|
||||
struct eigrp_neighbor *nbr;
|
||||
};
|
||||
|
||||
struct eigrp_fifo {
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user