Lines Matching full:tunnel

146 l2tp_session_id_hash(struct l2tp_tunnel *tunnel, u32 session_id)  in l2tp_session_id_hash()  argument
148 return &tunnel->session_hlist[hash_32(session_id, L2TP_HASH_BITS)]; in l2tp_session_id_hash()
151 static void l2tp_tunnel_free(struct l2tp_tunnel *tunnel) in l2tp_tunnel_free() argument
153 trace_free_tunnel(tunnel); in l2tp_tunnel_free()
154 sock_put(tunnel->sock); in l2tp_tunnel_free()
155 /* the tunnel is freed in the socket destructor */ in l2tp_tunnel_free()
161 if (session->tunnel) in l2tp_session_free()
162 l2tp_tunnel_dec_refcount(session->tunnel); in l2tp_session_free()
168 struct l2tp_tunnel *tunnel = sk->sk_user_data; in l2tp_sk_to_tunnel() local
170 if (tunnel) in l2tp_sk_to_tunnel()
171 if (WARN_ON(tunnel->magic != L2TP_TUNNEL_MAGIC)) in l2tp_sk_to_tunnel()
174 return tunnel; in l2tp_sk_to_tunnel()
178 void l2tp_tunnel_inc_refcount(struct l2tp_tunnel *tunnel) in l2tp_tunnel_inc_refcount() argument
180 refcount_inc(&tunnel->ref_count); in l2tp_tunnel_inc_refcount()
184 void l2tp_tunnel_dec_refcount(struct l2tp_tunnel *tunnel) in l2tp_tunnel_dec_refcount() argument
186 if (refcount_dec_and_test(&tunnel->ref_count)) in l2tp_tunnel_dec_refcount()
187 l2tp_tunnel_free(tunnel); in l2tp_tunnel_dec_refcount()
204 /* Lookup a tunnel. A new reference is held on the returned tunnel. */
208 struct l2tp_tunnel *tunnel; in l2tp_tunnel_get() local
211 tunnel = idr_find(&pn->l2tp_tunnel_idr, tunnel_id); in l2tp_tunnel_get()
212 if (tunnel && refcount_inc_not_zero(&tunnel->ref_count)) { in l2tp_tunnel_get()
214 return tunnel; in l2tp_tunnel_get()
226 struct l2tp_tunnel *tunnel; in l2tp_tunnel_get_nth() local
230 idr_for_each_entry_ul(&pn->l2tp_tunnel_idr, tunnel, tmp, tunnel_id) { in l2tp_tunnel_get_nth()
231 if (tunnel && ++count > nth && in l2tp_tunnel_get_nth()
232 refcount_inc_not_zero(&tunnel->ref_count)) { in l2tp_tunnel_get_nth()
234 return tunnel; in l2tp_tunnel_get_nth()
243 struct l2tp_session *l2tp_tunnel_get_session(struct l2tp_tunnel *tunnel, in l2tp_tunnel_get_session() argument
249 session_list = l2tp_session_id_hash(tunnel, session_id); in l2tp_tunnel_get_session()
286 struct l2tp_session *l2tp_session_get_nth(struct l2tp_tunnel *tunnel, int nth) in l2tp_session_get_nth() argument
294 hlist_for_each_entry_rcu(session, &tunnel->session_hlist[hash], hlist) { in l2tp_session_get_nth()
338 struct l2tp_tunnel *tunnel) in l2tp_session_register() argument
346 head = l2tp_session_id_hash(tunnel, session->session_id); in l2tp_session_register()
348 spin_lock_bh(&tunnel->hlist_lock); in l2tp_session_register()
349 if (!tunnel->acpt_newsess) { in l2tp_session_register()
360 if (tunnel->version == L2TP_HDR_VER_3) { in l2tp_session_register()
361 pn = l2tp_pernet(tunnel->l2tp_net); in l2tp_session_register()
371 (session_walk->tunnel->encap == L2TP_ENCAPTYPE_IP || in l2tp_session_register()
372 tunnel->encap == L2TP_ENCAPTYPE_IP)) { in l2tp_session_register()
377 l2tp_tunnel_inc_refcount(tunnel); in l2tp_session_register()
382 l2tp_tunnel_inc_refcount(tunnel); in l2tp_session_register()
386 spin_unlock_bh(&tunnel->hlist_lock); in l2tp_session_register()
395 spin_unlock_bh(&tunnel->hlist_lock); in l2tp_session_register()
433 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_recv_dequeue_skb() local
441 atomic_long_inc(&tunnel->stats.rx_packets); in l2tp_recv_dequeue_skb()
442 atomic_long_add(length, &tunnel->stats.rx_bytes); in l2tp_recv_dequeue_skb()
591 * | Tunnel ID | Session ID |
608 * | Tunnel Payload ...
644 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_recv_common() local
651 tunnel->name, tunnel->tunnel_id, in l2tp_recv_common()
667 if (tunnel->version == L2TP_HDR_VER_2) { in l2tp_recv_common()
696 l2tp_session_set_header_len(session, tunnel->version); in l2tp_recv_common()
717 l2tp_session_set_header_len(session, tunnel->version); in l2tp_recv_common()
729 if (tunnel->version == L2TP_HDR_VER_2) { in l2tp_recv_common()
794 static int l2tp_udp_recv_core(struct l2tp_tunnel *tunnel, struct sk_buff *skb) in l2tp_udp_recv_core() argument
811 tunnel->name, skb->len); in l2tp_udp_recv_core()
824 if (version != tunnel->version) { in l2tp_udp_recv_core()
826 tunnel->name, version, tunnel->version); in l2tp_udp_recv_core()
840 if (tunnel->version == L2TP_HDR_VER_2) { in l2tp_udp_recv_core()
845 /* Extract tunnel and session ID */ in l2tp_udp_recv_core()
852 tunnel_id = tunnel->tunnel_id; in l2tp_udp_recv_core()
858 session = l2tp_tunnel_get_session(tunnel, session_id); in l2tp_udp_recv_core()
865 tunnel->name, tunnel_id, session_id); in l2tp_udp_recv_core()
869 if (tunnel->version == L2TP_HDR_VER_3 && in l2tp_udp_recv_core()
881 atomic_long_inc(&tunnel->stats.rx_invalid); in l2tp_udp_recv_core()
898 struct l2tp_tunnel *tunnel; in l2tp_udp_encap_recv() local
903 * tunnel data structure rather the usual l2tp_sk_to_tunnel in l2tp_udp_encap_recv()
906 tunnel = rcu_dereference_sk_user_data(sk); in l2tp_udp_encap_recv()
907 if (!tunnel) in l2tp_udp_encap_recv()
909 if (WARN_ON(tunnel->magic != L2TP_TUNNEL_MAGIC)) in l2tp_udp_encap_recv()
912 if (l2tp_udp_recv_core(tunnel, skb)) in l2tp_udp_encap_recv()
930 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_build_l2tpv2_header() local
934 u32 tunnel_id = tunnel->peer_tunnel_id; in l2tp_build_l2tpv2_header()
957 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_build_l2tpv3_header() local
964 if (tunnel->encap == L2TP_ENCAPTYPE_UDP) { in l2tp_build_l2tpv3_header()
995 /* Queue the packet to IP for output: tunnel socket lock must be held */
996 static int l2tp_xmit_queue(struct l2tp_tunnel *tunnel, struct sk_buff *skb, struct flowi *fl) in l2tp_xmit_queue() argument
1003 if (l2tp_sk_is_v6(tunnel->sock)) in l2tp_xmit_queue()
1004 err = inet6_csk_xmit(tunnel->sock, skb, NULL); in l2tp_xmit_queue()
1007 err = ip_queue_xmit(tunnel->sock, skb, fl); in l2tp_xmit_queue()
1014 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_xmit_core() local
1016 struct sock *sk = tunnel->sock; in l2tp_xmit_core()
1026 uhlen = (tunnel->encap == L2TP_ENCAPTYPE_UDP) ? sizeof(*uh) : 0; in l2tp_xmit_core()
1034 if (tunnel->version == L2TP_HDR_VER_2) in l2tp_xmit_core()
1054 if (tunnel->fd >= 0 && sk->sk_state != TCP_ESTABLISHED) { in l2tp_xmit_core()
1066 switch (tunnel->encap) { in l2tp_xmit_core()
1093 ret = l2tp_xmit_queue(tunnel, skb, &inet->cork.fl); in l2tp_xmit_core()
1111 atomic_long_inc(&session->tunnel->stats.tx_packets); in l2tp_xmit_skb()
1112 atomic_long_add(len, &session->tunnel->stats.tx_bytes); in l2tp_xmit_skb()
1116 atomic_long_inc(&session->tunnel->stats.tx_errors); in l2tp_xmit_skb()
1127 /* Tunnel socket destruct hook.
1128 * The tunnel context is deleted only when all session sockets have been
1133 struct l2tp_tunnel *tunnel = l2tp_sk_to_tunnel(sk); in l2tp_tunnel_destruct() local
1135 if (!tunnel) in l2tp_tunnel_destruct()
1139 switch (tunnel->encap) { in l2tp_tunnel_destruct()
1150 /* Remove hooks into tunnel socket */ in l2tp_tunnel_destruct()
1152 sk->sk_destruct = tunnel->old_sk_destruct; in l2tp_tunnel_destruct()
1160 kfree_rcu(tunnel, rcu); in l2tp_tunnel_destruct()
1168 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_session_unhash() local
1171 if (tunnel) { in l2tp_session_unhash()
1172 /* Remove from the per-tunnel hash */ in l2tp_session_unhash()
1173 spin_lock_bh(&tunnel->hlist_lock); in l2tp_session_unhash()
1175 spin_unlock_bh(&tunnel->hlist_lock); in l2tp_session_unhash()
1178 if (tunnel->version != L2TP_HDR_VER_2) { in l2tp_session_unhash()
1179 struct l2tp_net *pn = l2tp_pernet(tunnel->l2tp_net); in l2tp_session_unhash()
1190 /* When the tunnel is closed, all the attached sessions need to go too.
1192 static void l2tp_tunnel_closeall(struct l2tp_tunnel *tunnel) in l2tp_tunnel_closeall() argument
1197 spin_lock_bh(&tunnel->hlist_lock); in l2tp_tunnel_closeall()
1198 tunnel->acpt_newsess = false; in l2tp_tunnel_closeall()
1201 hlist_for_each_entry_rcu(session, &tunnel->session_hlist[hash], hlist) { in l2tp_tunnel_closeall()
1204 spin_unlock_bh(&tunnel->hlist_lock); in l2tp_tunnel_closeall()
1206 spin_lock_bh(&tunnel->hlist_lock); in l2tp_tunnel_closeall()
1216 spin_unlock_bh(&tunnel->hlist_lock); in l2tp_tunnel_closeall()
1219 /* Tunnel socket destroy hook for UDP encapsulation */
1222 struct l2tp_tunnel *tunnel = l2tp_sk_to_tunnel(sk); in l2tp_udp_encap_destroy() local
1224 if (tunnel) in l2tp_udp_encap_destroy()
1225 l2tp_tunnel_delete(tunnel); in l2tp_udp_encap_destroy()
1228 static void l2tp_tunnel_remove(struct net *net, struct l2tp_tunnel *tunnel) in l2tp_tunnel_remove() argument
1233 idr_remove(&pn->l2tp_tunnel_idr, tunnel->tunnel_id); in l2tp_tunnel_remove()
1237 /* Workqueue tunnel deletion function */
1240 struct l2tp_tunnel *tunnel = container_of(work, struct l2tp_tunnel, in l2tp_tunnel_del_work() local
1242 struct sock *sk = tunnel->sock; in l2tp_tunnel_del_work()
1245 l2tp_tunnel_closeall(tunnel); in l2tp_tunnel_del_work()
1247 /* If the tunnel socket was created within the kernel, use in l2tp_tunnel_del_work()
1250 if (tunnel->fd < 0) { in l2tp_tunnel_del_work()
1257 l2tp_tunnel_remove(tunnel->l2tp_net, tunnel); in l2tp_tunnel_del_work()
1259 l2tp_tunnel_dec_refcount(tunnel); in l2tp_tunnel_del_work()
1262 l2tp_tunnel_dec_refcount(tunnel); in l2tp_tunnel_del_work()
1265 /* Create a socket for the tunnel, if one isn't set up by
1391 struct l2tp_tunnel *tunnel = NULL; in l2tp_tunnel_create() local
1398 tunnel = kzalloc(sizeof(*tunnel), GFP_KERNEL); in l2tp_tunnel_create()
1399 if (!tunnel) { in l2tp_tunnel_create()
1404 tunnel->version = version; in l2tp_tunnel_create()
1405 tunnel->tunnel_id = tunnel_id; in l2tp_tunnel_create()
1406 tunnel->peer_tunnel_id = peer_tunnel_id; in l2tp_tunnel_create()
1408 tunnel->magic = L2TP_TUNNEL_MAGIC; in l2tp_tunnel_create()
1409 sprintf(&tunnel->name[0], "tunl %u", tunnel_id); in l2tp_tunnel_create()
1410 spin_lock_init(&tunnel->hlist_lock); in l2tp_tunnel_create()
1411 tunnel->acpt_newsess = true; in l2tp_tunnel_create()
1413 tunnel->encap = encap; in l2tp_tunnel_create()
1415 refcount_set(&tunnel->ref_count, 1); in l2tp_tunnel_create()
1416 tunnel->fd = fd; in l2tp_tunnel_create()
1419 INIT_WORK(&tunnel->del_work, l2tp_tunnel_del_work); in l2tp_tunnel_create()
1421 INIT_LIST_HEAD(&tunnel->list); in l2tp_tunnel_create()
1426 *tunnelp = tunnel; in l2tp_tunnel_create()
1454 int l2tp_tunnel_register(struct l2tp_tunnel *tunnel, struct net *net, in l2tp_tunnel_register() argument
1458 u32 tunnel_id = tunnel->tunnel_id; in l2tp_tunnel_register()
1470 if (tunnel->fd < 0) { in l2tp_tunnel_register()
1471 ret = l2tp_tunnel_sock_create(net, tunnel->tunnel_id, in l2tp_tunnel_register()
1472 tunnel->peer_tunnel_id, cfg, in l2tp_tunnel_register()
1477 sock = sockfd_lookup(tunnel->fd, &ret); in l2tp_tunnel_register()
1485 ret = l2tp_validate_socket(sk, net, tunnel->encap); in l2tp_tunnel_register()
1488 rcu_assign_sk_user_data(sk, tunnel); in l2tp_tunnel_register()
1491 if (tunnel->encap == L2TP_ENCAPTYPE_UDP) { in l2tp_tunnel_register()
1493 .sk_user_data = tunnel, in l2tp_tunnel_register()
1502 tunnel->old_sk_destruct = sk->sk_destruct; in l2tp_tunnel_register()
1508 tunnel->sock = sk; in l2tp_tunnel_register()
1509 tunnel->l2tp_net = net; in l2tp_tunnel_register()
1512 idr_replace(&pn->l2tp_tunnel_idr, tunnel, tunnel->tunnel_id); in l2tp_tunnel_register()
1515 trace_register_tunnel(tunnel); in l2tp_tunnel_register()
1517 if (tunnel->fd >= 0) in l2tp_tunnel_register()
1526 if (tunnel->fd < 0) in l2tp_tunnel_register()
1531 l2tp_tunnel_remove(net, tunnel); in l2tp_tunnel_register()
1538 void l2tp_tunnel_delete(struct l2tp_tunnel *tunnel) in l2tp_tunnel_delete() argument
1540 if (!test_and_set_bit(0, &tunnel->dead)) { in l2tp_tunnel_delete()
1541 trace_delete_tunnel(tunnel); in l2tp_tunnel_delete()
1542 l2tp_tunnel_inc_refcount(tunnel); in l2tp_tunnel_delete()
1543 queue_work(l2tp_wq, &tunnel->del_work); in l2tp_tunnel_delete()
1575 if (session->tunnel->encap == L2TP_ENCAPTYPE_UDP) in l2tp_session_set_header_len()
1581 struct l2tp_session *l2tp_session_create(int priv_size, struct l2tp_tunnel *tunnel, u32 session_id, in l2tp_session_create() argument
1589 session->tunnel = tunnel; in l2tp_session_create()
1594 if (tunnel->version == L2TP_HDR_VER_2) in l2tp_session_create()
1605 tunnel->tunnel_id, session->session_id); in l2tp_session_create()
1625 l2tp_session_set_header_len(session, tunnel->version); in l2tp_session_create()
1659 struct l2tp_tunnel *tunnel = NULL; in l2tp_exit_net() local
1664 idr_for_each_entry_ul(&pn->l2tp_tunnel_idr, tunnel, tmp, tunnel_id) { in l2tp_exit_net()
1665 if (tunnel) in l2tp_exit_net()
1666 l2tp_tunnel_delete(tunnel); in l2tp_exit_net()