bluetooth - 执行 hciconfig hci0 重置时出现无效的参数问题
问题描述
我在 5.0 以上的内核中观察到这个问题。并且使用启用了扩展广告的控制器。我目前已经用 bluez-5.50 进行了测试。
这个问题与“MGMT_ADV_FLAG_SEC_MASK”标志有关,这是我可以从代码中得到的。但是我不明白何时以及如何修改这个标志。
配置:内核 5.4.24(任何 5.0+ 内核都出现问题),bluez 5.50 我正在执行以下步骤: 1. hciattach BLE 扩展 ADV 启用控制器。2. hciconfig hci0 重置。
我收到扩展扫描 rsp 命令的以下错误(在 hciconfig hci0 重置序列期间):
LE Set Extended Scan Response Data (0x08|0x0038) ncmd 1
Status: Invalid HCI Command Parameters (0x12)
这是因为下面用 core_v5.2 编写的:“如果广告集是不可扫描的并且主机使用此命令而不是丢弃现有数据,则控制器应返回错误代码 Invalid HCI Command Parameters (0x12) . 如果广告集使用可扫描的传统广告 PDU 并且 Operation 不是 0x03 或 Scan_Response_Data_Length 参数超过 31 个八位字节,则控制器应返回错误代码 Invalid HCI Command Parameters (0x12)。如果 Operation 不是 0x03 并且 Scan_Response_Data_Length 为零,则控制器应返回错误代码 Invalid HCI Command Parameters (0x12) "
因此,在扩展扫描 rsp 集之前的扩展 HCI 命令扩展广告集命令中:
*LE Set Extended Advertising Parameters (0x08|0x0036) plen 25
Handle: 0x00
Properties: 0x0010
Use legacy advertising PDUs: ADV_NONCONN_IND
由于在内核代码中检查了 MGMT_ADV_FLAG_SEC_MASK,因此设置了这个遗留广告。我想知道控制器 LE 功能中的哪个参数或其他需要正确设置的参数。
在我的蓝牙控制器中,不支持多 ADV,支持扩展 ADV。
解决方案
得到了问题,它与内核 5.4.24 的扩展广告有关。在内核版本 5.7.7 中。我在文件 hci_request.c,函数 get_adv_instance_scan_rsp_len 中发现了这种差异,目前(内核 5.4.24)代码是:
static u8 get_adv_instance_scan_rsp_len(struct hci_dev *hdev, u8 instance)
{
struct adv_info *adv_instance;
/* Ignore instance 0 */
if (instance == 0x00)
return 0;
在 5.7.7 中改为:
static u8 get_adv_instance_scan_rsp_len(struct hci_dev *hdev, u8 instance)
{
struct adv_info *adv_instance;
/* Instance 0x00 always set local name */
if (instance == 0x00)
return 1;
这应该改变的是,它应该满足以下条件,而目前没有。所以基本上应该设置扫描 rsp 数据 cmd 不会失败的可扫描标志:
} else if (get_adv_instance_scan_rsp_len(hdev, instance)) {
if (secondary_adv)
cp.evt_properties = cpu_to_le16(LE_EXT_ADV_SCAN_IND);
else
cp.evt_properties = cpu_to_le16(LE_LEGACY_ADV_SCAN_IND);
推荐阅读
- c# - 处理游戏中的人口(统一)
- java - 如何在没有 org.jdesktop.beansbinding 的 Apache Netbeans 中实现绑定
- bash - bash:下面的序列试图做什么?
- angular - 如何使用 Greasemonkey 用我自己的 Angular 单页应用程序替换 web?
- html - 如何用破折号替换有序列表中的句点并仍然保持适当的缩进?
- ssl-certificate - javax.net.ssl.SSLHandshakeException:收到致命警报:google-client-api 的handshake_failure
- python - Python exec(script, globals()) 不显示 GUI (iPyWidgets)
- java - Jcov 代码覆盖实用程序导致错误 com.sun.javatest is missing
- reactjs - 从异步回调函数调用 React setState() 函数
- gitlab - 设置 gitlab-runner 在 git push 后自动运行?