Lines Matching refs:tunnel
153 l2tp_session_id_hash(struct l2tp_tunnel *tunnel, u32 session_id) in l2tp_session_id_hash() argument
155 return &tunnel->session_hlist[hash_32(session_id, L2TP_HASH_BITS)]; in l2tp_session_id_hash()
158 void l2tp_tunnel_free(struct l2tp_tunnel *tunnel) in l2tp_tunnel_free() argument
160 sock_put(tunnel->sock); in l2tp_tunnel_free()
169 struct l2tp_tunnel *tunnel; in l2tp_tunnel_get() local
172 list_for_each_entry_rcu(tunnel, &pn->l2tp_tunnel_list, list) { in l2tp_tunnel_get()
173 if (tunnel->tunnel_id == tunnel_id) { in l2tp_tunnel_get()
174 l2tp_tunnel_inc_refcount(tunnel); in l2tp_tunnel_get()
177 return tunnel; in l2tp_tunnel_get()
189 struct l2tp_tunnel *tunnel; in l2tp_tunnel_get_nth() local
193 list_for_each_entry_rcu(tunnel, &pn->l2tp_tunnel_list, list) { in l2tp_tunnel_get_nth()
195 l2tp_tunnel_inc_refcount(tunnel); in l2tp_tunnel_get_nth()
197 return tunnel; in l2tp_tunnel_get_nth()
206 struct l2tp_session *l2tp_tunnel_get_session(struct l2tp_tunnel *tunnel, in l2tp_tunnel_get_session() argument
212 session_list = l2tp_session_id_hash(tunnel, session_id); in l2tp_tunnel_get_session()
214 read_lock_bh(&tunnel->hlist_lock); in l2tp_tunnel_get_session()
218 read_unlock_bh(&tunnel->hlist_lock); in l2tp_tunnel_get_session()
222 read_unlock_bh(&tunnel->hlist_lock); in l2tp_tunnel_get_session()
249 struct l2tp_session *l2tp_session_get_nth(struct l2tp_tunnel *tunnel, int nth) in l2tp_session_get_nth() argument
255 read_lock_bh(&tunnel->hlist_lock); in l2tp_session_get_nth()
257 hlist_for_each_entry(session, &tunnel->session_hlist[hash], hlist) { in l2tp_session_get_nth()
260 read_unlock_bh(&tunnel->hlist_lock); in l2tp_session_get_nth()
266 read_unlock_bh(&tunnel->hlist_lock); in l2tp_session_get_nth()
301 struct l2tp_tunnel *tunnel) in l2tp_session_register() argument
309 head = l2tp_session_id_hash(tunnel, session->session_id); in l2tp_session_register()
311 write_lock_bh(&tunnel->hlist_lock); in l2tp_session_register()
312 if (!tunnel->acpt_newsess) { in l2tp_session_register()
323 if (tunnel->version == L2TP_HDR_VER_3) { in l2tp_session_register()
324 pn = l2tp_pernet(tunnel->l2tp_net); in l2tp_session_register()
335 l2tp_tunnel_inc_refcount(tunnel); in l2tp_session_register()
340 l2tp_tunnel_inc_refcount(tunnel); in l2tp_session_register()
344 write_unlock_bh(&tunnel->hlist_lock); in l2tp_session_register()
351 write_unlock_bh(&tunnel->hlist_lock); in l2tp_session_register()
393 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_recv_dequeue_skb() local
401 atomic_long_inc(&tunnel->stats.rx_packets); in l2tp_recv_dequeue_skb()
402 atomic_long_add(length, &tunnel->stats.rx_bytes); in l2tp_recv_dequeue_skb()
624 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_recv_common() local
631 l2tp_info(tunnel, L2TP_MSG_DATA, in l2tp_recv_common()
633 tunnel->name, tunnel->tunnel_id, in l2tp_recv_common()
650 if (tunnel->version == L2TP_HDR_VER_2) { in l2tp_recv_common()
692 l2tp_session_set_header_len(session, tunnel->version); in l2tp_recv_common()
716 l2tp_session_set_header_len(session, tunnel->version); in l2tp_recv_common()
729 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
812 l2tp_info(tunnel, L2TP_MSG_DATA, in l2tp_udp_recv_core()
814 tunnel->name, skb->len); in l2tp_udp_recv_core()
819 if (tunnel->debug & L2TP_MSG_DATA) { in l2tp_udp_recv_core()
824 pr_debug("%s: recv\n", tunnel->name); in l2tp_udp_recv_core()
836 if (version != tunnel->version) { in l2tp_udp_recv_core()
837 l2tp_info(tunnel, L2TP_MSG_DATA, in l2tp_udp_recv_core()
839 tunnel->name, version, tunnel->version); in l2tp_udp_recv_core()
848 l2tp_dbg(tunnel, L2TP_MSG_DATA, in l2tp_udp_recv_core()
850 tunnel->name, length); in l2tp_udp_recv_core()
857 if (tunnel->version == L2TP_HDR_VER_2) { in l2tp_udp_recv_core()
869 tunnel_id = tunnel->tunnel_id; in l2tp_udp_recv_core()
875 session = l2tp_tunnel_get_session(tunnel, session_id); in l2tp_udp_recv_core()
881 l2tp_info(tunnel, L2TP_MSG_DATA, in l2tp_udp_recv_core()
883 tunnel->name, tunnel_id, session_id); in l2tp_udp_recv_core()
907 struct l2tp_tunnel *tunnel; in l2tp_udp_encap_recv() local
909 tunnel = l2tp_tunnel(sk); in l2tp_udp_encap_recv()
910 if (tunnel == NULL) in l2tp_udp_encap_recv()
913 l2tp_dbg(tunnel, L2TP_MSG_DATA, "%s: received %d bytes\n", in l2tp_udp_encap_recv()
914 tunnel->name, skb->len); in l2tp_udp_encap_recv()
916 if (l2tp_udp_recv_core(tunnel, skb)) in l2tp_udp_encap_recv()
934 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_build_l2tpv2_header() local
938 u32 tunnel_id = tunnel->peer_tunnel_id; in l2tp_build_l2tpv2_header()
962 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_build_l2tpv3_header() local
969 if (tunnel->encap == L2TP_ENCAPTYPE_UDP) { in l2tp_build_l2tpv3_header()
1005 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_xmit_core() local
1018 int uhlen = (tunnel->encap == L2TP_ENCAPTYPE_UDP) ? sizeof(struct udphdr) : 0; in l2tp_xmit_core()
1029 if (l2tp_sk_is_v6(tunnel->sock)) in l2tp_xmit_core()
1030 error = inet6_csk_xmit(tunnel->sock, skb, NULL); in l2tp_xmit_core()
1033 error = ip_queue_xmit(tunnel->sock, skb, fl); in l2tp_xmit_core()
1037 atomic_long_inc(&tunnel->stats.tx_packets); in l2tp_xmit_core()
1038 atomic_long_add(len, &tunnel->stats.tx_bytes); in l2tp_xmit_core()
1042 atomic_long_inc(&tunnel->stats.tx_errors); in l2tp_xmit_core()
1053 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_xmit_skb() local
1054 struct sock *sk = tunnel->sock; in l2tp_xmit_skb()
1059 int uhlen = (tunnel->encap == L2TP_ENCAPTYPE_UDP) ? sizeof(struct udphdr) : 0; in l2tp_xmit_skb()
1093 if (tunnel->fd >= 0 && sk->sk_state != TCP_ESTABLISHED) { in l2tp_xmit_skb()
1105 switch (tunnel->encap) { in l2tp_xmit_skb()
1150 struct l2tp_tunnel *tunnel = l2tp_tunnel(sk); in l2tp_tunnel_destruct() local
1152 if (tunnel == NULL) in l2tp_tunnel_destruct()
1155 l2tp_info(tunnel, L2TP_MSG_CONTROL, "%s: closing...\n", tunnel->name); in l2tp_tunnel_destruct()
1158 switch (tunnel->encap) { in l2tp_tunnel_destruct()
1170 sk->sk_destruct = tunnel->old_sk_destruct; in l2tp_tunnel_destruct()
1177 kfree_rcu(tunnel, rcu); in l2tp_tunnel_destruct()
1184 static void l2tp_tunnel_closeall(struct l2tp_tunnel *tunnel) in l2tp_tunnel_closeall() argument
1191 BUG_ON(tunnel == NULL); in l2tp_tunnel_closeall()
1193 l2tp_info(tunnel, L2TP_MSG_CONTROL, "%s: closing all sessions...\n", in l2tp_tunnel_closeall()
1194 tunnel->name); in l2tp_tunnel_closeall()
1196 write_lock_bh(&tunnel->hlist_lock); in l2tp_tunnel_closeall()
1197 tunnel->acpt_newsess = false; in l2tp_tunnel_closeall()
1200 hlist_for_each_safe(walk, tmp, &tunnel->session_hlist[hash]) { in l2tp_tunnel_closeall()
1211 write_unlock_bh(&tunnel->hlist_lock); in l2tp_tunnel_closeall()
1221 write_lock_bh(&tunnel->hlist_lock); in l2tp_tunnel_closeall()
1231 write_unlock_bh(&tunnel->hlist_lock); in l2tp_tunnel_closeall()
1237 struct l2tp_tunnel *tunnel = l2tp_tunnel(sk); in l2tp_udp_encap_destroy() local
1239 if (tunnel) in l2tp_udp_encap_destroy()
1240 l2tp_tunnel_delete(tunnel); in l2tp_udp_encap_destroy()
1246 struct l2tp_tunnel *tunnel = container_of(work, struct l2tp_tunnel, in l2tp_tunnel_del_work() local
1248 struct sock *sk = tunnel->sock; in l2tp_tunnel_del_work()
1252 l2tp_tunnel_closeall(tunnel); in l2tp_tunnel_del_work()
1257 if (tunnel->fd < 0) { in l2tp_tunnel_del_work()
1265 pn = l2tp_pernet(tunnel->l2tp_net); in l2tp_tunnel_del_work()
1267 list_del_rcu(&tunnel->list); in l2tp_tunnel_del_work()
1271 l2tp_tunnel_dec_refcount(tunnel); in l2tp_tunnel_del_work()
1274 l2tp_tunnel_dec_refcount(tunnel); in l2tp_tunnel_del_work()
1404 struct l2tp_tunnel *tunnel = NULL; in l2tp_tunnel_create() local
1411 tunnel = kzalloc(sizeof(struct l2tp_tunnel), GFP_KERNEL); in l2tp_tunnel_create()
1412 if (tunnel == NULL) { in l2tp_tunnel_create()
1417 tunnel->version = version; in l2tp_tunnel_create()
1418 tunnel->tunnel_id = tunnel_id; in l2tp_tunnel_create()
1419 tunnel->peer_tunnel_id = peer_tunnel_id; in l2tp_tunnel_create()
1420 tunnel->debug = L2TP_DEFAULT_DEBUG_FLAGS; in l2tp_tunnel_create()
1422 tunnel->magic = L2TP_TUNNEL_MAGIC; in l2tp_tunnel_create()
1423 sprintf(&tunnel->name[0], "tunl %u", tunnel_id); in l2tp_tunnel_create()
1424 rwlock_init(&tunnel->hlist_lock); in l2tp_tunnel_create()
1425 tunnel->acpt_newsess = true; in l2tp_tunnel_create()
1428 tunnel->debug = cfg->debug; in l2tp_tunnel_create()
1430 tunnel->encap = encap; in l2tp_tunnel_create()
1432 refcount_set(&tunnel->ref_count, 1); in l2tp_tunnel_create()
1433 tunnel->fd = fd; in l2tp_tunnel_create()
1436 INIT_WORK(&tunnel->del_work, l2tp_tunnel_del_work); in l2tp_tunnel_create()
1438 INIT_LIST_HEAD(&tunnel->list); in l2tp_tunnel_create()
1443 *tunnelp = tunnel; in l2tp_tunnel_create()
1468 int l2tp_tunnel_register(struct l2tp_tunnel *tunnel, struct net *net, in l2tp_tunnel_register() argument
1477 if (tunnel->fd < 0) { in l2tp_tunnel_register()
1478 ret = l2tp_tunnel_sock_create(net, tunnel->tunnel_id, in l2tp_tunnel_register()
1479 tunnel->peer_tunnel_id, cfg, in l2tp_tunnel_register()
1484 sock = sockfd_lookup(tunnel->fd, &ret); in l2tp_tunnel_register()
1488 ret = l2tp_validate_socket(sock->sk, net, tunnel->encap); in l2tp_tunnel_register()
1496 tunnel->sock = sk; in l2tp_tunnel_register()
1497 tunnel->l2tp_net = net; in l2tp_tunnel_register()
1503 if (tunnel_walk->tunnel_id == tunnel->tunnel_id) { in l2tp_tunnel_register()
1510 list_add_rcu(&tunnel->list, &pn->l2tp_tunnel_list); in l2tp_tunnel_register()
1513 if (tunnel->encap == L2TP_ENCAPTYPE_UDP) { in l2tp_tunnel_register()
1515 .sk_user_data = tunnel, in l2tp_tunnel_register()
1523 sk->sk_user_data = tunnel; in l2tp_tunnel_register()
1526 tunnel->old_sk_destruct = sk->sk_destruct; in l2tp_tunnel_register()
1532 if (tunnel->fd >= 0) in l2tp_tunnel_register()
1538 if (tunnel->fd < 0) in l2tp_tunnel_register()
1549 void l2tp_tunnel_delete(struct l2tp_tunnel *tunnel) in l2tp_tunnel_delete() argument
1551 if (!test_and_set_bit(0, &tunnel->dead)) { in l2tp_tunnel_delete()
1552 l2tp_tunnel_inc_refcount(tunnel); in l2tp_tunnel_delete()
1553 queue_work(l2tp_wq, &tunnel->del_work); in l2tp_tunnel_delete()
1562 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_session_free() local
1566 if (tunnel) { in l2tp_session_free()
1567 BUG_ON(tunnel->magic != L2TP_TUNNEL_MAGIC); in l2tp_session_free()
1568 l2tp_tunnel_dec_refcount(tunnel); in l2tp_session_free()
1582 struct l2tp_tunnel *tunnel = session->tunnel; in __l2tp_session_unhash() local
1585 if (tunnel) { in __l2tp_session_unhash()
1587 write_lock_bh(&tunnel->hlist_lock); in __l2tp_session_unhash()
1589 write_unlock_bh(&tunnel->hlist_lock); in __l2tp_session_unhash()
1592 if (tunnel->version != L2TP_HDR_VER_2) { in __l2tp_session_unhash()
1593 struct l2tp_net *pn = l2tp_pernet(tunnel->l2tp_net); in __l2tp_session_unhash()
1634 if (session->tunnel->encap == L2TP_ENCAPTYPE_UDP) in l2tp_session_set_header_len()
1641 struct l2tp_session *l2tp_session_create(int priv_size, struct l2tp_tunnel *tunnel, u32 session_id,… in l2tp_session_create() argument
1648 session->tunnel = tunnel; in l2tp_session_create()
1653 if (tunnel->version == L2TP_HDR_VER_2) in l2tp_session_create()
1664 tunnel->tunnel_id, session->session_id); in l2tp_session_create()
1672 session->debug = tunnel->debug; in l2tp_session_create()
1688 if (tunnel->version == L2TP_HDR_VER_2) in l2tp_session_create()
1693 l2tp_session_set_header_len(session, tunnel->version); in l2tp_session_create()
1727 struct l2tp_tunnel *tunnel = NULL; in l2tp_exit_net() local
1731 list_for_each_entry_rcu(tunnel, &pn->l2tp_tunnel_list, list) { in l2tp_exit_net()
1732 l2tp_tunnel_delete(tunnel); in l2tp_exit_net()