mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-14 02:53:55 +00:00
ospf6d: check MTU with message header size in mind
* ospf6_message.c: (ospf6_packet_max): new function, return maximum IPv6 payload on an interface; (ospf6_hello_send, ospf6_dbdesc_send, ospf6_dbdesc_send_newone, ospf6_lsreq_send, ospf6_lsupdate_send_neighbor, ospf6_lsupdate_send_interface, ospf6_lsack_send_neighbor, ospf6_lsack_send_interface): compare message size with the maximum payload instead of the MTU.
This commit is contained in:
parent
ab1be8a20d
commit
82a963a1b8
@ -42,6 +42,8 @@
|
||||
#include "ospf6_flood.h"
|
||||
#include "ospf6d.h"
|
||||
|
||||
#include <netinet/ip6.h>
|
||||
|
||||
unsigned char conf_debug_ospf6_message[6] = {0x03, 0, 0, 0, 0, 0};
|
||||
const char *ospf6_message_type_str[] =
|
||||
{ "Unknown", "Hello", "DbDesc", "LSReq", "LSUpdate", "LSAck" };
|
||||
@ -1357,6 +1359,12 @@ ospf6_send (struct in6_addr *src, struct in6_addr *dst,
|
||||
zlog_err ("Could not send entire message");
|
||||
}
|
||||
|
||||
static int
|
||||
ospf6_packet_max(struct ospf6_interface *oi)
|
||||
{
|
||||
return oi->ifmtu - sizeof(struct ip6_hdr);
|
||||
}
|
||||
|
||||
int
|
||||
ospf6_hello_send (struct thread *thread)
|
||||
{
|
||||
@ -1403,7 +1411,7 @@ ospf6_hello_send (struct thread *thread)
|
||||
if (on->state < OSPF6_NEIGHBOR_INIT)
|
||||
continue;
|
||||
|
||||
if (p - sendbuf + sizeof (u_int32_t) > oi->ifmtu)
|
||||
if (p - sendbuf + sizeof (u_int32_t) > ospf6_packet_max(oi))
|
||||
{
|
||||
if (IS_OSPF6_DEBUG_MESSAGE (OSPF6_MESSAGE_TYPE_HELLO, SEND))
|
||||
zlog_debug ("sending Hello message: exceeds I/F MTU");
|
||||
@ -1479,7 +1487,7 @@ ospf6_dbdesc_send (struct thread *thread)
|
||||
|
||||
/* MTU check */
|
||||
if (p - sendbuf + sizeof (struct ospf6_lsa_header) >
|
||||
on->ospf6_if->ifmtu)
|
||||
ospf6_packet_max(on->ospf6_if))
|
||||
{
|
||||
ospf6_lsa_unlock (lsa);
|
||||
break;
|
||||
@ -1513,7 +1521,7 @@ ospf6_dbdesc_send_newone (struct thread *thread)
|
||||
for (lsa = ospf6_lsdb_head (on->summary_list); lsa;
|
||||
lsa = ospf6_lsdb_next (lsa))
|
||||
{
|
||||
if (size + sizeof (struct ospf6_lsa_header) > on->ospf6_if->ifmtu)
|
||||
if (size + sizeof (struct ospf6_lsa_header) > ospf6_packet_max(on->ospf6_if))
|
||||
{
|
||||
ospf6_lsa_unlock (lsa);
|
||||
break;
|
||||
@ -1580,7 +1588,7 @@ ospf6_lsreq_send (struct thread *thread)
|
||||
lsa = ospf6_lsdb_next (lsa))
|
||||
{
|
||||
/* MTU check */
|
||||
if (p - sendbuf + sizeof (struct ospf6_lsreq_entry) > on->ospf6_if->ifmtu)
|
||||
if (p - sendbuf + sizeof (struct ospf6_lsreq_entry) > ospf6_packet_max(on->ospf6_if))
|
||||
{
|
||||
ospf6_lsa_unlock (lsa);
|
||||
break;
|
||||
@ -1649,7 +1657,7 @@ ospf6_lsupdate_send_neighbor (struct thread *thread)
|
||||
{
|
||||
/* MTU check */
|
||||
if ( (p - sendbuf + (unsigned int)OSPF6_LSA_SIZE (lsa->header))
|
||||
> on->ospf6_if->ifmtu)
|
||||
> ospf6_packet_max(on->ospf6_if))
|
||||
{
|
||||
ospf6_lsa_unlock (lsa);
|
||||
break;
|
||||
@ -1669,7 +1677,7 @@ ospf6_lsupdate_send_neighbor (struct thread *thread)
|
||||
{
|
||||
/* MTU check */
|
||||
if ( (p - sendbuf + (unsigned int)OSPF6_LSA_SIZE (lsa->header))
|
||||
> on->ospf6_if->ifmtu)
|
||||
> ospf6_packet_max(on->ospf6_if))
|
||||
{
|
||||
ospf6_lsa_unlock (lsa);
|
||||
break;
|
||||
@ -1742,7 +1750,7 @@ ospf6_lsupdate_send_interface (struct thread *thread)
|
||||
{
|
||||
/* MTU check */
|
||||
if ( (p - sendbuf + ((unsigned int)OSPF6_LSA_SIZE (lsa->header)))
|
||||
> oi->ifmtu)
|
||||
> ospf6_packet_max(oi))
|
||||
{
|
||||
ospf6_lsa_unlock (lsa);
|
||||
break;
|
||||
@ -1809,7 +1817,7 @@ ospf6_lsack_send_neighbor (struct thread *thread)
|
||||
lsa = ospf6_lsdb_next (lsa))
|
||||
{
|
||||
/* MTU check */
|
||||
if (p - sendbuf + sizeof (struct ospf6_lsa_header) > on->ospf6_if->ifmtu)
|
||||
if (p - sendbuf + sizeof (struct ospf6_lsa_header) > ospf6_packet_max(on->ospf6_if))
|
||||
{
|
||||
/* if we run out of packet size/space here,
|
||||
better to try again soon. */
|
||||
@ -1869,7 +1877,7 @@ ospf6_lsack_send_interface (struct thread *thread)
|
||||
lsa = ospf6_lsdb_next (lsa))
|
||||
{
|
||||
/* MTU check */
|
||||
if (p - sendbuf + sizeof (struct ospf6_lsa_header) > oi->ifmtu)
|
||||
if (p - sendbuf + sizeof (struct ospf6_lsa_header) > ospf6_packet_max(oi))
|
||||
{
|
||||
/* if we run out of packet size/space here,
|
||||
better to try again soon. */
|
||||
|
Loading…
Reference in New Issue
Block a user