diff options
author | Pravin B Shelar <pshelar@ovn.org> | 2016-07-08 16:36:08 -0700 |
---|---|---|
committer | Pravin B Shelar <pshelar@ovn.org> | 2016-07-08 19:27:50 -0700 |
commit | 362f222d956489a7d07912a7d7e619e08b099d7d (patch) | |
tree | 14e71630dd0f3b4e2e808dfa62724be0b3105650 /datapath | |
parent | c1eb2500d139ee1f39c7729e7fdb3459f2144a69 (diff) | |
download | openvswitch-362f222d956489a7d07912a7d7e619e08b099d7d.tar.gz |
datapath: backport: geneve: add IPv6 bits to geneve_fill_metadata_dst
Upstream commit:
commit b8812fa88371ae567c907448d9a7ba62d09b90c9
Author: John W. Linville <linville@tuxdriver.com>
geneve: add IPv6 bits to geneve_fill_metadata_dst
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Reviewed-by: Jesse Gross <jesse@ovn.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Pravin B Shelar <pshelar@ovn.org>
Acked-by: Jesse Gross <jesse@kernel.org>
Diffstat (limited to 'datapath')
-rw-r--r-- | datapath/linux/compat/geneve.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/datapath/linux/compat/geneve.c b/datapath/linux/compat/geneve.c index 061ceb5cd..de05a73c4 100644 --- a/datapath/linux/compat/geneve.c +++ b/datapath/linux/compat/geneve.c @@ -1187,16 +1187,31 @@ int ovs_geneve_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb) struct geneve_dev *geneve = netdev_priv(dev); struct rtable *rt; struct flowi4 fl4; +#if IS_ENABLED(CONFIG_IPV6) + struct dst_entry *dst; + struct flowi6 fl6; +#endif - if (ip_tunnel_info_af(info) != AF_INET) - return -EINVAL; + if (ip_tunnel_info_af(info) == AF_INET) { + rt = geneve_get_v4_rt(skb, dev, &fl4, info); + if (IS_ERR(rt)) + return PTR_ERR(rt); - rt = geneve_get_v4_rt(skb, dev, &fl4, info); - if (IS_ERR(rt)) - return PTR_ERR(rt); + ip_rt_put(rt); + info->key.u.ipv4.src = fl4.saddr; +#if IS_ENABLED(CONFIG_IPV6) + } else if (ip_tunnel_info_af(info) == AF_INET6) { + dst = geneve_get_v6_dst(skb, dev, &fl6, info); + if (IS_ERR(dst)) + return PTR_ERR(dst); + + dst_release(dst); + info->key.u.ipv6.src = fl6.saddr; +#endif + } else { + return -EINVAL; + } - ip_rt_put(rt); - info->key.u.ipv4.src = fl4.saddr; info->key.tp_src = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true); info->key.tp_dst = geneve->dst_port; |