Lines Matching +full:rx +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[].
143 sk = rcu_dereference(ps->sk); in pppol2tp_session_get_sock()
161 session = (struct l2tp_session *)(sk->sk_user_data); in pppol2tp_sock_to_session()
166 if (WARN_ON(session->magic != L2TP_SESSION_MAGIC)) { in pppol2tp_sock_to_session()
187 struct sock *sk = sock->sk; in pppol2tp_recvmsg()
189 err = -EIO; in pppol2tp_recvmsg()
190 if (sk->sk_state & PPPOX_BOUND) in pppol2tp_recvmsg()
199 if (len > skb->len) in pppol2tp_recvmsg()
200 len = skb->len; in pppol2tp_recvmsg()
201 else if (len < skb->len) in pppol2tp_recvmsg()
202 msg->msg_flags |= MSG_TRUNC; in pppol2tp_recvmsg()
222 sk = rcu_dereference(ps->sk); in pppol2tp_recv()
230 * constant: 0xFF is the All-Stations Address and 0x03 the Unnumbered in pppol2tp_recv()
233 if (pskb_may_pull(skb, 2) && skb->data[0] == PPP_ALLSTATIONS && in pppol2tp_recv()
234 skb->data[1] == PPP_UI) in pppol2tp_recv()
237 if (sk->sk_state & PPPOX_BOUND) { in pppol2tp_recv()
241 ppp_input(&po->chan, skb); in pppol2tp_recv()
244 atomic_long_inc(&session->stats.rx_errors); in pppol2tp_recv()
254 pr_warn_ratelimited("%s: no socket in recv\n", session->name); in pppol2tp_recv()
269 struct sock *sk = sock->sk; in pppol2tp_sendmsg()
276 error = -ENOTCONN; in pppol2tp_sendmsg()
277 if (sock_flag(sk, SOCK_DEAD) || !(sk->sk_state & PPPOX_CONNECTED)) in pppol2tp_sendmsg()
281 error = -EBADF; in pppol2tp_sendmsg()
286 tunnel = session->tunnel; in pppol2tp_sendmsg()
288 uhlen = (tunnel->encap == L2TP_ENCAPTYPE_UDP) ? sizeof(struct udphdr) : 0; in pppol2tp_sendmsg()
291 error = -ENOMEM; in pppol2tp_sendmsg()
293 uhlen + session->hdr_len + in pppol2tp_sendmsg()
307 skb->data[0] = PPP_ALLSTATIONS; in pppol2tp_sendmsg()
308 skb->data[1] = PPP_UI; in pppol2tp_sendmsg()
348 struct sock *sk = (struct sock *)chan->private; in pppol2tp_xmit()
353 if (sock_flag(sk, SOCK_DEAD) || !(sk->sk_state & PPPOX_CONNECTED)) in pppol2tp_xmit()
361 tunnel = session->tunnel; in pppol2tp_xmit()
363 uhlen = (tunnel->encap == L2TP_ENCAPTYPE_UDP) ? sizeof(struct udphdr) : 0; in pppol2tp_xmit()
367 session->hdr_len + /* L2TP header */ in pppol2tp_xmit()
374 skb->data[0] = PPP_ALLSTATIONS; in pppol2tp_xmit()
375 skb->data[1] = PPP_UI; in pppol2tp_xmit()
402 sock_put(ps->__sk); in pppol2tp_put_sk()
410 struct l2tp_session *session = sk->sk_user_data; in pppol2tp_session_destruct()
412 skb_queue_purge(&sk->sk_receive_queue); in pppol2tp_session_destruct()
413 skb_queue_purge(&sk->sk_write_queue); in pppol2tp_session_destruct()
416 sk->sk_user_data = NULL; in pppol2tp_session_destruct()
417 if (WARN_ON(session->magic != L2TP_SESSION_MAGIC)) in pppol2tp_session_destruct()
427 struct sock *sk = sock->sk; in pppol2tp_release()
434 error = -EBADF; in pppol2tp_release()
442 sk->sk_state = PPPOX_DEAD; in pppol2tp_release()
444 sock->sk = NULL; in pppol2tp_release()
453 mutex_lock(&ps->sk_lock); in pppol2tp_release()
454 ps->__sk = rcu_dereference_protected(ps->sk, in pppol2tp_release()
455 lockdep_is_held(&ps->sk_lock)); in pppol2tp_release()
456 RCU_INIT_POINTER(ps->sk, NULL); in pppol2tp_release()
457 mutex_unlock(&ps->sk_lock); in pppol2tp_release()
458 call_rcu(&ps->rcu, pppol2tp_put_sk); in pppol2tp_release()
502 int error = -ENOMEM; in pppol2tp_create()
511 sock->state = SS_UNCONNECTED; in pppol2tp_create()
512 sock->ops = &pppol2tp_ops; in pppol2tp_create()
514 sk->sk_backlog_rcv = pppol2tp_backlog_recv; in pppol2tp_create()
515 sk->sk_protocol = PX_PROTO_OL2TP; in pppol2tp_create()
516 sk->sk_family = PF_PPPOX; in pppol2tp_create()
517 sk->sk_state = PPPOX_NONE; in pppol2tp_create()
518 sk->sk_type = SOCK_STREAM; in pppol2tp_create()
519 sk->sk_destruct = pppol2tp_session_destruct; in pppol2tp_create()
536 seq_printf(m, " interface %s\n", ppp_dev_name(&po->chan)); in pppol2tp_show()
545 session->recv_skb = pppol2tp_recv; in pppol2tp_session_init()
547 session->show = pppol2tp_show; in pppol2tp_session_init()
550 mutex_init(&ps->sk_lock); in pppol2tp_session_init()
551 ps->owner = current->pid; in pppol2tp_session_init()
571 if (sa_v2in4->sa_protocol != PX_PROTO_OL2TP) in pppol2tp_sockaddr_get_info()
572 return -EINVAL; in pppol2tp_sockaddr_get_info()
574 info->version = 2; in pppol2tp_sockaddr_get_info()
575 info->fd = sa_v2in4->pppol2tp.fd; in pppol2tp_sockaddr_get_info()
576 info->tunnel_id = sa_v2in4->pppol2tp.s_tunnel; in pppol2tp_sockaddr_get_info()
577 info->peer_tunnel_id = sa_v2in4->pppol2tp.d_tunnel; in pppol2tp_sockaddr_get_info()
578 info->session_id = sa_v2in4->pppol2tp.s_session; in pppol2tp_sockaddr_get_info()
579 info->peer_session_id = sa_v2in4->pppol2tp.d_session; in pppol2tp_sockaddr_get_info()
587 if (sa_v3in4->sa_protocol != PX_PROTO_OL2TP) in pppol2tp_sockaddr_get_info()
588 return -EINVAL; in pppol2tp_sockaddr_get_info()
590 info->version = 3; in pppol2tp_sockaddr_get_info()
591 info->fd = sa_v3in4->pppol2tp.fd; in pppol2tp_sockaddr_get_info()
592 info->tunnel_id = sa_v3in4->pppol2tp.s_tunnel; in pppol2tp_sockaddr_get_info()
593 info->peer_tunnel_id = sa_v3in4->pppol2tp.d_tunnel; in pppol2tp_sockaddr_get_info()
594 info->session_id = sa_v3in4->pppol2tp.s_session; in pppol2tp_sockaddr_get_info()
595 info->peer_session_id = sa_v3in4->pppol2tp.d_session; in pppol2tp_sockaddr_get_info()
603 if (sa_v2in6->sa_protocol != PX_PROTO_OL2TP) in pppol2tp_sockaddr_get_info()
604 return -EINVAL; in pppol2tp_sockaddr_get_info()
606 info->version = 2; in pppol2tp_sockaddr_get_info()
607 info->fd = sa_v2in6->pppol2tp.fd; in pppol2tp_sockaddr_get_info()
608 info->tunnel_id = sa_v2in6->pppol2tp.s_tunnel; in pppol2tp_sockaddr_get_info()
609 info->peer_tunnel_id = sa_v2in6->pppol2tp.d_tunnel; in pppol2tp_sockaddr_get_info()
610 info->session_id = sa_v2in6->pppol2tp.s_session; in pppol2tp_sockaddr_get_info()
611 info->peer_session_id = sa_v2in6->pppol2tp.d_session; in pppol2tp_sockaddr_get_info()
619 if (sa_v3in6->sa_protocol != PX_PROTO_OL2TP) in pppol2tp_sockaddr_get_info()
620 return -EINVAL; in pppol2tp_sockaddr_get_info()
622 info->version = 3; in pppol2tp_sockaddr_get_info()
623 info->fd = sa_v3in6->pppol2tp.fd; in pppol2tp_sockaddr_get_info()
624 info->tunnel_id = sa_v3in6->pppol2tp.s_tunnel; in pppol2tp_sockaddr_get_info()
625 info->peer_tunnel_id = sa_v3in6->pppol2tp.d_tunnel; in pppol2tp_sockaddr_get_info()
626 info->session_id = sa_v3in6->pppol2tp.s_session; in pppol2tp_sockaddr_get_info()
627 info->peer_session_id = sa_v3in6->pppol2tp.d_session; in pppol2tp_sockaddr_get_info()
632 return -EINVAL; in pppol2tp_sockaddr_get_info()
649 return 1500 - PPPOL2TP_HEADER_OVERHEAD; in pppol2tp_tunnel_mtu()
651 return mtu - PPPOL2TP_HEADER_OVERHEAD; in pppol2tp_tunnel_mtu()
659 struct sock *sk = sock->sk; in pppol2tp_connect()
679 error = -EBUSY; in pppol2tp_connect()
680 if (sk->sk_state & PPPOX_CONNECTED) in pppol2tp_connect()
684 error = -EALREADY; in pppol2tp_connect()
685 if (sk->sk_user_data) in pppol2tp_connect()
689 error = -EINVAL; in pppol2tp_connect()
711 error = -EBADF; in pppol2tp_connect()
735 error = -ENOENT; in pppol2tp_connect()
740 if (!tunnel->sock) in pppol2tp_connect()
744 if (tunnel->peer_tunnel_id == 0) in pppol2tp_connect()
745 tunnel->peer_tunnel_id = info.peer_tunnel_id; in pppol2tp_connect()
751 if (session->pwtype != L2TP_PWTYPE_PPP) { in pppol2tp_connect()
752 error = -EPROTOTYPE; in pppol2tp_connect()
758 /* Using a pre-existing session is fine as long as it hasn't in pppol2tp_connect()
761 mutex_lock(&ps->sk_lock); in pppol2tp_connect()
762 if (rcu_dereference_protected(ps->sk, in pppol2tp_connect()
763 lockdep_is_held(&ps->sk_lock)) || in pppol2tp_connect()
764 ps->__sk) { in pppol2tp_connect()
765 mutex_unlock(&ps->sk_lock); in pppol2tp_connect()
766 error = -EEXIST; in pppol2tp_connect()
784 mutex_lock(&ps->sk_lock); in pppol2tp_connect()
787 mutex_unlock(&ps->sk_lock); in pppol2tp_connect()
800 if (session->session_id == 0 && session->peer_session_id == 0) { in pppol2tp_connect()
809 po->chan.hdrlen = PPPOL2TP_L2TP_HDR_SIZE_NOSEQ; in pppol2tp_connect()
811 po->chan.private = sk; in pppol2tp_connect()
812 po->chan.ops = &pppol2tp_chan_ops; in pppol2tp_connect()
813 po->chan.mtu = pppol2tp_tunnel_mtu(tunnel); in pppol2tp_connect()
815 error = ppp_register_net_channel(sock_net(sk), &po->chan); in pppol2tp_connect()
817 mutex_unlock(&ps->sk_lock); in pppol2tp_connect()
823 sk->sk_user_data = session; in pppol2tp_connect()
824 rcu_assign_pointer(ps->sk, sk); in pppol2tp_connect()
825 mutex_unlock(&ps->sk_lock); in pppol2tp_connect()
833 sk->sk_state = PPPOX_CONNECTED; in pppol2tp_connect()
862 if (!tunnel->sock) { in pppol2tp_session_create()
863 error = -ENOENT; in pppol2tp_session_create()
901 struct sock *sk = sock->sk; in pppol2tp_getname()
905 error = -ENOTCONN; in pppol2tp_getname()
908 if (!(sk->sk_state & PPPOX_CONNECTED)) in pppol2tp_getname()
911 error = -EBADF; in pppol2tp_getname()
917 tunnel = session->tunnel; in pppol2tp_getname()
919 inet = inet_sk(tunnel->sock); in pppol2tp_getname()
920 if (tunnel->version == 2 && tunnel->sock->sk_family == AF_INET) { in pppol2tp_getname()
921 struct sockaddr_pppol2tp sp; in pppol2tp_getname() local
923 len = sizeof(sp); in pppol2tp_getname()
924 memset(&sp, 0, len); in pppol2tp_getname()
925 sp.sa_family = AF_PPPOX; in pppol2tp_getname()
926 sp.sa_protocol = PX_PROTO_OL2TP; in pppol2tp_getname()
927 sp.pppol2tp.fd = tunnel->fd; in pppol2tp_getname()
928 sp.pppol2tp.pid = pls->owner; in pppol2tp_getname()
929 sp.pppol2tp.s_tunnel = tunnel->tunnel_id; in pppol2tp_getname()
930 sp.pppol2tp.d_tunnel = tunnel->peer_tunnel_id; in pppol2tp_getname()
931 sp.pppol2tp.s_session = session->session_id; in pppol2tp_getname()
932 sp.pppol2tp.d_session = session->peer_session_id; in pppol2tp_getname()
933 sp.pppol2tp.addr.sin_family = AF_INET; in pppol2tp_getname()
934 sp.pppol2tp.addr.sin_port = inet->inet_dport; in pppol2tp_getname()
935 sp.pppol2tp.addr.sin_addr.s_addr = inet->inet_daddr; in pppol2tp_getname()
936 memcpy(uaddr, &sp, len); in pppol2tp_getname()
938 } else if (tunnel->version == 2 && tunnel->sock->sk_family == AF_INET6) { in pppol2tp_getname()
939 struct sockaddr_pppol2tpin6 sp; in pppol2tp_getname() local
941 len = sizeof(sp); in pppol2tp_getname()
942 memset(&sp, 0, len); in pppol2tp_getname()
943 sp.sa_family = AF_PPPOX; in pppol2tp_getname()
944 sp.sa_protocol = PX_PROTO_OL2TP; in pppol2tp_getname()
945 sp.pppol2tp.fd = tunnel->fd; in pppol2tp_getname()
946 sp.pppol2tp.pid = pls->owner; in pppol2tp_getname()
947 sp.pppol2tp.s_tunnel = tunnel->tunnel_id; in pppol2tp_getname()
948 sp.pppol2tp.d_tunnel = tunnel->peer_tunnel_id; in pppol2tp_getname()
949 sp.pppol2tp.s_session = session->session_id; in pppol2tp_getname()
950 sp.pppol2tp.d_session = session->peer_session_id; in pppol2tp_getname()
951 sp.pppol2tp.addr.sin6_family = AF_INET6; in pppol2tp_getname()
952 sp.pppol2tp.addr.sin6_port = inet->inet_dport; in pppol2tp_getname()
953 memcpy(&sp.pppol2tp.addr.sin6_addr, &tunnel->sock->sk_v6_daddr, in pppol2tp_getname()
954 sizeof(tunnel->sock->sk_v6_daddr)); in pppol2tp_getname()
955 memcpy(uaddr, &sp, len); in pppol2tp_getname()
956 } else if (tunnel->version == 3 && tunnel->sock->sk_family == AF_INET6) { in pppol2tp_getname()
957 struct sockaddr_pppol2tpv3in6 sp; in pppol2tp_getname() local
959 len = sizeof(sp); in pppol2tp_getname()
960 memset(&sp, 0, len); in pppol2tp_getname()
961 sp.sa_family = AF_PPPOX; in pppol2tp_getname()
962 sp.sa_protocol = PX_PROTO_OL2TP; in pppol2tp_getname()
963 sp.pppol2tp.fd = tunnel->fd; in pppol2tp_getname()
964 sp.pppol2tp.pid = pls->owner; in pppol2tp_getname()
965 sp.pppol2tp.s_tunnel = tunnel->tunnel_id; in pppol2tp_getname()
966 sp.pppol2tp.d_tunnel = tunnel->peer_tunnel_id; in pppol2tp_getname()
967 sp.pppol2tp.s_session = session->session_id; in pppol2tp_getname()
968 sp.pppol2tp.d_session = session->peer_session_id; in pppol2tp_getname()
969 sp.pppol2tp.addr.sin6_family = AF_INET6; in pppol2tp_getname()
970 sp.pppol2tp.addr.sin6_port = inet->inet_dport; in pppol2tp_getname()
971 memcpy(&sp.pppol2tp.addr.sin6_addr, &tunnel->sock->sk_v6_daddr, in pppol2tp_getname()
972 sizeof(tunnel->sock->sk_v6_daddr)); in pppol2tp_getname()
973 memcpy(uaddr, &sp, len); in pppol2tp_getname()
975 } else if (tunnel->version == 3) { in pppol2tp_getname()
976 struct sockaddr_pppol2tpv3 sp; in pppol2tp_getname() local
978 len = sizeof(sp); in pppol2tp_getname()
979 memset(&sp, 0, len); in pppol2tp_getname()
980 sp.sa_family = AF_PPPOX; in pppol2tp_getname()
981 sp.sa_protocol = PX_PROTO_OL2TP; in pppol2tp_getname()
982 sp.pppol2tp.fd = tunnel->fd; in pppol2tp_getname()
983 sp.pppol2tp.pid = pls->owner; in pppol2tp_getname()
984 sp.pppol2tp.s_tunnel = tunnel->tunnel_id; in pppol2tp_getname()
985 sp.pppol2tp.d_tunnel = tunnel->peer_tunnel_id; in pppol2tp_getname()
986 sp.pppol2tp.s_session = session->session_id; in pppol2tp_getname()
987 sp.pppol2tp.d_session = session->peer_session_id; in pppol2tp_getname()
988 sp.pppol2tp.addr.sin_family = AF_INET; in pppol2tp_getname()
989 sp.pppol2tp.addr.sin_port = inet->inet_dport; in pppol2tp_getname()
990 sp.pppol2tp.addr.sin_addr.s_addr = inet->inet_daddr; in pppol2tp_getname()
991 memcpy(uaddr, &sp, len); in pppol2tp_getname()
1017 dest->tx_packets = atomic_long_read(&stats->tx_packets); in pppol2tp_copy_stats()
1018 dest->tx_bytes = atomic_long_read(&stats->tx_bytes); in pppol2tp_copy_stats()
1019 dest->tx_errors = atomic_long_read(&stats->tx_errors); in pppol2tp_copy_stats()
1020 dest->rx_packets = atomic_long_read(&stats->rx_packets); in pppol2tp_copy_stats()
1021 dest->rx_bytes = atomic_long_read(&stats->rx_bytes); in pppol2tp_copy_stats()
1022 dest->rx_seq_discards = atomic_long_read(&stats->rx_seq_discards); in pppol2tp_copy_stats()
1023 dest->rx_oos_packets = atomic_long_read(&stats->rx_oos_packets); in pppol2tp_copy_stats()
1024 dest->rx_errors = atomic_long_read(&stats->rx_errors); in pppol2tp_copy_stats()
1032 if (!stats->session_id) { in pppol2tp_tunnel_copy_stats()
1033 pppol2tp_copy_stats(stats, &tunnel->stats); in pppol2tp_tunnel_copy_stats()
1040 session = l2tp_tunnel_get_session(tunnel, stats->session_id); in pppol2tp_tunnel_copy_stats()
1042 return -EBADR; in pppol2tp_tunnel_copy_stats()
1044 if (session->pwtype != L2TP_PWTYPE_PPP) { in pppol2tp_tunnel_copy_stats()
1046 return -EBADR; in pppol2tp_tunnel_copy_stats()
1049 pppol2tp_copy_stats(stats, &session->stats); in pppol2tp_tunnel_copy_stats()
1064 session = sock->sk->sk_user_data; in pppol2tp_ioctl()
1066 return -ENOTCONN; in pppol2tp_ioctl()
1068 if (WARN_ON(session->magic != L2TP_SESSION_MAGIC)) in pppol2tp_ioctl()
1069 return -EBADF; in pppol2tp_ioctl()
1072 if (!session->session_id && !session->peer_session_id) in pppol2tp_ioctl()
1073 return -ENOSYS; in pppol2tp_ioctl()
1076 return -EFAULT; in pppol2tp_ioctl()
1081 session = sock->sk->sk_user_data; in pppol2tp_ioctl()
1083 return -ENOTCONN; in pppol2tp_ioctl()
1085 if (WARN_ON(session->magic != L2TP_SESSION_MAGIC)) in pppol2tp_ioctl()
1086 return -EBADF; in pppol2tp_ioctl()
1089 if (!session->session_id && !session->peer_session_id) in pppol2tp_ioctl()
1090 return -ENOSYS; in pppol2tp_ioctl()
1093 return -EFAULT; in pppol2tp_ioctl()
1097 session = sock->sk->sk_user_data; in pppol2tp_ioctl()
1099 return -ENOTCONN; in pppol2tp_ioctl()
1101 if (WARN_ON(session->magic != L2TP_SESSION_MAGIC)) in pppol2tp_ioctl()
1102 return -EBADF; in pppol2tp_ioctl()
1105 if (!session->session_id && !session->peer_session_id) { in pppol2tp_ioctl()
1111 return -EFAULT; in pppol2tp_ioctl()
1115 session->tunnel); in pppol2tp_ioctl()
1121 pppol2tp_copy_stats(&stats, &session->stats); in pppol2tp_ioctl()
1122 stats.session_id = session->session_id; in pppol2tp_ioctl()
1124 stats.tunnel_id = session->tunnel->tunnel_id; in pppol2tp_ioctl()
1125 stats.using_ipsec = l2tp_tunnel_uses_xfrm(session->tunnel); in pppol2tp_ioctl()
1128 return -EFAULT; in pppol2tp_ioctl()
1132 return -ENOIOCTLCMD; in pppol2tp_ioctl()
1162 err = -ENOPROTOOPT; in pppol2tp_tunnel_setsockopt()
1180 err = -EINVAL; in pppol2tp_session_setsockopt()
1183 session->recv_seq = !!val; in pppol2tp_session_setsockopt()
1188 err = -EINVAL; in pppol2tp_session_setsockopt()
1191 session->send_seq = !!val; in pppol2tp_session_setsockopt()
1195 po->chan.hdrlen = val ? PPPOL2TP_L2TP_HDR_SIZE_SEQ : in pppol2tp_session_setsockopt()
1198 l2tp_session_set_header_len(session, session->tunnel->version); in pppol2tp_session_setsockopt()
1203 err = -EINVAL; in pppol2tp_session_setsockopt()
1206 session->lns_mode = !!val; in pppol2tp_session_setsockopt()
1214 session->reorder_timeout = msecs_to_jiffies(val); in pppol2tp_session_setsockopt()
1218 err = -ENOPROTOOPT; in pppol2tp_session_setsockopt()
1233 struct sock *sk = sock->sk; in pppol2tp_setsockopt()
1240 return -EINVAL; in pppol2tp_setsockopt()
1243 return -EINVAL; in pppol2tp_setsockopt()
1246 return -EFAULT; in pppol2tp_setsockopt()
1248 err = -ENOTCONN; in pppol2tp_setsockopt()
1249 if (!sk->sk_user_data) in pppol2tp_setsockopt()
1253 err = -EBADF; in pppol2tp_setsockopt()
1260 if (session->session_id == 0 && session->peer_session_id == 0) { in pppol2tp_setsockopt()
1261 tunnel = session->tunnel; in pppol2tp_setsockopt()
1287 err = -ENOPROTOOPT; in pppol2tp_tunnel_getsockopt()
1304 *val = session->recv_seq; in pppol2tp_session_getsockopt()
1308 *val = session->send_seq; in pppol2tp_session_getsockopt()
1312 *val = session->lns_mode; in pppol2tp_session_getsockopt()
1321 *val = (int)jiffies_to_msecs(session->reorder_timeout); in pppol2tp_session_getsockopt()
1325 err = -ENOPROTOOPT; in pppol2tp_session_getsockopt()
1339 struct sock *sk = sock->sk; in pppol2tp_getsockopt()
1346 return -EINVAL; in pppol2tp_getsockopt()
1349 return -EFAULT; in pppol2tp_getsockopt()
1354 return -EINVAL; in pppol2tp_getsockopt()
1356 err = -ENOTCONN; in pppol2tp_getsockopt()
1357 if (!sk->sk_user_data) in pppol2tp_getsockopt()
1361 err = -EBADF; in pppol2tp_getsockopt()
1367 if (session->session_id == 0 && session->peer_session_id == 0) { in pppol2tp_getsockopt()
1368 tunnel = session->tunnel; in pppol2tp_getsockopt()
1378 err = -EFAULT; in pppol2tp_getsockopt()
1414 if (pd->tunnel) in pppol2tp_next_tunnel()
1415 l2tp_tunnel_dec_refcount(pd->tunnel); in pppol2tp_next_tunnel()
1418 pd->tunnel = l2tp_tunnel_get_nth(net, pd->tunnel_idx); in pppol2tp_next_tunnel()
1419 pd->tunnel_idx++; in pppol2tp_next_tunnel()
1422 if (!pd->tunnel || pd->tunnel->version == 2) in pppol2tp_next_tunnel()
1425 l2tp_tunnel_dec_refcount(pd->tunnel); in pppol2tp_next_tunnel()
1432 if (pd->session) in pppol2tp_next_session()
1433 l2tp_session_dec_refcount(pd->session); in pppol2tp_next_session()
1435 pd->session = l2tp_session_get_nth(pd->tunnel, pd->session_idx); in pppol2tp_next_session()
1436 pd->session_idx++; in pppol2tp_next_session()
1438 if (!pd->session) { in pppol2tp_next_session()
1439 pd->session_idx = 0; in pppol2tp_next_session()
1453 if (WARN_ON(!m->private)) { in pppol2tp_seq_start()
1458 pd = m->private; in pppol2tp_seq_start()
1461 if (!pd->tunnel) in pppol2tp_seq_start()
1467 if (!pd->tunnel && !pd->session) in pppol2tp_seq_start()
1490 if (pd->session) { in pppol2tp_seq_stop()
1491 l2tp_session_dec_refcount(pd->session); in pppol2tp_seq_stop()
1492 pd->session = NULL; in pppol2tp_seq_stop()
1494 if (pd->tunnel) { in pppol2tp_seq_stop()
1495 l2tp_tunnel_dec_refcount(pd->tunnel); in pppol2tp_seq_stop()
1496 pd->tunnel = NULL; in pppol2tp_seq_stop()
1505 tunnel->name, in pppol2tp_seq_tunnel_show()
1506 (tunnel == tunnel->sock->sk_user_data) ? 'Y' : 'N', in pppol2tp_seq_tunnel_show()
1507 refcount_read(&tunnel->ref_count) - 1); in pppol2tp_seq_tunnel_show()
1510 atomic_long_read(&tunnel->stats.tx_packets), in pppol2tp_seq_tunnel_show()
1511 atomic_long_read(&tunnel->stats.tx_bytes), in pppol2tp_seq_tunnel_show()
1512 atomic_long_read(&tunnel->stats.tx_errors), in pppol2tp_seq_tunnel_show()
1513 atomic_long_read(&tunnel->stats.rx_packets), in pppol2tp_seq_tunnel_show()
1514 atomic_long_read(&tunnel->stats.rx_bytes), in pppol2tp_seq_tunnel_show()
1515 atomic_long_read(&tunnel->stats.rx_errors)); in pppol2tp_seq_tunnel_show()
1521 struct l2tp_tunnel *tunnel = session->tunnel; in pppol2tp_seq_session_show()
1528 if (tunnel->sock) { in pppol2tp_seq_session_show()
1529 struct inet_sock *inet = inet_sk(tunnel->sock); in pppol2tp_seq_session_show()
1531 ip = ntohl(inet->inet_saddr); in pppol2tp_seq_session_show()
1532 port = ntohs(inet->inet_sport); in pppol2tp_seq_session_show()
1537 state = sk->sk_state; in pppol2tp_seq_session_show()
1538 user_data_ok = (session == sk->sk_user_data) ? 'Y' : 'N'; in pppol2tp_seq_session_show()
1544 seq_printf(m, " SESSION '%s' %08X/%d %04X/%04X -> %04X/%04X %d %c\n", in pppol2tp_seq_session_show()
1545 session->name, ip, port, in pppol2tp_seq_session_show()
1546 tunnel->tunnel_id, in pppol2tp_seq_session_show()
1547 session->session_id, in pppol2tp_seq_session_show()
1548 tunnel->peer_tunnel_id, in pppol2tp_seq_session_show()
1549 session->peer_session_id, in pppol2tp_seq_session_show()
1552 session->recv_seq ? 'R' : '-', in pppol2tp_seq_session_show()
1553 session->send_seq ? 'S' : '-', in pppol2tp_seq_session_show()
1554 session->lns_mode ? "LNS" : "LAC", in pppol2tp_seq_session_show()
1556 jiffies_to_msecs(session->reorder_timeout)); in pppol2tp_seq_session_show()
1558 session->nr, session->ns, in pppol2tp_seq_session_show()
1559 atomic_long_read(&session->stats.tx_packets), in pppol2tp_seq_session_show()
1560 atomic_long_read(&session->stats.tx_bytes), in pppol2tp_seq_session_show()
1561 atomic_long_read(&session->stats.tx_errors), in pppol2tp_seq_session_show()
1562 atomic_long_read(&session->stats.rx_packets), in pppol2tp_seq_session_show()
1563 atomic_long_read(&session->stats.rx_bytes), in pppol2tp_seq_session_show()
1564 atomic_long_read(&session->stats.rx_errors)); in pppol2tp_seq_session_show()
1569 seq_printf(m, " interface %s\n", ppp_dev_name(&po->chan)); in pppol2tp_seq_session_show()
1581 seq_puts(m, "TUNNEL name, user-data-ok session-count\n"); in pppol2tp_seq_show()
1582 seq_puts(m, " debug tx-pkts/bytes/errs rx-pkts/bytes/errs\n"); in pppol2tp_seq_show()
1583 seq_puts(m, " SESSION name, addr/port src-tid/sid dest-tid/sid state user-data-ok\n"); in pppol2tp_seq_show()
1585 seq_puts(m, " nr/ns tx-pkts/bytes/errs rx-pkts/bytes/errs\n"); in pppol2tp_seq_show()
1589 if (!pd->session) in pppol2tp_seq_show()
1590 pppol2tp_seq_tunnel_show(m, pd->tunnel); in pppol2tp_seq_show()
1592 pppol2tp_seq_session_show(m, pd->session); in pppol2tp_seq_show()
1615 pde = proc_create_net("pppol2tp", 0444, net->proc_net, in pppol2tp_init_net()
1618 err = -ENOMEM; in pppol2tp_init_net()
1628 remove_proc_entry("pppol2tp", net->proc_net); in pppol2tp_exit_net()