return -EPFNOSUPPORT;
}
-static struct sock *geneve_create_sock(struct net *net, bool ipv6,
- __be16 port, bool ipv6_rx_csum)
+static struct sock *geneve_create_sock(struct net *net,
+ struct geneve_dev *geneve, bool ipv6)
{
+ struct ip_tunnel_info *info = &geneve->cfg.info;
struct udp_port_cfg udp_conf;
struct socket *sock;
int err;
if (ipv6) {
udp_conf.family = AF_INET6;
udp_conf.ipv6_v6only = 1;
- udp_conf.use_udp6_rx_checksums = ipv6_rx_csum;
+ udp_conf.use_udp6_rx_checksums = geneve->cfg.use_udp6_rx_checksums;
} else {
udp_conf.family = AF_INET;
udp_conf.local_ip.s_addr = htonl(INADDR_ANY);
}
- udp_conf.local_udp_port = port;
+ udp_conf.local_udp_port = info->key.tp_dst;
/* Open UDP socket */
err = udp_sock_create(net, &udp_conf, &sock);
}
/* Create new listen socket if needed */
-static struct geneve_sock *geneve_socket_create(struct net *net, __be16 port,
- bool ipv6, bool ipv6_rx_csum)
+static struct geneve_sock *geneve_socket_create(struct net *net,
+ struct geneve_dev *geneve, bool ipv6)
{
struct geneve_net *gn = net_generic(net, geneve_net_id);
struct udp_tunnel_sock_cfg tunnel_cfg;
if (!gs)
return ERR_PTR(-ENOMEM);
- sk = geneve_create_sock(net, ipv6, port, ipv6_rx_csum);
+ sk = geneve_create_sock(net, geneve, ipv6);
if (IS_ERR(sk)) {
kfree(gs);
return ERR_CAST(sk);
goto out;
}
- gs = geneve_socket_create(net, geneve->cfg.info.key.tp_dst, ipv6,
- geneve->cfg.use_udp6_rx_checksums);
+ gs = geneve_socket_create(net, geneve, ipv6);
if (IS_ERR(gs))
return PTR_ERR(gs);