* [PATCH 1/6] Bluetooth: Create __l2cap_chan_close() @ 2011-05-12 5:32 Gustavo F. Padovan 2011-05-12 5:32 ` [PATCH 2/6] Bluetooth: Create l2cap_chan_send() Gustavo F. Padovan 2011-05-12 15:55 ` [PATCH 1/6] Bluetooth: Create __l2cap_chan_close() Anderson Lizardo 0 siblings, 2 replies; 11+ messages in thread From: Gustavo F. Padovan @ 2011-05-12 5:32 UTC (permalink / raw) To: linux-bluetooth This is actually __l2cap_sock_close() renamed to __l2cap_chan_close(). At a first look it may not make sense, but with the further cleanups that will come it will. Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi> --- include/net/bluetooth/l2cap.h | 5 +-- net/bluetooth/l2cap_core.c | 97 ++++++++++++++++++++++++++++++++++++++--- net/bluetooth/l2cap_sock.c | 85 +----------------------------------- 3 files changed, 94 insertions(+), 93 deletions(-) diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index d09c9b1..ed75e65 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h @@ -446,7 +446,6 @@ extern int disable_ertm; int l2cap_init_sockets(void); void l2cap_cleanup_sockets(void); -void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, void *data); void __l2cap_connect_rsp_defer(struct l2cap_chan *chan); int __l2cap_wait_ack(struct sock *sk); @@ -463,14 +462,12 @@ int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid); void l2cap_sock_set_timer(struct sock *sk, long timeout); void l2cap_sock_clear_timer(struct sock *sk); -void __l2cap_sock_close(struct sock *sk, int reason); void l2cap_sock_kill(struct sock *sk); void l2cap_sock_init(struct sock *sk, struct sock *parent); struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio); -void l2cap_send_disconn_req(struct l2cap_conn *conn, struct l2cap_chan *chan, int err); struct l2cap_chan *l2cap_chan_create(struct sock *sk); -void l2cap_chan_del(struct l2cap_chan *chan, int err); +void __l2cap_chan_close(struct l2cap_chan *chan, int reason); void l2cap_chan_destroy(struct l2cap_chan *chan); int l2cap_chan_connect(struct l2cap_chan *chan); diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index a5ab4a2..7a943de 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c @@ -69,7 +69,11 @@ static void l2cap_busy_work(struct work_struct *work); static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code, u8 ident, u16 dlen, void *data); +static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, + void *data); static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data); +static void l2cap_send_disconn_req(struct l2cap_conn *conn, + struct l2cap_chan *chan, int err); static int l2cap_ertm_data_rcv(struct sock *sk, struct sk_buff *skb); @@ -271,7 +275,7 @@ static void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan) /* Delete channel. * Must be called on the locked socket. */ -void l2cap_chan_del(struct l2cap_chan *chan, int err) +static void l2cap_chan_del(struct l2cap_chan *chan, int err) { struct sock *sk = chan->sk; struct l2cap_conn *conn = chan->conn; @@ -327,6 +331,87 @@ void l2cap_chan_del(struct l2cap_chan *chan, int err) } } +/* Must be called on unlocked socket. */ +static void l2cap_chan_close(struct sock *sk) +{ + l2cap_sock_clear_timer(sk); + lock_sock(sk); + __l2cap_chan_close(l2cap_pi(sk)->chan, ECONNRESET); + release_sock(sk); + l2cap_sock_kill(sk); +} + +static void l2cap_chan_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_chan_close(sk); + + parent->sk_state = BT_CLOSED; + sock_set_flag(parent, SOCK_ZAPPED); +} + +void __l2cap_chan_close(struct l2cap_chan *chan, int reason) +{ + struct l2cap_conn *conn = chan->conn; + struct sock *sk = chan->sk; + + BT_DBG("chan %p state %d socket %p", chan, sk->sk_state, sk->sk_socket); + + switch (sk->sk_state) { + case BT_LISTEN: + l2cap_chan_cleanup_listen(chan->sk); + break; + + case BT_CONNECTED: + case BT_CONFIG: + if ((sk->sk_type == SOCK_SEQPACKET || + sk->sk_type == SOCK_STREAM) && + conn->hcon->type == ACL_LINK) { + l2cap_sock_set_timer(sk, sk->sk_sndtimeo); + l2cap_send_disconn_req(conn, chan, reason); + } else + l2cap_chan_del(chan, reason); + break; + + case BT_CONNECT2: + if ((sk->sk_type == SOCK_SEQPACKET || + sk->sk_type == SOCK_STREAM) && + conn->hcon->type == ACL_LINK) { + 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(chan->dcid); + rsp.dcid = cpu_to_le16(chan->scid); + rsp.result = cpu_to_le16(result); + rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO); + l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, + sizeof(rsp), &rsp); + } + + l2cap_chan_del(chan, reason); + break; + + case BT_CONNECT: + case BT_DISCONN: + l2cap_chan_del(chan, reason); + break; + + default: + sock_set_flag(sk, SOCK_ZAPPED); + break; + } +} + static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan) { struct sock *sk = chan->sk; @@ -393,7 +478,7 @@ u8 l2cap_get_ident(struct l2cap_conn *conn) return id; } -void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, void *data) +static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, void *data) { struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data); u8 flags; @@ -533,7 +618,7 @@ static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask) } } -void l2cap_send_disconn_req(struct l2cap_conn *conn, struct l2cap_chan *chan, int err) +static void l2cap_send_disconn_req(struct l2cap_conn *conn, struct l2cap_chan *chan, int err) { struct sock *sk; struct l2cap_disconn_req req; @@ -591,10 +676,10 @@ static void l2cap_conn_start(struct l2cap_conn *conn) conn->feat_mask) && chan->conf_state & L2CAP_CONF_STATE2_DEVICE) { - /* __l2cap_sock_close() calls list_del(chan) + /* __l2cap_chan_close() calls list_del(chan) * so release the lock */ read_unlock_bh(&conn->chan_lock); - __l2cap_sock_close(sk, ECONNRESET); + __l2cap_chan_close(chan, ECONNRESET); read_lock_bh(&conn->chan_lock); bh_unlock_sock(sk); continue; @@ -3949,7 +4034,7 @@ static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt) l2cap_sock_clear_timer(sk); l2cap_sock_set_timer(sk, HZ * 5); } else if (chan->sec_level == BT_SECURITY_HIGH) - __l2cap_sock_close(sk, ECONNREFUSED); + __l2cap_chan_close(chan, ECONNREFUSED); } else { if (chan->sec_level == BT_SECURITY_MEDIUM) l2cap_sock_clear_timer(sk); diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index c98360d..f57afa5 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c @@ -58,7 +58,7 @@ static void l2cap_sock_timeout(unsigned long arg) else reason = ETIMEDOUT; - __l2cap_sock_close(sk, reason); + __l2cap_chan_close(l2cap_pi(sk)->chan, reason); bh_unlock_sock(sk); @@ -813,87 +813,6 @@ 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) -{ - struct l2cap_chan *chan = l2cap_pi(sk)->chan; - struct l2cap_conn *conn = chan->conn; - - 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) && - conn->hcon->type == ACL_LINK) { - l2cap_sock_set_timer(sk, sk->sk_sndtimeo); - l2cap_send_disconn_req(conn, chan, reason); - } else - l2cap_chan_del(chan, reason); - break; - - case BT_CONNECT2: - if ((sk->sk_type == SOCK_SEQPACKET || - sk->sk_type == SOCK_STREAM) && - conn->hcon->type == ACL_LINK) { - 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(chan->dcid); - rsp.dcid = cpu_to_le16(chan->scid); - rsp.result = cpu_to_le16(result); - rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO); - l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, - sizeof(rsp), &rsp); - } - - l2cap_chan_del(chan, reason); - break; - - case BT_CONNECT: - case BT_DISCONN: - l2cap_chan_del(chan, 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; @@ -912,7 +831,7 @@ static int l2cap_sock_shutdown(struct socket *sock, int how) sk->sk_shutdown = SHUTDOWN_MASK; l2cap_sock_clear_timer(sk); - __l2cap_sock_close(sk, 0); + __l2cap_chan_close(chan, 0); if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime) err = bt_sock_wait_state(sk, BT_CLOSED, -- 1.7.5.rc3 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 2/6] Bluetooth: Create l2cap_chan_send() 2011-05-12 5:32 [PATCH 1/6] Bluetooth: Create __l2cap_chan_close() Gustavo F. Padovan @ 2011-05-12 5:32 ` Gustavo F. Padovan 2011-05-12 5:32 ` [PATCH 3/6] Bluetooth: Add chan->link_type struct member Gustavo F. Padovan 2011-05-12 18:16 ` [PATCH 2/6] Bluetooth: Create l2cap_chan_send() Anderson Lizardo 2011-05-12 15:55 ` [PATCH 1/6] Bluetooth: Create __l2cap_chan_close() Anderson Lizardo 1 sibling, 2 replies; 11+ messages in thread From: Gustavo F. Padovan @ 2011-05-12 5:32 UTC (permalink / raw) To: linux-bluetooth This move all the sending logic to l2cap_core.c, but we still have a socket dependence there, struct msghdr. It will be removed in some of the further commits. Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi> --- include/net/bluetooth/l2cap.h | 9 +---- net/bluetooth/l2cap_core.c | 79 +++++++++++++++++++++++++++++++++++++++ net/bluetooth/l2cap_sock.c | 83 +--------------------------------------- 3 files changed, 83 insertions(+), 88 deletions(-) diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index ed75e65..dc721ca 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h @@ -449,14 +449,6 @@ void l2cap_cleanup_sockets(void); void __l2cap_connect_rsp_defer(struct l2cap_chan *chan); int __l2cap_wait_ack(struct sock *sk); -struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len); -struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len); -struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len, u16 control, u16 sdulen); -int l2cap_sar_segment_sdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len); -void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb); -void l2cap_streaming_send(struct l2cap_chan *chan); -int l2cap_ertm_send(struct l2cap_chan *chan); - int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm); int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid); @@ -470,5 +462,6 @@ struct l2cap_chan *l2cap_chan_create(struct sock *sk); void __l2cap_chan_close(struct l2cap_chan *chan, int reason); void l2cap_chan_destroy(struct l2cap_chan *chan); int l2cap_chan_connect(struct l2cap_chan *chan); +int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len); #endif /* __L2CAP_H */ diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 7a943de..5473fc9 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c @@ -1535,6 +1535,85 @@ int l2cap_sar_segment_sdu(struct l2cap_chan *chan, struct msghdr *msg, size_t le return size; } +int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len) +{ + struct sock *sk = chan->sk; + struct sk_buff *skb; + u16 control; + int err; + + /* Connectionless channel */ + if (sk->sk_type == SOCK_DGRAM) { + skb = l2cap_create_connless_pdu(chan, msg, len); + if (IS_ERR(skb)) + return PTR_ERR(skb); + + l2cap_do_send(chan, skb); + return len; + } + + switch (chan->mode) { + case L2CAP_MODE_BASIC: + /* Check outgoing MTU */ + if (len > chan->omtu) + return -EMSGSIZE; + + /* Create a basic PDU */ + skb = l2cap_create_basic_pdu(chan, msg, len); + if (IS_ERR(skb)) + return PTR_ERR(skb); + + l2cap_do_send(chan, skb); + err = len; + break; + + case L2CAP_MODE_ERTM: + case L2CAP_MODE_STREAMING: + /* Entire SDU fits into one PDU */ + if (len <= chan->remote_mps) { + control = L2CAP_SDU_UNSEGMENTED; + skb = l2cap_create_iframe_pdu(chan, msg, len, control, + 0); + if (IS_ERR(skb)) + return PTR_ERR(skb); + + __skb_queue_tail(&chan->tx_q, skb); + + if (chan->tx_send_head == NULL) + chan->tx_send_head = skb; + + } else { + /* Segment SDU into multiples PDUs */ + err = l2cap_sar_segment_sdu(chan, msg, len); + if (err < 0) + return err; + } + + if (chan->mode == L2CAP_MODE_STREAMING) { + l2cap_streaming_send(chan); + err = len; + break; + } + + if ((chan->conn_state & L2CAP_CONN_REMOTE_BUSY) && + (chan->conn_state & L2CAP_CONN_WAIT_F)) { + err = len; + break; + } + err = l2cap_ertm_send(chan); + + if (err >= 0) + err = len; + break; + + default: + BT_DBG("bad state %1.1x", chan->mode); + err = -EBADFD; + } + + return err; +} + static void l2cap_chan_ready(struct sock *sk) { struct sock *parent = bt_sk(sk)->parent; diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index f57afa5..f36776e 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c @@ -673,8 +673,6 @@ static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct ms { struct sock *sk = sock->sk; struct l2cap_chan *chan = l2cap_pi(sk)->chan; - struct sk_buff *skb; - u16 control; int err; BT_DBG("sock %p, sk %p", sock, sk); @@ -689,87 +687,12 @@ static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct ms lock_sock(sk); if (sk->sk_state != BT_CONNECTED) { - err = -ENOTCONN; - goto done; + release_sock(sk); + return -ENOTCONN; } - /* Connectionless channel */ - if (sk->sk_type == SOCK_DGRAM) { - skb = l2cap_create_connless_pdu(chan, msg, len); - if (IS_ERR(skb)) { - err = PTR_ERR(skb); - } else { - l2cap_do_send(chan, skb); - err = len; - } - goto done; - } + err = l2cap_chan_send(chan, msg, len); - switch (chan->mode) { - case L2CAP_MODE_BASIC: - /* Check outgoing MTU */ - if (len > chan->omtu) { - err = -EMSGSIZE; - goto done; - } - - /* Create a basic PDU */ - skb = l2cap_create_basic_pdu(chan, msg, len); - if (IS_ERR(skb)) { - err = PTR_ERR(skb); - goto done; - } - - l2cap_do_send(chan, skb); - err = len; - break; - - case L2CAP_MODE_ERTM: - case L2CAP_MODE_STREAMING: - /* Entire SDU fits into one PDU */ - if (len <= chan->remote_mps) { - control = L2CAP_SDU_UNSEGMENTED; - skb = l2cap_create_iframe_pdu(chan, msg, len, control, - 0); - if (IS_ERR(skb)) { - err = PTR_ERR(skb); - goto done; - } - __skb_queue_tail(&chan->tx_q, skb); - - if (chan->tx_send_head == NULL) - chan->tx_send_head = skb; - - } else { - /* Segment SDU into multiples PDUs */ - err = l2cap_sar_segment_sdu(chan, msg, len); - if (err < 0) - goto done; - } - - if (chan->mode == L2CAP_MODE_STREAMING) { - l2cap_streaming_send(chan); - err = len; - break; - } - - if ((chan->conn_state & L2CAP_CONN_REMOTE_BUSY) && - (chan->conn_state & L2CAP_CONN_WAIT_F)) { - err = len; - break; - } - err = l2cap_ertm_send(chan); - - if (err >= 0) - err = len; - break; - - default: - BT_DBG("bad state %1.1x", chan->mode); - err = -EBADFD; - } - -done: release_sock(sk); return err; } -- 1.7.5.rc3 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 3/6] Bluetooth: Add chan->link_type struct member 2011-05-12 5:32 ` [PATCH 2/6] Bluetooth: Create l2cap_chan_send() Gustavo F. Padovan @ 2011-05-12 5:32 ` Gustavo F. Padovan 2011-05-12 5:32 ` [PATCH 4/6] Bluetooth: create channel timer to replace sk_timer Gustavo F. Padovan ` (3 more replies) 2011-05-12 18:16 ` [PATCH 2/6] Bluetooth: Create l2cap_chan_send() Anderson Lizardo 1 sibling, 4 replies; 11+ messages in thread From: Gustavo F. Padovan @ 2011-05-12 5:32 UTC (permalink / raw) To: linux-bluetooth link_type says if our link is raw, connection less or connection oriented. Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi> --- include/net/bluetooth/l2cap.h | 5 +++++ net/bluetooth/l2cap_core.c | 30 +++++++++++------------------- net/bluetooth/l2cap_sock.c | 30 +++++++++++++++++++++++------- 3 files changed, 39 insertions(+), 26 deletions(-) diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index dc721ca..6915c43 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h @@ -295,6 +295,7 @@ struct l2cap_chan { __u16 omtu; __u16 flush_to; __u8 mode; + __u8 link_type; __le16 sport; @@ -384,6 +385,10 @@ struct l2cap_conn { #define L2CAP_INFO_FEAT_MASK_REQ_SENT 0x04 #define L2CAP_INFO_FEAT_MASK_REQ_DONE 0x08 +#define L2CAP_LINK_RAW 1 +#define L2CAP_LINK_CONNLESS 2 +#define L2CAP_LINK_ORIENTED 3 + /* ----- L2CAP socket info ----- */ #define l2cap_pi(sk) ((struct l2cap_pinfo *) sk) diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 5473fc9..e1731b9 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c @@ -245,7 +245,7 @@ static void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan) chan->conn = conn; - if (sk->sk_type == SOCK_SEQPACKET || sk->sk_type == SOCK_STREAM) { + if (chan->link_type == L2CAP_LINK_ORIENTED) { if (conn->hcon->type == LE_LINK) { /* LE connection */ chan->omtu = L2CAP_LE_DEFAULT_MTU; @@ -256,7 +256,7 @@ static void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan) chan->scid = l2cap_alloc_cid(conn); chan->omtu = L2CAP_DEFAULT_MTU; } - } else if (sk->sk_type == SOCK_DGRAM) { + } else if (chan->link_type == L2CAP_LINK_CONNLESS) { /* Connectionless socket */ chan->scid = L2CAP_CID_CONN_LESS; chan->dcid = L2CAP_CID_CONN_LESS; @@ -369,8 +369,7 @@ void __l2cap_chan_close(struct l2cap_chan *chan, int reason) case BT_CONNECTED: case BT_CONFIG: - if ((sk->sk_type == SOCK_SEQPACKET || - sk->sk_type == SOCK_STREAM) && + if (chan->link_type == L2CAP_LINK_ORIENTED && conn->hcon->type == ACL_LINK) { l2cap_sock_set_timer(sk, sk->sk_sndtimeo); l2cap_send_disconn_req(conn, chan, reason); @@ -379,8 +378,7 @@ void __l2cap_chan_close(struct l2cap_chan *chan, int reason) break; case BT_CONNECT2: - if ((sk->sk_type == SOCK_SEQPACKET || - sk->sk_type == SOCK_STREAM) && + if (chan->link_type == L2CAP_LINK_ORIENTED && conn->hcon->type == ACL_LINK) { struct l2cap_conn_rsp rsp; __u16 result; @@ -414,9 +412,7 @@ void __l2cap_chan_close(struct l2cap_chan *chan, int reason) static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan) { - struct sock *sk = chan->sk; - - if (sk->sk_type == SOCK_RAW) { + if (chan->link_type == L2CAP_LINK_RAW) { switch (chan->sec_level) { case BT_SECURITY_HIGH: return HCI_AT_DEDICATED_BONDING_MITM; @@ -657,8 +653,7 @@ static void l2cap_conn_start(struct l2cap_conn *conn) bh_lock_sock(sk); - if (sk->sk_type != SOCK_SEQPACKET && - sk->sk_type != SOCK_STREAM) { + if (chan->link_type != L2CAP_LINK_ORIENTED) { bh_unlock_sock(sk); continue; } @@ -852,8 +847,7 @@ static void l2cap_conn_ready(struct l2cap_conn *conn) sk->sk_state_change(sk); } - if (sk->sk_type != SOCK_SEQPACKET && - sk->sk_type != SOCK_STREAM) { + if (chan->link_type != L2CAP_LINK_ORIENTED) { l2cap_sock_clear_timer(sk); sk->sk_state = BT_CONNECTED; sk->sk_state_change(sk); @@ -1056,8 +1050,7 @@ int l2cap_chan_connect(struct l2cap_chan *chan) l2cap_sock_set_timer(sk, sk->sk_sndtimeo); if (hcon->state == BT_CONNECTED) { - if (sk->sk_type != SOCK_SEQPACKET && - sk->sk_type != SOCK_STREAM) { + if (chan->link_type != L2CAP_LINK_ORIENTED) { l2cap_sock_clear_timer(sk); if (l2cap_check_security(chan)) sk->sk_state = BT_CONNECTED; @@ -1537,13 +1530,12 @@ int l2cap_sar_segment_sdu(struct l2cap_chan *chan, struct msghdr *msg, size_t le int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len) { - struct sock *sk = chan->sk; struct sk_buff *skb; u16 control; int err; /* Connectionless channel */ - if (sk->sk_type == SOCK_DGRAM) { + if (chan->link_type == L2CAP_LINK_CONNLESS) { skb = l2cap_create_connless_pdu(chan, msg, len); if (IS_ERR(skb)) return PTR_ERR(skb); @@ -1649,7 +1641,7 @@ static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb) read_lock(&conn->chan_lock); list_for_each_entry(chan, &conn->chan_l, list) { struct sock *sk = chan->sk; - if (sk->sk_type != SOCK_RAW) + if (chan->link_type != L2CAP_LINK_RAW) continue; /* Don't send frame to the socket it came from */ @@ -4105,7 +4097,7 @@ static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt) { struct sock *sk = chan->sk; - if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) + if (chan->link_type != L2CAP_LINK_ORIENTED) return; if (encrypt == 0x00) { diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index f36776e..6d5ecca 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c @@ -162,7 +162,7 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int al lock_sock(sk); - if ((sk->sk_type == SOCK_SEQPACKET || sk->sk_type == SOCK_STREAM) + if (chan->link_type == L2CAP_LINK_ORIENTED && !(la.l2_psm || la.l2_cid)) { err = -EINVAL; goto done; @@ -204,8 +204,8 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int al } /* PSM must be odd and lsb of upper byte must be 0 */ - if ((__le16_to_cpu(la.l2_psm) & 0x0101) != 0x0001 && - sk->sk_type != SOCK_RAW && !la.l2_cid) { + if ((__le16_to_cpu(la.l2_psm) & 0x0101) != 0x0001 && !la.l2_cid && + chan->link_type == L2CAP_LINK_RAW) { err = -EINVAL; goto done; } @@ -453,8 +453,8 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, ch switch (optname) { case BT_SECURITY: - if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM - && sk->sk_type != SOCK_RAW) { + if (chan->link_type != L2CAP_LINK_ORIENTED && + chan->link_type != L2CAP_LINK_RAW) { err = -EINVAL; break; } @@ -599,8 +599,8 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch switch (optname) { case BT_SECURITY: - if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM - && sk->sk_type != SOCK_RAW) { + if (chan->link_type != L2CAP_LINK_ORIENTED && + chan->link_type != L2CAP_LINK_RAW) { err = -EINVAL; break; } @@ -806,6 +806,7 @@ void l2cap_sock_init(struct sock *sk, struct sock *parent) sk->sk_type = parent->sk_type; bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup; + chan->link_type = pchan->link_type; chan->imtu = pchan->imtu; chan->omtu = pchan->omtu; chan->conf_state = pchan->conf_state; @@ -818,6 +819,20 @@ void l2cap_sock_init(struct sock *sk, struct sock *parent) chan->force_reliable = pchan->force_reliable; chan->flushable = pchan->flushable; } else { + + switch (sk->sk_type) { + case SOCK_RAW: + chan->link_type = L2CAP_LINK_RAW; + break; + case SOCK_DGRAM: + chan->link_type = L2CAP_LINK_CONNLESS; + break; + case SOCK_SEQPACKET: + case SOCK_STREAM: + chan->link_type = L2CAP_LINK_ORIENTED; + break; + } + chan->imtu = L2CAP_DEFAULT_MTU; chan->omtu = 0; if (!disable_ertm && sk->sk_type == SOCK_STREAM) { @@ -826,6 +841,7 @@ void l2cap_sock_init(struct sock *sk, struct sock *parent) } else { chan->mode = L2CAP_MODE_BASIC; } + chan->max_tx = L2CAP_DEFAULT_MAX_TX; chan->fcs = L2CAP_FCS_CRC16; chan->tx_win = L2CAP_DEFAULT_TX_WINDOW; -- 1.7.5.rc3 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 4/6] Bluetooth: create channel timer to replace sk_timer 2011-05-12 5:32 ` [PATCH 3/6] Bluetooth: Add chan->link_type struct member Gustavo F. Padovan @ 2011-05-12 5:32 ` Gustavo F. Padovan 2011-05-12 5:32 ` [PATCH 5/6] Bluetooth: Remove export of l2cap_chan_clear_timer() Gustavo F. Padovan 2011-05-12 17:37 ` [PATCH 3/6] Bluetooth: Add chan->link_type struct member Vinicius Costa Gomes ` (2 subsequent siblings) 3 siblings, 1 reply; 11+ messages in thread From: Gustavo F. Padovan @ 2011-05-12 5:32 UTC (permalink / raw) To: linux-bluetooth The new timer does not belong to struct sock, tought it still touch some sock things, but this will be sorted out soon. Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi> --- include/net/bluetooth/l2cap.h | 5 +- net/bluetooth/l2cap_core.c | 100 ++++++++++++++++++++++++++++++---------- net/bluetooth/l2cap_sock.c | 50 +-------------------- 3 files changed, 79 insertions(+), 76 deletions(-) diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index 6915c43..e14b806 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h @@ -340,6 +340,7 @@ struct l2cap_chan { __u8 remote_max_tx; __u16 remote_mps; + struct timer_list chan_timer; struct timer_list retrans_timer; struct timer_list monitor_timer; struct timer_list ack_timer; @@ -457,12 +458,12 @@ int __l2cap_wait_ack(struct sock *sk); int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm); int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid); -void l2cap_sock_set_timer(struct sock *sk, long timeout); -void l2cap_sock_clear_timer(struct sock *sk); void l2cap_sock_kill(struct sock *sk); void l2cap_sock_init(struct sock *sk, struct sock *parent); struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio); + +void l2cap_chan_clear_timer(struct l2cap_chan *chan); struct l2cap_chan *l2cap_chan_create(struct sock *sk); void __l2cap_chan_close(struct l2cap_chan *chan, int reason); void l2cap_chan_destroy(struct l2cap_chan *chan); diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index e1731b9..ddb72bb 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c @@ -208,6 +208,56 @@ static u16 l2cap_alloc_cid(struct l2cap_conn *conn) return 0; } +static void l2cap_chan_set_timer(struct l2cap_chan *chan, long timeout) +{ + BT_DBG("chan %p state %d timeout %ld", chan->sk, chan->sk->sk_state, + timeout); + if (!mod_timer(&chan->chan_timer, jiffies + timeout)) + sock_hold(chan->sk); +} + +void l2cap_chan_clear_timer(struct l2cap_chan *chan) +{ + BT_DBG("chan %p state %d", chan, chan->sk->sk_state); + + if (timer_pending(&chan->chan_timer) && del_timer(&chan->chan_timer)) + __sock_put(chan->sk); +} + +static void l2cap_chan_timeout(unsigned long arg) +{ + struct l2cap_chan *chan = (struct l2cap_chan *) arg; + struct sock *sk = chan->sk; + int reason; + + BT_DBG("chan %p state %d", chan, sk->sk_state); + + bh_lock_sock(sk); + + if (sock_owned_by_user(sk)) { + /* sk is owned by user. Try again later */ + l2cap_chan_set_timer(chan, HZ / 5); + bh_unlock_sock(sk); + sock_put(sk); + return; + } + + if (sk->sk_state == BT_CONNECTED || sk->sk_state == BT_CONFIG) + reason = ECONNREFUSED; + else if (sk->sk_state == BT_CONNECT && + chan->sec_level != BT_SECURITY_SDP) + reason = ECONNREFUSED; + else + reason = ETIMEDOUT; + + __l2cap_chan_close(chan, reason); + + bh_unlock_sock(sk); + + l2cap_sock_kill(sk); + sock_put(sk); +} + struct l2cap_chan *l2cap_chan_create(struct sock *sk) { struct l2cap_chan *chan; @@ -222,6 +272,8 @@ struct l2cap_chan *l2cap_chan_create(struct sock *sk) list_add(&chan->global_l, &chan_list); write_unlock_bh(&chan_list_lock); + setup_timer(&chan->chan_timer, l2cap_chan_timeout, (unsigned long) chan); + return chan; } @@ -281,7 +333,7 @@ static void l2cap_chan_del(struct l2cap_chan *chan, int err) struct l2cap_conn *conn = chan->conn; struct sock *parent = bt_sk(sk)->parent; - l2cap_sock_clear_timer(sk); + l2cap_chan_clear_timer(chan); BT_DBG("chan %p, conn %p, err %d", chan, conn, err); @@ -334,7 +386,7 @@ static void l2cap_chan_del(struct l2cap_chan *chan, int err) /* Must be called on unlocked socket. */ static void l2cap_chan_close(struct sock *sk) { - l2cap_sock_clear_timer(sk); + l2cap_chan_clear_timer(l2cap_pi(sk)->chan); lock_sock(sk); __l2cap_chan_close(l2cap_pi(sk)->chan, ECONNRESET); release_sock(sk); @@ -371,7 +423,7 @@ void __l2cap_chan_close(struct l2cap_chan *chan, int reason) case BT_CONFIG: if (chan->link_type == L2CAP_LINK_ORIENTED && conn->hcon->type == ACL_LINK) { - l2cap_sock_set_timer(sk, sk->sk_sndtimeo); + l2cap_chan_set_timer(chan, sk->sk_sndtimeo); l2cap_send_disconn_req(conn, chan, reason); } else l2cap_chan_del(chan, reason); @@ -814,7 +866,7 @@ static void l2cap_le_conn_ready(struct l2cap_conn *conn) __l2cap_chan_add(conn, chan); - l2cap_sock_set_timer(sk, sk->sk_sndtimeo); + l2cap_chan_set_timer(chan, sk->sk_sndtimeo); sk->sk_state = BT_CONNECTED; parent->sk_data_ready(parent, 0); @@ -842,13 +894,13 @@ static void l2cap_conn_ready(struct l2cap_conn *conn) bh_lock_sock(sk); if (conn->hcon->type == LE_LINK) { - l2cap_sock_clear_timer(sk); + l2cap_chan_clear_timer(chan); sk->sk_state = BT_CONNECTED; sk->sk_state_change(sk); } if (chan->link_type != L2CAP_LINK_ORIENTED) { - l2cap_sock_clear_timer(sk); + l2cap_chan_clear_timer(chan); sk->sk_state = BT_CONNECTED; sk->sk_state_change(sk); } else if (sk->sk_state == BT_CONNECT) @@ -1047,11 +1099,11 @@ int l2cap_chan_connect(struct l2cap_chan *chan) l2cap_chan_add(conn, chan); sk->sk_state = BT_CONNECT; - l2cap_sock_set_timer(sk, sk->sk_sndtimeo); + l2cap_chan_set_timer(chan, sk->sk_sndtimeo); if (hcon->state == BT_CONNECTED) { if (chan->link_type != L2CAP_LINK_ORIENTED) { - l2cap_sock_clear_timer(sk); + l2cap_chan_clear_timer(chan); if (l2cap_check_security(chan)) sk->sk_state = BT_CONNECTED; } else @@ -1614,7 +1666,7 @@ static void l2cap_chan_ready(struct sock *sk) BT_DBG("sk %p, parent %p", sk, parent); chan->conf_state = 0; - l2cap_sock_clear_timer(sk); + l2cap_chan_clear_timer(chan); if (!parent) { /* Outgoing channel. @@ -2316,7 +2368,7 @@ static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hd dcid = chan->scid; - l2cap_sock_set_timer(sk, sk->sk_sndtimeo); + l2cap_chan_set_timer(chan, sk->sk_sndtimeo); chan->ident = cmd->ident; @@ -2433,8 +2485,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 */ if (sock_owned_by_user(sk)) { sk->sk_state = BT_DISCONN; - l2cap_sock_clear_timer(sk); - l2cap_sock_set_timer(sk, HZ / 5); + l2cap_chan_clear_timer(chan); + l2cap_chan_set_timer(chan, HZ / 5); break; } @@ -2607,7 +2659,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr default: sk->sk_err = ECONNRESET; - l2cap_sock_set_timer(sk, HZ * 5); + l2cap_chan_set_timer(chan, HZ * 5); l2cap_send_disconn_req(conn, chan, ECONNRESET); goto done; } @@ -2663,8 +2715,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 */ if (sock_owned_by_user(sk)) { sk->sk_state = BT_DISCONN; - l2cap_sock_clear_timer(sk); - l2cap_sock_set_timer(sk, HZ / 5); + l2cap_chan_clear_timer(chan); + l2cap_chan_set_timer(chan, HZ / 5); bh_unlock_sock(sk); return 0; } @@ -2697,8 +2749,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 */ if (sock_owned_by_user(sk)) { sk->sk_state = BT_DISCONN; - l2cap_sock_clear_timer(sk); - l2cap_sock_set_timer(sk, HZ / 5); + l2cap_chan_clear_timer(chan); + l2cap_chan_set_timer(chan, HZ / 5); bh_unlock_sock(sk); return 0; } @@ -4095,20 +4147,18 @@ static int l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason) static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt) { - struct sock *sk = chan->sk; - if (chan->link_type != L2CAP_LINK_ORIENTED) return; if (encrypt == 0x00) { if (chan->sec_level == BT_SECURITY_MEDIUM) { - l2cap_sock_clear_timer(sk); - l2cap_sock_set_timer(sk, HZ * 5); + l2cap_chan_clear_timer(chan); + l2cap_chan_set_timer(chan, HZ * 5); } else if (chan->sec_level == BT_SECURITY_HIGH) __l2cap_chan_close(chan, ECONNREFUSED); } else { if (chan->sec_level == BT_SECURITY_MEDIUM) - l2cap_sock_clear_timer(sk); + l2cap_chan_clear_timer(chan); } } @@ -4153,8 +4203,8 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req); } else { - l2cap_sock_clear_timer(sk); - l2cap_sock_set_timer(sk, HZ / 10); + l2cap_chan_clear_timer(chan); + l2cap_chan_set_timer(chan, HZ / 10); } } else if (sk->sk_state == BT_CONNECT2) { struct l2cap_conn_rsp rsp; @@ -4165,7 +4215,7 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) result = L2CAP_CR_SUCCESS; } else { sk->sk_state = BT_DISCONN; - l2cap_sock_set_timer(sk, HZ / 10); + l2cap_chan_set_timer(chan, HZ / 10); result = L2CAP_CR_SEC_BLOCK; } diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 6d5ecca..56c301a 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c @@ -32,52 +32,6 @@ static const struct proto_ops l2cap_sock_ops; -/* ---- L2CAP timers ---- */ -static void l2cap_sock_timeout(unsigned long arg) -{ - struct sock *sk = (struct sock *) arg; - int reason; - - BT_DBG("sock %p state %d", sk, sk->sk_state); - - bh_lock_sock(sk); - - if (sock_owned_by_user(sk)) { - /* sk is owned by user. Try again later */ - l2cap_sock_set_timer(sk, HZ / 5); - bh_unlock_sock(sk); - sock_put(sk); - return; - } - - if (sk->sk_state == BT_CONNECTED || sk->sk_state == BT_CONFIG) - reason = ECONNREFUSED; - else if (sk->sk_state == BT_CONNECT && - l2cap_pi(sk)->chan->sec_level != BT_SECURITY_SDP) - reason = ECONNREFUSED; - else - reason = ETIMEDOUT; - - __l2cap_chan_close(l2cap_pi(sk)->chan, reason); - - bh_unlock_sock(sk); - - l2cap_sock_kill(sk); - sock_put(sk); -} - -void l2cap_sock_set_timer(struct sock *sk, long timeout) -{ - BT_DBG("sk %p state %d timeout %ld", sk, sk->sk_state, timeout); - sk_reset_timer(sk, &sk->sk_timer, jiffies + timeout); -} - -void l2cap_sock_clear_timer(struct sock *sk) -{ - BT_DBG("sock %p state %d", sk, sk->sk_state); - sk_stop_timer(sk, &sk->sk_timer); -} - static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen) { struct sock *sk = sock->sk; @@ -753,7 +707,7 @@ static int l2cap_sock_shutdown(struct socket *sock, int how) err = __l2cap_wait_ack(sk); sk->sk_shutdown = SHUTDOWN_MASK; - l2cap_sock_clear_timer(sk); + l2cap_chan_clear_timer(chan); __l2cap_chan_close(chan, 0); if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime) @@ -880,8 +834,6 @@ struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, g sk->sk_protocol = proto; sk->sk_state = BT_OPEN; - setup_timer(&sk->sk_timer, l2cap_sock_timeout, (unsigned long) sk); - return sk; } -- 1.7.5.rc3 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 5/6] Bluetooth: Remove export of l2cap_chan_clear_timer() 2011-05-12 5:32 ` [PATCH 4/6] Bluetooth: create channel timer to replace sk_timer Gustavo F. Padovan @ 2011-05-12 5:32 ` Gustavo F. Padovan 2011-05-12 5:32 ` [PATCH 6/6] Bluetooth: Rename __l2cap_chan_close() to l2cap_chan_close() Gustavo F. Padovan 0 siblings, 1 reply; 11+ messages in thread From: Gustavo F. Padovan @ 2011-05-12 5:32 UTC (permalink / raw) To: linux-bluetooth The call to l2cap_chan_clear_timer() is not really needed in l2cap_sock.c. This patch also adds a call to l2cap_chan_clear_timer() to the only place in __l2cap_sock_close() that wasn't calling it. It's safe call it there because l2cap_chan_clear_timer() check first for timer_peding(). Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi> --- include/net/bluetooth/l2cap.h | 1 - net/bluetooth/l2cap_core.c | 3 ++- net/bluetooth/l2cap_sock.c | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index e14b806..86a076f 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h @@ -463,7 +463,6 @@ void l2cap_sock_init(struct sock *sk, struct sock *parent); struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio); -void l2cap_chan_clear_timer(struct l2cap_chan *chan); struct l2cap_chan *l2cap_chan_create(struct sock *sk); void __l2cap_chan_close(struct l2cap_chan *chan, int reason); void l2cap_chan_destroy(struct l2cap_chan *chan); diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index ddb72bb..c4e8b1d 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c @@ -216,7 +216,7 @@ static void l2cap_chan_set_timer(struct l2cap_chan *chan, long timeout) sock_hold(chan->sk); } -void l2cap_chan_clear_timer(struct l2cap_chan *chan) +static void l2cap_chan_clear_timer(struct l2cap_chan *chan) { BT_DBG("chan %p state %d", chan, chan->sk->sk_state); @@ -423,6 +423,7 @@ void __l2cap_chan_close(struct l2cap_chan *chan, int reason) case BT_CONFIG: if (chan->link_type == L2CAP_LINK_ORIENTED && conn->hcon->type == ACL_LINK) { + l2cap_chan_clear_timer(chan); l2cap_chan_set_timer(chan, sk->sk_sndtimeo); l2cap_send_disconn_req(conn, chan, reason); } else diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 56c301a..993846c 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c @@ -707,7 +707,6 @@ static int l2cap_sock_shutdown(struct socket *sock, int how) err = __l2cap_wait_ack(sk); sk->sk_shutdown = SHUTDOWN_MASK; - l2cap_chan_clear_timer(chan); __l2cap_chan_close(chan, 0); if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime) -- 1.7.5.rc3 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 6/6] Bluetooth: Rename __l2cap_chan_close() to l2cap_chan_close() 2011-05-12 5:32 ` [PATCH 5/6] Bluetooth: Remove export of l2cap_chan_clear_timer() Gustavo F. Padovan @ 2011-05-12 5:32 ` Gustavo F. Padovan 0 siblings, 0 replies; 11+ messages in thread From: Gustavo F. Padovan @ 2011-05-12 5:32 UTC (permalink / raw) To: linux-bluetooth To make it consistent with the rest of the API. Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi> --- include/net/bluetooth/l2cap.h | 2 +- net/bluetooth/l2cap_core.c | 29 ++++++++++++----------------- net/bluetooth/l2cap_sock.c | 2 +- 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index 86a076f..f78bb23 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h @@ -464,7 +464,7 @@ struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio); struct l2cap_chan *l2cap_chan_create(struct sock *sk); -void __l2cap_chan_close(struct l2cap_chan *chan, int reason); +void l2cap_chan_close(struct l2cap_chan *chan, int reason); void l2cap_chan_destroy(struct l2cap_chan *chan); int l2cap_chan_connect(struct l2cap_chan *chan); int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len); diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index c4e8b1d..2ea5ea9 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c @@ -250,7 +250,7 @@ static void l2cap_chan_timeout(unsigned long arg) else reason = ETIMEDOUT; - __l2cap_chan_close(chan, reason); + l2cap_chan_close(chan, reason); bh_unlock_sock(sk); @@ -383,16 +383,6 @@ static void l2cap_chan_del(struct l2cap_chan *chan, int err) } } -/* Must be called on unlocked socket. */ -static void l2cap_chan_close(struct sock *sk) -{ - l2cap_chan_clear_timer(l2cap_pi(sk)->chan); - lock_sock(sk); - __l2cap_chan_close(l2cap_pi(sk)->chan, ECONNRESET); - release_sock(sk); - l2cap_sock_kill(sk); -} - static void l2cap_chan_cleanup_listen(struct sock *parent) { struct sock *sk; @@ -400,14 +390,19 @@ static void l2cap_chan_cleanup_listen(struct sock *parent) BT_DBG("parent %p", parent); /* Close not yet accepted channels */ - while ((sk = bt_accept_dequeue(parent, NULL))) - l2cap_chan_close(sk); + while ((sk = bt_accept_dequeue(parent, NULL))) { + l2cap_chan_clear_timer(l2cap_pi(sk)->chan); + lock_sock(sk); + l2cap_chan_close(l2cap_pi(sk)->chan, ECONNRESET); + release_sock(sk); + l2cap_sock_kill(sk); + } parent->sk_state = BT_CLOSED; sock_set_flag(parent, SOCK_ZAPPED); } -void __l2cap_chan_close(struct l2cap_chan *chan, int reason) +void l2cap_chan_close(struct l2cap_chan *chan, int reason) { struct l2cap_conn *conn = chan->conn; struct sock *sk = chan->sk; @@ -724,10 +719,10 @@ static void l2cap_conn_start(struct l2cap_conn *conn) conn->feat_mask) && chan->conf_state & L2CAP_CONF_STATE2_DEVICE) { - /* __l2cap_chan_close() calls list_del(chan) + /* l2cap_chan_close() calls list_del(chan) * so release the lock */ read_unlock_bh(&conn->chan_lock); - __l2cap_chan_close(chan, ECONNRESET); + l2cap_chan_close(chan, ECONNRESET); read_lock_bh(&conn->chan_lock); bh_unlock_sock(sk); continue; @@ -4156,7 +4151,7 @@ static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt) l2cap_chan_clear_timer(chan); l2cap_chan_set_timer(chan, HZ * 5); } else if (chan->sec_level == BT_SECURITY_HIGH) - __l2cap_chan_close(chan, ECONNREFUSED); + l2cap_chan_close(chan, ECONNREFUSED); } else { if (chan->sec_level == BT_SECURITY_MEDIUM) l2cap_chan_clear_timer(chan); diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 993846c..a6bfe85 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c @@ -707,7 +707,7 @@ static int l2cap_sock_shutdown(struct socket *sock, int how) err = __l2cap_wait_ack(sk); sk->sk_shutdown = SHUTDOWN_MASK; - __l2cap_chan_close(chan, 0); + l2cap_chan_close(chan, 0); if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime) err = bt_sock_wait_state(sk, BT_CLOSED, -- 1.7.5.rc3 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 3/6] Bluetooth: Add chan->link_type struct member 2011-05-12 5:32 ` [PATCH 3/6] Bluetooth: Add chan->link_type struct member Gustavo F. Padovan 2011-05-12 5:32 ` [PATCH 4/6] Bluetooth: create channel timer to replace sk_timer Gustavo F. Padovan @ 2011-05-12 17:37 ` Vinicius Costa Gomes 2011-05-12 17:58 ` Anderson Lizardo 2011-05-12 19:07 ` Marcel Holtmann 3 siblings, 0 replies; 11+ messages in thread From: Vinicius Costa Gomes @ 2011-05-12 17:37 UTC (permalink / raw) To: Gustavo F. Padovan; +Cc: linux-bluetooth Hi Gustavo, On 02:32 Thu 12 May, Gustavo F. Padovan wrote: > link_type says if our link is raw, connection less or connection oriented. To avoid confusion with the hci_conn "type" field (which is the actual type of the link between those two devices), wouldn't it be better to rename this to chan_type or something like it? > > Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi> > --- > include/net/bluetooth/l2cap.h | 5 +++++ > net/bluetooth/l2cap_core.c | 30 +++++++++++------------------- > net/bluetooth/l2cap_sock.c | 30 +++++++++++++++++++++++------- > 3 files changed, 39 insertions(+), 26 deletions(-) > > diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h > index dc721ca..6915c43 100644 > --- a/include/net/bluetooth/l2cap.h > +++ b/include/net/bluetooth/l2cap.h > @@ -295,6 +295,7 @@ struct l2cap_chan { > __u16 omtu; > __u16 flush_to; > __u8 mode; > + __u8 link_type; > > __le16 sport; > > @@ -384,6 +385,10 @@ struct l2cap_conn { > #define L2CAP_INFO_FEAT_MASK_REQ_SENT 0x04 > #define L2CAP_INFO_FEAT_MASK_REQ_DONE 0x08 > > +#define L2CAP_LINK_RAW 1 > +#define L2CAP_LINK_CONNLESS 2 > +#define L2CAP_LINK_ORIENTED 3 > + > /* ----- L2CAP socket info ----- */ > #define l2cap_pi(sk) ((struct l2cap_pinfo *) sk) > > diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c > index 5473fc9..e1731b9 100644 > --- a/net/bluetooth/l2cap_core.c > +++ b/net/bluetooth/l2cap_core.c > @@ -245,7 +245,7 @@ static void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan) > > chan->conn = conn; > > - if (sk->sk_type == SOCK_SEQPACKET || sk->sk_type == SOCK_STREAM) { > + if (chan->link_type == L2CAP_LINK_ORIENTED) { > if (conn->hcon->type == LE_LINK) { > /* LE connection */ > chan->omtu = L2CAP_LE_DEFAULT_MTU; > @@ -256,7 +256,7 @@ static void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan) > chan->scid = l2cap_alloc_cid(conn); > chan->omtu = L2CAP_DEFAULT_MTU; > } > - } else if (sk->sk_type == SOCK_DGRAM) { > + } else if (chan->link_type == L2CAP_LINK_CONNLESS) { > /* Connectionless socket */ > chan->scid = L2CAP_CID_CONN_LESS; > chan->dcid = L2CAP_CID_CONN_LESS; > @@ -369,8 +369,7 @@ void __l2cap_chan_close(struct l2cap_chan *chan, int reason) > > case BT_CONNECTED: > case BT_CONFIG: > - if ((sk->sk_type == SOCK_SEQPACKET || > - sk->sk_type == SOCK_STREAM) && > + if (chan->link_type == L2CAP_LINK_ORIENTED && > conn->hcon->type == ACL_LINK) { > l2cap_sock_set_timer(sk, sk->sk_sndtimeo); > l2cap_send_disconn_req(conn, chan, reason); > @@ -379,8 +378,7 @@ void __l2cap_chan_close(struct l2cap_chan *chan, int reason) > break; > > case BT_CONNECT2: > - if ((sk->sk_type == SOCK_SEQPACKET || > - sk->sk_type == SOCK_STREAM) && > + if (chan->link_type == L2CAP_LINK_ORIENTED && > conn->hcon->type == ACL_LINK) { > struct l2cap_conn_rsp rsp; > __u16 result; > @@ -414,9 +412,7 @@ void __l2cap_chan_close(struct l2cap_chan *chan, int reason) > > static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan) > { > - struct sock *sk = chan->sk; > - > - if (sk->sk_type == SOCK_RAW) { > + if (chan->link_type == L2CAP_LINK_RAW) { > switch (chan->sec_level) { > case BT_SECURITY_HIGH: > return HCI_AT_DEDICATED_BONDING_MITM; > @@ -657,8 +653,7 @@ static void l2cap_conn_start(struct l2cap_conn *conn) > > bh_lock_sock(sk); > > - if (sk->sk_type != SOCK_SEQPACKET && > - sk->sk_type != SOCK_STREAM) { > + if (chan->link_type != L2CAP_LINK_ORIENTED) { > bh_unlock_sock(sk); > continue; > } > @@ -852,8 +847,7 @@ static void l2cap_conn_ready(struct l2cap_conn *conn) > sk->sk_state_change(sk); > } > > - if (sk->sk_type != SOCK_SEQPACKET && > - sk->sk_type != SOCK_STREAM) { > + if (chan->link_type != L2CAP_LINK_ORIENTED) { > l2cap_sock_clear_timer(sk); > sk->sk_state = BT_CONNECTED; > sk->sk_state_change(sk); > @@ -1056,8 +1050,7 @@ int l2cap_chan_connect(struct l2cap_chan *chan) > l2cap_sock_set_timer(sk, sk->sk_sndtimeo); > > if (hcon->state == BT_CONNECTED) { > - if (sk->sk_type != SOCK_SEQPACKET && > - sk->sk_type != SOCK_STREAM) { > + if (chan->link_type != L2CAP_LINK_ORIENTED) { > l2cap_sock_clear_timer(sk); > if (l2cap_check_security(chan)) > sk->sk_state = BT_CONNECTED; > @@ -1537,13 +1530,12 @@ int l2cap_sar_segment_sdu(struct l2cap_chan *chan, struct msghdr *msg, size_t le > > int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len) > { > - struct sock *sk = chan->sk; > struct sk_buff *skb; > u16 control; > int err; > > /* Connectionless channel */ > - if (sk->sk_type == SOCK_DGRAM) { > + if (chan->link_type == L2CAP_LINK_CONNLESS) { > skb = l2cap_create_connless_pdu(chan, msg, len); > if (IS_ERR(skb)) > return PTR_ERR(skb); > @@ -1649,7 +1641,7 @@ static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb) > read_lock(&conn->chan_lock); > list_for_each_entry(chan, &conn->chan_l, list) { > struct sock *sk = chan->sk; > - if (sk->sk_type != SOCK_RAW) > + if (chan->link_type != L2CAP_LINK_RAW) > continue; > > /* Don't send frame to the socket it came from */ > @@ -4105,7 +4097,7 @@ static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt) > { > struct sock *sk = chan->sk; > > - if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) > + if (chan->link_type != L2CAP_LINK_ORIENTED) > return; > > if (encrypt == 0x00) { > diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c > index f36776e..6d5ecca 100644 > --- a/net/bluetooth/l2cap_sock.c > +++ b/net/bluetooth/l2cap_sock.c > @@ -162,7 +162,7 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int al > > lock_sock(sk); > > - if ((sk->sk_type == SOCK_SEQPACKET || sk->sk_type == SOCK_STREAM) > + if (chan->link_type == L2CAP_LINK_ORIENTED > && !(la.l2_psm || la.l2_cid)) { > err = -EINVAL; > goto done; > @@ -204,8 +204,8 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int al > } > > /* PSM must be odd and lsb of upper byte must be 0 */ > - if ((__le16_to_cpu(la.l2_psm) & 0x0101) != 0x0001 && > - sk->sk_type != SOCK_RAW && !la.l2_cid) { > + if ((__le16_to_cpu(la.l2_psm) & 0x0101) != 0x0001 && !la.l2_cid && > + chan->link_type == L2CAP_LINK_RAW) { > err = -EINVAL; > goto done; > } > @@ -453,8 +453,8 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, ch > > switch (optname) { > case BT_SECURITY: > - if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM > - && sk->sk_type != SOCK_RAW) { > + if (chan->link_type != L2CAP_LINK_ORIENTED && > + chan->link_type != L2CAP_LINK_RAW) { > err = -EINVAL; > break; > } > @@ -599,8 +599,8 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch > > switch (optname) { > case BT_SECURITY: > - if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM > - && sk->sk_type != SOCK_RAW) { > + if (chan->link_type != L2CAP_LINK_ORIENTED && > + chan->link_type != L2CAP_LINK_RAW) { > err = -EINVAL; > break; > } > @@ -806,6 +806,7 @@ void l2cap_sock_init(struct sock *sk, struct sock *parent) > sk->sk_type = parent->sk_type; > bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup; > > + chan->link_type = pchan->link_type; > chan->imtu = pchan->imtu; > chan->omtu = pchan->omtu; > chan->conf_state = pchan->conf_state; > @@ -818,6 +819,20 @@ void l2cap_sock_init(struct sock *sk, struct sock *parent) > chan->force_reliable = pchan->force_reliable; > chan->flushable = pchan->flushable; > } else { > + > + switch (sk->sk_type) { > + case SOCK_RAW: > + chan->link_type = L2CAP_LINK_RAW; > + break; > + case SOCK_DGRAM: > + chan->link_type = L2CAP_LINK_CONNLESS; > + break; > + case SOCK_SEQPACKET: > + case SOCK_STREAM: > + chan->link_type = L2CAP_LINK_ORIENTED; > + break; > + } > + > chan->imtu = L2CAP_DEFAULT_MTU; > chan->omtu = 0; > if (!disable_ertm && sk->sk_type == SOCK_STREAM) { > @@ -826,6 +841,7 @@ void l2cap_sock_init(struct sock *sk, struct sock *parent) > } else { > chan->mode = L2CAP_MODE_BASIC; > } > + Nitpick, feel free to ignore ;-) > chan->max_tx = L2CAP_DEFAULT_MAX_TX; > chan->fcs = L2CAP_FCS_CRC16; > chan->tx_win = L2CAP_DEFAULT_TX_WINDOW; > -- > 1.7.5.rc3 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html Cheers, -- Vinicius ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 3/6] Bluetooth: Add chan->link_type struct member 2011-05-12 5:32 ` [PATCH 3/6] Bluetooth: Add chan->link_type struct member Gustavo F. Padovan 2011-05-12 5:32 ` [PATCH 4/6] Bluetooth: create channel timer to replace sk_timer Gustavo F. Padovan 2011-05-12 17:37 ` [PATCH 3/6] Bluetooth: Add chan->link_type struct member Vinicius Costa Gomes @ 2011-05-12 17:58 ` Anderson Lizardo 2011-05-12 19:07 ` Marcel Holtmann 3 siblings, 0 replies; 11+ messages in thread From: Anderson Lizardo @ 2011-05-12 17:58 UTC (permalink / raw) To: Gustavo F. Padovan; +Cc: linux-bluetooth Hi Gustavo, On Thu, May 12, 2011 at 1:32 AM, Gustavo F. Padovan <padovan@profusion.mobi> wrote: > @@ -204,8 +204,8 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int al > } > > /* PSM must be odd and lsb of upper byte must be 0 */ > - if ((__le16_to_cpu(la.l2_psm) & 0x0101) != 0x0001 && > - sk->sk_type != SOCK_RAW && !la.l2_cid) { > + if ((__le16_to_cpu(la.l2_psm) & 0x0101) != 0x0001 && !la.l2_cid && > + chan->link_type == L2CAP_LINK_RAW) { There seems to be a typo here: Original: sk->sk_type != SOCK_RAW New: chan->link_type == L2CAP_LINK_RAW Should it be != instead? > err = -EINVAL; > goto done; > } Regards, -- Anderson Lizardo Instituto Nokia de Tecnologia - INdT Manaus - Brazil ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 3/6] Bluetooth: Add chan->link_type struct member 2011-05-12 5:32 ` [PATCH 3/6] Bluetooth: Add chan->link_type struct member Gustavo F. Padovan ` (2 preceding siblings ...) 2011-05-12 17:58 ` Anderson Lizardo @ 2011-05-12 19:07 ` Marcel Holtmann 3 siblings, 0 replies; 11+ messages in thread From: Marcel Holtmann @ 2011-05-12 19:07 UTC (permalink / raw) To: Gustavo F. Padovan; +Cc: linux-bluetooth Hi Gustavo, > link_type says if our link is raw, connection less or connection oriented. > > Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi> > --- > include/net/bluetooth/l2cap.h | 5 +++++ > net/bluetooth/l2cap_core.c | 30 +++++++++++------------------- > net/bluetooth/l2cap_sock.c | 30 +++++++++++++++++++++++------- > 3 files changed, 39 insertions(+), 26 deletions(-) > > diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h > index dc721ca..6915c43 100644 > --- a/include/net/bluetooth/l2cap.h > +++ b/include/net/bluetooth/l2cap.h > @@ -295,6 +295,7 @@ struct l2cap_chan { > __u16 omtu; > __u16 flush_to; > __u8 mode; > + __u8 link_type; > > __le16 sport; > > @@ -384,6 +385,10 @@ struct l2cap_conn { > #define L2CAP_INFO_FEAT_MASK_REQ_SENT 0x04 > #define L2CAP_INFO_FEAT_MASK_REQ_DONE 0x08 > > +#define L2CAP_LINK_RAW 1 > +#define L2CAP_LINK_CONNLESS 2 > +#define L2CAP_LINK_ORIENTED 3 > + the name ORIENTED is a pretty bad name. Use CONN_ORIENTED and CONN_LESS to make this more clear. And use CONN_LESS instead of CONNLESS to have this in sync with other constants we have. Regards Marcel ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/6] Bluetooth: Create l2cap_chan_send() 2011-05-12 5:32 ` [PATCH 2/6] Bluetooth: Create l2cap_chan_send() Gustavo F. Padovan 2011-05-12 5:32 ` [PATCH 3/6] Bluetooth: Add chan->link_type struct member Gustavo F. Padovan @ 2011-05-12 18:16 ` Anderson Lizardo 1 sibling, 0 replies; 11+ messages in thread From: Anderson Lizardo @ 2011-05-12 18:16 UTC (permalink / raw) To: Gustavo F. Padovan; +Cc: linux-bluetooth Hi Gustavo, On Thu, May 12, 2011 at 1:32 AM, Gustavo F. Padovan <padovan@profusion.mobi> wrote: > + } else { > + /* Segment SDU into multiples PDUs */ Given that you are moving code around, can you fix the indentation error on the comment above? > + err = l2cap_sar_segment_sdu(chan, msg, len); > + if (err < 0) > + return err; > + } > + > + if (chan->mode == L2CAP_MODE_STREAMING) { > + l2cap_streaming_send(chan); > + err = len; > + break; > + } > + > + if ((chan->conn_state & L2CAP_CONN_REMOTE_BUSY) && > + (chan->conn_state & L2CAP_CONN_WAIT_F)) { > + err = len; > + break; > + } > + err = l2cap_ertm_send(chan); > + > + if (err >= 0) > + err = len; > + break; Also, it makes more sense to have an empty line above l2cap_ertm_send(), and remove the empty line below it. Regards, -- Anderson Lizardo Instituto Nokia de Tecnologia - INdT Manaus - Brazil ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/6] Bluetooth: Create __l2cap_chan_close() 2011-05-12 5:32 [PATCH 1/6] Bluetooth: Create __l2cap_chan_close() Gustavo F. Padovan 2011-05-12 5:32 ` [PATCH 2/6] Bluetooth: Create l2cap_chan_send() Gustavo F. Padovan @ 2011-05-12 15:55 ` Anderson Lizardo 1 sibling, 0 replies; 11+ messages in thread From: Anderson Lizardo @ 2011-05-12 15:55 UTC (permalink / raw) To: Gustavo F. Padovan; +Cc: linux-bluetooth Hi Padovan, On Thu, May 12, 2011 at 1:32 AM, Gustavo F. Padovan <padovan@profusion.mobi> wrote: > +void __l2cap_chan_close(struct l2cap_chan *chan, int reason) > +{ > + struct l2cap_conn *conn = chan->conn; > + struct sock *sk = chan->sk; > + > + BT_DBG("chan %p state %d socket %p", chan, sk->sk_state, sk->sk_socket); > + > + switch (sk->sk_state) { > + case BT_LISTEN: > + l2cap_chan_cleanup_listen(chan->sk); Cosmetic: you can use just "sk" above. > + break; > + Regards, -- Anderson Lizardo Instituto Nokia de Tecnologia - INdT Manaus - Brazil ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2011-05-12 19:07 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-05-12 5:32 [PATCH 1/6] Bluetooth: Create __l2cap_chan_close() Gustavo F. Padovan 2011-05-12 5:32 ` [PATCH 2/6] Bluetooth: Create l2cap_chan_send() Gustavo F. Padovan 2011-05-12 5:32 ` [PATCH 3/6] Bluetooth: Add chan->link_type struct member Gustavo F. Padovan 2011-05-12 5:32 ` [PATCH 4/6] Bluetooth: create channel timer to replace sk_timer Gustavo F. Padovan 2011-05-12 5:32 ` [PATCH 5/6] Bluetooth: Remove export of l2cap_chan_clear_timer() Gustavo F. Padovan 2011-05-12 5:32 ` [PATCH 6/6] Bluetooth: Rename __l2cap_chan_close() to l2cap_chan_close() Gustavo F. Padovan 2011-05-12 17:37 ` [PATCH 3/6] Bluetooth: Add chan->link_type struct member Vinicius Costa Gomes 2011-05-12 17:58 ` Anderson Lizardo 2011-05-12 19:07 ` Marcel Holtmann 2011-05-12 18:16 ` [PATCH 2/6] Bluetooth: Create l2cap_chan_send() Anderson Lizardo 2011-05-12 15:55 ` [PATCH 1/6] Bluetooth: Create __l2cap_chan_close() Anderson Lizardo
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.