diff options
Diffstat (limited to 'eigrpd/eigrp_siareply.c')
| -rw-r--r-- | eigrpd/eigrp_siareply.c | 206 | 
1 files changed, 100 insertions, 106 deletions
diff --git a/eigrpd/eigrp_siareply.c b/eigrpd/eigrp_siareply.c index dbf451800e..9a768566d3 100644 --- a/eigrpd/eigrp_siareply.c +++ b/eigrpd/eigrp_siareply.c @@ -54,115 +54,109 @@  #include "eigrpd/eigrp_memory.h"  /*EIGRP SIA-REPLY read function*/ -void -eigrp_siareply_receive (struct eigrp *eigrp, struct ip *iph, struct eigrp_header *eigrph, -                        struct stream * s, struct eigrp_interface *ei, int size) +void eigrp_siareply_receive(struct eigrp *eigrp, struct ip *iph, +			    struct eigrp_header *eigrph, struct stream *s, +			    struct eigrp_interface *ei, int size)  { -  struct eigrp_neighbor *nbr; -  struct TLV_IPv4_Internal_type *tlv; - -  u_int16_t type; - -  /* increment statistics. */ -  ei->siaReply_in++; - -  /* get neighbor struct */ -  nbr = eigrp_nbr_get(ei, eigrph, iph); - -  /* neighbor must be valid, eigrp_nbr_get creates if none existed */ -  assert(nbr); - -  nbr->recv_sequence_number = ntohl(eigrph->sequence); - -  while (s->endp > s->getp) -    { -      type = stream_getw(s); -      if (type == EIGRP_TLV_IPv4_INT) -        { -	  struct prefix_ipv4 dest_addr; - -          stream_set_getp(s, s->getp - sizeof(u_int16_t)); - -          tlv = eigrp_read_ipv4_tlv(s); - -          dest_addr.family = AFI_IP; -          dest_addr.prefix = tlv->destination; -          dest_addr.prefixlen = tlv->prefix_length; -          struct eigrp_prefix_entry *dest = -            eigrp_topology_table_lookup_ipv4(eigrp->topology_table, &dest_addr); - -          /* If the destination exists (it should, but one never know)*/ -          if (dest != NULL) -            { -              struct eigrp_fsm_action_message *msg; -              msg = XCALLOC(MTYPE_EIGRP_FSM_MSG, -                            sizeof(struct eigrp_fsm_action_message)); -              struct eigrp_neighbor_entry *entry = -                eigrp_prefix_entry_lookup(dest->entries, nbr); -              msg->packet_type = EIGRP_OPC_SIAQUERY; -              msg->eigrp = eigrp; -              msg->data_type = EIGRP_TLV_IPv4_INT; -              msg->adv_router = nbr; -              msg->data.ipv4_int_type = tlv; -              msg->entry = entry; -              msg->prefix = dest; -              int event = eigrp_get_fsm_event(msg); -              eigrp_fsm_event(msg, event); -            } -          eigrp_IPv4_InternalTLV_free (tlv); -        } -    } -  eigrp_hello_send_ack(nbr); +	struct eigrp_neighbor *nbr; +	struct TLV_IPv4_Internal_type *tlv; + +	u_int16_t type; + +	/* increment statistics. */ +	ei->siaReply_in++; + +	/* get neighbor struct */ +	nbr = eigrp_nbr_get(ei, eigrph, iph); + +	/* neighbor must be valid, eigrp_nbr_get creates if none existed */ +	assert(nbr); + +	nbr->recv_sequence_number = ntohl(eigrph->sequence); + +	while (s->endp > s->getp) { +		type = stream_getw(s); +		if (type == EIGRP_TLV_IPv4_INT) { +			struct prefix_ipv4 dest_addr; + +			stream_set_getp(s, s->getp - sizeof(u_int16_t)); + +			tlv = eigrp_read_ipv4_tlv(s); + +			dest_addr.family = AFI_IP; +			dest_addr.prefix = tlv->destination; +			dest_addr.prefixlen = tlv->prefix_length; +			struct eigrp_prefix_entry *dest = +				eigrp_topology_table_lookup_ipv4( +					eigrp->topology_table, &dest_addr); + +			/* If the destination exists (it should, but one never +			 * know)*/ +			if (dest != NULL) { +				struct eigrp_fsm_action_message *msg; +				msg = XCALLOC(MTYPE_EIGRP_FSM_MSG, +					      sizeof(struct +						     eigrp_fsm_action_message)); +				struct eigrp_neighbor_entry *entry = +					eigrp_prefix_entry_lookup(dest->entries, +								  nbr); +				msg->packet_type = EIGRP_OPC_SIAQUERY; +				msg->eigrp = eigrp; +				msg->data_type = EIGRP_TLV_IPv4_INT; +				msg->adv_router = nbr; +				msg->data.ipv4_int_type = tlv; +				msg->entry = entry; +				msg->prefix = dest; +				int event = eigrp_get_fsm_event(msg); +				eigrp_fsm_event(msg, event); +			} +			eigrp_IPv4_InternalTLV_free(tlv); +		} +	} +	eigrp_hello_send_ack(nbr);  } -void -eigrp_send_siareply (struct eigrp_neighbor *nbr, struct eigrp_prefix_entry *pe) +void eigrp_send_siareply(struct eigrp_neighbor *nbr, +			 struct eigrp_prefix_entry *pe)  { -  struct eigrp_packet *ep; -  u_int16_t length = EIGRP_HEADER_LEN; - -  ep = eigrp_packet_new(nbr->ei->ifp->mtu); - -  /* Prepare EIGRP INIT UPDATE header */ -  eigrp_packet_header_init(EIGRP_OPC_SIAREPLY, nbr->ei, ep->s, 0, -                           nbr->ei->eigrp->sequence_number, 0); - -  // encode Authentication TLV, if needed -  if((IF_DEF_PARAMS (nbr->ei->ifp)->auth_type == EIGRP_AUTH_TYPE_MD5) && -     (IF_DEF_PARAMS (nbr->ei->ifp)->auth_keychain != NULL)) -    { -      length += eigrp_add_authTLV_MD5_to_stream(ep->s,nbr->ei); -    } - -  length += eigrp_add_internalTLV_to_stream(ep->s, pe); - -  if((IF_DEF_PARAMS (nbr->ei->ifp)->auth_type == EIGRP_AUTH_TYPE_MD5) && -     (IF_DEF_PARAMS (nbr->ei->ifp)->auth_keychain != NULL)) -    { -      eigrp_make_md5_digest(nbr->ei,ep->s, EIGRP_AUTH_UPDATE_FLAG); -    } - -  /* EIGRP Checksum */ -  eigrp_packet_checksum(nbr->ei, ep->s, length); - -  ep->length = length; -  ep->dst.s_addr = nbr->src.s_addr; - -  /*This ack number we await from neighbor*/ -  ep->sequence_number = nbr->ei->eigrp->sequence_number; - -  if (nbr->state == EIGRP_NEIGHBOR_UP) -    { -      /*Put packet to retransmission queue*/ -      eigrp_fifo_push_head(nbr->retrans_queue, ep); - -      if (nbr->retrans_queue->count == 1) -        { -          eigrp_send_packet_reliably(nbr); -        } -    } -  else -    eigrp_packet_free(ep); -} +	struct eigrp_packet *ep; +	u_int16_t length = EIGRP_HEADER_LEN; + +	ep = eigrp_packet_new(nbr->ei->ifp->mtu); + +	/* Prepare EIGRP INIT UPDATE header */ +	eigrp_packet_header_init(EIGRP_OPC_SIAREPLY, nbr->ei, ep->s, 0, +				 nbr->ei->eigrp->sequence_number, 0); + +	// encode Authentication TLV, if needed +	if ((IF_DEF_PARAMS(nbr->ei->ifp)->auth_type == EIGRP_AUTH_TYPE_MD5) +	    && (IF_DEF_PARAMS(nbr->ei->ifp)->auth_keychain != NULL)) { +		length += eigrp_add_authTLV_MD5_to_stream(ep->s, nbr->ei); +	} + +	length += eigrp_add_internalTLV_to_stream(ep->s, pe); +	if ((IF_DEF_PARAMS(nbr->ei->ifp)->auth_type == EIGRP_AUTH_TYPE_MD5) +	    && (IF_DEF_PARAMS(nbr->ei->ifp)->auth_keychain != NULL)) { +		eigrp_make_md5_digest(nbr->ei, ep->s, EIGRP_AUTH_UPDATE_FLAG); +	} +	/* EIGRP Checksum */ +	eigrp_packet_checksum(nbr->ei, ep->s, length); + +	ep->length = length; +	ep->dst.s_addr = nbr->src.s_addr; + +	/*This ack number we await from neighbor*/ +	ep->sequence_number = nbr->ei->eigrp->sequence_number; + +	if (nbr->state == EIGRP_NEIGHBOR_UP) { +		/*Put packet to retransmission queue*/ +		eigrp_fifo_push_head(nbr->retrans_queue, ep); + +		if (nbr->retrans_queue->count == 1) { +			eigrp_send_packet_reliably(nbr); +		} +	} else +		eigrp_packet_free(ep); +}  | 
