Received: by 2002:a25:ca44:0:0:0:0:0 with SMTP id a65csp973760ybg; Mon, 27 Jul 2020 04:47:44 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyo2NygMeKNV3GG7/ibe2w9hIXvBxSEvxYlUAQKtHti4ZG/JJn55A/qPyzql4K4H2w5K9DA X-Received: by 2002:a05:6402:1d35:: with SMTP id dh21mr21529364edb.186.1595850464448; Mon, 27 Jul 2020 04:47:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1595850464; cv=none; d=google.com; s=arc-20160816; b=M8xfuXljcbN0atGfVSWcLkRSee6LaoRxSz11sE098/MXcDrrwria4vSbVpVrUGxq9U VNUq5hZWxv7Zx1fuOGQHANFe7Yw9ZLcH0fOeAzVIsKwavD6o5lUkQN94HELGMRY1nfJz qqpP1+jkvDBYqh+yBRNJyKKg4J+BvfRibrqgMQP2gWxC/BJgZSuBPmtITb/Oe5P+ifni 0t/j7BOBLB9sWYNmHGLCPuFShog94evO2LhdSshkBL8+retZgjiAittzzRn+fZeoO+SN uO1xpL8u5S8BqOpiIpFPHpZJDtmoCQPKcnWr62vnfdBVGfPNWmNcGCWHNFSmnHFIGeO3 6qgg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=6QSdUN1soPfoKeCyvOxy1GyQLEauSujDq0FyNrkcHWA=; b=ZLxjLoA4QNakd0idklq389QgoovYpKcoGpUJK+FbGG2FGQAlSgm1ic+kOeFMTcBZGe egNkvDFjjZ7TG/OIrsmTG3nrLH5SO7oEYSjLRrZaC2C7PMhlJDXoB6nL8KBDvL2xUkG+ Kk/TBGHoTZbCLHmCEb4xvqH0FhaQzNrwGl3gekvneYIttQOp7t7fktK5XAfan/SKKyWR 9VrTZGajfw26gVHJprHwWfoJzU+Vn7/npnyOlurMsYavNS8VGBPCtxB896E005br6zeb whuT5wy8yDL6xE69hEA9T11icS7h6eEKEcvhKShXroVGOr/cAzu8MdxgqDpPEyth7Jph y2Ng== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=bXFEeaXt; 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 cb10si5449880edb.420.2020.07.27.04.47.03; Mon, 27 Jul 2020 04:47:44 -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=bXFEeaXt; 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 S1726873AbgG0Lqi (ORCPT + 99 others); Mon, 27 Jul 2020 07:46:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40808 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726599AbgG0Lqh (ORCPT ); Mon, 27 Jul 2020 07:46:37 -0400 Received: from mail-io1-xd44.google.com (mail-io1-xd44.google.com [IPv6:2607:f8b0:4864:20::d44]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 85FD7C061794 for ; Mon, 27 Jul 2020 04:46:37 -0700 (PDT) Received: by mail-io1-xd44.google.com with SMTP id w12so2975089iom.4 for ; Mon, 27 Jul 2020 04:46:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=6QSdUN1soPfoKeCyvOxy1GyQLEauSujDq0FyNrkcHWA=; b=bXFEeaXt2ImEDBc4MBatUQhKoruNN4D4UjrdIhrwkWvLTAxubjHi6ufBPkbL0rZUQ4 2D8wmvP1zK4fIu/33pP2iYiq0sGxNB+EQDRzmztNd7ZRNnFrScIFE7mCJZbr6mEAE36K bNznDH4BRhqWYF+go6zxX4J2+7BPgt5xQHhb+2s9KxozQrOoxlabBqSiiP8razNngwUH oaJcqgaHm8OmcC2dWe3IuHo+5jQYISxy/DFqu+TWUFq4beVNUeZ0PkHSZXbzJBQTDCr2 6Z7dI3iovUe+fkQy1vP8D5go8I6h1g80PQZCPx9bVPa5NygeHHwQx3y54WceDjT/juQo YYqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=6QSdUN1soPfoKeCyvOxy1GyQLEauSujDq0FyNrkcHWA=; b=BghW9U2x+Pez+kON5ArGQ+1Ij+YrODbh3OT4LVJVMA0LprsDE/ZuQYr1GXB7PaLZK5 yv72xxHRaaBFYsesHw0egHx+ued7j/SHS4TwssePmaaesjvqXSeJJAhRSENMzSYEfJzE 6yLA2fdOfGu8/zqHAORiq9hjkeaBgeQ83BqLkVa4u5otbIhJRXe8iTpNLFFYDTezAPEt aH/2MPYbg93y+W/0QT3FqMVcekcTHvJx0m6kGfGKQOz8ZHnatmr1nM8bTXRQ7ieW53UB aN47wOnkrgRXSYivTVO8PISRAa8LIwEtkAlwvrIMmcNjLg2uyZhQ0wgBrS+DbACxKkJ9 fnvw== X-Gm-Message-State: AOAM532ocqvGYLBMMfHUIr2ijF97qb3+N7clL2jgLY0eOJl+ovBDXDDB 4veGwgmNCY2S/F1trybtrbbzYI0i9CUvXH7IkLCYc0Ye X-Received: by 2002:a05:6602:220f:: with SMTP id n15mr23649656ion.103.1595850396605; Mon, 27 Jul 2020 04:46:36 -0700 (PDT) MIME-Version: 1.0 References: <20200723123903.29337-1-sathish.narasimman@intel.com> <20200723123903.29337-8-sathish.narasimman@intel.com> In-Reply-To: <20200723123903.29337-8-sathish.narasimman@intel.com> From: Sathish Narasimman Date: Mon, 27 Jul 2020 17:16:25 +0530 Message-ID: Subject: Re: [PATCH v5 8/8] Bluetooth: Enable controller RPA resolution using Experimental feature To: Bluez mailing list , Chethan T N , Marcel Holtmann Cc: Sathish Narasimman Content-Type: text/plain; charset="UTF-8" Sender: linux-bluetooth-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org Hi gentle reminder On Thu, Jul 23, 2020 at 6:05 PM Sathish Narasimman wrote: > > This patch adds support to enable the use of RPA Address resolution > using expermental feature mgmt command. > > Signed-off-by: Sathish Narasimman > --- > include/net/bluetooth/hci.h | 1 + > net/bluetooth/hci_event.c | 1 + > net/bluetooth/hci_request.c | 7 ++- > net/bluetooth/mgmt.c | 112 ++++++++++++++++++++++++++++++++++++ > 4 files changed, 120 insertions(+), 1 deletion(-) > > diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h > index 4ff2fc4498f3..55205d805c22 100644 > --- a/include/net/bluetooth/hci.h > +++ b/include/net/bluetooth/hci.h > @@ -307,6 +307,7 @@ enum { > HCI_FORCE_BREDR_SMP, > HCI_FORCE_STATIC_ADDR, > HCI_LL_RPA_RESOLUTION, > + HCI_ENABLE_LL_PRIVACY, > HCI_CMD_PENDING, > HCI_FORCE_NO_MITM, > > diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c > index 628831b15c0a..33d8458fdd4a 100644 > --- a/net/bluetooth/hci_event.c > +++ b/net/bluetooth/hci_event.c > @@ -5230,6 +5230,7 @@ static void hci_le_enh_conn_complete_evt(struct hci_dev *hdev, > le16_to_cpu(ev->supervision_timeout)); > > if (use_ll_privacy(hdev) && > + hci_dev_test_flag(hdev, HCI_ENABLE_LL_PRIVACY) && > hci_dev_test_flag(hdev, HCI_LL_RPA_RESOLUTION)) > hci_req_disable_address_resolution(hdev); > } > diff --git a/net/bluetooth/hci_request.c b/net/bluetooth/hci_request.c > index 70e077cc7dfa..435400a43a78 100644 > --- a/net/bluetooth/hci_request.c > +++ b/net/bluetooth/hci_request.c > @@ -678,8 +678,10 @@ void hci_req_add_le_scan_disable(struct hci_request *req, bool rpa_le_conn) > > /* Disable address resolution */ > if (use_ll_privacy(hdev) && > + hci_dev_test_flag(hdev, HCI_ENABLE_LL_PRIVACY) && > hci_dev_test_flag(hdev, HCI_LL_RPA_RESOLUTION) && !rpa_le_conn) { > __u8 enable = 0x00; > + > hci_req_add(req, HCI_OP_LE_SET_ADDR_RESOLV_ENABLE, 1, &enable); > } > } > @@ -870,8 +872,11 @@ static void hci_req_start_scan(struct hci_request *req, u8 type, u16 interval, > return; > } > > - if (use_ll_privacy(hdev) && addr_resolv) { > + if (use_ll_privacy(hdev) && > + hci_dev_test_flag(hdev, HCI_ENABLE_LL_PRIVACY) && > + addr_resolv) { > u8 enable = 0x01; > + > hci_req_add(req, HCI_OP_LE_SET_ADDR_RESOLV_ENABLE, 1, &enable); > } > > diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c > index 47bcfe2fb14c..adde92cf015d 100644 > --- a/net/bluetooth/mgmt.c > +++ b/net/bluetooth/mgmt.c > @@ -3759,6 +3759,12 @@ static const u8 simult_central_periph_uuid[16] = { > 0x96, 0x46, 0xc0, 0x42, 0xb5, 0x10, 0x1b, 0x67, > }; > > +/* 15c0a148-c273-11ea-b3de-0242ac130004 */ > +static const u8 rpa_resolution_uuid[16] = { > + 0x04, 0x00, 0x13, 0xac, 0x42, 0x02, 0xde, 0xb3, > + 0xea, 0x11, 0x73, 0xc2, 0x48, 0xa1, 0xc0, 0x15, > +}; > + > static int read_exp_features_info(struct sock *sk, struct hci_dev *hdev, > void *data, u16 data_len) > { > @@ -3795,6 +3801,21 @@ static int read_exp_features_info(struct sock *sk, struct hci_dev *hdev, > idx++; > } > > + if (use_ll_privacy(hdev)) { > + if (hci_dev_test_flag(hdev, HCI_ENABLE_LL_PRIVACY)) { > + flags = BIT(0); > + if (!hci_dev_test_flag(hdev, HCI_ADVERTISING)) > + flags |= BIT(1); > + } else > + flags = 0; > + > + memcpy(rp->features[idx].uuid, rpa_resolution_uuid, 16); > + rp->features[idx].flags = cpu_to_le32(flags); > + idx++; > + > + new_settings(hdev, sk); > + } > + > rp->feature_count = cpu_to_le16(idx); > > /* After reading the experimental features information, enable > @@ -3807,6 +3828,27 @@ static int read_exp_features_info(struct sock *sk, struct hci_dev *hdev, > 0, rp, sizeof(*rp) + (20 * idx)); > } > > +static int exp_ll_privacy_feature_changed(bool enabled, struct sock *skip) > +{ > + struct mgmt_ev_exp_feature_changed ev; > + u32 flags; > + > + memset(&ev, 0, sizeof(ev)); > + memcpy(ev.uuid, rpa_resolution_uuid, 16); > + > + if (enabled) > + flags = 0x03; > + else > + flags = 0; > + > + ev.flags = cpu_to_le32(flags); > + > + return mgmt_limited_event(MGMT_EV_EXP_FEATURE_CHANGED, NULL, > + &ev, sizeof(ev), > + HCI_MGMT_EXP_FEATURE_EVENTS, skip); > + > +} > + > #ifdef CONFIG_BT_FEATURE_DEBUG > static int exp_debug_feature_changed(bool enabled, struct sock *skip) > { > @@ -3845,6 +3887,18 @@ static int set_exp_feature(struct sock *sk, struct hci_dev *hdev, > } > #endif > > + if (use_ll_privacy(hdev)) { > + bool changed; > + > + changed = hci_dev_test_flag(hdev, > + HCI_ENABLE_LL_PRIVACY); > + > + hci_dev_clear_flag(hdev, HCI_ENABLE_LL_PRIVACY); > + > + if (changed) > + exp_ll_privacy_feature_changed(false, sk); > + } > + > hci_sock_set_flag(sk, HCI_MGMT_EXP_FEATURE_EVENTS); > > return mgmt_cmd_complete(sk, hdev ? hdev->id : MGMT_INDEX_NONE, > @@ -3895,6 +3949,64 @@ static int set_exp_feature(struct sock *sk, struct hci_dev *hdev, > } > #endif > > + if (!memcmp(cp->uuid, rpa_resolution_uuid, 16)) { > + bool val, changed; > + int err; > + u32 flags; > + > + /* Parameters are limited to a single octet */ > + if (data_len != MGMT_SET_EXP_FEATURE_SIZE + 1) > + return mgmt_cmd_status(sk, MGMT_INDEX_NONE, > + MGMT_OP_SET_EXP_FEATURE, > + MGMT_STATUS_INVALID_PARAMS); > + > + /* Only boolean on/off is supported */ > + if (cp->param[0] != 0x00 && cp->param[0] != 0x01) > + return mgmt_cmd_status(sk, MGMT_INDEX_NONE, > + MGMT_OP_SET_EXP_FEATURE, > + MGMT_STATUS_INVALID_PARAMS); > + > + val = !!cp->param[0]; > + > + if (val) { > + changed = !hci_dev_test_flag(hdev, > + HCI_ENABLE_LL_PRIVACY); > + > + hci_dev_set_flag(hdev, HCI_ENABLE_LL_PRIVACY); > + > + /* Enable LL privacy */ > + flags = BIT(0); > + /* Disable HCI_ADVERTISING flag */ > + flags |= BIT(1); > + > + hci_dev_clear_flag(hdev, HCI_ADVERTISING); > + > + } else { > + changed = hci_dev_test_flag(hdev, > + HCI_ENABLE_LL_PRIVACY); > + hci_dev_clear_flag(hdev, HCI_ENABLE_LL_PRIVACY); > + > + flags = 0; > + } > + > + memcpy(rp.uuid, rpa_resolution_uuid, 16); > + > + rp.flags = cpu_to_le32(flags); > + > + hci_sock_set_flag(sk, HCI_MGMT_EXP_FEATURE_EVENTS); > + > + err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE, > + MGMT_OP_SET_EXP_FEATURE, 0, > + &rp, sizeof(rp)); > + > + if (changed) { > + exp_ll_privacy_feature_changed(val, sk); > + new_settings(hdev, sk); > + } > + > + return err; > + } > + > return mgmt_cmd_status(sk, hdev ? hdev->id : MGMT_INDEX_NONE, > MGMT_OP_SET_EXP_FEATURE, > MGMT_STATUS_NOT_SUPPORTED); > -- > 2.17.1 > Regards Sathish N