diff --git a/emulator/bthost.c b/emulator/bthost.c
index b05072a..654338d 100644
--- a/emulator/bthost.c
+++ b/emulator/bthost.c
struct l2conn {
uint16_t scid;
uint16_t dcid;
+ uint16_t psm;
struct l2conn *next;
};
}
static void bthost_add_l2cap_conn(struct bthost *bthost, struct btconn *conn,
- uint16_t scid, uint16_t dcid)
+ uint16_t scid, uint16_t dcid,
+ uint16_t psm)
{
struct l2conn *l2conn;
memset(l2conn, 0, sizeof(*l2conn));
+ l2conn->psm = psm;
l2conn->scid = scid;
l2conn->dcid = dcid;
if (!conn)
return false;
+ if (code == BT_L2CAP_PDU_CONN_REQ &&
+ len == sizeof(struct bt_l2cap_pdu_conn_req)) {
+ const struct bt_l2cap_pdu_conn_req *req = data;
+
+ bthost_add_l2cap_conn(bthost, conn, le16_to_cpu(req->scid),
+ le16_to_cpu(req->scid),
+ le16_to_cpu(req->psm));
+ }
+
ident = l2cap_sig_send(bthost, conn, code, 0, data, len);
if (!ident)
return false;
struct bt_l2cap_pdu_config_req conf_req;
bthost_add_l2cap_conn(bthost, conn, le16_to_cpu(rsp.dcid),
- le16_to_cpu(rsp.scid));
+ le16_to_cpu(rsp.scid),
+ le16_to_cpu(psm));
memset(&conf_req, 0, sizeof(conf_req));
conf_req.dcid = rsp.dcid;
uint8_t ident, const void *data, uint16_t len)
{
const struct bt_l2cap_pdu_conn_rsp *rsp = data;
+ struct l2conn *l2conn;
if (len < sizeof(*rsp))
return false;
- bthost_add_l2cap_conn(bthost, conn, le16_to_cpu(rsp->scid),
- le16_to_cpu(rsp->dcid));
+ l2conn = btconn_find_l2cap_conn_by_scid(conn, le16_to_cpu(rsp->scid));
+ if (l2conn)
+ l2conn->dcid = le16_to_cpu(rsp->dcid);
+ else
+ return false;
if (le16_to_cpu(rsp->result) == 0x0001) {
struct bt_l2cap_pdu_config_req req;
if (len < sizeof(*rsp))
return false;
-
- bthost_add_l2cap_conn(bthost, conn, 0, le16_to_cpu(rsp->dcid));
+ /* TODO add L2CAP connection before with proper PSM */
+ bthost_add_l2cap_conn(bthost, conn, 0, le16_to_cpu(rsp->dcid), 0);
return true;
}