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

Commit 3bbc0ceb authored by Samuel Ortiz's avatar Samuel Ortiz
Browse files

NFC: llcp: Report error to pending sockets when a device is removed

parent e6a3a4bb
Loading
Loading
Loading
Loading
+12 −4
Original line number Original line Diff line number Diff line
@@ -68,7 +68,8 @@ static void nfc_llcp_socket_purge(struct nfc_llcp_sock *sock)
	}
	}
}
}


static void nfc_llcp_socket_release(struct nfc_llcp_local *local, bool listen)
static void nfc_llcp_socket_release(struct nfc_llcp_local *local, bool listen,
				    int err)
{
{
	struct sock *sk;
	struct sock *sk;
	struct hlist_node *tmp;
	struct hlist_node *tmp;
@@ -100,7 +101,10 @@ static void nfc_llcp_socket_release(struct nfc_llcp_local *local, bool listen)


				nfc_llcp_accept_unlink(accept_sk);
				nfc_llcp_accept_unlink(accept_sk);


				if (err)
					accept_sk->sk_err = err;
				accept_sk->sk_state = LLCP_CLOSED;
				accept_sk->sk_state = LLCP_CLOSED;
				accept_sk->sk_state_change(sk);


				bh_unlock_sock(accept_sk);
				bh_unlock_sock(accept_sk);


@@ -123,7 +127,10 @@ static void nfc_llcp_socket_release(struct nfc_llcp_local *local, bool listen)
			continue;
			continue;
		}
		}


		if (err)
			sk->sk_err = err;
		sk->sk_state = LLCP_CLOSED;
		sk->sk_state = LLCP_CLOSED;
		sk->sk_state_change(sk);


		bh_unlock_sock(sk);
		bh_unlock_sock(sk);


@@ -150,8 +157,9 @@ static void nfc_llcp_socket_release(struct nfc_llcp_local *local, bool listen)


		nfc_llcp_socket_purge(llcp_sock);
		nfc_llcp_socket_purge(llcp_sock);


		if (err)
			sk->sk_err = err;
		sk->sk_state = LLCP_CLOSED;
		sk->sk_state = LLCP_CLOSED;

		sk->sk_state_change(sk);
		sk->sk_state_change(sk);


		bh_unlock_sock(sk);
		bh_unlock_sock(sk);
@@ -173,7 +181,7 @@ struct nfc_llcp_local *nfc_llcp_local_get(struct nfc_llcp_local *local)


static void local_cleanup(struct nfc_llcp_local *local, bool listen)
static void local_cleanup(struct nfc_llcp_local *local, bool listen)
{
{
	nfc_llcp_socket_release(local, listen);
	nfc_llcp_socket_release(local, listen, ENXIO);
	del_timer_sync(&local->link_timer);
	del_timer_sync(&local->link_timer);
	skb_queue_purge(&local->tx_queue);
	skb_queue_purge(&local->tx_queue);
	cancel_work_sync(&local->tx_work);
	cancel_work_sync(&local->tx_work);
@@ -1382,7 +1390,7 @@ void nfc_llcp_mac_is_down(struct nfc_dev *dev)
		return;
		return;


	/* Close and purge all existing sockets */
	/* Close and purge all existing sockets */
	nfc_llcp_socket_release(local, true);
	nfc_llcp_socket_release(local, true, 0);
}
}


void nfc_llcp_mac_is_up(struct nfc_dev *dev, u32 target_idx,
void nfc_llcp_mac_is_up(struct nfc_dev *dev, u32 target_idx,