Lines Matching refs:sk

69 static struct sk_buff *pep_alloc_skb(struct sock *sk, const void *payload,  in pep_alloc_skb()  argument
75 skb_set_owner_w(skb, sk); in pep_alloc_skb()
85 static int pep_reply(struct sock *sk, struct sk_buff *oskb, u8 code, in pep_reply() argument
93 skb = pep_alloc_skb(sk, data, len, priority); in pep_reply()
104 return pn_skb_send(sk, skb, &peer); in pep_reply()
107 static int pep_indicate(struct sock *sk, u8 id, u8 code, in pep_indicate() argument
110 struct pep_sock *pn = pep_sk(sk); in pep_indicate()
114 skb = pep_alloc_skb(sk, data, len, priority); in pep_indicate()
123 return pn_skb_send(sk, skb, NULL); in pep_indicate()
128 static int pipe_handler_request(struct sock *sk, u8 id, u8 code, in pipe_handler_request() argument
131 struct pep_sock *pn = pep_sk(sk); in pipe_handler_request()
135 skb = pep_alloc_skb(sk, data, len, GFP_KERNEL); in pipe_handler_request()
144 return pn_skb_send(sk, skb, NULL); in pipe_handler_request()
147 static int pipe_handler_send_created_ind(struct sock *sk) in pipe_handler_send_created_ind() argument
149 struct pep_sock *pn = pep_sk(sk); in pipe_handler_send_created_ind()
155 return pep_indicate(sk, PNS_PIPE_CREATED_IND, 1 /* sub-blocks */, in pipe_handler_send_created_ind()
159 static int pep_accept_conn(struct sock *sk, struct sk_buff *skb) in pep_accept_conn() argument
176 return pep_reply(sk, skb, PN_PIPE_NO_ERROR, data, sizeof(data), in pep_accept_conn()
180 static int pep_reject_conn(struct sock *sk, struct sk_buff *skb, u8 code, in pep_reject_conn() argument
185 return pep_reply(sk, skb, code, data, sizeof(data), priority); in pep_reject_conn()
190 static int pep_ctrlreq_error(struct sock *sk, struct sk_buff *oskb, u8 code, in pep_ctrlreq_error() argument
203 skb = pep_alloc_skb(sk, data, 4, priority); in pep_ctrlreq_error()
214 return pn_skb_send(sk, skb, &dst); in pep_ctrlreq_error()
217 static int pipe_snd_status(struct sock *sk, u8 type, u8 status, gfp_t priority) in pipe_snd_status() argument
221 return pep_indicate(sk, PNS_PEP_STATUS_IND, PN_PEP_TYPE_COMMON, in pipe_snd_status()
227 static void pipe_grant_credits(struct sock *sk, gfp_t priority) in pipe_grant_credits() argument
229 struct pep_sock *pn = pep_sk(sk); in pipe_grant_credits()
231 BUG_ON(sk->sk_state != TCP_ESTABLISHED); in pipe_grant_credits()
237 if (pipe_snd_status(sk, PN_PEP_IND_FLOW_CONTROL, in pipe_grant_credits()
244 if (pipe_snd_status(sk, PN_PEP_IND_ID_MCFC_GRANT_CREDITS, in pipe_grant_credits()
252 static int pipe_rcv_status(struct sock *sk, struct sk_buff *skb) in pipe_rcv_status() argument
254 struct pep_sock *pn = pep_sk(sk); in pipe_rcv_status()
300 sk->sk_write_space(sk); in pipe_rcv_status()
304 static int pipe_rcv_created(struct sock *sk, struct sk_buff *skb) in pipe_rcv_created() argument
306 struct pep_sock *pn = pep_sk(sk); in pipe_rcv_created()
333 static int pipe_do_rcv(struct sock *sk, struct sk_buff *skb) in pipe_do_rcv() argument
335 struct pep_sock *pn = pep_sk(sk); in pipe_do_rcv()
340 BUG_ON(sk->sk_state == TCP_CLOSE_WAIT); in pipe_do_rcv()
344 pep_reject_conn(sk, skb, PN_PIPE_ERR_PEP_IN_USE, GFP_ATOMIC); in pipe_do_rcv()
348 pep_reply(sk, skb, PN_PIPE_NO_ERROR, NULL, 0, GFP_ATOMIC); in pipe_do_rcv()
349 sk->sk_state = TCP_CLOSE_WAIT; in pipe_do_rcv()
350 if (!sock_flag(sk, SOCK_DEAD)) in pipe_do_rcv()
351 sk->sk_state_change(sk); in pipe_do_rcv()
356 pep_reply(sk, skb, PN_PIPE_NO_ERROR, NULL, 0, GFP_ATOMIC); in pipe_do_rcv()
374 pep_reply(sk, skb, PN_PIPE_NO_ERROR, NULL, 0, GFP_ATOMIC); in pipe_do_rcv()
379 sk_drops_inc(sk); in pipe_do_rcv()
392 err = sock_queue_rcv_skb(sk, skb); in pipe_do_rcv()
400 sk_drops_inc(sk); in pipe_do_rcv()
405 queue = &sk->sk_receive_queue; in pipe_do_rcv()
409 pipe_rcv_status(sk, skb); in pipe_do_rcv()
413 err = pipe_rcv_created(sk, skb); in pipe_do_rcv()
417 err = pipe_rcv_created(sk, skb); in pipe_do_rcv()
428 sk->sk_write_space(sk); in pipe_do_rcv()
430 if (sk->sk_state == TCP_ESTABLISHED) in pipe_do_rcv()
432 sk->sk_state = TCP_ESTABLISHED; in pipe_do_rcv()
433 pipe_grant_credits(sk, GFP_ATOMIC); in pipe_do_rcv()
437 sk->sk_state = TCP_SYN_RECV; in pipe_do_rcv()
452 skb_set_owner_r(skb, sk); in pipe_do_rcv()
454 if (!sock_flag(sk, SOCK_DEAD)) in pipe_do_rcv()
455 sk->sk_data_ready(sk); in pipe_do_rcv()
460 static void pipe_destruct(struct sock *sk) in pipe_destruct() argument
462 struct pep_sock *pn = pep_sk(sk); in pipe_destruct()
464 skb_queue_purge(&sk->sk_receive_queue); in pipe_destruct()
482 static int pep_connresp_rcv(struct sock *sk, struct sk_buff *skb) in pep_connresp_rcv() argument
484 struct pep_sock *pn = pep_sk(sk); in pep_connresp_rcv()
521 return pipe_handler_send_created_ind(sk); in pep_connresp_rcv()
524 static int pep_enableresp_rcv(struct sock *sk, struct sk_buff *skb) in pep_enableresp_rcv() argument
531 return pep_indicate(sk, PNS_PIPE_ENABLED_IND, 0 /* sub-blocks */, in pep_enableresp_rcv()
536 static void pipe_start_flow_control(struct sock *sk) in pipe_start_flow_control() argument
538 struct pep_sock *pn = pep_sk(sk); in pipe_start_flow_control()
542 sk->sk_write_space(sk); in pipe_start_flow_control()
544 pipe_grant_credits(sk, GFP_ATOMIC); in pipe_start_flow_control()
549 static int pipe_handler_do_rcv(struct sock *sk, struct sk_buff *skb) in pipe_handler_do_rcv() argument
551 struct pep_sock *pn = pep_sk(sk); in pipe_handler_do_rcv()
562 err = sock_queue_rcv_skb(sk, skb); in pipe_handler_do_rcv()
570 sk_drops_inc(sk); in pipe_handler_do_rcv()
576 skb_set_owner_r(skb, sk); in pipe_handler_do_rcv()
577 skb_queue_tail(&sk->sk_receive_queue, skb); in pipe_handler_do_rcv()
578 if (!sock_flag(sk, SOCK_DEAD)) in pipe_handler_do_rcv()
579 sk->sk_data_ready(sk); in pipe_handler_do_rcv()
583 if (sk->sk_state != TCP_SYN_SENT) in pipe_handler_do_rcv()
585 if (!sock_flag(sk, SOCK_DEAD)) in pipe_handler_do_rcv()
586 sk->sk_state_change(sk); in pipe_handler_do_rcv()
587 if (pep_connresp_rcv(sk, skb)) { in pipe_handler_do_rcv()
588 sk->sk_state = TCP_CLOSE_WAIT; in pipe_handler_do_rcv()
592 sk->sk_state = TCP_SYN_RECV; in pipe_handler_do_rcv()
594 sk->sk_state = TCP_ESTABLISHED; in pipe_handler_do_rcv()
595 pipe_start_flow_control(sk); in pipe_handler_do_rcv()
600 if (sk->sk_state != TCP_SYN_SENT) in pipe_handler_do_rcv()
603 if (pep_enableresp_rcv(sk, skb)) { in pipe_handler_do_rcv()
604 sk->sk_state = TCP_CLOSE_WAIT; in pipe_handler_do_rcv()
608 sk->sk_state = TCP_ESTABLISHED; in pipe_handler_do_rcv()
609 pipe_start_flow_control(sk); in pipe_handler_do_rcv()
617 pipe_rcv_status(sk, skb); in pipe_handler_do_rcv()
654 static int pep_do_rcv(struct sock *sk, struct sk_buff *skb) in pep_do_rcv() argument
656 struct pep_sock *pn = pep_sk(sk); in pep_do_rcv()
694 if (sk->sk_state != TCP_LISTEN || sk_acceptq_is_full(sk)) { in pep_do_rcv()
695 pep_reject_conn(sk, skb, PN_PIPE_ERR_PEP_IN_USE, in pep_do_rcv()
699 skb_queue_head(&sk->sk_receive_queue, skb); in pep_do_rcv()
700 sk_acceptq_added(sk); in pep_do_rcv()
701 if (!sock_flag(sk, SOCK_DEAD)) in pep_do_rcv()
702 sk->sk_data_ready(sk); in pep_do_rcv()
706 pep_reply(sk, skb, PN_PIPE_NO_ERROR, NULL, 0, GFP_ATOMIC); in pep_do_rcv()
710 pep_ctrlreq_error(sk, skb, PN_PIPE_INVALID_HANDLE, GFP_ATOMIC); in pep_do_rcv()
720 if ((1 << sk->sk_state) in pep_do_rcv()
723 return pipe_handler_do_rcv(sk, skb); in pep_do_rcv()
730 static int pipe_do_remove(struct sock *sk) in pipe_do_remove() argument
732 struct pep_sock *pn = pep_sk(sk); in pipe_do_remove()
736 skb = pep_alloc_skb(sk, NULL, 0, GFP_KERNEL); in pipe_do_remove()
745 return pn_skb_send(sk, skb, NULL); in pipe_do_remove()
749 static void pep_sock_close(struct sock *sk, long timeout) in pep_sock_close() argument
751 struct pep_sock *pn = pep_sk(sk); in pep_sock_close()
754 sock_hold(sk); /* keep a reference after sk_common_release() */ in pep_sock_close()
755 sk_common_release(sk); in pep_sock_close()
757 lock_sock(sk); in pep_sock_close()
758 if ((1 << sk->sk_state) & (TCPF_SYN_RECV|TCPF_ESTABLISHED)) { in pep_sock_close()
759 if (sk->sk_backlog_rcv == pipe_do_rcv) in pep_sock_close()
761 pipe_do_remove(sk); in pep_sock_close()
763 pipe_handler_request(sk, PNS_PEP_DISCONNECT_REQ, PAD, in pep_sock_close()
766 sk->sk_state = TCP_CLOSE; in pep_sock_close()
770 release_sock(sk); in pep_sock_close()
773 gprs_detach(sk); in pep_sock_close()
774 sock_put(sk); in pep_sock_close()
777 static struct sock *pep_sock_accept(struct sock *sk, in pep_sock_accept() argument
780 struct pep_sock *pn = pep_sk(sk), *newpn; in pep_sock_accept()
790 skb = skb_recv_datagram(sk, (arg->flags & O_NONBLOCK) ? MSG_DONTWAIT : 0, in pep_sock_accept()
795 lock_sock(sk); in pep_sock_accept()
796 if (sk->sk_state != TCP_LISTEN) { in pep_sock_accept()
800 sk_acceptq_removed(sk); in pep_sock_accept()
816 pep_reject_conn(sk, skb, PN_PIPE_ERR_INVALID_PARAM, in pep_sock_accept()
849 pep_reject_conn(sk, skb, PN_PIPE_ERR_PEP_IN_USE, GFP_KERNEL); in pep_sock_accept()
854 newsk = sk_alloc(sock_net(sk), PF_PHONET, GFP_KERNEL, sk->sk_prot, in pep_sock_accept()
857 pep_reject_conn(sk, skb, PN_PIPE_ERR_OVERLOAD, GFP_KERNEL); in pep_sock_accept()
865 newsk->sk_protocol = sk->sk_protocol; in pep_sock_accept()
873 sock_hold(sk); in pep_sock_accept()
874 newpn->listener = sk; in pep_sock_accept()
887 __sock_put(sk); in pep_sock_accept()
894 release_sock(sk); in pep_sock_accept()
900 static int pep_sock_connect(struct sock *sk, struct sockaddr_unsized *addr, in pep_sock_connect() argument
903 struct pep_sock *pn = pep_sk(sk); in pep_sock_connect()
910 err = pipe_handler_request(sk, PNS_PEP_CONNECT_REQ, in pep_sock_connect()
917 sk->sk_state = TCP_SYN_SENT; in pep_sock_connect()
922 static int pep_sock_enable(struct sock *sk, struct sockaddr *addr, int len) in pep_sock_enable() argument
926 err = pipe_handler_request(sk, PNS_PEP_ENABLE_REQ, PAD, in pep_sock_enable()
931 sk->sk_state = TCP_SYN_SENT; in pep_sock_enable()
936 static unsigned int pep_first_packet_length(struct sock *sk) in pep_first_packet_length() argument
938 struct pep_sock *pn = pep_sk(sk); in pep_first_packet_length()
944 if (sock_flag(sk, SOCK_URGINLINE)) { in pep_first_packet_length()
956 q = &sk->sk_receive_queue; in pep_first_packet_length()
967 static int pep_ioctl(struct sock *sk, int cmd, int *karg) in pep_ioctl() argument
969 struct pep_sock *pn = pep_sk(sk); in pep_ioctl()
974 if (sk->sk_state == TCP_LISTEN) { in pep_ioctl()
979 *karg = pep_first_packet_length(sk); in pep_ioctl()
984 lock_sock(sk); in pep_ioctl()
985 if (sk->sk_state == TCP_SYN_SENT) in pep_ioctl()
987 else if (sk->sk_state == TCP_ESTABLISHED) in pep_ioctl()
992 ret = pep_sock_enable(sk, NULL, 0); in pep_ioctl()
993 release_sock(sk); in pep_ioctl()
1000 static int pep_init(struct sock *sk) in pep_init() argument
1002 struct pep_sock *pn = pep_sk(sk); in pep_init()
1004 sk->sk_destruct = pipe_destruct; in pep_init()
1019 static int pep_setsockopt(struct sock *sk, int level, int optname, in pep_setsockopt() argument
1022 struct pep_sock *pn = pep_sk(sk); in pep_setsockopt()
1032 lock_sock(sk); in pep_setsockopt()
1046 release_sock(sk); in pep_setsockopt()
1047 err = gprs_attach(sk); in pep_setsockopt()
1054 release_sock(sk); in pep_setsockopt()
1055 gprs_detach(sk); in pep_setsockopt()
1061 if ((sk->sk_state == TCP_CLOSE) && in pep_setsockopt()
1075 release_sock(sk); in pep_setsockopt()
1081 static int pep_getsockopt(struct sock *sk, int level, int optname, in pep_getsockopt() argument
1084 struct pep_sock *pn = pep_sk(sk); in pep_getsockopt()
1123 static int pipe_skb_send(struct sock *sk, struct sk_buff *skb) in pipe_skb_send() argument
1125 struct pep_sock *pn = pep_sk(sk); in pipe_skb_send()
1145 err = pn_skb_send(sk, skb, NULL); in pipe_skb_send()
1153 static int pep_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) in pep_sendmsg() argument
1155 struct pep_sock *pn = pep_sk(sk); in pep_sendmsg()
1169 skb = sock_alloc_send_skb(sk, MAX_PNPIPE_HEADER + len, in pep_sendmsg()
1179 lock_sock(sk); in pep_sendmsg()
1180 timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT); in pep_sendmsg()
1181 if ((1 << sk->sk_state) & (TCPF_LISTEN|TCPF_CLOSE)) { in pep_sendmsg()
1185 if (sk->sk_state != TCP_ESTABLISHED) { in pep_sendmsg()
1188 err = sk_stream_wait_connect(sk, &timeo); in pep_sendmsg()
1192 if (sk->sk_state == TCP_CLOSE_WAIT) { in pep_sendmsg()
1197 BUG_ON(sk->sk_state != TCP_ESTABLISHED); in pep_sendmsg()
1213 add_wait_queue(sk_sleep(sk), &wait); in pep_sendmsg()
1214 done = sk_wait_event(sk, &timeo, atomic_read(&pn->tx_credits), &wait); in pep_sendmsg()
1215 remove_wait_queue(sk_sleep(sk), &wait); in pep_sendmsg()
1217 if (sk->sk_state != TCP_ESTABLISHED) in pep_sendmsg()
1221 err = pipe_skb_send(sk, skb); in pep_sendmsg()
1226 release_sock(sk); in pep_sendmsg()
1232 int pep_writeable(struct sock *sk) in pep_writeable() argument
1234 struct pep_sock *pn = pep_sk(sk); in pep_writeable()
1239 int pep_write(struct sock *sk, struct sk_buff *skb) in pep_write() argument
1244 if (pep_sk(sk)->aligned) in pep_write()
1245 return pipe_skb_send(sk, skb); in pep_write()
1267 return pipe_skb_send(sk, rskb); in pep_write()
1270 struct sk_buff *pep_read(struct sock *sk) in pep_read() argument
1272 struct sk_buff *skb = skb_dequeue(&sk->sk_receive_queue); in pep_read()
1274 if (sk->sk_state == TCP_ESTABLISHED) in pep_read()
1275 pipe_grant_credits(sk, GFP_ATOMIC); in pep_read()
1279 static int pep_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, in pep_recvmsg() argument
1289 if (unlikely(1 << sk->sk_state & (TCPF_LISTEN | TCPF_CLOSE))) in pep_recvmsg()
1292 if ((flags & MSG_OOB) || sock_flag(sk, SOCK_URGINLINE)) { in pep_recvmsg()
1294 struct pep_sock *pn = pep_sk(sk); in pep_recvmsg()
1300 pep_ctrlreq_error(sk, skb, PN_PIPE_NO_ERROR, in pep_recvmsg()
1309 skb = skb_recv_datagram(sk, flags, &err); in pep_recvmsg()
1310 lock_sock(sk); in pep_recvmsg()
1312 if (err == -ENOTCONN && sk->sk_state == TCP_CLOSE_WAIT) in pep_recvmsg()
1314 release_sock(sk); in pep_recvmsg()
1318 if (sk->sk_state == TCP_ESTABLISHED) in pep_recvmsg()
1319 pipe_grant_credits(sk, GFP_KERNEL); in pep_recvmsg()
1320 release_sock(sk); in pep_recvmsg()
1332 skb_free_datagram(sk, skb); in pep_recvmsg()
1336 static void pep_sock_unhash(struct sock *sk) in pep_sock_unhash() argument
1338 struct pep_sock *pn = pep_sk(sk); in pep_sock_unhash()
1341 lock_sock(sk); in pep_sock_unhash()
1346 release_sock(sk); in pep_sock_unhash()
1350 sk_del_node_init(sk); in pep_sock_unhash()
1351 sk = skparent; in pep_sock_unhash()
1357 pn_sock_unhash(&pn->pn_sk.sk); in pep_sock_unhash()
1358 release_sock(sk); in pep_sock_unhash()