sunvnet: allow admin to set sunvnet MTU
authorDavid L Stevens <david.stevens@oracle.com>
Mon, 29 Sep 2014 23:48:18 +0000 (19:48 -0400)
committerDavid S. Miller <davem@davemloft.net>
Tue, 30 Sep 2014 21:10:39 +0000 (17:10 -0400)
This patch allows an admin to set the MTU on a sunvnet device to arbitrary
values between the minimum (68) and maximum (65535) IPv4 packet sizes.

Signed-off-by: David L Stevens <david.stevens@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc/kernel/ldc.c
drivers/net/ethernet/sun/sunvnet.c
drivers/net/ethernet/sun/sunvnet.h

index 66dacd56bb1000193284f570074415eff947ba7f..0af28b9846954593612cf512cf85afb167eacbfc 100644 (file)
@@ -2159,7 +2159,7 @@ int ldc_map_single(struct ldc_channel *lp,
        state.pte_idx = (base - iommu->page_table);
        state.nc = 0;
        fill_cookies(&state, (pa & PAGE_MASK), (pa & ~PAGE_MASK), len);
-       BUG_ON(state.nc != 1);
+       BUG_ON(state.nc > ncookies);
 
        return state.nc;
 }
index 8f5f4e3291a48229ad4ca7f36e72f25c55dd8b81..39804715bf220477131fe6ffab5174b21530862b 100644 (file)
@@ -913,6 +913,9 @@ static int vnet_start_xmit(struct sk_buff *skb, struct net_device *dev)
        if (unlikely(!skb))
                goto out_dropped;
 
+       if (skb->len > port->rmtu)
+               goto out_dropped;
+
        spin_lock_irqsave(&port->vio.lock, flags);
 
        dr = &port->vio.drings[VIO_DRIVER_TX_RING];
@@ -944,7 +947,7 @@ static int vnet_start_xmit(struct sk_buff *skb, struct net_device *dev)
        skb = NULL;
 
        err = ldc_map_single(port->vio.lp, start, nlen,
-                            port->tx_bufs[txi].cookies, 2,
+                            port->tx_bufs[txi].cookies, VNET_MAXCOOKIES,
                             (LDC_MAP_SHADOW | LDC_MAP_DIRECT | LDC_MAP_RW));
        if (err < 0) {
                netdev_info(dev, "tx buffer map error %d\n", err);
@@ -1182,7 +1185,7 @@ static void vnet_set_rx_mode(struct net_device *dev)
 
 static int vnet_change_mtu(struct net_device *dev, int new_mtu)
 {
-       if (new_mtu != ETH_DATA_LEN)
+       if (new_mtu < 68 || new_mtu > 65535)
                return -EINVAL;
 
        dev->mtu = new_mtu;
index 02f507db99512789b35676e1b2a60d2dbaed7f75..c9110454261905bc60861eb34a7bfe7c268f0b9f 100644 (file)
@@ -16,7 +16,7 @@
  */
 #define        VNET_CLEAN_TIMEOUT              ((HZ/100)+1)
 
-#define VNET_MAXPACKET                 1518ULL /* ETH_FRAMELEN + VLAN_HDR */
+#define VNET_MAXPACKET                 (65535ULL + ETH_HLEN + VLAN_HLEN)
 #define VNET_TX_RING_SIZE              512
 #define VNET_TX_WAKEUP_THRESH(dr)      ((dr)->pending / 4)
 
  */
 #define VNET_PACKET_SKIP               6
 
+#define VNET_MAXCOOKIES                        (VNET_MAXPACKET/PAGE_SIZE + 1)
+
 struct vnet_tx_entry {
        struct sk_buff          *skb;
        unsigned int            ncookies;
-       struct ldc_trans_cookie cookies[2];
+       struct ldc_trans_cookie cookies[VNET_MAXCOOKIES];
 };
 
 struct vnet;