2022-06-14 22:01:02

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH BlueZ 1/2] main.conf: Split Kernel Experimental UUIDs from Experimental

From: Luiz Augusto von Dentz <[email protected]>

This splits kernel experimental UUIDs from D-Bus Experimental interface
so they can be controlled indenpendetly.
---
src/adapter.c | 28 ++++++++++++++++---------
src/btd.h | 5 +++--
src/main.c | 57 ++++++++++++++++++++++++++++++---------------------
src/main.conf | 8 ++++++--
4 files changed, 61 insertions(+), 37 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index 3e0b3049a..afefa1d5d 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -9583,7 +9583,7 @@ static void set_exp_debug_complete(uint8_t status, uint16_t len,
const void *param, void *user_data)
{
struct btd_adapter *adapter = user_data;
- uint8_t action = btd_opts.experimental ? 0x01 : 0x00;
+ uint8_t action;

if (status != 0) {
error("Set Experimental Debug failed with status 0x%02x (%s)",
@@ -9591,7 +9591,9 @@ static void set_exp_debug_complete(uint8_t status, uint16_t len,
return;
}

- DBG("Experimental Debug successfully set");
+ action = btd_kernel_experimental_enabled(debug_uuid.str);
+
+ DBG("Experimental Debug successfully %s", action ? "set" : "reset");

if (action)
queue_push_tail(adapter->exps, (void *)debug_uuid.val);
@@ -9631,7 +9633,7 @@ static void set_rpa_resolution_complete(uint8_t status, uint16_t len,
const void *param, void *user_data)
{
struct btd_adapter *adapter = user_data;
- uint8_t action = btd_opts.experimental ? 0x01 : 0x00;
+ uint8_t action;

if (status != 0) {
error("Set RPA Resolution failed with status 0x%02x (%s)",
@@ -9639,7 +9641,9 @@ static void set_rpa_resolution_complete(uint8_t status, uint16_t len,
return;
}

- DBG("RPA Resolution successfully set");
+ action = btd_kernel_experimental_enabled(rpa_resolution_uuid.str);
+
+ DBG("RPA Resolution successfully %s", action ? "set" : "reset");

if (action)
queue_push_tail(adapter->exps, (void *)rpa_resolution_uuid.val);
@@ -9665,7 +9669,7 @@ static void codec_offload_complete(uint8_t status, uint16_t len,
const void *param, void *user_data)
{
struct btd_adapter *adapter = user_data;
- uint8_t action = btd_opts.experimental ? 0x01 : 0x00;
+ uint8_t action;

if (status != 0) {
error("Set Codec Offload failed with status 0x%02x (%s)",
@@ -9673,7 +9677,9 @@ static void codec_offload_complete(uint8_t status, uint16_t len,
return;
}

- DBG("Codec Offload successfully set");
+ action = btd_kernel_experimental_enabled(codec_offload_uuid.str);
+
+ DBG("Codec Offload successfully %s", action ? "set" : "reset");

if (action)
queue_push_tail(adapter->exps, (void *)codec_offload_uuid.val);
@@ -9744,20 +9750,22 @@ static void read_exp_features_complete(uint8_t status, uint16_t length,

for (j = 0; j < ARRAY_SIZE(exp_table); j++) {
const struct exp_feat *feat = &exp_table[j];
+ const char *str;
uint8_t action;

if (memcmp(rp->features[i].uuid, feat->uuid->val,
sizeof(rp->features[i].uuid)))
continue;

- action = btd_experimental_enabled(feat->uuid->str);
+ str = feat->uuid->str;
+ action = btd_kernel_experimental_enabled(str);

- DBG("%s flags %u action %u", feat->uuid->str,
- rp->features[i].flags, action);
+ DBG("%s flags %u action %u", str,
+ rp->features[i].flags, action);

/* If already set don't attempt to set it again */
if (action == (rp->features[i].flags & BIT(0))) {
- if (action)
+ if (action & BIT(0))
queue_push_tail(adapter->exps,
(void *)feat->uuid->val);
continue;
diff --git a/src/btd.h b/src/btd.h
index d13646889..c02b2691e 100644
--- a/src/btd.h
+++ b/src/btd.h
@@ -113,7 +113,8 @@ struct btd_opts {
gboolean debug_keys;
gboolean fast_conn;
gboolean refresh_discovery;
- struct queue *experimental;
+ gboolean experimental;
+ struct queue *kernel;

uint16_t did_source;
uint16_t did_vendor;
@@ -145,6 +146,6 @@ void rfkill_init(void);
void rfkill_exit(void);

GKeyFile *btd_get_main_conf(void);
-bool btd_experimental_enabled(const char *uuid);
+bool btd_kernel_experimental_enabled(const char *uuid);

void btd_exit(void);
diff --git a/src/main.c b/src/main.c
index 12cc21372..34a54d43f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -84,6 +84,7 @@ static const char *supported_options[] = {
"JustWorksRepairing",
"TemporaryTimeout",
"Experimental",
+ "KernelExperimental",
"RemoteNameRequestRetryDelay",
NULL
};
@@ -592,12 +593,12 @@ static bool match_experimental(const void *data, const void *match_data)
return !strcasecmp(value, uuid);
}

-bool btd_experimental_enabled(const char *uuid)
+bool btd_kernel_experimental_enabled(const char *uuid)
{
- if (!btd_opts.experimental)
+ if (!btd_opts.kernel)
false;

- return queue_find(btd_opts.experimental, match_experimental, uuid);
+ return queue_find(btd_opts.kernel, match_experimental, uuid);
}

static const char *valid_uuids[] = {
@@ -609,24 +610,24 @@ static const char *valid_uuids[] = {
"*"
};

-static void btd_parse_experimental(char **list)
+static void btd_parse_kernel_experimental(char **list)
{
int i;

- if (btd_opts.experimental) {
- warn("Unable to parse Experimental: list already set");
+ if (btd_opts.kernel) {
+ warn("Unable to parse KernelExperimental: list already set");
return;
}

- btd_opts.experimental = queue_new();
+ btd_opts.kernel = queue_new();

for (i = 0; list[i]; i++) {
size_t j;
const char *uuid = list[i];

if (!strcasecmp("false", uuid) || !strcasecmp("off", uuid)) {
- queue_destroy(btd_opts.experimental, free);
- btd_opts.experimental = NULL;
+ queue_destroy(btd_opts.kernel, free);
+ btd_opts.kernel = NULL;
}

if (!strcasecmp("true", uuid) || !strcasecmp("on", uuid))
@@ -639,13 +640,13 @@ static void btd_parse_experimental(char **list)

/* Ignored if UUID is considered invalid */
if (j == ARRAY_SIZE(valid_uuids)) {
- warn("Invalid Experimental UUID: %s", uuid);
+ warn("Invalid KernelExperimental UUID: %s", uuid);
continue;
}

DBG("%s", uuid);

- queue_push_tail(btd_opts.experimental, strdup(uuid));
+ queue_push_tail(btd_opts.kernel, strdup(uuid));
}
}

@@ -850,12 +851,20 @@ static void parse_config(GKeyFile *config)
else
btd_opts.refresh_discovery = boolean;

- strlist = g_key_file_get_string_list(config, "General", "Experimental",
+ boolean = g_key_file_get_boolean(config, "General", "Experimental",
+ &err);
+ if (err)
+ g_clear_error(&err);
+ else
+ btd_opts.experimental = boolean;
+
+ strlist = g_key_file_get_string_list(config, "General",
+ "KernelExperimental",
NULL, &err);
if (err)
g_clear_error(&err);
else {
- btd_parse_experimental(strlist);
+ btd_parse_kernel_experimental(strlist);
g_strfreev(strlist);
}

@@ -1133,19 +1142,19 @@ static gboolean parse_debug(const char *key, const char *value,
return TRUE;
}

-static gboolean parse_experimental(const char *key, const char *value,
+static gboolean parse_kernel_experimental(const char *key, const char *value,
gpointer user_data, GError **error)
{
char **strlist;

if (value) {
strlist = g_strsplit(value, ",", -1);
- btd_parse_experimental(strlist);
+ btd_parse_kernel_experimental(strlist);
g_strfreev(strlist);
} else {
- if (!btd_opts.experimental)
- btd_opts.experimental = queue_new();
- queue_push_head(btd_opts.experimental, strdup("*"));
+ if (!btd_opts.kernel)
+ btd_opts.kernel = queue_new();
+ queue_push_head(btd_opts.kernel, strdup("*"));
}

return TRUE;
@@ -1163,9 +1172,11 @@ static GOptionEntry options[] = {
"Specify an explicit path to the config file", "FILE"},
{ "compat", 'C', 0, G_OPTION_ARG_NONE, &option_compat,
"Provide deprecated command line interfaces" },
- { "experimental", 'E', G_OPTION_FLAG_OPTIONAL_ARG,
- G_OPTION_ARG_CALLBACK, parse_experimental,
- "Enable experimental features/interfaces" },
+ { "experimental", 'E', 0, G_OPTION_ARG_NONE, &btd_opts.experimental,
+ "Enable experimental D-Bus interfaces" },
+ { "kernel", 'K', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK,
+ parse_kernel_experimental,
+ "Enable kernel experimental features" },
{ "nodetach", 'n', G_OPTION_FLAG_REVERSE,
G_OPTION_ARG_NONE, &option_detach,
"Run with logging in foreground" },
@@ -1289,8 +1300,8 @@ int main(int argc, char *argv[])
if (btd_opts.mode != BT_MODE_LE)
stop_sdp_server();

- if (btd_opts.experimental)
- queue_destroy(btd_opts.experimental, free);
+ if (btd_opts.kernel)
+ queue_destroy(btd_opts.kernel, free);

if (main_conf)
g_key_file_free(main_conf);
diff --git a/src/main.conf b/src/main.conf
index 91b98b8c4..3816cf362 100644
--- a/src/main.conf
+++ b/src/main.conf
@@ -111,7 +111,11 @@
# profile is connected. Defaults to true.
#RefreshDiscovery = true

-# Enables experimental features and interfaces, alternatively a list of UUIDs
+# Enables D-Bus experimental interfaces
+# Possible values: true or false
+#Experimental = false
+
+# Enables kernel experimental features, alternatively a list of UUIDs
# can be given.
# Possible values: true,false,<UUID List>
# Possible UUIDS:
@@ -121,7 +125,7 @@
# 330859bc-7506-492d-9370-9a6f0614037f (BlueZ Experimental Bluetooth Quality Report)
# a6695ace-ee7f-4fb9-881a-5fac66c629af (BlueZ Experimental Offload Codecs)
# Defaults to false.
-#Experimental = false
+#KernelExperimental = false

# The duration to avoid retrying to resolve a peer's name, if the previous
# try failed.
--
2.35.3


2022-06-14 22:03:18

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH BlueZ 2/2] bluetoothd.rst: Document -K/--kernel option

From: Luiz Augusto von Dentz <[email protected]>

This documents -K/--kernel experimental features options.
---
src/bluetoothd.rst.in | 4 ++++
1 file changed, 4 insertions(+)

diff --git a/src/bluetoothd.rst.in b/src/bluetoothd.rst.in
index 6bce349ef..7a0fa1b24 100644
--- a/src/bluetoothd.rst.in
+++ b/src/bluetoothd.rst.in
@@ -67,6 +67,10 @@ OPTIONS
-E, --experimental Enable experimental interfaces. Those interfaces are not
guaranteed to be compatible or present in future releases.

+-K, --kernel=<uuid1>,<uuid2>,...
+ Enable Kernel experimental features. Kernel experimental features are
+ considered unstable and may be removed from future kernel releases.
+
FILES
=====

--
2.35.3

2022-06-15 00:05:23

by bluez.test.bot

[permalink] [raw]
Subject: RE: [BlueZ,1/2] main.conf: Split Kernel Experimental UUIDs from Experimental

This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=650352

---Test result---

Test Summary:
CheckPatch PASS 2.32 seconds
GitLint PASS 1.58 seconds
Prep - Setup ELL PASS 41.64 seconds
Build - Prep PASS 0.59 seconds
Build - Configure PASS 8.10 seconds
Build - Make PASS 1198.21 seconds
Make Check PASS 11.70 seconds
Make Check w/Valgrind PASS 441.76 seconds
Make Distcheck PASS 228.39 seconds
Build w/ext ELL - Configure PASS 8.13 seconds
Build w/ext ELL - Make PASS 1183.39 seconds
Incremental Build with patchesPASS 2414.49 seconds



---
Regards,
Linux Bluetooth

2022-06-16 19:42:03

by patchwork-bot+bluetooth

[permalink] [raw]
Subject: Re: [PATCH BlueZ 1/2] main.conf: Split Kernel Experimental UUIDs from Experimental

Hello:

This series was applied to bluetooth/bluez.git (master)
by Luiz Augusto von Dentz <[email protected]>:

On Tue, 14 Jun 2022 14:56:08 -0700 you wrote:
> From: Luiz Augusto von Dentz <[email protected]>
>
> This splits kernel experimental UUIDs from D-Bus Experimental interface
> so they can be controlled indenpendetly.
> ---
> src/adapter.c | 28 ++++++++++++++++---------
> src/btd.h | 5 +++--
> src/main.c | 57 ++++++++++++++++++++++++++++++---------------------
> src/main.conf | 8 ++++++--
> 4 files changed, 61 insertions(+), 37 deletions(-)

Here is the summary with links:
- [BlueZ,1/2] main.conf: Split Kernel Experimental UUIDs from Experimental
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=a5382ba2f09c
- [BlueZ,2/2] bluetoothd.rst: Document -K/--kernel option
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=afc8c8f56fa2

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html