sparc64/131921: commit references a PR
dfilter service
dfilter at FreeBSD.ORG
Wed Mar 18 15:20:03 PDT 2009
The following reply was made to PR sparc64/131921; it has been noted by GNATS.
From: dfilter at FreeBSD.ORG (dfilter service)
To: bug-followup at FreeBSD.org
Cc:
Subject: Re: sparc64/131921: commit references a PR
Date: Wed, 18 Mar 2009 22:13:14 +0000 (UTC)
Author: marius
Date: Wed Mar 18 22:12:54 2009
New Revision: 189996
URL: http://svn.freebsd.org/changeset/base/189996
Log:
MFC: r189494
On architectures with strict alignment requirements compensate
the misalignment of the IP header that prepending the EtherIP
header might have caused.
PR: 131921
Modified:
stable/7/sys/ (props changed)
stable/7/sys/contrib/pf/ (props changed)
stable/7/sys/dev/ath/ath_hal/ (props changed)
stable/7/sys/dev/cxgb/ (props changed)
stable/7/sys/net/if_gif.h
stable/7/sys/netinet/in_gif.c
stable/7/sys/netinet6/in6_gif.c
Modified: stable/7/sys/net/if_gif.h
==============================================================================
--- stable/7/sys/net/if_gif.h Wed Mar 18 21:57:35 2009 (r189995)
+++ stable/7/sys/net/if_gif.h Wed Mar 18 22:12:54 2009 (r189996)
@@ -100,6 +100,8 @@ struct etherip_header {
#define ETHERIP_VER_VERS_MASK 0x0f
#define ETHERIP_VER_RSVD_MASK 0xf0
#define ETHERIP_VERSION 0x03
+/* mbuf adjust factor to force 32-bit alignment of IP header */
+#define ETHERIP_ALIGN 2
/* Prototypes */
void gif_input(struct mbuf *, int, struct ifnet *);
Modified: stable/7/sys/netinet/in_gif.c
==============================================================================
--- stable/7/sys/netinet/in_gif.c Wed Mar 18 21:57:35 2009 (r189995)
+++ stable/7/sys/netinet/in_gif.c Wed Mar 18 22:12:54 2009 (r189996)
@@ -98,7 +98,7 @@ in_gif_output(struct ifnet *ifp, int fam
struct sockaddr_in *sin_dst = (struct sockaddr_in *)sc->gif_pdst;
struct ip iphdr; /* capsule IP header, host byte ordered */
struct etherip_header eiphdr;
- int proto, error;
+ int error, len, proto;
u_int8_t tos;
GIF_LOCK_ASSERT(sc);
@@ -182,13 +182,27 @@ in_gif_output(struct ifnet *ifp, int fam
&iphdr.ip_tos, &tos);
/* prepend new IP header */
- M_PREPEND(m, sizeof(struct ip), M_DONTWAIT);
- if (m && m->m_len < sizeof(struct ip))
- m = m_pullup(m, sizeof(struct ip));
+ len = sizeof(struct ip);
+#ifndef __NO_STRICT_ALIGNMENT
+ if (family == AF_LINK)
+ len += ETHERIP_ALIGN;
+#endif
+ M_PREPEND(m, len, M_DONTWAIT);
+ if (m != NULL && m->m_len < len)
+ m = m_pullup(m, len);
if (m == NULL) {
printf("ENOBUFS in in_gif_output %d\n", __LINE__);
return ENOBUFS;
}
+#ifndef __NO_STRICT_ALIGNMENT
+ if (family == AF_LINK) {
+ len = mtod(m, vm_offset_t) & 3;
+ KASSERT(len == 0 || len == ETHERIP_ALIGN,
+ ("in_gif_output: unexpected misalignment"));
+ m->m_data += len;
+ m->m_len -= ETHERIP_ALIGN;
+ }
+#endif
bcopy(&iphdr, mtod(m, struct ip *), sizeof(struct ip));
M_SETFIB(m, sc->gif_fibnum);
Modified: stable/7/sys/netinet6/in6_gif.c
==============================================================================
--- stable/7/sys/netinet6/in6_gif.c Wed Mar 18 21:57:35 2009 (r189995)
+++ stable/7/sys/netinet6/in6_gif.c Wed Mar 18 22:12:54 2009 (r189996)
@@ -96,7 +96,7 @@ in6_gif_output(struct ifnet *ifp,
struct sockaddr_in6 *sin6_dst = (struct sockaddr_in6 *)sc->gif_pdst;
struct ip6_hdr *ip6;
struct etherip_header eiphdr;
- int proto, error;
+ int error, len, proto;
u_int8_t itos, otos;
GIF_LOCK_ASSERT(sc);
@@ -164,13 +164,27 @@ in6_gif_output(struct ifnet *ifp,
}
/* prepend new IP header */
- M_PREPEND(m, sizeof(struct ip6_hdr), M_DONTWAIT);
- if (m && m->m_len < sizeof(struct ip6_hdr))
- m = m_pullup(m, sizeof(struct ip6_hdr));
+ len = sizeof(struct ip6_hdr);
+#ifndef __NO_STRICT_ALIGNMENT
+ if (family == AF_LINK)
+ len += ETHERIP_ALIGN;
+#endif
+ M_PREPEND(m, len, M_DONTWAIT);
+ if (m != NULL && m->m_len < len)
+ m = m_pullup(m, len);
if (m == NULL) {
printf("ENOBUFS in in6_gif_output %d\n", __LINE__);
return ENOBUFS;
}
+#ifndef __NO_STRICT_ALIGNMENT
+ if (family == AF_LINK) {
+ len = mtod(m, vm_offset_t) & 3;
+ KASSERT(len == 0 || len == ETHERIP_ALIGN,
+ ("in6_gif_output: unexpected misalignment"));
+ m->m_data += len;
+ m->m_len -= ETHERIP_ALIGN;
+ }
+#endif
ip6 = mtod(m, struct ip6_hdr *);
ip6->ip6_flow = 0;
_______________________________________________
svn-src-all at freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe at freebsd.org"
More information about the freebsd-sparc64
mailing list