@@ -235,8 +235,10 @@ static bool match_request_opcode_index(const void *a, const void *b)
const struct mgmt_request *request = a;
const struct opcode_index *match = b;
- return request->opcode == match->opcode &&
- request->index == match->index;
+ if (match->opcode && request->opcode != match->opcode)
+ return false;
+
+ return request->index == match->index;
}
static void request_complete(struct mgmt *mgmt, uint8_t status,
@@ -248,6 +250,18 @@ static void request_complete(struct mgmt *mgmt, uint8_t status,
request = queue_remove_if(mgmt->pending_list,
match_request_opcode_index, &match);
+ if (!request) {
+ util_debug(mgmt->debug_callback, mgmt->debug_data,
+ "Unable to find request for opcode 0x%02x",
+ opcode);
+
+ /* Attempt to remove with no opcode */
+ match.opcode = 0x0000;
+ request = queue_remove_if(mgmt->pending_list,
+ match_request_opcode_index,
+ &match);
+ }
+
if (request) {
if (request->callback)
request->callback(status, length, param,
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> If the kernel return an invalid opcode like bellow the request won't be processed leading making it unusable: @ MGMT Command: Read Advertising Features (0x003d) plen 0 {0x0001} [hci0] 14:25:11.096370 @ MGMT Event: Command Status (0x0002) plen 3 {0x0001} [hci0] 14:25:11.096373 Set Advertising (0x0029) Status: Not Supported (0x0c) In order to fix this attempts to remove the first request pending on the given index: = bluetoothd: src/advertising.c:read_adv_features_callback() Failed to read advertising features: Not Supported (0x0c) --- src/shared/mgmt.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-)