Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 53a0ac2e authored by Samuel Ortiz's avatar Samuel Ortiz Committed by John W. Linville
Browse files

NFC: LLCP socket sendmsg implemetation

parent 53aef920
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -397,3 +397,34 @@ int nfc_llcp_send_disconnect(struct nfc_llcp_sock *sock)

	return 0;
}

int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock,
				struct msghdr *msg, size_t len)
{
	struct sk_buff *pdu;
	struct sock *sk;

	pr_debug("Send I frame\n");

	pdu = llcp_allocate_pdu(sock, LLCP_PDU_I, len + LLCP_SEQUENCE_SIZE);
	if (pdu == NULL)
		return -ENOMEM;

	skb_put(pdu, LLCP_SEQUENCE_SIZE);

	if (memcpy_fromiovec(skb_put(pdu, len), msg->msg_iov, len)) {
		kfree_skb(pdu);
		return -EFAULT;
	}

	skb_queue_head(&sock->tx_queue, pdu);

	sk = &sock->sk;
	lock_sock(sk);

	nfc_llcp_queue_i_frames(sock);

	release_sock(sk);

	return 0;
}
+2 −0
Original line number Diff line number Diff line
@@ -188,6 +188,8 @@ int nfc_llcp_send_connect(struct nfc_llcp_sock *sock);
int nfc_llcp_send_cc(struct nfc_llcp_sock *sock);
int nfc_llcp_send_dm(struct nfc_llcp_local *local, u8 ssap, u8 dsap, u8 reason);
int nfc_llcp_send_disconnect(struct nfc_llcp_sock *sock);
int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock,
				struct msghdr *msg, size_t len);

/* Socket API */
int __init nfc_llcp_sock_init(void);
+29 −1
Original line number Diff line number Diff line
@@ -482,6 +482,34 @@ static int llcp_sock_connect(struct socket *sock, struct sockaddr *_addr,
	return ret;
}

static int llcp_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
				struct msghdr *msg, size_t len)
{
	struct sock *sk = sock->sk;
	struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
	int ret;

	pr_debug("sock %p sk %p", sock, sk);

	ret = sock_error(sk);
	if (ret)
		return ret;

	if (msg->msg_flags & MSG_OOB)
		return -EOPNOTSUPP;

	lock_sock(sk);

	if (sk->sk_state != LLCP_CONNECTED) {
		release_sock(sk);
		return -ENOTCONN;
	}

	release_sock(sk);

	return nfc_llcp_send_i_frame(llcp_sock, msg, len);
}

static int llcp_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
			     struct msghdr *msg, size_t len, int flags)
{
@@ -567,7 +595,7 @@ static const struct proto_ops llcp_sock_ops = {
	.shutdown       = sock_no_shutdown,
	.setsockopt     = sock_no_setsockopt,
	.getsockopt     = sock_no_getsockopt,
	.sendmsg        = sock_no_sendmsg,
	.sendmsg        = llcp_sock_sendmsg,
	.recvmsg        = llcp_sock_recvmsg,
	.mmap           = sock_no_mmap,
};