]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - net/nfc/llcp_sock.c
UBUNTU: Ubuntu-4.15.0-96.97
[mirror_ubuntu-bionic-kernel.git] / net / nfc / llcp_sock.c
CommitLineData
d646960f
SO
1/*
2 * Copyright (C) 2011 Intel Corporation. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
98b32dec 15 * along with this program; if not, see <http://www.gnu.org/licenses/>.
d646960f
SO
16 */
17
18#define pr_fmt(fmt) "llcp: %s: " fmt, __func__
19
20#include <linux/init.h>
21#include <linux/kernel.h>
22#include <linux/module.h>
23#include <linux/nfc.h>
174cd4b1 24#include <linux/sched/signal.h>
d646960f 25
30cc4587 26#include "nfc.h"
d646960f
SO
27#include "llcp.h"
28
ff353d86
SO
29static int sock_wait_state(struct sock *sk, int state, unsigned long timeo)
30{
31 DECLARE_WAITQUEUE(wait, current);
32 int err = 0;
33
34 pr_debug("sk %p", sk);
35
36 add_wait_queue(sk_sleep(sk), &wait);
37 set_current_state(TASK_INTERRUPTIBLE);
38
39 while (sk->sk_state != state) {
40 if (!timeo) {
41 err = -EINPROGRESS;
42 break;
43 }
44
45 if (signal_pending(current)) {
46 err = sock_intr_errno(timeo);
47 break;
48 }
49
50 release_sock(sk);
51 timeo = schedule_timeout(timeo);
52 lock_sock(sk);
53 set_current_state(TASK_INTERRUPTIBLE);
54
55 err = sock_error(sk);
56 if (err)
57 break;
58 }
59
60 __set_current_state(TASK_RUNNING);
61 remove_wait_queue(sk_sleep(sk), &wait);
62 return err;
63}
64
d646960f
SO
65static struct proto llcp_sock_proto = {
66 .name = "NFC_LLCP",
67 .owner = THIS_MODULE,
68 .obj_size = sizeof(struct nfc_llcp_sock),
69};
70
71static int llcp_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
72{
73 struct sock *sk = sock->sk;
74 struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
75 struct nfc_llcp_local *local;
76 struct nfc_dev *dev;
77 struct sockaddr_nfc_llcp llcp_addr;
78 int len, ret = 0;
79
f6a5885f
MJ
80 if (!addr || alen < offsetofend(struct sockaddr, sa_family) ||
81 addr->sa_family != AF_NFC)
d646960f
SO
82 return -EINVAL;
83
c66433dc
SO
84 pr_debug("sk %p addr %p family %d\n", sk, addr, addr->sa_family);
85
d646960f
SO
86 memset(&llcp_addr, 0, sizeof(llcp_addr));
87 len = min_t(unsigned int, sizeof(llcp_addr), alen);
88 memcpy(&llcp_addr, addr, len);
89
90 /* This is going to be a listening socket, dsap must be 0 */
91 if (llcp_addr.dsap != 0)
92 return -EINVAL;
93
94 lock_sock(sk);
95
96 if (sk->sk_state != LLCP_CLOSED) {
97 ret = -EBADFD;
98 goto error;
99 }
100
101 dev = nfc_get_device(llcp_addr.dev_idx);
102 if (dev == NULL) {
103 ret = -ENODEV;
104 goto error;
105 }
106
107 local = nfc_llcp_find_local(dev);
108 if (local == NULL) {
109 ret = -ENODEV;
110 goto put_dev;
111 }
112
113 llcp_sock->dev = dev;
c7aa1225 114 llcp_sock->local = nfc_llcp_local_get(local);
d646960f
SO
115 llcp_sock->nfc_protocol = llcp_addr.nfc_protocol;
116 llcp_sock->service_name_len = min_t(unsigned int,
427a2eb1
SO
117 llcp_addr.service_name_len,
118 NFC_LLCP_MAX_SERVICE_NAME);
d646960f 119 llcp_sock->service_name = kmemdup(llcp_addr.service_name,
427a2eb1
SO
120 llcp_sock->service_name_len,
121 GFP_KERNEL);
e7ad2173
ED
122 if (!llcp_sock->service_name) {
123 ret = -ENOMEM;
124 goto put_dev;
125 }
d646960f 126 llcp_sock->ssap = nfc_llcp_get_sdp_ssap(local, llcp_sock);
8b7e8eda 127 if (llcp_sock->ssap == LLCP_SAP_MAX) {
e7ad2173
ED
128 kfree(llcp_sock->service_name);
129 llcp_sock->service_name = NULL;
8b7e8eda 130 ret = -EADDRINUSE;
d646960f 131 goto put_dev;
8b7e8eda 132 }
d646960f 133
cbbf4721
SO
134 llcp_sock->reserved_ssap = llcp_sock->ssap;
135
a69f32af 136 nfc_llcp_sock_link(&local->sockets, sk);
d646960f
SO
137
138 pr_debug("Socket bound to SAP %d\n", llcp_sock->ssap);
139
140 sk->sk_state = LLCP_BOUND;
141
142put_dev:
143 nfc_put_device(dev);
144
145error:
146 release_sock(sk);
147 return ret;
148}
149
4463523b
TE
150static int llcp_raw_sock_bind(struct socket *sock, struct sockaddr *addr,
151 int alen)
152{
153 struct sock *sk = sock->sk;
154 struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
155 struct nfc_llcp_local *local;
156 struct nfc_dev *dev;
157 struct sockaddr_nfc_llcp llcp_addr;
158 int len, ret = 0;
159
f6a5885f
MJ
160 if (!addr || alen < offsetofend(struct sockaddr, sa_family) ||
161 addr->sa_family != AF_NFC)
4463523b
TE
162 return -EINVAL;
163
164 pr_debug("sk %p addr %p family %d\n", sk, addr, addr->sa_family);
165
166 memset(&llcp_addr, 0, sizeof(llcp_addr));
167 len = min_t(unsigned int, sizeof(llcp_addr), alen);
168 memcpy(&llcp_addr, addr, len);
169
170 lock_sock(sk);
171
172 if (sk->sk_state != LLCP_CLOSED) {
173 ret = -EBADFD;
174 goto error;
175 }
176
177 dev = nfc_get_device(llcp_addr.dev_idx);
178 if (dev == NULL) {
179 ret = -ENODEV;
180 goto error;
181 }
182
183 local = nfc_llcp_find_local(dev);
184 if (local == NULL) {
185 ret = -ENODEV;
186 goto put_dev;
187 }
188
189 llcp_sock->dev = dev;
190 llcp_sock->local = nfc_llcp_local_get(local);
191 llcp_sock->nfc_protocol = llcp_addr.nfc_protocol;
192
193 nfc_llcp_sock_link(&local->raw_sockets, sk);
194
195 sk->sk_state = LLCP_BOUND;
196
197put_dev:
198 nfc_put_device(dev);
199
200error:
201 release_sock(sk);
202 return ret;
203}
204
d646960f
SO
205static int llcp_sock_listen(struct socket *sock, int backlog)
206{
207 struct sock *sk = sock->sk;
208 int ret = 0;
209
210 pr_debug("sk %p backlog %d\n", sk, backlog);
211
212 lock_sock(sk);
213
874934f4
SJ
214 if ((sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM) ||
215 sk->sk_state != LLCP_BOUND) {
d646960f
SO
216 ret = -EBADFD;
217 goto error;
218 }
219
220 sk->sk_max_ack_backlog = backlog;
221 sk->sk_ack_backlog = 0;
222
223 pr_debug("Socket listening\n");
224 sk->sk_state = LLCP_LISTEN;
225
226error:
227 release_sock(sk);
228
229 return ret;
230}
231
26fd76ca
SO
232static int nfc_llcp_setsockopt(struct socket *sock, int level, int optname,
233 char __user *optval, unsigned int optlen)
234{
235 struct sock *sk = sock->sk;
236 struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
237 u32 opt;
238 int err = 0;
239
240 pr_debug("%p optname %d\n", sk, optname);
241
242 if (level != SOL_NFC)
243 return -ENOPROTOOPT;
244
245 lock_sock(sk);
246
247 switch (optname) {
248 case NFC_LLCP_RW:
249 if (sk->sk_state == LLCP_CONNECTED ||
250 sk->sk_state == LLCP_BOUND ||
251 sk->sk_state == LLCP_LISTEN) {
252 err = -EINVAL;
253 break;
254 }
255
256 if (get_user(opt, (u32 __user *) optval)) {
257 err = -EFAULT;
258 break;
259 }
260
261 if (opt > LLCP_MAX_RW) {
262 err = -EINVAL;
263 break;
264 }
265
266 llcp_sock->rw = (u8) opt;
267
268 break;
269
270 case NFC_LLCP_MIUX:
271 if (sk->sk_state == LLCP_CONNECTED ||
272 sk->sk_state == LLCP_BOUND ||
273 sk->sk_state == LLCP_LISTEN) {
274 err = -EINVAL;
275 break;
276 }
277
278 if (get_user(opt, (u32 __user *) optval)) {
279 err = -EFAULT;
280 break;
281 }
282
283 if (opt > LLCP_MAX_MIUX) {
284 err = -EINVAL;
285 break;
286 }
287
5eef6669 288 llcp_sock->miux = cpu_to_be16((u16) opt);
26fd76ca
SO
289
290 break;
291
292 default:
293 err = -ENOPROTOOPT;
294 break;
295 }
296
297 release_sock(sk);
298
06d44f80
SO
299 pr_debug("%p rw %d miux %d\n", llcp_sock,
300 llcp_sock->rw, llcp_sock->miux);
301
26fd76ca
SO
302 return err;
303}
304
305static int nfc_llcp_getsockopt(struct socket *sock, int level, int optname,
306 char __user *optval, int __user *optlen)
307{
00e856db 308 struct nfc_llcp_local *local;
26fd76ca
SO
309 struct sock *sk = sock->sk;
310 struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
311 int len, err = 0;
064f370c 312 u16 miux, remote_miu;
00e856db 313 u8 rw;
26fd76ca
SO
314
315 pr_debug("%p optname %d\n", sk, optname);
316
317 if (level != SOL_NFC)
318 return -ENOPROTOOPT;
319
320 if (get_user(len, optlen))
321 return -EFAULT;
322
00e856db
SO
323 local = llcp_sock->local;
324 if (!local)
325 return -ENODEV;
326
26fd76ca
SO
327 len = min_t(u32, len, sizeof(u32));
328
329 lock_sock(sk);
330
331 switch (optname) {
332 case NFC_LLCP_RW:
00e856db
SO
333 rw = llcp_sock->rw > LLCP_MAX_RW ? local->rw : llcp_sock->rw;
334 if (put_user(rw, (u32 __user *) optval))
26fd76ca
SO
335 err = -EFAULT;
336
337 break;
338
339 case NFC_LLCP_MIUX:
00e856db
SO
340 miux = be16_to_cpu(llcp_sock->miux) > LLCP_MAX_MIUX ?
341 be16_to_cpu(local->miux) : be16_to_cpu(llcp_sock->miux);
342
343 if (put_user(miux, (u32 __user *) optval))
26fd76ca
SO
344 err = -EFAULT;
345
346 break;
347
064f370c
TE
348 case NFC_LLCP_REMOTE_MIU:
349 remote_miu = llcp_sock->remote_miu > LLCP_MAX_MIU ?
350 local->remote_miu : llcp_sock->remote_miu;
351
352 if (put_user(remote_miu, (u32 __user *) optval))
353 err = -EFAULT;
354
355 break;
356
357 case NFC_LLCP_REMOTE_LTO:
358 if (put_user(local->remote_lto / 10, (u32 __user *) optval))
359 err = -EFAULT;
360
361 break;
362
363 case NFC_LLCP_REMOTE_RW:
364 if (put_user(llcp_sock->remote_rw, (u32 __user *) optval))
26fd76ca
SO
365 err = -EFAULT;
366
367 break;
368
369 default:
370 err = -ENOPROTOOPT;
371 break;
372 }
373
374 release_sock(sk);
375
376 if (put_user(len, optlen))
377 return -EFAULT;
378
379 return err;
380}
381
d646960f
SO
382void nfc_llcp_accept_unlink(struct sock *sk)
383{
384 struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
385
386 pr_debug("state %d\n", sk->sk_state);
387
388 list_del_init(&llcp_sock->accept_queue);
389 sk_acceptq_removed(llcp_sock->parent);
390 llcp_sock->parent = NULL;
391
392 sock_put(sk);
393}
394
395void nfc_llcp_accept_enqueue(struct sock *parent, struct sock *sk)
396{
397 struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
398 struct nfc_llcp_sock *llcp_sock_parent = nfc_llcp_sock(parent);
399
400 /* Lock will be free from unlink */
401 sock_hold(sk);
402
403 list_add_tail(&llcp_sock->accept_queue,
427a2eb1 404 &llcp_sock_parent->accept_queue);
d646960f
SO
405 llcp_sock->parent = parent;
406 sk_acceptq_added(parent);
407}
408
409struct sock *nfc_llcp_accept_dequeue(struct sock *parent,
427a2eb1 410 struct socket *newsock)
d646960f
SO
411{
412 struct nfc_llcp_sock *lsk, *n, *llcp_parent;
413 struct sock *sk;
414
415 llcp_parent = nfc_llcp_sock(parent);
416
417 list_for_each_entry_safe(lsk, n, &llcp_parent->accept_queue,
427a2eb1 418 accept_queue) {
d646960f
SO
419 sk = &lsk->sk;
420 lock_sock(sk);
421
422 if (sk->sk_state == LLCP_CLOSED) {
423 release_sock(sk);
424 nfc_llcp_accept_unlink(sk);
425 continue;
426 }
427
428 if (sk->sk_state == LLCP_CONNECTED || !newsock) {
39a352a5
SO
429 list_del_init(&lsk->accept_queue);
430 sock_put(sk);
431
d646960f
SO
432 if (newsock)
433 sock_graft(sk, newsock);
434
435 release_sock(sk);
436
437 pr_debug("Returning sk state %d\n", sk->sk_state);
438
b141e811
SO
439 sk_acceptq_removed(parent);
440
d646960f
SO
441 return sk;
442 }
443
444 release_sock(sk);
445 }
446
447 return NULL;
448}
449
450static int llcp_sock_accept(struct socket *sock, struct socket *newsock,
cdfbabfb 451 int flags, bool kern)
d646960f
SO
452{
453 DECLARE_WAITQUEUE(wait, current);
454 struct sock *sk = sock->sk, *new_sk;
455 long timeo;
456 int ret = 0;
457
458 pr_debug("parent %p\n", sk);
459
460 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
461
462 if (sk->sk_state != LLCP_LISTEN) {
463 ret = -EBADFD;
464 goto error;
465 }
466
467 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
468
469 /* Wait for an incoming connection. */
470 add_wait_queue_exclusive(sk_sleep(sk), &wait);
471 while (!(new_sk = nfc_llcp_accept_dequeue(sk, newsock))) {
472 set_current_state(TASK_INTERRUPTIBLE);
473
474 if (!timeo) {
475 ret = -EAGAIN;
476 break;
477 }
478
479 if (signal_pending(current)) {
480 ret = sock_intr_errno(timeo);
481 break;
482 }
483
484 release_sock(sk);
485 timeo = schedule_timeout(timeo);
486 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
487 }
488 __set_current_state(TASK_RUNNING);
489 remove_wait_queue(sk_sleep(sk), &wait);
490
491 if (ret)
492 goto error;
493
494 newsock->state = SS_CONNECTED;
495
496 pr_debug("new socket %p\n", new_sk);
497
498error:
499 release_sock(sk);
500
501 return ret;
502}
503
12e5bdfe 504static int llcp_sock_getname(struct socket *sock, struct sockaddr *uaddr,
d646960f
SO
505 int *len, int peer)
506{
d646960f
SO
507 struct sock *sk = sock->sk;
508 struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
12e5bdfe 509 DECLARE_SOCKADDR(struct sockaddr_nfc_llcp *, llcp_addr, uaddr);
d646960f 510
fe3c094a
SO
511 if (llcp_sock == NULL || llcp_sock->dev == NULL)
512 return -EBADFD;
513
12e5bdfe
SO
514 pr_debug("%p %d %d %d\n", sk, llcp_sock->target_idx,
515 llcp_sock->dsap, llcp_sock->ssap);
d646960f 516
5ffedc6e 517 memset(llcp_addr, 0, sizeof(*llcp_addr));
d646960f
SO
518 *len = sizeof(struct sockaddr_nfc_llcp);
519
03c05355
CW
520 lock_sock(sk);
521 if (!llcp_sock->dev) {
522 release_sock(sk);
523 return -EBADFD;
524 }
5ffedc6e 525 llcp_addr->sa_family = AF_NFC;
d646960f 526 llcp_addr->dev_idx = llcp_sock->dev->idx;
12e5bdfe 527 llcp_addr->target_idx = llcp_sock->target_idx;
5ffedc6e 528 llcp_addr->nfc_protocol = llcp_sock->nfc_protocol;
d646960f
SO
529 llcp_addr->dsap = llcp_sock->dsap;
530 llcp_addr->ssap = llcp_sock->ssap;
531 llcp_addr->service_name_len = llcp_sock->service_name_len;
532 memcpy(llcp_addr->service_name, llcp_sock->service_name,
427a2eb1 533 llcp_addr->service_name_len);
03c05355 534 release_sock(sk);
d646960f
SO
535
536 return 0;
537}
538
539static inline unsigned int llcp_accept_poll(struct sock *parent)
540{
413df10b 541 struct nfc_llcp_sock *llcp_sock, *parent_sock;
d646960f
SO
542 struct sock *sk;
543
544 parent_sock = nfc_llcp_sock(parent);
545
413df10b
AL
546 list_for_each_entry(llcp_sock, &parent_sock->accept_queue,
547 accept_queue) {
d646960f
SO
548 sk = &llcp_sock->sk;
549
550 if (sk->sk_state == LLCP_CONNECTED)
551 return POLLIN | POLLRDNORM;
552 }
553
554 return 0;
555}
556
557static unsigned int llcp_sock_poll(struct file *file, struct socket *sock,
427a2eb1 558 poll_table *wait)
d646960f
SO
559{
560 struct sock *sk = sock->sk;
561 unsigned int mask = 0;
562
563 pr_debug("%p\n", sk);
564
565 sock_poll_wait(file, sk_sleep(sk), wait);
566
567 if (sk->sk_state == LLCP_LISTEN)
568 return llcp_accept_poll(sk);
569
09f6676b 570 if (sk->sk_err || !skb_queue_empty_lockless(&sk->sk_error_queue))
7d4c04fc 571 mask |= POLLERR |
8facd5fb 572 (sock_flag(sk, SOCK_SELECT_ERR_QUEUE) ? POLLPRI : 0);
d646960f 573
09f6676b 574 if (!skb_queue_empty_lockless(&sk->sk_receive_queue))
4260c13b 575 mask |= POLLIN | POLLRDNORM;
d646960f
SO
576
577 if (sk->sk_state == LLCP_CLOSED)
578 mask |= POLLHUP;
579
4260c13b
SO
580 if (sk->sk_shutdown & RCV_SHUTDOWN)
581 mask |= POLLRDHUP | POLLIN | POLLRDNORM;
582
583 if (sk->sk_shutdown == SHUTDOWN_MASK)
584 mask |= POLLHUP;
585
b4011239 586 if (sock_writeable(sk) && sk->sk_state == LLCP_CONNECTED)
4260c13b
SO
587 mask |= POLLOUT | POLLWRNORM | POLLWRBAND;
588 else
9cd3e072 589 sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk);
4260c13b
SO
590
591 pr_debug("mask 0x%x\n", mask);
592
d646960f
SO
593 return mask;
594}
595
596static int llcp_sock_release(struct socket *sock)
597{
598 struct sock *sk = sock->sk;
599 struct nfc_llcp_local *local;
600 struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
40c75f81 601 int err = 0;
d646960f
SO
602
603 if (!sk)
604 return 0;
605
606 pr_debug("%p\n", sk);
607
608 local = llcp_sock->local;
40c75f81
SO
609 if (local == NULL) {
610 err = -ENODEV;
611 goto out;
612 }
d646960f 613
d646960f
SO
614 lock_sock(sk);
615
616 /* Send a DISC */
617 if (sk->sk_state == LLCP_CONNECTED)
58e3dd15 618 nfc_llcp_send_disconnect(llcp_sock);
d646960f
SO
619
620 if (sk->sk_state == LLCP_LISTEN) {
621 struct nfc_llcp_sock *lsk, *n;
622 struct sock *accept_sk;
623
624 list_for_each_entry_safe(lsk, n, &llcp_sock->accept_queue,
427a2eb1 625 accept_queue) {
d646960f
SO
626 accept_sk = &lsk->sk;
627 lock_sock(accept_sk);
628
58e3dd15 629 nfc_llcp_send_disconnect(lsk);
d646960f
SO
630 nfc_llcp_accept_unlink(accept_sk);
631
632 release_sock(accept_sk);
d646960f
SO
633 }
634 }
635
cbbf4721
SO
636 if (llcp_sock->reserved_ssap < LLCP_SAP_MAX)
637 nfc_llcp_put_ssap(llcp_sock->local, llcp_sock->ssap);
d646960f 638
d646960f
SO
639 release_sock(sk);
640
17f7ae16
TE
641 /* Keep this sock alive and therefore do not remove it from the sockets
642 * list until the DISC PDU has been actually sent. Otherwise we would
643 * reply with DM PDUs before sending the DISC one.
644 */
645 if (sk->sk_state == LLCP_DISCONNECTING)
646 return err;
647
4463523b
TE
648 if (sock->type == SOCK_RAW)
649 nfc_llcp_sock_unlink(&local->raw_sockets, sk);
650 else
651 nfc_llcp_sock_unlink(&local->sockets, sk);
a69f32af 652
40c75f81 653out:
d646960f
SO
654 sock_orphan(sk);
655 sock_put(sk);
656
40c75f81 657 return err;
d646960f
SO
658}
659
660static int llcp_sock_connect(struct socket *sock, struct sockaddr *_addr,
427a2eb1 661 int len, int flags)
d646960f
SO
662{
663 struct sock *sk = sock->sk;
664 struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
665 struct sockaddr_nfc_llcp *addr = (struct sockaddr_nfc_llcp *)_addr;
666 struct nfc_dev *dev;
667 struct nfc_llcp_local *local;
668 int ret = 0;
669
670 pr_debug("sock %p sk %p flags 0x%x\n", sock, sk, flags);
671
608c4adf 672 if (!addr || len < sizeof(*addr) || addr->sa_family != AF_NFC)
d646960f 673 return -EINVAL;
d646960f 674
32418cfe 675 if (addr->service_name_len == 0 && addr->dsap == 0)
d646960f 676 return -EINVAL;
d646960f
SO
677
678 pr_debug("addr dev_idx=%u target_idx=%u protocol=%u\n", addr->dev_idx,
427a2eb1 679 addr->target_idx, addr->nfc_protocol);
d646960f
SO
680
681 lock_sock(sk);
682
683 if (sk->sk_state == LLCP_CONNECTED) {
684 ret = -EISCONN;
685 goto error;
686 }
687
688 dev = nfc_get_device(addr->dev_idx);
689 if (dev == NULL) {
690 ret = -ENODEV;
691 goto error;
692 }
693
694 local = nfc_llcp_find_local(dev);
695 if (local == NULL) {
696 ret = -ENODEV;
697 goto put_dev;
698 }
699
700 device_lock(&dev->dev);
701 if (dev->dep_link_up == false) {
702 ret = -ENOLINK;
703 device_unlock(&dev->dev);
704 goto put_dev;
705 }
706 device_unlock(&dev->dev);
707
708 if (local->rf_mode == NFC_RF_INITIATOR &&
427a2eb1 709 addr->target_idx != local->target_idx) {
d646960f
SO
710 ret = -ENOLINK;
711 goto put_dev;
712 }
713
714 llcp_sock->dev = dev;
c7aa1225 715 llcp_sock->local = nfc_llcp_local_get(local);
d646960f
SO
716 llcp_sock->ssap = nfc_llcp_get_local_ssap(local);
717 if (llcp_sock->ssap == LLCP_SAP_MAX) {
718 ret = -ENOMEM;
719 goto put_dev;
720 }
cbbf4721
SO
721
722 llcp_sock->reserved_ssap = llcp_sock->ssap;
723
d646960f
SO
724 if (addr->service_name_len == 0)
725 llcp_sock->dsap = addr->dsap;
726 else
727 llcp_sock->dsap = LLCP_SAP_SDP;
728 llcp_sock->nfc_protocol = addr->nfc_protocol;
729 llcp_sock->service_name_len = min_t(unsigned int,
427a2eb1
SO
730 addr->service_name_len,
731 NFC_LLCP_MAX_SERVICE_NAME);
d646960f 732 llcp_sock->service_name = kmemdup(addr->service_name,
427a2eb1
SO
733 llcp_sock->service_name_len,
734 GFP_KERNEL);
d646960f 735
a69f32af 736 nfc_llcp_sock_link(&local->connecting_sockets, sk);
d646960f
SO
737
738 ret = nfc_llcp_send_connect(llcp_sock);
739 if (ret)
a69f32af 740 goto sock_unlink;
d646960f 741
b4011239
SO
742 sk->sk_state = LLCP_CONNECTING;
743
ff353d86
SO
744 ret = sock_wait_state(sk, LLCP_CONNECTED,
745 sock_sndtimeo(sk, flags & O_NONBLOCK));
b4011239 746 if (ret && ret != -EINPROGRESS)
a69f32af 747 goto sock_unlink;
d646960f
SO
748
749 release_sock(sk);
ff353d86 750
b4011239 751 return ret;
d646960f 752
a69f32af
SO
753sock_unlink:
754 nfc_llcp_put_ssap(local, llcp_sock->ssap);
755
756 nfc_llcp_sock_unlink(&local->connecting_sockets, sk);
757
d646960f
SO
758put_dev:
759 nfc_put_device(dev);
760
761error:
762 release_sock(sk);
763 return ret;
764}
765
1b784140
YX
766static int llcp_sock_sendmsg(struct socket *sock, struct msghdr *msg,
767 size_t len)
53a0ac2e
SO
768{
769 struct sock *sk = sock->sk;
770 struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
771 int ret;
772
773 pr_debug("sock %p sk %p", sock, sk);
774
775 ret = sock_error(sk);
776 if (ret)
777 return ret;
778
779 if (msg->msg_flags & MSG_OOB)
780 return -EOPNOTSUPP;
781
782 lock_sock(sk);
783
b874dec2 784 if (sk->sk_type == SOCK_DGRAM) {
342dfc30
SH
785 DECLARE_SOCKADDR(struct sockaddr_nfc_llcp *, addr,
786 msg->msg_name);
b874dec2
SO
787
788 if (msg->msg_namelen < sizeof(*addr)) {
789 release_sock(sk);
b874dec2
SO
790 return -EINVAL;
791 }
792
793 release_sock(sk);
794
795 return nfc_llcp_send_ui_frame(llcp_sock, addr->dsap, addr->ssap,
796 msg, len);
797 }
798
53a0ac2e
SO
799 if (sk->sk_state != LLCP_CONNECTED) {
800 release_sock(sk);
801 return -ENOTCONN;
802 }
803
804 release_sock(sk);
805
806 return nfc_llcp_send_i_frame(llcp_sock, msg, len);
807}
808
1b784140
YX
809static int llcp_sock_recvmsg(struct socket *sock, struct msghdr *msg,
810 size_t len, int flags)
d646960f
SO
811{
812 int noblock = flags & MSG_DONTWAIT;
813 struct sock *sk = sock->sk;
814 unsigned int copied, rlen;
815 struct sk_buff *skb, *cskb;
816 int err = 0;
817
818 pr_debug("%p %zu\n", sk, len);
819
820 lock_sock(sk);
821
822 if (sk->sk_state == LLCP_CLOSED &&
427a2eb1 823 skb_queue_empty(&sk->sk_receive_queue)) {
d646960f
SO
824 release_sock(sk);
825 return 0;
826 }
827
828 release_sock(sk);
829
830 if (flags & (MSG_OOB))
831 return -EOPNOTSUPP;
832
833 skb = skb_recv_datagram(sk, flags, noblock, &err);
834 if (!skb) {
835 pr_err("Recv datagram failed state %d %d %d",
427a2eb1 836 sk->sk_state, err, sock_error(sk));
d646960f
SO
837
838 if (sk->sk_shutdown & RCV_SHUTDOWN)
839 return 0;
840
841 return err;
842 }
843
427a2eb1 844 rlen = skb->len; /* real length of skb */
d646960f
SO
845 copied = min_t(unsigned int, rlen, len);
846
847 cskb = skb;
51f3d02b 848 if (skb_copy_datagram_msg(cskb, 0, msg, copied)) {
d646960f
SO
849 if (!(flags & MSG_PEEK))
850 skb_queue_head(&sk->sk_receive_queue, skb);
851 return -EFAULT;
852 }
853
2c2d45bd
TE
854 sock_recv_timestamp(msg, sk, skb);
855
31ca61a8
SO
856 if (sk->sk_type == SOCK_DGRAM && msg->msg_name) {
857 struct nfc_llcp_ui_cb *ui_cb = nfc_llcp_ui_skb_cb(skb);
342dfc30
SH
858 DECLARE_SOCKADDR(struct sockaddr_nfc_llcp *, sockaddr,
859 msg->msg_name);
31ca61a8 860
fad2e371 861 msg->msg_namelen = sizeof(struct sockaddr_nfc_llcp);
31ca61a8 862
fad2e371 863 pr_debug("Datagram socket %d %d\n", ui_cb->dsap, ui_cb->ssap);
31ca61a8 864
d26d6504 865 memset(sockaddr, 0, sizeof(*sockaddr));
fad2e371
SO
866 sockaddr->sa_family = AF_NFC;
867 sockaddr->nfc_protocol = NFC_PROTO_NFC_DEP;
868 sockaddr->dsap = ui_cb->dsap;
869 sockaddr->ssap = ui_cb->ssap;
31ca61a8
SO
870 }
871
d646960f
SO
872 /* Mark read part of skb as used */
873 if (!(flags & MSG_PEEK)) {
874
875 /* SOCK_STREAM: re-queue skb if it contains unreceived data */
31ca61a8
SO
876 if (sk->sk_type == SOCK_STREAM ||
877 sk->sk_type == SOCK_DGRAM ||
878 sk->sk_type == SOCK_RAW) {
d646960f
SO
879 skb_pull(skb, copied);
880 if (skb->len) {
881 skb_queue_head(&sk->sk_receive_queue, skb);
882 goto done;
883 }
884 }
885
886 kfree_skb(skb);
887 }
888
889 /* XXX Queue backlogged skbs */
890
891done:
892 /* SOCK_SEQPACKET: return real length if MSG_TRUNC is set */
893 if (sk->sk_type == SOCK_SEQPACKET && (flags & MSG_TRUNC))
894 copied = rlen;
895
896 return copied;
897}
898
899static const struct proto_ops llcp_sock_ops = {
900 .family = PF_NFC,
901 .owner = THIS_MODULE,
902 .bind = llcp_sock_bind,
903 .connect = llcp_sock_connect,
904 .release = llcp_sock_release,
905 .socketpair = sock_no_socketpair,
906 .accept = llcp_sock_accept,
907 .getname = llcp_sock_getname,
908 .poll = llcp_sock_poll,
909 .ioctl = sock_no_ioctl,
910 .listen = llcp_sock_listen,
911 .shutdown = sock_no_shutdown,
26fd76ca
SO
912 .setsockopt = nfc_llcp_setsockopt,
913 .getsockopt = nfc_llcp_getsockopt,
53a0ac2e 914 .sendmsg = llcp_sock_sendmsg,
d646960f
SO
915 .recvmsg = llcp_sock_recvmsg,
916 .mmap = sock_no_mmap,
917};
918
4463523b
TE
919static const struct proto_ops llcp_rawsock_ops = {
920 .family = PF_NFC,
921 .owner = THIS_MODULE,
922 .bind = llcp_raw_sock_bind,
923 .connect = sock_no_connect,
924 .release = llcp_sock_release,
925 .socketpair = sock_no_socketpair,
926 .accept = sock_no_accept,
927 .getname = llcp_sock_getname,
928 .poll = llcp_sock_poll,
929 .ioctl = sock_no_ioctl,
930 .listen = sock_no_listen,
931 .shutdown = sock_no_shutdown,
932 .setsockopt = sock_no_setsockopt,
933 .getsockopt = sock_no_getsockopt,
934 .sendmsg = sock_no_sendmsg,
935 .recvmsg = llcp_sock_recvmsg,
936 .mmap = sock_no_mmap,
937};
938
d646960f
SO
939static void llcp_sock_destruct(struct sock *sk)
940{
941 struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
942
943 pr_debug("%p\n", sk);
944
945 if (sk->sk_state == LLCP_CONNECTED)
946 nfc_put_device(llcp_sock->dev);
947
948 skb_queue_purge(&sk->sk_receive_queue);
949
950 nfc_llcp_sock_free(llcp_sock);
951
952 if (!sock_flag(sk, SOCK_DEAD)) {
953 pr_err("Freeing alive NFC LLCP socket %p\n", sk);
954 return;
955 }
956}
957
11aa9c28 958struct sock *nfc_llcp_sock_alloc(struct socket *sock, int type, gfp_t gfp, int kern)
d646960f
SO
959{
960 struct sock *sk;
961 struct nfc_llcp_sock *llcp_sock;
962
11aa9c28 963 sk = sk_alloc(&init_net, PF_NFC, gfp, &llcp_sock_proto, kern);
d646960f
SO
964 if (!sk)
965 return NULL;
966
967 llcp_sock = nfc_llcp_sock(sk);
968
969 sock_init_data(sock, sk);
970 sk->sk_state = LLCP_CLOSED;
971 sk->sk_protocol = NFC_SOCKPROTO_LLCP;
972 sk->sk_type = type;
973 sk->sk_destruct = llcp_sock_destruct;
974
975 llcp_sock->ssap = 0;
976 llcp_sock->dsap = LLCP_SAP_SDP;
06d44f80 977 llcp_sock->rw = LLCP_MAX_RW + 1;
5eef6669 978 llcp_sock->miux = cpu_to_be16(LLCP_MAX_MIUX + 1);
d646960f
SO
979 llcp_sock->send_n = llcp_sock->send_ack_n = 0;
980 llcp_sock->recv_n = llcp_sock->recv_ack_n = 0;
981 llcp_sock->remote_ready = 1;
cbbf4721 982 llcp_sock->reserved_ssap = LLCP_SAP_MAX;
abd18d43 983 nfc_llcp_socket_remote_param_init(llcp_sock);
d646960f
SO
984 skb_queue_head_init(&llcp_sock->tx_queue);
985 skb_queue_head_init(&llcp_sock->tx_pending_queue);
d646960f
SO
986 INIT_LIST_HEAD(&llcp_sock->accept_queue);
987
988 if (sock != NULL)
989 sock->state = SS_UNCONNECTED;
990
991 return sk;
992}
993
994void nfc_llcp_sock_free(struct nfc_llcp_sock *sock)
995{
996 kfree(sock->service_name);
997
998 skb_queue_purge(&sock->tx_queue);
999 skb_queue_purge(&sock->tx_pending_queue);
d646960f
SO
1000
1001 list_del_init(&sock->accept_queue);
40c75f81 1002
d646960f 1003 sock->parent = NULL;
c7aa1225
SO
1004
1005 nfc_llcp_local_put(sock->local);
d646960f
SO
1006}
1007
1008static int llcp_sock_create(struct net *net, struct socket *sock,
11aa9c28 1009 const struct nfc_protocol *nfc_proto, int kern)
d646960f
SO
1010{
1011 struct sock *sk;
1012
1013 pr_debug("%p\n", sock);
1014
4463523b
TE
1015 if (sock->type != SOCK_STREAM &&
1016 sock->type != SOCK_DGRAM &&
1017 sock->type != SOCK_RAW)
d646960f
SO
1018 return -ESOCKTNOSUPPORT;
1019
c559600c
ON
1020 if (sock->type == SOCK_RAW) {
1021 if (!capable(CAP_NET_RAW))
1022 return -EPERM;
4463523b 1023 sock->ops = &llcp_rawsock_ops;
c559600c 1024 } else {
4463523b 1025 sock->ops = &llcp_sock_ops;
c559600c 1026 }
d646960f 1027
11aa9c28 1028 sk = nfc_llcp_sock_alloc(sock, sock->type, GFP_ATOMIC, kern);
d646960f
SO
1029 if (sk == NULL)
1030 return -ENOMEM;
1031
1032 return 0;
1033}
1034
1035static const struct nfc_protocol llcp_nfc_proto = {
1036 .id = NFC_SOCKPROTO_LLCP,
1037 .proto = &llcp_sock_proto,
1038 .owner = THIS_MODULE,
1039 .create = llcp_sock_create
1040};
1041
1042int __init nfc_llcp_sock_init(void)
1043{
1044 return nfc_proto_register(&llcp_nfc_proto);
1045}
1046
1047void nfc_llcp_sock_exit(void)
1048{
1049 nfc_proto_unregister(&llcp_nfc_proto);
1050}