summaryrefslogtreecommitdiff
path: root/ospfd/ospf_packet.c
diff options
context:
space:
mode:
Diffstat (limited to 'ospfd/ospf_packet.c')
-rw-r--r--ospfd/ospf_packet.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/ospfd/ospf_packet.c b/ospfd/ospf_packet.c
index c362b9fd..eaf8b769 100644
--- a/ospfd/ospf_packet.c
+++ b/ospfd/ospf_packet.c
@@ -489,10 +489,11 @@ ospf_swab_iph_ton (struct ip *iph)
/* BSD and derived take iph in network order, except for
* ip_len and ip_off
*/
-#ifdef GNU_LINUX
+#ifndef HAVE_IP_HDRINCL_BSD_ORDER
iph->ip_len = htons(iph->ip_len);
iph->ip_off = htons(iph->ip_off);
-#endif
+#endif /* HAVE_IP_HDRINCL_BSD_ORDER */
+
iph->ip_id = htons(iph->ip_id);
}
@@ -500,19 +501,23 @@ ospf_swab_iph_ton (struct ip *iph)
void
ospf_swab_iph_toh (struct ip *iph)
{
-#ifdef GNU_LINUX
+#ifdef HAVE_IP_HDRINCL_BSD_ORDER
iph->ip_len = ntohs(iph->ip_len);
iph->ip_off = ntohs(iph->ip_off);
-#endif
+#endif /* HAVE_IP_HDRINCL_BSD_ORDER */
+
iph->ip_id = ntohs(iph->ip_id);
}
#ifdef WANT_OSPF_WRITE_FRAGMENT
void
-ospf_write_frags (struct ospf_packet *op, struct ip *ip, struct msghdr *msg,
- struct iovec *iov, int maxdatasize);
+ospf_write_frags (int fd, struct ospf_packet *op, struct ip *iph,
+ struct msghdr *msg, struct iovec **iov,
+ int maxdatasize, int mtu, int flags)
{
#define OSPF_WRITE_FRAG_SHIFT 3
+ u_int16_t offset;
+ int ret;
assert ( op->length == stream_get_endp(op->s) );
@@ -542,11 +547,11 @@ ospf_write_frags (struct ospf_packet *op, struct ip *ip, struct msghdr *msg,
/* data length of this frag is to next offset value */
iov[1]->iov_len = offset << OSPF_WRITE_FRAG_SHIFT;
iph->ip_len = iov[1]->iov_len + sizeof (struct ip);
- assert (iph->ip_len <= oi->ifp->mtu);
+ assert (iph->ip_len <= mtu);
ospf_swab_iph_ton (iph);
- ret = sendmsg (ospf->fd, msg, flags);
+ ret = sendmsg (fd, msg, flags);
ospf_swab_iph_toh (iph);
@@ -580,7 +585,7 @@ ospf_write (struct thread *thread)
struct sockaddr_in sa_dst;
struct ip iph;
struct msghdr msg;
- struct iovec iov[2];
+ struct iovec iov[2], *iovp;
u_char type;
int ret;
int flags = 0;
@@ -588,7 +593,7 @@ ospf_write (struct thread *thread)
#ifdef WANT_OSPF_WRITE_FRAGMENT
static u_int16_t ipid = 0;
#endif /* WANT_OSPF_WRITE_FRAGMENT */
- u_int16_t maxdatasize, offset;
+ u_int16_t maxdatasize;
#define OSPF_WRITE_IPHL_SHIFT 2
ospf->t_write = NULL;
@@ -679,7 +684,11 @@ ospf_write (struct thread *thread)
*/
#ifdef WANT_OSPF_WRITE_FRAGMENT
if ( op->length > maxdatasize )
- ospf_write_frags (&op, &ip, &msg, &iov, maxdatasize);
+ {
+ iovp = iov;
+ ospf_write_frags (ospf->fd, op, &iph, &msg, &iovp, maxdatasize,
+ oi->ifp->mtu, flags);
+ }
#endif /* WANT_OSPF_WRITE_FRAGMENT */
/* send final fragment (could be first) */
@@ -2032,7 +2041,7 @@ ospf_recv_packet (int fd, struct interface **ifp)
return NULL;
}
-#if defined(__NetBSD__) || defined(__FreeBSD__) || (defined(__OpenBSD__) && (OpenBSD < 200311))
+#ifdef HAVE_IP_HDRINCL_BSD_ORDER
ip_len = iph.ip_len;
#else
ip_len = ntohs (iph.ip_len);