Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp5329535pxj; Tue, 22 Jun 2021 21:56:03 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzTgTAlYpg7U/EZ11n/w5ruR6re+lfIY2jNaTM6bZXED3Gh33KwJXkKFvKC6RfDdLdnyUmg X-Received: by 2002:a05:6402:5cc:: with SMTP id n12mr9781257edx.354.1624424163365; Tue, 22 Jun 2021 21:56:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1624424163; cv=none; d=google.com; s=arc-20160816; b=FXCoD0UHsFJyB4jqwJGeyAYDlVgQ6mObOqE6bHjNuoVM75Lu5QuYHfE0qJDYZzVYYC TcGTXJYnO99JGQ1sVZpsn+30gmndoavErpu0eqWZ8WnigcLa8rRf//JtUhfGJM/7hiLF Nv2KEcJ0f7v8GSgOklOLiDALR2mV6SEhhf1B5OLunP2UaZxBKk9sl8Z01EMrwsvdaBQU GDJ8u62jNBxYtkBzKYZlhUEMIyzjDUarR6MsqxV/d3YePPaEZ1x2bXVd4Pn0axkTftBa azowrInkhOuwBRGpXb82MLmyxXs64lMPxhJxk9WwmUVJTo2gy7vNedupr6r3aVu5HMoE 7KRg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=uZSiXJbnGeuxS5aa3LIqv6u5CYJbvasHC6wO3ANSWgA=; b=SdZmSvymLdZcxOpf3GXg3OLayakcz9eNdFofWTzmtLRbiPHUT2MqMLzbyDURq406U/ YRnml26+BGcdGgfYpDzbaqQicm+pwLinoGwuOZsBv58KBiGDrCPmYHJ2wndn8QKRCaLH vHcZQ9AxV+nXBfUS6z8Sbu++kImfmCPXLNt3I1EW/UPndM7fqpKX7KTRKPZPawAstHN9 KfR8rodKRXoDJDQONgpVzxDtD25TwSIxYhanpAmH3zRLP63U5XK3gLAsqUrswbO+mOrU qbms6TL0hsKFPxvXpCEFwUQtfpUkmftqnCmsoR1if/DONw59Mv2sJM/hSzzAEOAVXIRl fSxA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b="Y/Ic+ACa"; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id hg1si16626783ejc.559.2021.06.22.21.55.40; Tue, 22 Jun 2021 21:56:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b="Y/Ic+ACa"; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229544AbhFWEwH (ORCPT + 99 others); Wed, 23 Jun 2021 00:52:07 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41514 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229982AbhFWEwG (ORCPT ); Wed, 23 Jun 2021 00:52:06 -0400 Received: from mail-pg1-x535.google.com (mail-pg1-x535.google.com [IPv6:2607:f8b0:4864:20::535]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0DF41C061756 for ; Tue, 22 Jun 2021 21:49:49 -0700 (PDT) Received: by mail-pg1-x535.google.com with SMTP id e20so760791pgg.0 for ; Tue, 22 Jun 2021 21:49:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=uZSiXJbnGeuxS5aa3LIqv6u5CYJbvasHC6wO3ANSWgA=; b=Y/Ic+ACaWdGdeFAfYaA4lmUkXlacteBfVEhWN9bc5DUC1yeKJ1hh2idiWprwHL6b+U 39VyS7NJ4xsON/1QP3RsEPpFlZSKerwJT6bO1tX/+7qPPSssYXZYvj9eWawOCr/4amgE lHH7nmJD9v+fr+KP3bZ//fPOYozSCSCNCQx3qvhS7xH8zB3bGGOLHxCUZI3L+zlMTUEc kv7mW04WLg7VeguHhUKdxQP4veUZNGrhXDVvlvxg942PVtbpa6UpI2/hFdVMJ7/BF7Zo uwwS/Ks3cN08oRDwbT0rhI0hFRRoJ15r7LhEFuapcweJwJOs3H1t+rVNcBXzriUWQV9T rQ9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=uZSiXJbnGeuxS5aa3LIqv6u5CYJbvasHC6wO3ANSWgA=; b=UH1OSUkC0WNruw3vJ55A2m0oPxW9O2gRYaCWEh9Nq9XdXLxBNE9CF33WW6nTU664n+ Nb/+FYIkh4uOovfxbscblFcbqjZzA6cvRw7yDeDSMsgYoBRQ/S2ThAfWULCS4C3xFcDq nY5KitPvk6QZP7dr+Qi1wFqYvfgzwv8F33wvadEJrWeb4BxfhBg+K2ZfG0v3M+3zuvdf HDENN0Wm25el5+08I3RN3TwT+iVxhsj5UqB3QOlsA7HK34AhKhPY6hSaiBxdP2CiZMgv rdOjmdqq9lcxyQMHiFBudA59uAfMEfEEhQLA6WBMltX5ImFzcubsVTGaKPKN5DEvS6sh BiCw== X-Gm-Message-State: AOAM532fNzGE1ATQyzF3kQ7zR6M0I8wqIfsSWJ/dXJuSeteqiwMMkxpt Av4EbdbdH9kjsxE5I7P0Ku/QDr1+dwA= X-Received: by 2002:a62:7616:0:b029:305:f420:49cc with SMTP id r22-20020a6276160000b0290305f42049ccmr4409961pfc.51.1624423788437; Tue, 22 Jun 2021 21:49:48 -0700 (PDT) Received: from han1-mobl3.intel.com ([2601:1c0:6a01:d830::512a]) by smtp.gmail.com with ESMTPSA id c184sm900129pfa.38.2021.06.22.21.49.47 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 22 Jun 2021 21:49:48 -0700 (PDT) From: Tedd Ho-Jeong An To: linux-bluetooth@vger.kernel.org Subject: [BlueZ PATCH v2 3/5] emulator/btdev: Add support HCI LE Adv Set Terminated event Date: Tue, 22 Jun 2021 21:49:42 -0700 Message-Id: <20210623044944.602205-3-hj.tedd.an@gmail.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: <20210623044944.602205-1-hj.tedd.an@gmail.com> References: <20210623044944.602205-1-hj.tedd.an@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Luiz Augusto von Dentz This patch adds support the HCI_LE_Advertising_Set_Terminated event in btdev. --- emulator/btdev.c | 64 +++++++++++++++++++++++++++++++++++++++++++++--- monitor/bt.h | 1 + 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/emulator/btdev.c b/emulator/btdev.c index c5ea35e54..90457a5aa 100644 --- a/emulator/btdev.c +++ b/emulator/btdev.c @@ -74,6 +74,7 @@ struct btdev_rl { }; struct le_ext_adv { + struct btdev *dev; uint8_t handle; uint8_t enable; uint8_t type; /* evt_properties */ @@ -86,6 +87,7 @@ struct le_ext_adv { uint8_t adv_data_len; uint8_t scan_data[252]; uint8_t scan_data_len; + unsigned int id; }; struct btdev { @@ -4237,6 +4239,11 @@ static void ext_adv_disable(void *data, void *user_data) if (handle && ext_adv->handle != handle) return; + if (ext_adv->id) { + timeout_remove(ext_adv->id); + ext_adv->id = 0; + } + ext_adv->enable = 0x00; } @@ -4253,6 +4260,7 @@ static struct le_ext_adv *le_ext_adv_new(struct btdev *btdev, uint8_t handle) struct le_ext_adv *ext_adv; ext_adv = new0(struct le_ext_adv, 1); + ext_adv->dev = btdev; ext_adv->handle = handle; /* Add to queue */ @@ -4268,6 +4276,12 @@ static void le_ext_adv_free(void *data) { struct le_ext_adv *ext_adv = data; + /* Remove to queue */ + queue_remove(ext_adv->dev->le_ext_adv, ext_adv); + + if (ext_adv->id) + timeout_remove(ext_adv->id); + free(ext_adv); } @@ -4477,6 +4491,31 @@ static void le_set_ext_adv_enable_complete(struct btdev *btdev, } } } +static void adv_set_terminate(struct btdev *dev, uint8_t status, uint8_t handle, + uint16_t conn_handle, uint8_t num_evts) +{ + struct bt_hci_evt_le_adv_set_term ev; + + memset(&ev, 0, sizeof(ev)); + ev.status = status; + ev.handle = handle; + ev.conn_handle = cpu_to_le16(conn_handle); + ev.num_evts = num_evts; + + le_meta_event(dev, BT_HCI_EVT_LE_ADV_SET_TERM, &ev, sizeof(ev)); +} + +static bool ext_adv_timeout(void *user_data) +{ + struct le_ext_adv *adv = user_data; + + adv->id = 0; + adv_set_terminate(adv->dev, BT_HCI_ERR_ADV_TIMEOUT, adv->handle, + 0x0000, 0x00); + le_ext_adv_free(adv); + + return false; +} static int cmd_set_ext_adv_enable(struct btdev *dev, const void *data, uint8_t len) @@ -4517,6 +4556,13 @@ static int cmd_set_ext_adv_enable(struct btdev *dev, const void *data, } ext_adv->enable = cmd->enable; + + if (!cmd->enable) + ext_adv_disable(ext_adv, NULL); + else if (eas->duration) + ext_adv->id = timeout_add(eas->duration * 10, + ext_adv_timeout, + ext_adv, NULL); } exit_complete: @@ -4785,6 +4831,19 @@ static int cmd_ext_create_conn(struct btdev *dev, const void *data, uint8_t len) return 0; } +static void ext_adv_term(void *data, void *user_data) +{ + struct le_ext_adv *adv = data; + struct btdev_conn *conn = user_data; + + /* if connectable bit is set the send adv terminate */ + if (conn && adv->type & 0x01) { + adv_set_terminate(conn->dev, 0x00, adv->handle, conn->handle, + 0x00); + le_ext_adv_free(adv); + } +} + static void le_ext_conn_complete(struct btdev *btdev, const struct bt_hci_cmd_le_ext_create_conn *cmd, struct le_ext_adv *ext_adv, @@ -4803,9 +4862,8 @@ static void le_ext_conn_complete(struct btdev *btdev, return; /* Disable EXT ADV */ - queue_foreach(btdev->le_ext_adv, ext_adv_disable, NULL); - queue_foreach(conn->link->dev->le_ext_adv, ext_adv_disable, - NULL); + queue_foreach(btdev->le_ext_adv, ext_adv_term, conn); + queue_foreach(conn->link->dev->le_ext_adv, ext_adv_term, conn); ev.status = status; ev.peer_addr_type = btdev->le_scan_own_addr_type; diff --git a/monitor/bt.h b/monitor/bt.h index d60bbdb20..738bc294b 100644 --- a/monitor/bt.h +++ b/monitor/bt.h @@ -3656,6 +3656,7 @@ struct bt_hci_evt_le_req_peer_sca_complete { #define BT_HCI_ERR_UNSUPPORTED_FEATURE 0x11 #define BT_HCI_ERR_INVALID_PARAMETERS 0x12 #define BT_HCI_ERR_UNSPECIFIED_ERROR 0x1f +#define BT_HCI_ERR_ADV_TIMEOUT 0x3c #define BT_HCI_ERR_CONN_FAILED_TO_ESTABLISH 0x3e #define BT_HCI_ERR_UNKNOWN_ADVERTISING_ID 0x42 -- 2.26.3