|
@@ -36,7 +36,7 @@
|
|
|
#include <linux/skbuff.h>
|
|
|
#include <linux/ethtool.h>
|
|
|
#include <linux/if_ether.h>
|
|
|
-#include <linux/tcp.h>
|
|
|
+#include <net/tcp.h>
|
|
|
#include <linux/udp.h>
|
|
|
#include <linux/moduleparam.h>
|
|
|
#include <linux/mm.h>
|
|
@@ -547,6 +547,16 @@ static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
unsigned int len = skb_headlen(skb);
|
|
|
unsigned long flags;
|
|
|
|
|
|
+ /* If skb->len is too big for wire format, drop skb and alert
|
|
|
+ * user about misconfiguration.
|
|
|
+ */
|
|
|
+ if (unlikely(skb->len > XEN_NETIF_MAX_TX_SIZE)) {
|
|
|
+ net_alert_ratelimited(
|
|
|
+ "xennet: skb->len = %u, too big for wire format\n",
|
|
|
+ skb->len);
|
|
|
+ goto drop;
|
|
|
+ }
|
|
|
+
|
|
|
slots = DIV_ROUND_UP(offset + len, PAGE_SIZE) +
|
|
|
xennet_count_skb_frag_slots(skb);
|
|
|
if (unlikely(slots > MAX_SKB_FRAGS + 1)) {
|
|
@@ -1058,7 +1068,8 @@ err:
|
|
|
|
|
|
static int xennet_change_mtu(struct net_device *dev, int mtu)
|
|
|
{
|
|
|
- int max = xennet_can_sg(dev) ? 65535 - ETH_HLEN : ETH_DATA_LEN;
|
|
|
+ int max = xennet_can_sg(dev) ?
|
|
|
+ XEN_NETIF_MAX_TX_SIZE - MAX_TCP_HEADER : ETH_DATA_LEN;
|
|
|
|
|
|
if (mtu > max)
|
|
|
return -EINVAL;
|
|
@@ -1362,6 +1373,8 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev)
|
|
|
SET_ETHTOOL_OPS(netdev, &xennet_ethtool_ops);
|
|
|
SET_NETDEV_DEV(netdev, &dev->dev);
|
|
|
|
|
|
+ netif_set_gso_max_size(netdev, XEN_NETIF_MAX_TX_SIZE - MAX_TCP_HEADER);
|
|
|
+
|
|
|
np->netdev = netdev;
|
|
|
|
|
|
netif_carrier_off(netdev);
|