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