]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
l2tp: split l2tp_session_get()
authorGuillaume Nault <g.nault@alphalink.fr>
Fri, 10 Aug 2018 11:21:57 +0000 (13:21 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sat, 11 Aug 2018 19:13:49 +0000 (12:13 -0700)
l2tp_session_get() is used for two different purposes. If 'tunnel' is
NULL, the session is searched globally in the supplied network
namespace. Otherwise it is searched exclusively in the tunnel context.

Callers always know the context in which they need to search the
session. But some of them do provide both a namespace and a tunnel,
making the semantic of the call unclear.

This patch defines l2tp_tunnel_get_session() for lookups done in a
tunnel and restricts l2tp_session_get() to namespace searches.

Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/l2tp/l2tp_core.c
net/l2tp/l2tp_core.h
net/l2tp/l2tp_ip.c
net/l2tp/l2tp_ip6.c
net/l2tp/l2tp_netlink.c
net/l2tp/l2tp_ppp.c

index ac6a00bcec717237e8b6b5f6b46de0a0afffc57d..2bd701a58aa6460322f9fce0a9c8dab556512462 100644 (file)
@@ -203,44 +203,44 @@ struct l2tp_tunnel *l2tp_tunnel_get_nth(const struct net *net, int nth)
 }
 EXPORT_SYMBOL_GPL(l2tp_tunnel_get_nth);
 
-/* Lookup a session. A new reference is held on the returned session. */
-struct l2tp_session *l2tp_session_get(const struct net *net,
-                                     struct l2tp_tunnel *tunnel,
-                                     u32 session_id)
+struct l2tp_session *l2tp_tunnel_get_session(struct l2tp_tunnel *tunnel,
+                                            u32 session_id)
 {
        struct hlist_head *session_list;
        struct l2tp_session *session;
 
-       if (!tunnel) {
-               struct l2tp_net *pn = l2tp_pernet(net);
-
-               session_list = l2tp_session_id_hash_2(pn, session_id);
+       session_list = l2tp_session_id_hash(tunnel, session_id);
 
-               rcu_read_lock_bh();
-               hlist_for_each_entry_rcu(session, session_list, global_hlist) {
-                       if (session->session_id == session_id) {
-                               l2tp_session_inc_refcount(session);
-                               rcu_read_unlock_bh();
+       read_lock_bh(&tunnel->hlist_lock);
+       hlist_for_each_entry(session, session_list, hlist)
+               if (session->session_id == session_id) {
+                       l2tp_session_inc_refcount(session);
+                       read_unlock_bh(&tunnel->hlist_lock);
 
-                               return session;
-                       }
+                       return session;
                }
-               rcu_read_unlock_bh();
+       read_unlock_bh(&tunnel->hlist_lock);
 
-               return NULL;
-       }
+       return NULL;
+}
+EXPORT_SYMBOL_GPL(l2tp_tunnel_get_session);
 
-       session_list = l2tp_session_id_hash(tunnel, session_id);
-       read_lock_bh(&tunnel->hlist_lock);
-       hlist_for_each_entry(session, session_list, hlist) {
+struct l2tp_session *l2tp_session_get(const struct net *net, u32 session_id)
+{
+       struct hlist_head *session_list;
+       struct l2tp_session *session;
+
+       session_list = l2tp_session_id_hash_2(l2tp_pernet(net), session_id);
+
+       rcu_read_lock_bh();
+       hlist_for_each_entry_rcu(session, session_list, global_hlist)
                if (session->session_id == session_id) {
                        l2tp_session_inc_refcount(session);
-                       read_unlock_bh(&tunnel->hlist_lock);
+                       rcu_read_unlock_bh();
 
                        return session;
                }
-       }
-       read_unlock_bh(&tunnel->hlist_lock);
+       rcu_read_unlock_bh();
 
        return NULL;
 }
@@ -872,7 +872,7 @@ static int l2tp_udp_recv_core(struct l2tp_tunnel *tunnel, struct sk_buff *skb)
        }
 
        /* Find the session context */
