Lines Matching refs:sk
82 static struct sk_buff *pep_alloc_skb(struct sock *sk, const void *payload, in pep_alloc_skb() argument
88 skb_set_owner_w(skb, sk); in pep_alloc_skb()
98 static int pep_reply(struct sock *sk, struct sk_buff *oskb, u8 code, in pep_reply() argument
106 skb = pep_alloc_skb(sk, data, len, priority); in pep_reply()
117 return pn_skb_send(sk, skb, &peer); in pep_reply()
120 static int pep_indicate(struct sock *sk, u8 id, u8 code, in pep_indicate() argument
123 struct pep_sock *pn = pep_sk(sk); in pep_indicate()
127 skb = pep_alloc_skb(sk, data, len, priority); in pep_indicate()
136 return pn_skb_send(sk, skb, NULL); in pep_indicate()
141 static int pipe_handler_request(struct sock *sk, u8 id, u8 code, in pipe_handler_request() argument
144 struct pep_sock *pn = pep_sk(sk); in pipe_handler_request()
148 skb = pep_alloc_skb(sk, data, len, GFP_KERNEL); in pipe_handler_request()
157 return pn_skb_send(sk, skb, NULL); in pipe_handler_request()
160 static int pipe_handler_send_created_ind(struct sock *sk) in pipe_handler_send_created_ind() argument
162 struct pep_sock *pn = pep_sk(sk); in pipe_handler_send_created_ind()
168 return pep_indicate(sk, PNS_PIPE_CREATED_IND, 1 /* sub-blocks */, in pipe_handler_send_created_ind()
172 static int pep_accept_conn(struct sock *sk, struct sk_buff *skb) in pep_accept_conn() argument
189 return pep_reply(sk, skb, PN_PIPE_NO_ERROR, data, sizeof(data), in pep_accept_conn()
193 static int pep_reject_conn(struct sock *sk, struct sk_buff *skb, u8 code, in pep_reject_conn() argument
198 return pep_reply(sk, skb, code, data, sizeof(data), priority); in pep_reject_conn()
203 static int pep_ctrlreq_error(struct sock *sk, struct sk_buff *oskb, u8 code, in pep_ctrlreq_error() argument
216 skb = pep_alloc_skb(sk, data, 4, priority); in pep_ctrlreq_error()
227 return pn_skb_send(sk, skb, &dst); in pep_ctrlreq_error()
230 static int pipe_snd_status(struct sock *sk, u8 type, u8 status, gfp_t priority) in pipe_snd_status() argument
234 return pep_indicate(sk, PNS_PEP_STATUS_IND, PN_PEP_TYPE_COMMON, in pipe_snd_status()
240 static void pipe_grant_credits(struct sock *sk, gfp_t priority) in pipe_grant_credits() argument
242 struct pep_sock *pn = pep_sk(sk); in pipe_grant_credits()
244 BUG_ON(sk->sk_state != TCP_ESTABLISHED); in pipe_grant_credits()
250 if (pipe_snd_status(sk, PN_PEP_IND_FLOW_CONTROL, in pipe_grant_credits()
257 if (pipe_snd_status(sk, PN_PEP_IND_ID_MCFC_GRANT_CREDITS, in pipe_grant_credits()
265 static int pipe_rcv_status(struct sock *sk, struct sk_buff *skb) in pipe_rcv_status() argument
267 struct pep_sock *pn = pep_sk(sk); in pipe_rcv_status()
313 sk->sk_write_space(sk); in pipe_rcv_status()
317 static int pipe_rcv_created(struct sock *sk, struct sk_buff *skb) in pipe_rcv_created() argument
319 struct pep_sock *pn = pep_sk(sk); in pipe_rcv_created()
346 static int pipe_do_rcv(struct sock *sk, struct sk_buff *skb) in pipe_do_rcv() argument
348 struct pep_sock *pn = pep_sk(sk); in pipe_do_rcv()
353 BUG_ON(sk->sk_state == TCP_CLOSE_WAIT); in pipe_do_rcv()
357 pep_reject_conn(sk, skb, PN_PIPE_ERR_PEP_IN_USE, GFP_ATOMIC); in pipe_do_rcv()
361 pep_reply(sk, skb, PN_PIPE_NO_ERROR, NULL, 0, GFP_ATOMIC); in pipe_do_rcv()
362 sk->sk_state = TCP_CLOSE_WAIT; in pipe_do_rcv()
363 if (!sock_flag(sk, SOCK_DEAD)) in pipe_do_rcv()
364 sk->sk_state_change(sk); in pipe_do_rcv()
369 pep_reply(sk, skb, PN_PIPE_NO_ERROR, NULL, 0, GFP_ATOMIC); in pipe_do_rcv()
387 pep_reply(sk, skb, PN_PIPE_NO_ERROR, NULL, 0, GFP_ATOMIC); in pipe_do_rcv()
392 atomic_inc(&sk->sk_drops); in pipe_do_rcv()
405 err = sock_queue_rcv_skb(sk, skb); in pipe_do_rcv()
413 atomic_inc(&sk->sk_drops); in pipe_do_rcv()
418 queue = &sk->sk_receive_queue; in pipe_do_rcv()
422 pipe_rcv_status(sk, skb); in pipe_do_rcv()
426 err = pipe_rcv_created(sk, skb); in pipe_do_rcv()
430 err = pipe_rcv_created(sk, skb); in pipe_do_rcv()
441 sk->sk_write_space(sk); in pipe_do_rcv()
443 if (sk->sk_state == TCP_ESTABLISHED) in pipe_do_rcv()
445 sk->sk_state = TCP_ESTABLISHED; in pipe_do_rcv()
446 pipe_grant_credits(sk, GFP_ATOMIC); in pipe_do_rcv()
450 sk->sk_state = TCP_SYN_RECV; in pipe_do_rcv()
465 skb_set_owner_r(skb, sk); in pipe_do_rcv()
467 if (!sock_flag(sk, SOCK_DEAD)) in pipe_do_rcv()
468 sk->sk_data_ready(sk); in pipe_do_rcv()
473 static void pipe_destruct(struct sock *sk) in pipe_destruct() argument
475 struct pep_sock *pn = pep_sk(sk); in pipe_destruct()
477 skb_queue_purge(&sk->sk_receive_queue); in pipe_destruct()
495 static int pep_connresp_rcv(struct sock *sk, struct sk_buff *skb) in pep_connresp_rcv() argument
497 struct pep_sock *pn = pep_sk(sk); in pep_connresp_rcv()
534 return pipe_handler_send_created_ind(sk); in pep_connresp_rcv()
537 static int pep_enableresp_rcv(struct sock *sk, struct sk_buff *skb) in pep_enableresp_rcv() argument
544 return pep_indicate(sk, PNS_PIPE_ENABLED_IND, 0 /* sub-blocks */, in pep_enableresp_rcv()
549 static void pipe_start_flow_control(struct sock *sk) in pipe_start_flow_control() argument
551 struct pep_sock *pn = pep_sk(sk); in pipe_start_flow_control()
555 sk->sk_write_space(sk); in pipe_start_flow_control()
557 pipe_grant_credits(sk, GFP_ATOMIC); in pipe_start_flow_control()
562 static int pipe_handler_do_rcv(struct sock *sk, struct sk_buff *skb) in pipe_handler_do_rcv() argument
564 struct pep_sock *pn = pep_sk(sk); in pipe_handler_do_rcv()
575 err = sock_queue_rcv_skb(sk, skb); in pipe_handler_do_rcv()
583 atomic_inc(&sk->sk_drops); in pipe_handler_do_rcv()
589 skb_set_owner_r(skb, sk); in pipe_handler_do_rcv()
590 skb_queue_tail(&sk->sk_receive_queue, skb); in pipe_handler_do_rcv()
591 if (!sock_flag(sk, SOCK_DEAD)) in pipe_handler_do_rcv()
592 sk->sk_data_ready(sk); in pipe_handler_do_rcv()
596 if (sk->sk_state != TCP_SYN_SENT) in pipe_handler_do_rcv()
598 if (!sock_flag(sk, SOCK_DEAD)) in pipe_handler_do_rcv()
599 sk->sk_state_change(sk); in pipe_handler_do_rcv()
600 if (pep_connresp_rcv(sk, skb)) { in pipe_handler_do_rcv()
601 sk->sk_state = TCP_CLOSE_WAIT; in pipe_handler_do_rcv()
605 sk->sk_state = TCP_SYN_RECV; in pipe_handler_do_rcv()
607 sk->sk_state = TCP_ESTABLISHED; in pipe_handler_do_rcv()
608 pipe_start_flow_control(sk); in pipe_handler_do_rcv()
613 if (sk->sk_state != TCP_SYN_SENT) in pipe_handler_do_rcv()
616 if (pep_enableresp_rcv(sk, skb)) { in pipe_handler_do_rcv()
617 sk->sk_state = TCP_CLOSE_WAIT; in pipe_handler_do_rcv()
621 sk->sk_state = TCP_ESTABLISHED; in pipe_handler_do_rcv()
622 pipe_start_flow_control(sk); in pipe_handler_do_rcv()
630 pipe_rcv_status(sk, skb); in pipe_handler_do_rcv()
667 static int pep_do_rcv(struct sock *sk, struct sk_buff *skb) in pep_do_rcv() argument
669 struct pep_sock *pn = pep_sk(sk); in pep_do_rcv()
692 if (sk->sk_state != TCP_LISTEN || sk_acceptq_is_full(sk)) { in pep_do_rcv()
693 pep_reject_conn(sk, skb, PN_PIPE_ERR_PEP_IN_USE, in pep_do_rcv()
697 skb_queue_head(&sk->sk_receive_queue, skb); in pep_do_rcv()
698 sk_acceptq_added(sk); in pep_do_rcv()
699 if (!sock_flag(sk, SOCK_DEAD)) in pep_do_rcv()
700 sk->sk_data_ready(sk); in pep_do_rcv()
704 pep_reply(sk, skb, PN_PIPE_NO_ERROR, NULL, 0, GFP_ATOMIC); in pep_do_rcv()
708 pep_ctrlreq_error(sk, skb, PN_PIPE_INVALID_HANDLE, GFP_ATOMIC); in pep_do_rcv()
718 if ((1 << sk->sk_state) in pep_do_rcv()
721 return pipe_handler_do_rcv(sk, skb); in pep_do_rcv()
728 static int pipe_do_remove(struct sock *sk) in pipe_do_remove() argument
730 struct pep_sock *pn = pep_sk(sk); in pipe_do_remove()
734 skb = pep_alloc_skb(sk, NULL, 0, GFP_KERNEL); in pipe_do_remove()
743 return pn_skb_send(sk, skb, NULL); in pipe_do_remove()
747 static void pep_sock_close(struct sock *sk, long timeout) in pep_sock_close() argument
749 struct pep_sock *pn = pep_sk(sk); in pep_sock_close()
752 sock_hold(sk); /* keep a reference after sk_common_release() */ in pep_sock_close()
753 sk_common_release(sk); in pep_sock_close()
755 lock_sock(sk); in pep_sock_close()
756 if ((1 << sk->sk_state) & (TCPF_SYN_RECV|TCPF_ESTABLISHED)) { in pep_sock_close()
757 if (sk->sk_backlog_rcv == pipe_do_rcv) in pep_sock_close()
759 pipe_do_remove(sk); in pep_sock_close()
761 pipe_handler_request(sk, PNS_PEP_DISCONNECT_REQ, PAD, in pep_sock_close()
764 sk->sk_state = TCP_CLOSE; in pep_sock_close()
768 release_sock(sk); in pep_sock_close()
771 gprs_detach(sk); in pep_sock_close()
772 sock_put(sk); in pep_sock_close()
775 static struct sock *pep_sock_accept(struct sock *sk, int flags, int *errp, in pep_sock_accept() argument
778 struct pep_sock *pn = pep_sk(sk), *newpn; in pep_sock_accept()
788 skb = skb_recv_datagram(sk, 0, flags & O_NONBLOCK, errp); in pep_sock_accept()
792 lock_sock(sk); in pep_sock_accept()
793 if (sk->sk_state != TCP_LISTEN) { in pep_sock_accept()
797 sk_acceptq_removed(sk); in pep_sock_accept()
813 pep_reject_conn(sk, skb, PN_PIPE_ERR_INVALID_PARAM, in pep_sock_accept()
845 pep_reject_conn(sk, skb, PN_PIPE_ERR_PEP_IN_USE, GFP_KERNEL); in pep_sock_accept()
850 newsk = sk_alloc(sock_net(sk), PF_PHONET, GFP_KERNEL, sk->sk_prot, in pep_sock_accept()
853 pep_reject_conn(sk, skb, PN_PIPE_ERR_OVERLOAD, GFP_KERNEL); in pep_sock_accept()
861 newsk->sk_protocol = sk->sk_protocol; in pep_sock_accept()
870 sock_hold(sk); in pep_sock_accept()
871 newpn->listener = sk; in pep_sock_accept()
890 release_sock(sk); in pep_sock_accept()
896 static int pep_sock_connect(struct sock *sk, struct sockaddr *addr, int len) in pep_sock_connect() argument
898 struct pep_sock *pn = pep_sk(sk); in pep_sock_connect()
905 err = pipe_handler_request(sk, PNS_PEP_CONNECT_REQ, in pep_sock_connect()
912 sk->sk_state = TCP_SYN_SENT; in pep_sock_connect()
917 static int pep_sock_enable(struct sock *sk, struct sockaddr *addr, int len) in pep_sock_enable() argument
921 err = pipe_handler_request(sk, PNS_PEP_ENABLE_REQ, PAD, in pep_sock_enable()
926 sk->sk_state = TCP_SYN_SENT; in pep_sock_enable()
931 static int pep_ioctl(struct sock *sk, int cmd, unsigned long arg) in pep_ioctl() argument
933 struct pep_sock *pn = pep_sk(sk); in pep_ioctl()
939 if (sk->sk_state == TCP_LISTEN) { in pep_ioctl()
944 lock_sock(sk); in pep_ioctl()
945 if (sock_flag(sk, SOCK_URGINLINE) && in pep_ioctl()
948 else if (!skb_queue_empty(&sk->sk_receive_queue)) in pep_ioctl()
949 answ = skb_peek(&sk->sk_receive_queue)->len; in pep_ioctl()
952 release_sock(sk); in pep_ioctl()
957 lock_sock(sk); in pep_ioctl()
958 if (sk->sk_state == TCP_SYN_SENT) in pep_ioctl()
960 else if (sk->sk_state == TCP_ESTABLISHED) in pep_ioctl()
963 ret = pep_sock_enable(sk, NULL, 0); in pep_ioctl()
964 release_sock(sk); in pep_ioctl()
971 static int pep_init(struct sock *sk) in pep_init() argument
973 struct pep_sock *pn = pep_sk(sk); in pep_init()
975 sk->sk_destruct = pipe_destruct; in pep_init()
990 static int pep_setsockopt(struct sock *sk, int level, int optname, in pep_setsockopt() argument
993 struct pep_sock *pn = pep_sk(sk); in pep_setsockopt()
1003 lock_sock(sk); in pep_setsockopt()
1017 release_sock(sk); in pep_setsockopt()
1018 err = gprs_attach(sk); in pep_setsockopt()
1025 release_sock(sk); in pep_setsockopt()
1026 gprs_detach(sk); in pep_setsockopt()
1032 if ((sk->sk_state == TCP_CLOSE) && in pep_setsockopt()
1046 release_sock(sk); in pep_setsockopt()
1052 static int pep_getsockopt(struct sock *sk, int level, int optname, in pep_getsockopt() argument
1055 struct pep_sock *pn = pep_sk(sk); in pep_getsockopt()
1094 static int pipe_skb_send(struct sock *sk, struct sk_buff *skb) in pipe_skb_send() argument
1096 struct pep_sock *pn = pep_sk(sk); in pipe_skb_send()
1116 err = pn_skb_send(sk, skb, NULL); in pipe_skb_send()
1124 static int pep_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) in pep_sendmsg() argument
1126 struct pep_sock *pn = pep_sk(sk); in pep_sendmsg()
1140 skb = sock_alloc_send_skb(sk, MAX_PNPIPE_HEADER + len, in pep_sendmsg()
1150 lock_sock(sk); in pep_sendmsg()
1151 timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT); in pep_sendmsg()
1152 if ((1 << sk->sk_state) & (TCPF_LISTEN|TCPF_CLOSE)) { in pep_sendmsg()
1156 if (sk->sk_state != TCP_ESTABLISHED) { in pep_sendmsg()
1159 err = sk_stream_wait_connect(sk, &timeo); in pep_sendmsg()
1163 if (sk->sk_state == TCP_CLOSE_WAIT) { in pep_sendmsg()
1168 BUG_ON(sk->sk_state != TCP_ESTABLISHED); in pep_sendmsg()
1184 add_wait_queue(sk_sleep(sk), &wait); in pep_sendmsg()
1185 done = sk_wait_event(sk, &timeo, atomic_read(&pn->tx_credits), &wait); in pep_sendmsg()
1186 remove_wait_queue(sk_sleep(sk), &wait); in pep_sendmsg()
1188 if (sk->sk_state != TCP_ESTABLISHED) in pep_sendmsg()
1192 err = pipe_skb_send(sk, skb); in pep_sendmsg()
1197 release_sock(sk); in pep_sendmsg()
1203 int pep_writeable(struct sock *sk) in pep_writeable() argument
1205 struct pep_sock *pn = pep_sk(sk); in pep_writeable()
1210 int pep_write(struct sock *sk, struct sk_buff *skb) in pep_write() argument
1215 if (pep_sk(sk)->aligned) in pep_write()
1216 return pipe_skb_send(sk, skb); in pep_write()
1238 return pipe_skb_send(sk, rskb); in pep_write()
1241 struct sk_buff *pep_read(struct sock *sk) in pep_read() argument
1243 struct sk_buff *skb = skb_dequeue(&sk->sk_receive_queue); in pep_read()
1245 if (sk->sk_state == TCP_ESTABLISHED) in pep_read()
1246 pipe_grant_credits(sk, GFP_ATOMIC); in pep_read()
1250 static int pep_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, in pep_recvmsg() argument
1260 if (unlikely(1 << sk->sk_state & (TCPF_LISTEN | TCPF_CLOSE))) in pep_recvmsg()
1263 if ((flags & MSG_OOB) || sock_flag(sk, SOCK_URGINLINE)) { in pep_recvmsg()
1265 struct pep_sock *pn = pep_sk(sk); in pep_recvmsg()
1271 pep_ctrlreq_error(sk, skb, PN_PIPE_NO_ERROR, in pep_recvmsg()
1280 skb = skb_recv_datagram(sk, flags, noblock, &err); in pep_recvmsg()
1281 lock_sock(sk); in pep_recvmsg()
1283 if (err == -ENOTCONN && sk->sk_state == TCP_CLOSE_WAIT) in pep_recvmsg()
1285 release_sock(sk); in pep_recvmsg()
1289 if (sk->sk_state == TCP_ESTABLISHED) in pep_recvmsg()
1290 pipe_grant_credits(sk, GFP_KERNEL); in pep_recvmsg()
1291 release_sock(sk); in pep_recvmsg()
1303 skb_free_datagram(sk, skb); in pep_recvmsg()
1307 static void pep_sock_unhash(struct sock *sk) in pep_sock_unhash() argument
1309 struct pep_sock *pn = pep_sk(sk); in pep_sock_unhash()
1312 lock_sock(sk); in pep_sock_unhash()
1317 release_sock(sk); in pep_sock_unhash()
1321 sk_del_node_init(sk); in pep_sock_unhash()
1322 sk = skparent; in pep_sock_unhash()
1328 pn_sock_unhash(&pn->pn_sk.sk); in pep_sock_unhash()
1329 release_sock(sk); in pep_sock_unhash()