From: Ben Pfaff Date: Tue, 11 Nov 2008 01:45:23 +0000 (-0800) Subject: Stopgap fix for bug #478, where kernel panics on SNAT to input port. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f7e9953b8dfe01f0eb8d8f853b1975f196ddb224;p=openvswitch Stopgap fix for bug #478, where kernel panics on SNAT to input port. --- diff --git a/datapath/dp_dev.c b/datapath/dp_dev.c index ee66638b..9bf4bf53 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;