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

Commit c9b66675 authored by Gustavo Padovan's avatar Gustavo Padovan
Browse files

Bluetooth: Make timer functions generic



We now plan to use l2cap_set_timer and l2cap_clear_timer in ERTM timers.

Signed-off-by: default avatarGustavo F. Padovan <padovan@profusion.mobi>
parent 71ba0e56
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -439,6 +439,8 @@ struct l2cap_pinfo {
#define L2CAP_CONN_RNR_SENT        0x0200
#define L2CAP_CONN_RNR_SENT        0x0200
#define L2CAP_CONN_SAR_RETRY       0x0400
#define L2CAP_CONN_SAR_RETRY       0x0400


#define __set_chan_timer(c, t) l2cap_set_timer(c, &c->chan_timer, (t))
#define __clear_chan_timer(c) l2cap_clear_timer(c, &c->chan_timer)
#define __mod_retrans_timer() mod_timer(&chan->retrans_timer, \
#define __mod_retrans_timer() mod_timer(&chan->retrans_timer, \
		jiffies +  msecs_to_jiffies(L2CAP_DEFAULT_RETRANS_TO));
		jiffies +  msecs_to_jiffies(L2CAP_DEFAULT_RETRANS_TO));
#define __mod_monitor_timer() mod_timer(&chan->monitor_timer, \
#define __mod_monitor_timer() mod_timer(&chan->monitor_timer, \
+29 −29
Original line number Original line Diff line number Diff line
@@ -220,19 +220,19 @@ static u16 l2cap_alloc_cid(struct l2cap_conn *conn)
	return 0;
	return 0;
}
}


static void l2cap_chan_set_timer(struct l2cap_chan *chan, long timeout)
static void l2cap_set_timer(struct l2cap_chan *chan, struct timer_list *timer, long timeout)
{
{
       BT_DBG("chan %p state %d timeout %ld", chan->sk, chan->state, timeout);
       BT_DBG("chan %p state %d timeout %ld", chan->sk, chan->state, timeout);


       if (!mod_timer(&chan->chan_timer, jiffies + timeout))
       if (!mod_timer(timer, jiffies + timeout))
	       chan_hold(chan);
	       chan_hold(chan);
}
}


static void l2cap_chan_clear_timer(struct l2cap_chan *chan)
static void l2cap_clear_timer(struct l2cap_chan *chan, struct timer_list *timer)
{
{
       BT_DBG("chan %p state %d", chan, chan->state);
       BT_DBG("chan %p state %d", chan, chan->state);


       if (timer_pending(&chan->chan_timer) && del_timer(&chan->chan_timer))
       if (timer_pending(timer) && del_timer(timer))
	       chan_put(chan);
	       chan_put(chan);
}
}


