85
static int pep_reply(struct sock *sk, struct sk_buff *oskb,
86
u8 code, const void *data, int len, gfp_t priority)
80
static struct sk_buff *pep_alloc_skb(struct sock *sk, const void *payload,
81
int len, gfp_t priority)
88
const struct pnpipehdr *oph = pnp_hdr(oskb);
92
skb = alloc_skb(MAX_PNPIPE_HEADER + len, priority);
83
struct sk_buff *skb = alloc_skb(MAX_PNPIPE_HEADER + len, priority);
95
86
skb_set_owner_w(skb, sk);
97
88
skb_reserve(skb, MAX_PNPIPE_HEADER);
98
89
__skb_put(skb, len);
99
skb_copy_to_linear_data(skb, data, len);
100
__skb_push(skb, sizeof(*ph));
90
skb_copy_to_linear_data(skb, payload, len);
91
__skb_push(skb, sizeof(struct pnpipehdr));
101
92
skb_reset_transport_header(skb);
96
static int pep_reply(struct sock *sk, struct sk_buff *oskb, u8 code,
97
const void *data, int len, gfp_t priority)
99
const struct pnpipehdr *oph = pnp_hdr(oskb);
100
struct pnpipehdr *ph;
102
struct sockaddr_pn peer;
104
skb = pep_alloc_skb(sk, data, len, priority);
102
108
ph = pnp_hdr(skb);
103
109
ph->utid = oph->utid;
104
110
ph->message_id = oph->message_id + 1; /* REQ -> RESP */
105
111
ph->pipe_handle = oph->pipe_handle;
106
112
ph->error_code = code;
108
return pn_skb_send(sk, skb, &pipe_srv);
114
pn_skb_get_src_sockaddr(oskb, &peer);
115
return pn_skb_send(sk, skb, &peer);
118
static int pep_indicate(struct sock *sk, u8 id, u8 code,
119
const void *data, int len, gfp_t priority)
121
struct pep_sock *pn = pep_sk(sk);
122
struct pnpipehdr *ph;
125
skb = pep_alloc_skb(sk, data, len, priority);
132
ph->pipe_handle = pn->pipe_handle;
134
return pn_skb_send(sk, skb, NULL);
113
#ifdef CONFIG_PHONET_PIPECTRLR
114
static u8 pipe_negotiate_fc(u8 *host_fc, u8 *remote_fc, int len)
117
u8 base_fc, final_fc;
119
for (i = 0; i < len; i++) {
120
base_fc = host_fc[i];
121
for (j = 0; j < len; j++) {
122
if (remote_fc[j] == base_fc) {
135
static int pipe_get_flow_info(struct sock *sk, struct sk_buff *skb,
136
u8 *pref_rx_fc, u8 *req_tx_fc)
138
struct pnpipehdr *hdr;
141
if (!pskb_may_pull(skb, sizeof(*hdr) + 4))
147
__skb_pull(skb, sizeof(*hdr) + 4);
149
u8 type, buf[3], len = sizeof(buf);
150
u8 *data = pep_get_sb(skb, &type, &len, buf);
156
case PN_PIPE_SB_REQUIRED_FC_TX:
157
if (len < 3 || (data[2] | data[3] | data[4]) > 3)
159
req_tx_fc[0] = data[2];
160
req_tx_fc[1] = data[3];
161
req_tx_fc[2] = data[4];
164
case PN_PIPE_SB_PREFERRED_FC_RX:
165
if (len < 3 || (data[2] | data[3] | data[4]) > 3)
167
pref_rx_fc[0] = data[2];
168
pref_rx_fc[1] = data[3];
169
pref_rx_fc[2] = data[4];
178
static int pipe_handler_send_req(struct sock *sk, u8 utid,
179
u8 msg_id, gfp_t priority)
182
struct pnpipehdr *ph;
184
struct pep_sock *pn = pep_sk(sk);
186
static const u8 data[4] = {
191
case PNS_PEP_CONNECT_REQ:
195
case PNS_PEP_DISCONNECT_REQ:
196
case PNS_PEP_ENABLE_REQ:
197
case PNS_PEP_DISABLE_REQ:
205
skb = alloc_skb(MAX_PNPIPE_HEADER + len, priority);
208
skb_set_owner_w(skb, sk);
210
skb_reserve(skb, MAX_PNPIPE_HEADER);
213
skb_copy_to_linear_data(skb, data, len);
215
__skb_push(skb, sizeof(*ph));
216
skb_reset_transport_header(skb);
219
ph->message_id = msg_id;
220
ph->pipe_handle = pn->pipe_handle;
221
ph->error_code = PN_PIPE_NO_ERROR;
223
return pn_skb_send(sk, skb, &pn->remote_pep);
226
static int pipe_handler_send_created_ind(struct sock *sk,
230
struct pnpipehdr *ph;
233
struct pep_sock *pn = pep_sk(sk);
234
static u8 data[4] = {
241
* actually, below is number of sub-blocks and not error code.
242
* Pipe_created_ind message format does not have any
243
* error code field. However, the Phonet stack will always send
244
* an error code as part of pnpipehdr. So, use that err_code to
245
* specify the number of sub-blocks.
249
skb = alloc_skb(MAX_PNPIPE_HEADER + sizeof(data), GFP_ATOMIC);
252
skb_set_owner_w(skb, sk);
254
skb_reserve(skb, MAX_PNPIPE_HEADER);
255
__skb_put(skb, sizeof(data));
256
skb_copy_to_linear_data(skb, data, sizeof(data));
257
__skb_push(skb, sizeof(*ph));
258
skb_reset_transport_header(skb);
261
ph->message_id = msg_id;
262
ph->pipe_handle = pn->pipe_handle;
263
ph->error_code = err_code;
265
return pn_skb_send(sk, skb, &pn->remote_pep);
268
static int pipe_handler_send_ind(struct sock *sk, u8 utid, u8 msg_id)
271
struct pnpipehdr *ph;
273
struct pep_sock *pn = pep_sk(sk);
276
* actually, below is a filler.
277
* Pipe_enabled/disabled_ind message format does not have any
278
* error code field. However, the Phonet stack will always send
279
* an error code as part of pnpipehdr. So, use that err_code to
280
* specify the filler value.
284
skb = alloc_skb(MAX_PNPIPE_HEADER, GFP_ATOMIC);
287
skb_set_owner_w(skb, sk);
289
skb_reserve(skb, MAX_PNPIPE_HEADER);
290
__skb_push(skb, sizeof(*ph));
291
skb_reset_transport_header(skb);
294
ph->message_id = msg_id;
295
ph->pipe_handle = pn->pipe_handle;
296
ph->error_code = err_code;
298
return pn_skb_send(sk, skb, &pn->remote_pep);
301
static int pipe_handler_enable_pipe(struct sock *sk, int enable)
306
utid = PNS_PIPE_ENABLE_UTID;
307
req = PNS_PEP_ENABLE_REQ;
309
utid = PNS_PIPE_DISABLE_UTID;
310
req = PNS_PEP_DISABLE_REQ;
312
return pipe_handler_send_req(sk, utid, req, GFP_ATOMIC);
139
static int pipe_handler_request(struct sock *sk, u8 id, u8 code,
140
const void *data, int len)
142
struct pep_sock *pn = pep_sk(sk);
143
struct pnpipehdr *ph;
146
skb = pep_alloc_skb(sk, data, len, GFP_KERNEL);
151
ph->utid = id; /* whatever */
153
ph->pipe_handle = pn->pipe_handle;
155
return pn_skb_send(sk, skb, NULL);
158
static int pipe_handler_send_created_ind(struct sock *sk)
160
struct pep_sock *pn = pep_sk(sk);
162
PN_PIPE_SB_NEGOTIATED_FC, pep_sb_size(2),
163
pn->tx_fc, pn->rx_fc,
166
return pep_indicate(sk, PNS_PIPE_CREATED_IND, 1 /* sub-blocks */,
167
data, 4, GFP_ATOMIC);
316
170
static int pep_accept_conn(struct sock *sk, struct sk_buff *skb)
375
228
static int pipe_snd_status(struct sock *sk, u8 type, u8 status, gfp_t priority)
377
struct pep_sock *pn = pep_sk(sk);
378
struct pnpipehdr *ph;
381
skb = alloc_skb(MAX_PNPIPE_HEADER + 4, priority);
384
skb_set_owner_w(skb, sk);
386
skb_reserve(skb, MAX_PNPIPE_HEADER + 4);
387
__skb_push(skb, sizeof(*ph) + 4);
388
skb_reset_transport_header(skb);
391
ph->message_id = PNS_PEP_STATUS_IND;
392
ph->pipe_handle = pn->pipe_handle;
393
ph->pep_type = PN_PEP_TYPE_COMMON;
397
ph->data[4] = status;
399
#ifdef CONFIG_PHONET_PIPECTRLR
400
return pn_skb_send(sk, skb, &pn->remote_pep);
402
return pn_skb_send(sk, skb, &pipe_srv);
230
u8 data[4] = { type, PAD, PAD, status };
232
return pep_indicate(sk, PNS_PEP_STATUS_IND, PN_PEP_TYPE_COMMON,
406
236
/* Send our RX flow control information to the sender.
407
237
* Socket must be locked. */
408
static void pipe_grant_credits(struct sock *sk)
238
static void pipe_grant_credits(struct sock *sk, gfp_t priority)
410
240
struct pep_sock *pn = pep_sk(sk);
681
477
skb_queue_purge(&pn->ctrlreq_queue);
684
#ifdef CONFIG_PHONET_PIPECTRLR
480
static u8 pipe_negotiate_fc(const u8 *fcs, unsigned n)
483
u8 final_fc = PN_NO_FLOW_CONTROL;
485
for (i = 0; i < n; i++) {
488
if (fc > final_fc && fc < PN_MAX_FLOW_CONTROL)
685
494
static int pep_connresp_rcv(struct sock *sk, struct sk_buff *skb)
687
496
struct pep_sock *pn = pep_sk(sk);
688
u8 host_pref_rx_fc[3] = {3, 2, 1}, host_req_tx_fc[3] = {3, 2, 1};
689
u8 remote_pref_rx_fc[3], remote_req_tx_fc[3];
690
u8 negotiated_rx_fc, negotiated_tx_fc;
693
pipe_get_flow_info(sk, skb, remote_pref_rx_fc,
695
negotiated_tx_fc = pipe_negotiate_fc(remote_req_tx_fc,
697
sizeof(host_pref_rx_fc));
698
negotiated_rx_fc = pipe_negotiate_fc(host_req_tx_fc,
700
sizeof(host_pref_rx_fc));
702
pn->pipe_state = PIPE_DISABLED;
703
sk->sk_state = TCP_SYN_RECV;
704
sk->sk_backlog_rcv = pipe_do_rcv;
705
sk->sk_destruct = pipe_destruct;
707
pn->rx_fc = negotiated_rx_fc;
708
pn->tx_fc = negotiated_tx_fc;
709
sk->sk_state_change(sk);
711
ret = pipe_handler_send_created_ind(sk,
712
PNS_PIPE_CREATED_IND_UTID,
720
static int pep_connreq_rcv(struct sock *sk, struct sk_buff *skb)
723
struct pep_sock *newpn, *pn = pep_sk(sk);
724
497
struct pnpipehdr *hdr;
725
struct sockaddr_pn dst;
727
u8 pipe_handle, enabled, n_sb;
730
500
if (!pskb_pull(skb, sizeof(*hdr) + 4))
733
503
hdr = pnp_hdr(skb);
734
pipe_handle = hdr->pipe_handle;
735
switch (hdr->state_after_connect) {
736
case PN_PIPE_DISABLE:
743
pep_reject_conn(sk, skb, PN_PIPE_ERR_INVALID_PARAM);
746
peer_type = hdr->other_pep_type << 8;
748
if (unlikely(sk->sk_state != TCP_LISTEN) || sk_acceptq_is_full(sk)) {
749
pep_reject_conn(sk, skb, PN_PIPE_ERR_PEP_IN_USE);
753
/* Parse sub-blocks (options) */
504
if (hdr->error_code != PN_PIPE_NO_ERROR)
505
return -ECONNREFUSED;
507
/* Parse sub-blocks */
754
508
n_sb = hdr->data[4];
755
509
while (n_sb > 0) {
756
u8 type, buf[1], len = sizeof(buf);
510
u8 type, buf[6], len = sizeof(buf);
757
511
const u8 *data = pep_get_sb(skb, &type, &len, buf);
759
513
if (data == NULL)
762
case PN_PIPE_SB_CONNECT_REQ_PEP_SUB_TYPE:
765
peer_type = (peer_type & 0xff00) | data[0];
767
case PN_PIPE_SB_ALIGNED_DATA:
768
aligned = data[0] != 0;
517
case PN_PIPE_SB_REQUIRED_FC_TX:
518
if (len < 2 || len < data[0])
520
pn->tx_fc = pipe_negotiate_fc(data + 2, len - 2);
523
case PN_PIPE_SB_PREFERRED_FC_RX:
524
if (len < 2 || len < data[0])
526
pn->rx_fc = pipe_negotiate_fc(data + 2, len - 2);
774
skb = skb_clone(skb, GFP_ATOMIC);
778
/* Create a new to-be-accepted sock */
779
newsk = sk_alloc(sock_net(sk), PF_PHONET, GFP_ATOMIC, sk->sk_prot);
533
return pipe_handler_send_created_ind(sk);
536
/* Queue an skb to an actively connected sock.
537
* Socket lock must be held. */
538
static int pipe_handler_do_rcv(struct sock *sk, struct sk_buff *skb)
540
struct pep_sock *pn = pep_sk(sk);
541
struct pnpipehdr *hdr = pnp_hdr(skb);
542
int err = NET_RX_SUCCESS;
544
switch (hdr->message_id) {
545
case PNS_PIPE_ALIGNED_DATA:
549
__skb_pull(skb, 3); /* Pipe data header */
550
if (!pn_flow_safe(pn->rx_fc)) {
551
err = sock_queue_rcv_skb(sk, skb);
553
return NET_RX_SUCCESS;
558
if (pn->rx_credits == 0) {
559
atomic_inc(&sk->sk_drops);
565
skb_set_owner_r(skb, sk);
567
skb_queue_tail(&sk->sk_receive_queue, skb);
568
if (!sock_flag(sk, SOCK_DEAD))
569
sk->sk_data_ready(sk, err);
570
return NET_RX_SUCCESS;
572
case PNS_PEP_CONNECT_RESP:
573
if (sk->sk_state != TCP_SYN_SENT)
575
if (!sock_flag(sk, SOCK_DEAD))
576
sk->sk_state_change(sk);
577
if (pep_connresp_rcv(sk, skb)) {
578
sk->sk_state = TCP_CLOSE_WAIT;
582
sk->sk_state = TCP_ESTABLISHED;
583
if (!pn_flow_safe(pn->tx_fc)) {
584
atomic_set(&pn->tx_credits, 1);
585
sk->sk_write_space(sk);
587
pipe_grant_credits(sk, GFP_ATOMIC);
590
case PNS_PEP_DISCONNECT_RESP:
591
/* sock should already be dead, nothing to do */
594
case PNS_PEP_STATUS_IND:
595
pipe_rcv_status(sk, skb);
784
sock_init_data(NULL, newsk);
785
newsk->sk_state = TCP_SYN_RECV;
786
newsk->sk_backlog_rcv = pipe_do_rcv;
787
newsk->sk_protocol = sk->sk_protocol;
788
newsk->sk_destruct = pipe_destruct;
790
newpn = pep_sk(newsk);
791
pn_skb_get_dst_sockaddr(skb, &dst);
792
newpn->pn_sk.sobject = pn_sockaddr_get_object(&dst);
793
newpn->pn_sk.resource = pn->pn_sk.resource;
794
skb_queue_head_init(&newpn->ctrlreq_queue);
795
newpn->pipe_handle = pipe_handle;
796
atomic_set(&newpn->tx_credits, 0);
797
newpn->peer_type = peer_type;
798
newpn->rx_credits = 0;
799
newpn->rx_fc = newpn->tx_fc = PN_LEGACY_FLOW_CONTROL;
800
newpn->init_enable = enabled;
801
newpn->aligned = aligned;
803
BUG_ON(!skb_queue_empty(&newsk->sk_receive_queue));
804
skb_queue_head(&newsk->sk_receive_queue, skb);
805
if (!sock_flag(sk, SOCK_DEAD))
806
sk->sk_data_ready(sk, 0);
808
sk_acceptq_added(sk);
809
sk_add_node(newsk, &pn->ackq);
813
602
/* Listening sock must be locked */
974
static int pep_wait_connreq(struct sock *sk, int noblock)
976
struct task_struct *tsk = current;
977
struct pep_sock *pn = pep_sk(sk);
978
long timeo = sock_rcvtimeo(sk, noblock);
983
if (sk->sk_state != TCP_LISTEN)
985
if (!hlist_empty(&pn->ackq))
989
if (signal_pending(tsk))
990
return sock_intr_errno(timeo);
992
prepare_to_wait_exclusive(sk_sleep(sk), &wait,
995
timeo = schedule_timeout(timeo);
997
finish_wait(sk_sleep(sk), &wait);
1003
741
static struct sock *pep_sock_accept(struct sock *sk, int flags, int *errp)
1005
struct pep_sock *pn = pep_sk(sk);
743
struct pep_sock *pn = pep_sk(sk), *newpn;
1006
744
struct sock *newsk = NULL;
1007
struct sk_buff *oskb;
746
struct pnpipehdr *hdr;
747
struct sockaddr_pn dst, src;
750
u8 pipe_handle, enabled, n_sb;
753
skb = skb_recv_datagram(sk, 0, flags & O_NONBLOCK, errp);
1011
err = pep_wait_connreq(sk, flags & O_NONBLOCK);
1015
newsk = __sk_head(&pn->ackq);
1017
oskb = skb_dequeue(&newsk->sk_receive_queue);
1018
err = pep_accept_conn(newsk, oskb);
1020
skb_queue_head(&newsk->sk_receive_queue, oskb);
758
if (sk->sk_state != TCP_LISTEN) {
762
sk_acceptq_removed(sk);
765
if (!pskb_may_pull(skb, sizeof(*hdr) + 4))
769
pipe_handle = hdr->pipe_handle;
770
switch (hdr->state_after_connect) {
771
case PN_PIPE_DISABLE:
778
pep_reject_conn(sk, skb, PN_PIPE_ERR_INVALID_PARAM,
782
peer_type = hdr->other_pep_type << 8;
784
/* Parse sub-blocks (options) */
787
u8 type, buf[1], len = sizeof(buf);
788
const u8 *data = pep_get_sb(skb, &type, &len, buf);
793
case PN_PIPE_SB_CONNECT_REQ_PEP_SUB_TYPE:
796
peer_type = (peer_type & 0xff00) | data[0];
798
case PN_PIPE_SB_ALIGNED_DATA:
799
aligned = data[0] != 0;
805
/* Check for duplicate pipe handle */
806
newsk = pep_find_pipe(&pn->hlist, &dst, pipe_handle);
807
if (unlikely(newsk)) {
810
pep_reject_conn(sk, skb, PN_PIPE_ERR_PEP_IN_USE, GFP_KERNEL);
814
/* Create a new to-be-accepted sock */
815
newsk = sk_alloc(sock_net(sk), PF_PHONET, GFP_KERNEL, sk->sk_prot);
817
pep_reject_conn(sk, skb, PN_PIPE_ERR_OVERLOAD, GFP_KERNEL);
822
sock_init_data(NULL, newsk);
823
newsk->sk_state = TCP_SYN_RECV;
824
newsk->sk_backlog_rcv = pipe_do_rcv;
825
newsk->sk_protocol = sk->sk_protocol;
826
newsk->sk_destruct = pipe_destruct;
828
newpn = pep_sk(newsk);
829
pn_skb_get_dst_sockaddr(skb, &dst);
830
pn_skb_get_src_sockaddr(skb, &src);
831
newpn->pn_sk.sobject = pn_sockaddr_get_object(&dst);
832
newpn->pn_sk.dobject = pn_sockaddr_get_object(&src);
833
newpn->pn_sk.resource = pn_sockaddr_get_resource(&dst);
1027
pep_sk(newsk)->listener = sk;
835
newpn->listener = sk;
836
skb_queue_head_init(&newpn->ctrlreq_queue);
837
newpn->pipe_handle = pipe_handle;
838
atomic_set(&newpn->tx_credits, 0);
840
newpn->peer_type = peer_type;
841
newpn->rx_credits = 0;
842
newpn->rx_fc = newpn->tx_fc = PN_LEGACY_FLOW_CONTROL;
843
newpn->init_enable = enabled;
844
newpn->aligned = aligned;
1030
sk_del_node_init(newsk);
1031
sk_acceptq_removed(sk);
846
err = pep_accept_conn(newsk, skb);
1032
852
sk_add_node(newsk, &pn->hlist);
1036
854
release_sock(sk);
1041
#ifdef CONFIG_PHONET_PIPECTRLR
1042
860
static int pep_sock_connect(struct sock *sk, struct sockaddr *addr, int len)
1044
862
struct pep_sock *pn = pep_sk(sk);
1045
struct sockaddr_pn *spn = (struct sockaddr_pn *)addr;
1047
memcpy(&pn->remote_pep, spn, sizeof(struct sockaddr_pn));
1049
return pipe_handler_send_req(sk,
1050
PNS_PEP_CONNECT_UTID, PNS_PEP_CONNECT_REQ,
864
u8 data[4] = { 0 /* sub-blocks */, PAD, PAD, PAD };
866
pn->pipe_handle = 1; /* anything but INVALID_HANDLE */
867
err = pipe_handler_request(sk, PNS_PEP_CONNECT_REQ,
868
PN_PIPE_ENABLE, data, 4);
870
pn->pipe_handle = PN_PIPE_INVALID_HANDLE;
873
sk->sk_state = TCP_SYN_SENT;
1055
877
static int pep_ioctl(struct sock *sk, int cmd, unsigned long arg)