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()
1344 l2tp_tunnel_dec_refcount(tunnel); in l2tp_tunnel_del_work()
1478 struct l2tp_tunnel *tunnel = NULL; in l2tp_tunnel_create() local
1537 tunnel = l2tp_tunnel(sk); in l2tp_tunnel_create()
1538 if (tunnel != NULL) { in l2tp_tunnel_create()
1544 tunnel = kzalloc(sizeof(struct l2tp_tunnel), GFP_KERNEL); in l2tp_tunnel_create()
1545 if (tunnel == NULL) { in l2tp_tunnel_create()
1550 tunnel->version = version; in l2tp_tunnel_create()
1551 tunnel->tunnel_id = tunnel_id; in l2tp_tunnel_create()
1552 tunnel->peer_tunnel_id = peer_tunnel_id; in l2tp_tunnel_create()
1553 tunnel->debug = L2TP_DEFAULT_DEBUG_FLAGS; in l2tp_tunnel_create()
1555 tunnel->magic = L2TP_TUNNEL_MAGIC; in l2tp_tunnel_create()
1556 sprintf(&tunnel->name[0], "tunl %u", tunnel_id); in l2tp_tunnel_create()
1557 rwlock_init(&tunnel->hlist_lock); in l2tp_tunnel_create()
1560 tunnel->l2tp_net = net; in l2tp_tunnel_create()
1564 tunnel->debug = cfg->debug; in l2tp_tunnel_create()
1574 tunnel->v4mapped = true; in l2tp_tunnel_create()
1579 tunnel->v4mapped = false; in l2tp_tunnel_create()
1585 tunnel->encap = encap; in l2tp_tunnel_create()
1589 udp_cfg.sk_user_data = tunnel; in l2tp_tunnel_create()
1596 sk->sk_user_data = tunnel; in l2tp_tunnel_create()
1602 tunnel->old_sk_destruct = sk->sk_destruct; in l2tp_tunnel_create()
1604 tunnel->sock = sk; in l2tp_tunnel_create()
1605 tunnel->fd = fd; in l2tp_tunnel_create()
1611 INIT_WORK(&tunnel->del_work, l2tp_tunnel_del_work); in l2tp_tunnel_create()
1614 INIT_LIST_HEAD(&tunnel->list); in l2tp_tunnel_create()
1620 l2tp_tunnel_inc_refcount(tunnel); in l2tp_tunnel_create()
1622 list_add_rcu(&tunnel->list, &pn->l2tp_tunnel_list); in l2tp_tunnel_create()
1628 *tunnelp = tunnel; in l2tp_tunnel_create()
1642 int l2tp_tunnel_delete(struct l2tp_tunnel *tunnel) in l2tp_tunnel_delete() argument
1644 l2tp_tunnel_inc_refcount(tunnel); in l2tp_tunnel_delete()
1645 l2tp_tunnel_closeall(tunnel); in l2tp_tunnel_delete()
1646 if (false == queue_work(l2tp_wq, &tunnel->del_work)) { in l2tp_tunnel_delete()
1647 l2tp_tunnel_dec_refcount(tunnel); in l2tp_tunnel_delete()
1658 struct l2tp_tunnel *tunnel = session->tunnel; in l2tp_session_free() local
1662 if (tunnel) { in l2tp_session_free()
1663 BUG_ON(tunnel->magic != L2TP_TUNNEL_MAGIC); in l2tp_session_free()
1666 sock_put(tunnel->sock); in l2tp_session_free()
1667 session->tunnel = NULL; in l2tp_session_free()
1668 l2tp_tunnel_dec_refcount(tunnel); in l2tp_session_free()
1682 struct l2tp_tunnel *tunnel = session->tunnel; in __l2tp_session_unhash() local
1685 if (tunnel) { in __l2tp_session_unhash()
1687 write_lock_bh(&tunnel->hlist_lock); in __l2tp_session_unhash()
1689 write_unlock_bh(&tunnel->hlist_lock); in __l2tp_session_unhash()
1692 if (tunnel->version != L2TP_HDR_VER_2) { in __l2tp_session_unhash()
1693 struct l2tp_net *pn = l2tp_pernet(tunnel->l2tp_net); in __l2tp_session_unhash()
1732 if (session->tunnel->encap == L2TP_ENCAPTYPE_UDP) in l2tp_session_set_header_len()
1739 struct l2tp_session *l2tp_session_create(int priv_size, struct l2tp_tunnel *tunnel, u32 session_id,… in l2tp_session_create() argument
1746 session->tunnel = tunnel; in l2tp_session_create()
1751 if (tunnel->version == L2TP_HDR_VER_2) in l2tp_session_create()
1762 tunnel->tunnel_id, session->session_id); in l2tp_session_create()
1770 session->debug = tunnel->debug; in l2tp_session_create()
1790 if (tunnel->version == L2TP_HDR_VER_2) in l2tp_session_create()
1795 l2tp_session_set_header_len(session, tunnel->version); in l2tp_session_create()
1801 l2tp_tunnel_inc_refcount(tunnel); in l2tp_session_create()
1804 sock_hold(tunnel->sock); in l2tp_session_create()
1807 write_lock_bh(&tunnel->hlist_lock); in l2tp_session_create()
1809 l2tp_session_id_hash(tunnel, session_id)); in l2tp_session_create()
1810 write_unlock_bh(&tunnel->hlist_lock); in l2tp_session_create()
1813 if (tunnel->version != L2TP_HDR_VER_2) { in l2tp_session_create()
1814 struct l2tp_net *pn = l2tp_pernet(tunnel->l2tp_net); in l2tp_session_create()
1854 struct l2tp_tunnel *tunnel = NULL; in l2tp_exit_net() local
1857 list_for_each_entry_rcu(tunnel, &pn->l2tp_tunnel_list, list) { in l2tp_exit_net()
1858 (void)l2tp_tunnel_delete(tunnel); in l2tp_exit_net()