Lines Matching refs:tunnel

116 static void l2tp_tunnel_free(struct l2tp_tunnel *tunnel);
133 static inline void l2tp_tunnel_inc_refcount_1(struct l2tp_tunnel *tunnel) in l2tp_tunnel_inc_refcount_1() argument
135 atomic_inc(&tunnel->ref_count); in l2tp_tunnel_inc_refcount_1()
138 static inline void l2tp_tunnel_dec_refcount_1(struct l2tp_tunnel *tunnel) in l2tp_tunnel_dec_refcount_1() argument
140 if (atomic_dec_and_test(&tunnel->ref_count)) in l2tp_tunnel_dec_refcount_1()
141 l2tp_tunnel_free(tunnel); in l2tp_tunnel_dec_refcount_1()
179 static struct sock *l2tp_tunnel_sock_lookup(struct l2tp_tunnel *tunnel) in l2tp_tunnel_sock_lookup() argument
185 if (!tunnel) in l2tp_tunnel_sock_lookup()
188 if (tunnel->fd >= 0) { in l2tp_tunnel_sock_lookup()
193 sock = sockfd_lookup(tunnel->fd, &err); in l2tp_tunnel_sock_lookup()
198 sk = tunnel->sock; in l2tp_tunnel_sock_lookup()
209 struct l2tp_tunnel *tunnel = l2tp_sock_to_tunnel(sk); in l2tp_tunnel_sock_put() local
210 if (tunnel) { in l2tp_tunnel_sock_put()
211 if (tunnel->fd >= 0) { in l2tp_tunnel_sock_put()
248 l2tp_session_id_hash(struct l2tp_tunnel *tunnel, u32 session_id) in l2tp_session_id_hash() argument
250 return &tunnel->session_hlist[hash_32(session_id, L2TP_HASH_BITS)]; in l2tp_session_id_hash()
255 struct l2tp_session *l2tp_session_find(struct net *net, struct l2tp_tunnel *tunnel, u32 session_id) in l2tp_session_find() argument
264 if (tunnel == NULL) in l2tp_session_find()
267 session_list = l2tp_session_id_hash(tunnel, session_id); in l2tp_session_find()
268 read_lock_bh(&tunnel->hlist_lock); in l2tp_session_find()
271 read_unlock_bh(&tunnel->hlist_lock); in l2tp_session_find()
275 read_unlock_bh(&tunnel->hlist_lock); in l2tp_session_find()
281 struct l2tp_session *l2tp_session_find_nth(struct l2tp_tunnel *tunnel, int nth) in l2tp_session_find_nth() argument
287 read_lock_bh(&tunnel->hlist_lock); in l2tp_session_find_nth()
289 hlist_for_each_entry(session, &tunnel->session_hlist[hash], hlist) { in l2tp_session_find_nth()
291 read_unlock_bh(&tunnel->hlist_lock); in l2tp_session_find_nth()
297 read_unlock_bh(&tunnel->hlist_lock); in l2tp_session_find_nth()
332 struct l2tp_tunnel *tunnel; in l2tp_tunnel_find() local
336 list_for_each_entry_rcu(tunnel, &pn->l2tp_tunnel_list, list) { in l2tp_tunnel_find()
337 if (tunnel->tunnel_id == tunnel_id) { in l2tp_tunnel_find()
339 return tunnel; in l2tp_tunnel_find()
351 struct l2tp_tunnel *tunnel; in l2tp_tunnel_find_nth() local
355 list_for_each_entry_rcu(tunnel, &pn->l2tp_tunnel_list, list) { in l2tp_tunnel_find_nth()
358 return tunnel; in l2tp_tunnel_find_nth()
404 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_recv_dequeue_skb() local
412 atomic_long_inc(&tunnel->stats.rx_packets); in l2tp_recv_dequeue_skb()
413 atomic_long_add(length, &tunnel->stats.rx_bytes); in l2tp_recv_dequeue_skb()
641 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_recv_common() local
656 l2tp_info(tunnel, L2TP_MSG_DATA, in l2tp_recv_common()
658 tunnel->name, tunnel->tunnel_id, in l2tp_recv_common()
675 if (tunnel->version == L2TP_HDR_VER_2) { in l2tp_recv_common()
719 l2tp_session_set_header_len(session, tunnel->version); in l2tp_recv_common()
743 l2tp_session_set_header_len(session, tunnel->version); in l2tp_recv_common()
758 if (tunnel->version == L2TP_HDR_VER_2) { in l2tp_recv_common()
843 static int l2tp_udp_recv_core(struct l2tp_tunnel *tunnel, struct sk_buff *skb, in l2tp_udp_recv_core() argument
860 l2tp_info(tunnel, L2TP_MSG_DATA, in l2tp_udp_recv_core()
862 tunnel->name, skb->len); in l2tp_udp_recv_core()
867 if (tunnel->debug & L2TP_MSG_DATA) { in l2tp_udp_recv_core()
872 pr_debug("%s: recv\n", tunnel->name); in l2tp_udp_recv_core()
884 if (version != tunnel->version) { in l2tp_udp_recv_core()
885 l2tp_info(tunnel, L2TP_MSG_DATA, in l2tp_udp_recv_core()
887 tunnel->name, version, tunnel->version); in l2tp_udp_recv_core()
896 l2tp_dbg(tunnel, L2TP_MSG_DATA, in l2tp_udp_recv_core()
898 tunnel->name, length); in l2tp_udp_recv_core()
905 if (tunnel->version == L2TP_HDR_VER_2) { in l2tp_udp_recv_core()
917 tunnel_id = tunnel->tunnel_id; in l2tp_udp_recv_core()
923 session = l2tp_session_find(tunnel->l2tp_net, tunnel, session_id); in l2tp_udp_recv_core()
926 l2tp_info(tunnel, L2TP_MSG_DATA, in l2tp_udp_recv_core()
928 tunnel->name, tunnel_id, session_id); in l2tp_udp_recv_core()
951 struct l2tp_tunnel *tunnel; in l2tp_udp_encap_recv() local
953 tunnel = l2tp_sock_to_tunnel(sk); in l2tp_udp_encap_recv()
954 if (tunnel == NULL) in l2tp_udp_encap_recv()
957 l2tp_dbg(tunnel, L2TP_MSG_DATA, "%s: received %d bytes\n", in l2tp_udp_encap_recv()
958 tunnel->name, skb->len); in l2tp_udp_encap_recv()
960 if (l2tp_udp_recv_core(tunnel, skb, tunnel->recv_payload_hook)) in l2tp_udp_encap_recv()
981 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_build_l2tpv2_header() local
985 u32 tunnel_id = tunnel->peer_tunnel_id; in l2tp_build_l2tpv2_header()
1009 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_build_l2tpv3_header() local
1016 if (tunnel->encap == L2TP_ENCAPTYPE_UDP) { in l2tp_build_l2tpv3_header()
1055 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_xmit_core() local
1068 int uhlen = (tunnel->encap == L2TP_ENCAPTYPE_UDP) ? sizeof(struct udphdr) : 0; in l2tp_xmit_core()
1079 if (tunnel->sock->sk_family == PF_INET6 && !tunnel->v4mapped) in l2tp_xmit_core()
1080 error = inet6_csk_xmit(tunnel->sock, skb, NULL); in l2tp_xmit_core()
1083 error = ip_queue_xmit(tunnel->sock, skb, fl); in l2tp_xmit_core()
1087 atomic_long_inc(&tunnel->stats.tx_packets); in l2tp_xmit_core()
1088 atomic_long_add(len, &tunnel->stats.tx_bytes); in l2tp_xmit_core()
1092 atomic_long_inc(&tunnel->stats.tx_errors); in l2tp_xmit_core()
1105 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_xmit_skb() local
1106 struct sock *sk = tunnel->sock; in l2tp_xmit_skb()
1111 int uhlen = (tunnel->encap == L2TP_ENCAPTYPE_UDP) ? sizeof(struct udphdr) : 0; in l2tp_xmit_skb()
1148 switch (tunnel->encap) { in l2tp_xmit_skb()
1161 if (sk->sk_family == PF_INET6 && !tunnel->v4mapped) in l2tp_xmit_skb()
1193 struct l2tp_tunnel *tunnel = l2tp_tunnel(sk); in l2tp_tunnel_destruct() local
1196 if (tunnel == NULL) in l2tp_tunnel_destruct()
1199 l2tp_info(tunnel, L2TP_MSG_CONTROL, "%s: closing...\n", tunnel->name); in l2tp_tunnel_destruct()
1203 switch (tunnel->encap) { in l2tp_tunnel_destruct()
1215 sk->sk_destruct = tunnel->old_sk_destruct; in l2tp_tunnel_destruct()
1217 tunnel->sock = NULL; in l2tp_tunnel_destruct()
1220 pn = l2tp_pernet(tunnel->l2tp_net); in l2tp_tunnel_destruct()
1222 list_del_rcu(&tunnel->list); in l2tp_tunnel_destruct()
1226 l2tp_tunnel_closeall(tunnel); in l2tp_tunnel_destruct()
1227 l2tp_tunnel_dec_refcount(tunnel); in l2tp_tunnel_destruct()
1238 void l2tp_tunnel_closeall(struct l2tp_tunnel *tunnel) in l2tp_tunnel_closeall() argument
1245 BUG_ON(tunnel == NULL); in l2tp_tunnel_closeall()
1247 l2tp_info(tunnel, L2TP_MSG_CONTROL, "%s: closing all sessions...\n", in l2tp_tunnel_closeall()
1248 tunnel->name); in l2tp_tunnel_closeall()
1250 write_lock_bh(&tunnel->hlist_lock); in l2tp_tunnel_closeall()
1253 hlist_for_each_safe(walk, tmp, &tunnel->session_hlist[hash]) { in l2tp_tunnel_closeall()
1264 write_unlock_bh(&tunnel->hlist_lock); in l2tp_tunnel_closeall()
1277 write_lock_bh(&tunnel->hlist_lock); in l2tp_tunnel_closeall()
1287 write_unlock_bh(&tunnel->hlist_lock); in l2tp_tunnel_closeall()
1294 struct l2tp_tunnel *tunnel = l2tp_sock_to_tunnel(sk); in l2tp_udp_encap_destroy() local
1295 if (tunnel) { in l2tp_udp_encap_destroy()
1296 l2tp_tunnel_closeall(tunnel); in l2tp_udp_encap_destroy()
1304 static void l2tp_tunnel_free(struct l2tp_tunnel *tunnel) in l2tp_tunnel_free() argument
1306 BUG_ON(atomic_read(&tunnel->ref_count) != 0); in l2tp_tunnel_free()
1307 BUG_ON(tunnel->sock != NULL); in l2tp_tunnel_free()
1308 l2tp_info(tunnel, L2TP_MSG_CONTROL, "%s: free...\n", tunnel->name); in l2tp_tunnel_free()
1309 kfree_rcu(tunnel, rcu); in l2tp_tunnel_free()
1315 struct l2tp_tunnel *tunnel = NULL; in l2tp_tunnel_del_work() local
1319 tunnel = container_of(work, struct l2tp_tunnel, del_work); in l2tp_tunnel_del_work()
1320 sk = l2tp_tunnel_sock_lookup(tunnel); in l2tp_tunnel_del_work()
1333 if (tunnel->fd >= 0) { in l2tp_tunnel_del_work()
1345 l2tp_tunnel_dec_refcount(tunnel); in l2tp_tunnel_del_work()
1475 struct l2tp_tunnel *tunnel = NULL; in l2tp_tunnel_create() local
1534 tunnel = l2tp_tunnel(sk); in l2tp_tunnel_create()
1535 if (tunnel != NULL) { in l2tp_tunnel_create()
1541 tunnel = kzalloc(sizeof(struct l2tp_tunnel), GFP_KERNEL); in l2tp_tunnel_create()
1542 if (tunnel == NULL) { in l2tp_tunnel_create()
1547 tunnel->version = version; in l2tp_tunnel_create()
1548 tunnel->tunnel_id = tunnel_id; in l2tp_tunnel_create()
1549 tunnel->peer_tunnel_id = peer_tunnel_id; in l2tp_tunnel_create()
1550 tunnel->debug = L2TP_DEFAULT_DEBUG_FLAGS; in l2tp_tunnel_create()
1552 tunnel->magic = L2TP_TUNNEL_MAGIC; in l2tp_tunnel_create()
1553 sprintf(&tunnel->name[0], "tunl %u", tunnel_id); in l2tp_tunnel_create()
1554 rwlock_init(&tunnel->hlist_lock); in l2tp_tunnel_create()
1557 tunnel->l2tp_net = net; in l2tp_tunnel_create()
1561 tunnel->debug = cfg->debug; in l2tp_tunnel_create()
1571 tunnel->v4mapped = true; in l2tp_tunnel_create()
1576 tunnel->v4mapped = false; in l2tp_tunnel_create()
1582 tunnel->encap = encap; in l2tp_tunnel_create()
1586 udp_cfg.sk_user_data = tunnel; in l2tp_tunnel_create()
1593 sk->sk_user_data = tunnel; in l2tp_tunnel_create()
1599 tunnel->old_sk_destruct = sk->sk_destruct; in l2tp_tunnel_create()
1601 tunnel->sock = sk; in l2tp_tunnel_create()
1602 tunnel->fd = fd; in l2tp_tunnel_create()
1608 INIT_WORK(&tunnel->del_work, l2tp_tunnel_del_work); in l2tp_tunnel_create()
1611 INIT_LIST_HEAD(&tunnel->list); in l2tp_tunnel_create()
1617 l2tp_tunnel_inc_refcount(tunnel); in l2tp_tunnel_create()
1619 list_add_rcu(&tunnel->list, &pn->l2tp_tunnel_list); in l2tp_tunnel_create()
1625 *tunnelp = tunnel; in l2tp_tunnel_create()
1639 int l2tp_tunnel_delete(struct l2tp_tunnel *tunnel) in l2tp_tunnel_delete() argument
1641 l2tp_tunnel_inc_refcount(tunnel); in l2tp_tunnel_delete()
1642 l2tp_tunnel_closeall(tunnel); in l2tp_tunnel_delete()
1643 if (false == queue_work(l2tp_wq, &tunnel->del_work)) { in l2tp_tunnel_delete()
1644 l2tp_tunnel_dec_refcount(tunnel); in l2tp_tunnel_delete()
1655 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_session_free() local
1659 if (tunnel) { in l2tp_session_free()
1660 BUG_ON(tunnel->magic != L2TP_TUNNEL_MAGIC); in l2tp_session_free()
1663 sock_put(tunnel->sock); in l2tp_session_free()
1664 session->tunnel = NULL; in l2tp_session_free()
1665 l2tp_tunnel_dec_refcount(tunnel); in l2tp_session_free()
1679 struct l2tp_tunnel *tunnel = session->tunnel; in __l2tp_session_unhash() local
1682 if (tunnel) { in __l2tp_session_unhash()
1684 write_lock_bh(&tunnel->hlist_lock); in __l2tp_session_unhash()
1686 write_unlock_bh(&tunnel->hlist_lock); in __l2tp_session_unhash()
1689 if (tunnel->version != L2TP_HDR_VER_2) { in __l2tp_session_unhash()
1690 struct l2tp_net *pn = l2tp_pernet(tunnel->l2tp_net); in __l2tp_session_unhash()
1729 if (session->tunnel->encap == L2TP_ENCAPTYPE_UDP) in l2tp_session_set_header_len()
1736 struct l2tp_session *l2tp_session_create(int priv_size, struct l2tp_tunnel *tunnel, u32 session_id,… in l2tp_session_create() argument
1743 session->tunnel = tunnel; in l2tp_session_create()
1748 if (tunnel->version == L2TP_HDR_VER_2) in l2tp_session_create()
1759 tunnel->tunnel_id, session->session_id); in l2tp_session_create()
1767 session->debug = tunnel->debug; in l2tp_session_create()
1787 if (tunnel->version == L2TP_HDR_VER_2) in l2tp_session_create()
1792 l2tp_session_set_header_len(session, tunnel->version); in l2tp_session_create()
1798 l2tp_tunnel_inc_refcount(tunnel); in l2tp_session_create()
1801 sock_hold(tunnel->sock); in l2tp_session_create()
1804 write_lock_bh(&tunnel->hlist_lock); in l2tp_session_create()
1806 l2tp_session_id_hash(tunnel, session_id)); in l2tp_session_create()
1807 write_unlock_bh(&tunnel->hlist_lock); in l2tp_session_create()
1810 if (tunnel->version != L2TP_HDR_VER_2) { in l2tp_session_create()
1811 struct l2tp_net *pn = l2tp_pernet(tunnel->l2tp_net); in l2tp_session_create()
1851 struct l2tp_tunnel *tunnel = NULL; in l2tp_exit_net() local
1854 list_for_each_entry_rcu(tunnel, &pn->l2tp_tunnel_list, list) { in l2tp_exit_net()
1855 (void)l2tp_tunnel_delete(tunnel); in l2tp_exit_net()