diff options
author | John W. Linville <linville@tuxdriver.com> | 2015-10-27 09:49:00 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-10-29 23:10:54 -0400 |
commit | b8812fa88371ae567c907448d9a7ba62d09b90c9 (patch) | |
tree | 4f606b2ad70299e505f122d391bce5d147634daf | |
parent | 3a56f86f1be6a381345800d69999eaff87e0161d (diff) |
geneve: add IPv6 bits to geneve_fill_metadata_dst
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Reviewed-by: Jesse Gross <jesse@nicira.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/geneve.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index 44e724508c55..de5c30c9f059 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c | |||
@@ -1006,16 +1006,31 @@ static int geneve_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb) | |||
1006 | struct geneve_dev *geneve = netdev_priv(dev); | 1006 | struct geneve_dev *geneve = netdev_priv(dev); |
1007 | struct rtable *rt; | 1007 | struct rtable *rt; |
1008 | struct flowi4 fl4; | 1008 | struct flowi4 fl4; |
1009 | #if IS_ENABLED(CONFIG_IPV6) | ||
1010 | struct dst_entry *dst; | ||
1011 | struct flowi6 fl6; | ||
1012 | #endif | ||
1009 | 1013 | ||
1010 | if (ip_tunnel_info_af(info) != AF_INET) | 1014 | if (ip_tunnel_info_af(info) == AF_INET) { |
1011 | return -EINVAL; | 1015 | rt = geneve_get_v4_rt(skb, dev, &fl4, info); |
1016 | if (IS_ERR(rt)) | ||
1017 | return PTR_ERR(rt); | ||
1012 | 1018 | ||
1013 | rt = geneve_get_v4_rt(skb, dev, &fl4, info); | 1019 | ip_rt_put(rt); |
1014 | if (IS_ERR(rt)) | 1020 | info->key.u.ipv4.src = fl4.saddr; |
1015 | return PTR_ERR(rt); | 1021 | #if IS_ENABLED(CONFIG_IPV6) |
1022 | } else if (ip_tunnel_info_af(info) == AF_INET6) { | ||
1023 | dst = geneve_get_v6_dst(skb, dev, &fl6, info); | ||
1024 | if (IS_ERR(dst)) | ||
1025 | return PTR_ERR(dst); | ||
1026 | |||
1027 | dst_release(dst); | ||
1028 | info->key.u.ipv6.src = fl6.saddr; | ||
1029 | #endif | ||
1030 | } else { | ||
1031 | return -EINVAL; | ||
1032 | } | ||
1016 | 1033 | ||
1017 | ip_rt_put(rt); | ||
1018 | info->key.u.ipv4.src = fl4.saddr; | ||
1019 | info->key.tp_src = udp_flow_src_port(geneve->net, skb, | 1034 | info->key.tp_src = udp_flow_src_port(geneve->net, skb, |
1020 | 1, USHRT_MAX, true); | 1035 | 1, USHRT_MAX, true); |
1021 | info->key.tp_dst = geneve->dst_port; | 1036 | info->key.tp_dst = geneve->dst_port; |