diff options
| author | Dmitry Tejblum <tejblum@yandex-team.ru> | 2009-06-24 20:14:30 +0400 | 
|---|---|---|
| committer | Denis Ovsienko <pilot@etcnet.org> | 2009-06-24 20:14:30 +0400 | 
| commit | c9035ccd13078b6a5d53566979a66c1ac892b47a (patch) | |
| tree | d144006c697fdf5aa06535cee1d89cdb9a359ec9 /ospfd | |
| parent | 014b670e02cc1f38e8e4e786269fc1787412f9b7 (diff) | |
[ospfd] discount IP header size from a new LSA pkt
Diffstat (limited to 'ospfd')
| -rw-r--r-- | ospfd/ospf_packet.c | 15 | 
1 files 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  | 
