NFC: Remove the rf mode parameter from the DEP link up routine
[deliverable/linux.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
15 * along with this program; if not, write to the
16 * Free Software Foundation, Inc.,
17 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 */
19
20#define pr_fmt(fmt) "llcp: %s: " fmt, __func__
21
22#include <linux/init.h>
23#include <linux/kernel.h>
24#include <linux/module.h>
25#include <linux/nfc.h>
26
27#include "../nfc.h"
28#include "llcp.h"
29
30static struct proto llcp_sock_proto = {
31 .name = "NFC_LLCP",
32 .owner = THIS_MODULE,
33 .obj_size = sizeof(struct nfc_llcp_sock),
34};
35
36static int llcp_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
37{
38 struct sock *sk = sock->sk;
39 struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
40 struct nfc_llcp_local *local;
41 struct nfc_dev *dev;
42 struct sockaddr_nfc_llcp llcp_addr;
43 int len, ret = 0;
44
45 pr_debug("sk %p addr %p family %d\n", sk, addr, addr->sa_family);
46
47 if (!addr || addr->sa_family != AF_NFC)
48 return -EINVAL;
49
50 memset(&llcp_addr, 0, sizeof(llcp_addr));
51 len = min_t(unsigned int, sizeof(llcp_addr), alen);
52 memcpy(&llcp_addr, addr, len);
53
54 /* This is going to be a listening socket, dsap must be 0 */
55 if (llcp_addr.dsap != 0)
56 return -EINVAL;
57
58 lock_sock(sk);
59
60 if (sk->sk_state != LLCP_CLOSED) {
61 ret = -EBADFD;
62 goto error;
63 }
64
65 dev = nfc_get_device(llcp_addr.dev_idx);
66 if (dev == NULL) {
67 ret = -ENODEV;
68 goto error;
69 }
70
71 local = nfc_llcp_find_local(dev);
72 if (local == NULL) {
73 ret = -ENODEV;
74 goto put_dev;
75 }
76
77 llcp_sock->dev = dev;
78 llcp_sock->local = local;
79 llcp_sock->nfc_protocol = llcp_addr.nfc_protocol;
80 llcp_sock->service_name_len = min_t(unsigned int,
81 llcp_addr.service_name_len, NFC_LLCP_MAX_SERVICE_NAME);
82 llcp_sock->service_name = kmemdup(llcp_addr.service_name,
83 llcp_sock->service_name_len, GFP_KERNEL);
84
85 llcp_sock->ssap = nfc_llcp_get_sdp_ssap(local, llcp_sock);
86 if (llcp_sock->ssap == LLCP_MAX_SAP)
87 goto put_dev;
88
89 local->sockets[llcp_sock->ssap] = llcp_sock;
90
91 pr_debug("Socket bound to SAP %d\n", llcp_sock->ssap);
92
93 sk->sk_state = LLCP_BOUND;
94
95put_dev:
96 nfc_put_device(dev);
97
98error:
99 release_sock(sk);
100 return ret;
101}
102
103static int llcp_sock_listen(struct socket *sock, int backlog)
104{
105 struct sock *sk = sock->sk;
106 int ret = 0;
107
108 pr_debug("sk %p backlog %d\n", sk, backlog);
109
110 lock_sock(sk);
111
112 if ((sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM)
113 || sk->sk_state != LLCP_BOUND) {
114 ret = -EBADFD;
115 goto error;
116 }
117
118 sk->sk_max_ack_backlog = backlog;
119 sk->sk_ack_backlog = 0;
120
121 pr_debug("Socket listening\n");
122 sk->sk_state = LLCP_LISTEN;
123
124error:
125 release_sock(sk);
126
127 return ret;
128}
129
130void nfc_llcp_accept_unlink(struct sock *sk)
131{
132 struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
133
134 pr_debug("state %d\n", sk->sk_state);
135
136 list_del_init(&llcp_sock->accept_queue);
137 sk_acceptq_removed(llcp_sock->parent);
138 llcp_sock->parent = NULL;
139
140 sock_put(sk);
141}
142
143void nfc_llcp_accept_enqueue(struct sock *parent, struct sock *sk)
144{
145 struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
146 struct nfc_llcp_sock *llcp_sock_parent = nfc_llcp_sock(parent);
147
148 /* Lock will be free from unlink */
149 sock_hold(sk);
150
151 list_add_tail(&llcp_sock->accept_queue,
152 &llcp_sock_parent->accept_queue);
153 llcp_sock->parent = parent;
154 sk_acceptq_added(parent);
155}
156
157struct sock *nfc_llcp_accept_dequeue(struct sock *parent,
158 struct socket *newsock)
159{
160 struct nfc_llcp_sock *lsk, *n, *llcp_parent;
161 struct sock *sk;
162
163 llcp_parent = nfc_llcp_sock(parent);
164
165 list_for_each_entry_safe(lsk, n, &llcp_parent->accept_queue,
166 accept_queue) {
167 sk = &lsk->sk;
168 lock_sock(sk);
169
170 if (sk->sk_state == LLCP_CLOSED) {
171 release_sock(sk);
172 nfc_llcp_accept_unlink(sk);
173 continue;
174 }
175
176 if (sk->sk_state == LLCP_CONNECTED || !newsock) {
177 nfc_llcp_accept_unlink(sk);
178 if (newsock)
179 sock_graft(sk, newsock);
180
181 release_sock(sk);
182
183 pr_debug("Returning sk state %d\n", sk->sk_state);
184
185 return sk;
186 }
187
188 release_sock(sk);
189 }
190
191 return NULL;
192}
193
194static int llcp_sock_accept(struct socket *sock, struct socket *newsock,
195 int flags)
196{
197 DECLARE_WAITQUEUE(wait, current);
198 struct sock *sk = sock->sk, *new_sk;
199 long timeo;
200 int ret = 0;
201
202 pr_debug("parent %p\n", sk);
203
204 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
205
206 if (sk->sk_state != LLCP_LISTEN) {
207 ret = -EBADFD;
208 goto error;
209 }
210
211 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
212
213 /* Wait for an incoming connection. */
214 add_wait_queue_exclusive(sk_sleep(sk), &wait);
215 while (!(new_sk = nfc_llcp_accept_dequeue(sk, newsock))) {
216 set_current_state(TASK_INTERRUPTIBLE);
217
218 if (!timeo) {
219 ret = -EAGAIN;
220 break;
221 }
222
223 if (signal_pending(current)) {
224 ret = sock_intr_errno(timeo);
225 break;
226 }
227
228 release_sock(sk);
229 timeo = schedule_timeout(timeo);
230 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
231 }
232 __set_current_state(TASK_RUNNING);
233 remove_wait_queue(sk_sleep(sk), &wait);
234
235 if (ret)
236 goto error;
237
238 newsock->state = SS_CONNECTED;
239
240 pr_debug("new socket %p\n", new_sk);
241
242error:
243 release_sock(sk);
244
245 return ret;
246}
247
248static int llcp_sock_getname(struct socket *sock, struct sockaddr *addr,
249 int *len, int peer)
250{
251 struct sockaddr_nfc_llcp *llcp_addr = (struct sockaddr_nfc_llcp *) addr;
252 struct sock *sk = sock->sk;
253 struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
254
255 pr_debug("%p\n", sk);
256
257 addr->sa_family = AF_NFC;
258 *len = sizeof(struct sockaddr_nfc_llcp);
259
260 llcp_addr->dev_idx = llcp_sock->dev->idx;
261 llcp_addr->dsap = llcp_sock->dsap;
262 llcp_addr->ssap = llcp_sock->ssap;
263 llcp_addr->service_name_len = llcp_sock->service_name_len;
264 memcpy(llcp_addr->service_name, llcp_sock->service_name,
265 llcp_addr->service_name_len);
266
267 return 0;
268}
269
270static inline unsigned int llcp_accept_poll(struct sock *parent)
271{
272 struct nfc_llcp_sock *llcp_sock, *n, *parent_sock;
273 struct sock *sk;
274
275 parent_sock = nfc_llcp_sock(parent);
276
277 list_for_each_entry_safe(llcp_sock, n, &parent_sock->accept_queue,
278 accept_queue) {
279 sk = &llcp_sock->sk;
280
281 if (sk->sk_state == LLCP_CONNECTED)
282 return POLLIN | POLLRDNORM;
283 }
284
285 return 0;
286}
287
288static unsigned int llcp_sock_poll(struct file *file, struct socket *sock,
289 poll_table *wait)
290{
291 struct sock *sk = sock->sk;
292 unsigned int mask = 0;
293
294 pr_debug("%p\n", sk);
295
296 sock_poll_wait(file, sk_sleep(sk), wait);
297
298 if (sk->sk_state == LLCP_LISTEN)
299 return llcp_accept_poll(sk);
300
301 if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
302 mask |= POLLERR;
303
304 if (!skb_queue_empty(&sk->sk_receive_queue))
305 mask |= POLLIN;
306
307 if (sk->sk_state == LLCP_CLOSED)
308 mask |= POLLHUP;
309
310 return mask;
311}
312
313static int llcp_sock_release(struct socket *sock)
314{
315 struct sock *sk = sock->sk;
316 struct nfc_llcp_local *local;
317 struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
318
319 if (!sk)
320 return 0;
321
322 pr_debug("%p\n", sk);
323
324 local = llcp_sock->local;
325 if (local == NULL)
326 return -ENODEV;
327
328 mutex_lock(&local->socket_lock);
329
0c318359 330 if (llcp_sock == local->sockets[llcp_sock->ssap])
d646960f 331 local->sockets[llcp_sock->ssap] = NULL;
0c318359
SO
332 else
333 list_del(&llcp_sock->list);
d646960f
SO
334
335 mutex_unlock(&local->socket_lock);
336
337 lock_sock(sk);
338
339 /* Send a DISC */
340 if (sk->sk_state == LLCP_CONNECTED)
341 nfc_llcp_disconnect(llcp_sock);
342
343 if (sk->sk_state == LLCP_LISTEN) {
344 struct nfc_llcp_sock *lsk, *n;
345 struct sock *accept_sk;
346
347 list_for_each_entry_safe(lsk, n, &llcp_sock->accept_queue,
348 accept_queue) {
349 accept_sk = &lsk->sk;
350 lock_sock(accept_sk);
351
352 nfc_llcp_disconnect(lsk);
353 nfc_llcp_accept_unlink(accept_sk);
354
355 release_sock(accept_sk);
356
357 sock_set_flag(sk, SOCK_DEAD);
358 sock_orphan(accept_sk);
359 sock_put(accept_sk);
360 }
361 }
362
363 /* Freeing the SAP */
364 if ((sk->sk_state == LLCP_CONNECTED
365 && llcp_sock->ssap > LLCP_LOCAL_SAP_OFFSET) ||
366 sk->sk_state == LLCP_BOUND ||
367 sk->sk_state == LLCP_LISTEN)
368 nfc_llcp_put_ssap(llcp_sock->local, llcp_sock->ssap);
369
370 sock_set_flag(sk, SOCK_DEAD);
371
372 release_sock(sk);
373
374 sock_orphan(sk);
375 sock_put(sk);
376
377 return 0;
378}
379
380static int llcp_sock_connect(struct socket *sock, struct sockaddr *_addr,
381 int len, int flags)
382{
383 struct sock *sk = sock->sk;
384 struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
385 struct sockaddr_nfc_llcp *addr = (struct sockaddr_nfc_llcp *)_addr;
386 struct nfc_dev *dev;
387 struct nfc_llcp_local *local;
388 int ret = 0;
389
390 pr_debug("sock %p sk %p flags 0x%x\n", sock, sk, flags);
391
392 if (!addr || len < sizeof(struct sockaddr_nfc) ||
393 addr->sa_family != AF_NFC) {
394 pr_err("Invalid socket\n");
395 return -EINVAL;
396 }
397
398 if (addr->service_name_len == 0 && addr->dsap == 0) {
399 pr_err("Missing service name or dsap\n");
400 return -EINVAL;
401 }
402
403 pr_debug("addr dev_idx=%u target_idx=%u protocol=%u\n", addr->dev_idx,
404 addr->target_idx, addr->nfc_protocol);
405
406 lock_sock(sk);
407
408 if (sk->sk_state == LLCP_CONNECTED) {
409 ret = -EISCONN;
410 goto error;
411 }
412
413 dev = nfc_get_device(addr->dev_idx);
414 if (dev == NULL) {
415 ret = -ENODEV;
416 goto error;
417 }
418
419 local = nfc_llcp_find_local(dev);
420 if (local == NULL) {
421 ret = -ENODEV;
422 goto put_dev;
423 }
424
425 device_lock(&dev->dev);
426 if (dev->dep_link_up == false) {
427 ret = -ENOLINK;
428 device_unlock(&dev->dev);
429 goto put_dev;
430 }
431 device_unlock(&dev->dev);
432
433 if (local->rf_mode == NFC_RF_INITIATOR &&
434 addr->target_idx != local->target_idx) {
435 ret = -ENOLINK;
436 goto put_dev;
437 }
438
439 llcp_sock->dev = dev;
440 llcp_sock->local = local;
441 llcp_sock->ssap = nfc_llcp_get_local_ssap(local);
442 if (llcp_sock->ssap == LLCP_SAP_MAX) {
443 ret = -ENOMEM;
444 goto put_dev;
445 }
446 if (addr->service_name_len == 0)
447 llcp_sock->dsap = addr->dsap;
448 else
449 llcp_sock->dsap = LLCP_SAP_SDP;
450 llcp_sock->nfc_protocol = addr->nfc_protocol;
451 llcp_sock->service_name_len = min_t(unsigned int,
452 addr->service_name_len, NFC_LLCP_MAX_SERVICE_NAME);
453 llcp_sock->service_name = kmemdup(addr->service_name,
454 llcp_sock->service_name_len, GFP_KERNEL);
455
456 local->sockets[llcp_sock->ssap] = llcp_sock;
457
458 ret = nfc_llcp_send_connect(llcp_sock);
459 if (ret)
460 goto put_dev;
461
462 sk->sk_state = LLCP_CONNECTED;
463
464 release_sock(sk);
465 return 0;
466
467put_dev:
468 nfc_put_device(dev);
469
470error:
471 release_sock(sk);
472 return ret;
473}
474
53a0ac2e
SO
475static int llcp_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
476 struct msghdr *msg, size_t len)
477{
478 struct sock *sk = sock->sk;
479 struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
480 int ret;
481
482 pr_debug("sock %p sk %p", sock, sk);
483
484 ret = sock_error(sk);
485 if (ret)
486 return ret;
487
488 if (msg->msg_flags & MSG_OOB)
489 return -EOPNOTSUPP;
490
491 lock_sock(sk);
492
493 if (sk->sk_state != LLCP_CONNECTED) {
494 release_sock(sk);
495 return -ENOTCONN;
496 }
497
498 release_sock(sk);
499
500 return nfc_llcp_send_i_frame(llcp_sock, msg, len);
501}
502
d646960f
SO
503static int llcp_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
504 struct msghdr *msg, size_t len, int flags)
505{
506 int noblock = flags & MSG_DONTWAIT;
507 struct sock *sk = sock->sk;
508 unsigned int copied, rlen;
509 struct sk_buff *skb, *cskb;
510 int err = 0;
511
512 pr_debug("%p %zu\n", sk, len);
513
514 lock_sock(sk);
515
516 if (sk->sk_state == LLCP_CLOSED &&
517 skb_queue_empty(&sk->sk_receive_queue)) {
518 release_sock(sk);
519 return 0;
520 }
521
522 release_sock(sk);
523
524 if (flags & (MSG_OOB))
525 return -EOPNOTSUPP;
526
527 skb = skb_recv_datagram(sk, flags, noblock, &err);
528 if (!skb) {
529 pr_err("Recv datagram failed state %d %d %d",
530 sk->sk_state, err, sock_error(sk));
531
532 if (sk->sk_shutdown & RCV_SHUTDOWN)
533 return 0;
534
535 return err;
536 }
537
538 rlen = skb->len; /* real length of skb */
539 copied = min_t(unsigned int, rlen, len);
540
541 cskb = skb;
542 if (memcpy_toiovec(msg->msg_iov, cskb->data, copied)) {
543 if (!(flags & MSG_PEEK))
544 skb_queue_head(&sk->sk_receive_queue, skb);
545 return -EFAULT;
546 }
547
548 /* Mark read part of skb as used */
549 if (!(flags & MSG_PEEK)) {
550
551 /* SOCK_STREAM: re-queue skb if it contains unreceived data */
552 if (sk->sk_type == SOCK_STREAM) {
553 skb_pull(skb, copied);
554 if (skb->len) {
555 skb_queue_head(&sk->sk_receive_queue, skb);
556 goto done;
557 }
558 }
559
560 kfree_skb(skb);
561 }
562
563 /* XXX Queue backlogged skbs */
564
565done:
566 /* SOCK_SEQPACKET: return real length if MSG_TRUNC is set */
567 if (sk->sk_type == SOCK_SEQPACKET && (flags & MSG_TRUNC))
568 copied = rlen;
569
570 return copied;
571}
572
573static const struct proto_ops llcp_sock_ops = {
574 .family = PF_NFC,
575 .owner = THIS_MODULE,
576 .bind = llcp_sock_bind,
577 .connect = llcp_sock_connect,
578 .release = llcp_sock_release,
579 .socketpair = sock_no_socketpair,
580 .accept = llcp_sock_accept,
581 .getname = llcp_sock_getname,
582 .poll = llcp_sock_poll,
583 .ioctl = sock_no_ioctl,
584 .listen = llcp_sock_listen,
585 .shutdown = sock_no_shutdown,
586 .setsockopt = sock_no_setsockopt,
587 .getsockopt = sock_no_getsockopt,
53a0ac2e 588 .sendmsg = llcp_sock_sendmsg,
d646960f
SO
589 .recvmsg = llcp_sock_recvmsg,
590 .mmap = sock_no_mmap,
591};
592
593static void llcp_sock_destruct(struct sock *sk)
594{
595 struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
596
597 pr_debug("%p\n", sk);
598
599 if (sk->sk_state == LLCP_CONNECTED)
600 nfc_put_device(llcp_sock->dev);
601
602 skb_queue_purge(&sk->sk_receive_queue);
603
604 nfc_llcp_sock_free(llcp_sock);
605
606 if (!sock_flag(sk, SOCK_DEAD)) {
607 pr_err("Freeing alive NFC LLCP socket %p\n", sk);
608 return;
609 }
610}
611
612struct sock *nfc_llcp_sock_alloc(struct socket *sock, int type, gfp_t gfp)
613{
614 struct sock *sk;
615 struct nfc_llcp_sock *llcp_sock;
616
617 sk = sk_alloc(&init_net, PF_NFC, gfp, &llcp_sock_proto);
618 if (!sk)
619 return NULL;
620
621 llcp_sock = nfc_llcp_sock(sk);
622
623 sock_init_data(sock, sk);
624 sk->sk_state = LLCP_CLOSED;
625 sk->sk_protocol = NFC_SOCKPROTO_LLCP;
626 sk->sk_type = type;
627 sk->sk_destruct = llcp_sock_destruct;
628
629 llcp_sock->ssap = 0;
630 llcp_sock->dsap = LLCP_SAP_SDP;
631 llcp_sock->send_n = llcp_sock->send_ack_n = 0;
632 llcp_sock->recv_n = llcp_sock->recv_ack_n = 0;
633 llcp_sock->remote_ready = 1;
634 skb_queue_head_init(&llcp_sock->tx_queue);
635 skb_queue_head_init(&llcp_sock->tx_pending_queue);
636 skb_queue_head_init(&llcp_sock->tx_backlog_queue);
637 INIT_LIST_HEAD(&llcp_sock->list);
638 INIT_LIST_HEAD(&llcp_sock->accept_queue);
639
640 if (sock != NULL)
641 sock->state = SS_UNCONNECTED;
642
643 return sk;
644}
645
646void nfc_llcp_sock_free(struct nfc_llcp_sock *sock)
647{
648 kfree(sock->service_name);
649
650 skb_queue_purge(&sock->tx_queue);
651 skb_queue_purge(&sock->tx_pending_queue);
652 skb_queue_purge(&sock->tx_backlog_queue);
653
654 list_del_init(&sock->accept_queue);
655
656 sock->parent = NULL;
657}
658
659static int llcp_sock_create(struct net *net, struct socket *sock,
660 const struct nfc_protocol *nfc_proto)
661{
662 struct sock *sk;
663
664 pr_debug("%p\n", sock);
665
666 if (sock->type != SOCK_STREAM && sock->type != SOCK_DGRAM)
667 return -ESOCKTNOSUPPORT;
668
669 sock->ops = &llcp_sock_ops;
670
671 sk = nfc_llcp_sock_alloc(sock, sock->type, GFP_ATOMIC);
672 if (sk == NULL)
673 return -ENOMEM;
674
675 return 0;
676}
677
678static const struct nfc_protocol llcp_nfc_proto = {
679 .id = NFC_SOCKPROTO_LLCP,
680 .proto = &llcp_sock_proto,
681 .owner = THIS_MODULE,
682 .create = llcp_sock_create
683};
684
685int __init nfc_llcp_sock_init(void)
686{
687 return nfc_proto_register(&llcp_nfc_proto);
688}
689
690void nfc_llcp_sock_exit(void)
691{
692 nfc_proto_unregister(&llcp_nfc_proto);
693}
This page took 0.06992 seconds and 5 git commands to generate.