Add m_devpad() to avoid code duplication in various network device drivers
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Sun, 19 Oct 2008 08:39:55 +0000 (08:39 +0000)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Sun, 19 Oct 2008 08:39:55 +0000 (08:39 +0000)
sys/dev/netif/bge/if_bge.c
sys/dev/netif/re/if_re.c
sys/kern/uipc_mbuf.c
sys/sys/mbuf.h

index 5e0be2a..b5e4cdc 100644 (file)
@@ -31,7 +31,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/bge/if_bge.c,v 1.3.2.39 2005/07/03 03:41:18 silby Exp $
- * $DragonFly: src/sys/dev/netif/bge/if_bge.c,v 1.108 2008/10/19 08:11:35 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/bge/if_bge.c,v 1.109 2008/10/19 08:39:55 sephe Exp $
  *
  */
 
@@ -2610,49 +2610,6 @@ bge_stats_update(struct bge_softc *sc)
 #endif
 }
 
-static __inline int
-bge_cksum_pad(struct mbuf *pkt)
-{
-       struct mbuf *last = NULL;
-       int padlen;
-
-       padlen = BGE_MIN_FRAME - pkt->m_pkthdr.len;
-
-       /* if there's only the packet-header and we can pad there, use it. */
-       if (pkt->m_pkthdr.len == pkt->m_len &&
-           M_TRAILINGSPACE(pkt) >= padlen) {
-               last = pkt;
-       } else {
-               /*
-                * Walk packet chain to find last mbuf. We will either
-                * pad there, or append a new mbuf and pad it
-                * (thus perhaps avoiding the bcm5700 dma-min bug).
-                */
-               for (last = pkt; last->m_next != NULL; last = last->m_next)
-                       ; /* EMPTY */
-
-               /* `last' now points to last in chain. */
-               if (M_TRAILINGSPACE(last) < padlen) {
-                       /* Allocate new empty mbuf, pad it.  Compact later. */
-                       struct mbuf *n;
-                       MGET(n, MB_DONTWAIT, MT_DATA);
-                       if (n == NULL)
-                               return ENOBUFS;
-                       n->m_len = 0;
-                       last->m_next = n;
-                       last = n;
-               }
-       }
-       KKASSERT(M_TRAILINGSPACE(last) >= padlen);
-       KKASSERT(M_WRITABLE(last));
-
-       /* Now zero the pad area, to avoid the bge cksum-assist bug */
-       bzero(mtod(last, char *) + last->m_len, padlen);
-       last->m_len += padlen;
-       pkt->m_pkthdr.len += padlen;
-       return 0;
-}
-
 /*
  * Encapsulate an mbuf chain in the tx ring  by coupling the mbuf data
  * pointers to descriptors.
@@ -2700,7 +2657,7 @@ bge_encap(struct bge_softc *sc, struct mbuf **m_head0, uint32_t *txidx)
         */
        if ((csum_flags & BGE_TXBDFLAG_TCP_UDP_CSUM) &&
            m_head->m_pkthdr.len < BGE_MIN_FRAME) {
-               error = bge_cksum_pad(m_head);
+               error = m_devpad(m_head, BGE_MIN_FRAME);
                if (error)
                        goto back;
        }
