struct pfcp_dev {
struct list_head list;
- struct socket *sock;
+ struct sock *sk;
struct net_device *dev;
struct net *net;
static void pfcp_del_sock(struct pfcp_dev *pfcp)
{
- udp_tunnel_sock_release(pfcp->sock->sk);
- pfcp->sock = NULL;
+ udp_tunnel_sock_release(pfcp->sk);
+ pfcp->sk = NULL;
}
static void pfcp_dev_uninit(struct net_device *dev)
netif_keep_dst(dev);
}
-static struct socket *pfcp_create_sock(struct pfcp_dev *pfcp)
+static struct sock *pfcp_create_sock(struct pfcp_dev *pfcp)
{
struct udp_tunnel_sock_cfg tuncfg = {};
struct udp_port_cfg udp_conf = {
setup_udp_tunnel_sock(net, sock->sk, &tuncfg);
- return sock;
+ return sock->sk;
}
static int pfcp_add_sock(struct pfcp_dev *pfcp)
{
- pfcp->sock = pfcp_create_sock(pfcp);
+ pfcp->sk = pfcp_create_sock(pfcp);
- return PTR_ERR_OR_ZERO(pfcp->sock);
+ return PTR_ERR_OR_ZERO(pfcp->sk);
}
static int pfcp_newlink(struct net_device *dev,
exit_del_pfcp_sock:
pfcp_del_sock(pfcp);
+ synchronize_rcu();
exit_err:
pfcp->net = NULL;
return err;