Skip to content
Snippets Groups Projects
  • Ian Campbell's avatar
    e0ce4af9
    xen: netfront: handle incoming GSO SKBs which are not CHECKSUM_PARTIAL · e0ce4af9
    Ian Campbell authored
    
    The Linux network stack expects all GSO SKBs to have ip_summed ==
    CHECKSUM_PARTIAL (which implies that the frame contains a partial
    checksum) and the Xen network ring protocol similarly expects an SKB
    which has GSO set to also have NETRX_csum_blank (which also implies a
    partial checksum).
    
    However there have been cases of buggy guests which mark a frame as
    GSO but do not set csum_blank. If we detect that we a receiving such a
    frame (which manifests as ip_summed != PARTIAL && skb_is_gso) then
    force the SKB to partial and recalculate the checksum, since we cannot
    rely on the peer having done so if they have not set csum_blank.
    
    Add an ethtool stat to track occurances of this event.
    
    Signed-off-by: default avatarIan Campbell <ian.campbell@citrix.com>
    Cc: Jeremy Fitzhardinge <jeremy@goop.org>
    Cc: David Miller <davem@davemloft.net>
    Cc: xen-devel@lists.xensource.com
    Cc: netdev@vger.kernel.org
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    e0ce4af9
    History
    xen: netfront: handle incoming GSO SKBs which are not CHECKSUM_PARTIAL
    Ian Campbell authored
    
    The Linux network stack expects all GSO SKBs to have ip_summed ==
    CHECKSUM_PARTIAL (which implies that the frame contains a partial
    checksum) and the Xen network ring protocol similarly expects an SKB
    which has GSO set to also have NETRX_csum_blank (which also implies a
    partial checksum).
    
    However there have been cases of buggy guests which mark a frame as
    GSO but do not set csum_blank. If we detect that we a receiving such a
    frame (which manifests as ip_summed != PARTIAL && skb_is_gso) then
    force the SKB to partial and recalculate the checksum, since we cannot
    rely on the peer having done so if they have not set csum_blank.
    
    Add an ethtool stat to track occurances of this event.
    
    Signed-off-by: default avatarIan Campbell <ian.campbell@citrix.com>
    Cc: Jeremy Fitzhardinge <jeremy@goop.org>
    Cc: David Miller <davem@davemloft.net>
    Cc: xen-devel@lists.xensource.com
    Cc: netdev@vger.kernel.org
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
xen-netfront.c 46.84 KiB
/*
 * Virtual network driver for conversing with remote driver backends.
 *
 * Copyright (c) 2002-2005, K A Fraser
 * Copyright (c) 2005, XenSource Ltd
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version 2
 * as published by the Free Software Foundation; or, when distributed
 * separately from the Linux kernel or incorporated into other
 * software packages, subject to the following license:
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this source file (the "Software"), to deal in the Software without
 * restriction, including without limitation the rights to use, copy, modify,
 * merge, publish, distribute, sublicense, and/or sell copies of the Software,
 * and to permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 * IN THE SOFTWARE.
 */

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/ethtool.h>
#include <linux/if_ether.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <linux/moduleparam.h>
#include <linux/mm.h>
#include <linux/slab.h>
#include <net/ip.h>

#include <xen/xen.h>
#include <xen/xenbus.h>
#include <xen/events.h>
#include <xen/page.h>
#include <xen/grant_table.h>

#include <xen/interface/io/netif.h>
#include <xen/interface/memory.h>
#include <xen/interface/grant_table.h>

static const struct ethtool_ops xennet_ethtool_ops;

struct netfront_cb {
	struct page *page;
	unsigned offset;
};

#define NETFRONT_SKB_CB(skb)	((struct netfront_cb *)((skb)->cb))

#define RX_COPY_THRESHOLD 256

#define GRANT_INVALID_REF	0

#define NET_TX_RING_SIZE __CONST_RING_SIZE(xen_netif_tx, PAGE_SIZE)
#define NET_RX_RING_SIZE __CONST_RING_SIZE(xen_netif_rx, PAGE_SIZE)