ixgbe: Make certain that all frames fit minimum size requirements
authorAlexander Duyck <alexander.h.duyck@intel.com>
Wed, 8 Feb 2012 07:50:40 +0000 (07:50 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Sat, 17 Mar 2012 08:06:47 +0000 (01:06 -0700)
This change makes certain that any packet we attempt to transmit will meet
minimum size requirements for the hardware.

Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Tested-by: Stephen Ko <stephen.s.ko@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

index db1f17c3ed47f72d7f3d94d77d86fc621629ff93..bf6d122e6f9971315c5b43699b6e1da73cae4da2 100644 (file)
@@ -7162,11 +7162,27 @@ out_drop:
        return NETDEV_TX_OK;
 }
 
-static netdev_tx_t ixgbe_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
+static netdev_tx_t ixgbe_xmit_frame(struct sk_buff *skb,
+                                   struct net_device *netdev)
 {
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
        struct ixgbe_ring *tx_ring;
 
+       if (skb->len <= 0) {
+               dev_kfree_skb_any(skb);
+               return NETDEV_TX_OK;
+       }
+
+       /*
+        * The minimum packet size for olinfo paylen is 17 so pad the skb
+        * in order to meet this minimum size requirement.
+        */
+       if (skb->len < 17) {
+               if (skb_padto(skb, 17))
+                       return NETDEV_TX_OK;
+               skb->len = 17;
+       }
+
        tx_ring = adapter->tx_ring[skb->queue_mapping];
        return ixgbe_xmit_frame_ring(skb, adapter, tx_ring);
 }