fou: Call setup_udp_tunnel_sock
Use helper function to set up UDP tunnel related information for a fou socket. Signed-off-by: Tom Herbert <tom@herbertland.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
55c2bc1432
commit
440924bbc0
|
@ -448,31 +448,13 @@ static void fou_release(struct fou *fou)
|
||||||
kfree_rcu(fou, rcu);
|
kfree_rcu(fou, rcu);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fou_encap_init(struct sock *sk, struct fou *fou, struct fou_cfg *cfg)
|
|
||||||
{
|
|
||||||
udp_sk(sk)->encap_rcv = fou_udp_recv;
|
|
||||||
udp_sk(sk)->gro_receive = fou_gro_receive;
|
|
||||||
udp_sk(sk)->gro_complete = fou_gro_complete;
|
|
||||||
fou_from_sock(sk)->protocol = cfg->protocol;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int gue_encap_init(struct sock *sk, struct fou *fou, struct fou_cfg *cfg)
|
|
||||||
{
|
|
||||||
udp_sk(sk)->encap_rcv = gue_udp_recv;
|
|
||||||
udp_sk(sk)->gro_receive = gue_gro_receive;
|
|
||||||
udp_sk(sk)->gro_complete = gue_gro_complete;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int fou_create(struct net *net, struct fou_cfg *cfg,
|
static int fou_create(struct net *net, struct fou_cfg *cfg,
|
||||||
struct socket **sockp)
|
struct socket **sockp)
|
||||||
{
|
{
|
||||||
struct socket *sock = NULL;
|
struct socket *sock = NULL;
|
||||||
struct fou *fou = NULL;
|
struct fou *fou = NULL;
|
||||||
struct sock *sk;
|
struct sock *sk;
|
||||||
|
struct udp_tunnel_sock_cfg tunnel_cfg;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
/* Open UDP socket */
|
/* Open UDP socket */
|
||||||
|
@ -491,33 +473,33 @@ static int fou_create(struct net *net, struct fou_cfg *cfg,
|
||||||
|
|
||||||
fou->flags = cfg->flags;
|
fou->flags = cfg->flags;
|
||||||
fou->port = cfg->udp_config.local_udp_port;
|
fou->port = cfg->udp_config.local_udp_port;
|
||||||
|
fou->type = cfg->type;
|
||||||
|
fou->sock = sock;
|
||||||
|
|
||||||
|
memset(&tunnel_cfg, 0, sizeof(tunnel_cfg));
|
||||||
|
tunnel_cfg.encap_type = 1;
|
||||||
|
tunnel_cfg.sk_user_data = fou;
|
||||||
|
tunnel_cfg.encap_destroy = NULL;
|
||||||
|
|
||||||
/* Initial for fou type */
|
/* Initial for fou type */
|
||||||
switch (cfg->type) {
|
switch (cfg->type) {
|
||||||
case FOU_ENCAP_DIRECT:
|
case FOU_ENCAP_DIRECT:
|
||||||
err = fou_encap_init(sk, fou, cfg);
|
tunnel_cfg.encap_rcv = fou_udp_recv;
|
||||||
if (err)
|
tunnel_cfg.gro_receive = fou_gro_receive;
|
||||||
goto error;
|
tunnel_cfg.gro_complete = fou_gro_complete;
|
||||||
|
fou->protocol = cfg->protocol;
|
||||||
break;
|
break;
|
||||||
case FOU_ENCAP_GUE:
|
case FOU_ENCAP_GUE:
|
||||||
err = gue_encap_init(sk, fou, cfg);
|
tunnel_cfg.encap_rcv = gue_udp_recv;
|
||||||
if (err)
|
tunnel_cfg.gro_receive = gue_gro_receive;
|
||||||
goto error;
|
tunnel_cfg.gro_complete = gue_gro_complete;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
fou->type = cfg->type;
|
setup_udp_tunnel_sock(net, sock, &tunnel_cfg);
|
||||||
|
|
||||||
udp_sk(sk)->encap_type = 1;
|
|
||||||
udp_encap_enable();
|
|
||||||
|
|
||||||
sk->sk_user_data = fou;
|
|
||||||
fou->sock = sock;
|
|
||||||
|
|
||||||
inet_inc_convert_csum(sk);
|
|
||||||
|
|
||||||
sk->sk_allocation = GFP_ATOMIC;
|
sk->sk_allocation = GFP_ATOMIC;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue