mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 07:12:09 +00:00
Bluetooth: move __l2cap_sock_close() to l2cap_sock.c
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
This commit is contained in:
parent
05fc1576da
commit
6de0702b5b
3 changed files with 82 additions and 83 deletions
|
@ -854,6 +854,84 @@ void l2cap_sock_kill(struct sock *sk)
|
|||
sock_put(sk);
|
||||
}
|
||||
|
||||
/* Must be called on unlocked socket. */
|
||||
static void l2cap_sock_close(struct sock *sk)
|
||||
{
|
||||
l2cap_sock_clear_timer(sk);
|
||||
lock_sock(sk);
|
||||
__l2cap_sock_close(sk, ECONNRESET);
|
||||
release_sock(sk);
|
||||
l2cap_sock_kill(sk);
|
||||
}
|
||||
|
||||
static void l2cap_sock_cleanup_listen(struct sock *parent)
|
||||
{
|
||||
struct sock *sk;
|
||||
|
||||
BT_DBG("parent %p", parent);
|
||||
|
||||
/* Close not yet accepted channels */
|
||||
while ((sk = bt_accept_dequeue(parent, NULL)))
|
||||
l2cap_sock_close(sk);
|
||||
|
||||
parent->sk_state = BT_CLOSED;
|
||||
sock_set_flag(parent, SOCK_ZAPPED);
|
||||
}
|
||||
|
||||
void __l2cap_sock_close(struct sock *sk, int reason)
|
||||
{
|
||||
BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket);
|
||||
|
||||
switch (sk->sk_state) {
|
||||
case BT_LISTEN:
|
||||
l2cap_sock_cleanup_listen(sk);
|
||||
break;
|
||||
|
||||
case BT_CONNECTED:
|
||||
case BT_CONFIG:
|
||||
if (sk->sk_type == SOCK_SEQPACKET ||
|
||||
sk->sk_type == SOCK_STREAM) {
|
||||
struct l2cap_conn *conn = l2cap_pi(sk)->conn;
|
||||
|
||||
l2cap_sock_set_timer(sk, sk->sk_sndtimeo);
|
||||
l2cap_send_disconn_req(conn, sk, reason);
|
||||
} else
|
||||
l2cap_chan_del(sk, reason);
|
||||
break;
|
||||
|
||||
case BT_CONNECT2:
|
||||
if (sk->sk_type == SOCK_SEQPACKET ||
|
||||
sk->sk_type == SOCK_STREAM) {
|
||||
struct l2cap_conn *conn = l2cap_pi(sk)->conn;
|
||||
struct l2cap_conn_rsp rsp;
|
||||
__u16 result;
|
||||
|
||||
if (bt_sk(sk)->defer_setup)
|
||||
result = L2CAP_CR_SEC_BLOCK;
|
||||
else
|
||||
result = L2CAP_CR_BAD_PSM;
|
||||
|
||||
rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
|
||||
rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
|
||||
rsp.result = cpu_to_le16(result);
|
||||
rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
|
||||
l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
|
||||
L2CAP_CONN_RSP, sizeof(rsp), &rsp);
|
||||
} else
|
||||
l2cap_chan_del(sk, reason);
|
||||
break;
|
||||
|
||||
case BT_CONNECT:
|
||||
case BT_DISCONN:
|
||||
l2cap_chan_del(sk, reason);
|
||||
break;
|
||||
|
||||
default:
|
||||
sock_set_flag(sk, SOCK_ZAPPED);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int l2cap_sock_shutdown(struct socket *sock, int how)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue