summaryrefslogtreecommitdiff
path: root/mesh/main.c
diff options
context:
space:
mode:
authorBrian Gix <brian.gix@intel.com>2022-09-22 15:31:02 -0700
committerBrian Gix <brian.gix@intel.com>2022-09-26 13:14:47 -0700
commit9966cb8b6999a5f54fc13acbd7e1526512a84342 (patch)
tree340ca4b754716a30e8fb29a07423e31c8f704864 /mesh/main.c
parent491be481a91c39d31f7908da8a2beea60237646e (diff)
downloadbluez-9966cb8b6999a5f54fc13acbd7e1526512a84342.tar.gz
mesh: Add new kernel MGMT based IO transport
1. Re-structures MGMT handling such that it is used to detect kernel support of the mesh MGMT opcodes and events before selecting between using MGMT or the legacy raw HCI socket method. 2. Re-structures main() to allow command line to prefer MGMT over HCI or visa versa, plus optionally pass an explicte controller. 3. Adds mesh-io-mgmt as a transport.
Diffstat (limited to 'mesh/main.c')
-rw-r--r--mesh/main.c39
1 files changed, 35 insertions, 4 deletions
diff --git a/mesh/main.c b/mesh/main.c
index dd99c3085..619b17d88 100644
--- a/mesh/main.c
+++ b/mesh/main.c
@@ -123,6 +123,12 @@ static void disconnect_callback(void *user_data)
l_main_quit();
}
+static void kill_to(struct l_timeout *timeout, void *user_data)
+{
+ l_timeout_remove(timeout);
+ l_main_quit();
+}
+
static void signal_handler(uint32_t signo, void *user_data)
{
static bool terminated;
@@ -131,13 +137,38 @@ static void signal_handler(uint32_t signo, void *user_data)
return;
l_info("Terminating");
- l_main_quit();
+ mesh_cleanup(true);
+ l_timeout_create(1, kill_to, NULL, NULL);
terminated = true;
}
static bool parse_io(const char *optarg, enum mesh_io_type *type, void **opts)
{
- if (strstr(optarg, "generic") == optarg) {
+ if (strstr(optarg, "auto") == optarg) {
+ int *index = l_new(int, 1);
+
+ *type = MESH_IO_TYPE_AUTO;
+ *opts = index;
+
+ optarg += strlen("auto");
+ if (!*optarg) {
+ *index = MGMT_INDEX_NONE;
+ return true;
+ }
+
+ if (*optarg != ':')
+ return false;
+
+ optarg++;
+
+ if (sscanf(optarg, "hci%d", index) == 1)
+ return true;
+
+ if (sscanf(optarg, "%d", index) == 1)
+ return true;
+
+ return false;
+ } else if (strstr(optarg, "generic") == optarg) {
int *index = l_new(int, 1);
*type = MESH_IO_TYPE_GENERIC;
@@ -251,7 +282,7 @@ int main(int argc, char *argv[])
}
if (!io)
- io = l_strdup_printf("generic");
+ io = l_strdup_printf("auto");
if (!parse_io(io, &io_type, &io_opts)) {
l_error("Invalid io: %s", io);
@@ -295,7 +326,7 @@ done:
l_free(io);
l_free(io_opts);
- mesh_cleanup();
+ mesh_cleanup(false);
l_dbus_destroy(dbus);
l_main_exit();