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 list_for_each_entry_rcu(tunnel, &pn->l2tp_tunnel_list, list) { in l2tp_tunnel_get()
212 if (tunnel->tunnel_id == tunnel_id && in l2tp_tunnel_get()
213 refcount_inc_not_zero(&tunnel->ref_count)) { in l2tp_tunnel_get()
216 return tunnel; in l2tp_tunnel_get()
228 struct l2tp_tunnel *tunnel; in l2tp_tunnel_get_nth() local
232 list_for_each_entry_rcu(tunnel, &pn->l2tp_tunnel_list, list) { in l2tp_tunnel_get_nth()
234 refcount_inc_not_zero(&tunnel->ref_count)) { in l2tp_tunnel_get_nth()
236 return tunnel; in l2tp_tunnel_get_nth()
245 struct l2tp_session *l2tp_tunnel_get_session(struct l2tp_tunnel *tunnel, in l2tp_tunnel_get_session() argument
251 session_list = l2tp_session_id_hash(tunnel, session_id); in l2tp_tunnel_get_session()
288 struct l2tp_session *l2tp_session_get_nth(struct l2tp_tunnel *tunnel, int nth) in l2tp_session_get_nth() argument
296 hlist_for_each_entry_rcu(session, &tunnel->session_hlist[hash], hlist) { in l2tp_session_get_nth()
340 struct l2tp_tunnel *tunnel) in l2tp_session_register() argument
348 head = l2tp_session_id_hash(tunnel, session->session_id); in l2tp_session_register()
350 spin_lock_bh(&tunnel->hlist_lock); in l2tp_session_register()
351 if (!tunnel->acpt_newsess) { in l2tp_session_register()
362 if (tunnel->version == L2TP_HDR_VER_3) { in l2tp_session_register()
363 pn = l2tp_pernet(tunnel->l2tp_net); in l2tp_session_register()
373 (session_walk->tunnel->encap == L2TP_ENCAPTYPE_IP || in l2tp_session_register()
374 tunnel->encap == L2TP_ENCAPTYPE_IP)) { in l2tp_session_register()
379 l2tp_tunnel_inc_refcount(tunnel); in l2tp_session_register()
384 l2tp_tunnel_inc_refcount(tunnel); in l2tp_session_register()
388 spin_unlock_bh(&tunnel->hlist_lock); in l2tp_session_register()
397 spin_unlock_bh(&tunnel->hlist_lock); in l2tp_session_register()
435 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_recv_dequeue_skb() local
443 atomic_long_inc(&tunnel->stats.rx_packets); in l2tp_recv_dequeue_skb()
444 atomic_long_add(length, &tunnel->stats.rx_bytes); in l2tp_recv_dequeue_skb()
593 * | Tunnel ID | Session ID |
610 * | Tunnel Payload ...
646 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_recv_common() local
653 tunnel->name, tunnel->tunnel_id, in l2tp_recv_common()
669 if (tunnel->version == L2TP_HDR_VER_2) { in l2tp_recv_common()
698 l2tp_session_set_header_len(session, tunnel->version); in l2tp_recv_common()
719 l2tp_session_set_header_len(session, tunnel->version); in l2tp_recv_common()
731 if (tunnel->version == L2TP_HDR_VER_2) { in l2tp_recv_common()
796 static int l2tp_udp_recv_core(struct l2tp_tunnel *tunnel, struct sk_buff *skb) in l2tp_udp_recv_core() argument
813 tunnel->name, skb->len); in l2tp_udp_recv_core()
826 if (version != tunnel->version) { in l2tp_udp_recv_core()
828 tunnel->name, version, tunnel->version); in l2tp_udp_recv_core()
842 if (tunnel->version == L2TP_HDR_VER_2) { in l2tp_udp_recv_core()
847 /* Extract tunnel and session ID */ in l2tp_udp_recv_core()
854 tunnel_id = tunnel->tunnel_id; in l2tp_udp_recv_core()
860 session = l2tp_tunnel_get_session(tunnel, session_id); in l2tp_udp_recv_core()
867 tunnel->name, tunnel_id, session_id); in l2tp_udp_recv_core()
871 if (tunnel->version == L2TP_HDR_VER_3 && in l2tp_udp_recv_core()
883 atomic_long_inc(&tunnel->stats.rx_invalid); in l2tp_udp_recv_core()
900 struct l2tp_tunnel *tunnel; in l2tp_udp_encap_recv() local
905 * tunnel data structure rather the usual l2tp_sk_to_tunnel in l2tp_udp_encap_recv()
908 tunnel = rcu_dereference_sk_user_data(sk); in l2tp_udp_encap_recv()
909 if (!tunnel) in l2tp_udp_encap_recv()
911 if (WARN_ON(tunnel->magic != L2TP_TUNNEL_MAGIC)) in l2tp_udp_encap_recv()
914 if (l2tp_udp_recv_core(tunnel, skb)) in l2tp_udp_encap_recv()
932 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_build_l2tpv2_header() local
936 u32 tunnel_id = tunnel->peer_tunnel_id; in l2tp_build_l2tpv2_header()
959 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_build_l2tpv3_header() local
966 if (tunnel->encap == L2TP_ENCAPTYPE_UDP) { in l2tp_build_l2tpv3_header()
997 /* Queue the packet to IP for output: tunnel socket lock must be held */
998 static int l2tp_xmit_queue(struct l2tp_tunnel *tunnel, struct sk_buff *skb, struct flowi *fl) in l2tp_xmit_queue() argument
1005 if (l2tp_sk_is_v6(tunnel->sock)) in l2tp_xmit_queue()
1006 err = inet6_csk_xmit(tunnel->sock, skb, NULL); in l2tp_xmit_queue()
1009 err = ip_queue_xmit(tunnel->sock, skb, fl); in l2tp_xmit_queue()
1016 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_xmit_core() local
1018 struct sock *sk = tunnel->sock; in l2tp_xmit_core()
1028 uhlen = (tunnel->encap == L2TP_ENCAPTYPE_UDP) ? sizeof(*uh) : 0; in l2tp_xmit_core()
1036 if (tunnel->version == L2TP_HDR_VER_2) in l2tp_xmit_core()
1056 if (tunnel->fd >= 0 && sk->sk_state != TCP_ESTABLISHED) { in l2tp_xmit_core()
1068 switch (tunnel->encap) { in l2tp_xmit_core()
1095 ret = l2tp_xmit_queue(tunnel, skb, &inet->cork.fl); in l2tp_xmit_core()
1113 atomic_long_inc(&session->tunnel->stats.tx_packets); in l2tp_xmit_skb()
1114 atomic_long_add(len, &session->tunnel->stats.tx_bytes); in l2tp_xmit_skb()
1118 atomic_long_inc(&session->tunnel->stats.tx_errors); in l2tp_xmit_skb()
1129 /* Tunnel socket destruct hook.
1130 * The tunnel context is deleted only when all session sockets have been
1135 struct l2tp_tunnel *tunnel = l2tp_sk_to_tunnel(sk); in l2tp_tunnel_destruct() local
1137 if (!tunnel) in l2tp_tunnel_destruct()
1141 switch (tunnel->encap) { in l2tp_tunnel_destruct()
1152 /* Remove hooks into tunnel socket */ in l2tp_tunnel_destruct()
1154 sk->sk_destruct = tunnel->old_sk_destruct; in l2tp_tunnel_destruct()
1162 kfree_rcu(tunnel, rcu); in l2tp_tunnel_destruct()
1170 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_session_unhash() local
1173 if (tunnel) { in l2tp_session_unhash()
1174 /* Remove from the per-tunnel hash */ in l2tp_session_unhash()
1175 spin_lock_bh(&tunnel->hlist_lock); in l2tp_session_unhash()
1177 spin_unlock_bh(&tunnel->hlist_lock); in l2tp_session_unhash()
1180 if (tunnel->version != L2TP_HDR_VER_2) { in l2tp_session_unhash()
1181 struct l2tp_net *pn = l2tp_pernet(tunnel->l2tp_net); in l2tp_session_unhash()
1192 /* When the tunnel is closed, all the attached sessions need to go too.
1194 static void l2tp_tunnel_closeall(struct l2tp_tunnel *tunnel) in l2tp_tunnel_closeall() argument
1199 spin_lock_bh(&tunnel->hlist_lock); in l2tp_tunnel_closeall()
1200 tunnel->acpt_newsess = false; in l2tp_tunnel_closeall()
1203 hlist_for_each_entry_rcu(session, &tunnel->session_hlist[hash], hlist) { in l2tp_tunnel_closeall()
1206 spin_unlock_bh(&tunnel->hlist_lock); in l2tp_tunnel_closeall()
1208 spin_lock_bh(&tunnel->hlist_lock); in l2tp_tunnel_closeall()
1218 spin_unlock_bh(&tunnel->hlist_lock); in l2tp_tunnel_closeall()
1221 /* Tunnel socket destroy hook for UDP encapsulation */
1224 struct l2tp_tunnel *tunnel = l2tp_sk_to_tunnel(sk); in l2tp_udp_encap_destroy() local
1226 if (tunnel) in l2tp_udp_encap_destroy()
1227 l2tp_tunnel_delete(tunnel); in l2tp_udp_encap_destroy()
1230 /* Workqueue tunnel deletion function */
1233 struct l2tp_tunnel *tunnel = container_of(work, struct l2tp_tunnel, in l2tp_tunnel_del_work() local
1235 struct sock *sk = tunnel->sock; in l2tp_tunnel_del_work()
1239 l2tp_tunnel_closeall(tunnel); in l2tp_tunnel_del_work()
1241 /* If the tunnel socket was created within the kernel, use in l2tp_tunnel_del_work()
1244 if (tunnel->fd < 0) { in l2tp_tunnel_del_work()
1251 /* Remove the tunnel struct from the tunnel list */ in l2tp_tunnel_del_work()
1252 pn = l2tp_pernet(tunnel->l2tp_net); in l2tp_tunnel_del_work()
1254 list_del_rcu(&tunnel->list); in l2tp_tunnel_del_work()
1258 l2tp_tunnel_dec_refcount(tunnel); in l2tp_tunnel_del_work()
1261 l2tp_tunnel_dec_refcount(tunnel); in l2tp_tunnel_del_work()
1264 /* Create a socket for the tunnel, if one isn't set up by
1392 struct l2tp_tunnel *tunnel = NULL; in l2tp_tunnel_create() local
1399 tunnel = kzalloc(sizeof(*tunnel), GFP_KERNEL); in l2tp_tunnel_create()
1400 if (!tunnel) { in l2tp_tunnel_create()
1405 tunnel->version = version; in l2tp_tunnel_create()
1406 tunnel->tunnel_id = tunnel_id; in l2tp_tunnel_create()
1407 tunnel->peer_tunnel_id = peer_tunnel_id; in l2tp_tunnel_create()
1409 tunnel->magic = L2TP_TUNNEL_MAGIC; in l2tp_tunnel_create()
1410 sprintf(&tunnel->name[0], "tunl %u", tunnel_id); in l2tp_tunnel_create()
1411 spin_lock_init(&tunnel->hlist_lock); in l2tp_tunnel_create()
1412 tunnel->acpt_newsess = true; in l2tp_tunnel_create()
1414 tunnel->encap = encap; in l2tp_tunnel_create()
1416 refcount_set(&tunnel->ref_count, 1); in l2tp_tunnel_create()
1417 tunnel->fd = fd; in l2tp_tunnel_create()
1420 INIT_WORK(&tunnel->del_work, l2tp_tunnel_del_work); in l2tp_tunnel_create()
1422 INIT_LIST_HEAD(&tunnel->list); in l2tp_tunnel_create()
1427 *tunnelp = tunnel; in l2tp_tunnel_create()
1455 int l2tp_tunnel_register(struct l2tp_tunnel *tunnel, struct net *net, in l2tp_tunnel_register() argument
1464 if (tunnel->fd < 0) { in l2tp_tunnel_register()
1465 ret = l2tp_tunnel_sock_create(net, tunnel->tunnel_id, in l2tp_tunnel_register()
1466 tunnel->peer_tunnel_id, cfg, in l2tp_tunnel_register()
1471 sock = sockfd_lookup(tunnel->fd, &ret); in l2tp_tunnel_register()
1478 ret = l2tp_validate_socket(sk, net, tunnel->encap); in l2tp_tunnel_register()
1481 rcu_assign_sk_user_data(sk, tunnel); in l2tp_tunnel_register()
1484 tunnel->l2tp_net = net; in l2tp_tunnel_register()
1488 tunnel->sock = sk; in l2tp_tunnel_register()
1492 if (tunnel_walk->tunnel_id == tunnel->tunnel_id) { in l2tp_tunnel_register()
1499 list_add_rcu(&tunnel->list, &pn->l2tp_tunnel_list); in l2tp_tunnel_register()
1502 if (tunnel->encap == L2TP_ENCAPTYPE_UDP) { in l2tp_tunnel_register()
1504 .sk_user_data = tunnel, in l2tp_tunnel_register()
1513 tunnel->old_sk_destruct = sk->sk_destruct; in l2tp_tunnel_register()
1519 trace_register_tunnel(tunnel); in l2tp_tunnel_register()
1521 if (tunnel->fd >= 0) in l2tp_tunnel_register()
1532 if (tunnel->fd < 0) in l2tp_tunnel_register()
1543 void l2tp_tunnel_delete(struct l2tp_tunnel *tunnel) in l2tp_tunnel_delete() argument
1545 if (!test_and_set_bit(0, &tunnel->dead)) { in l2tp_tunnel_delete()
1546 trace_delete_tunnel(tunnel); in l2tp_tunnel_delete()
1547 l2tp_tunnel_inc_refcount(tunnel); in l2tp_tunnel_delete()
1548 queue_work(l2tp_wq, &tunnel->del_work); in l2tp_tunnel_delete()
1580 if (session->tunnel->encap == L2TP_ENCAPTYPE_UDP) in l2tp_session_set_header_len()
1586 struct l2tp_session *l2tp_session_create(int priv_size, struct l2tp_tunnel *tunnel, u32 session_id, in l2tp_session_create() argument
1594 session->tunnel = tunnel; in l2tp_session_create()
1599 if (tunnel->version == L2TP_HDR_VER_2) in l2tp_session_create()
1610 tunnel->tunnel_id, session->session_id); in l2tp_session_create()
1630 l2tp_session_set_header_len(session, tunnel->version); in l2tp_session_create()
1664 struct l2tp_tunnel *tunnel = NULL; in l2tp_exit_net() local
1668 list_for_each_entry_rcu(tunnel, &pn->l2tp_tunnel_list, list) { in l2tp_exit_net()
1669 l2tp_tunnel_delete(tunnel); in l2tp_exit_net()