From f7e9953b8dfe01f0eb8d8f853b1975f196ddb224 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Mon, 10 Nov 2008 17:45:23 -0800 Subject: [PATCH] Stopgap fix for bug #478, where kernel panics on SNAT to input port. --- datapath/dp_dev.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/datapath/dp_dev.c b/datapath/dp_dev.c index ee66638b5..9bf4bf53b 100644 --- a/datapath/dp_dev.c +++ b/datapath/dp_dev.c @@ -57,10 +57,23 @@ static int dp_dev_mac_addr(struct net_device *dev, void *p) return 0; } -static int dp_dev_xmit(struct sk_buff *skb, struct net_device *netdev) +static int dp_dev_xmit(struct sk_buff *oskb, struct net_device *netdev) { struct dp_dev *dp_dev = dp_dev_priv(netdev); struct datapath *dp = dp_dev->dp; + struct sk_buff *skb; + + /* FIXME: doing a full copy here is far too expensive and most the time + * it is unnecessary. However, it is a stopgap fix for bug #478. */ + skb = skb_copy(oskb, GFP_ATOMIC); + skb->dev = oskb->dev; + kfree_skb(oskb); + if (!skb) { + if (net_ratelimit()) { + printk("failed to copy skb destined for dp_dev\n"); + } + return 0; + } dp_dev->stats.tx_packets++; dp_dev->stats.tx_bytes += skb->len; -- 2.43.0