nimble/l2cap: Fix L2CAP LE CoC disconnection handling This patch fixes mess around scid/dcid on L2CAP disconnection request
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/1759bdfe Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/1759bdfe Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/1759bdfe Branch: refs/heads/1_0_0_dev Commit: 1759bdfe9eef2770a9b60de3f1d1bc89d95312cc Parents: 9597dc7 Author: Åukasz Rymanowski <[email protected]> Authored: Wed Feb 22 17:37:39 2017 +0100 Committer: Marko Kiiskila <[email protected]> Committed: Mon Mar 6 15:51:18 2017 -0800 ---------------------------------------------------------------------- net/nimble/host/src/ble_l2cap_sig.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/1759bdfe/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 a1a3399..9292137 100644 --- a/net/nimble/host/src/ble_l2cap_sig.c +++ b/net/nimble/host/src/ble_l2cap_sig.c @@ -877,15 +877,21 @@ ble_l2cap_sig_disc_req_rx(uint16_t conn_handle, struct ble_l2cap_sig_hdr *hdr, req = (struct ble_l2cap_sig_disc_req *) (*om)->om_data; + /* Let's find matching channel. Note that destination CID in the request + * is from peer perspective. It is source CID from nimble perspective + */ chan = ble_hs_conn_chan_find(conn, le16toh(req->dcid)); - if (!chan || (le16toh(req->scid) != chan->scid)) { + if (!chan || (le16toh(req->scid) != chan->dcid)) { os_mbuf_free_chain(txom); ble_hs_unlock(); return 0; } - rsp->dcid = htole16(chan->dcid); - rsp->scid = htole16(chan->scid); + /* Note that in the response destination CID is form peer perspective and + * it is source CID from nimble perspective. + */ + rsp->dcid = htole16(chan->scid); + rsp->scid = htole16(chan->dcid); ble_l2cap_event_coc_disconnected(chan);
