Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 29 Apr 2005 10:51:54 -0700
From:      Maksim Yevmenkin <maksim.yevmenkin@savvis.net>
To:        Sten Spans <sten@blinkenlights.nl>
Cc:        net@freebsd.org
Subject:   Re: if_tap unaligned access problem
Message-ID:  <4272743A.2030003@savvis.net>
In-Reply-To: <Pine.SOC.4.61.0504291132520.28551@tea.blinkenlights.nl>
References:  <20050428135120.GB21428@cell.sick.ru> <427111BF.2050607@savvis.net>	<42712BAA.4070201@elischer.org> <42715269.3010306@errno.com> <Pine.SOC.4.61.0504291132520.28551@tea.blinkenlights.nl>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------090207080502030003080504
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit

[...]

>>>> i think we have few options here:
>>>>
>>>> 1) revert back original tapwrite function that was changed in v. 
>>>> 1.48 and set offset to 2 bytes in top mbuf
>>>>
>>>> 2) change current version of tapwrite so it would m_prepend and 
>>>> m_pullup mbuf after m_uiotombuf
>>>>
>>>> 3) change m_uiotombuf to accept one more parameter - mbuf offset at 
>>>> which data should be copied. there are not that many users of 
>>>> m_uiotombuf

please find and review the attached patch (untested) that implements 
option (3) above.

> I could try to port the changes netbsd made using m_copyup and
> send you the resulting patchfile. IPv4 has already been serviced by
> John-Mark Gurney in perforce. 

having these changes in the tree is a good thing, but it will require 
more testing. maybe for now we could get away with simpler changes?

thanks,
max

--------------090207080502030003080504
Content-Type: text/plain;
 name="m_uiotombuf.diff.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="m_uiotombuf.diff.txt"

? sys/net/if_tap.c.altq
? usr.bin/bluetooth/rfcomm_sppd/log
? usr.sbin/bluetooth/bthidd/bthid_switch_keyboard
Index: sys/kern/uipc_mbuf.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/uipc_mbuf.c,v
retrieving revision 1.147
diff -u -r1.147 uipc_mbuf.c
--- sys/kern/uipc_mbuf.c	17 Mar 2005 19:34:57 -0000	1.147
+++ sys/kern/uipc_mbuf.c	29 Apr 2005 17:44:08 -0000
@@ -1333,7 +1333,7 @@
 #endif
 
 struct mbuf *
-m_uiotombuf(struct uio *uio, int how, int len)
+m_uiotombuf(struct uio *uio, int how, int len, int align)
 {
 	struct mbuf *m_new = NULL, *m_final = NULL;
 	int progress = 0, error = 0, length, total;
@@ -1342,12 +1342,15 @@
 		total = min(uio->uio_resid, len);
 	else
 		total = uio->uio_resid;
+	if (align >= MHLEN)
+		goto nospace;
 	if (total > MHLEN)
 		m_final = m_getcl(how, MT_DATA, M_PKTHDR);
 	else
 		m_final = m_gethdr(how, MT_DATA);
 	if (m_final == NULL)
 		goto nospace;
+	m_adj(m_final, align);
 	m_new = m_final;
 	while (progress < total) {
 		length = total - progress;
Index: sys/kern/uipc_syscalls.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/uipc_syscalls.c,v
retrieving revision 1.219
diff -u -r1.219 uipc_syscalls.c
--- sys/kern/uipc_syscalls.c	16 Apr 2005 18:46:28 -0000	1.219
+++ sys/kern/uipc_syscalls.c	29 Apr 2005 17:44:08 -0000
@@ -1796,7 +1796,7 @@
 			hdr_uio->uio_td = td;
 			hdr_uio->uio_rw = UIO_WRITE;
 			if (hdr_uio->uio_resid > 0) {
-				m_header = m_uiotombuf(hdr_uio, M_DONTWAIT, 0);
+				m_header = m_uiotombuf(hdr_uio, M_DONTWAIT, 0, 0);
 				if (m_header == NULL)
 					goto done;
 				headersize = m_header->m_pkthdr.len;
Index: sys/net/if_tap.c
===================================================================
RCS file: /home/ncvs/src/sys/net/if_tap.c,v
retrieving revision 1.52
diff -u -r1.52 if_tap.c
--- sys/net/if_tap.c	13 Apr 2005 00:30:19 -0000	1.52
+++ sys/net/if_tap.c	29 Apr 2005 17:44:08 -0000
@@ -827,7 +827,7 @@
 		return (EIO);
 	}
 
-	if ((m = m_uiotombuf(uio, M_DONTWAIT, 0)) == NULL) {
+	if ((m = m_uiotombuf(uio, M_DONTWAIT, 0, ETHER_ALIGN)) == NULL) {
 		ifp->if_ierrors ++;
 		return (error);
 	}
Index: sys/net/if_tun.c
===================================================================
RCS file: /home/ncvs/src/sys/net/if_tun.c,v
retrieving revision 1.149
diff -u -r1.149 if_tun.c
--- sys/net/if_tun.c	31 Mar 2005 12:19:44 -0000	1.149
+++ sys/net/if_tun.c	29 Apr 2005 17:44:08 -0000
@@ -761,7 +761,7 @@
 		return (EIO);
 	}
 
-	if ((m = m_uiotombuf(uio, M_DONTWAIT, 0)) == NULL) {
+	if ((m = m_uiotombuf(uio, M_DONTWAIT, 0, 0)) == NULL) {
 		ifp->if_ierrors++;
 		return (error);
 	}
Index: sys/netgraph/ng_device.c
===================================================================
RCS file: /home/ncvs/src/sys/netgraph/ng_device.c,v
retrieving revision 1.20
diff -u -r1.20 ng_device.c
--- sys/netgraph/ng_device.c	14 Mar 2005 16:02:53 -0000	1.20
+++ sys/netgraph/ng_device.c	29 Apr 2005 17:44:08 -0000
@@ -466,7 +466,7 @@
 	if (uio->uio_resid < 0 || uio->uio_resid > IP_MAXPACKET)
 		return (EIO);
 
-	if ((m = m_uiotombuf(uio, M_DONTWAIT, 0)) == NULL)
+	if ((m = m_uiotombuf(uio, M_DONTWAIT, 0, 0)) == NULL)
 		return (ENOBUFS);
 
 	NG_SEND_DATA_ONLY(error, priv->hook, m);
Index: sys/sys/mbuf.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/mbuf.h,v
retrieving revision 1.169
diff -u -r1.169 mbuf.h
--- sys/sys/mbuf.h	17 Mar 2005 19:34:57 -0000	1.169
+++ sys/sys/mbuf.h	29 Apr 2005 17:44:08 -0000
@@ -582,7 +582,7 @@
 struct	mbuf	*m_pulldown(struct mbuf *, int, int, int *);
 struct	mbuf	*m_pullup(struct mbuf *, int);
 struct	mbuf	*m_split(struct mbuf *, int, int);
-struct	mbuf	*m_uiotombuf(struct uio *, int, int);
+struct	mbuf	*m_uiotombuf(struct uio *, int, int, int);
 
 /*-
  * Network packets may have annotations attached by affixing a list

--------------090207080502030003080504--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4272743A.2030003>