Received: by 2002:a05:6a10:9e8c:0:0:0:0 with SMTP id y12csp692106pxx; Wed, 28 Oct 2020 14:39:58 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxz90fLbIwyWQEYx8m47MSOON+0zRTAbx8vOjdh7lepuKP20k8FagCqVgUHgQX4Q9at+QKF X-Received: by 2002:aa7:dc52:: with SMTP id g18mr922595edu.369.1603921198095; Wed, 28 Oct 2020 14:39:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1603921198; cv=none; d=google.com; s=arc-20160816; b=YSW79vU5yLGfvIlt5bnkkO8MVR23FbvFJHxeduSJ5pKfWvse9UX15N8PFrTRbU1HKr dUtJ8Q7iqVZVfzCv6gyM4+G6q7rRp296g60+cQBiXHKm4Fze4cOJYOs4SjRXHkQn3v0b Ujm2bnEhIDmak7WMhf+ZX6SNEDp4PJRilBwrIiCOUYFCq+AckApuv/JQXDks0C8uLfCf 94mc8Svno/Cu0Vx6y2/4qZHSlzUEh4mMfovkesO/+6EiFXYaFBnSN4hRPk/sbt8sxC9Q 1gF7f3JNmmPwciUxQjuPtax5eqgA/zfzKfvxbDyCR8O0P/8xjzki+vZCJbW7HWDuTBlD xlZA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=qdTqHYuL62CeJ4c8eXBwKMcV+0FLgQ1L9r48F59GFLI=; b=W6h/6u/J1bvYyPoKmQEptSqmr+tSCkhwxKJ1Hj6aEos9MOgHrrac2H/GBecVZGaxJV yuSuHETvDWGkIb6A47dLihllqsD3BXIv0irI6jTC8FehuY4++0DigdFkOxNITcz8m7PG s3xD2n3Oo7V2BXL8FP3GwO9HYoWHZgUvfZjYOhz48JrA0u/6OPJTWhNiEeBVVuryUUHV pt4hypGXctqJorF5ZsI44oL9mh8CRDHQ+SJSt2A2k/1XMEwTpx9GFfmXNlLoynlbsjJg L6ul2Y4EXQiO8ZecZSlfU/b2liYNq2zsyCvNo52+lj4VbJ75YG8B8BaC3Jw/BatV/HGD OwRg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=PsAr9vf3; 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 n10si387594ejg.353.2020.10.28.14.39.33; Wed, 28 Oct 2020 14:39:58 -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=PsAr9vf3; 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 S1760036AbgJ0WDP (ORCPT + 99 others); Tue, 27 Oct 2020 18:03:15 -0400 Received: from mail-oi1-f194.google.com ([209.85.167.194]:42425 "EHLO mail-oi1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756627AbgJ0WDO (ORCPT ); Tue, 27 Oct 2020 18:03:14 -0400 Received: by mail-oi1-f194.google.com with SMTP id c72so2910284oig.9 for ; Tue, 27 Oct 2020 15:03:13 -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=qdTqHYuL62CeJ4c8eXBwKMcV+0FLgQ1L9r48F59GFLI=; b=PsAr9vf3R9hvCkXILo6uNRjrrNU+KhEqkQQH2bxZsfxAfQAs8/FyH/pcXM48zc+gSz 2hM803TtjBUVc4BMe80iTHTFiOu4yyNeBxNJ4A94iJj7+1VxfxUkHiRVtVrtH/uzY7CM acNDLpeN+zKPjRVTTd4vWfqDsAMpSFAjG3tSr3ulxhC5Nz51jk7ghyxgfKQm0JUagl/m VxosG9NLOiB8LnbB69UZtGIkSBoqdEdrK602qVWjZxj59EDM/OChebNx9CjefoAmmOgg tqHURD9+d8SeIwsbsTdAjzJNOAZcCNRDKVfkujaV+3/VQzRdTCULVTrjFUsETegK/dXI zJ6A== 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=qdTqHYuL62CeJ4c8eXBwKMcV+0FLgQ1L9r48F59GFLI=; b=ZufTz5D5cfoZb3htUAJD/EQRTQWXTgrdk6j/pfyHQ3IdN4Qklmo+hw9JDmeiRPT2po v1d5EWndl4AJ0MlQG6gY2v0KdCS1abvqBVqwaBenvEnhZoes/QUwAEJcZvUKxBSHjojV FXkjOl3QXlE9IX/PSMB2+c/oMrSYmmiJ2rP//D+CW1VS0eJeetKH6asQDlYyYoI1GLX/ i5X/ZDttLEz3xKx9hMw6V0LZkkM3Ot5br8NYK7OX70vazFnXGsh0j3JIOR2GPXCUlc9V 7so2GhlJuh1/HgdDwULPLFfKLaSKT7uHLrAbm0suIPll454uPeqmCZccfLzLzi5RgXRD xVTw== X-Gm-Message-State: AOAM530ejcN4srmgvFL8WJgdkakI+xfP5PYnKL8Iq90iJaBlL4nNvbSH 0EU2E0Zrfx3bv8r9T3ZVRGwXjfpA7vdhE4Y+IDM= X-Received: by 2002:aca:4ac6:: with SMTP id x189mr2406244oia.58.1603836192906; Tue, 27 Oct 2020 15:03:12 -0700 (PDT) MIME-Version: 1.0 References: <20201001230152.2422908-1-danielwinkler@google.com> <20201001155738.Bluez.v4.5.Ic4a3667da774f5f34477d5168a68a9280657e2da@changeid> In-Reply-To: <20201001155738.Bluez.v4.5.Ic4a3667da774f5f34477d5168a68a9280657e2da@changeid> From: Luiz Augusto von Dentz Date: Tue, 27 Oct 2020 15:03:01 -0700 Message-ID: Subject: Re: [Bluez PATCH v4 05/10] advertising: Parse intervals and tx power from adv To: Daniel Winkler Cc: Luiz Augusto Von Dentz , "linux-bluetooth@vger.kernel.org" , ChromeOS Bluetooth Upstreaming , Sonny Sasaka , Alain Michaud Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org Hi Daniel, On Thu, Oct 1, 2020 at 4:05 PM Daniel Winkler wrote: > > This change adds parsers for the advertising intervals and tx power > properties of the LEAdvertisement1 object. It validates that each field > adheres to the 5.2 spec, and that min and max intervals are compatible > with each other, i.e. that min interval is less than max interval. > > A note here for maintainers: The tx power that is sent in the hci > parameter command is an int8_t, but as far as I can tell, there is no > clean way to use a signed 8-bit integer in dbus. The dbus byte type > seems incompatible with negative values in high-level languages (python) > without awkward usage manipulation on the client side. For this reason, > I chose to use an int16_t type for the tx power dbus field, which is > then downcasted to the int8_t in bluetoothd, which at least makes the > signed-ness of the type crystal clear to the dbus client that uses it. > > This change is manually verified by ensuring the intervals and tx power > parameters are correctly parsed from the LEAdvertisement1 object, and > that the parse fails if the parameters are incorrect or not compatible > with each other. > > Reviewed-by: Sonny Sasaka > Reviewed-by: Alain Michaud > --- > > Changes in v4: None > Changes in v3: None > Changes in v2: None > > src/advertising.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 89 insertions(+) > > diff --git a/src/advertising.c b/src/advertising.c > index 7c7599552..3690a2aac 100644 > --- a/src/advertising.c > +++ b/src/advertising.c > @@ -54,6 +54,11 @@ struct btd_adv_manager { > #define AD_TYPE_BROADCAST 0 > #define AD_TYPE_PERIPHERAL 1 > > +/* BLUETOOTH SPECIFICATION Version 5.2 | Vol 4, Part E, page 2585 > + * defines tx power value indicating no preference > + */ > +#define ADV_TX_POWER_NO_PREFERENCE 0x7F > + > struct btd_adv_client { > struct btd_adv_manager *manager; > char *owner; > @@ -74,6 +79,9 @@ struct btd_adv_client { > struct bt_ad *data; > struct bt_ad *scan; > uint8_t instance; > + uint32_t min_interval; > + uint32_t max_interval; > + int8_t tx_power; > }; > > struct dbus_obj_match { > @@ -937,6 +945,74 @@ static bool parse_secondary(DBusMessageIter *iter, > return false; > } > > +static bool parse_min_interval(DBusMessageIter *iter, > + struct btd_adv_client *client) > +{ > + if (!iter) > + return false; > + > + if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_UINT32) > + return false; > + > + dbus_message_iter_get_basic(iter, &client->min_interval); > + > + /* BLUETOOTH SPECIFICATION Version 5.2 | Vol 4, Part E, page 2584 > + * defines acceptable interval range > + */ > + if (client->min_interval < 0x20 || client->min_interval > 0xFFFFFF) { > + client->min_interval = 0; > + return false; > + } > + > + return true; > +} > + > +static bool parse_max_interval(DBusMessageIter *iter, > + struct btd_adv_client *client) > +{ > + if (!iter) > + return false; > + > + if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_UINT32) > + return false; > + > + dbus_message_iter_get_basic(iter, &client->max_interval); > + > + /* BLUETOOTH SPECIFICATION Version 5.2 | Vol 4, Part E, page 2584 > + * defines acceptable interval range > + */ > + if (client->max_interval < 0x20 || client->max_interval > 0xFFFFFF) { > + client->max_interval = 0; > + return false; > + } > + > + return true; > +} > + > +static bool parse_tx_power(DBusMessageIter *iter, > + struct btd_adv_client *client) > +{ > + int16_t val; > + > + if (!iter) > + return false; > + > + if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_INT16) > + return false; > + > + dbus_message_iter_get_basic(iter, &val); > + > + /* BLUETOOTH SPECIFICATION Version 5.2 | Vol 4, Part E, page 2585 > + * defines acceptable tx power range > + */ > + if (val < -127 || val > 20) > + return false; > + > + client->tx_power = val; > + > + return true; > +} > + > static struct adv_parser { > const char *name; > bool (*func)(DBusMessageIter *iter, struct btd_adv_client *client); > @@ -955,6 +1031,9 @@ static struct adv_parser { > { "Discoverable", parse_discoverable }, > { "DiscoverableTimeout", parse_discoverable_timeout }, > { "SecondaryChannel", parse_secondary }, > + { "MinInterval", parse_min_interval }, > + { "MaxInterval", parse_max_interval }, > + { "TxPower", parse_tx_power }, > { }, > }; > > @@ -1083,6 +1162,13 @@ static DBusMessage *parse_advertisement(struct btd_adv_client *client) > goto fail; > } > > + if (client->min_interval > client->max_interval) { > + /* Min interval must not be bigger than max interval */ > + error("MinInterval must be less than MaxInterval (%lu > %lu)", > + client->min_interval, client->max_interval); > + goto fail; > + } > + > err = refresh_adv(client, add_adv_callback, &client->add_adv_id); > if (!err) > return NULL; > @@ -1158,6 +1244,9 @@ static struct btd_adv_client *client_create(struct btd_adv_manager *manager, > > client->manager = manager; > client->appearance = UINT16_MAX; > + client->tx_power = ADV_TX_POWER_NO_PREFERENCE; > + client->min_interval = 0; > + client->max_interval = 0; Lets only parse these if experimental is enabled. > return client; > > -- > 2.28.0.709.gb0816b6eb0-goog > -- Luiz Augusto von Dentz