25 #include <linux/kernel.h>
26 #include <linux/slab.h>
27 #include <linux/socket.h>
30 #include <asm/ioctls.h>
32 #include <linux/phonet.h>
33 #include <linux/module.h>
51 #define CREDITS_MAX 10
54 #define pep_sb_size(s) (((s) + 5) & ~3)
67 ph = skb_header_pointer(skb, 0, 2, &h);
68 if (
ph ==
NULL ||
ph->sb_len < 2 || !pskb_may_pull(skb,
ph->sb_len))
74 if (buflen >
ph->sb_len)
76 data = skb_header_pointer(skb, 2, buflen, buf);
77 __skb_pull(skb, 2 +
ph->sb_len);
87 skb_set_owner_w(skb, sk);
91 skb_copy_to_linear_data(skb, payload, len);
92 __skb_push(skb,
sizeof(
struct pnpipehdr));
93 skb_reset_transport_header(skb);
98 const void *
data,
int len,
gfp_t priority)
100 const struct pnpipehdr *oph = pnp_hdr(oskb);
105 skb = pep_alloc_skb(sk, data, len, priority);
115 pn_skb_get_src_sockaddr(oskb, &peer);
119 static int pep_indicate(
struct sock *sk,
u8 id,
u8 code,
120 const void *data,
int len,
gfp_t priority)
126 skb = pep_alloc_skb(sk, data, len, priority);
140 static int pipe_handler_request(
struct sock *sk,
u8 id,
u8 code,
141 const void *data,
int len)
147 skb = pep_alloc_skb(sk, data, len,
GFP_KERNEL);
159 static int pipe_handler_send_created_ind(
struct sock *sk)
171 static int pep_accept_conn(
struct sock *sk,
struct sk_buff *skb)
173 static const u8 data[20] = {
192 static int pep_reject_conn(
struct sock *sk,
struct sk_buff *skb,
u8 code,
197 return pep_reply(sk, skb, code, data,
sizeof(data), priority);
202 static int pep_ctrlreq_error(
struct sock *sk,
struct sk_buff *oskb,
u8 code,
205 const struct pnpipehdr *oph = pnp_hdr(oskb);
215 skb = pep_alloc_skb(sk, data, 4, priority);
225 pn_skb_get_src_sockaddr(oskb, &
dst);
239 static void pipe_grant_credits(
struct sock *sk,
gfp_t priority)
264 static int pipe_rcv_status(
struct sock *sk,
struct sk_buff *skb)
270 if (!pskb_may_pull(skb,
sizeof(*hdr) + 4))
276 (
unsigned int)hdr->
data[0]);
280 switch (hdr->
data[1]) {
284 switch (hdr->
data[4]) {
308 (
unsigned int)hdr->
data[1]);
316 static int pipe_rcv_created(
struct sock *sk,
struct sk_buff *skb)
323 __skb_pull(skb,
sizeof(*hdr));
326 u8 *data = pep_get_sb(skb, &type, &len, buf);
332 if (len < 2 || (data[0] | data[1]) > 3)
334 pn->
tx_fc = data[0] & 3;
335 pn->
rx_fc = data[1] & 3;
345 static int pipe_do_rcv(
struct sock *sk,
struct sk_buff *skb)
421 pipe_rcv_status(sk, skb);
425 err = pipe_rcv_created(sk, skb);
429 err = pipe_rcv_created(sk, skb);
464 skb_set_owner_r(skb, sk);
473 static void pipe_destruct(
struct sock *sk)
481 static u8 pipe_negotiate_fc(
const u8 *
fcs,
unsigned int n)
486 for (i = 0; i <
n; i++) {
495 static int pep_connresp_rcv(
struct sock *sk,
struct sk_buff *skb)
501 if (!pskb_pull(skb,
sizeof(*hdr) + 4))
512 const u8 *data = pep_get_sb(skb, &type, &len, buf);
519 if (len < 2 || len < data[0])
521 pn->
tx_fc = pipe_negotiate_fc(data + 2, len - 2);
525 if (len < 2 || len < data[0])
527 pn->
rx_fc = pipe_negotiate_fc(data + 2, len - 2);
534 return pipe_handler_send_created_ind(sk);
537 static int pep_enableresp_rcv(
struct sock *sk,
struct sk_buff *skb)
549 static void pipe_start_flow_control(
struct sock *sk)
562 static int pipe_handler_do_rcv(
struct sock *sk,
struct sk_buff *skb)
589 skb_set_owner_r(skb, sk);
601 if (pep_connresp_rcv(sk, skb)) {
609 pipe_start_flow_control(sk);
617 if (pep_enableresp_rcv(sk, skb)) {
623 pipe_start_flow_control(sk);
631 pipe_rcv_status(sk, skb);
645 u16 dobj = pn_sockaddr_get_object(dst);
648 struct pep_sock *pnnode = pep_sk(sknode);
651 if (pnnode->
pn_sk.sobject != dobj)
669 static int pep_do_rcv(
struct sock *sk,
struct sk_buff *skb)
677 if (!pskb_may_pull(skb,
sizeof(*hdr)))
685 pn_skb_get_dst_sockaddr(skb, &dst);
688 sknode = pep_find_pipe(&pn->
hlist, &dst, pipe_handle);
694 if (sk->sk_state !=
TCP_LISTEN || sk_acceptq_is_full(sk)) {
700 sk_acceptq_added(sk);
720 if ((1 << sk->sk_state)
723 return pipe_handler_do_rcv(sk, skb);
730 static int pipe_do_remove(
struct sock *sk)
749 static void pep_sock_close(
struct sock *sk,
long timeout)
777 static struct sock *pep_sock_accept(
struct sock *sk,
int flags,
int *errp)
779 struct pep_sock *pn = pep_sk(sk), *newpn;
798 sk_acceptq_removed(sk);
801 if (!pskb_may_pull(skb,
sizeof(*hdr) + 4))
818 peer_type = hdr->other_pep_type << 8;
824 const u8 *data = pep_get_sb(skb, &type, &len, buf);
832 peer_type = (peer_type & 0xff00) | data[0];
835 aligned = data[0] != 0;
842 newsk = pep_find_pipe(&pn->
hlist, &dst, pipe_handle);
864 newpn = pep_sk(newsk);
865 pn_skb_get_dst_sockaddr(skb, &dst);
866 pn_skb_get_src_sockaddr(skb, &
src);
867 newpn->pn_sk.sobject = pn_sockaddr_get_object(&dst);
868 newpn->pn_sk.dobject = pn_sockaddr_get_object(&
src);
869 newpn->pn_sk.resource = pn_sockaddr_get_resource(&dst);
871 newpn->listener =
sk;
872 skb_queue_head_init(&newpn->ctrlreq_queue);
873 newpn->pipe_handle = pipe_handle;
876 newpn->peer_type = peer_type;
877 newpn->rx_credits = 0;
882 err = pep_accept_conn(newsk, skb);
888 sk_add_node(newsk, &pn->
hlist);
896 static int pep_sock_connect(
struct sock *sk,
struct sockaddr *
addr,
int len)
917 static int pep_sock_enable(
struct sock *sk,
struct sockaddr *addr,
int len)
931 static int pep_ioctl(
struct sock *sk,
int cmd,
unsigned long arg)
953 ret =
put_user(answ, (
int __user *)arg);
963 ret = pep_sock_enable(sk,
NULL, 0);
971 static int pep_init(
struct sock *sk)
990 static int pep_setsockopt(
struct sock *sk,
int level,
int optname,
991 char __user *optval,
unsigned int optlen)
994 int val = 0, err = 0;
998 if (optlen >=
sizeof(
int)) {
999 if (
get_user(val, (
int __user *) optval))
1052 static int pep_getsockopt(
struct sock *sk,
int level,
int optname,
1053 char __user *optval,
int __user *optlen)
1086 len =
min_t(
unsigned int,
sizeof(
int), len);
1089 if (
put_user(val, (
int __user *) optval))
1094 static int pipe_skb_send(
struct sock *sk,
struct sk_buff *skb)
1101 !atomic_add_unless(&pn->
tx_credits, -1, 0)) {
1107 skb_reset_transport_header(skb);
1180 if (signal_pending(
current)) {
1181 err = sock_intr_errno(timeo);
1194 err = pipe_skb_send(sk, skb);
1217 if (pep_sk(sk)->aligned)
1218 return pipe_skb_send(sk, skb);
1225 skb_shinfo(rskb)->frag_list =
skb;
1231 skb_walk_frags(skb, fs)
1233 skb->
next = skb_shinfo(skb)->frag_list;
1234 skb_frag_list_init(skb);
1240 return pipe_skb_send(sk, rskb);
1252 static int pep_recvmsg(
struct kiocb *iocb,
struct sock *sk,
1253 struct msghdr *msg,
size_t len,
int noblock,
1254 int flags,
int *addr_len)
1279 if (flags & MSG_OOB)
1310 static void pep_sock_unhash(
struct sock *sk)
1322 pn = pep_sk(skparent);
1323 lock_sock(skparent);
1324 sk_del_node_init(sk);
1330 if (hlist_empty(&pn->
hlist))
1338 static struct proto pep_proto = {
1339 .close = pep_sock_close,
1340 .accept = pep_sock_accept,
1341 .connect = pep_sock_connect,
1344 .setsockopt = pep_setsockopt,
1345 .getsockopt = pep_getsockopt,
1346 .sendmsg = pep_sendmsg,
1347 .recvmsg = pep_recvmsg,
1348 .backlog_rcv = pep_do_rcv,
1350 .unhash = pep_sock_unhash,
1352 .obj_size =
sizeof(
struct pep_sock),
1363 static int __init pep_register(
void)
1368 static void __exit pep_unregister(
void)