Skip to content

Commit 17886c4

Browse files
Andreas Schultzdavem330
authored andcommitted
gtp: switch from struct socket to struct sock for the GTP sockets
After enabling the UDP encapsulation, only the sk member is used. Holding the socket would prevent user space from closing the socket, but holding a reference to the sk member does not have the same effect. This change will make it simpler to later detach the sockets from the netdevice. Signed-off-by: Andreas Schultz <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 68e5cfa commit 17886c4

File tree

1 file changed

+23
-19
lines changed

1 file changed

+23
-19
lines changed

drivers/net/gtp.c

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ struct pdp_ctx {
6666
struct gtp_dev {
6767
struct list_head list;
6868

69-
struct socket *sock0;
70-
struct socket *sock1u;
69+
struct sock *sk0;
70+
struct sock *sk1u;
7171

7272
struct net_device *dev;
7373

@@ -261,17 +261,19 @@ static int gtp1u_udp_encap_recv(struct gtp_dev *gtp, struct sk_buff *skb,
261261

262262
static void gtp_encap_disable(struct gtp_dev *gtp)
263263
{
264-
if (gtp->sock0 && gtp->sock0->sk) {
265-
udp_sk(gtp->sock0->sk)->encap_type = 0;
266-
rcu_assign_sk_user_data(gtp->sock0->sk, NULL);
264+
if (gtp->sk0) {
265+
udp_sk(gtp->sk0)->encap_type = 0;
266+
rcu_assign_sk_user_data(gtp->sk0, NULL);
267+
sock_put(gtp->sk0);
267268
}
268-
if (gtp->sock1u && gtp->sock1u->sk) {
269-
udp_sk(gtp->sock1u->sk)->encap_type = 0;
270-
rcu_assign_sk_user_data(gtp->sock1u->sk, NULL);
269+
if (gtp->sk1u) {
270+
udp_sk(gtp->sk1u)->encap_type = 0;
271+
rcu_assign_sk_user_data(gtp->sk1u, NULL);
272+
sock_put(gtp->sk1u);
271273
}
272274

273-
gtp->sock0 = NULL;
274-
gtp->sock1u = NULL;
275+
gtp->sk0 = NULL;
276+
gtp->sk1u = NULL;
275277
}
276278

277279
static void gtp_encap_destroy(struct sock *sk)
@@ -484,14 +486,14 @@ static int gtp_build_skb_ip4(struct sk_buff *skb, struct net_device *dev,
484486

485487
switch (pctx->gtp_version) {
486488
case GTP_V0:
487-
if (gtp->sock0)
488-
sk = gtp->sock0->sk;
489+
if (gtp->sk0)
490+
sk = gtp->sk0;
489491
else
490492
sk = NULL;
491493
break;
492494
case GTP_V1:
493-
if (gtp->sock1u)
494-
sk = gtp->sock1u->sk;
495+
if (gtp->sk1u)
496+
sk = gtp->sk1u;
495497
else
496498
sk = NULL;
497499
break;
@@ -504,7 +506,7 @@ static int gtp_build_skb_ip4(struct sk_buff *skb, struct net_device *dev,
504506
return -ENOENT;
505507
}
506508

507-
rt = ip4_route_output_gtp(sock_net(sk), &fl4, gtp->sock0->sk,
509+
rt = ip4_route_output_gtp(sock_net(sk), &fl4, gtp->sk0,
508510
pctx->sgsn_addr_ip4.s_addr);
509511
if (IS_ERR(rt)) {
510512
netdev_dbg(dev, "no route to SSGN %pI4\n",
@@ -839,18 +841,20 @@ static int gtp_encap_enable(struct net_device *dev, struct gtp_dev *gtp,
839841

840842
netdev_dbg(dev, "enable gtp on %p, %p\n", sock0, sock1u);
841843

842-
gtp->sock0 = sock0;
843-
gtp->sock1u = sock1u;
844+
sock_hold(sock0->sk);
845+
gtp->sk0 = sock0->sk;
846+
sock_hold(sock1u->sk);
847+
gtp->sk1u = sock1u->sk;
844848

845849
tuncfg.sk_user_data = gtp;
846850
tuncfg.encap_rcv = gtp_encap_recv;
847851
tuncfg.encap_destroy = gtp_encap_destroy;
848852

849853
tuncfg.encap_type = UDP_ENCAP_GTP0;
850-
setup_udp_tunnel_sock(sock_net(gtp->sock0->sk), gtp->sock0, &tuncfg);
854+
setup_udp_tunnel_sock(sock_net(gtp->sk0), sock0, &tuncfg);
851855

852856
tuncfg.encap_type = UDP_ENCAP_GTP1U;
853-
setup_udp_tunnel_sock(sock_net(gtp->sock1u->sk), gtp->sock1u, &tuncfg);
857+
setup_udp_tunnel_sock(sock_net(gtp->sk1u), sock1u, &tuncfg);
854858

855859
err = 0;
856860
err2:

0 commit comments

Comments
 (0)