Lines Matching refs:sk

81 static struct sk_buff *pep_alloc_skb(struct sock *sk, const void *payload,  in pep_alloc_skb()  argument
87 skb_set_owner_w(skb, sk); in pep_alloc_skb()
97 static int pep_reply(struct sock *sk, struct sk_buff *oskb, u8 code, in pep_reply() argument
105 skb = pep_alloc_skb(sk, data, len, priority); in pep_reply()
116 return pn_skb_send(sk, skb, &peer); in pep_reply()
119 static int pep_indicate(struct sock *sk, u8 id, u8 code, in pep_indicate() argument
122 struct pep_sock *pn = pep_sk(sk); in pep_indicate()
126 skb = pep_alloc_skb(sk, data, len, priority); in pep_indicate()
135 return pn_skb_send(sk, skb, NULL); in pep_indicate()
140 static int pipe_handler_request(struct sock *sk, u8 id, u8 code, in pipe_handler_request() argument
143 struct pep_sock *pn = pep_sk(sk); in pipe_handler_request()
147 skb = pep_alloc_skb(sk, data, len, GFP_KERNEL); in pipe_handler_request()
156 return pn_skb_send(sk, skb, NULL); in pipe_handler_request()
159 static int pipe_handler_send_created_ind(struct sock *sk) in pipe_handler_send_created_ind() argument
161 struct pep_sock *pn = pep_sk(sk); in pipe_handler_send_created_ind()
167 return pep_indicate(sk, PNS_PIPE_CREATED_IND, 1 /* sub-blocks */, in pipe_handler_send_created_ind()
171 static int pep_accept_conn(struct sock *sk, struct sk_buff *skb) in pep_accept_conn() argument
188 return pep_reply(sk, skb, PN_PIPE_NO_ERROR, data, sizeof(data), in pep_accept_conn()
192 static int pep_reject_conn(struct sock *sk, struct sk_buff *skb, u8 code, in pep_reject_conn() argument
197 return pep_reply(sk, skb, code, data, sizeof(data), priority); in pep_reject_conn()
202 static int pep_ctrlreq_error(struct sock *sk, struct sk_buff *oskb, u8 code, in pep_ctrlreq_error() argument
215 skb = pep_alloc_skb(sk, data, 4, priority); in pep_ctrlreq_error()
226 return pn_skb_send(sk, skb, &dst); in pep_ctrlreq_error()
229 static int pipe_snd_status(struct sock *sk, u8 type, u8 status, gfp_t priority) in pipe_snd_status() argument
233 return pep_indicate(sk, PNS_PEP_STATUS_IND, PN_PEP_TYPE_COMMON, in pipe_snd_status()
239 static void pipe_grant_credits(struct sock *sk, gfp_t priority) in pipe_grant_credits() argument
241 struct pep_sock *pn = pep_sk(sk); in pipe_grant_credits()
243 BUG_ON(sk->sk_state != TCP_ESTABLISHED); in pipe_grant_credits()
249 if (pipe_snd_status(sk, PN_PEP_IND_FLOW_CONTROL, in pipe_grant_credits()
256 if (pipe_snd_status(sk, PN_PEP_IND_ID_MCFC_GRANT_CREDITS, in pipe_grant_credits()
264 static int pipe_rcv_status(struct sock *sk, struct sk_buff *skb) in pipe_rcv_status() argument
266 struct pep_sock *pn = pep_sk(sk); in pipe_rcv_status()
312 sk->sk_write_space(sk); in pipe_rcv_status()
316 static int pipe_rcv_created(struct sock *sk, struct sk_buff *skb) in pipe_rcv_created() argument
318 struct pep_sock *pn = pep_sk(sk); in pipe_rcv_created()
345 static int pipe_do_rcv(struct sock *sk, struct sk_buff *skb) in pipe_do_rcv() argument
347 struct pep_sock *pn = pep_sk(sk); in pipe_do_rcv()
352 BUG_ON(sk->sk_state == TCP_CLOSE_WAIT); in pipe_do_rcv()
356 pep_reject_conn(sk, skb, PN_PIPE_ERR_PEP_IN_USE, GFP_ATOMIC); in pipe_do_rcv()
360 pep_reply(sk, skb, PN_PIPE_NO_ERROR, NULL, 0, GFP_ATOMIC); in pipe_do_rcv()
361 sk->sk_state = TCP_CLOSE_WAIT; in pipe_do_rcv()
362 if (!sock_flag(sk, SOCK_DEAD)) in pipe_do_rcv()
363 sk->sk_state_change(sk); in pipe_do_rcv()
368 pep_reply(sk, skb, PN_PIPE_NO_ERROR, NULL, 0, GFP_ATOMIC); in pipe_do_rcv()
386 pep_reply(sk, skb, PN_PIPE_NO_ERROR, NULL, 0, GFP_ATOMIC); in pipe_do_rcv()
391 atomic_inc(&sk->sk_drops); in pipe_do_rcv()
404 err = sock_queue_rcv_skb(sk, skb); in pipe_do_rcv()
412 atomic_inc(&sk->sk_drops); in pipe_do_rcv()
417 queue = &sk->sk_receive_queue; in pipe_do_rcv()
421 pipe_rcv_status(sk, skb); in pipe_do_rcv()
425 err = pipe_rcv_created(sk, skb); in pipe_do_rcv()
429 err = pipe_rcv_created(sk, skb); in pipe_do_rcv()
440 sk->sk_write_space(sk); in pipe_do_rcv()
442 if (sk->sk_state == TCP_ESTABLISHED) in pipe_do_rcv()
444 sk->sk_state = TCP_ESTABLISHED; in pipe_do_rcv()
445 pipe_grant_credits(sk, GFP_ATOMIC); in pipe_do_rcv()
449 sk->sk_state = TCP_SYN_RECV; in pipe_do_rcv()
464 skb_set_owner_r(skb, sk); in pipe_do_rcv()
466 if (!sock_flag(sk, SOCK_DEAD)) in pipe_do_rcv()
467 sk->sk_data_ready(sk); in pipe_do_rcv()
472 static void pipe_destruct(struct sock *sk) in pipe_destruct() argument
474 struct pep_sock *pn = pep_sk(sk); in pipe_destruct()
476 skb_queue_purge(&sk->sk_receive_queue); in pipe_destruct()
494 static int pep_connresp_rcv(struct sock *sk, struct sk_buff *skb) in pep_connresp_rcv() argument
496 struct pep_sock *pn = pep_sk(sk); in pep_connresp_rcv()
533 return pipe_handler_send_created_ind(sk); in pep_connresp_rcv()
536 static int pep_enableresp_rcv(struct sock *sk, struct sk_buff *skb) in pep_enableresp_rcv() argument
543 return pep_indicate(sk, PNS_PIPE_ENABLED_IND, 0 /* sub-blocks */, in pep_enableresp_rcv()
548 static void pipe_start_flow_control(struct sock *sk) in pipe_start_flow_control() argument
550 struct pep_sock *pn = pep_sk(sk); in pipe_start_flow_control()
554 sk->sk_write_space(sk); in pipe_start_flow_control()
556 pipe_grant_credits(sk, GFP_ATOMIC); in pipe_start_flow_control()
561 static int pipe_handler_do_rcv(struct sock *sk, struct sk_buff *skb) in pipe_handler_do_rcv() argument
563 struct pep_sock *pn = pep_sk(sk); in pipe_handler_do_rcv()
574 err = sock_queue_rcv_skb(sk, skb); in pipe_handler_do_rcv()
582 atomic_inc(&sk->sk_drops); in pipe_handler_do_rcv()
588 skb_set_owner_r(skb, sk); in pipe_handler_do_rcv()
589 skb_queue_tail(&sk->sk_receive_queue, skb); in pipe_handler_do_rcv()
590 if (!sock_flag(sk, SOCK_DEAD)) in pipe_handler_do_rcv()
591 sk->sk_data_ready(sk); in pipe_handler_do_rcv()
595 if (sk->sk_state != TCP_SYN_SENT) in pipe_handler_do_rcv()
597 if (!sock_flag(sk, SOCK_DEAD)) in pipe_handler_do_rcv()
598 sk->sk_state_change(sk); in pipe_handler_do_rcv()
599 if (pep_connresp_rcv(sk, skb)) { in pipe_handler_do_rcv()
600 sk->sk_state = TCP_CLOSE_WAIT; in pipe_handler_do_rcv()
604 sk->sk_state = TCP_SYN_RECV; in pipe_handler_do_rcv()
606 sk->sk_state = TCP_ESTABLISHED; in pipe_handler_do_rcv()
607 pipe_start_flow_control(sk); in pipe_handler_do_rcv()
612 if (sk->sk_state != TCP_SYN_SENT) in pipe_handler_do_rcv()
615 if (pep_enableresp_rcv(sk, skb)) { in pipe_handler_do_rcv()
616 sk->sk_state = TCP_CLOSE_WAIT; in pipe_handler_do_rcv()
620 sk->sk_state = TCP_ESTABLISHED; in pipe_handler_do_rcv()
621 pipe_start_flow_control(sk); in pipe_handler_do_rcv()
629 pipe_rcv_status(sk, skb); in pipe_handler_do_rcv()
666 static int pep_do_rcv(struct sock *sk, struct sk_buff *skb) in pep_do_rcv() argument
668 struct pep_sock *pn = pep_sk(sk); in pep_do_rcv()
691 if (sk->sk_state != TCP_LISTEN || sk_acceptq_is_full(sk)) { in pep_do_rcv()
692 pep_reject_conn(sk, skb, PN_PIPE_ERR_PEP_IN_USE, in pep_do_rcv()
696 skb_queue_head(&sk->sk_receive_queue, skb); in pep_do_rcv()
697 sk_acceptq_added(sk); in pep_do_rcv()
698 if (!sock_flag(sk, SOCK_DEAD)) in pep_do_rcv()
699 sk->sk_data_ready(sk); in pep_do_rcv()
703 pep_reply(sk, skb, PN_PIPE_NO_ERROR, NULL, 0, GFP_ATOMIC); in pep_do_rcv()
707 pep_ctrlreq_error(sk, skb, PN_PIPE_INVALID_HANDLE, GFP_ATOMIC); in pep_do_rcv()
717 if ((1 << sk->sk_state) in pep_do_rcv()
720 return pipe_handler_do_rcv(sk, skb); in pep_do_rcv()
727 static int pipe_do_remove(struct sock *sk) in pipe_do_remove() argument
729 struct pep_sock *pn = pep_sk(sk); in pipe_do_remove()
733 skb = pep_alloc_skb(sk, NULL, 0, GFP_KERNEL); in pipe_do_remove()
742 return pn_skb_send(sk, skb, NULL); in pipe_do_remove()
746 static void pep_sock_close(struct sock *sk, long timeout) in pep_sock_close() argument
748 struct pep_sock *pn = pep_sk(sk); in pep_sock_close()
751 sock_hold(sk); /* keep a reference after sk_common_release() */ in pep_sock_close()
752 sk_common_release(sk); in pep_sock_close()
754 lock_sock(sk); in pep_sock_close()
755 if ((1 << sk->sk_state) & (TCPF_SYN_RECV|TCPF_ESTABLISHED)) { in pep_sock_close()
756 if (sk->sk_backlog_rcv == pipe_do_rcv) in pep_sock_close()
758 pipe_do_remove(sk); in pep_sock_close()
760 pipe_handler_request(sk, PNS_PEP_DISCONNECT_REQ, PAD, in pep_sock_close()
763 sk->sk_state = TCP_CLOSE; in pep_sock_close()
767 release_sock(sk); in pep_sock_close()
770 gprs_detach(sk); in pep_sock_close()
771 sock_put(sk); in pep_sock_close()
774 static struct sock *pep_sock_accept(struct sock *sk, int flags, int *errp) in pep_sock_accept() argument
776 struct pep_sock *pn = pep_sk(sk), *newpn; in pep_sock_accept()
786 skb = skb_recv_datagram(sk, 0, flags & O_NONBLOCK, errp); in pep_sock_accept()
790 lock_sock(sk); in pep_sock_accept()
791 if (sk->sk_state != TCP_LISTEN) { in pep_sock_accept()
795 sk_acceptq_removed(sk); in pep_sock_accept()
811 pep_reject_conn(sk, skb, PN_PIPE_ERR_INVALID_PARAM, in pep_sock_accept()
843 pep_reject_conn(sk, skb, PN_PIPE_ERR_PEP_IN_USE, GFP_KERNEL); in pep_sock_accept()
848 newsk = sk_alloc(sock_net(sk), PF_PHONET, GFP_KERNEL, sk->sk_prot, 0); in pep_sock_accept()
850 pep_reject_conn(sk, skb, PN_PIPE_ERR_OVERLOAD, GFP_KERNEL); in pep_sock_accept()
858 newsk->sk_protocol = sk->sk_protocol; in pep_sock_accept()
867 sock_hold(sk); in pep_sock_accept()
868 newpn->listener = sk; in pep_sock_accept()
887 release_sock(sk); in pep_sock_accept()
893 static int pep_sock_connect(struct sock *sk, struct sockaddr *addr, int len) in pep_sock_connect() argument
895 struct pep_sock *pn = pep_sk(sk); in pep_sock_connect()
902 err = pipe_handler_request(sk, PNS_PEP_CONNECT_REQ, in pep_sock_connect()
909 sk->sk_state = TCP_SYN_SENT; in pep_sock_connect()
914 static int pep_sock_enable(struct sock *sk, struct sockaddr *addr, int len) in pep_sock_enable() argument
918 err = pipe_handler_request(sk, PNS_PEP_ENABLE_REQ, PAD, in pep_sock_enable()
923 sk->sk_state = TCP_SYN_SENT; in pep_sock_enable()
928 static int pep_ioctl(struct sock *sk, int cmd, unsigned long arg) in pep_ioctl() argument
930 struct pep_sock *pn = pep_sk(sk); in pep_ioctl()
936 if (sk->sk_state == TCP_LISTEN) { in pep_ioctl()
941 lock_sock(sk); in pep_ioctl()
942 if (sock_flag(sk, SOCK_URGINLINE) && in pep_ioctl()
945 else if (!skb_queue_empty(&sk->sk_receive_queue)) in pep_ioctl()
946 answ = skb_peek(&sk->sk_receive_queue)->len; in pep_ioctl()
949 release_sock(sk); in pep_ioctl()
954 lock_sock(sk); in pep_ioctl()
955 if (sk->sk_state == TCP_SYN_SENT) in pep_ioctl()
957 else if (sk->sk_state == TCP_ESTABLISHED) in pep_ioctl()
960 ret = pep_sock_enable(sk, NULL, 0); in pep_ioctl()
961 release_sock(sk); in pep_ioctl()
968 static int pep_init(struct sock *sk) in pep_init() argument
970 struct pep_sock *pn = pep_sk(sk); in pep_init()
972 sk->sk_destruct = pipe_destruct; in pep_init()
987 static int pep_setsockopt(struct sock *sk, int level, int optname, in pep_setsockopt() argument
990 struct pep_sock *pn = pep_sk(sk); in pep_setsockopt()
1000 lock_sock(sk); in pep_setsockopt()
1014 release_sock(sk); in pep_setsockopt()
1015 err = gprs_attach(sk); in pep_setsockopt()
1022 release_sock(sk); in pep_setsockopt()
1023 gprs_detach(sk); in pep_setsockopt()
1029 if ((sk->sk_state == TCP_CLOSE) && in pep_setsockopt()
1043 release_sock(sk); in pep_setsockopt()
1049 static int pep_getsockopt(struct sock *sk, int level, int optname, in pep_getsockopt() argument
1052 struct pep_sock *pn = pep_sk(sk); in pep_getsockopt()
1091 static int pipe_skb_send(struct sock *sk, struct sk_buff *skb) in pipe_skb_send() argument
1093 struct pep_sock *pn = pep_sk(sk); in pipe_skb_send()
1113 err = pn_skb_send(sk, skb, NULL); in pipe_skb_send()
1121 static int pep_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) in pep_sendmsg() argument
1123 struct pep_sock *pn = pep_sk(sk); in pep_sendmsg()
1137 skb = sock_alloc_send_skb(sk, MAX_PNPIPE_HEADER + len, in pep_sendmsg()
1147 lock_sock(sk); in pep_sendmsg()
1148 timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT); in pep_sendmsg()
1149 if ((1 << sk->sk_state) & (TCPF_LISTEN|TCPF_CLOSE)) { in pep_sendmsg()
1153 if (sk->sk_state != TCP_ESTABLISHED) { in pep_sendmsg()
1156 err = sk_stream_wait_connect(sk, &timeo); in pep_sendmsg()
1160 if (sk->sk_state == TCP_CLOSE_WAIT) { in pep_sendmsg()
1165 BUG_ON(sk->sk_state != TCP_ESTABLISHED); in pep_sendmsg()
1181 prepare_to_wait(sk_sleep(sk), &wait, in pep_sendmsg()
1183 done = sk_wait_event(sk, &timeo, atomic_read(&pn->tx_credits)); in pep_sendmsg()
1184 finish_wait(sk_sleep(sk), &wait); in pep_sendmsg()
1186 if (sk->sk_state != TCP_ESTABLISHED) in pep_sendmsg()
1190 err = pipe_skb_send(sk, skb); in pep_sendmsg()
1195 release_sock(sk); in pep_sendmsg()
1201 int pep_writeable(struct sock *sk) in pep_writeable() argument
1203 struct pep_sock *pn = pep_sk(sk); in pep_writeable()
1208 int pep_write(struct sock *sk, struct sk_buff *skb) in pep_write() argument
1213 if (pep_sk(sk)->aligned) in pep_write()
1214 return pipe_skb_send(sk, skb); in pep_write()
1236 return pipe_skb_send(sk, rskb); in pep_write()
1239 struct sk_buff *pep_read(struct sock *sk) in pep_read() argument
1241 struct sk_buff *skb = skb_dequeue(&sk->sk_receive_queue); in pep_read()
1243 if (sk->sk_state == TCP_ESTABLISHED) in pep_read()
1244 pipe_grant_credits(sk, GFP_ATOMIC); in pep_read()
1248 static int pep_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, in pep_recvmsg() argument
1258 if (unlikely(1 << sk->sk_state & (TCPF_LISTEN | TCPF_CLOSE))) in pep_recvmsg()
1261 if ((flags & MSG_OOB) || sock_flag(sk, SOCK_URGINLINE)) { in pep_recvmsg()
1263 struct pep_sock *pn = pep_sk(sk); in pep_recvmsg()
1269 pep_ctrlreq_error(sk, skb, PN_PIPE_NO_ERROR, in pep_recvmsg()
1278 skb = skb_recv_datagram(sk, flags, noblock, &err); in pep_recvmsg()
1279 lock_sock(sk); in pep_recvmsg()
1281 if (err == -ENOTCONN && sk->sk_state == TCP_CLOSE_WAIT) in pep_recvmsg()
1283 release_sock(sk); in pep_recvmsg()
1287 if (sk->sk_state == TCP_ESTABLISHED) in pep_recvmsg()
1288 pipe_grant_credits(sk, GFP_KERNEL); in pep_recvmsg()
1289 release_sock(sk); in pep_recvmsg()
1301 skb_free_datagram(sk, skb); in pep_recvmsg()
1305 static void pep_sock_unhash(struct sock *sk) in pep_sock_unhash() argument
1307 struct pep_sock *pn = pep_sk(sk); in pep_sock_unhash()
1310 lock_sock(sk); in pep_sock_unhash()
1315 release_sock(sk); in pep_sock_unhash()
1319 sk_del_node_init(sk); in pep_sock_unhash()
1320 sk = skparent; in pep_sock_unhash()
1326 pn_sock_unhash(&pn->pn_sk.sk); in pep_sock_unhash()
1327 release_sock(sk); in pep_sock_unhash()