• Home
  • Raw
  • Download

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 atomic_inc(&sk->sk_drops); in pipe_do_rcv()
392 err = sock_queue_rcv_skb(sk, skb); in pipe_do_rcv()
400 atomic_inc(&sk->sk_drops); 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 atomic_inc(&sk->sk_drops); 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, int flags, int *errp, in pep_sock_accept() argument
765 struct pep_sock *pn = pep_sk(sk), *newpn; in pep_sock_accept()
775 skb = skb_recv_datagram(sk, 0, flags & O_NONBLOCK, errp); in pep_sock_accept()
779 lock_sock(sk); in pep_sock_accept()
780 if (sk->sk_state != TCP_LISTEN) { in pep_sock_accept()
784 sk_acceptq_removed(sk); in pep_sock_accept()
800 pep_reject_conn(sk, skb, PN_PIPE_ERR_INVALID_PARAM, in pep_sock_accept()
832 pep_reject_conn(sk, skb, PN_PIPE_ERR_PEP_IN_USE, GFP_KERNEL); in pep_sock_accept()
837 newsk = sk_alloc(sock_net(sk), PF_PHONET, GFP_KERNEL, sk->sk_prot, in pep_sock_accept()
840 pep_reject_conn(sk, skb, PN_PIPE_ERR_OVERLOAD, GFP_KERNEL); in pep_sock_accept()
848 newsk->sk_protocol = sk->sk_protocol; in pep_sock_accept()
857 sock_hold(sk); in pep_sock_accept()
858 newpn->listener = sk; in pep_sock_accept()
871 __sock_put(sk); in pep_sock_accept()
878 release_sock(sk); in pep_sock_accept()
884 static int pep_sock_connect(struct sock *sk, struct sockaddr *addr, int len) in pep_sock_connect() argument
886 struct pep_sock *pn = pep_sk(sk); in pep_sock_connect()
893 err = pipe_handler_request(sk, PNS_PEP_CONNECT_REQ, in pep_sock_connect()
900 sk->sk_state = TCP_SYN_SENT; in pep_sock_connect()
905 static int pep_sock_enable(struct sock *sk, struct sockaddr *addr, int len) in pep_sock_enable() argument
909 err = pipe_handler_request(sk, PNS_PEP_ENABLE_REQ, PAD, in pep_sock_enable()
914 sk->sk_state = TCP_SYN_SENT; in pep_sock_enable()
919 static int pep_ioctl(struct sock *sk, int cmd, unsigned long arg) in pep_ioctl() argument
921 struct pep_sock *pn = pep_sk(sk); in pep_ioctl()
927 if (sk->sk_state == TCP_LISTEN) { in pep_ioctl()
932 lock_sock(sk); in pep_ioctl()
933 if (sock_flag(sk, SOCK_URGINLINE) && in pep_ioctl()
936 else if (!skb_queue_empty(&sk->sk_receive_queue)) in pep_ioctl()
937 answ = skb_peek(&sk->sk_receive_queue)->len; in pep_ioctl()
940 release_sock(sk); in pep_ioctl()
945 lock_sock(sk); in pep_ioctl()
946 if (sk->sk_state == TCP_SYN_SENT) in pep_ioctl()
948 else if (sk->sk_state == TCP_ESTABLISHED) in pep_ioctl()
953 ret = pep_sock_enable(sk, NULL, 0); in pep_ioctl()
954 release_sock(sk); in pep_ioctl()
961 static int pep_init(struct sock *sk) in pep_init() argument
963 struct pep_sock *pn = pep_sk(sk); in pep_init()
965 sk->sk_destruct = pipe_destruct; in pep_init()
980 static int pep_setsockopt(struct sock *sk, int level, int optname, in pep_setsockopt() argument
983 struct pep_sock *pn = pep_sk(sk); in pep_setsockopt()
993 lock_sock(sk); in pep_setsockopt()
1007 release_sock(sk); in pep_setsockopt()
1008 err = gprs_attach(sk); in pep_setsockopt()
1015 release_sock(sk); in pep_setsockopt()
1016 gprs_detach(sk); in pep_setsockopt()
1022 if ((sk->sk_state == TCP_CLOSE) && in pep_setsockopt()
1036 release_sock(sk); in pep_setsockopt()
1042 static int pep_getsockopt(struct sock *sk, int level, int optname, in pep_getsockopt() argument
1045 struct pep_sock *pn = pep_sk(sk); in pep_getsockopt()
1084 static int pipe_skb_send(struct sock *sk, struct sk_buff *skb) in pipe_skb_send() argument
1086 struct pep_sock *pn = pep_sk(sk); in pipe_skb_send()
1106 err = pn_skb_send(sk, skb, NULL); in pipe_skb_send()
1114 static int pep_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) in pep_sendmsg() argument
1116 struct pep_sock *pn = pep_sk(sk); in pep_sendmsg()
1130 skb = sock_alloc_send_skb(sk, MAX_PNPIPE_HEADER + len, in pep_sendmsg()
1140 lock_sock(sk); in pep_sendmsg()
1141 timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT); in pep_sendmsg()
1142 if ((1 << sk->sk_state) & (TCPF_LISTEN|TCPF_CLOSE)) { in pep_sendmsg()
1146 if (sk->sk_state != TCP_ESTABLISHED) { in pep_sendmsg()
1149 err = sk_stream_wait_connect(sk, &timeo); in pep_sendmsg()
1153 if (sk->sk_state == TCP_CLOSE_WAIT) { in pep_sendmsg()
1158 BUG_ON(sk->sk_state != TCP_ESTABLISHED); in pep_sendmsg()
1174 add_wait_queue(sk_sleep(sk), &wait); in pep_sendmsg()
1175 done = sk_wait_event(sk, &timeo, atomic_read(&pn->tx_credits), &wait); in pep_sendmsg()
1176 remove_wait_queue(sk_sleep(sk), &wait); in pep_sendmsg()
1178 if (sk->sk_state != TCP_ESTABLISHED) in pep_sendmsg()
1182 err = pipe_skb_send(sk, skb); in pep_sendmsg()
1187 release_sock(sk); in pep_sendmsg()
1193 int pep_writeable(struct sock *sk) in pep_writeable() argument
1195 struct pep_sock *pn = pep_sk(sk); in pep_writeable()
1200 int pep_write(struct sock *sk, struct sk_buff *skb) in pep_write() argument
1205 if (pep_sk(sk)->aligned) in pep_write()
1206 return pipe_skb_send(sk, skb); in pep_write()
1228 return pipe_skb_send(sk, rskb); in pep_write()
1231 struct sk_buff *pep_read(struct sock *sk) in pep_read() argument
1233 struct sk_buff *skb = skb_dequeue(&sk->sk_receive_queue); in pep_read()
1235 if (sk->sk_state == TCP_ESTABLISHED) in pep_read()
1236 pipe_grant_credits(sk, GFP_ATOMIC); in pep_read()
1240 static int pep_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, in pep_recvmsg() argument
1250 if (unlikely(1 << sk->sk_state & (TCPF_LISTEN | TCPF_CLOSE))) in pep_recvmsg()
1253 if ((flags & MSG_OOB) || sock_flag(sk, SOCK_URGINLINE)) { in pep_recvmsg()
1255 struct pep_sock *pn = pep_sk(sk); in pep_recvmsg()
1261 pep_ctrlreq_error(sk, skb, PN_PIPE_NO_ERROR, in pep_recvmsg()
1270 skb = skb_recv_datagram(sk, flags, noblock, &err); in pep_recvmsg()
1271 lock_sock(sk); in pep_recvmsg()
1273 if (err == -ENOTCONN && sk->sk_state == TCP_CLOSE_WAIT) in pep_recvmsg()
1275 release_sock(sk); in pep_recvmsg()
1279 if (sk->sk_state == TCP_ESTABLISHED) in pep_recvmsg()
1280 pipe_grant_credits(sk, GFP_KERNEL); in pep_recvmsg()
1281 release_sock(sk); in pep_recvmsg()
1293 skb_free_datagram(sk, skb); in pep_recvmsg()
1297 static void pep_sock_unhash(struct sock *sk) in pep_sock_unhash() argument
1299 struct pep_sock *pn = pep_sk(sk); in pep_sock_unhash()
1302 lock_sock(sk); in pep_sock_unhash()
1307 release_sock(sk); in pep_sock_unhash()
1311 sk_del_node_init(sk); in pep_sock_unhash()
1312 sk = skparent; in pep_sock_unhash()
1318 pn_sock_unhash(&pn->pn_sk.sk); in pep_sock_unhash()
1319 release_sock(sk); in pep_sock_unhash()