From 4bee421f3ab28492aebc32b8b13e41ca5d12a936 Mon Sep 17 00:00:00 2001 From: Jesse Gross Date: Fri, 1 Oct 2010 19:21:08 -0700 Subject: [PATCH] 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 --- datapath/tunnel.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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; -- 2.30.2