From: Jesse Gross Date: Sat, 2 Oct 2010 02:21:08 +0000 (-0700) Subject: tunnel: Correctly check for internal device. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4bee421f3ab28492aebc32b8b13e41ca5d12a936;p=openvswitch tunnel: Correctly check for internal device. With header caching we check to see if the next device in the stack is an OVS device and, if so, cache that flow as well. However, the test for this called internal_dev_get_vport() assuming that it would return NULL if the device is not an internal device. It doesn't, however, it just returns the offset from the device where the vport data structure would be if it were an internal device. This changes it to explicitly check for an internal device first to avoid a panic. Bug #3470 Reported-by: Ram Jothikumar Signed-off-by: Jesse Gross Reviewed-by: Justin Pettit --- diff --git a/datapath/tunnel.c b/datapath/tunnel.c index 77f976fd..ad452280 100644 --- a/datapath/tunnel.c +++ b/datapath/tunnel.c @@ -1266,17 +1266,15 @@ int tnl_send(struct vport *vport, struct sk_buff *skb) if (likely(cache)) { int orig_len = skb->len - cache->len; - struct vport *cache_vport = internal_dev_get_vport(rt_dst(rt).dev); skb->protocol = htons(ETH_P_IP); - iph->tot_len = htons(skb->len - skb_network_offset(skb)); ip_send_check(iph); - if (likely(cache_vport)) { + if (is_internal_dev(rt_dst(rt).dev)) { OVS_CB(skb)->flow = cache->flow; compute_ip_summed(skb, true); - vport_receive(cache_vport, skb); + vport_receive(internal_dev_get_vport(rt_dst(rt).dev), skb); sent_len += orig_len; } else { int err;