mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-07-27 10:04:18 +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)
|
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,
|
msg->eigrp->AS, msg->prefix->state, event,
|
||||||
eigrp_topology_ip_string(msg->prefix));
|
eigrp_topology_ip_string(msg->prefix));
|
||||||
(*(NSM[msg->prefix->state][event].func))(msg);
|
(*(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;
|
u_int16_t length = EIGRP_HEADER_LEN;
|
||||||
|
|
||||||
// allocate a new packet to be sent
|
// allocate a new packet to be sent
|
||||||
ep = eigrp_packet_new(ei->ifp->mtu);
|
ep = eigrp_packet_new(ei->ifp->mtu, NULL);
|
||||||
|
|
||||||
if (ep) {
|
if (ep) {
|
||||||
// encode common header feilds
|
// encode common header feilds
|
||||||
@ -707,7 +707,7 @@ void eigrp_hello_send_ack(struct eigrp_neighbor *nbr)
|
|||||||
inet_ntoa(nbr->src));
|
inet_ntoa(nbr->src));
|
||||||
|
|
||||||
/* Add packet to the top of the interface output queue*/
|
/* 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. */
|
/* Hook thread to write packet. */
|
||||||
if (nbr->ei->on_write_q == 0) {
|
if (nbr->ei->on_write_q == 0) {
|
||||||
@ -755,7 +755,7 @@ void eigrp_hello_send(struct eigrp_interface *ei, u_char flags,
|
|||||||
|
|
||||||
if (ep) {
|
if (ep) {
|
||||||
// Add packet to the top of the interface output queue
|
// 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. */
|
/* Hook thread to write packet. */
|
||||||
if (ei->on_write_q == 0) {
|
if (ei->on_write_q == 0) {
|
||||||
|
@ -299,18 +299,6 @@ int eigrp_check_sha256_digest(struct stream *s,
|
|||||||
return 1;
|
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)
|
int eigrp_write(struct thread *thread)
|
||||||
{
|
{
|
||||||
struct eigrp *eigrp = THREAD_ARG(thread);
|
struct eigrp *eigrp = THREAD_ARG(thread);
|
||||||
@ -322,6 +310,7 @@ int eigrp_write(struct thread *thread)
|
|||||||
struct msghdr msg;
|
struct msghdr msg;
|
||||||
struct iovec iov[2];
|
struct iovec iov[2];
|
||||||
u_int16_t opcode = 0;
|
u_int16_t opcode = 0;
|
||||||
|
u_int32_t seqno, ack;
|
||||||
|
|
||||||
int ret;
|
int ret;
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
@ -347,7 +336,7 @@ int eigrp_write(struct thread *thread)
|
|||||||
#endif /* WANT_EIGRP_WRITE_FRAGMENT */
|
#endif /* WANT_EIGRP_WRITE_FRAGMENT */
|
||||||
|
|
||||||
/* Get one packet from queue. */
|
/* Get one packet from queue. */
|
||||||
ep = eigrp_fifo_head(ei->obuf);
|
ep = eigrp_fifo_next(ei->obuf);
|
||||||
assert(ep);
|
assert(ep);
|
||||||
assert(ep->length >= EIGRP_HEADER_LEN);
|
assert(ep->length >= EIGRP_HEADER_LEN);
|
||||||
|
|
||||||
@ -357,6 +346,25 @@ int eigrp_write(struct thread *thread)
|
|||||||
memset(&iph, 0, sizeof(struct ip));
|
memset(&iph, 0, sizeof(struct ip));
|
||||||
memset(&sa_dst, 0, sizeof(sa_dst));
|
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;
|
sa_dst.sin_family = AF_INET;
|
||||||
#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
|
#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
|
||||||
sa_dst.sin_len = sizeof(sa_dst);
|
sa_dst.sin_len = sizeof(sa_dst);
|
||||||
@ -412,8 +420,9 @@ int eigrp_write(struct thread *thread)
|
|||||||
if (IS_DEBUG_EIGRP_TRANSMIT(0, SEND)) {
|
if (IS_DEBUG_EIGRP_TRANSMIT(0, SEND)) {
|
||||||
eigrph = (struct eigrp_header *)STREAM_DATA(ep->s);
|
eigrph = (struct eigrp_header *)STREAM_DATA(ep->s);
|
||||||
opcode = eigrph->opcode;
|
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),
|
lookup_msg(eigrp_packet_type_str, opcode, NULL),
|
||||||
|
seqno, ack,
|
||||||
inet_ntoa(ep->dst), IF_NAME(ei), ret);
|
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,
|
iph.ip_len, ei->ifp->name, ei->ifp->mtu,
|
||||||
safe_strerror(errno));
|
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. */
|
/* Now delete packet from queue. */
|
||||||
eigrp_packet_delete(ei);
|
eigrp_packet_delete(ei);
|
||||||
|
|
||||||
if (eigrp_fifo_head(ei->obuf) == NULL) {
|
if (eigrp_fifo_next(ei->obuf) == NULL) {
|
||||||
ei->on_write_q = 0;
|
ei->on_write_q = 0;
|
||||||
list_delete_node(eigrp->oi_write_q, node);
|
list_delete_node(eigrp->oi_write_q, node);
|
||||||
}
|
}
|
||||||
@ -615,12 +612,16 @@ int eigrp_read(struct thread *thread)
|
|||||||
start of the eigrp TLVs */
|
start of the eigrp TLVs */
|
||||||
opcode = eigrph->opcode;
|
opcode = eigrph->opcode;
|
||||||
|
|
||||||
if (IS_DEBUG_EIGRP_TRANSMIT(0, RECV))
|
if (IS_DEBUG_EIGRP_TRANSMIT(0, RECV)) {
|
||||||
zlog_debug(
|
char src[100], dst[100];
|
||||||
"Received [%s] length [%u] via [%s] src [%s] dst [%s]",
|
|
||||||
lookup_msg(eigrp_packet_type_str, opcode, NULL), length,
|
strcpy(src, inet_ntoa(iph->ip_src));
|
||||||
IF_NAME(ei), inet_ntoa(iph->ip_src),
|
strcpy(dst, inet_ntoa(iph->ip_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. */
|
/* Read rest of the packet and call each sort of packet routine. */
|
||||||
stream_forward_getp(ibuf, EIGRP_HEADER_LEN);
|
stream_forward_getp(ibuf, EIGRP_HEADER_LEN);
|
||||||
@ -635,7 +636,7 @@ int eigrp_read(struct thread *thread)
|
|||||||
|
|
||||||
struct eigrp_packet *ep;
|
struct eigrp_packet *ep;
|
||||||
|
|
||||||
ep = eigrp_fifo_tail(nbr->retrans_queue);
|
ep = eigrp_fifo_next(nbr->retrans_queue);
|
||||||
if (ep) {
|
if (ep) {
|
||||||
if (ntohl(eigrph->ack) == ep->sequence_number) {
|
if (ntohl(eigrph->ack) == ep->sequence_number) {
|
||||||
if ((nbr->state == EIGRP_NEIGHBOR_PENDING)
|
if ((nbr->state == EIGRP_NEIGHBOR_PENDING)
|
||||||
@ -643,24 +644,24 @@ int eigrp_read(struct thread *thread)
|
|||||||
== nbr->init_sequence_number)) {
|
== nbr->init_sequence_number)) {
|
||||||
eigrp_nbr_state_set(nbr,
|
eigrp_nbr_state_set(nbr,
|
||||||
EIGRP_NEIGHBOR_UP);
|
EIGRP_NEIGHBOR_UP);
|
||||||
zlog_info(
|
zlog_info("Neighbor(%s) adjacency became full",
|
||||||
"Neighbor adjacency became full");
|
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_tail(nbr->retrans_queue);
|
ep = eigrp_fifo_pop(nbr->retrans_queue);
|
||||||
eigrp_packet_free(ep);
|
eigrp_packet_free(ep);
|
||||||
if (nbr->retrans_queue->count > 0) {
|
if (nbr->retrans_queue->count > 0) {
|
||||||
eigrp_send_packet_reliably(nbr);
|
eigrp_send_packet_reliably(nbr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ep = eigrp_fifo_tail(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) {
|
||||||
ep = eigrp_fifo_pop_tail(nbr->multicast_queue);
|
ep = eigrp_fifo_pop(nbr->multicast_queue);
|
||||||
eigrp_packet_free(ep);
|
eigrp_packet_free(ep);
|
||||||
if (nbr->multicast_queue->count > 0) {
|
if (nbr->multicast_queue->count > 0) {
|
||||||
eigrp_send_packet_reliably(nbr);
|
eigrp_send_packet_reliably(nbr);
|
||||||
@ -826,13 +827,14 @@ void eigrp_fifo_reset(struct eigrp_fifo *fifo)
|
|||||||
fifo->count = 0;
|
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;
|
struct eigrp_packet *new;
|
||||||
|
|
||||||
new = XCALLOC(MTYPE_EIGRP_PACKET, sizeof(struct eigrp_packet));
|
new = XCALLOC(MTYPE_EIGRP_PACKET, sizeof(struct eigrp_packet));
|
||||||
new->s = stream_new(size);
|
new->s = stream_new(size);
|
||||||
new->retrans_counter = 0;
|
new->retrans_counter = 0;
|
||||||
|
new->nbr = nbr;
|
||||||
|
|
||||||
return new;
|
return new;
|
||||||
}
|
}
|
||||||
@ -841,13 +843,13 @@ void eigrp_send_packet_reliably(struct eigrp_neighbor *nbr)
|
|||||||
{
|
{
|
||||||
struct eigrp_packet *ep;
|
struct eigrp_packet *ep;
|
||||||
|
|
||||||
ep = eigrp_fifo_tail(nbr->retrans_queue);
|
ep = eigrp_fifo_next(nbr->retrans_queue);
|
||||||
|
|
||||||
if (ep) {
|
if (ep) {
|
||||||
struct eigrp_packet *duplicate;
|
struct eigrp_packet *duplicate;
|
||||||
duplicate = eigrp_packet_duplicate(ep, nbr);
|
duplicate = eigrp_packet_duplicate(ep, nbr);
|
||||||
/* Add packet to the top of the interface output queue*/
|
/* 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*/
|
/*Start retransmission timer*/
|
||||||
thread_add_timer(master, eigrp_unack_packet_retrans, nbr,
|
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->sequence = htonl(3);
|
||||||
eigrph->flags = htonl(flags);
|
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]",
|
zlog_debug("Packet Header Init Seq [%u] Ack [%u]",
|
||||||
htonl(eigrph->sequence), htonl(eigrph->ack));
|
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. */
|
/* 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->next = fifo->head;
|
||||||
ep->previous = NULL;
|
ep->previous = NULL;
|
||||||
@ -925,14 +927,8 @@ void eigrp_fifo_push_head(struct eigrp_fifo *fifo, struct eigrp_packet *ep)
|
|||||||
fifo->count++;
|
fifo->count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return first fifo entry. */
|
|
||||||
struct eigrp_packet *eigrp_fifo_head(struct eigrp_fifo *fifo)
|
|
||||||
{
|
|
||||||
return fifo->head;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return last fifo entry. */
|
/* 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;
|
return fifo->tail;
|
||||||
}
|
}
|
||||||
@ -947,27 +943,6 @@ void eigrp_packet_delete(struct eigrp_interface *ei)
|
|||||||
eigrp_packet_free(ep);
|
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)
|
void eigrp_packet_free(struct eigrp_packet *ep)
|
||||||
{
|
{
|
||||||
if (ep->s)
|
if (ep->s)
|
||||||
@ -1028,14 +1003,14 @@ int eigrp_unack_packet_retrans(struct thread *thread)
|
|||||||
nbr = (struct eigrp_neighbor *)THREAD_ARG(thread);
|
nbr = (struct eigrp_neighbor *)THREAD_ARG(thread);
|
||||||
|
|
||||||
struct eigrp_packet *ep;
|
struct eigrp_packet *ep;
|
||||||
ep = eigrp_fifo_tail(nbr->retrans_queue);
|
ep = eigrp_fifo_next(nbr->retrans_queue);
|
||||||
|
|
||||||
if (ep) {
|
if (ep) {
|
||||||
struct eigrp_packet *duplicate;
|
struct eigrp_packet *duplicate;
|
||||||
duplicate = eigrp_packet_duplicate(ep, nbr);
|
duplicate = eigrp_packet_duplicate(ep, nbr);
|
||||||
|
|
||||||
/* Add packet to the top of the interface output queue*/
|
/* 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++;
|
ep->retrans_counter++;
|
||||||
if (ep->retrans_counter == EIGRP_PACKET_RETRANS_MAX)
|
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);
|
nbr = (struct eigrp_neighbor *)THREAD_ARG(thread);
|
||||||
|
|
||||||
struct eigrp_packet *ep;
|
struct eigrp_packet *ep;
|
||||||
ep = eigrp_fifo_tail(nbr->multicast_queue);
|
ep = eigrp_fifo_next(nbr->multicast_queue);
|
||||||
|
|
||||||
if (ep) {
|
if (ep) {
|
||||||
struct eigrp_packet *duplicate;
|
struct eigrp_packet *duplicate;
|
||||||
duplicate = eigrp_packet_duplicate(ep, nbr);
|
duplicate = eigrp_packet_duplicate(ep, nbr);
|
||||||
/* Add packet to the top of the interface output queue*/
|
/* 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++;
|
ep->retrans_counter++;
|
||||||
if (ep->retrans_counter == EIGRP_PACKET_RETRANS_MAX)
|
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. */
|
/* 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;
|
struct eigrp_packet *ep;
|
||||||
|
|
||||||
@ -1121,7 +1096,7 @@ struct eigrp_packet *eigrp_packet_duplicate(struct eigrp_packet *old,
|
|||||||
{
|
{
|
||||||
struct eigrp_packet *new;
|
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->length = old->length;
|
||||||
new->retrans_counter = old->retrans_counter;
|
new->retrans_counter = old->retrans_counter;
|
||||||
new->dst = old->dst;
|
new->dst = old->dst;
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
extern int eigrp_read(struct thread *);
|
extern int eigrp_read(struct thread *);
|
||||||
extern int eigrp_write(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 *,
|
extern struct eigrp_packet *eigrp_packet_duplicate(struct eigrp_packet *,
|
||||||
struct eigrp_neighbor *);
|
struct eigrp_neighbor *);
|
||||||
extern void eigrp_packet_free(struct eigrp_packet *);
|
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);
|
u_int16_t);
|
||||||
|
|
||||||
extern struct eigrp_fifo *eigrp_fifo_new(void);
|
extern struct eigrp_fifo *eigrp_fifo_new(void);
|
||||||
extern struct eigrp_packet *eigrp_fifo_head(struct eigrp_fifo *);
|
extern struct eigrp_packet *eigrp_fifo_next(struct eigrp_fifo *);
|
||||||
extern struct eigrp_packet *eigrp_fifo_tail(struct eigrp_fifo *);
|
|
||||||
extern struct eigrp_packet *eigrp_fifo_pop(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(struct eigrp_fifo *, struct eigrp_packet *);
|
||||||
extern void eigrp_fifo_push_head(struct eigrp_fifo *, struct eigrp_packet *);
|
|
||||||
extern void eigrp_fifo_free(struct eigrp_fifo *);
|
extern void eigrp_fifo_free(struct eigrp_fifo *);
|
||||||
extern void eigrp_fifo_reset(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;
|
char has_tlv;
|
||||||
bool ep_saved = false;
|
bool ep_saved = false;
|
||||||
|
|
||||||
ep = eigrp_packet_new(ei->ifp->mtu);
|
ep = eigrp_packet_new(ei->ifp->mtu, NULL);
|
||||||
|
|
||||||
/* Prepare EIGRP INIT UPDATE header */
|
/* Prepare EIGRP INIT UPDATE header */
|
||||||
eigrp_packet_header_init(EIGRP_OPC_QUERY, ei, ep->s, 0,
|
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)) {
|
for (ALL_LIST_ELEMENTS(ei->nbrs, node2, nnode2, nbr)) {
|
||||||
if (nbr->state == EIGRP_NEIGHBOR_UP) {
|
if (nbr->state == EIGRP_NEIGHBOR_UP) {
|
||||||
/*Put packet to retransmission queue*/
|
/*Put packet to retransmission queue*/
|
||||||
eigrp_fifo_push_head(nbr->retrans_queue, ep);
|
eigrp_fifo_push(nbr->retrans_queue, ep);
|
||||||
ep_saved = true;
|
ep_saved = true;
|
||||||
|
|
||||||
if (nbr->retrans_queue->count == 1) {
|
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];
|
plist = e->prefix[EIGRP_FILTER_OUT];
|
||||||
alist_i = nbr->ei->list[EIGRP_FILTER_OUT];
|
alist_i = nbr->ei->list[EIGRP_FILTER_OUT];
|
||||||
plist_i = nbr->ei->prefix[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 */
|
/* Check if any list fits */
|
||||||
if ((alist
|
if ((alist
|
||||||
&& access_list_apply(alist, (struct prefix *)pe2->destination_ipv4)
|
&& 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");
|
zlog_info("REPLY SEND: Setting Metric to max");
|
||||||
pe2->reported_metric.delay = EIGRP_MAX_METRIC;
|
pe2->reported_metric.delay = EIGRP_MAX_METRIC;
|
||||||
|
|
||||||
} else {
|
|
||||||
zlog_info("REPLY SEND: Not setting metric");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* End of filtering
|
* 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 */
|
/* Prepare EIGRP INIT UPDATE header */
|
||||||
eigrp_packet_header_init(EIGRP_OPC_REPLY, nbr->ei, ep->s, 0,
|
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;
|
ep->sequence_number = nbr->ei->eigrp->sequence_number;
|
||||||
|
|
||||||
/*Put packet to retransmission queue*/
|
/*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) {
|
if (nbr->retrans_queue->count == 1) {
|
||||||
eigrp_send_packet_reliably(nbr);
|
eigrp_send_packet_reliably(nbr);
|
||||||
|
@ -123,7 +123,7 @@ void eigrp_send_siaquery(struct eigrp_neighbor *nbr,
|
|||||||
struct eigrp_packet *ep;
|
struct eigrp_packet *ep;
|
||||||
u_int16_t length = EIGRP_HEADER_LEN;
|
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 */
|
/* Prepare EIGRP INIT UPDATE header */
|
||||||
eigrp_packet_header_init(EIGRP_OPC_SIAQUERY, nbr->ei, ep->s, 0,
|
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) {
|
if (nbr->state == EIGRP_NEIGHBOR_UP) {
|
||||||
/*Put packet to retransmission queue*/
|
/*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) {
|
if (nbr->retrans_queue->count == 1) {
|
||||||
eigrp_send_packet_reliably(nbr);
|
eigrp_send_packet_reliably(nbr);
|
||||||
|
@ -122,7 +122,7 @@ void eigrp_send_siareply(struct eigrp_neighbor *nbr,
|
|||||||
struct eigrp_packet *ep;
|
struct eigrp_packet *ep;
|
||||||
u_int16_t length = EIGRP_HEADER_LEN;
|
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 */
|
/* Prepare EIGRP INIT UPDATE header */
|
||||||
eigrp_packet_header_init(EIGRP_OPC_SIAREPLY, nbr->ei, ep->s, 0,
|
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) {
|
if (nbr->state == EIGRP_NEIGHBOR_UP) {
|
||||||
/*Put packet to retransmission queue*/
|
/*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) {
|
if (nbr->retrans_queue->count == 1) {
|
||||||
eigrp_send_packet_reliably(nbr);
|
eigrp_send_packet_reliably(nbr);
|
||||||
|
@ -311,6 +311,8 @@ struct eigrp_packet {
|
|||||||
|
|
||||||
/* EIGRP packet length. */
|
/* EIGRP packet length. */
|
||||||
u_int16_t length;
|
u_int16_t length;
|
||||||
|
|
||||||
|
struct eigrp_neighbor *nbr;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct eigrp_fifo {
|
struct eigrp_fifo {
|
||||||
|
@ -463,7 +463,7 @@ void eigrp_update_send_init(struct eigrp_neighbor *nbr)
|
|||||||
struct eigrp_packet *ep;
|
struct eigrp_packet *ep;
|
||||||
u_int16_t length = EIGRP_HEADER_LEN;
|
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 */
|
/* Prepare EIGRP INIT UPDATE header */
|
||||||
if (IS_DEBUG_EIGRP_PACKET(0, RECV))
|
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));
|
ep->length, ep->sequence_number, inet_ntoa(ep->dst));
|
||||||
|
|
||||||
/*Put packet to retransmission queue*/
|
/*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) {
|
if (nbr->retrans_queue->count == 1) {
|
||||||
eigrp_send_packet_reliably(nbr);
|
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));
|
ep->length, ep->sequence_number, inet_ntoa(ep->dst));
|
||||||
|
|
||||||
/*Put packet to retransmission queue*/
|
/*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)
|
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;
|
struct prefix_ipv4 *dest_addr;
|
||||||
u_int32_t seq_no = nbr->ei->eigrp->sequence_number;
|
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 */
|
/* Prepare EIGRP EOT UPDATE header */
|
||||||
eigrp_packet_header_init(EIGRP_OPC_UPDATE, nbr->ei, ep->s, EIGRP_EOT_FLAG,
|
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++;
|
seq_no++;
|
||||||
|
|
||||||
length = EIGRP_HEADER_LEN;
|
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,
|
eigrp_packet_header_init(EIGRP_OPC_UPDATE, nbr->ei, ep->s, EIGRP_EOT_FLAG,
|
||||||
seq_no, nbr->recv_sequence_number);
|
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;
|
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 */
|
/* Prepare EIGRP INIT UPDATE header */
|
||||||
eigrp_packet_header_init(EIGRP_OPC_UPDATE, ei, ep->s, 0,
|
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,
|
&& prefix_list_apply(plist_i,
|
||||||
(struct prefix *)dest_addr)
|
(struct prefix *)dest_addr)
|
||||||
== PREFIX_DENY)) {
|
== PREFIX_DENY)) {
|
||||||
zlog_info("PROC OUT: Skipping");
|
|
||||||
// pe->reported_metric.delay = EIGRP_MAX_METRIC;
|
// pe->reported_metric.delay = EIGRP_MAX_METRIC;
|
||||||
zlog_info("PROC OUT Prefix: %s",
|
|
||||||
inet_ntoa(dest_addr->prefix));
|
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
zlog_info("PROC OUT: NENastavujem metriku ");
|
|
||||||
length += eigrp_add_internalTLV_to_stream(ep->s,
|
length += eigrp_add_internalTLV_to_stream(ep->s,
|
||||||
pe);
|
pe);
|
||||||
has_tlv = 1;
|
has_tlv = 1;
|
||||||
@ -731,7 +727,7 @@ void eigrp_update_send(struct eigrp_interface *ei)
|
|||||||
if (nbr->state == EIGRP_NEIGHBOR_UP) {
|
if (nbr->state == EIGRP_NEIGHBOR_UP) {
|
||||||
packet_sent = true;
|
packet_sent = true;
|
||||||
/*Put packet to retransmission queue*/
|
/*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) {
|
if (nbr->retrans_queue->count == 1) {
|
||||||
eigrp_send_packet_reliably(nbr);
|
eigrp_send_packet_reliably(nbr);
|
||||||
@ -762,8 +758,6 @@ void eigrp_update_send_all(struct eigrp *eigrp,
|
|||||||
pe->req_action &= ~EIGRP_FSM_NEED_UPDATE;
|
pe->req_action &= ~EIGRP_FSM_NEED_UPDATE;
|
||||||
listnode_delete(eigrp->topology_changes_internalIPV4,
|
listnode_delete(eigrp->topology_changes_internalIPV4,
|
||||||
pe);
|
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 */
|
/* Prepare EIGRP Graceful restart UPDATE header */
|
||||||
eigrp_packet_header_init(EIGRP_OPC_UPDATE, nbr->ei, ep->s, flags,
|
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));
|
ep->length, ep->sequence_number, inet_ntoa(ep->dst));
|
||||||
|
|
||||||
/*Put packet to retransmission queue*/
|
/*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) {
|
if (nbr->retrans_queue->count == 1) {
|
||||||
eigrp_send_packet_reliably(nbr);
|
eigrp_send_packet_reliably(nbr);
|
||||||
|
Loading…
Reference in New Issue
Block a user