@@ -254,7 +254,7 @@ static void l2cap_chan_timeout(unsigned long arg)


	if (sock_owned_by_user(sk)) {
	if (sock_owned_by_user(sk)) {
		/* sk is owned by user. Try again later */
		/* sk is owned by user. Try again later */
		l2cap_chan_set_timer(chan, HZ / 5);
		__set_chan_timer(chan, HZ / 5);
		bh_unlock_sock(sk);
		bh_unlock_sock(sk);
		chan_put(chan);
		chan_put(chan);
		return;
		return;
@@ -353,7 +353,7 @@ static void l2cap_chan_del(struct l2cap_chan *chan, int err)
	struct l2cap_conn *conn = chan->conn;
	struct l2cap_conn *conn = chan->conn;
	struct sock *parent = bt_sk(sk)->parent;
	struct sock *parent = bt_sk(sk)->parent;


	l2cap_chan_clear_timer(chan);
	__clear_chan_timer(chan);


	BT_DBG("chan %p, conn %p, err %d", chan, conn, err);
	BT_DBG("chan %p, conn %p, err %d", chan, conn, err);


@@ -412,7 +412,7 @@ static void l2cap_chan_cleanup_listen(struct sock *parent)
	/* Close not yet accepted channels */
	/* Close not yet accepted channels */
	while ((sk = bt_accept_dequeue(parent, NULL))) {
	while ((sk = bt_accept_dequeue(parent, NULL))) {
		struct l2cap_chan *chan = l2cap_pi(sk)->chan;
		struct l2cap_chan *chan = l2cap_pi(sk)->chan;
		l2cap_chan_clear_timer(chan);
		__clear_chan_timer(chan);
		lock_sock(sk);
		lock_sock(sk);
		l2cap_chan_close(chan, ECONNRESET);
		l2cap_chan_close(chan, ECONNRESET);
		release_sock(sk);
		release_sock(sk);
@@ -439,8 +439,8 @@ void l2cap_chan_close(struct l2cap_chan *chan, int reason)
	case BT_CONFIG:
	case BT_CONFIG:
		if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED &&
		if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED &&
					conn->hcon->type == ACL_LINK) {
					conn->hcon->type == ACL_LINK) {
			l2cap_chan_clear_timer(chan);
			__clear_chan_timer(chan);
			l2cap_chan_set_timer(chan, sk->sk_sndtimeo);
			__set_chan_timer(chan, sk->sk_sndtimeo);
			l2cap_send_disconn_req(conn, chan, reason);
			l2cap_send_disconn_req(conn, chan, reason);
		} else
		} else
			l2cap_chan_del(chan, reason);
			l2cap_chan_del(chan, reason);
@@ -878,7 +878,7 @@ static void l2cap_le_conn_ready(struct l2cap_conn *conn)


	__l2cap_chan_add(conn, chan);
	__l2cap_chan_add(conn, chan);


	l2cap_chan_set_timer(chan, sk->sk_sndtimeo);
	__set_chan_timer(chan, sk->sk_sndtimeo);


	l2cap_state_change(chan, BT_CONNECTED);
	l2cap_state_change(chan, BT_CONNECTED);
	parent->sk_data_ready(parent, 0);
	parent->sk_data_ready(parent, 0);
@@ -906,13 +906,13 @@ static void l2cap_conn_ready(struct l2cap_conn *conn)
		bh_lock_sock(sk);
		bh_lock_sock(sk);


		if (conn->hcon->type == LE_LINK) {
		if (conn->hcon->type == LE_LINK) {
			l2cap_chan_clear_timer(chan);
			__clear_chan_timer(chan);
			l2cap_state_change(chan, BT_CONNECTED);
			l2cap_state_change(chan, BT_CONNECTED);
			sk->sk_state_change(sk);
			sk->sk_state_change(sk);
		}
		}


		if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
		if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
			l2cap_chan_clear_timer(chan);
			__clear_chan_timer(chan);
			l2cap_state_change(chan, BT_CONNECTED);
			l2cap_state_change(chan, BT_CONNECTED);
			sk->sk_state_change(sk);
			sk->sk_state_change(sk);
		} else if (chan->state == BT_CONNECT)
		} else if (chan->state == BT_CONNECT)
@@ -1111,11 +1111,11 @@ int l2cap_chan_connect(struct l2cap_chan *chan)
	l2cap_chan_add(conn, chan);
	l2cap_chan_add(conn, chan);


	l2cap_state_change(chan, BT_CONNECT);
	l2cap_state_change(chan, BT_CONNECT);
	l2cap_chan_set_timer(chan, sk->sk_sndtimeo);
	__set_chan_timer(chan, sk->sk_sndtimeo);


	if (hcon->state == BT_CONNECTED) {
	if (hcon->state == BT_CONNECTED) {
		if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
		if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
			l2cap_chan_clear_timer(chan);
			__clear_chan_timer(chan);
			if (l2cap_check_security(chan))
			if (l2cap_check_security(chan))
				l2cap_state_change(chan, BT_CONNECTED);
				l2cap_state_change(chan, BT_CONNECTED);
		} else
		} else
@@ -1679,7 +1679,7 @@ static void l2cap_chan_ready(struct sock *sk)
	BT_DBG("sk %p, parent %p", sk, parent);
	BT_DBG("sk %p, parent %p", sk, parent);


	chan->conf_state = 0;
	chan->conf_state = 0;
	l2cap_chan_clear_timer(chan);
	__clear_chan_timer(chan);


	if (!parent) {
	if (!parent) {
		/* Outgoing channel.
		/* Outgoing channel.
@@ -2374,7 +2374,7 @@ static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hd


	dcid = chan->scid;
	dcid = chan->scid;


	l2cap_chan_set_timer(chan, sk->sk_sndtimeo);
	__set_chan_timer(chan, sk->sk_sndtimeo);


	chan->ident = cmd->ident;
	chan->ident = cmd->ident;


@@ -2491,8 +2491,8 @@ static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hd
		/* don't delete l2cap channel if sk is owned by user */
		/* don't delete l2cap channel if sk is owned by user */
		if (sock_owned_by_user(sk)) {
		if (sock_owned_by_user(sk)) {
			l2cap_state_change(chan, BT_DISCONN);
			l2cap_state_change(chan, BT_DISCONN);
			l2cap_chan_clear_timer(chan);
			__clear_chan_timer(chan);
			l2cap_chan_set_timer(chan, HZ / 5);
			__set_chan_timer(chan, HZ / 5);
			break;
			break;
		}
		}


@@ -2665,7 +2665,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr


	default:
	default:
		sk->sk_err = ECONNRESET;
		sk->sk_err = ECONNRESET;
		l2cap_chan_set_timer(chan, HZ * 5);
		__set_chan_timer(chan, HZ * 5);
		l2cap_send_disconn_req(conn, chan, ECONNRESET);
		l2cap_send_disconn_req(conn, chan, ECONNRESET);
		goto done;
		goto done;
	}
	}
@@ -2721,8 +2721,8 @@ static inline int l2cap_disconnect_req(struct l2cap_conn *conn, struct l2cap_cmd
	/* don't delete l2cap channel if sk is owned by user */
	/* don't delete l2cap channel if sk is owned by user */
	if (sock_owned_by_user(sk)) {
	if (sock_owned_by_user(sk)) {
		l2cap_state_change(chan, BT_DISCONN);
		l2cap_state_change(chan, BT_DISCONN);
		l2cap_chan_clear_timer(chan);
		__clear_chan_timer(chan);
		l2cap_chan_set_timer(chan, HZ / 5);
		__set_chan_timer(chan, HZ / 5);
		bh_unlock_sock(sk);
		bh_unlock_sock(sk);
		return 0;
		return 0;
	}
	}
@@ -2755,8 +2755,8 @@ static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn, struct l2cap_cmd
	/* don't delete l2cap channel if sk is owned by user */
	/* don't delete l2cap channel if sk is owned by user */
	if (sock_owned_by_user(sk)) {
	if (sock_owned_by_user(sk)) {
		l2cap_state_change(chan,BT_DISCONN);
		l2cap_state_change(chan,BT_DISCONN);
		l2cap_chan_clear_timer(chan);
		__clear_chan_timer(chan);
		l2cap_chan_set_timer(chan, HZ / 5);
		__set_chan_timer(chan, HZ / 5);
		bh_unlock_sock(sk);
		bh_unlock_sock(sk);
		return 0;
		return 0;
	}
	}
@@ -4152,13 +4152,13 @@ static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt)


	if (encrypt == 0x00) {
	if (encrypt == 0x00) {
		if (chan->sec_level == BT_SECURITY_MEDIUM) {
		if (chan->sec_level == BT_SECURITY_MEDIUM) {
			l2cap_chan_clear_timer(chan);
			__clear_chan_timer(chan);
			l2cap_chan_set_timer(chan, HZ * 5);
			__set_chan_timer(chan, HZ * 5);
		} else if (chan->sec_level == BT_SECURITY_HIGH)
		} else if (chan->sec_level == BT_SECURITY_HIGH)
			l2cap_chan_close(chan, ECONNREFUSED);
			l2cap_chan_close(chan, ECONNREFUSED);
	} else {
	} else {
		if (chan->sec_level == BT_SECURITY_MEDIUM)
		if (chan->sec_level == BT_SECURITY_MEDIUM)
			l2cap_chan_clear_timer(chan);
			__clear_chan_timer(chan);
	}
	}
}
}


@@ -4203,8 +4203,8 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
				l2cap_send_cmd(conn, chan->ident,
				l2cap_send_cmd(conn, chan->ident,
					L2CAP_CONN_REQ, sizeof(req), &req);
					L2CAP_CONN_REQ, sizeof(req), &req);
			} else {
			} else {
				l2cap_chan_clear_timer(chan);
				__clear_chan_timer(chan);
				l2cap_chan_set_timer(chan, HZ / 10);
				__set_chan_timer(chan, HZ / 10);
			}
			}
		} else if (chan->state == BT_CONNECT2) {
		} else if (chan->state == BT_CONNECT2) {
			struct l2cap_conn_rsp rsp;
			struct l2cap_conn_rsp rsp;
@@ -4215,7 +4215,7 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
				result = L2CAP_CR_SUCCESS;
				result = L2CAP_CR_SUCCESS;
			} else {
			} else {
				l2cap_state_change(chan, BT_DISCONN);
				l2cap_state_change(chan, BT_DISCONN);
				l2cap_chan_set_timer(chan, HZ / 10);
				__set_chan_timer(chan, HZ / 10);
				result = L2CAP_CR_SEC_BLOCK;
				result = L2CAP_CR_SEC_BLOCK;
			}
			}