NFC: Keep socket alive until the DISC PDU is actually sent

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>
This commit is contained in:
Thierry Escande 2013-06-04 11:34:51 +02:00 коммит произвёл Samuel Ortiz
Родитель 58e3dd1558
Коммит 17f7ae16ae
3 изменённых файлов: 15 добавлений и 0 удалений

Просмотреть файл

@ -19,6 +19,7 @@
enum llcp_state { enum llcp_state {
LLCP_CONNECTED = 1, /* wait_for_packet() wants that */ LLCP_CONNECTED = 1, /* wait_for_packet() wants that */
LLCP_DISCONNECTING,
LLCP_CLOSED, LLCP_CLOSED,
LLCP_BOUND, LLCP_BOUND,
LLCP_LISTEN, LLCP_LISTEN,

Просмотреть файл

@ -730,6 +730,13 @@ static void nfc_llcp_tx_work(struct work_struct *work)
DUMP_PREFIX_OFFSET, 16, 1, DUMP_PREFIX_OFFSET, 16, 1,
skb->data, skb->len, true); 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) if (ptype == LLCP_PDU_I)
copy_skb = skb_copy(skb, GFP_ATOMIC); copy_skb = skb_copy(skb, GFP_ATOMIC);

Просмотреть файл

@ -626,6 +626,13 @@ static int llcp_sock_release(struct socket *sock)
release_sock(sk); 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) if (sock->type == SOCK_RAW)
nfc_llcp_sock_unlink(&local->raw_sockets, sk); nfc_llcp_sock_unlink(&local->raw_sockets, sk);
else else