NFC: Handle Receiver Not Ready LLCP frame
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
4722d2b70b
commit
53aef92054
@@ -671,15 +671,15 @@ static void nfc_llcp_recv_hdlc(struct nfc_llcp_local *local,
|
|||||||
nfc_llcp_sock_put(llcp_sock);
|
nfc_llcp_sock_put(llcp_sock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Pass the payload upstream */
|
||||||
|
if (ptype == LLCP_PDU_I) {
|
||||||
|
pr_debug("I frame, queueing on %p\n", &llcp_sock->sk);
|
||||||
|
|
||||||
if (ns == llcp_sock->recv_n)
|
if (ns == llcp_sock->recv_n)
|
||||||
llcp_sock->recv_n = (llcp_sock->recv_n + 1) % 16;
|
llcp_sock->recv_n = (llcp_sock->recv_n + 1) % 16;
|
||||||
else
|
else
|
||||||
pr_err("Received out of sequence I PDU\n");
|
pr_err("Received out of sequence I PDU\n");
|
||||||
|
|
||||||
/* Pass the payload upstream */
|
|
||||||
if (ptype == LLCP_PDU_I) {
|
|
||||||
pr_debug("I frame, queueing on %p\n", &llcp_sock->sk);
|
|
||||||
|
|
||||||
skb_pull(skb, LLCP_HEADER_SIZE + LLCP_SEQUENCE_SIZE);
|
skb_pull(skb, LLCP_HEADER_SIZE + LLCP_SEQUENCE_SIZE);
|
||||||
if (sock_queue_rcv_skb(&llcp_sock->sk, skb)) {
|
if (sock_queue_rcv_skb(&llcp_sock->sk, skb)) {
|
||||||
pr_err("receive queue is full\n");
|
pr_err("receive queue is full\n");
|
||||||
@@ -700,6 +700,11 @@ static void nfc_llcp_recv_hdlc(struct nfc_llcp_local *local,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ptype == LLCP_PDU_RR)
|
||||||
|
llcp_sock->remote_ready = true;
|
||||||
|
else if (ptype == LLCP_PDU_RNR)
|
||||||
|
llcp_sock->remote_ready = false;
|
||||||
|
|
||||||
nfc_llcp_queue_i_frames(llcp_sock);
|
nfc_llcp_queue_i_frames(llcp_sock);
|
||||||
|
|
||||||
release_sock(sk);
|
release_sock(sk);
|
||||||
@@ -813,6 +818,7 @@ static void nfc_llcp_rx_work(struct work_struct *work)
|
|||||||
|
|
||||||
case LLCP_PDU_I:
|
case LLCP_PDU_I:
|
||||||
case LLCP_PDU_RR:
|
case LLCP_PDU_RR:
|
||||||
|
case LLCP_PDU_RNR:
|
||||||
pr_debug("I frame\n");
|
pr_debug("I frame\n");
|
||||||
nfc_llcp_recv_hdlc(local, skb);
|
nfc_llcp_recv_hdlc(local, skb);
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user