mirror of
https://git.kernel.org/pub/scm/bluetooth/bluez.git
synced 2024-11-15 00:04:29 +08:00
mesh: Update the behavior of --io option
This aligns the behavior of command line option --io to add new "auto" value and modify the behavior of "generic" value: *auto* - Use first available controller: via MGMT interface if kernel supports it, otherwise, via raw HCI socket (i.e., default to *generic*). *generic:[hci]<index>* - Use generic HCI io on interface hci<index> The default value is now *auto*, whereas *generic* is used only if the specific HCI controller is explicitly specified.
This commit is contained in:
parent
8c452c2ec1
commit
93d0d8b2fc
@ -36,14 +36,17 @@ OPTIONS
|
||||
-i <type>, --io <type>
|
||||
Specifies I/O interface type:
|
||||
|
||||
*hci<index>* - Use generic HCI io on interface hci<index>,
|
||||
or, if no idex is specified, the first available one.
|
||||
*auto* - Use first available controller: via MGMT interface
|
||||
if kernel supports it, otherwise, via raw HCI socket.
|
||||
|
||||
*generic:[hci]<index>* - Use generic HCI io on interface
|
||||
hci<index>.
|
||||
|
||||
*unit:<fd_path>*- Specifies open file descriptor for
|
||||
daemon testing.
|
||||
|
||||
By default, if no type is specified, uses generic I/O
|
||||
on the first available HCI interface.
|
||||
By default, if no type is specified, uses auto I/O
|
||||
on the first available controller.
|
||||
|
||||
-c <file>, --config <file>
|
||||
Specifies an explicit config file path instead of relying on the
|
||||
|
40
mesh/main.c
40
mesh/main.c
@ -48,6 +48,12 @@ static const struct option main_options[] = {
|
||||
{ }
|
||||
};
|
||||
|
||||
static const char *io_usage =
|
||||
"\t(auto | generic:[hci]<index> | unit:<fd_path>)\n"
|
||||
"\t\tauto - Use first available controller (MGMT or raw HCI)\n"
|
||||
"\t\tgeneric - Use raw HCI io on interface hci<index>\n"
|
||||
"\t\tunit - Use test IO (for automatic testing only)\n";
|
||||
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr,
|
||||
@ -55,18 +61,14 @@ static void usage(void)
|
||||
"\tbluetooth-meshd [options]\n");
|
||||
fprintf(stderr,
|
||||
"Options:\n"
|
||||
"\t--io <io> Use specified io (default: generic)\n"
|
||||
"\t--io <io> Use specified io (default: auto)\n"
|
||||
"\t--config Daemon configuration directory\n"
|
||||
"\t--storage Mesh node(s) configuration directory\n"
|
||||
"\t--nodetach Run in foreground\n"
|
||||
"\t--debug Enable debug output\n"
|
||||
"\t--dbus-debug Enable D-Bus debugging\n"
|
||||
"\t--help Show %s information\n", __func__);
|
||||
fprintf(stderr,
|
||||
"io:\n"
|
||||
"\t([hci]<index> | generic[:[hci]<index>] | unit:<fd_path>)\n"
|
||||
"\t\tUse generic HCI io on interface hci<index>, or the first\n"
|
||||
"\t\tavailable one\n");
|
||||
fprintf(stderr, "\n\t io: %s", io_usage);
|
||||
}
|
||||
|
||||
static void do_debug(const char *str, void *user_data)
|
||||
@ -157,21 +159,8 @@ static bool parse_io(const char *optarg, enum mesh_io_type *type, void **opts)
|
||||
*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;
|
||||
*index = MGMT_INDEX_NONE;
|
||||
return true;
|
||||
|
||||
return false;
|
||||
} else if (strstr(optarg, "generic") == optarg) {
|
||||
@ -181,12 +170,7 @@ static bool parse_io(const char *optarg, enum mesh_io_type *type, void **opts)
|
||||
*opts = index;
|
||||
|
||||
optarg += strlen("generic");
|
||||
if (!*optarg) {
|
||||
*index = MGMT_INDEX_NONE;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (*optarg != ':')
|
||||
if (!*optarg || *optarg != ':')
|
||||
return false;
|
||||
|
||||
optarg++;
|
||||
@ -291,7 +275,7 @@ int main(int argc, char *argv[])
|
||||
io = l_strdup_printf("auto");
|
||||
|
||||
if (!parse_io(io, &io_type, &io_opts)) {
|
||||
l_error("Invalid io: %s", io);
|
||||
l_error("Invalid io: %s\n%s", io, io_usage);
|
||||
status = EXIT_FAILURE;
|
||||
goto done;
|
||||
}
|
||||
|
@ -380,6 +380,9 @@ static void hci_init(void *user_data)
|
||||
if (io->pvt->hci)
|
||||
bt_hci_unref(io->pvt->hci);
|
||||
|
||||
/* Clear controller HCI list to suppress mgmt interface warnings */
|
||||
mesh_mgmt_clear();
|
||||
|
||||
io->pvt->hci = bt_hci_new_user_channel(io->index);
|
||||
if (!io->pvt->hci) {
|
||||
l_error("Failed to start mesh io (hci %u): %s", io->index,
|
||||
|
@ -72,12 +72,20 @@ static void ctl_alert(int index, bool up, bool pwr, bool mesh, void *user_data)
|
||||
enum mesh_io_type type = L_PTR_TO_UINT(user_data);
|
||||
const struct mesh_io_api *api = NULL;
|
||||
|
||||
l_warn("up:%d pwr: %d mesh: %d", up, pwr, mesh);
|
||||
l_warn("index %u up:%d pwr: %d mesh: %d", index, up, pwr, mesh);
|
||||
|
||||
/* If specific IO controller requested, honor it */
|
||||
if (default_io->favored_index != MGMT_INDEX_NONE &&
|
||||
default_io->favored_index != index)
|
||||
return;
|
||||
if (default_io->favored_index != MGMT_INDEX_NONE) {
|
||||
if (default_io->favored_index != index)
|
||||
return;
|
||||
|
||||
if (!up | pwr) {
|
||||
l_warn("HCI%u failed to start generic IO %s",
|
||||
index, pwr ? ": already powered on" : "");
|
||||
if (default_io->ready)
|
||||
default_io->ready(default_io->user_data, false);
|
||||
}
|
||||
}
|
||||
|
||||
if (!up && default_io->index == index) {
|
||||
/* Our controller has disappeared */
|
||||
@ -104,7 +112,6 @@ static void ctl_alert(int index, bool up, bool pwr, bool mesh, void *user_data)
|
||||
default_io->index = index;
|
||||
default_io->api = api;
|
||||
api->init(default_io, &index, default_io->user_data);
|
||||
|
||||
l_queue_foreach(default_io->rx_regs, refresh_rx, default_io);
|
||||
}
|
||||
}
|
||||
|
@ -271,3 +271,8 @@ bool mesh_mgmt_unregister(unsigned int id)
|
||||
{
|
||||
return mgmt_unregister(mgmt_mesh, id);
|
||||
}
|
||||
|
||||
void mesh_mgmt_clear(void)
|
||||
{
|
||||
l_queue_clear(ctl_list, l_free);
|
||||
}
|
||||
|
@ -22,3 +22,4 @@ unsigned int mesh_mgmt_register(uint16_t event, uint16_t index,
|
||||
void *user_data, mgmt_destroy_func_t destroy);
|
||||
bool mesh_mgmt_unregister(unsigned int id);
|
||||
void mesh_mgmt_destroy(void);
|
||||
void mesh_mgmt_clear(void);
|
||||
|
Loading…
Reference in New Issue
Block a user