From ea1968fe331c81e8b5f00c1eacafc8b058b37005 Mon Sep 17 00:00:00 2001 From: Steven Smith Date: Tue, 7 Jul 2009 17:50:23 +0100 Subject: [PATCH] Temporary work around to enable LRO packets to be forwarded by the bridge. This may have been fixed in a different way on more recent kernel versions as there was some discussion in the lkml. This should be fixed at some point in the future. For now it serves the purpose of enabling experiments with LRO in netchannel2. Signed-off-by: Jose Renato Santos --- net/bridge/br_forward.c | 2 +- net/bridge/br_if.c | 1 - net/core/dev.c | 11 +++++------ 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c index 94dd648d..12b18e3e 100644 --- a/net/bridge/br_forward.c +++ b/net/bridge/br_forward.c @@ -115,7 +115,7 @@ void br_forward(const struct net_bridge_port *to, struct sk_buff *skb) { __br_promisc(to, skb, __br_deliver); - if (!skb_warn_if_lro(skb) && should_deliver(to, skb)) { + if (should_deliver(to, skb)) { __br_forward(to, skb); return; } diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c index f530c5b5..4744a58a 100644 --- a/net/bridge/br_if.c +++ b/net/bridge/br_if.c @@ -523,7 +523,6 @@ int br_add_if(struct net_bridge *br, struct net_device *dev) goto err2; rcu_assign_pointer(dev->br_port, p); - dev_disable_lro(dev); list_add_rcu(&p->list, &br->port_list); diff --git a/net/core/dev.c b/net/core/dev.c index c2e59c5e..7199676c 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -1514,12 +1514,6 @@ struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features) skb->mac_len = skb->network_header - skb->mac_header; __skb_pull(skb, skb->mac_len); - if (WARN_ON(skb->ip_summed != CHECKSUM_PARTIAL)) { - if (skb_header_cloned(skb) && - (err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC))) - return ERR_PTR(err); - } - rcu_read_lock(); list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type) & PTYPE_HASH_MASK], list) { @@ -1639,6 +1633,11 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, if (!list_empty(&ptype_all)) dev_queue_xmit_nit(skb, dev); + /* Temporary work around to enable LRO packets to be + sent on a Xen netchannel2 interface */ + if (skb_shinfo(skb)->frag_list) + return dev->hard_start_xmit(skb, dev); + if (netif_needs_gso(dev, skb)) { if (unlikely(dev_gso_segment(skb))) goto out_kfree_skb; -- 2.39.5