Lines Matching +full:tx +full:- +full:sched +full:- +full:sp

1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * PPPoX --- Generic PPP encapsulation socket family
6 * PPPoL2TP --- PPP over L2TP (RFC 2661)
30 * over an L2TP session:-
41 * sax.pppol2tp.addr.sin_addr.s_addr = addr->sin_addr.s_addr;
42 * sax.pppol2tp.addr.sin_port = addr->sin_port;
66 #include <linux/sched.h>
83 #include <linux/ppp-ioctl.h>
114 * l2tp_session, referenced via session->priv[].
137 return rcu_dereference(ps->sk); in pppol2tp_session_get_sock()
151 if (session && refcount_inc_not_zero(&session->ref_count)) { in pppol2tp_sock_to_session()
153 WARN_ON_ONCE(session->magic != L2TP_SESSION_MAGIC); in pppol2tp_sock_to_session()
172 struct sock *sk = sock->sk; in pppol2tp_recvmsg()
174 err = -EIO; in pppol2tp_recvmsg()
175 if (sk->sk_state & PPPOX_BOUND) in pppol2tp_recvmsg()
183 if (len > skb->len) in pppol2tp_recvmsg()
184 len = skb->len; in pppol2tp_recvmsg()
185 else if (len < skb->len) in pppol2tp_recvmsg()
186 msg->msg_flags |= MSG_TRUNC; in pppol2tp_recvmsg()
213 * constant: 0xFF is the All-Stations Address and 0x03 the Unnumbered in pppol2tp_recv()
216 if (pskb_may_pull(skb, 2) && skb->data[0] == PPP_ALLSTATIONS && in pppol2tp_recv()
217 skb->data[1] == PPP_UI) in pppol2tp_recv()
220 if (sk->sk_state & PPPOX_BOUND) { in pppol2tp_recv()
224 ppp_input(&po->chan, skb); in pppol2tp_recv()
227 atomic_long_inc(&session->stats.rx_errors); in pppol2tp_recv()
237 pr_warn_ratelimited("%s: no socket in recv\n", session->name); in pppol2tp_recv()
252 struct sock *sk = sock->sk; in pppol2tp_sendmsg()
259 error = -ENOTCONN; in pppol2tp_sendmsg()
260 if (sock_flag(sk, SOCK_DEAD) || !(sk->sk_state & PPPOX_CONNECTED)) in pppol2tp_sendmsg()
264 error = -EBADF; in pppol2tp_sendmsg()
269 tunnel = session->tunnel; in pppol2tp_sendmsg()
271 uhlen = (tunnel->encap == L2TP_ENCAPTYPE_UDP) ? sizeof(struct udphdr) : 0; in pppol2tp_sendmsg()
274 error = -ENOMEM; in pppol2tp_sendmsg()
276 uhlen + session->hdr_len + in pppol2tp_sendmsg()
290 skb->data[0] = PPP_ALLSTATIONS; in pppol2tp_sendmsg()
291 skb->data[1] = PPP_UI; in pppol2tp_sendmsg()
331 struct sock *sk = (struct sock *)chan->private; in pppol2tp_xmit()
336 if (sock_flag(sk, SOCK_DEAD) || !(sk->sk_state & PPPOX_CONNECTED)) in pppol2tp_xmit()
344 tunnel = session->tunnel; in pppol2tp_xmit()
346 uhlen = (tunnel->encap == L2TP_ENCAPTYPE_UDP) ? sizeof(struct udphdr) : 0; in pppol2tp_xmit()
350 session->hdr_len + /* L2TP header */ in pppol2tp_xmit()
357 skb->data[0] = PPP_ALLSTATIONS; in pppol2tp_xmit()
358 skb->data[1] = PPP_UI; in pppol2tp_xmit()
385 skb_queue_purge(&sk->sk_receive_queue); in pppol2tp_session_destruct()
386 skb_queue_purge(&sk->sk_write_queue); in pppol2tp_session_destruct()
394 mutex_lock(&ps->sk_lock); in pppol2tp_session_close()
395 ps->__sk = rcu_dereference_protected(ps->sk, in pppol2tp_session_close()
396 lockdep_is_held(&ps->sk_lock)); in pppol2tp_session_close()
397 RCU_INIT_POINTER(ps->sk, NULL); in pppol2tp_session_close()
398 mutex_unlock(&ps->sk_lock); in pppol2tp_session_close()
399 if (ps->__sk) { in pppol2tp_session_close()
401 rcu_assign_sk_user_data(ps->__sk, NULL); in pppol2tp_session_close()
402 sock_put(ps->__sk); in pppol2tp_session_close()
413 struct sock *sk = sock->sk; in pppol2tp_release()
420 error = -EBADF; in pppol2tp_release()
428 sk->sk_state = PPPOX_DEAD; in pppol2tp_release()
430 sock->sk = NULL; in pppol2tp_release()
471 int error = -ENOMEM; in pppol2tp_create()
481 sock->state = SS_UNCONNECTED; in pppol2tp_create()
482 sock->ops = &pppol2tp_ops; in pppol2tp_create()
484 sk->sk_backlog_rcv = pppol2tp_backlog_recv; in pppol2tp_create()
485 sk->sk_protocol = PX_PROTO_OL2TP; in pppol2tp_create()
486 sk->sk_family = PF_PPPOX; in pppol2tp_create()
487 sk->sk_state = PPPOX_NONE; in pppol2tp_create()
488 sk->sk_type = SOCK_STREAM; in pppol2tp_create()
489 sk->sk_destruct = pppol2tp_session_destruct; in pppol2tp_create()
507 seq_printf(m, " interface %s\n", ppp_dev_name(&po->chan)); in pppol2tp_show()
516 session->recv_skb = pppol2tp_recv; in pppol2tp_session_init()
517 session->session_close = pppol2tp_session_close; in pppol2tp_session_init()
519 session->show = pppol2tp_show; in pppol2tp_session_init()
522 mutex_init(&ps->sk_lock); in pppol2tp_session_init()
523 ps->owner = current->pid; in pppol2tp_session_init()
543 if (sa_v2in4->sa_protocol != PX_PROTO_OL2TP) in pppol2tp_sockaddr_get_info()
544 return -EINVAL; in pppol2tp_sockaddr_get_info()
546 info->version = 2; in pppol2tp_sockaddr_get_info()
547 info->fd = sa_v2in4->pppol2tp.fd; in pppol2tp_sockaddr_get_info()
548 info->tunnel_id = sa_v2in4->pppol2tp.s_tunnel; in pppol2tp_sockaddr_get_info()
549 info->peer_tunnel_id = sa_v2in4->pppol2tp.d_tunnel; in pppol2tp_sockaddr_get_info()
550 info->session_id = sa_v2in4->pppol2tp.s_session; in pppol2tp_sockaddr_get_info()
551 info->peer_session_id = sa_v2in4->pppol2tp.d_session; in pppol2tp_sockaddr_get_info()
559 if (sa_v3in4->sa_protocol != PX_PROTO_OL2TP) in pppol2tp_sockaddr_get_info()
560 return -EINVAL; in pppol2tp_sockaddr_get_info()
562 info->version = 3; in pppol2tp_sockaddr_get_info()
563 info->fd = sa_v3in4->pppol2tp.fd; in pppol2tp_sockaddr_get_info()
564 info->tunnel_id = sa_v3in4->pppol2tp.s_tunnel; in pppol2tp_sockaddr_get_info()
565 info->peer_tunnel_id = sa_v3in4->pppol2tp.d_tunnel; in pppol2tp_sockaddr_get_info()
566 info->session_id = sa_v3in4->pppol2tp.s_session; in pppol2tp_sockaddr_get_info()
567 info->peer_session_id = sa_v3in4->pppol2tp.d_session; in pppol2tp_sockaddr_get_info()
575 if (sa_v2in6->sa_protocol != PX_PROTO_OL2TP) in pppol2tp_sockaddr_get_info()
576 return -EINVAL; in pppol2tp_sockaddr_get_info()
578 info->version = 2; in pppol2tp_sockaddr_get_info()
579 info->fd = sa_v2in6->pppol2tp.fd; in pppol2tp_sockaddr_get_info()
580 info->tunnel_id = sa_v2in6->pppol2tp.s_tunnel; in pppol2tp_sockaddr_get_info()
581 info->peer_tunnel_id = sa_v2in6->pppol2tp.d_tunnel; in pppol2tp_sockaddr_get_info()
582 info->session_id = sa_v2in6->pppol2tp.s_session; in pppol2tp_sockaddr_get_info()
583 info->peer_session_id = sa_v2in6->pppol2tp.d_session; in pppol2tp_sockaddr_get_info()
591 if (sa_v3in6->sa_protocol != PX_PROTO_OL2TP) in pppol2tp_sockaddr_get_info()
592 return -EINVAL; in pppol2tp_sockaddr_get_info()
594 info->version = 3; in pppol2tp_sockaddr_get_info()
595 info->fd = sa_v3in6->pppol2tp.fd; in pppol2tp_sockaddr_get_info()
596 info->tunnel_id = sa_v3in6->pppol2tp.s_tunnel; in pppol2tp_sockaddr_get_info()
597 info->peer_tunnel_id = sa_v3in6->pppol2tp.d_tunnel; in pppol2tp_sockaddr_get_info()
598 info->session_id = sa_v3in6->pppol2tp.s_session; in pppol2tp_sockaddr_get_info()
599 info->peer_session_id = sa_v3in6->pppol2tp.d_session; in pppol2tp_sockaddr_get_info()
604 return -EINVAL; in pppol2tp_sockaddr_get_info()
621 return 1500 - PPPOL2TP_HEADER_OVERHEAD; in pppol2tp_tunnel_mtu()
623 return mtu - PPPOL2TP_HEADER_OVERHEAD; in pppol2tp_tunnel_mtu()
635 tunnel = l2tp_tunnel_get(net, info->tunnel_id); in pppol2tp_tunnel_get()
641 if (!info->session_id && !info->peer_session_id) { in pppol2tp_tunnel_get()
650 if (info->fd < 0) in pppol2tp_tunnel_get()
651 return ERR_PTR(-EBADF); in pppol2tp_tunnel_get()
653 error = l2tp_tunnel_create(info->fd, in pppol2tp_tunnel_get()
654 info->version, in pppol2tp_tunnel_get()
655 info->tunnel_id, in pppol2tp_tunnel_get()
656 info->peer_tunnel_id, &tcfg, in pppol2tp_tunnel_get()
661 refcount_inc(&tunnel->ref_count); in pppol2tp_tunnel_get()
673 return ERR_PTR(-ENOENT); in pppol2tp_tunnel_get()
676 if (!tunnel->sock) { in pppol2tp_tunnel_get()
678 return ERR_PTR(-ENOENT); in pppol2tp_tunnel_get()
690 struct sock *sk = sock->sk; in pppol2tp_connect()
708 return -EINVAL; in pppol2tp_connect()
717 error = -EBUSY; in pppol2tp_connect()
718 if (sk->sk_state & PPPOX_CONNECTED) in pppol2tp_connect()
722 error = -EALREADY; in pppol2tp_connect()
723 if (sk->sk_user_data) in pppol2tp_connect()
726 if (tunnel->peer_tunnel_id == 0) in pppol2tp_connect()
727 tunnel->peer_tunnel_id = info.peer_tunnel_id; in pppol2tp_connect()
729 session = l2tp_session_get(sock_net(sk), tunnel->sock, tunnel->version, in pppol2tp_connect()
734 if (session->pwtype != L2TP_PWTYPE_PPP) { in pppol2tp_connect()
735 error = -EPROTOTYPE; in pppol2tp_connect()
741 /* Using a pre-existing session is fine as long as it hasn't in pppol2tp_connect()
744 mutex_lock(&ps->sk_lock); in pppol2tp_connect()
745 if (rcu_dereference_protected(ps->sk, in pppol2tp_connect()
746 lockdep_is_held(&ps->sk_lock)) || in pppol2tp_connect()
747 ps->__sk) { in pppol2tp_connect()
748 mutex_unlock(&ps->sk_lock); in pppol2tp_connect()
749 error = -EEXIST; in pppol2tp_connect()
767 refcount_inc(&session->ref_count); in pppol2tp_connect()
769 mutex_lock(&ps->sk_lock); in pppol2tp_connect()
772 mutex_unlock(&ps->sk_lock); in pppol2tp_connect()
785 if (session->session_id == 0 && session->peer_session_id == 0) { in pppol2tp_connect()
794 po->chan.hdrlen = PPPOL2TP_L2TP_HDR_SIZE_NOSEQ; in pppol2tp_connect()
796 po->chan.private = sk; in pppol2tp_connect()
797 po->chan.ops = &pppol2tp_chan_ops; in pppol2tp_connect()
798 po->chan.mtu = pppol2tp_tunnel_mtu(tunnel); in pppol2tp_connect()
799 po->chan.direct_xmit = true; in pppol2tp_connect()
801 error = ppp_register_net_channel(sock_net(sk), &po->chan); in pppol2tp_connect()
803 mutex_unlock(&ps->sk_lock); in pppol2tp_connect()
811 rcu_assign_pointer(ps->sk, sk); in pppol2tp_connect()
812 mutex_unlock(&ps->sk_lock); in pppol2tp_connect()
820 sk->sk_state = PPPOX_CONNECTED; in pppol2tp_connect()
848 if (!tunnel->sock) { in pppol2tp_session_create()
849 error = -ENOENT; in pppol2tp_session_create()
887 struct sock *sk = sock->sk; in pppol2tp_getname()
891 error = -ENOTCONN; in pppol2tp_getname()
894 if (!(sk->sk_state & PPPOX_CONNECTED)) in pppol2tp_getname()
897 error = -EBADF; in pppol2tp_getname()
903 tunnel = session->tunnel; in pppol2tp_getname()
905 inet = inet_sk(tunnel->sock); in pppol2tp_getname()
906 if (tunnel->version == 2 && tunnel->sock->sk_family == AF_INET) { in pppol2tp_getname()
907 struct sockaddr_pppol2tp sp; in pppol2tp_getname() local
909 len = sizeof(sp); in pppol2tp_getname()
910 memset(&sp, 0, len); in pppol2tp_getname()
911 sp.sa_family = AF_PPPOX; in pppol2tp_getname()
912 sp.sa_protocol = PX_PROTO_OL2TP; in pppol2tp_getname()
913 sp.pppol2tp.fd = tunnel->fd; in pppol2tp_getname()
914 sp.pppol2tp.pid = pls->owner; in pppol2tp_getname()
915 sp.pppol2tp.s_tunnel = tunnel->tunnel_id; in pppol2tp_getname()
916 sp.pppol2tp.d_tunnel = tunnel->peer_tunnel_id; in pppol2tp_getname()
917 sp.pppol2tp.s_session = session->session_id; in pppol2tp_getname()
918 sp.pppol2tp.d_session = session->peer_session_id; in pppol2tp_getname()
919 sp.pppol2tp.addr.sin_family = AF_INET; in pppol2tp_getname()
920 sp.pppol2tp.addr.sin_port = inet->inet_dport; in pppol2tp_getname()
921 sp.pppol2tp.addr.sin_addr.s_addr = inet->inet_daddr; in pppol2tp_getname()
922 memcpy(uaddr, &sp, len); in pppol2tp_getname()
924 } else if (tunnel->version == 2 && tunnel->sock->sk_family == AF_INET6) { in pppol2tp_getname()
925 struct sockaddr_pppol2tpin6 sp; in pppol2tp_getname() local
927 len = sizeof(sp); in pppol2tp_getname()
928 memset(&sp, 0, len); in pppol2tp_getname()
929 sp.sa_family = AF_PPPOX; in pppol2tp_getname()
930 sp.sa_protocol = PX_PROTO_OL2TP; in pppol2tp_getname()
931 sp.pppol2tp.fd = tunnel->fd; in pppol2tp_getname()
932 sp.pppol2tp.pid = pls->owner; in pppol2tp_getname()
933 sp.pppol2tp.s_tunnel = tunnel->tunnel_id; in pppol2tp_getname()
934 sp.pppol2tp.d_tunnel = tunnel->peer_tunnel_id; in pppol2tp_getname()
935 sp.pppol2tp.s_session = session->session_id; in pppol2tp_getname()
936 sp.pppol2tp.d_session = session->peer_session_id; in pppol2tp_getname()
937 sp.pppol2tp.addr.sin6_family = AF_INET6; in pppol2tp_getname()
938 sp.pppol2tp.addr.sin6_port = inet->inet_dport; in pppol2tp_getname()
939 memcpy(&sp.pppol2tp.addr.sin6_addr, &tunnel->sock->sk_v6_daddr, in pppol2tp_getname()
940 sizeof(tunnel->sock->sk_v6_daddr)); in pppol2tp_getname()
941 memcpy(uaddr, &sp, len); in pppol2tp_getname()
942 } else if (tunnel->version == 3 && tunnel->sock->sk_family == AF_INET6) { in pppol2tp_getname()
943 struct sockaddr_pppol2tpv3in6 sp; in pppol2tp_getname() local
945 len = sizeof(sp); in pppol2tp_getname()
946 memset(&sp, 0, len); in pppol2tp_getname()
947 sp.sa_family = AF_PPPOX; in pppol2tp_getname()
948 sp.sa_protocol = PX_PROTO_OL2TP; in pppol2tp_getname()
949 sp.pppol2tp.fd = tunnel->fd; in pppol2tp_getname()
950 sp.pppol2tp.pid = pls->owner; in pppol2tp_getname()
951 sp.pppol2tp.s_tunnel = tunnel->tunnel_id; in pppol2tp_getname()
952 sp.pppol2tp.d_tunnel = tunnel->peer_tunnel_id; in pppol2tp_getname()
953 sp.pppol2tp.s_session = session->session_id; in pppol2tp_getname()
954 sp.pppol2tp.d_session = session->peer_session_id; in pppol2tp_getname()
955 sp.pppol2tp.addr.sin6_family = AF_INET6; in pppol2tp_getname()
956 sp.pppol2tp.addr.sin6_port = inet->inet_dport; in pppol2tp_getname()
957 memcpy(&sp.pppol2tp.addr.sin6_addr, &tunnel->sock->sk_v6_daddr, in pppol2tp_getname()
958 sizeof(tunnel->sock->sk_v6_daddr)); in pppol2tp_getname()
959 memcpy(uaddr, &sp, len); in pppol2tp_getname()
961 } else if (tunnel->version == 3) { in pppol2tp_getname()
962 struct sockaddr_pppol2tpv3 sp; in pppol2tp_getname() local
964 len = sizeof(sp); in pppol2tp_getname()
965 memset(&sp, 0, len); in pppol2tp_getname()
966 sp.sa_family = AF_PPPOX; in pppol2tp_getname()
967 sp.sa_protocol = PX_PROTO_OL2TP; in pppol2tp_getname()
968 sp.pppol2tp.fd = tunnel->fd; in pppol2tp_getname()
969 sp.pppol2tp.pid = pls->owner; in pppol2tp_getname()
970 sp.pppol2tp.s_tunnel = tunnel->tunnel_id; in pppol2tp_getname()
971 sp.pppol2tp.d_tunnel = tunnel->peer_tunnel_id; in pppol2tp_getname()
972 sp.pppol2tp.s_session = session->session_id; in pppol2tp_getname()
973 sp.pppol2tp.d_session = session->peer_session_id; in pppol2tp_getname()
974 sp.pppol2tp.addr.sin_family = AF_INET; in pppol2tp_getname()
975 sp.pppol2tp.addr.sin_port = inet->inet_dport; in pppol2tp_getname()
976 sp.pppol2tp.addr.sin_addr.s_addr = inet->inet_daddr; in pppol2tp_getname()
977 memcpy(uaddr, &sp, len); in pppol2tp_getname()
1003 dest->tx_packets = atomic_long_read(&stats->tx_packets); in pppol2tp_copy_stats()
1004 dest->tx_bytes = atomic_long_read(&stats->tx_bytes); in pppol2tp_copy_stats()
1005 dest->tx_errors = atomic_long_read(&stats->tx_errors); in pppol2tp_copy_stats()
1006 dest->rx_packets = atomic_long_read(&stats->rx_packets); in pppol2tp_copy_stats()
1007 dest->rx_bytes = atomic_long_read(&stats->rx_bytes); in pppol2tp_copy_stats()
1008 dest->rx_seq_discards = atomic_long_read(&stats->rx_seq_discards); in pppol2tp_copy_stats()
1009 dest->rx_oos_packets = atomic_long_read(&stats->rx_oos_packets); in pppol2tp_copy_stats()
1010 dest->rx_errors = atomic_long_read(&stats->rx_errors); in pppol2tp_copy_stats()
1018 if (!stats->session_id) { in pppol2tp_tunnel_copy_stats()
1019 pppol2tp_copy_stats(stats, &tunnel->stats); in pppol2tp_tunnel_copy_stats()
1026 session = l2tp_session_get(tunnel->l2tp_net, tunnel->sock, tunnel->version, in pppol2tp_tunnel_copy_stats()
1027 tunnel->tunnel_id, stats->session_id); in pppol2tp_tunnel_copy_stats()
1029 return -EBADR; in pppol2tp_tunnel_copy_stats()
1031 if (session->pwtype != L2TP_PWTYPE_PPP) { in pppol2tp_tunnel_copy_stats()
1033 return -EBADR; in pppol2tp_tunnel_copy_stats()
1036 pppol2tp_copy_stats(stats, &session->stats); in pppol2tp_tunnel_copy_stats()
1051 session = sock->sk->sk_user_data; in pppol2tp_ioctl()
1053 return -ENOTCONN; in pppol2tp_ioctl()
1055 if (WARN_ON(session->magic != L2TP_SESSION_MAGIC)) in pppol2tp_ioctl()
1056 return -EBADF; in pppol2tp_ioctl()
1059 if (!session->session_id && !session->peer_session_id) in pppol2tp_ioctl()
1060 return -ENOSYS; in pppol2tp_ioctl()
1063 return -EFAULT; in pppol2tp_ioctl()
1068 session = sock->sk->sk_user_data; in pppol2tp_ioctl()
1070 return -ENOTCONN; in pppol2tp_ioctl()
1072 if (WARN_ON(session->magic != L2TP_SESSION_MAGIC)) in pppol2tp_ioctl()
1073 return -EBADF; in pppol2tp_ioctl()
1076 if (!session->session_id && !session->peer_session_id) in pppol2tp_ioctl()
1077 return -ENOSYS; in pppol2tp_ioctl()
1080 return -EFAULT; in pppol2tp_ioctl()
1084 session = sock->sk->sk_user_data; in pppol2tp_ioctl()
1086 return -ENOTCONN; in pppol2tp_ioctl()
1088 if (WARN_ON(session->magic != L2TP_SESSION_MAGIC)) in pppol2tp_ioctl()
1089 return -EBADF; in pppol2tp_ioctl()
1092 if (!session->session_id && !session->peer_session_id) { in pppol2tp_ioctl()
1098 return -EFAULT; in pppol2tp_ioctl()
1102 session->tunnel); in pppol2tp_ioctl()
1108 pppol2tp_copy_stats(&stats, &session->stats); in pppol2tp_ioctl()
1109 stats.session_id = session->session_id; in pppol2tp_ioctl()
1111 stats.tunnel_id = session->tunnel->tunnel_id; in pppol2tp_ioctl()
1112 stats.using_ipsec = l2tp_tunnel_uses_xfrm(session->tunnel); in pppol2tp_ioctl()
1115 return -EFAULT; in pppol2tp_ioctl()
1119 return -ENOIOCTLCMD; in pppol2tp_ioctl()
1149 err = -ENOPROTOOPT; in pppol2tp_tunnel_setsockopt()
1167 err = -EINVAL; in pppol2tp_session_setsockopt()
1170 session->recv_seq = !!val; in pppol2tp_session_setsockopt()
1175 err = -EINVAL; in pppol2tp_session_setsockopt()
1178 session->send_seq = !!val; in pppol2tp_session_setsockopt()
1182 po->chan.hdrlen = val ? PPPOL2TP_L2TP_HDR_SIZE_SEQ : in pppol2tp_session_setsockopt()
1185 l2tp_session_set_header_len(session, session->tunnel->version, in pppol2tp_session_setsockopt()
1186 session->tunnel->encap); in pppol2tp_session_setsockopt()
1191 err = -EINVAL; in pppol2tp_session_setsockopt()
1194 session->lns_mode = !!val; in pppol2tp_session_setsockopt()
1202 session->reorder_timeout = msecs_to_jiffies(val); in pppol2tp_session_setsockopt()
1206 err = -ENOPROTOOPT; in pppol2tp_session_setsockopt()
1221 struct sock *sk = sock->sk; in pppol2tp_setsockopt()
1228 return -EINVAL; in pppol2tp_setsockopt()
1231 return -EINVAL; in pppol2tp_setsockopt()
1234 return -EFAULT; in pppol2tp_setsockopt()
1236 err = -ENOTCONN; in pppol2tp_setsockopt()
1237 if (!sk->sk_user_data) in pppol2tp_setsockopt()
1241 err = -EBADF; in pppol2tp_setsockopt()
1248 if (session->session_id == 0 && session->peer_session_id == 0) { in pppol2tp_setsockopt()
1249 tunnel = session->tunnel; in pppol2tp_setsockopt()
1275 err = -ENOPROTOOPT; in pppol2tp_tunnel_getsockopt()
1292 *val = session->recv_seq; in pppol2tp_session_getsockopt()
1296 *val = session->send_seq; in pppol2tp_session_getsockopt()
1300 *val = session->lns_mode; in pppol2tp_session_getsockopt()
1309 *val = (int)jiffies_to_msecs(session->reorder_timeout); in pppol2tp_session_getsockopt()
1313 err = -ENOPROTOOPT; in pppol2tp_session_getsockopt()
1327 struct sock *sk = sock->sk; in pppol2tp_getsockopt()
1334 return -EINVAL; in pppol2tp_getsockopt()
1337 return -EFAULT; in pppol2tp_getsockopt()
1340 return -EINVAL; in pppol2tp_getsockopt()
1344 err = -ENOTCONN; in pppol2tp_getsockopt()
1345 if (!sk->sk_user_data) in pppol2tp_getsockopt()
1349 err = -EBADF; in pppol2tp_getsockopt()
1355 if (session->session_id == 0 && session->peer_session_id == 0) { in pppol2tp_getsockopt()
1356 tunnel = session->tunnel; in pppol2tp_getsockopt()
1366 err = -EFAULT; in pppol2tp_getsockopt()
1400 if (pd->tunnel) in pppol2tp_next_tunnel()
1401 l2tp_tunnel_put(pd->tunnel); in pppol2tp_next_tunnel()
1404 pd->tunnel = l2tp_tunnel_get_next(net, &pd->tkey); in pppol2tp_next_tunnel()
1405 pd->tkey++; in pppol2tp_next_tunnel()
1408 if (!pd->tunnel || pd->tunnel->version == 2) in pppol2tp_next_tunnel()
1411 l2tp_tunnel_put(pd->tunnel); in pppol2tp_next_tunnel()
1418 if (pd->session) in pppol2tp_next_session()
1419 l2tp_session_put(pd->session); in pppol2tp_next_session()
1421 pd->session = l2tp_session_get_next(net, pd->tunnel->sock, in pppol2tp_next_session()
1422 pd->tunnel->version, in pppol2tp_next_session()
1423 pd->tunnel->tunnel_id, &pd->skey); in pppol2tp_next_session()
1424 pd->skey++; in pppol2tp_next_session()
1426 if (!pd->session) { in pppol2tp_next_session()
1427 pd->skey = 0; in pppol2tp_next_session()
1441 if (WARN_ON(!m->private)) { in pppol2tp_seq_start()
1446 pd = m->private; in pppol2tp_seq_start()
1449 if (!pd->tunnel) in pppol2tp_seq_start()
1455 if (!pd->tunnel && !pd->session) in pppol2tp_seq_start()
1478 if (pd->session) { in pppol2tp_seq_stop()
1479 l2tp_session_put(pd->session); in pppol2tp_seq_stop()
1480 pd->session = NULL; in pppol2tp_seq_stop()
1482 if (pd->tunnel) { in pppol2tp_seq_stop()
1483 l2tp_tunnel_put(pd->tunnel); in pppol2tp_seq_stop()
1484 pd->tunnel = NULL; in pppol2tp_seq_stop()
1493 tunnel->name, in pppol2tp_seq_tunnel_show()
1494 tunnel->sock ? 'Y' : 'N', in pppol2tp_seq_tunnel_show()
1495 refcount_read(&tunnel->ref_count) - 1); in pppol2tp_seq_tunnel_show()
1498 atomic_long_read(&tunnel->stats.tx_packets), in pppol2tp_seq_tunnel_show()
1499 atomic_long_read(&tunnel->stats.tx_bytes), in pppol2tp_seq_tunnel_show()
1500 atomic_long_read(&tunnel->stats.tx_errors), in pppol2tp_seq_tunnel_show()
1501 atomic_long_read(&tunnel->stats.rx_packets), in pppol2tp_seq_tunnel_show()
1502 atomic_long_read(&tunnel->stats.rx_bytes), in pppol2tp_seq_tunnel_show()
1503 atomic_long_read(&tunnel->stats.rx_errors)); in pppol2tp_seq_tunnel_show()
1509 struct l2tp_tunnel *tunnel = session->tunnel; in pppol2tp_seq_session_show()
1516 if (tunnel->sock) { in pppol2tp_seq_session_show()
1517 struct inet_sock *inet = inet_sk(tunnel->sock); in pppol2tp_seq_session_show()
1519 ip = ntohl(inet->inet_saddr); in pppol2tp_seq_session_show()
1520 port = ntohs(inet->inet_sport); in pppol2tp_seq_session_show()
1526 state = sk->sk_state; in pppol2tp_seq_session_show()
1527 user_data_ok = (session == sk->sk_user_data) ? 'Y' : 'N'; in pppol2tp_seq_session_show()
1533 seq_printf(m, " SESSION '%s' %08X/%d %04X/%04X -> %04X/%04X %d %c\n", in pppol2tp_seq_session_show()
1534 session->name, ip, port, in pppol2tp_seq_session_show()
1535 tunnel->tunnel_id, in pppol2tp_seq_session_show()
1536 session->session_id, in pppol2tp_seq_session_show()
1537 tunnel->peer_tunnel_id, in pppol2tp_seq_session_show()
1538 session->peer_session_id, in pppol2tp_seq_session_show()
1541 session->recv_seq ? 'R' : '-', in pppol2tp_seq_session_show()
1542 session->send_seq ? 'S' : '-', in pppol2tp_seq_session_show()
1543 session->lns_mode ? "LNS" : "LAC", in pppol2tp_seq_session_show()
1545 jiffies_to_msecs(session->reorder_timeout)); in pppol2tp_seq_session_show()
1547 session->nr, session->ns, in pppol2tp_seq_session_show()
1548 atomic_long_read(&session->stats.tx_packets), in pppol2tp_seq_session_show()
1549 atomic_long_read(&session->stats.tx_bytes), in pppol2tp_seq_session_show()
1550 atomic_long_read(&session->stats.tx_errors), in pppol2tp_seq_session_show()
1551 atomic_long_read(&session->stats.rx_packets), in pppol2tp_seq_session_show()
1552 atomic_long_read(&session->stats.rx_bytes), in pppol2tp_seq_session_show()
1553 atomic_long_read(&session->stats.rx_errors)); in pppol2tp_seq_session_show()
1558 seq_printf(m, " interface %s\n", ppp_dev_name(&po->chan)); in pppol2tp_seq_session_show()
1570 seq_puts(m, "TUNNEL name, user-data-ok session-count\n"); in pppol2tp_seq_show()
1571 seq_puts(m, " debug tx-pkts/bytes/errs rx-pkts/bytes/errs\n"); in pppol2tp_seq_show()
1572 seq_puts(m, " SESSION name, addr/port src-tid/sid dest-tid/sid state user-data-ok\n"); in pppol2tp_seq_show()
1574 seq_puts(m, " nr/ns tx-pkts/bytes/errs rx-pkts/bytes/errs\n"); in pppol2tp_seq_show()
1578 if (!pd->session) in pppol2tp_seq_show()
1579 pppol2tp_seq_tunnel_show(m, pd->tunnel); in pppol2tp_seq_show()
1581 pppol2tp_seq_session_show(m, pd->session); in pppol2tp_seq_show()
1604 pde = proc_create_net("pppol2tp", 0444, net->proc_net, in pppol2tp_init_net()
1607 err = -ENOMEM; in pppol2tp_init_net()
1617 remove_proc_entry("pppol2tp", net->proc_net); in pppol2tp_exit_net()