Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1441579pxb; Thu, 4 Feb 2021 13:06:19 -0800 (PST) X-Google-Smtp-Source: ABdhPJyJ64ZCob7qZ58YWMlgXYr4b3FECT9ueRqUC1AxnkDlvlncQ3pzKPNYtyLt+pimR0pp2uoO X-Received: by 2002:aa7:dd4b:: with SMTP id o11mr448871edw.303.1612472778842; Thu, 04 Feb 2021 13:06:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1612472778; cv=none; d=google.com; s=arc-20160816; b=JWbRz+rpMOvk/19ndqRc9TayUJpjiSycuiv2+UTnjEJRSV2ofUuGjLD2NCcLzN5FS0 yyxXPvG6/S4+B+/NsY4jspqKDa9CcRP7OG40q6hMn56k8GMCJSR9evWHQwVut4PfKEeJ 4ks2Y662KI/MEoxl0WqU9zOZxNmhRPVdoQvEJywE+b5kzTl2mgMVs+hFpAjNwtxSfq3t tqTq1Ah6EYa7Gi7oWjwYXnuBW5OTHacN+qKieYijpFpinRXY+6ZxOKuxrFCRRkptcZVx /TcY5hS4B2J+zocL3KWI+yXHzBzQGQO1zCmuWZMQhO9GPxKODslCxkQ4QA5E2xipsKKc b27w== 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 :message-id:date:subject:cc:to:from:dkim-signature; bh=cxJ2AcqmvudTDKqZIphB7sIF2A+O2rDouQtJy9HYwBU=; b=mPgK+CKOFmWh5PT5iICMUfe2UpBwuZu9OifJzvn2iNWT03lFfPPxQmW91vciMVj7jM hEElmD5DitIcT3CViEybLE+emn53NFuMxzAMP1vJU8G+v+c8NNCwZXKbylcbY3X/W6p4 KXhIUjzB5ce9Ehkxsq16BZVDgKGTu30MYbKQDRxvtWYvbwueDUhtFKQDs70zvsv8yAb3 xhbpK/iiEJHrBTCod+kbx3MgIrX6Epo6wt5+t7zJr5X2Pc5HV+KzOzabp/4DLiHcfDGa H6BwxVrhc7KRv/4pjvMiP+Ygu+HbKKK0sFD/ASLNf9YSk/fKw4D+8BmMOtYhLVyPUTlt 1MCg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=E36d1jvJ; 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 a2si3854359edn.536.2021.02.04.13.05.34; Thu, 04 Feb 2021 13:06:18 -0800 (PST) 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=E36d1jvJ; 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 S229774AbhBDVDK (ORCPT + 99 others); Thu, 4 Feb 2021 16:03:10 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54498 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229989AbhBDVDI (ORCPT ); Thu, 4 Feb 2021 16:03:08 -0500 Received: from mail-pf1-x435.google.com (mail-pf1-x435.google.com [IPv6:2607:f8b0:4864:20::435]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C7F7FC0613D6 for ; Thu, 4 Feb 2021 13:02:27 -0800 (PST) Received: by mail-pf1-x435.google.com with SMTP id m6so2903412pfk.1 for ; Thu, 04 Feb 2021 13:02:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=cxJ2AcqmvudTDKqZIphB7sIF2A+O2rDouQtJy9HYwBU=; b=E36d1jvJSw7hqo7Oh2mdCqvXetP2ubYAdvkGsCuoy1V1hPtzB+BuM/coO071O1PVIO uDTG8WGPBdMCmHPwPkcak8UeohEhSiKN4XDrdJF7gxrm2tL6Ys2IP1C648bBTHqfEgmu lQMHZy36Mdvq21SnoPBopbTRG+sq0c1dGnE0Q6Ksd1qIUQ5ANJgXQNSP0e3lAU4zTm3c OeS2/MwG6n3qMi9/1KjEWZoXVvSU2vCWs37dA0rqbYIQIshrvSeWV/sbewLCknyQBR2e ftxCXXYurhifrzX3d12RCTFGcWMBmbDDaKRp+5KRqMAuTSb5XQIcl89Auw88DXkQkQ1c n3nQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=cxJ2AcqmvudTDKqZIphB7sIF2A+O2rDouQtJy9HYwBU=; b=WT7mmkgMH98lPZ9gXLYrBIFv5yYy7DJi1aOyEj/c+kq/k0UY/YH8DG8fi6WZ2B6eMY 5XpQLvioeYUPgJQpksvAfZNlpS00crJp+pc19xE7vQUKoFZIpkjwdCDPZ5G5uUlb9HFA RPVUb/1ldP/ZY1LfG8Vnb32cm8v6r7gplj078M09BHaQUTg1OChc7Kqfi4F1NnccqILn HFZQlka6tMMHJyYzfYrPaqjOOdWH/5lC4XrE7sx4EXm/O0Soy0dPbM/aZs8/YvPqiRg8 gWVt4FsBcd+weyRtuzg34z4p4z+eMT8guPtvXP9E249MX/OsDPvICX4U6FvFygvOkFJr vSog== X-Gm-Message-State: AOAM531zr6fZpc7p32KvyeiF+pb10I1Md5Gxd6TCd+UhZwkHcoccnCej jmSeP8fMOFGn4fVWycRSBU/BqF2Tz7eK2w== X-Received: by 2002:a63:c64c:: with SMTP id x12mr832904pgg.293.1612472547106; Thu, 04 Feb 2021 13:02:27 -0800 (PST) Received: from CWHIT-MBP1.hitronhub.home (76-14-108-251.rk.wavecable.com. [76.14.108.251]) by smtp.gmail.com with ESMTPSA id r20sm7297804pgb.3.2021.02.04.13.02.25 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 04 Feb 2021 13:02:26 -0800 (PST) From: Chris White To: linux-bluetooth@vger.kernel.org Cc: cwhit@dolby.com, Keyur Parekh Subject: [PATCH] emulator: Periodic Advertising and Create BIG Command Date: Thu, 4 Feb 2021 13:02:22 -0800 Message-Id: <20210204210222.69767-1-cdwhite13@gmail.com> X-Mailer: git-send-email 2.21.0 (Apple Git-122.2) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Keyur Parekh This adds support for Periodic Advertising and the Create BIG HCI command in the emulator. These changes are the first step in making the emulator useful for testing the LE Audio broadcast feature. --- emulator/btdev.c | 82 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 73 insertions(+), 9 deletions(-) diff --git a/emulator/btdev.c b/emulator/btdev.c index 17965f9b6..3f9201ba2 100644 --- a/emulator/btdev.c +++ b/emulator/btdev.c @@ -141,6 +141,12 @@ struct btdev { uint8_t le_scan_own_addr_type; uint8_t le_filter_dup; uint8_t le_adv_enable; + uint8_t le_periodic_adv_enable; + uint16_t le_periodic_adv_properties; + uint16_t le_periodic_min_interval; + uint16_t le_periodic_max_interval; + uint8_t le_periodic_data_len; + uint8_t le_periodic_data[31]; uint8_t le_ltk[16]; struct { struct bt_hci_cmd_le_set_cig_params params; @@ -3008,7 +3014,6 @@ static void le_send_adv_report(struct btdev *btdev, const struct btdev *remote, } meta_event; meta_event.subevent = BT_HCI_EVT_LE_ADV_REPORT; - memset(&meta_event.lar, 0, sizeof(meta_event.lar)); meta_event.lar.num_reports = 1; meta_event.lar.event_type = type; @@ -3934,22 +3939,57 @@ static int cmd_clear_adv_sets(struct btdev *dev, const void *data, static int cmd_set_per_adv_params(struct btdev *dev, const void *data, uint8_t len) { - /* TODO */ - return -ENOTSUP; + const struct bt_hci_cmd_le_set_periodic_adv_params *cmd = data; + uint8_t status; + + if (dev->le_periodic_adv_enable) { + status = BT_HCI_ERR_COMMAND_DISALLOWED; + } + else { + status = BT_HCI_ERR_SUCCESS; + dev->le_periodic_adv_properties = le16_to_cpu(cmd->properties); + dev->le_periodic_min_interval = cmd->min_interval; + dev->le_periodic_max_interval = cmd->max_interval; + } + + cmd_complete(dev, BT_HCI_CMD_LE_SET_PERIODIC_ADV_PARAMS, &status, + sizeof(status)); + + return 0; } static int cmd_set_per_adv_data(struct btdev *dev, const void *data, uint8_t len) { - /* TODO */ - return -ENOTSUP; + const struct bt_hci_cmd_le_set_periodic_adv_data *cmd = data; + uint8_t status = BT_HCI_ERR_SUCCESS; + + dev->le_periodic_data_len = cmd->data_len; + memcpy(dev->le_periodic_data, cmd->data, 31); + cmd_complete(dev, BT_HCI_CMD_LE_SET_PERIODIC_ADV_DATA, &status, + sizeof(status)); + + return 0; } static int cmd_set_per_adv_enable(struct btdev *dev, const void *data, uint8_t len) { - /* TODO */ - return -ENOTSUP; + const struct bt_hci_cmd_le_set_periodic_adv_enable *cmd = data; + uint8_t status; + + if (dev->le_periodic_adv_enable == cmd->enable) { + status = BT_HCI_ERR_COMMAND_DISALLOWED; + } + else { + dev->le_periodic_adv_enable = cmd->enable; + status = BT_HCI_ERR_SUCCESS; + } + + cmd_complete(dev, BT_HCI_CMD_LE_SET_PERIODIC_ADV_ENABLE, &status, + sizeof(status)); + + return 0; } static int cmd_set_ext_scan_params(struct btdev *dev, const void *data, @@ -4470,9 +4510,32 @@ static int cmd_reject_cis(struct btdev *dev, const void *data, uint8_t len) static int cmd_create_big(struct btdev *dev, const void *data, uint8_t len) { /* TODO */ - return -ENOTSUP; + cmd_status(dev, BT_HCI_ERR_SUCCESS, BT_HCI_CMD_LE_CREATE_BIG); + + return 0; } +static int cmd_create_big_complete(struct btdev *dev, const void *data, + uint8_t len) +{ + const struct bt_hci_cmd_le_create_big *cmd = data; + int i; + + for (i = 0; i < cmd->num_bis; i++) { + const struct bt_hci_bis *bis = &cmd->bis[i]; + struct bt_hci_evt_le_big_complete evt; + + evt.big_id = cmd->big_id; + evt.num_bis = cmd->num_bis; + evt.phy = bis->phy; + memcpy(&evt.latency, &(bis->latency), 3); + + le_meta_event(dev, BT_HCI_EVT_LE_BIG_COMPLETE, &evt, + sizeof(evt)); + } + + return 0; +} static int cmd_create_big_test(struct btdev *dev, const void *data, uint8_t len) { /* TODO */ @@ -4621,7 +4684,8 @@ static int cmd_set_host_feature(struct btdev *dev, const void *data, CMD(BT_HCI_CMD_LE_REMOVE_CIG, cmd_remove_cig, NULL), \ CMD(BT_HCI_CMD_LE_ACCEPT_CIS, cmd_accept_cis, NULL), \ CMD(BT_HCI_CMD_LE_REJECT_CIS, cmd_reject_cis, NULL), \ - CMD(BT_HCI_CMD_LE_CREATE_BIG, cmd_create_big, NULL), \ + CMD(BT_HCI_CMD_LE_CREATE_BIG, cmd_create_big, \ + cmd_create_big_complete), \ CMD(BT_HCI_CMD_LE_CREATE_BIG_TEST, cmd_create_big_test, NULL), \ CMD(BT_HCI_CMD_LE_TERM_BIG, cmd_term_big, NULL), \ CMD(BT_HCI_CMD_LE_BIG_CREATE_SYNC, cmd_big_create_sync, NULL), \ -- 2.21.0 (Apple Git-122.2)