index 374ea5a..d7f8db1 100644 (file)
@@ -33,7 +33,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/re/if_re.c,v 1.25 2004/06/09 14:34:01 naddy Exp $
- * $DragonFly: src/sys/dev/netif/re/if_re.c,v 1.94 2008/10/19 06:00:24 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/re/if_re.c,v 1.95 2008/10/19 08:39:55 sephe Exp $
  */
 
 /*
@@ -305,7 +305,6 @@ static void re_miibus_statchg(device_t);
 static void    re_setmulti(struct re_softc *);
 static void    re_reset(struct re_softc *, int);
 static void    re_get_eaddr(struct re_softc *, uint8_t *);
-static int     re_pad_frame(struct mbuf *);
 static void    re_set_max_readrq(struct re_softc *, uint16_t);
 
 static void    re_setup_hw_im(struct re_softc *);
@@ -2408,7 +2407,7 @@ re_encap(struct re_softc *sc, struct mbuf **m_head, int *idx0)
                     (CSUM_DELAY_IP | CSUM_DELAY_DATA)) &&
                    (m->m_pkthdr.csum_flags & CSUM_TCP) == 0 &&
                    m->m_pkthdr.len < RE_MIN_FRAMELEN) {
-                       error = re_pad_frame(m);
+                       error = m_devpad(m, RE_MIN_FRAMELEN);
                        if (error)
                                goto back;
                }
@@ -3069,49 +3068,6 @@ re_shutdown(device_t dev)
        lwkt_serialize_exit(ifp->if_serializer);
 }
 
-static int
-re_pad_frame(struct mbuf *pkt)
-{
-       struct mbuf *last = NULL;
-       int padlen;
-
-       padlen = RE_MIN_FRAMELEN - pkt->m_pkthdr.len;
-
-       /* if there's only the packet-header and we can pad there, use it. */
-       if (pkt->m_pkthdr.len == pkt->m_len &&
-           M_TRAILINGSPACE(pkt) >= padlen) {
-               last = pkt;
-       } else {
-               /*
-                * Walk packet chain to find last mbuf. We will either
-                * pad there, or append a new mbuf and pad it
-                */
-               for (last = pkt; last->m_next != NULL; last = last->m_next)
-                       ; /* EMPTY */
-
-               /* `last' now points to last in chain. */
-               if (M_TRAILINGSPACE(last) < padlen) {
-                       struct mbuf *n;
-
-                       /* Allocate new empty mbuf, pad it.  Compact later. */
-                       MGET(n, MB_DONTWAIT, MT_DATA);
-                       if (n == NULL)
-                               return ENOBUFS;
-                       n->m_len = 0;
-                       last->m_next = n;
-                       last = n;
-               }
-       }
-       KKASSERT(M_TRAILINGSPACE(last) >= padlen);
-       KKASSERT(M_WRITABLE(last));
-
-       /* Now zero the pad area, to avoid the re cksum-assist bug */
-       bzero(mtod(last, char *) + last->m_len, padlen);
-       last->m_len += padlen;
-       pkt->m_pkthdr.len += padlen;
-       return 0;
-}
-
 static int
 re_sysctl_rxtime(SYSCTL_HANDLER_ARGS)
 {
index c88274d..8d0ebb2 100644 (file)
@@ -65,7 +65,7 @@
  *
  * @(#)uipc_mbuf.c     8.2 (Berkeley) 1/4/94
  * $FreeBSD: src/sys/kern/uipc_mbuf.c,v 1.51.2.24 2003/04/15 06:59:29 silby Exp $
- * $DragonFly: src/sys/kern/uipc_mbuf.c,v 1.66 2008/06/05 18:06:32 swildner Exp $
+ * $DragonFly: src/sys/kern/uipc_mbuf.c,v 1.67 2008/10/19 08:39:55 sephe Exp $
  */
 
 #include "opt_param.h"
@@ -1552,6 +1552,54 @@ m_devget(char *buf, int len, int offset, struct ifnet *ifp,
        return (mfirst);
 }
 
+/*
+ * Routine to pad mbuf to the specified length 'padto'.
+ */
+int
+m_devpad(struct mbuf *m, int padto)
+{
+       struct mbuf *last = NULL;
+       int padlen;
+
+       if (padto <= m->m_pkthdr.len)
+               return 0;
+
+       padlen = padto - m->m_pkthdr.len;
+
+       /* if there's only the packet-header and we can pad there, use it. */
+       if (m->m_pkthdr.len == m->m_len && M_TRAILINGSPACE(m) >= padlen) {
+               last = m;
+       } else {
+               /*
+                * Walk packet chain to find last mbuf. We will either
+                * pad there, or append a new mbuf and pad it
+                */
+               for (last = m; last->m_next != NULL; last = last->m_next)
+                       ; /* EMPTY */
+
+               /* `last' now points to last in chain. */
+               if (M_TRAILINGSPACE(last) < padlen) {
+                       struct mbuf *n;
+
+                       /* Allocate new empty mbuf, pad it.  Compact later. */
+                       MGET(n, MB_DONTWAIT, MT_DATA);
+                       if (n == NULL)
+                               return ENOBUFS;
+                       n->m_len = 0;
+                       last->m_next = n;
+                       last = n;
+               }
+       }
+       KKASSERT(M_TRAILINGSPACE(last) >= padlen);
+       KKASSERT(M_WRITABLE(last));
+
+       /* Now zero the pad area */
+       bzero(mtod(last, char *) + last->m_len, padlen);
+       last->m_len += padlen;
+       m->m_pkthdr.len += padlen;
+       return 0;
+}
+
 /*
  * Copy data from a buffer back into the indicated mbuf chain,
  * starting "off" bytes from the beginning, extending the mbuf
index 1cf0941..6f7f1f8 100644 (file)
@@ -34,7 +34,7 @@
  *
  *     @(#)mbuf.h      8.5 (Berkeley) 2/19/95
  * $FreeBSD: src/sys/sys/mbuf.h,v 1.44.2.17 2003/04/15 06:15:02 silby Exp $
- * $DragonFly: src/sys/sys/mbuf.h,v 1.53 2008/09/13 07:15:14 sephe Exp $
+ * $DragonFly: src/sys/sys/mbuf.h,v 1.54 2008/10/19 08:39:55 sephe Exp $
  */
 
 #ifndef _SYS_MBUF_H_
@@ -473,6 +473,7 @@ struct      mbuf    *m_uiomove(struct uio *);
 void           m_mclget(struct mbuf *m, int how);
 int            m_sharecount(struct mbuf *m);
 void           m_chtype(struct mbuf *m, int type);
+int            m_devpad(struct mbuf *m, int padto);
 
 #ifdef MBUF_DEBUG
 void           mbuftrackid(struct mbuf *, int);