From 17a07f9f9d07f07d8dbb33ea1f8c9e53c89639de Mon Sep 17 00:00:00 2001 From: Jesse Gross Date: Tue, 5 Oct 2010 19:14:21 -0700 Subject: [PATCH] tunneling: Internal dev vport can be NULL. Commit 4bee42 "tunnel: Correctly check for internal device." fixed the call to internal_dev_get_vport() by first checking that the device is in fact an internal device. However, it also accidentally removed the check ensuring that the vport itself was not NULL. This adds that check back by redoing the previous change in a more robust manner. Signed-off-by: Jesse Gross Acked-by: Ben Pfaff --- datapath/tunnel.c | 5 +++-- datapath/vport-internal_dev.c | 7 ++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/datapath/tunnel.c b/datapath/tunnel.c index ad4522808..cf742125e 100644 --- a/datapath/tunnel.c +++ b/datapath/tunnel.c @@ -1266,15 +1266,16 @@ 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 (is_internal_dev(rt_dst(rt).dev)) { + if (cache_vport) { OVS_CB(skb)->flow = cache->flow; compute_ip_summed(skb, true); - vport_receive(internal_dev_get_vport(rt_dst(rt).dev), skb); + vport_receive(cache_vport, skb); sent_len += orig_len; } else { int err; diff --git a/datapath/vport-internal_dev.c b/datapath/vport-internal_dev.c index 514d00cb3..84b90b571 100644 --- a/datapath/vport-internal_dev.c +++ b/datapath/vport-internal_dev.c @@ -329,6 +329,11 @@ int is_internal_vport(const struct vport *vport) struct vport *internal_dev_get_vport(struct net_device *netdev) { - struct internal_dev *internal_dev = internal_dev_priv(netdev); + struct internal_dev *internal_dev; + + if (!is_internal_dev(netdev)) + return NULL; + + internal_dev = internal_dev_priv(netdev); return rcu_dereference(internal_dev->attached_vport); } -- 2.43.0