|
@@ -322,8 +322,8 @@ struct l2tp_session *l2tp_session_get_by_ifname(const struct net *net,
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(l2tp_session_get_by_ifname);
|
|
|
|
|
|
-static int l2tp_session_add_to_tunnel(struct l2tp_tunnel *tunnel,
|
|
|
- struct l2tp_session *session)
|
|
|
+int l2tp_session_register(struct l2tp_session *session,
|
|
|
+ struct l2tp_tunnel *tunnel)
|
|
|
{
|
|
|
struct l2tp_session *session_walk;
|
|
|
struct hlist_head *g_head;
|
|
@@ -371,6 +371,10 @@ static int l2tp_session_add_to_tunnel(struct l2tp_tunnel *tunnel,
|
|
|
hlist_add_head(&session->hlist, head);
|
|
|
write_unlock_bh(&tunnel->hlist_lock);
|
|
|
|
|
|
+ /* Ignore management session in session count value */
|
|
|
+ if (session->session_id != 0)
|
|
|
+ atomic_inc(&l2tp_session_count);
|
|
|
+
|
|
|
return 0;
|
|
|
|
|
|
err_tlock_pnlock:
|
|
@@ -380,6 +384,7 @@ err_tlock:
|
|
|
|
|
|
return err;
|
|
|
}
|
|
|
+EXPORT_SYMBOL_GPL(l2tp_session_register);
|
|
|
|
|
|
/* Lookup a tunnel by id
|
|
|
*/
|
|
@@ -1788,7 +1793,6 @@ EXPORT_SYMBOL_GPL(l2tp_session_set_header_len);
|
|
|
struct l2tp_session *l2tp_session_create(int priv_size, struct l2tp_tunnel *tunnel, u32 session_id, u32 peer_session_id, struct l2tp_session_cfg *cfg)
|
|
|
{
|
|
|
struct l2tp_session *session;
|
|
|
- int err;
|
|
|
|
|
|
session = kzalloc(sizeof(struct l2tp_session) + priv_size, GFP_KERNEL);
|
|
|
if (session != NULL) {
|
|
@@ -1846,17 +1850,6 @@ struct l2tp_session *l2tp_session_create(int priv_size, struct l2tp_tunnel *tunn
|
|
|
|
|
|
refcount_set(&session->ref_count, 1);
|
|
|
|
|
|
- err = l2tp_session_add_to_tunnel(tunnel, session);
|
|
|
- if (err) {
|
|
|
- kfree(session);
|
|
|
-
|
|
|
- return ERR_PTR(err);
|
|
|
- }
|
|
|
-
|
|
|
- /* Ignore management session in session count value */
|
|
|
- if (session->session_id != 0)
|
|
|
- atomic_inc(&l2tp_session_count);
|
|
|
-
|
|
|
return session;
|
|
|
}
|
|
|
|