Skip to content

Commit

Permalink
NFC: Keep socket alive until the DISC PDU is actually sent
Browse files Browse the repository at this point in the history
This patch keeps the socket alive and therefore does not remove
it from the sockets list in the local until the DISC PDU has been
actually sent. Otherwise we would reply with DM PDUs before sending
the DISC one.

Signed-off-by: Thierry Escande <thierry.escande@linux.intel.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
  • Loading branch information
Thierry Escande authored and Samuel Ortiz committed Jun 14, 2013
1 parent 58e3dd1 commit 17f7ae1
Showing 3 changed files with 15 additions and 0 deletions.
1 change: 1 addition & 0 deletions net/nfc/llcp.h
Original file line number Diff line number Diff line change
@@ -19,6 +19,7 @@

enum llcp_state {
LLCP_CONNECTED = 1, /* wait_for_packet() wants that */
LLCP_DISCONNECTING,
LLCP_CLOSED,
LLCP_BOUND,
LLCP_LISTEN,
7 changes: 7 additions & 0 deletions net/nfc/llcp_core.c
Original file line number Diff line number Diff line change
@@ -730,6 +730,13 @@ static void nfc_llcp_tx_work(struct work_struct *work)
DUMP_PREFIX_OFFSET, 16, 1,
skb->data, skb->len, true);

if (ptype == LLCP_PDU_DISC && sk != NULL &&
sk->sk_state == LLCP_DISCONNECTING) {
nfc_llcp_sock_unlink(&local->sockets, sk);
sock_orphan(sk);
sock_put(sk);
}

if (ptype == LLCP_PDU_I)
copy_skb = skb_copy(skb, GFP_ATOMIC);

7 changes: 7 additions & 0 deletions net/nfc/llcp_sock.c
Original file line number Diff line number Diff line change
@@ -626,6 +626,13 @@ static int llcp_sock_release(struct socket *sock)

release_sock(sk);

/* Keep this sock alive and therefore do not remove it from the sockets
* list until the DISC PDU has been actually sent. Otherwise we would
* reply with DM PDUs before sending the DISC one.
*/
if (sk->sk_state == LLCP_DISCONNECTING)
return err;

if (sock->type == SOCK_RAW)
nfc_llcp_sock_unlink(&local->raw_sockets, sk);
else

0 comments on commit 17f7ae1

Please sign in to comment.