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()
662 tunnel = l2tp_tunnel_get(net, info->tunnel_id); in pppol2tp_tunnel_get()
668 if (!info->session_id && !info->peer_session_id) { in pppol2tp_tunnel_get()
677 if (info->fd < 0) in pppol2tp_tunnel_get()
678 return ERR_PTR(-EBADF); in pppol2tp_tunnel_get()
680 error = l2tp_tunnel_create(info->fd, in pppol2tp_tunnel_get()
681 info->version, in pppol2tp_tunnel_get()
682 info->tunnel_id, in pppol2tp_tunnel_get()
683 info->peer_tunnel_id, &tcfg, in pppol2tp_tunnel_get()
700 return ERR_PTR(-ENOENT); in pppol2tp_tunnel_get()
703 if (!tunnel->sock) { in pppol2tp_tunnel_get()
705 return ERR_PTR(-ENOENT); in pppol2tp_tunnel_get()
717 struct sock *sk = sock->sk; in pppol2tp_connect()
735 return -EINVAL; in pppol2tp_connect()
744 error = -EBUSY; in pppol2tp_connect()
745 if (sk->sk_state & PPPOX_CONNECTED) in pppol2tp_connect()
749 error = -EALREADY; in pppol2tp_connect()
750 if (sk->sk_user_data) in pppol2tp_connect()
753 if (tunnel->peer_tunnel_id == 0) in pppol2tp_connect()
754 tunnel->peer_tunnel_id = info.peer_tunnel_id; in pppol2tp_connect()
760 if (session->pwtype != L2TP_PWTYPE_PPP) { in pppol2tp_connect()
761 error = -EPROTOTYPE; in pppol2tp_connect()
767 /* Using a pre-existing session is fine as long as it hasn't in pppol2tp_connect()
770 mutex_lock(&ps->sk_lock); in pppol2tp_connect()
771 if (rcu_dereference_protected(ps->sk, in pppol2tp_connect()
772 lockdep_is_held(&ps->sk_lock)) || in pppol2tp_connect()
773 ps->__sk) { in pppol2tp_connect()
774 mutex_unlock(&ps->sk_lock); in pppol2tp_connect()
775 error = -EEXIST; in pppol2tp_connect()
793 mutex_lock(&ps->sk_lock); in pppol2tp_connect()
796 mutex_unlock(&ps->sk_lock); in pppol2tp_connect()
809 if (session->session_id == 0 && session->peer_session_id == 0) { in pppol2tp_connect()
818 po->chan.hdrlen = PPPOL2TP_L2TP_HDR_SIZE_NOSEQ; in pppol2tp_connect()
820 po->chan.private = sk; in pppol2tp_connect()
821 po->chan.ops = &pppol2tp_chan_ops; in pppol2tp_connect()
822 po->chan.mtu = pppol2tp_tunnel_mtu(tunnel); in pppol2tp_connect()
824 error = ppp_register_net_channel(sock_net(sk), &po->chan); in pppol2tp_connect()
826 mutex_unlock(&ps->sk_lock); in pppol2tp_connect()
832 sk->sk_user_data = session; in pppol2tp_connect()
833 rcu_assign_pointer(ps->sk, sk); in pppol2tp_connect()
834 mutex_unlock(&ps->sk_lock); in pppol2tp_connect()
842 sk->sk_state = PPPOX_CONNECTED; in pppol2tp_connect()
870 if (!tunnel->sock) { in pppol2tp_session_create()
871 error = -ENOENT; in pppol2tp_session_create()
909 struct sock *sk = sock->sk; in pppol2tp_getname()
913 error = -ENOTCONN; in pppol2tp_getname()
916 if (!(sk->sk_state & PPPOX_CONNECTED)) in pppol2tp_getname()
919 error = -EBADF; in pppol2tp_getname()
925 tunnel = session->tunnel; in pppol2tp_getname()
927 inet = inet_sk(tunnel->sock); in pppol2tp_getname()
928 if (tunnel->version == 2 && tunnel->sock->sk_family == AF_INET) { in pppol2tp_getname()
929 struct sockaddr_pppol2tp sp; in pppol2tp_getname() local
931 len = sizeof(sp); in pppol2tp_getname()
932 memset(&sp, 0, len); in pppol2tp_getname()
933 sp.sa_family = AF_PPPOX; in pppol2tp_getname()
934 sp.sa_protocol = PX_PROTO_OL2TP; in pppol2tp_getname()
935 sp.pppol2tp.fd = tunnel->fd; in pppol2tp_getname()
936 sp.pppol2tp.pid = pls->owner; in pppol2tp_getname()
937 sp.pppol2tp.s_tunnel = tunnel->tunnel_id; in pppol2tp_getname()
938 sp.pppol2tp.d_tunnel = tunnel->peer_tunnel_id; in pppol2tp_getname()
939 sp.pppol2tp.s_session = session->session_id; in pppol2tp_getname()
940 sp.pppol2tp.d_session = session->peer_session_id; in pppol2tp_getname()
941 sp.pppol2tp.addr.sin_family = AF_INET; in pppol2tp_getname()
942 sp.pppol2tp.addr.sin_port = inet->inet_dport; in pppol2tp_getname()
943 sp.pppol2tp.addr.sin_addr.s_addr = inet->inet_daddr; in pppol2tp_getname()
944 memcpy(uaddr, &sp, len); in pppol2tp_getname()
946 } else if (tunnel->version == 2 && tunnel->sock->sk_family == AF_INET6) { in pppol2tp_getname()
947 struct sockaddr_pppol2tpin6 sp; in pppol2tp_getname() local
949 len = sizeof(sp); in pppol2tp_getname()
950 memset(&sp, 0, len); in pppol2tp_getname()
951 sp.sa_family = AF_PPPOX; in pppol2tp_getname()
952 sp.sa_protocol = PX_PROTO_OL2TP; in pppol2tp_getname()
953 sp.pppol2tp.fd = tunnel->fd; in pppol2tp_getname()
954 sp.pppol2tp.pid = pls->owner; in pppol2tp_getname()
955 sp.pppol2tp.s_tunnel = tunnel->tunnel_id; in pppol2tp_getname()
956 sp.pppol2tp.d_tunnel = tunnel->peer_tunnel_id; in pppol2tp_getname()
957 sp.pppol2tp.s_session = session->session_id; in pppol2tp_getname()
958 sp.pppol2tp.d_session = session->peer_session_id; in pppol2tp_getname()
959 sp.pppol2tp.addr.sin6_family = AF_INET6; in pppol2tp_getname()
960 sp.pppol2tp.addr.sin6_port = inet->inet_dport; in pppol2tp_getname()
961 memcpy(&sp.pppol2tp.addr.sin6_addr, &tunnel->sock->sk_v6_daddr, in pppol2tp_getname()
962 sizeof(tunnel->sock->sk_v6_daddr)); in pppol2tp_getname()
963 memcpy(uaddr, &sp, len); in pppol2tp_getname()
964 } else if (tunnel->version == 3 && tunnel->sock->sk_family == AF_INET6) { in pppol2tp_getname()
965 struct sockaddr_pppol2tpv3in6 sp; in pppol2tp_getname() local
967 len = sizeof(sp); in pppol2tp_getname()
968 memset(&sp, 0, len); in pppol2tp_getname()
969 sp.sa_family = AF_PPPOX; in pppol2tp_getname()
970 sp.sa_protocol = PX_PROTO_OL2TP; in pppol2tp_getname()
971 sp.pppol2tp.fd = tunnel->fd; in pppol2tp_getname()
972 sp.pppol2tp.pid = pls->owner; in pppol2tp_getname()
973 sp.pppol2tp.s_tunnel = tunnel->tunnel_id; in pppol2tp_getname()
974 sp.pppol2tp.d_tunnel = tunnel->peer_tunnel_id; in pppol2tp_getname()
975 sp.pppol2tp.s_session = session->session_id; in pppol2tp_getname()
976 sp.pppol2tp.d_session = session->peer_session_id; in pppol2tp_getname()
977 sp.pppol2tp.addr.sin6_family = AF_INET6; in pppol2tp_getname()
978 sp.pppol2tp.addr.sin6_port = inet->inet_dport; in pppol2tp_getname()
979 memcpy(&sp.pppol2tp.addr.sin6_addr, &tunnel->sock->sk_v6_daddr, in pppol2tp_getname()
980 sizeof(tunnel->sock->sk_v6_daddr)); in pppol2tp_getname()
981 memcpy(uaddr, &sp, len); in pppol2tp_getname()
983 } else if (tunnel->version == 3) { in pppol2tp_getname()
984 struct sockaddr_pppol2tpv3 sp; in pppol2tp_getname() local
986 len = sizeof(sp); in pppol2tp_getname()
987 memset(&sp, 0, len); in pppol2tp_getname()
988 sp.sa_family = AF_PPPOX; in pppol2tp_getname()
989 sp.sa_protocol = PX_PROTO_OL2TP; in pppol2tp_getname()
990 sp.pppol2tp.fd = tunnel->fd; in pppol2tp_getname()
991 sp.pppol2tp.pid = pls->owner; in pppol2tp_getname()
992 sp.pppol2tp.s_tunnel = tunnel->tunnel_id; in pppol2tp_getname()
993 sp.pppol2tp.d_tunnel = tunnel->peer_tunnel_id; in pppol2tp_getname()
994 sp.pppol2tp.s_session = session->session_id; in pppol2tp_getname()
995 sp.pppol2tp.d_session = session->peer_session_id; in pppol2tp_getname()
996 sp.pppol2tp.addr.sin_family = AF_INET; in pppol2tp_getname()
997 sp.pppol2tp.addr.sin_port = inet->inet_dport; in pppol2tp_getname()
998 sp.pppol2tp.addr.sin_addr.s_addr = inet->inet_daddr; in pppol2tp_getname()
999 memcpy(uaddr, &sp, len); in pppol2tp_getname()
1025 dest->tx_packets = atomic_long_read(&stats->tx_packets); in pppol2tp_copy_stats()
1026 dest->tx_bytes = atomic_long_read(&stats->tx_bytes); in pppol2tp_copy_stats()
1027 dest->tx_errors = atomic_long_read(&stats->tx_errors); in pppol2tp_copy_stats()
1028 dest->rx_packets = atomic_long_read(&stats->rx_packets); in pppol2tp_copy_stats()
1029 dest->rx_bytes = atomic_long_read(&stats->rx_bytes); in pppol2tp_copy_stats()
1030 dest->rx_seq_discards = atomic_long_read(&stats->rx_seq_discards); in pppol2tp_copy_stats()
1031 dest->rx_oos_packets = atomic_long_read(&stats->rx_oos_packets); in pppol2tp_copy_stats()
1032 dest->rx_errors = atomic_long_read(&stats->rx_errors); in pppol2tp_copy_stats()
1040 if (!stats->session_id) { in pppol2tp_tunnel_copy_stats()
1041 pppol2tp_copy_stats(stats, &tunnel->stats); in pppol2tp_tunnel_copy_stats()
1048 session = l2tp_tunnel_get_session(tunnel, stats->session_id); in pppol2tp_tunnel_copy_stats()
1050 return -EBADR; in pppol2tp_tunnel_copy_stats()
1052 if (session->pwtype != L2TP_PWTYPE_PPP) { in pppol2tp_tunnel_copy_stats()
1054 return -EBADR; in pppol2tp_tunnel_copy_stats()
1057 pppol2tp_copy_stats(stats, &session->stats); in pppol2tp_tunnel_copy_stats()
1072 session = sock->sk->sk_user_data; in pppol2tp_ioctl()
1074 return -ENOTCONN; in pppol2tp_ioctl()
1076 if (WARN_ON(session->magic != L2TP_SESSION_MAGIC)) in pppol2tp_ioctl()
1077 return -EBADF; in pppol2tp_ioctl()
1080 if (!session->session_id && !session->peer_session_id) in pppol2tp_ioctl()
1081 return -ENOSYS; in pppol2tp_ioctl()
1084 return -EFAULT; in pppol2tp_ioctl()
1089 session = sock->sk->sk_user_data; in pppol2tp_ioctl()
1091 return -ENOTCONN; in pppol2tp_ioctl()
1093 if (WARN_ON(session->magic != L2TP_SESSION_MAGIC)) in pppol2tp_ioctl()
1094 return -EBADF; in pppol2tp_ioctl()
1097 if (!session->session_id && !session->peer_session_id) in pppol2tp_ioctl()
1098 return -ENOSYS; in pppol2tp_ioctl()
1101 return -EFAULT; in pppol2tp_ioctl()
1105 session = sock->sk->sk_user_data; in pppol2tp_ioctl()
1107 return -ENOTCONN; in pppol2tp_ioctl()
1109 if (WARN_ON(session->magic != L2TP_SESSION_MAGIC)) in pppol2tp_ioctl()
1110 return -EBADF; in pppol2tp_ioctl()
1113 if (!session->session_id && !session->peer_session_id) { in pppol2tp_ioctl()
1119 return -EFAULT; in pppol2tp_ioctl()
1123 session->tunnel); in pppol2tp_ioctl()
1129 pppol2tp_copy_stats(&stats, &session->stats); in pppol2tp_ioctl()
1130 stats.session_id = session->session_id; in pppol2tp_ioctl()
1132 stats.tunnel_id = session->tunnel->tunnel_id; in pppol2tp_ioctl()
1133 stats.using_ipsec = l2tp_tunnel_uses_xfrm(session->tunnel); in pppol2tp_ioctl()
1136 return -EFAULT; in pppol2tp_ioctl()
1140 return -ENOIOCTLCMD; in pppol2tp_ioctl()
1170 err = -ENOPROTOOPT; in pppol2tp_tunnel_setsockopt()
1188 err = -EINVAL; in pppol2tp_session_setsockopt()
1191 session->recv_seq = !!val; in pppol2tp_session_setsockopt()
1196 err = -EINVAL; in pppol2tp_session_setsockopt()
1199 session->send_seq = !!val; in pppol2tp_session_setsockopt()
1203 po->chan.hdrlen = val ? PPPOL2TP_L2TP_HDR_SIZE_SEQ : in pppol2tp_session_setsockopt()
1206 l2tp_session_set_header_len(session, session->tunnel->version); in pppol2tp_session_setsockopt()
1211 err = -EINVAL; in pppol2tp_session_setsockopt()
1214 session->lns_mode = !!val; in pppol2tp_session_setsockopt()
1222 session->reorder_timeout = msecs_to_jiffies(val); in pppol2tp_session_setsockopt()
1226 err = -ENOPROTOOPT; in pppol2tp_session_setsockopt()
1241 struct sock *sk = sock->sk; in pppol2tp_setsockopt()
1248 return -EINVAL; in pppol2tp_setsockopt()
1251 return -EINVAL; in pppol2tp_setsockopt()
1254 return -EFAULT; in pppol2tp_setsockopt()
1256 err = -ENOTCONN; in pppol2tp_setsockopt()
1257 if (!sk->sk_user_data) in pppol2tp_setsockopt()
1261 err = -EBADF; in pppol2tp_setsockopt()
1268 if (session->session_id == 0 && session->peer_session_id == 0) { in pppol2tp_setsockopt()
1269 tunnel = session->tunnel; in pppol2tp_setsockopt()
1295 err = -ENOPROTOOPT; in pppol2tp_tunnel_getsockopt()
1312 *val = session->recv_seq; in pppol2tp_session_getsockopt()
1316 *val = session->send_seq; in pppol2tp_session_getsockopt()
1320 *val = session->lns_mode; in pppol2tp_session_getsockopt()
1329 *val = (int)jiffies_to_msecs(session->reorder_timeout); in pppol2tp_session_getsockopt()
1333 err = -ENOPROTOOPT; in pppol2tp_session_getsockopt()
1347 struct sock *sk = sock->sk; in pppol2tp_getsockopt()
1354 return -EINVAL; in pppol2tp_getsockopt()
1357 return -EFAULT; in pppol2tp_getsockopt()
1362 return -EINVAL; in pppol2tp_getsockopt()
1364 err = -ENOTCONN; in pppol2tp_getsockopt()
1365 if (!sk->sk_user_data) in pppol2tp_getsockopt()
1369 err = -EBADF; in pppol2tp_getsockopt()
1375 if (session->session_id == 0 && session->peer_session_id == 0) { in pppol2tp_getsockopt()
1376 tunnel = session->tunnel; in pppol2tp_getsockopt()
1386 err = -EFAULT; in pppol2tp_getsockopt()
1422 if (pd->tunnel) in pppol2tp_next_tunnel()
1423 l2tp_tunnel_dec_refcount(pd->tunnel); in pppol2tp_next_tunnel()
1426 pd->tunnel = l2tp_tunnel_get_nth(net, pd->tunnel_idx); in pppol2tp_next_tunnel()
1427 pd->tunnel_idx++; in pppol2tp_next_tunnel()
1430 if (!pd->tunnel || pd->tunnel->version == 2) in pppol2tp_next_tunnel()
1433 l2tp_tunnel_dec_refcount(pd->tunnel); in pppol2tp_next_tunnel()
1440 if (pd->session) in pppol2tp_next_session()
1441 l2tp_session_dec_refcount(pd->session); in pppol2tp_next_session()
1443 pd->session = l2tp_session_get_nth(pd->tunnel, pd->session_idx); in pppol2tp_next_session()
1444 pd->session_idx++; in pppol2tp_next_session()
1446 if (!pd->session) { in pppol2tp_next_session()
1447 pd->session_idx = 0; in pppol2tp_next_session()
1461 if (WARN_ON(!m->private)) { in pppol2tp_seq_start()
1466 pd = m->private; in pppol2tp_seq_start()
1469 if (!pd->tunnel) in pppol2tp_seq_start()
1475 if (!pd->tunnel && !pd->session) in pppol2tp_seq_start()
1498 if (pd->session) { in pppol2tp_seq_stop()
1499 l2tp_session_dec_refcount(pd->session); in pppol2tp_seq_stop()
1500 pd->session = NULL; in pppol2tp_seq_stop()
1502 if (pd->tunnel) { in pppol2tp_seq_stop()
1503 l2tp_tunnel_dec_refcount(pd->tunnel); in pppol2tp_seq_stop()
1504 pd->tunnel = NULL; in pppol2tp_seq_stop()
1513 tunnel->name, in pppol2tp_seq_tunnel_show()
1514 (tunnel == tunnel->sock->sk_user_data) ? 'Y' : 'N', in pppol2tp_seq_tunnel_show()
1515 refcount_read(&tunnel->ref_count) - 1); in pppol2tp_seq_tunnel_show()
1518 atomic_long_read(&tunnel->stats.tx_packets), in pppol2tp_seq_tunnel_show()
1519 atomic_long_read(&tunnel->stats.tx_bytes), in pppol2tp_seq_tunnel_show()
1520 atomic_long_read(&tunnel->stats.tx_errors), in pppol2tp_seq_tunnel_show()
1521 atomic_long_read(&tunnel->stats.rx_packets), in pppol2tp_seq_tunnel_show()
1522 atomic_long_read(&tunnel->stats.rx_bytes), in pppol2tp_seq_tunnel_show()
1523 atomic_long_read(&tunnel->stats.rx_errors)); in pppol2tp_seq_tunnel_show()
1529 struct l2tp_tunnel *tunnel = session->tunnel; in pppol2tp_seq_session_show()
1536 if (tunnel->sock) { in pppol2tp_seq_session_show()
1537 struct inet_sock *inet = inet_sk(tunnel->sock); in pppol2tp_seq_session_show()
1539 ip = ntohl(inet->inet_saddr); in pppol2tp_seq_session_show()
1540 port = ntohs(inet->inet_sport); in pppol2tp_seq_session_show()
1545 state = sk->sk_state; in pppol2tp_seq_session_show()
1546 user_data_ok = (session == sk->sk_user_data) ? 'Y' : 'N'; in pppol2tp_seq_session_show()
1552 seq_printf(m, " SESSION '%s' %08X/%d %04X/%04X -> %04X/%04X %d %c\n", in pppol2tp_seq_session_show()
1553 session->name, ip, port, in pppol2tp_seq_session_show()
1554 tunnel->tunnel_id, in pppol2tp_seq_session_show()
1555 session->session_id, in pppol2tp_seq_session_show()
1556 tunnel->peer_tunnel_id, in pppol2tp_seq_session_show()
1557 session->peer_session_id, in pppol2tp_seq_session_show()
1560 session->recv_seq ? 'R' : '-', in pppol2tp_seq_session_show()
1561 session->send_seq ? 'S' : '-', in pppol2tp_seq_session_show()
1562 session->lns_mode ? "LNS" : "LAC", in pppol2tp_seq_session_show()
1564 jiffies_to_msecs(session->reorder_timeout)); in pppol2tp_seq_session_show()
1566 session->nr, session->ns, in pppol2tp_seq_session_show()
1567 atomic_long_read(&session->stats.tx_packets), in pppol2tp_seq_session_show()
1568 atomic_long_read(&session->stats.tx_bytes), in pppol2tp_seq_session_show()
1569 atomic_long_read(&session->stats.tx_errors), in pppol2tp_seq_session_show()
1570 atomic_long_read(&session->stats.rx_packets), in pppol2tp_seq_session_show()
1571 atomic_long_read(&session->stats.rx_bytes), in pppol2tp_seq_session_show()
1572 atomic_long_read(&session->stats.rx_errors)); in pppol2tp_seq_session_show()
1577 seq_printf(m, " interface %s\n", ppp_dev_name(&po->chan)); in pppol2tp_seq_session_show()
1589 seq_puts(m, "TUNNEL name, user-data-ok session-count\n"); in pppol2tp_seq_show()
1590 seq_puts(m, " debug tx-pkts/bytes/errs rx-pkts/bytes/errs\n"); in pppol2tp_seq_show()
1591 seq_puts(m, " SESSION name, addr/port src-tid/sid dest-tid/sid state user-data-ok\n"); in pppol2tp_seq_show()
1593 seq_puts(m, " nr/ns tx-pkts/bytes/errs rx-pkts/bytes/errs\n"); in pppol2tp_seq_show()
1597 if (!pd->session) in pppol2tp_seq_show()
1598 pppol2tp_seq_tunnel_show(m, pd->tunnel); in pppol2tp_seq_show()
1600 pppol2tp_seq_session_show(m, pd->session); in pppol2tp_seq_show()
1623 pde = proc_create_net("pppol2tp", 0444, net->proc_net, in pppol2tp_init_net()
1626 err = -ENOMEM; in pppol2tp_init_net()
1636 remove_proc_entry("pppol2tp", net->proc_net); in pppol2tp_exit_net()