nimble/l2cap: Fix hs locking issue when sending le_credit_update
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/0b3ea953 Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/0b3ea953 Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/0b3ea953 Branch: refs/heads/master Commit: 0b3ea953da71eca84fdcbcfd7affbea2e615ce8e Parents: 8a64a49 Author: Åukasz Rymanowski <[email protected]> Authored: Fri Mar 17 15:32:12 2017 +0100 Committer: Åukasz Rymanowski <[email protected]> Committed: Thu Apr 6 10:04:03 2017 +0200 ---------------------------------------------------------------------- net/nimble/host/src/ble_l2cap_coc.c | 7 +++++-- net/nimble/host/src/ble_l2cap_sig.c | 6 +++--- net/nimble/host/src/ble_l2cap_sig_priv.h | 3 ++- 3 files changed, 10 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0b3ea953/net/nimble/host/src/ble_l2cap_coc.c ---------------------------------------------------------------------- diff --git a/net/nimble/host/src/ble_l2cap_coc.c b/net/nimble/host/src/ble_l2cap_coc.c index 87d830a..5c4b9af 100644 --- a/net/nimble/host/src/ble_l2cap_coc.c +++ b/net/nimble/host/src/ble_l2cap_coc.c @@ -222,7 +222,7 @@ ble_l2cap_coc_rx_fn(struct ble_l2cap_chan *chan) * so since we have still buffer to handle it */ rx->credits = 1; - ble_l2cap_sig_le_credits(chan, rx->credits); + ble_l2cap_sig_le_credits(chan->conn_handle, chan->scid, rx->credits); } BLE_HS_LOG(DEBUG, "Received partial sdu_len=%d, credits left=%d\n", @@ -468,7 +468,10 @@ ble_l2cap_coc_recv_ready(struct ble_l2cap_chan *chan, struct os_mbuf *sdu_rx) * to be able to send complete SDU. */ if (chan->coc_rx.credits < c->initial_credits) { - ble_l2cap_sig_le_credits(chan, c->initial_credits - chan->coc_rx.credits); + ble_hs_unlock(); + ble_l2cap_sig_le_credits(chan->conn_handle, chan->scid, + c->initial_credits - chan->coc_rx.credits); + ble_hs_lock(); chan->coc_rx.credits = c->initial_credits; } http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0b3ea953/net/nimble/host/src/ble_l2cap_sig.c ---------------------------------------------------------------------- diff --git a/net/nimble/host/src/ble_l2cap_sig.c b/net/nimble/host/src/ble_l2cap_sig.c index d9e7c52..1acfbad 100644 --- a/net/nimble/host/src/ble_l2cap_sig.c +++ b/net/nimble/host/src/ble_l2cap_sig.c @@ -1047,7 +1047,7 @@ ble_l2cap_sig_le_credits_rx(uint16_t conn_handle, struct ble_l2cap_sig_hdr *hdr, } int -ble_l2cap_sig_le_credits(struct ble_l2cap_chan *chan, uint16_t credits) +ble_l2cap_sig_le_credits(uint16_t conn_handle, uint16_t scid, uint16_t credits) { struct ble_l2cap_sig_le_credits *cmd; struct os_mbuf *txom; @@ -1059,10 +1059,10 @@ ble_l2cap_sig_le_credits(struct ble_l2cap_chan *chan, uint16_t credits) return BLE_HS_ENOMEM; } - cmd->scid = htole16(chan->scid); + cmd->scid = htole16(scid); cmd->credits = htole16(credits); - return ble_l2cap_sig_tx(chan->conn_handle, txom); + return ble_l2cap_sig_tx(conn_handle, txom); } #endif http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0b3ea953/net/nimble/host/src/ble_l2cap_sig_priv.h ---------------------------------------------------------------------- diff --git a/net/nimble/host/src/ble_l2cap_sig_priv.h b/net/nimble/host/src/ble_l2cap_sig_priv.h index 49d096c..3af6f75 100644 --- a/net/nimble/host/src/ble_l2cap_sig_priv.h +++ b/net/nimble/host/src/ble_l2cap_sig_priv.h @@ -108,7 +108,8 @@ int ble_l2cap_sig_coc_connect(uint16_t conn_handle, uint16_t psm, uint16_t mtu, struct os_mbuf *sdu_rx, ble_l2cap_event_fn *cb, void *cb_arg); int ble_l2cap_sig_disconnect(struct ble_l2cap_chan *chan); -int ble_l2cap_sig_le_credits(struct ble_l2cap_chan *chan, uint16_t credits); +int ble_l2cap_sig_le_credits(uint16_t conn_handle, uint16_t scid, + uint16_t credits); #else #define ble_l2cap_sig_coc_connect(conn_handle, psm, mtu, sdu_rx, cb, cb_arg) \ BLE_HS_ENOTSUP
