mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-02 17:36:36 +00:00
eigrpd: Correctly calculate EIGRP packet MTU
Someone forgot that EIGRP packets are encapsulated in IP. Signed-off-by: Piotr Jurkiewicz <piotr.jerzy.jurkiewicz@gmail.com>
This commit is contained in:
parent
babf583e63
commit
ca83a1ab22
@ -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(ei->ifp->mtu - sizeof(struct ip), NULL);
|
||||
|
||||
if (ep) {
|
||||
// encode common header feilds
|
||||
|
@ -1088,7 +1088,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(nbr->ei->ifp->mtu - sizeof(struct ip), nbr);
|
||||
new->length = old->length;
|
||||
new->retrans_counter = old->retrans_counter;
|
||||
new->dst = old->dst;
|
||||
|
@ -167,6 +167,7 @@ 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 = ei->ifp->mtu - sizeof(struct ip);
|
||||
|
||||
for (ALL_LIST_ELEMENTS(ei->eigrp->topology_changes_internalIPV4, node,
|
||||
nnode, pe)) {
|
||||
@ -174,7 +175,7 @@ void eigrp_send_query(struct eigrp_interface *ei)
|
||||
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,
|
||||
@ -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,
|
||||
|
@ -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(ei->ifp->mtu - sizeof(struct ip), nbr);
|
||||
|
||||
/* Prepare EIGRP INIT UPDATE header */
|
||||
eigrp_packet_header_init(EIGRP_OPC_REPLY, eigrp, ep->s, 0,
|
||||
|
@ -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(nbr->ei->ifp->mtu - sizeof(struct ip), nbr);
|
||||
|
||||
/* Prepare EIGRP INIT UPDATE header */
|
||||
eigrp_packet_header_init(EIGRP_OPC_SIAQUERY, nbr->ei->eigrp, ep->s, 0,
|
||||
|
@ -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(nbr->ei->ifp->mtu - sizeof(struct ip), nbr);
|
||||
|
||||
/* Prepare EIGRP INIT UPDATE header */
|
||||
eigrp_packet_header_init(EIGRP_OPC_SIAREPLY, nbr->ei->eigrp, ep->s, 0,
|
||||
|
@ -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(nbr->ei->ifp->mtu - sizeof(struct ip), nbr);
|
||||
|
||||
/* Prepare EIGRP INIT UPDATE header */
|
||||
if (IS_DEBUG_EIGRP_PACKET(0, RECV))
|
||||
@ -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 = ei->ifp->mtu - sizeof(struct ip);
|
||||
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,
|
||||
@ -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,
|
||||
@ -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 = ei->ifp->mtu - sizeof(struct ip);
|
||||
|
||||
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);
|
||||
@ -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,
|
||||
@ -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)
|
||||
@ -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(ei->ifp->mtu - sizeof(struct ip), nbr);
|
||||
|
||||
/* Prepare EIGRP Graceful restart UPDATE header */
|
||||
eigrp_packet_header_init(EIGRP_OPC_UPDATE, eigrp, ep->s, flags,
|
||||
|
Loading…
Reference in New Issue
Block a user