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()
679 if (sk->sk_state != TCP_LISTEN || sk_acceptq_is_full(sk)) { in pep_do_rcv()
680 pep_reject_conn(sk, skb, PN_PIPE_ERR_PEP_IN_USE, in pep_do_rcv()
684 skb_queue_head(&sk->sk_receive_queue, skb); in pep_do_rcv()
685 sk_acceptq_added(sk); in pep_do_rcv()
686 if (!sock_flag(sk, SOCK_DEAD)) in pep_do_rcv()
687 sk->sk_data_ready(sk); in pep_do_rcv()
691 pep_reply(sk, skb, PN_PIPE_NO_ERROR, NULL, 0, GFP_ATOMIC); in pep_do_rcv()
695 pep_ctrlreq_error(sk, skb, PN_PIPE_INVALID_HANDLE, GFP_ATOMIC); in pep_do_rcv()
705 if ((1 << sk->sk_state) in pep_do_rcv()
708 return pipe_handler_do_rcv(sk, skb); in pep_do_rcv()
715 static int pipe_do_remove(struct sock *sk) in pipe_do_remove() argument
717 struct pep_sock *pn = pep_sk(sk); in pipe_do_remove()
721 skb = pep_alloc_skb(sk, NULL, 0, GFP_KERNEL); in pipe_do_remove()
730 return pn_skb_send(sk, skb, NULL); in pipe_do_remove()
734 static void pep_sock_close(struct sock *sk, long timeout) in pep_sock_close() argument
736 struct pep_sock *pn = pep_sk(sk); in pep_sock_close()
739 sock_hold(sk); /* keep a reference after sk_common_release() */ in pep_sock_close()
740 sk_common_release(sk); in pep_sock_close()
742 lock_sock(sk); in pep_sock_close()
743 if ((1 << sk->sk_state) & (TCPF_SYN_RECV|TCPF_ESTABLISHED)) { in pep_sock_close()
744 if (sk->sk_backlog_rcv == pipe_do_rcv) in pep_sock_close()
746 pipe_do_remove(sk); in pep_sock_close()
748 pipe_handler_request(sk, PNS_PEP_DISCONNECT_REQ, PAD, in pep_sock_close()
751 sk->sk_state = TCP_CLOSE; in pep_sock_close()
755 release_sock(sk); in pep_sock_close()
758 gprs_detach(sk); in pep_sock_close()
759 sock_put(sk); in pep_sock_close()
762 static struct sock *pep_sock_accept(struct sock *sk, in pep_sock_accept() argument
765 struct pep_sock *pn = pep_sk(sk), *newpn; in pep_sock_accept()
775 skb = skb_recv_datagram(sk, (arg->flags & O_NONBLOCK) ? MSG_DONTWAIT : 0, in pep_sock_accept()
780 lock_sock(sk); in pep_sock_accept()
781 if (sk->sk_state != TCP_LISTEN) { in pep_sock_accept()
785 sk_acceptq_removed(sk); in pep_sock_accept()
801 pep_reject_conn(sk, skb, PN_PIPE_ERR_INVALID_PARAM, in pep_sock_accept()
834 pep_reject_conn(sk, skb, PN_PIPE_ERR_PEP_IN_USE, GFP_KERNEL); in pep_sock_accept()
839 newsk = sk_alloc(sock_net(sk), PF_PHONET, GFP_KERNEL, sk->sk_prot, in pep_sock_accept()
842 pep_reject_conn(sk, skb, PN_PIPE_ERR_OVERLOAD, GFP_KERNEL); in pep_sock_accept()
850 newsk->sk_protocol = sk->sk_protocol; in pep_sock_accept()
858 sock_hold(sk); in pep_sock_accept()
859 newpn->listener = sk; in pep_sock_accept()
872 __sock_put(sk); in pep_sock_accept()
879 release_sock(sk); in pep_sock_accept()
885 static int pep_sock_connect(struct sock *sk, struct sockaddr *addr, int len) in pep_sock_connect() argument
887 struct pep_sock *pn = pep_sk(sk); in pep_sock_connect()
894 err = pipe_handler_request(sk, PNS_PEP_CONNECT_REQ, in pep_sock_connect()
901 sk->sk_state = TCP_SYN_SENT; in pep_sock_connect()
906 static int pep_sock_enable(struct sock *sk, struct sockaddr *addr, int len) in pep_sock_enable() argument
910 err = pipe_handler_request(sk, PNS_PEP_ENABLE_REQ, PAD, in pep_sock_enable()
915 sk->sk_state = TCP_SYN_SENT; in pep_sock_enable()
920 static unsigned int pep_first_packet_length(struct sock *sk) in pep_first_packet_length() argument
922 struct pep_sock *pn = pep_sk(sk); in pep_first_packet_length()
928 if (sock_flag(sk, SOCK_URGINLINE)) { in pep_first_packet_length()
940 q = &sk->sk_receive_queue; in pep_first_packet_length()
951 static int pep_ioctl(struct sock *sk, int cmd, int *karg) in pep_ioctl() argument
953 struct pep_sock *pn = pep_sk(sk); in pep_ioctl()
958 if (sk->sk_state == TCP_LISTEN) { in pep_ioctl()
963 *karg = pep_first_packet_length(sk); in pep_ioctl()
968 lock_sock(sk); in pep_ioctl()
969 if (sk->sk_state == TCP_SYN_SENT) in pep_ioctl()
971 else if (sk->sk_state == TCP_ESTABLISHED) in pep_ioctl()
976 ret = pep_sock_enable(sk, NULL, 0); in pep_ioctl()
977 release_sock(sk); in pep_ioctl()
984 static int pep_init(struct sock *sk) in pep_init() argument
986 struct pep_sock *pn = pep_sk(sk); in pep_init()
988 sk->sk_destruct = pipe_destruct; in pep_init()
1003 static int pep_setsockopt(struct sock *sk, int level, int optname, in pep_setsockopt() argument
1006 struct pep_sock *pn = pep_sk(sk); in pep_setsockopt()
1016 lock_sock(sk); in pep_setsockopt()
1030 release_sock(sk); in pep_setsockopt()
1031 err = gprs_attach(sk); in pep_setsockopt()
1038 release_sock(sk); in pep_setsockopt()
1039 gprs_detach(sk); in pep_setsockopt()
1045 if ((sk->sk_state == TCP_CLOSE) && in pep_setsockopt()
1059 release_sock(sk); in pep_setsockopt()
1065 static int pep_getsockopt(struct sock *sk, int level, int optname, in pep_getsockopt() argument
1068 struct pep_sock *pn = pep_sk(sk); in pep_getsockopt()
1107 static int pipe_skb_send(struct sock *sk, struct sk_buff *skb) in pipe_skb_send() argument
1109 struct pep_sock *pn = pep_sk(sk); in pipe_skb_send()
1129 err = pn_skb_send(sk, skb, NULL); in pipe_skb_send()
1137 static int pep_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) in pep_sendmsg() argument
1139 struct pep_sock *pn = pep_sk(sk); in pep_sendmsg()
1153 skb = sock_alloc_send_skb(sk, MAX_PNPIPE_HEADER + len, in pep_sendmsg()
1163 lock_sock(sk); in pep_sendmsg()
1164 timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT); in pep_sendmsg()
1165 if ((1 << sk->sk_state) & (TCPF_LISTEN|TCPF_CLOSE)) { in pep_sendmsg()
1169 if (sk->sk_state != TCP_ESTABLISHED) { in pep_sendmsg()
1172 err = sk_stream_wait_connect(sk, &timeo); in pep_sendmsg()
1176 if (sk->sk_state == TCP_CLOSE_WAIT) { in pep_sendmsg()
1181 BUG_ON(sk->sk_state != TCP_ESTABLISHED); in pep_sendmsg()
1197 add_wait_queue(sk_sleep(sk), &wait); in pep_sendmsg()
1198 done = sk_wait_event(sk, &timeo, atomic_read(&pn->tx_credits), &wait); in pep_sendmsg()
1199 remove_wait_queue(sk_sleep(sk), &wait); in pep_sendmsg()
1201 if (sk->sk_state != TCP_ESTABLISHED) in pep_sendmsg()
1205 err = pipe_skb_send(sk, skb); in pep_sendmsg()
1210 release_sock(sk); in pep_sendmsg()
1216 int pep_writeable(struct sock *sk) in pep_writeable() argument
1218 struct pep_sock *pn = pep_sk(sk); in pep_writeable()
1223 int pep_write(struct sock *sk, struct sk_buff *skb) in pep_write() argument
1228 if (pep_sk(sk)->aligned) in pep_write()
1229 return pipe_skb_send(sk, skb); in pep_write()
1251 return pipe_skb_send(sk, rskb); in pep_write()
1254 struct sk_buff *pep_read(struct sock *sk) in pep_read() argument
1256 struct sk_buff *skb = skb_dequeue(&sk->sk_receive_queue); in pep_read()
1258 if (sk->sk_state == TCP_ESTABLISHED) in pep_read()
1259 pipe_grant_credits(sk, GFP_ATOMIC); in pep_read()
1263 static int pep_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, in pep_recvmsg() argument
1273 if (unlikely(1 << sk->sk_state & (TCPF_LISTEN | TCPF_CLOSE))) in pep_recvmsg()
1276 if ((flags & MSG_OOB) || sock_flag(sk, SOCK_URGINLINE)) { in pep_recvmsg()
1278 struct pep_sock *pn = pep_sk(sk); in pep_recvmsg()
1284 pep_ctrlreq_error(sk, skb, PN_PIPE_NO_ERROR, in pep_recvmsg()
1293 skb = skb_recv_datagram(sk, flags, &err); in pep_recvmsg()
1294 lock_sock(sk); in pep_recvmsg()
1296 if (err == -ENOTCONN && sk->sk_state == TCP_CLOSE_WAIT) in pep_recvmsg()
1298 release_sock(sk); in pep_recvmsg()
1302 if (sk->sk_state == TCP_ESTABLISHED) in pep_recvmsg()
1303 pipe_grant_credits(sk, GFP_KERNEL); in pep_recvmsg()
1304 release_sock(sk); in pep_recvmsg()
1316 skb_free_datagram(sk, skb); in pep_recvmsg()
1320 static void pep_sock_unhash(struct sock *sk) in pep_sock_unhash() argument
1322 struct pep_sock *pn = pep_sk(sk); in pep_sock_unhash()
1325 lock_sock(sk); in pep_sock_unhash()
1330 release_sock(sk); in pep_sock_unhash()
1334 sk_del_node_init(sk); in pep_sock_unhash()
1335 sk = skparent; in pep_sock_unhash()
1341 pn_sock_unhash(&pn->pn_sk.sk); in pep_sock_unhash()
1342 release_sock(sk); in pep_sock_unhash()