Lines Matching refs: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()
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()
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()
253 read_lock_bh(&tunnel->hlist_lock); in l2tp_tunnel_get_session()
257 read_unlock_bh(&tunnel->hlist_lock); in l2tp_tunnel_get_session()
261 read_unlock_bh(&tunnel->hlist_lock); 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
294 read_lock_bh(&tunnel->hlist_lock); in l2tp_session_get_nth()
296 hlist_for_each_entry(session, &tunnel->session_hlist[hash], hlist) { in l2tp_session_get_nth()
299 read_unlock_bh(&tunnel->hlist_lock); in l2tp_session_get_nth()
305 read_unlock_bh(&tunnel->hlist_lock); 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 write_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 write_unlock_bh(&tunnel->hlist_lock); in l2tp_session_register()
397 write_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()
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()
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()
895 struct l2tp_tunnel *tunnel; in l2tp_udp_encap_recv() local
903 tunnel = rcu_dereference_sk_user_data(sk); in l2tp_udp_encap_recv()
904 if (!tunnel) in l2tp_udp_encap_recv()
906 if (WARN_ON(tunnel->magic != L2TP_TUNNEL_MAGIC)) in l2tp_udp_encap_recv()
909 if (l2tp_udp_recv_core(tunnel, skb)) in l2tp_udp_encap_recv()
927 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_build_l2tpv2_header() local
931 u32 tunnel_id = tunnel->peer_tunnel_id; in l2tp_build_l2tpv2_header()
954 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_build_l2tpv3_header() local
961 if (tunnel->encap == L2TP_ENCAPTYPE_UDP) { in l2tp_build_l2tpv3_header()
993 static int l2tp_xmit_queue(struct l2tp_tunnel *tunnel, struct sk_buff *skb, struct flowi *fl) in l2tp_xmit_queue() argument
1000 if (l2tp_sk_is_v6(tunnel->sock)) in l2tp_xmit_queue()
1001 err = inet6_csk_xmit(tunnel->sock, skb, NULL); in l2tp_xmit_queue()
1004 err = ip_queue_xmit(tunnel->sock, skb, fl); in l2tp_xmit_queue()
1011 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_xmit_core() local
1013 struct sock *sk = tunnel->sock; in l2tp_xmit_core()
1023 uhlen = (tunnel->encap == L2TP_ENCAPTYPE_UDP) ? sizeof(*uh) : 0; in l2tp_xmit_core()
1031 if (tunnel->version == L2TP_HDR_VER_2) in l2tp_xmit_core()
1051 if (tunnel->fd >= 0 && sk->sk_state != TCP_ESTABLISHED) { in l2tp_xmit_core()
1063 switch (tunnel->encap) { in l2tp_xmit_core()
1090 ret = l2tp_xmit_queue(tunnel, skb, &inet->cork.fl); in l2tp_xmit_core()
1108 atomic_long_inc(&session->tunnel->stats.tx_packets); in l2tp_xmit_skb()
1109 atomic_long_add(len, &session->tunnel->stats.tx_bytes); in l2tp_xmit_skb()
1113 atomic_long_inc(&session->tunnel->stats.tx_errors); in l2tp_xmit_skb()
1130 struct l2tp_tunnel *tunnel = l2tp_sk_to_tunnel(sk); in l2tp_tunnel_destruct() local
1132 if (!tunnel) in l2tp_tunnel_destruct()
1136 switch (tunnel->encap) { in l2tp_tunnel_destruct()
1148 sk->sk_destruct = tunnel->old_sk_destruct; in l2tp_tunnel_destruct()
1155 kfree_rcu(tunnel, rcu); in l2tp_tunnel_destruct()
1163 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_session_unhash() local
1166 if (tunnel) { in l2tp_session_unhash()
1168 write_lock_bh(&tunnel->hlist_lock); in l2tp_session_unhash()
1170 write_unlock_bh(&tunnel->hlist_lock); in l2tp_session_unhash()
1173 if (tunnel->version != L2TP_HDR_VER_2) { in l2tp_session_unhash()
1174 struct l2tp_net *pn = l2tp_pernet(tunnel->l2tp_net); in l2tp_session_unhash()
1186 static void l2tp_tunnel_closeall(struct l2tp_tunnel *tunnel) in l2tp_tunnel_closeall() argument
1193 write_lock_bh(&tunnel->hlist_lock); in l2tp_tunnel_closeall()
1194 tunnel->acpt_newsess = false; in l2tp_tunnel_closeall()
1197 hlist_for_each_safe(walk, tmp, &tunnel->session_hlist[hash]) { in l2tp_tunnel_closeall()
1201 write_unlock_bh(&tunnel->hlist_lock); in l2tp_tunnel_closeall()
1203 write_lock_bh(&tunnel->hlist_lock); in l2tp_tunnel_closeall()
1213 write_unlock_bh(&tunnel->hlist_lock); in l2tp_tunnel_closeall()
1219 struct l2tp_tunnel *tunnel = l2tp_sk_to_tunnel(sk); in l2tp_udp_encap_destroy() local
1221 if (tunnel) in l2tp_udp_encap_destroy()
1222 l2tp_tunnel_delete(tunnel); in l2tp_udp_encap_destroy()
1228 struct l2tp_tunnel *tunnel = container_of(work, struct l2tp_tunnel, in l2tp_tunnel_del_work() local
1230 struct sock *sk = tunnel->sock; in l2tp_tunnel_del_work()
1234 l2tp_tunnel_closeall(tunnel); in l2tp_tunnel_del_work()
1239 if (tunnel->fd < 0) { in l2tp_tunnel_del_work()
1247 pn = l2tp_pernet(tunnel->l2tp_net); in l2tp_tunnel_del_work()
1249 list_del_rcu(&tunnel->list); in l2tp_tunnel_del_work()
1253 l2tp_tunnel_dec_refcount(tunnel); in l2tp_tunnel_del_work()
1256 l2tp_tunnel_dec_refcount(tunnel); in l2tp_tunnel_del_work()
1387 struct l2tp_tunnel *tunnel = NULL; in l2tp_tunnel_create() local
1394 tunnel = kzalloc(sizeof(*tunnel), GFP_KERNEL); in l2tp_tunnel_create()
1395 if (!tunnel) { in l2tp_tunnel_create()
1400 tunnel->version = version; in l2tp_tunnel_create()
1401 tunnel->tunnel_id = tunnel_id; in l2tp_tunnel_create()
1402 tunnel->peer_tunnel_id = peer_tunnel_id; in l2tp_tunnel_create()
1404 tunnel->magic = L2TP_TUNNEL_MAGIC; in l2tp_tunnel_create()
1405 sprintf(&tunnel->name[0], "tunl %u", tunnel_id); in l2tp_tunnel_create()
1406 rwlock_init(&tunnel->hlist_lock); in l2tp_tunnel_create()
1407 tunnel->acpt_newsess = true; in l2tp_tunnel_create()
1409 tunnel->encap = encap; in l2tp_tunnel_create()
1411 refcount_set(&tunnel->ref_count, 1); in l2tp_tunnel_create()
1412 tunnel->fd = fd; in l2tp_tunnel_create()
1415 INIT_WORK(&tunnel->del_work, l2tp_tunnel_del_work); in l2tp_tunnel_create()
1417 INIT_LIST_HEAD(&tunnel->list); in l2tp_tunnel_create()
1422 *tunnelp = tunnel; in l2tp_tunnel_create()
1450 int l2tp_tunnel_register(struct l2tp_tunnel *tunnel, struct net *net, in l2tp_tunnel_register() argument
1459 if (tunnel->fd < 0) { in l2tp_tunnel_register()
1460 ret = l2tp_tunnel_sock_create(net, tunnel->tunnel_id, in l2tp_tunnel_register()
1461 tunnel->peer_tunnel_id, cfg, in l2tp_tunnel_register()
1466 sock = sockfd_lookup(tunnel->fd, &ret); in l2tp_tunnel_register()
1470 ret = l2tp_validate_socket(sock->sk, net, tunnel->encap); in l2tp_tunnel_register()
1475 tunnel->l2tp_net = net; in l2tp_tunnel_register()
1480 if (tunnel_walk->tunnel_id == tunnel->tunnel_id) { in l2tp_tunnel_register()
1487 list_add_rcu(&tunnel->list, &pn->l2tp_tunnel_list); in l2tp_tunnel_register()
1492 tunnel->sock = sk; in l2tp_tunnel_register()
1494 if (tunnel->encap == L2TP_ENCAPTYPE_UDP) { in l2tp_tunnel_register()
1496 .sk_user_data = tunnel, in l2tp_tunnel_register()
1504 sk->sk_user_data = tunnel; in l2tp_tunnel_register()
1507 tunnel->old_sk_destruct = sk->sk_destruct; in l2tp_tunnel_register()
1513 trace_register_tunnel(tunnel); in l2tp_tunnel_register()
1515 if (tunnel->fd >= 0) in l2tp_tunnel_register()
1521 if (tunnel->fd < 0) in l2tp_tunnel_register()
1532 void l2tp_tunnel_delete(struct l2tp_tunnel *tunnel) in l2tp_tunnel_delete() argument
1534 if (!test_and_set_bit(0, &tunnel->dead)) { in l2tp_tunnel_delete()
1535 trace_delete_tunnel(tunnel); in l2tp_tunnel_delete()
1536 l2tp_tunnel_inc_refcount(tunnel); in l2tp_tunnel_delete()
1537 queue_work(l2tp_wq, &tunnel->del_work); in l2tp_tunnel_delete()
1569 if (session->tunnel->encap == L2TP_ENCAPTYPE_UDP) in l2tp_session_set_header_len()
1575 struct l2tp_session *l2tp_session_create(int priv_size, struct l2tp_tunnel *tunnel, u32 session_id, in l2tp_session_create() argument
1583 session->tunnel = tunnel; in l2tp_session_create()
1588 if (tunnel->version == L2TP_HDR_VER_2) in l2tp_session_create()
1599 tunnel->tunnel_id, session->session_id); in l2tp_session_create()
1619 l2tp_session_set_header_len(session, tunnel->version); in l2tp_session_create()
1653 struct l2tp_tunnel *tunnel = NULL; in l2tp_exit_net() local
1657 list_for_each_entry_rcu(tunnel, &pn->l2tp_tunnel_list, list) { in l2tp_exit_net()
1658 l2tp_tunnel_delete(tunnel); in l2tp_exit_net()