-       session = l2tp_session_get(tunnel->l2tp_net, tunnel, session_id);
+       session = l2tp_tunnel_get_session(tunnel, session_id);
        if (!session || !session->recv_skb) {
                if (session)
                        l2tp_session_dec_refcount(session);
index 04a9488c54b4b9194ec399fc1b36200949df3340..8480a0af973e257ee3903409ea20872db36cc1ed 100644 (file)
@@ -196,12 +196,12 @@ static inline void *l2tp_session_priv(struct l2tp_session *session)
 
 struct l2tp_tunnel *l2tp_tunnel_get(const struct net *net, u32 tunnel_id);
 struct l2tp_tunnel *l2tp_tunnel_get_nth(const struct net *net, int nth);
+struct l2tp_session *l2tp_tunnel_get_session(struct l2tp_tunnel *tunnel,
+                                            u32 session_id);
 
 void l2tp_tunnel_free(struct l2tp_tunnel *tunnel);
 
-struct l2tp_session *l2tp_session_get(const struct net *net,
-                                     struct l2tp_tunnel *tunnel,
-                                     u32 session_id);
+struct l2tp_session *l2tp_session_get(const struct net *net, u32 session_id);
 struct l2tp_session *l2tp_session_get_nth(struct l2tp_tunnel *tunnel, int nth);
 struct l2tp_session *l2tp_session_get_by_ifname(const struct net *net,
                                                const char *ifname);
index 0bc39cc20a3fcf8f5e532c137145747f40a7644c..35f6f86d4dcce898f0deacbeba695cfe438cdd91 100644 (file)
@@ -144,7 +144,7 @@ static int l2tp_ip_recv(struct sk_buff *skb)
        }
 
        /* Ok, this is a data packet. Lookup the session. */
-       session = l2tp_session_get(net, NULL, session_id);
+       session = l2tp_session_get(net, session_id);
        if (!session)
                goto discard;
 
index 42f828cf62fbb38fea121c270a57dd9d55a95cde..237f1a4a0b0c8b7fdc76cd67e7c682dee7bdaf79 100644 (file)
@@ -157,7 +157,7 @@ static int l2tp_ip6_recv(struct sk_buff *skb)
        }
 
        /* Ok, this is a data packet. Lookup the session. */
-       session = l2tp_session_get(net, NULL, session_id);
+       session = l2tp_session_get(net, session_id);
        if (!session)
                goto discard;
 
index 357503e5acd50da00ecd2704cc3640d64ec912c2..edbd5d1fbcde63fd9de6fef070b2787fcd5d993c 100644 (file)
@@ -66,7 +66,7 @@ static struct l2tp_session *l2tp_nl_session_get(struct genl_info *info)
                session_id = nla_get_u32(info->attrs[L2TP_ATTR_SESSION_ID]);
                tunnel = l2tp_tunnel_get(net, tunnel_id);
                if (tunnel) {
-                       session = l2tp_session_get(net, tunnel, session_id);
+                       session = l2tp_tunnel_get_session(tunnel, session_id);
                        l2tp_tunnel_dec_refcount(tunnel);
                }
        }
@@ -627,7 +627,7 @@ static int l2tp_nl_cmd_session_create(struct sk_buff *skb, struct genl_info *inf
                                                           &cfg);
 
        if (ret >= 0) {
-               session = l2tp_session_get(net, tunnel, session_id);
+               session = l2tp_tunnel_get_session(tunnel, session_id);
                if (session) {
                        ret = l2tp_session_notify(&l2tp_nl_family, info, session,
                                                  L2TP_CMD_SESSION_CREATE);
index c33ef9a3f3b587f0d7805dfc8996ca741f4f82fe..cd43d02484e4c8ec6f12e69e1783e47b16a46e05 100644 (file)
@@ -757,7 +757,7 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr,
        if (tunnel->peer_tunnel_id == 0)
                tunnel->peer_tunnel_id = info.peer_tunnel_id;
 
-       session = l2tp_session_get(sock_net(sk), tunnel, info.session_id);
+       session = l2tp_tunnel_get_session(tunnel, info.session_id);
        if (session) {
                drop_refcnt = true;
 
@@ -1134,10 +1134,10 @@ static int pppol2tp_tunnel_ioctl(struct l2tp_tunnel *tunnel,
                }
                if (stats.session_id != 0) {
                        /* resend to session ioctl handler */
-                       struct l2tp_session *session =
-                               l2tp_session_get(sock_net(sk), tunnel,
-                                                stats.session_id);
+                       struct l2tp_session *session;
 
+                       session = l2tp_tunnel_get_session(tunnel,
+                                                         stats.session_id);
                        if (!session) {
                                err = -EBADR;
                                break;