Skip to content

Commit

Permalink
Merge pull request #2167 from piotrjurkiewicz/master
Browse files Browse the repository at this point in the history
eigrpd: Correctly calculate EIGRP packet MTU
  • Loading branch information
donaldsharp committed May 4, 2018
2 parents babf583 + 9378632 commit 87e6a84
Show file tree
Hide file tree
Showing 8 changed files with 21 additions and 17 deletions.
2 changes: 1 addition & 1 deletion eigrpd/eigrp_hello.c
Original file line number Diff line number Diff line change
Expand Up @@ -630,7 +630,7 @@ static struct eigrp_packet *eigrp_hello_encode(struct eigrp_interface *ei,
uint16_t length = EIGRP_HEADER_LEN;

// allocate a new packet to be sent
ep = eigrp_packet_new(ei->ifp->mtu, NULL);
ep = eigrp_packet_new(EIGRP_PACKET_MTU(ei->ifp->mtu), NULL);

if (ep) {
// encode common header feilds
Expand Down
2 changes: 2 additions & 0 deletions eigrpd/eigrp_macros.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@

//--------------------------------------------------------------------------

#define EIGRP_PACKET_MTU(mtu) ((mtu) - (sizeof(struct ip)))

/* Topology Macros */


Expand Down
3 changes: 2 additions & 1 deletion eigrpd/eigrp_packet.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
#include "eigrpd/eigrp_zebra.h"
#include "eigrpd/eigrp_vty.h"
#include "eigrpd/eigrp_dump.h"
#include "eigrpd/eigrp_macros.h"
#include "eigrpd/eigrp_network.h"
#include "eigrpd/eigrp_topology.h"
#include "eigrpd/eigrp_fsm.h"
Expand Down Expand Up @@ -1088,7 +1089,7 @@ struct eigrp_packet *eigrp_packet_duplicate(struct eigrp_packet *old,
{
struct eigrp_packet *new;

new = eigrp_packet_new(nbr->ei->ifp->mtu, nbr);
new = eigrp_packet_new(EIGRP_PACKET_MTU(nbr->ei->ifp->mtu), nbr);
new->length = old->length;
new->retrans_counter = old->retrans_counter;
new->dst = old->dst;
Expand Down
5 changes: 3 additions & 2 deletions eigrpd/eigrp_query.c
Original file line number Diff line number Diff line change
Expand Up @@ -167,14 +167,15 @@ void eigrp_send_query(struct eigrp_interface *ei)
struct eigrp_prefix_entry *pe;
bool has_tlv = false;
bool new_packet = true;
uint16_t eigrp_mtu = EIGRP_PACKET_MTU(ei->ifp->mtu);

for (ALL_LIST_ELEMENTS(ei->eigrp->topology_changes_internalIPV4, node,
nnode, pe)) {
if (!(pe->req_action & EIGRP_FSM_NEED_QUERY))
continue;

if (new_packet) {
ep = eigrp_packet_new(ei->ifp->mtu, NULL);
ep = eigrp_packet_new(eigrp_mtu, NULL);

/* Prepare EIGRP INIT UPDATE header */
eigrp_packet_header_init(EIGRP_OPC_QUERY, ei->eigrp,
Expand All @@ -197,7 +198,7 @@ void eigrp_send_query(struct eigrp_interface *ei)
listnode_add(pe->rij, nbr);
}

if (length + EIGRP_TLV_MAX_IPV4_BYTE > (uint16_t)ei->ifp->mtu) {
if (length + EIGRP_TLV_MAX_IPV4_BYTE > eigrp_mtu) {
if ((ei->params.auth_type == EIGRP_AUTH_TYPE_MD5)
&& ei->params.auth_keychain != NULL) {
eigrp_make_md5_digest(ei, ep->s,
Expand Down
2 changes: 1 addition & 1 deletion eigrpd/eigrp_reply.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ void eigrp_send_reply(struct eigrp_neighbor *nbr, struct eigrp_prefix_entry *pe)
* End of filtering
*/

ep = eigrp_packet_new(ei->ifp->mtu, nbr);
ep = eigrp_packet_new(EIGRP_PACKET_MTU(ei->ifp->mtu), nbr);

/* Prepare EIGRP INIT UPDATE header */
eigrp_packet_header_init(EIGRP_OPC_REPLY, eigrp, ep->s, 0,
Expand Down
2 changes: 1 addition & 1 deletion eigrpd/eigrp_siaquery.c
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ void eigrp_send_siaquery(struct eigrp_neighbor *nbr,
struct eigrp_packet *ep;
uint16_t length = EIGRP_HEADER_LEN;

ep = eigrp_packet_new(nbr->ei->ifp->mtu, nbr);
ep = eigrp_packet_new(EIGRP_PACKET_MTU(nbr->ei->ifp->mtu), nbr);

/* Prepare EIGRP INIT UPDATE header */
eigrp_packet_header_init(EIGRP_OPC_SIAQUERY, nbr->ei->eigrp, ep->s, 0,
Expand Down
2 changes: 1 addition & 1 deletion eigrpd/eigrp_siareply.c
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ void eigrp_send_siareply(struct eigrp_neighbor *nbr,
struct eigrp_packet *ep;
uint16_t length = EIGRP_HEADER_LEN;

ep = eigrp_packet_new(nbr->ei->ifp->mtu, nbr);
ep = eigrp_packet_new(EIGRP_PACKET_MTU(nbr->ei->ifp->mtu), nbr);

/* Prepare EIGRP INIT UPDATE header */
eigrp_packet_header_init(EIGRP_OPC_SIAREPLY, nbr->ei->eigrp, ep->s, 0,
Expand Down
20 changes: 10 additions & 10 deletions eigrpd/eigrp_update.c
Original file line number Diff line number Diff line change
Expand Up @@ -420,7 +420,7 @@ void eigrp_update_send_init(struct eigrp_neighbor *nbr)
struct eigrp_packet *ep;
uint16_t length = EIGRP_HEADER_LEN;

ep = eigrp_packet_new(nbr->ei->ifp->mtu, nbr);
ep = eigrp_packet_new(EIGRP_PACKET_MTU(nbr->ei->ifp->mtu), nbr);

/* Prepare EIGRP INIT UPDATE header */
if (IS_DEBUG_EIGRP_PACKET(0, RECV))
Expand Down Expand Up @@ -533,10 +533,10 @@ void eigrp_update_send_EOT(struct eigrp_neighbor *nbr)
struct eigrp *eigrp = ei->eigrp;
struct prefix *dest_addr;
uint32_t seq_no = eigrp->sequence_number;
uint16_t mtu = ei->ifp->mtu;
uint16_t eigrp_mtu = EIGRP_PACKET_MTU(ei->ifp->mtu);
struct route_node *rn;

ep = eigrp_packet_new(mtu, nbr);
ep = eigrp_packet_new(eigrp_mtu, nbr);

/* Prepare EIGRP EOT UPDATE header */
eigrp_packet_header_init(EIGRP_OPC_UPDATE, eigrp, ep->s, EIGRP_EOT_FLAG,
Expand All @@ -557,13 +557,13 @@ void eigrp_update_send_EOT(struct eigrp_neighbor *nbr)
if (eigrp_nbr_split_horizon_check(te, ei))
continue;

if ((length + EIGRP_TLV_MAX_IPV4_BYTE) > mtu) {
if ((length + EIGRP_TLV_MAX_IPV4_BYTE) > eigrp_mtu) {
eigrp_update_place_on_nbr_queue(nbr, ep, seq_no,
length);
seq_no++;

length = EIGRP_HEADER_LEN;
ep = eigrp_packet_new(mtu, nbr);
ep = eigrp_packet_new(eigrp_mtu, nbr);
eigrp_packet_header_init(
EIGRP_OPC_UPDATE, nbr->ei->eigrp, ep->s,
EIGRP_EOT_FLAG, seq_no,
Expand Down Expand Up @@ -604,13 +604,14 @@ void eigrp_update_send(struct eigrp_interface *ei)
struct eigrp *eigrp = ei->eigrp;
struct prefix *dest_addr;
uint32_t seq_no = eigrp->sequence_number;
uint16_t eigrp_mtu = EIGRP_PACKET_MTU(ei->ifp->mtu);

if (ei->nbrs->count == 0)
return;

uint16_t length = EIGRP_HEADER_LEN;

ep = eigrp_packet_new(ei->ifp->mtu, NULL);
ep = eigrp_packet_new(eigrp_mtu, NULL);

/* Prepare EIGRP INIT UPDATE header */
eigrp_packet_header_init(EIGRP_OPC_UPDATE, eigrp, ep->s, 0, seq_no, 0);
Expand All @@ -633,8 +634,7 @@ void eigrp_update_send(struct eigrp_interface *ei)
if (eigrp_nbr_split_horizon_check(ne, ei))
continue;

if ((length + EIGRP_TLV_MAX_IPV4_BYTE)
> (uint16_t)ei->ifp->mtu) {
if ((length + EIGRP_TLV_MAX_IPV4_BYTE) > eigrp_mtu) {
if ((ei->params.auth_type == EIGRP_AUTH_TYPE_MD5)
&& (ei->params.auth_keychain != NULL)) {
eigrp_make_md5_digest(ei, ep->s,
Expand All @@ -651,7 +651,7 @@ void eigrp_update_send(struct eigrp_interface *ei)
eigrp_update_send_to_all_nbrs(ei, ep);

length = EIGRP_HEADER_LEN;
ep = eigrp_packet_new(ei->ifp->mtu, NULL);
ep = eigrp_packet_new(eigrp_mtu, NULL);
eigrp_packet_header_init(EIGRP_OPC_UPDATE, eigrp, ep->s,
0, seq_no, 0);
if ((ei->params.auth_type == EIGRP_AUTH_TYPE_MD5)
Expand Down Expand Up @@ -790,7 +790,7 @@ static void eigrp_update_send_GR_part(struct eigrp_neighbor *nbr)
}
}

ep = eigrp_packet_new(ei->ifp->mtu, nbr);
ep = eigrp_packet_new(EIGRP_PACKET_MTU(ei->ifp->mtu), nbr);

/* Prepare EIGRP Graceful restart UPDATE header */
eigrp_packet_header_init(EIGRP_OPC_UPDATE, eigrp, ep->s, flags,
Expand Down

0 comments on commit 87e6a84

Please sign in to comment.