Lines Matching full:session
20 * To send data in an L2TP session, userspace opens a PPPoL2TP socket and
30 * over an L2TP session:-
113 /* Private data of each session. This data lives at the end of struct
114 * l2tp_session, referenced via session->priv[].
120 struct sock __rcu *sk; /* Pointer to the session PPPoX socket */
132 /* Retrieves the pppol2tp socket associated to a session. */
133 static struct sock *pppol2tp_session_get_sock(struct l2tp_session *session) in pppol2tp_session_get_sock() argument
135 struct pppol2tp_session *ps = l2tp_session_priv(session); in pppol2tp_session_get_sock()
140 /* Helpers to obtain tunnel/session contexts from sockets.
144 struct l2tp_session *session; in pppol2tp_sock_to_session() local
150 session = rcu_dereference_sk_user_data(sk); in pppol2tp_sock_to_session()
151 if (session && refcount_inc_not_zero(&session->ref_count)) { in pppol2tp_sock_to_session()
153 WARN_ON_ONCE(session->magic != L2TP_SESSION_MAGIC); in pppol2tp_sock_to_session()
154 return session; in pppol2tp_sock_to_session()
197 static void pppol2tp_recv(struct l2tp_session *session, struct sk_buff *skb, int data_len) in pppol2tp_recv() argument
202 * queue it on the session socket. in pppol2tp_recv()
205 sk = pppol2tp_session_get_sock(session); in pppol2tp_recv()
227 atomic_long_inc(&session->stats.rx_errors); in pppol2tp_recv()
237 pr_warn_ratelimited("%s: no socket in recv\n", session->name); in pppol2tp_recv()
246 * when a user application does a sendmsg() on the session socket. L2TP and
255 struct l2tp_session *session; in pppol2tp_sendmsg() local
263 /* Get session and tunnel contexts */ in pppol2tp_sendmsg()
265 session = pppol2tp_sock_to_session(sk); in pppol2tp_sendmsg()
266 if (!session) in pppol2tp_sendmsg()
269 tunnel = session->tunnel; in pppol2tp_sendmsg()
276 uhlen + session->hdr_len + in pppol2tp_sendmsg()
302 l2tp_xmit_skb(session, skb); in pppol2tp_sendmsg()
305 l2tp_session_put(session); in pppol2tp_sendmsg()
310 l2tp_session_put(session); in pppol2tp_sendmsg()
332 struct l2tp_session *session; in pppol2tp_xmit() local
339 /* Get session and tunnel contexts from the socket */ in pppol2tp_xmit()
340 session = pppol2tp_sock_to_session(sk); in pppol2tp_xmit()
341 if (!session) in pppol2tp_xmit()
344 tunnel = session->tunnel; in pppol2tp_xmit()
350 session->hdr_len + /* L2TP header */ in pppol2tp_xmit()
361 l2tp_xmit_skb(session, skb); in pppol2tp_xmit()
364 l2tp_session_put(session); in pppol2tp_xmit()
369 l2tp_session_put(session); in pppol2tp_xmit()
377 * Session (and tunnel control) socket create/destroy.
380 /* Really kill the session socket. (Called from sock_put() if
389 static void pppol2tp_session_close(struct l2tp_session *session) in pppol2tp_session_close() argument
393 ps = l2tp_session_priv(session); in pppol2tp_session_close()
405 l2tp_session_put(session); in pppol2tp_session_close()
409 /* Called when the PPPoX socket (session) is closed.
414 struct l2tp_session *session; in pppol2tp_release() local
432 session = pppol2tp_sock_to_session(sk); in pppol2tp_release()
433 if (session) { in pppol2tp_release()
434 l2tp_session_delete(session); in pppol2tp_release()
436 l2tp_session_put(session); in pppol2tp_release()
499 struct l2tp_session *session = arg; in pppol2tp_show() local
503 sk = pppol2tp_session_get_sock(session); in pppol2tp_show()
512 static void pppol2tp_session_init(struct l2tp_session *session) in pppol2tp_session_init() argument
516 session->recv_skb = pppol2tp_recv; in pppol2tp_session_init()
517 session->session_close = pppol2tp_session_close; in pppol2tp_session_init()
519 session->show = pppol2tp_show; in pppol2tp_session_init()
521 ps = l2tp_session_priv(session); in pppol2tp_session_init()
692 struct l2tp_session *session = NULL; in pppol2tp_connect() local
729 session = l2tp_session_get(sock_net(sk), tunnel->sock, tunnel->version, in pppol2tp_connect()
731 if (session) { in pppol2tp_connect()
734 if (session->pwtype != L2TP_PWTYPE_PPP) { in pppol2tp_connect()
739 ps = l2tp_session_priv(session); in pppol2tp_connect()
741 /* Using a pre-existing session is fine as long as it hasn't in pppol2tp_connect()
755 session = l2tp_session_create(sizeof(struct pppol2tp_session), in pppol2tp_connect()
758 if (IS_ERR(session)) { in pppol2tp_connect()
759 error = PTR_ERR(session); in pppol2tp_connect()
765 pppol2tp_session_init(session); in pppol2tp_connect()
766 ps = l2tp_session_priv(session); in pppol2tp_connect()
767 refcount_inc(&session->ref_count); in pppol2tp_connect()
770 error = l2tp_session_register(session, tunnel); in pppol2tp_connect()
773 l2tp_session_put(session); in pppol2tp_connect()
785 if (session->session_id == 0 && session->peer_session_id == 0) { in pppol2tp_connect()
809 /* This is how we get the session context from the socket. */ in pppol2tp_connect()
811 rcu_assign_sk_user_data(sk, session); in pppol2tp_connect()
815 /* Keep the reference we've grabbed on the session: sk doesn't expect in pppol2tp_connect()
816 * the session to disappear. pppol2tp_session_close() is responsible in pppol2tp_connect()
826 l2tp_session_delete(session); in pppol2tp_connect()
831 l2tp_session_put(session); in pppol2tp_connect()
846 struct l2tp_session *session; in pppol2tp_session_create() local
854 /* Allocate and initialize a new session context. */ in pppol2tp_session_create()
855 session = l2tp_session_create(sizeof(struct pppol2tp_session), in pppol2tp_session_create()
858 if (IS_ERR(session)) { in pppol2tp_session_create()
859 error = PTR_ERR(session); in pppol2tp_session_create()
863 pppol2tp_session_init(session); in pppol2tp_session_create()
865 error = l2tp_session_register(session, tunnel); in pppol2tp_session_create()
872 l2tp_session_put(session); in pppol2tp_session_create()
886 struct l2tp_session *session; in pppol2tp_getname() local
899 session = pppol2tp_sock_to_session(sk); in pppol2tp_getname()
900 if (!session) in pppol2tp_getname()
903 pls = l2tp_session_priv(session); in pppol2tp_getname()
904 tunnel = session->tunnel; in pppol2tp_getname()
918 sp.pppol2tp.s_session = session->session_id; in pppol2tp_getname()
919 sp.pppol2tp.d_session = session->peer_session_id; in pppol2tp_getname()
936 sp.pppol2tp.s_session = session->session_id; in pppol2tp_getname()
937 sp.pppol2tp.d_session = session->peer_session_id; in pppol2tp_getname()
954 sp.pppol2tp.s_session = session->session_id; in pppol2tp_getname()
955 sp.pppol2tp.d_session = session->peer_session_id; in pppol2tp_getname()
973 sp.pppol2tp.s_session = session->session_id; in pppol2tp_getname()
974 sp.pppol2tp.d_session = session->peer_session_id; in pppol2tp_getname()
983 l2tp_session_put(session); in pppol2tp_getname()
1017 struct l2tp_session *session; in pppol2tp_tunnel_copy_stats() local
1024 /* If session_id is set, search the corresponding session in the in pppol2tp_tunnel_copy_stats()
1025 * context of this tunnel and record the session's statistics. in pppol2tp_tunnel_copy_stats()
1027 session = l2tp_session_get(tunnel->l2tp_net, tunnel->sock, tunnel->version, in pppol2tp_tunnel_copy_stats()
1029 if (!session) in pppol2tp_tunnel_copy_stats()
1032 if (session->pwtype != L2TP_PWTYPE_PPP) { in pppol2tp_tunnel_copy_stats()
1033 l2tp_session_put(session); in pppol2tp_tunnel_copy_stats()
1037 pppol2tp_copy_stats(stats, &session->stats); in pppol2tp_tunnel_copy_stats()
1038 l2tp_session_put(session); in pppol2tp_tunnel_copy_stats()
1047 struct l2tp_session *session; in pppol2tp_ioctl() local
1050 session = pppol2tp_sock_to_session(sock->sk); in pppol2tp_ioctl()
1052 /* Validate session presence and magic integrity ONLY for commands in pppol2tp_ioctl()
1053 * that belong to L2TP and require a valid session. in pppol2tp_ioctl()
1061 if (!session) in pppol2tp_ioctl()
1064 if (session->magic != L2TP_SESSION_MAGIC) { in pppol2tp_ioctl()
1065 l2tp_session_put(session); in pppol2tp_ioctl()
1077 if (!session->session_id && !session->peer_session_id) { in pppol2tp_ioctl()
1091 if (!session->session_id && !session->peer_session_id) { in pppol2tp_ioctl()
1103 /* Session 0 represents the parent tunnel */ in pppol2tp_ioctl()
1104 if (!session->session_id && !session->peer_session_id) { in pppol2tp_ioctl()
1115 session->tunnel); in pppol2tp_ioctl()
1121 pppol2tp_copy_stats(&stats, &session->stats); in pppol2tp_ioctl()
1122 stats.session_id = session->session_id; in pppol2tp_ioctl()
1124 stats.tunnel_id = session->tunnel->tunnel_id; in pppol2tp_ioctl()
1125 stats.using_ipsec = l2tp_tunnel_uses_xfrm(session->tunnel); in pppol2tp_ioctl()
1138 if (session) in pppol2tp_ioctl()
1139 l2tp_session_put(session); in pppol2tp_ioctl()
1175 /* Session setsockopt helper.
1178 struct l2tp_session *session, in pppol2tp_session_setsockopt() argument
1189 session->recv_seq = !!val; in pppol2tp_session_setsockopt()
1197 session->send_seq = !!val; in pppol2tp_session_setsockopt()
1198 l2tp_session_set_header_len(session, session->tunnel->version, in pppol2tp_session_setsockopt()
1199 session->tunnel->encap); in pppol2tp_session_setsockopt()
1207 session->lns_mode = !!val; in pppol2tp_session_setsockopt()
1211 /* Session debug flags option is deprecated */ in pppol2tp_session_setsockopt()
1215 session->reorder_timeout = msecs_to_jiffies(val); in pppol2tp_session_setsockopt()
1227 * Does API checks, then calls either the tunnel or session setsockopt
1229 * session or the special tunnel type.
1235 struct l2tp_session *session; in pppol2tp_setsockopt() local
1253 /* Get session context from the socket */ in pppol2tp_setsockopt()
1255 session = pppol2tp_sock_to_session(sk); in pppol2tp_setsockopt()
1256 if (!session) in pppol2tp_setsockopt()
1261 if (session->session_id == 0 && session->peer_session_id == 0) { in pppol2tp_setsockopt()
1262 tunnel = session->tunnel; in pppol2tp_setsockopt()
1265 err = pppol2tp_session_setsockopt(sk, session, optname, val); in pppol2tp_setsockopt()
1268 l2tp_session_put(session); in pppol2tp_setsockopt()
1295 /* Session getsockopt helper. Called with sock locked.
1298 struct l2tp_session *session, in pppol2tp_session_getsockopt() argument
1305 *val = session->recv_seq; in pppol2tp_session_getsockopt()
1309 *val = session->send_seq; in pppol2tp_session_getsockopt()
1313 *val = session->lns_mode; in pppol2tp_session_getsockopt()
1317 /* Session debug flags option is deprecated */ in pppol2tp_session_getsockopt()
1322 *val = (int)jiffies_to_msecs(session->reorder_timeout); in pppol2tp_session_getsockopt()
1333 * Does API checks, then calls either the tunnel or session getsockopt
1334 * handler, according to whether the PPPoX socket is a for a regular session
1341 struct l2tp_session *session; in pppol2tp_getsockopt() local
1361 /* Get the session context */ in pppol2tp_getsockopt()
1363 session = pppol2tp_sock_to_session(sk); in pppol2tp_getsockopt()
1364 if (!session) in pppol2tp_getsockopt()
1368 if (session->session_id == 0 && session->peer_session_id == 0) { in pppol2tp_getsockopt()
1369 tunnel = session->tunnel; in pppol2tp_getsockopt()
1374 err = pppol2tp_session_getsockopt(sk, session, optname, &val); in pppol2tp_getsockopt()
1389 l2tp_session_put(session); in pppol2tp_getsockopt()
1405 unsigned long skey; /* lookup key of current session */
1407 struct l2tp_session *session; /* NULL means get next tunnel */ member
1431 if (pd->session) in pppol2tp_next_session()
1432 l2tp_session_put(pd->session); in pppol2tp_next_session()
1434 pd->session = l2tp_session_get_next(net, pd->tunnel->sock, in pppol2tp_next_session()
1439 if (!pd->session) { in pppol2tp_next_session()
1467 /* NULL tunnel and session indicates end of list */ in pppol2tp_seq_start()
1468 if (!pd->tunnel && !pd->session) in pppol2tp_seq_start()
1491 if (pd->session) { in pppol2tp_seq_stop()
1492 l2tp_session_put(pd->session); in pppol2tp_seq_stop()
1493 pd->session = NULL; in pppol2tp_seq_stop()
1521 struct l2tp_session *session = v; in pppol2tp_seq_session_show() local
1522 struct l2tp_tunnel *tunnel = session->tunnel; in pppol2tp_seq_session_show()
1537 sk = pppol2tp_session_get_sock(session); in pppol2tp_seq_session_show()
1540 user_data_ok = (session == sk->sk_user_data) ? 'Y' : 'N'; in pppol2tp_seq_session_show()
1546 seq_printf(m, " SESSION '%s' %08X/%d %04X/%04X -> %04X/%04X %d %c\n", in pppol2tp_seq_session_show()
1547 session->name, ip, port, in pppol2tp_seq_session_show()
1549 session->session_id, in pppol2tp_seq_session_show()
1551 session->peer_session_id, in pppol2tp_seq_session_show()
1554 session->recv_seq ? 'R' : '-', in pppol2tp_seq_session_show()
1555 session->send_seq ? 'S' : '-', in pppol2tp_seq_session_show()
1556 session->lns_mode ? "LNS" : "LAC", in pppol2tp_seq_session_show()
1558 jiffies_to_msecs(session->reorder_timeout)); in pppol2tp_seq_session_show()
1560 session->nr, session->ns, in pppol2tp_seq_session_show()
1561 atomic_long_read(&session->stats.tx_packets), in pppol2tp_seq_session_show()
1562 atomic_long_read(&session->stats.tx_bytes), in pppol2tp_seq_session_show()
1563 atomic_long_read(&session->stats.tx_errors), in pppol2tp_seq_session_show()
1564 atomic_long_read(&session->stats.rx_packets), in pppol2tp_seq_session_show()
1565 atomic_long_read(&session->stats.rx_bytes), in pppol2tp_seq_session_show()
1566 atomic_long_read(&session->stats.rx_errors)); in pppol2tp_seq_session_show()
1583 seq_puts(m, "TUNNEL name, user-data-ok session-count\n"); in pppol2tp_seq_show()
1585 seq_puts(m, " SESSION name, addr/port src-tid/sid dest-tid/sid state user-data-ok\n"); in pppol2tp_seq_show()
1591 if (!pd->session) in pppol2tp_seq_show()
1594 pppol2tp_seq_session_show(m, pd->session); in pppol2tp_seq_show()