From c9035ccd13078b6a5d53566979a66c1ac892b47a Mon Sep 17 00:00:00 2001 From: Dmitry Tejblum Date: Wed, 24 Jun 2009 20:14:30 +0400 Subject: [ospfd] discount IP header size from a new LSA pkt --- ospfd/ospf_packet.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/ospfd/ospf_packet.c b/ospfd/ospf_packet.c index 5f0d99da..7ebf114e 100644 --- a/ospfd/ospf_packet.c +++ b/ospfd/ospf_packet.c @@ -2869,7 +2869,7 @@ ospf_make_ls_upd (struct ospf_interface *oi, struct list *update, struct stream { struct ospf_lsa *lsa; struct listnode *node; - u_int16_t length = OSPF_LS_UPD_MIN_SIZE; + u_int16_t length = 0; unsigned int size_noauth; unsigned long delta = stream_get_endp (s); unsigned long pp; @@ -2880,6 +2880,7 @@ ospf_make_ls_upd (struct ospf_interface *oi, struct list *update, struct stream pp = stream_get_endp (s); stream_forward_endp (s, OSPF_LS_UPD_MIN_SIZE); + length += OSPF_LS_UPD_MIN_SIZE; /* Calculate amount of packet usable for data. */ size_noauth = stream_get_size(s) - ospf_packet_authspace(oi); @@ -3298,7 +3299,6 @@ ospf_ls_upd_packet_new (struct list *update, struct ospf_interface *oi) else size = oi->ifp->mtu; - /* XXX Should this be - sizeof(struct ip)?? -gdt */ if (size > OSPF_MAX_PACKET_SIZE) { zlog_warn ("ospf_ls_upd_packet_new: oversized LSA id:%s too big," @@ -3310,7 +3310,16 @@ ospf_ls_upd_packet_new (struct list *update, struct ospf_interface *oi) return NULL; } - return ospf_packet_new (size); + /* IP header is built up separately by ospf_write(). This means, that we must + * reduce the "affordable" size just calculated by length of an IP header. + * This makes sure, that even if we manage to fill the payload with LSA data + * completely, the final packet (our data plus IP header) still fits into + * outgoing interface MTU. This correction isn't really meaningful for an + * oversized LSA, but for consistency the correction is done for both cases. + * + * P.S. OSPF_MAX_PACKET_SIZE above already includes IP header size + */ + return ospf_packet_new (size - sizeof (struct ip)); } static void -- cgit v1.2.1