Skip to content

Commit 34beb21

Browse files
markdgraydavem330
authored andcommitted
geneve: add transport ports in route lookup for geneve
This patch adds transport ports information for route lookup so that IPsec can select Geneve tunnel traffic to do encryption. This is needed for OVS/OVN IPsec with encrypted Geneve tunnels. This can be tested by configuring a host-host VPN using an IKE daemon and specifying port numbers. For example, for an Openswan-type configuration, the following parameters should be configured on both hosts and IPsec set up as-per normal: $ cat /etc/ipsec.conf conn in ... left=$IP1 right=$IP2 ... leftprotoport=udp/6081 rightprotoport=udp ... conn out ... left=$IP1 right=$IP2 ... leftprotoport=udp rightprotoport=udp/6081 ... The tunnel can then be setup using "ip" on both hosts (but changing the relevant IP addresses): $ ip link add tun type geneve id 1000 remote $IP2 $ ip addr add 192.168.0.1/24 dev tun $ ip link set tun up This can then be tested by pinging from $IP1: $ ping 192.168.0.2 Without this patch the traffic is unencrypted on the wire. Fixes: 2d07dc7 ("geneve: add initial netdev driver for GENEVE tunnels") Signed-off-by: Qiuyu Xiao <qiuyu.xiao.qyx@gmail.com> Signed-off-by: Mark Gray <mark.d.gray@redhat.com> Reviewed-by: Greg Rose <gvrose8192@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 5f1ab0f commit 34beb21

File tree

1 file changed

+27
-10
lines changed

1 file changed

+27
-10
lines changed

drivers/net/geneve.c

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -777,7 +777,8 @@ static struct rtable *geneve_get_v4_rt(struct sk_buff *skb,
777777
struct net_device *dev,
778778
struct geneve_sock *gs4,
779779
struct flowi4 *fl4,
780-
const struct ip_tunnel_info *info)
780+
const struct ip_tunnel_info *info,
781+
__be16 dport, __be16 sport)
781782
{
782783
bool use_cache = ip_tunnel_dst_cache_usable(skb, info);
783784
struct geneve_dev *geneve = netdev_priv(dev);
@@ -793,6 +794,8 @@ static struct rtable *geneve_get_v4_rt(struct sk_buff *skb,
793794
fl4->flowi4_proto = IPPROTO_UDP;
794795
fl4->daddr = info->key.u.ipv4.dst;
795796
fl4->saddr = info->key.u.ipv4.src;
797+
fl4->fl4_dport = dport;
798+
fl4->fl4_sport = sport;
796799

797800
tos = info->key.tos;
798801
if ((tos == 1) && !geneve->cfg.collect_md) {
@@ -827,7 +830,8 @@ static struct dst_entry *geneve_get_v6_dst(struct sk_buff *skb,
827830
struct net_device *dev,
828831
struct geneve_sock *gs6,
829832
struct flowi6 *fl6,
830-
const struct ip_tunnel_info *info)
833+
const struct ip_tunnel_info *info,
834+
__be16 dport, __be16 sport)
831835
{
832836
bool use_cache = ip_tunnel_dst_cache_usable(skb, info);
833837
struct geneve_dev *geneve = netdev_priv(dev);
@@ -843,6 +847,9 @@ static struct dst_entry *geneve_get_v6_dst(struct sk_buff *skb,
843847
fl6->flowi6_proto = IPPROTO_UDP;
844848
fl6->daddr = info->key.u.ipv6.dst;
845849
fl6->saddr = info->key.u.ipv6.src;
850+
fl6->fl6_dport = dport;
851+
fl6->fl6_sport = sport;
852+
846853
prio = info->key.tos;
847854
if ((prio == 1) && !geneve->cfg.collect_md) {
848855
prio = ip_tunnel_get_dsfield(ip_hdr(skb), skb);
@@ -889,7 +896,9 @@ static int geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
889896
__be16 sport;
890897
int err;
891898

892-
rt = geneve_get_v4_rt(skb, dev, gs4, &fl4, info);
899+
sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
900+
rt = geneve_get_v4_rt(skb, dev, gs4, &fl4, info,
901+
geneve->cfg.info.key.tp_dst, sport);
893902
if (IS_ERR(rt))
894903
return PTR_ERR(rt);
895904

@@ -919,7 +928,6 @@ static int geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
919928
return -EMSGSIZE;
920929
}
921930

922-
sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
923931
if (geneve->cfg.collect_md) {
924932
tos = ip_tunnel_ecn_encap(key->tos, ip_hdr(skb), skb);
925933
ttl = key->ttl;
@@ -974,7 +982,9 @@ static int geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
974982
__be16 sport;
975983
int err;
976984

977-
dst = geneve_get_v6_dst(skb, dev, gs6, &fl6, info);
985+
sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
986+
dst = geneve_get_v6_dst(skb, dev, gs6, &fl6, info,
987+
geneve->cfg.info.key.tp_dst, sport);
978988
if (IS_ERR(dst))
979989
return PTR_ERR(dst);
980990

@@ -1003,7 +1013,6 @@ static int geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
10031013
return -EMSGSIZE;
10041014
}
10051015

1006-
sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
10071016
if (geneve->cfg.collect_md) {
10081017
prio = ip_tunnel_ecn_encap(key->tos, ip_hdr(skb), skb);
10091018
ttl = key->ttl;
@@ -1085,13 +1094,18 @@ static int geneve_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb)
10851094
{
10861095
struct ip_tunnel_info *info = skb_tunnel_info(skb);
10871096
struct geneve_dev *geneve = netdev_priv(dev);
1097+
__be16 sport;
10881098

10891099
if (ip_tunnel_info_af(info) == AF_INET) {
10901100
struct rtable *rt;
10911101
struct flowi4 fl4;
1102+
10921103
struct geneve_sock *gs4 = rcu_dereference(geneve->sock4);
1104+
sport = udp_flow_src_port(geneve->net, skb,
1105+
1, USHRT_MAX, true);
10931106

1094-
rt = geneve_get_v4_rt(skb, dev, gs4, &fl4, info);
1107+
rt = geneve_get_v4_rt(skb, dev, gs4, &fl4, info,
1108+
geneve->cfg.info.key.tp_dst, sport);
10951109
if (IS_ERR(rt))
10961110
return PTR_ERR(rt);
10971111

@@ -1101,9 +1115,13 @@ static int geneve_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb)
11011115
} else if (ip_tunnel_info_af(info) == AF_INET6) {
11021116
struct dst_entry *dst;
11031117
struct flowi6 fl6;
1118+
11041119
struct geneve_sock *gs6 = rcu_dereference(geneve->sock6);
1120+
sport = udp_flow_src_port(geneve->net, skb,
1121+
1, USHRT_MAX, true);
11051122

1106-
dst = geneve_get_v6_dst(skb, dev, gs6, &fl6, info);
1123+
dst = geneve_get_v6_dst(skb, dev, gs6, &fl6, info,
1124+
geneve->cfg.info.key.tp_dst, sport);
11071125
if (IS_ERR(dst))
11081126
return PTR_ERR(dst);
11091127

@@ -1114,8 +1132,7 @@ static int geneve_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb)
11141132
return -EINVAL;
11151133
}
11161134

1117-
info->key.tp_src = udp_flow_src_port(geneve->net, skb,
1118-
1, USHRT_MAX, true);
1135+
info->key.tp_src = sport;
11191136
info->key.tp_dst = geneve->cfg.info.key.tp_dst;
11201137
return 0;
11211138
}

0 commit comments

Comments
 (0)