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()
198 if (len > skb->len) in pppol2tp_recvmsg()
199 len = skb->len; in pppol2tp_recvmsg()
200 else if (len < skb->len) in pppol2tp_recvmsg()
201 msg->msg_flags |= MSG_TRUNC; in pppol2tp_recvmsg()
221 sk = rcu_dereference(ps->sk); in pppol2tp_recv()
229 * constant: 0xFF is the All-Stations Address and 0x03 the Unnumbered in pppol2tp_recv()
232 if (pskb_may_pull(skb, 2) && skb->data[0] == PPP_ALLSTATIONS && in pppol2tp_recv()
233 skb->data[1] == PPP_UI) in pppol2tp_recv()
236 if (sk->sk_state & PPPOX_BOUND) { in pppol2tp_recv()
240 ppp_input(&po->chan, skb); in pppol2tp_recv()
243 atomic_long_inc(&session->stats.rx_errors); in pppol2tp_recv()
253 pr_warn_ratelimited("%s: no socket in recv\n", session->name); in pppol2tp_recv()
268 struct sock *sk = sock->sk; in pppol2tp_sendmsg()
275 error = -ENOTCONN; in pppol2tp_sendmsg()
276 if (sock_flag(sk, SOCK_DEAD) || !(sk->sk_state & PPPOX_CONNECTED)) in pppol2tp_sendmsg()
280 error = -EBADF; in pppol2tp_sendmsg()
285 tunnel = session->tunnel; in pppol2tp_sendmsg()
287 uhlen = (tunnel->encap == L2TP_ENCAPTYPE_UDP) ? sizeof(struct udphdr) : 0; in pppol2tp_sendmsg()
290 error = -ENOMEM; in pppol2tp_sendmsg()
292 uhlen + session->hdr_len + in pppol2tp_sendmsg()
306 skb->data[0] = PPP_ALLSTATIONS; in pppol2tp_sendmsg()
307 skb->data[1] = PPP_UI; in pppol2tp_sendmsg()
347 struct sock *sk = (struct sock *)chan->private; in pppol2tp_xmit()
352 if (sock_flag(sk, SOCK_DEAD) || !(sk->sk_state & PPPOX_CONNECTED)) in pppol2tp_xmit()
360 tunnel = session->tunnel; in pppol2tp_xmit()
362 uhlen = (tunnel->encap == L2TP_ENCAPTYPE_UDP) ? sizeof(struct udphdr) : 0; in pppol2tp_xmit()
366 session->hdr_len + /* L2TP header */ in pppol2tp_xmit()
373 skb->data[0] = PPP_ALLSTATIONS; in pppol2tp_xmit()
374 skb->data[1] = PPP_UI; in pppol2tp_xmit()
401 sock_put(ps->__sk); in pppol2tp_put_sk()
409 struct l2tp_session *session = sk->sk_user_data; in pppol2tp_session_destruct()
411 skb_queue_purge(&sk->sk_receive_queue); in pppol2tp_session_destruct()
412 skb_queue_purge(&sk->sk_write_queue); in pppol2tp_session_destruct()
415 sk->sk_user_data = NULL; in pppol2tp_session_destruct()
416 if (WARN_ON(session->magic != L2TP_SESSION_MAGIC)) in pppol2tp_session_destruct()
426 struct sock *sk = sock->sk; in pppol2tp_release()
433 error = -EBADF; in pppol2tp_release()
441 sk->sk_state = PPPOX_DEAD; in pppol2tp_release()
443 sock->sk = NULL; in pppol2tp_release()
452 mutex_lock(&ps->sk_lock); in pppol2tp_release()
453 ps->__sk = rcu_dereference_protected(ps->sk, in pppol2tp_release()
454 lockdep_is_held(&ps->sk_lock)); in pppol2tp_release()
455 RCU_INIT_POINTER(ps->sk, NULL); in pppol2tp_release()
456 mutex_unlock(&ps->sk_lock); in pppol2tp_release()
457 call_rcu(&ps->rcu, pppol2tp_put_sk); in pppol2tp_release()
501 int error = -ENOMEM; in pppol2tp_create()
510 sock->state = SS_UNCONNECTED; in pppol2tp_create()
511 sock->ops = &pppol2tp_ops; in pppol2tp_create()
513 sk->sk_backlog_rcv = pppol2tp_backlog_recv; in pppol2tp_create()
514 sk->sk_protocol = PX_PROTO_OL2TP; in pppol2tp_create()
515 sk->sk_family = PF_PPPOX; in pppol2tp_create()
516 sk->sk_state = PPPOX_NONE; in pppol2tp_create()
517 sk->sk_type = SOCK_STREAM; in pppol2tp_create()
518 sk->sk_destruct = pppol2tp_session_destruct; in pppol2tp_create()
535 seq_printf(m, " interface %s\n", ppp_dev_name(&po->chan)); in pppol2tp_show()
544 session->recv_skb = pppol2tp_recv; in pppol2tp_session_init()
546 session->show = pppol2tp_show; in pppol2tp_session_init()
549 mutex_init(&ps->sk_lock); in pppol2tp_session_init()
550 ps->owner = current->pid; in pppol2tp_session_init()
570 if (sa_v2in4->sa_protocol != PX_PROTO_OL2TP) in pppol2tp_sockaddr_get_info()
571 return -EINVAL; in pppol2tp_sockaddr_get_info()
573 info->version = 2; in pppol2tp_sockaddr_get_info()
574 info->fd = sa_v2in4->pppol2tp.fd; in pppol2tp_sockaddr_get_info()
575 info->tunnel_id = sa_v2in4->pppol2tp.s_tunnel; in pppol2tp_sockaddr_get_info()
576 info->peer_tunnel_id = sa_v2in4->pppol2tp.d_tunnel; in pppol2tp_sockaddr_get_info()
577 info->session_id = sa_v2in4->pppol2tp.s_session; in pppol2tp_sockaddr_get_info()
578 info->peer_session_id = sa_v2in4->pppol2tp.d_session; in pppol2tp_sockaddr_get_info()
586 if (sa_v3in4->sa_protocol != PX_PROTO_OL2TP) in pppol2tp_sockaddr_get_info()
587 return -EINVAL; in pppol2tp_sockaddr_get_info()
589 info->version = 3; in pppol2tp_sockaddr_get_info()
590 info->fd = sa_v3in4->pppol2tp.fd; in pppol2tp_sockaddr_get_info()
591 info->tunnel_id = sa_v3in4->pppol2tp.s_tunnel; in pppol2tp_sockaddr_get_info()
592 info->peer_tunnel_id = sa_v3in4->pppol2tp.d_tunnel; in pppol2tp_sockaddr_get_info()
593 info->session_id = sa_v3in4->pppol2tp.s_session; in pppol2tp_sockaddr_get_info()
594 info->peer_session_id = sa_v3in4->pppol2tp.d_session; in pppol2tp_sockaddr_get_info()
602 if (sa_v2in6->sa_protocol != PX_PROTO_OL2TP) in pppol2tp_sockaddr_get_info()
603 return -EINVAL; in pppol2tp_sockaddr_get_info()
605 info->version = 2; in pppol2tp_sockaddr_get_info()
606 info->fd = sa_v2in6->pppol2tp.fd; in pppol2tp_sockaddr_get_info()
607 info->tunnel_id = sa_v2in6->pppol2tp.s_tunnel; in pppol2tp_sockaddr_get_info()
608 info->peer_tunnel_id = sa_v2in6->pppol2tp.d_tunnel; in pppol2tp_sockaddr_get_info()
609 info->session_id = sa_v2in6->pppol2tp.s_session; in pppol2tp_sockaddr_get_info()
610 info->peer_session_id = sa_v2in6->pppol2tp.d_session; in pppol2tp_sockaddr_get_info()
618 if (sa_v3in6->sa_protocol != PX_PROTO_OL2TP) in pppol2tp_sockaddr_get_info()
619 return -EINVAL; in pppol2tp_sockaddr_get_info()
621 info->version = 3; in pppol2tp_sockaddr_get_info()
622 info->fd = sa_v3in6->pppol2tp.fd; in pppol2tp_sockaddr_get_info()
623 info->tunnel_id = sa_v3in6->pppol2tp.s_tunnel; in pppol2tp_sockaddr_get_info()
624 info->peer_tunnel_id = sa_v3in6->pppol2tp.d_tunnel; in pppol2tp_sockaddr_get_info()
625 info->session_id = sa_v3in6->pppol2tp.s_session; in pppol2tp_sockaddr_get_info()
626 info->peer_session_id = sa_v3in6->pppol2tp.d_session; in pppol2tp_sockaddr_get_info()
631 return -EINVAL; in pppol2tp_sockaddr_get_info()
648 return 1500 - PPPOL2TP_HEADER_OVERHEAD; in pppol2tp_tunnel_mtu()
650 return mtu - PPPOL2TP_HEADER_OVERHEAD; in pppol2tp_tunnel_mtu()
658 struct sock *sk = sock->sk; in pppol2tp_connect()
678 error = -EBUSY; in pppol2tp_connect()
679 if (sk->sk_state & PPPOX_CONNECTED) in pppol2tp_connect()
683 error = -EALREADY; in pppol2tp_connect()
684 if (sk->sk_user_data) in pppol2tp_connect()
688 error = -EINVAL; in pppol2tp_connect()
710 error = -EBADF; in pppol2tp_connect()
734 error = -ENOENT; in pppol2tp_connect()
739 if (!tunnel->sock) in pppol2tp_connect()
743 if (tunnel->peer_tunnel_id == 0) in pppol2tp_connect()
744 tunnel->peer_tunnel_id = info.peer_tunnel_id; in pppol2tp_connect()
750 if (session->pwtype != L2TP_PWTYPE_PPP) { in pppol2tp_connect()
751 error = -EPROTOTYPE; in pppol2tp_connect()
757 /* Using a pre-existing session is fine as long as it hasn't in pppol2tp_connect()
760 mutex_lock(&ps->sk_lock); in pppol2tp_connect()
761 if (rcu_dereference_protected(ps->sk, in pppol2tp_connect()
762 lockdep_is_held(&ps->sk_lock)) || in pppol2tp_connect()
763 ps->__sk) { in pppol2tp_connect()
764 mutex_unlock(&ps->sk_lock); in pppol2tp_connect()
765 error = -EEXIST; in pppol2tp_connect()
783 mutex_lock(&ps->sk_lock); in pppol2tp_connect()
786 mutex_unlock(&ps->sk_lock); in pppol2tp_connect()
799 if (session->session_id == 0 && session->peer_session_id == 0) { in pppol2tp_connect()
808 po->chan.hdrlen = PPPOL2TP_L2TP_HDR_SIZE_NOSEQ; in pppol2tp_connect()
810 po->chan.private = sk; in pppol2tp_connect()
811 po->chan.ops = &pppol2tp_chan_ops; in pppol2tp_connect()
812 po->chan.mtu = pppol2tp_tunnel_mtu(tunnel); in pppol2tp_connect()
814 error = ppp_register_net_channel(sock_net(sk), &po->chan); in pppol2tp_connect()
816 mutex_unlock(&ps->sk_lock); in pppol2tp_connect()
822 sk->sk_user_data = session; in pppol2tp_connect()
823 rcu_assign_pointer(ps->sk, sk); in pppol2tp_connect()
824 mutex_unlock(&ps->sk_lock); in pppol2tp_connect()
832 sk->sk_state = PPPOX_CONNECTED; in pppol2tp_connect()
861 if (!tunnel->sock) { in pppol2tp_session_create()
862 error = -ENOENT; in pppol2tp_session_create()
900 struct sock *sk = sock->sk; in pppol2tp_getname()
904 error = -ENOTCONN; in pppol2tp_getname()
907 if (!(sk->sk_state & PPPOX_CONNECTED)) in pppol2tp_getname()
910 error = -EBADF; in pppol2tp_getname()
916 tunnel = session->tunnel; in pppol2tp_getname()
918 inet = inet_sk(tunnel->sock); in pppol2tp_getname()
919 if (tunnel->version == 2 && tunnel->sock->sk_family == AF_INET) { in pppol2tp_getname()
920 struct sockaddr_pppol2tp sp; in pppol2tp_getname() local
922 len = sizeof(sp); in pppol2tp_getname()
923 memset(&sp, 0, len); in pppol2tp_getname()
924 sp.sa_family = AF_PPPOX; in pppol2tp_getname()
925 sp.sa_protocol = PX_PROTO_OL2TP; in pppol2tp_getname()
926 sp.pppol2tp.fd = tunnel->fd; in pppol2tp_getname()
927 sp.pppol2tp.pid = pls->owner; in pppol2tp_getname()
928 sp.pppol2tp.s_tunnel = tunnel->tunnel_id; in pppol2tp_getname()
929 sp.pppol2tp.d_tunnel = tunnel->peer_tunnel_id; in pppol2tp_getname()
930 sp.pppol2tp.s_session = session->session_id; in pppol2tp_getname()
931 sp.pppol2tp.d_session = session->peer_session_id; in pppol2tp_getname()
932 sp.pppol2tp.addr.sin_family = AF_INET; in pppol2tp_getname()
933 sp.pppol2tp.addr.sin_port = inet->inet_dport; in pppol2tp_getname()
934 sp.pppol2tp.addr.sin_addr.s_addr = inet->inet_daddr; in pppol2tp_getname()
935 memcpy(uaddr, &sp, len); in pppol2tp_getname()
937 } else if (tunnel->version == 2 && tunnel->sock->sk_family == AF_INET6) { in pppol2tp_getname()
938 struct sockaddr_pppol2tpin6 sp; in pppol2tp_getname() local
940 len = sizeof(sp); in pppol2tp_getname()
941 memset(&sp, 0, len); in pppol2tp_getname()
942 sp.sa_family = AF_PPPOX; in pppol2tp_getname()
943 sp.sa_protocol = PX_PROTO_OL2TP; in pppol2tp_getname()
944 sp.pppol2tp.fd = tunnel->fd; in pppol2tp_getname()
945 sp.pppol2tp.pid = pls->owner; in pppol2tp_getname()
946 sp.pppol2tp.s_tunnel = tunnel->tunnel_id; in pppol2tp_getname()
947 sp.pppol2tp.d_tunnel = tunnel->peer_tunnel_id; in pppol2tp_getname()
948 sp.pppol2tp.s_session = session->session_id; in pppol2tp_getname()
949 sp.pppol2tp.d_session = session->peer_session_id; in pppol2tp_getname()
950 sp.pppol2tp.addr.sin6_family = AF_INET6; in pppol2tp_getname()
951 sp.pppol2tp.addr.sin6_port = inet->inet_dport; in pppol2tp_getname()
952 memcpy(&sp.pppol2tp.addr.sin6_addr, &tunnel->sock->sk_v6_daddr, in pppol2tp_getname()
953 sizeof(tunnel->sock->sk_v6_daddr)); in pppol2tp_getname()
954 memcpy(uaddr, &sp, len); in pppol2tp_getname()
955 } else if (tunnel->version == 3 && tunnel->sock->sk_family == AF_INET6) { in pppol2tp_getname()
956 struct sockaddr_pppol2tpv3in6 sp; in pppol2tp_getname() local
958 len = sizeof(sp); in pppol2tp_getname()
959 memset(&sp, 0, len); in pppol2tp_getname()
960 sp.sa_family = AF_PPPOX; in pppol2tp_getname()
961 sp.sa_protocol = PX_PROTO_OL2TP; in pppol2tp_getname()
962 sp.pppol2tp.fd = tunnel->fd; in pppol2tp_getname()
963 sp.pppol2tp.pid = pls->owner; in pppol2tp_getname()
964 sp.pppol2tp.s_tunnel = tunnel->tunnel_id; in pppol2tp_getname()
965 sp.pppol2tp.d_tunnel = tunnel->peer_tunnel_id; in pppol2tp_getname()
966 sp.pppol2tp.s_session = session->session_id; in pppol2tp_getname()
967 sp.pppol2tp.d_session = session->peer_session_id; in pppol2tp_getname()
968 sp.pppol2tp.addr.sin6_family = AF_INET6; in pppol2tp_getname()
969 sp.pppol2tp.addr.sin6_port = inet->inet_dport; in pppol2tp_getname()
970 memcpy(&sp.pppol2tp.addr.sin6_addr, &tunnel->sock->sk_v6_daddr, in pppol2tp_getname()
971 sizeof(tunnel->sock->sk_v6_daddr)); in pppol2tp_getname()
972 memcpy(uaddr, &sp, len); in pppol2tp_getname()
974 } else if (tunnel->version == 3) { in pppol2tp_getname()
975 struct sockaddr_pppol2tpv3 sp; in pppol2tp_getname() local
977 len = sizeof(sp); in pppol2tp_getname()
978 memset(&sp, 0, len); in pppol2tp_getname()
979 sp.sa_family = AF_PPPOX; in pppol2tp_getname()
980 sp.sa_protocol = PX_PROTO_OL2TP; in pppol2tp_getname()
981 sp.pppol2tp.fd = tunnel->fd; in pppol2tp_getname()
982 sp.pppol2tp.pid = pls->owner; in pppol2tp_getname()
983 sp.pppol2tp.s_tunnel = tunnel->tunnel_id; in pppol2tp_getname()
984 sp.pppol2tp.d_tunnel = tunnel->peer_tunnel_id; in pppol2tp_getname()
985 sp.pppol2tp.s_session = session->session_id; in pppol2tp_getname()
986 sp.pppol2tp.d_session = session->peer_session_id; in pppol2tp_getname()
987 sp.pppol2tp.addr.sin_family = AF_INET; in pppol2tp_getname()
988 sp.pppol2tp.addr.sin_port = inet->inet_dport; in pppol2tp_getname()
989 sp.pppol2tp.addr.sin_addr.s_addr = inet->inet_daddr; in pppol2tp_getname()
990 memcpy(uaddr, &sp, len); in pppol2tp_getname()
1016 dest->tx_packets = atomic_long_read(&stats->tx_packets); in pppol2tp_copy_stats()
1017 dest->tx_bytes = atomic_long_read(&stats->tx_bytes); in pppol2tp_copy_stats()
1018 dest->tx_errors = atomic_long_read(&stats->tx_errors); in pppol2tp_copy_stats()
1019 dest->rx_packets = atomic_long_read(&stats->rx_packets); in pppol2tp_copy_stats()
1020 dest->rx_bytes = atomic_long_read(&stats->rx_bytes); in pppol2tp_copy_stats()
1021 dest->rx_seq_discards = atomic_long_read(&stats->rx_seq_discards); in pppol2tp_copy_stats()
1022 dest->rx_oos_packets = atomic_long_read(&stats->rx_oos_packets); in pppol2tp_copy_stats()
1023 dest->rx_errors = atomic_long_read(&stats->rx_errors); in pppol2tp_copy_stats()
1031 if (!stats->session_id) { in pppol2tp_tunnel_copy_stats()
1032 pppol2tp_copy_stats(stats, &tunnel->stats); in pppol2tp_tunnel_copy_stats()
1039 session = l2tp_tunnel_get_session(tunnel, stats->session_id); in pppol2tp_tunnel_copy_stats()
1041 return -EBADR; in pppol2tp_tunnel_copy_stats()
1043 if (session->pwtype != L2TP_PWTYPE_PPP) { in pppol2tp_tunnel_copy_stats()
1045 return -EBADR; in pppol2tp_tunnel_copy_stats()
1048 pppol2tp_copy_stats(stats, &session->stats); in pppol2tp_tunnel_copy_stats()
1063 session = sock->sk->sk_user_data; in pppol2tp_ioctl()
1065 return -ENOTCONN; in pppol2tp_ioctl()
1067 if (WARN_ON(session->magic != L2TP_SESSION_MAGIC)) in pppol2tp_ioctl()
1068 return -EBADF; in pppol2tp_ioctl()
1071 if (!session->session_id && !session->peer_session_id) in pppol2tp_ioctl()
1072 return -ENOSYS; in pppol2tp_ioctl()
1075 return -EFAULT; in pppol2tp_ioctl()
1080 session = sock->sk->sk_user_data; in pppol2tp_ioctl()
1082 return -ENOTCONN; in pppol2tp_ioctl()
1084 if (WARN_ON(session->magic != L2TP_SESSION_MAGIC)) in pppol2tp_ioctl()
1085 return -EBADF; in pppol2tp_ioctl()
1088 if (!session->session_id && !session->peer_session_id) in pppol2tp_ioctl()
1089 return -ENOSYS; in pppol2tp_ioctl()
1092 return -EFAULT; in pppol2tp_ioctl()
1096 session = sock->sk->sk_user_data; in pppol2tp_ioctl()
1098 return -ENOTCONN; in pppol2tp_ioctl()
1100 if (WARN_ON(session->magic != L2TP_SESSION_MAGIC)) in pppol2tp_ioctl()
1101 return -EBADF; in pppol2tp_ioctl()
1104 if (!session->session_id && !session->peer_session_id) { in pppol2tp_ioctl()
1110 return -EFAULT; in pppol2tp_ioctl()
1114 session->tunnel); in pppol2tp_ioctl()
1120 pppol2tp_copy_stats(&stats, &session->stats); in pppol2tp_ioctl()
1121 stats.session_id = session->session_id; in pppol2tp_ioctl()
1123 stats.tunnel_id = session->tunnel->tunnel_id; in pppol2tp_ioctl()
1124 stats.using_ipsec = l2tp_tunnel_uses_xfrm(session->tunnel); in pppol2tp_ioctl()
1127 return -EFAULT; in pppol2tp_ioctl()
1131 return -ENOIOCTLCMD; in pppol2tp_ioctl()
1161 err = -ENOPROTOOPT; in pppol2tp_tunnel_setsockopt()
1179 err = -EINVAL; in pppol2tp_session_setsockopt()
1182 session->recv_seq = !!val; in pppol2tp_session_setsockopt()
1187 err = -EINVAL; in pppol2tp_session_setsockopt()
1190 session->send_seq = !!val; in pppol2tp_session_setsockopt()
1194 po->chan.hdrlen = val ? PPPOL2TP_L2TP_HDR_SIZE_SEQ : in pppol2tp_session_setsockopt()
1197 l2tp_session_set_header_len(session, session->tunnel->version); in pppol2tp_session_setsockopt()
1202 err = -EINVAL; in pppol2tp_session_setsockopt()
1205 session->lns_mode = !!val; in pppol2tp_session_setsockopt()
1213 session->reorder_timeout = msecs_to_jiffies(val); in pppol2tp_session_setsockopt()
1217 err = -ENOPROTOOPT; in pppol2tp_session_setsockopt()
1232 struct sock *sk = sock->sk; in pppol2tp_setsockopt()
1239 return -EINVAL; in pppol2tp_setsockopt()
1242 return -EINVAL; in pppol2tp_setsockopt()
1245 return -EFAULT; in pppol2tp_setsockopt()
1247 err = -ENOTCONN; in pppol2tp_setsockopt()
1248 if (!sk->sk_user_data) in pppol2tp_setsockopt()
1252 err = -EBADF; in pppol2tp_setsockopt()
1259 if (session->session_id == 0 && session->peer_session_id == 0) { in pppol2tp_setsockopt()
1260 tunnel = session->tunnel; in pppol2tp_setsockopt()
1286 err = -ENOPROTOOPT; in pppol2tp_tunnel_getsockopt()
1303 *val = session->recv_seq; in pppol2tp_session_getsockopt()
1307 *val = session->send_seq; in pppol2tp_session_getsockopt()
1311 *val = session->lns_mode; in pppol2tp_session_getsockopt()
1320 *val = (int)jiffies_to_msecs(session->reorder_timeout); in pppol2tp_session_getsockopt()
1324 err = -ENOPROTOOPT; in pppol2tp_session_getsockopt()
1338 struct sock *sk = sock->sk; in pppol2tp_getsockopt()
1345 return -EINVAL; in pppol2tp_getsockopt()
1348 return -EFAULT; in pppol2tp_getsockopt()
1353 return -EINVAL; in pppol2tp_getsockopt()
1355 err = -ENOTCONN; in pppol2tp_getsockopt()
1356 if (!sk->sk_user_data) in pppol2tp_getsockopt()
1360 err = -EBADF; in pppol2tp_getsockopt()
1366 if (session->session_id == 0 && session->peer_session_id == 0) { in pppol2tp_getsockopt()
1367 tunnel = session->tunnel; in pppol2tp_getsockopt()
1377 err = -EFAULT; in pppol2tp_getsockopt()
1413 if (pd->tunnel) in pppol2tp_next_tunnel()
1414 l2tp_tunnel_dec_refcount(pd->tunnel); in pppol2tp_next_tunnel()
1417 pd->tunnel = l2tp_tunnel_get_nth(net, pd->tunnel_idx); in pppol2tp_next_tunnel()
1418 pd->tunnel_idx++; in pppol2tp_next_tunnel()
1421 if (!pd->tunnel || pd->tunnel->version == 2) in pppol2tp_next_tunnel()
1424 l2tp_tunnel_dec_refcount(pd->tunnel); in pppol2tp_next_tunnel()
1431 if (pd->session) in pppol2tp_next_session()
1432 l2tp_session_dec_refcount(pd->session); in pppol2tp_next_session()
1434 pd->session = l2tp_session_get_nth(pd->tunnel, pd->session_idx); in pppol2tp_next_session()
1435 pd->session_idx++; in pppol2tp_next_session()
1437 if (!pd->session) { in pppol2tp_next_session()
1438 pd->session_idx = 0; in pppol2tp_next_session()
1452 if (WARN_ON(!m->private)) { in pppol2tp_seq_start()
1457 pd = m->private; in pppol2tp_seq_start()
1460 if (!pd->tunnel) in pppol2tp_seq_start()
1466 if (!pd->tunnel && !pd->session) in pppol2tp_seq_start()
1489 if (pd->session) { in pppol2tp_seq_stop()
1490 l2tp_session_dec_refcount(pd->session); in pppol2tp_seq_stop()
1491 pd->session = NULL; in pppol2tp_seq_stop()
1493 if (pd->tunnel) { in pppol2tp_seq_stop()
1494 l2tp_tunnel_dec_refcount(pd->tunnel); in pppol2tp_seq_stop()
1495 pd->tunnel = NULL; in pppol2tp_seq_stop()
1504 tunnel->name, in pppol2tp_seq_tunnel_show()
1505 (tunnel == tunnel->sock->sk_user_data) ? 'Y' : 'N', in pppol2tp_seq_tunnel_show()
1506 refcount_read(&tunnel->ref_count) - 1); in pppol2tp_seq_tunnel_show()
1509 atomic_long_read(&tunnel->stats.tx_packets), in pppol2tp_seq_tunnel_show()
1510 atomic_long_read(&tunnel->stats.tx_bytes), in pppol2tp_seq_tunnel_show()
1511 atomic_long_read(&tunnel->stats.tx_errors), in pppol2tp_seq_tunnel_show()
1512 atomic_long_read(&tunnel->stats.rx_packets), in pppol2tp_seq_tunnel_show()
1513 atomic_long_read(&tunnel->stats.rx_bytes), in pppol2tp_seq_tunnel_show()
1514 atomic_long_read(&tunnel->stats.rx_errors)); in pppol2tp_seq_tunnel_show()
1520 struct l2tp_tunnel *tunnel = session->tunnel; in pppol2tp_seq_session_show()
1527 if (tunnel->sock) { in pppol2tp_seq_session_show()
1528 struct inet_sock *inet = inet_sk(tunnel->sock); in pppol2tp_seq_session_show()
1530 ip = ntohl(inet->inet_saddr); in pppol2tp_seq_session_show()
1531 port = ntohs(inet->inet_sport); in pppol2tp_seq_session_show()
1536 state = sk->sk_state; in pppol2tp_seq_session_show()
1537 user_data_ok = (session == sk->sk_user_data) ? 'Y' : 'N'; in pppol2tp_seq_session_show()
1543 seq_printf(m, " SESSION '%s' %08X/%d %04X/%04X -> %04X/%04X %d %c\n", in pppol2tp_seq_session_show()
1544 session->name, ip, port, in pppol2tp_seq_session_show()
1545 tunnel->tunnel_id, in pppol2tp_seq_session_show()
1546 session->session_id, in pppol2tp_seq_session_show()
1547 tunnel->peer_tunnel_id, in pppol2tp_seq_session_show()
1548 session->peer_session_id, in pppol2tp_seq_session_show()
1551 session->recv_seq ? 'R' : '-', in pppol2tp_seq_session_show()
1552 session->send_seq ? 'S' : '-', in pppol2tp_seq_session_show()
1553 session->lns_mode ? "LNS" : "LAC", in pppol2tp_seq_session_show()
1555 jiffies_to_msecs(session->reorder_timeout)); in pppol2tp_seq_session_show()
1557 session->nr, session->ns, in pppol2tp_seq_session_show()
1558 atomic_long_read(&session->stats.tx_packets), in pppol2tp_seq_session_show()
1559 atomic_long_read(&session->stats.tx_bytes), in pppol2tp_seq_session_show()
1560 atomic_long_read(&session->stats.tx_errors), in pppol2tp_seq_session_show()
1561 atomic_long_read(&session->stats.rx_packets), in pppol2tp_seq_session_show()
1562 atomic_long_read(&session->stats.rx_bytes), in pppol2tp_seq_session_show()
1563 atomic_long_read(&session->stats.rx_errors)); in pppol2tp_seq_session_show()
1568 seq_printf(m, " interface %s\n", ppp_dev_name(&po->chan)); in pppol2tp_seq_session_show()
1580 seq_puts(m, "TUNNEL name, user-data-ok session-count\n"); in pppol2tp_seq_show()
1581 seq_puts(m, " debug tx-pkts/bytes/errs rx-pkts/bytes/errs\n"); in pppol2tp_seq_show()
1582 seq_puts(m, " SESSION name, addr/port src-tid/sid dest-tid/sid state user-data-ok\n"); in pppol2tp_seq_show()
1584 seq_puts(m, " nr/ns tx-pkts/bytes/errs rx-pkts/bytes/errs\n"); in pppol2tp_seq_show()
1588 if (!pd->session) in pppol2tp_seq_show()
1589 pppol2tp_seq_tunnel_show(m, pd->tunnel); in pppol2tp_seq_show()
1591 pppol2tp_seq_session_show(m, pd->session); in pppol2tp_seq_show()
1614 pde = proc_create_net("pppol2tp", 0444, net->proc_net, in pppol2tp_init_net()
1617 err = -ENOMEM; in pppol2tp_init_net()
1627 remove_proc_entry("pppol2tp", net->proc_net); in pppol2tp_exit_net()