diff options
Diffstat (limited to 'net/nfc/llcp/sock.c')
-rw-r--r-- | net/nfc/llcp/sock.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/net/nfc/llcp/sock.c b/net/nfc/llcp/sock.c index f738ccd535f1..b8bef367ee49 100644 --- a/net/nfc/llcp/sock.c +++ b/net/nfc/llcp/sock.c | |||
@@ -482,6 +482,34 @@ error: | |||
482 | return ret; | 482 | return ret; |
483 | } | 483 | } |
484 | 484 | ||
485 | static int llcp_sock_sendmsg(struct kiocb *iocb, struct socket *sock, | ||
486 | struct msghdr *msg, size_t len) | ||
487 | { | ||
488 | struct sock *sk = sock->sk; | ||
489 | struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk); | ||
490 | int ret; | ||
491 | |||
492 | pr_debug("sock %p sk %p", sock, sk); | ||
493 | |||
494 | ret = sock_error(sk); | ||
495 | if (ret) | ||
496 | return ret; | ||
497 | |||
498 | if (msg->msg_flags & MSG_OOB) | ||
499 | return -EOPNOTSUPP; | ||
500 | |||
501 | lock_sock(sk); | ||
502 | |||
503 | if (sk->sk_state != LLCP_CONNECTED) { | ||
504 | release_sock(sk); | ||
505 | return -ENOTCONN; | ||
506 | } | ||
507 | |||
508 | release_sock(sk); | ||
509 | |||
510 | return nfc_llcp_send_i_frame(llcp_sock, msg, len); | ||
511 | } | ||
512 | |||
485 | static int llcp_sock_recvmsg(struct kiocb *iocb, struct socket *sock, | 513 | static int llcp_sock_recvmsg(struct kiocb *iocb, struct socket *sock, |
486 | struct msghdr *msg, size_t len, int flags) | 514 | struct msghdr *msg, size_t len, int flags) |
487 | { | 515 | { |
@@ -567,7 +595,7 @@ static const struct proto_ops llcp_sock_ops = { | |||
567 | .shutdown = sock_no_shutdown, | 595 | .shutdown = sock_no_shutdown, |
568 | .setsockopt = sock_no_setsockopt, | 596 | .setsockopt = sock_no_setsockopt, |
569 | .getsockopt = sock_no_getsockopt, | 597 | .getsockopt = sock_no_getsockopt, |
570 | .sendmsg = sock_no_sendmsg, | 598 | .sendmsg = llcp_sock_sendmsg, |
571 | .recvmsg = llcp_sock_recvmsg, | 599 | .recvmsg = llcp_sock_recvmsg, |
572 | .mmap = sock_no_mmap, | 600 | .mmap = sock_no_mmap, |
573 | }; | 601 | }; |