[...]

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?


@@ -1342,12 +1342,15 @@
                total = min(uio->uio_resid, len);
        else
                total = uio->uio_resid;
+       if (align >= MHLEN)
+               goto nospace;
        if (total > MHLEN)


Shouldn't this check be total + align > MHLEN?

ops. yes it should, thanks for catching this!

                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;

also, there is probably no good reason to call m_adj, we could just "m_final->m_data += align" like so


Index: 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
--- uipc_mbuf.c 17 Mar 2005 19:34:57 -0000      1.147
+++ uipc_mbuf.c 29 Apr 2005 18:31:51 -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 (total > MHLEN)
+       if (align >= MHLEN)
+               goto nospace;
+       if (total + align > 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_final->m_data += align;
        m_new = m_final;
        while (progress < total) {
                length = total - progress;

thanks,
max
_______________________________________________
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to