emulator: Add support for vendor commands
Luiz Augusto von Dentz
maintainerRFC 1/1 emulator: Add support for vendor commands
From: Luiz Augusto von Dentz <[email protected]>
This adds support for vendor commands reserving a single opcode (0xfc10) so it can be extended using subcommands, similar to how MSFT works.
The first subcommand (0x00) enables the emulator to generate arbitrary events using the commands parameters:
Quoted 1 line
tools/hcitoolcmd 3f 10 00 22 24 d0 d0 d0 d0 d0 d0 ff ff
< HCI Command: Vendor (0x3f|0x0010) plen 11
00 22 24 d0 d0 d0 d0 d0 d0 ff ff ."$........
Bluetooth: hci0: Malformed HCI Event: 0x22
Quoted 1 line
HCI Event: Inquiry Result with R.. (
0x22) plen 9
Num responses: 36
Page scan repetition mode: Reserved (0xff)
Page period mode: Reserved (0xff)
Class: 0xffffd0
Major class: Uncategorized, specific device code not specified
Minor class: 0x34
Limited Discoverable Mode
invalid service class
Clock offset: 0x6368
RSSI: 105 dBm (0x69)Quoted 1 line
HCI Event: Command Complete (
0x0e) plen 4
Vendor (0x3f|0x0010) ncmd 1
Status: Success (0x00)
---
emulator/btdev.c | 68 ++++++++++++++++++++++++++++++++++++++++++------
emulator/btdev.h | 1 +
emulator/main.c | 1 +
emulator/vhci.c | 5 ++++
emulator/vhci.h | 1 +
5 files changed, 68 insertions(+), 8 deletions(-)emulator/btdev.c +60 -8
@@ -34,6 +34,7 @@#include "src/shared/queue.h" #include "monitor/bt.h" #include "monitor/msft.h" +#include "monitor/emulator.h" #include "btdev.h" #define AL_SIZE 16
@@ -142,6 +143,8 @@ struct btdev {const struct btdev_cmd *cmds;uint16_t msft_opcode;const struct btdev_cmd *msft_cmds; +uint16_t emu_opcode; +const struct btdev_cmd *emu_cmds;bool aosp_capable;uint16_t default_link_policy;
@@ -6586,12 +6589,11 @@ static const struct btdev_cmd *run_cmd(struct btdev *btdev,return NULL ; } -static const struct btdev_cmd *msft_cmd (struct btdev *btdev,const void *data, -uint8_t len) +static const struct btdev_cmd *vnd_cmd (struct btdev *btdev,uint8_t op, +const struct btdev_cmd *cmd, +const void *data,uint8_t len) { -const struct btdev_cmd *cmd; - -for (cmd = btdev->msft_cmds; cmd->func; cmd++) { +for (; cmd && cmd->func; cmd++) {if (cmd->opcode != ((uint8_t *)data)[0 ])continue ;
@@ -6599,10 +6601,10 @@ static const struct btdev_cmd *msft_cmd(struct btdev *btdev, const void *data, }util_debug (btdev->debug_callback, btdev->debug_data, -"Unsupported MSFT subcommand 0x%2.2x\n" , +"Unsupported Vendor subcommand 0x%2.2x\n" , ((uint8_t *)data)[0 ]); -cmd_status (btdev,BT_HCI_ERR_UNKNOWN_COMMAND , btdev->msft_opcode); +cmd_status (btdev,BT_HCI_ERR_UNKNOWN_COMMAND , op);return NULL ; }
@@ -6612,8 +6614,11 @@ static const struct btdev_cmd *default_cmd(struct btdev *btdev, uint16_t opcode, {const struct btdev_cmd *cmd; +if (btdev->emu_opcode == opcode) +return vnd_cmd (btdev, opcode, btdev->emu_cmds, data, len); +if (btdev->msft_opcode == opcode) -return msft_cmd (btdev, data, len); +return vnd_cmd (btdev, opcode, btdev->msft_cmds, data, len);for (cmd = btdev->cmds; cmd->func; cmd++) {if (cmd->opcode != opcode)
@@ -7049,3 +7054,50 @@ int btdev_set_aosp_capable(struct btdev *btdev, bool enable)return 0 ; } + +static int cmd_emu_test_event (struct btdev *dev,const void *data,uint8_t len) +{ +const struct emu_cmd_test_event *cmd = data; +uint8_t status =BT_HCI_ERR_SUCCESS ; + +if (len <sizeof (*cmd)) { + status =BT_HCI_ERR_INVALID_PARAMETERS ; + goto done; + } + +send_event (dev, cmd->evt, cmd->data, len -sizeof (*cmd)); + +done: +cmd_complete (dev, dev->emu_opcode, &status,sizeof (status)); + +return 0 ; +} + +#define CMD_EMU \ + CMD(EMU_SUBCMD_TEST_EVENT, cmd_emu_test_event, NULL) + +static const struct btdev_cmd cmd_emu[] = { +CMD_EMU , + {} +}; + +int btdev_set_emu_opcode (struct btdev *btdev,uint16_t opcode) +{ +if (!btdev) +return -EINVAL ; + +switch (btdev->type) { +case BTDEV_TYPE_BREDRLE : +case BTDEV_TYPE_BREDRLE50 : +case BTDEV_TYPE_BREDRLE52 : + btdev->emu_opcode = opcode; + btdev->emu_cmds = cmd_emu; +return 0 ; +case BTDEV_TYPE_BREDR : +case BTDEV_TYPE_LE : +case BTDEV_TYPE_AMP : +case BTDEV_TYPE_BREDR20 : +default : +return -ENOTSUP ; + } +}
emulator/btdev.h +1 -0
@@ -102,3 +102,4 @@ bool btdev_del_hook(struct btdev *btdev, enum btdev_hook_type type,int btdev_set_msft_opcode (struct btdev *btdev,uint16_t opcode);int btdev_set_aosp_capable (struct btdev *btdev,bool enable); +int btdev_set_emu_opcode (struct btdev *btdev,uint16_t opcode);
emulator/main.c +1 -0
@@ -193,6 +193,7 @@ int main(int argc, char *argv[])if (debug_enabled)vhci_set_debug (vhci, vhci_debug,UINT_TO_PTR (i),NULL ); +vhci_set_emu_opcode (vhci,0xfc10 );vhci_set_msft_opcode (vhci,0xfc1e ); }
emulator/vhci.c +5 -0
@@ -252,3 +252,8 @@ int vhci_set_aosp_capable(struct vhci *vhci, bool enable)return vhci_debugfs_write (vhci,"aosp_capable" , &val,sizeof (val)); } + +int vhci_set_emu_opcode (struct vhci *vhci,uint16_t opcode) +{ +return btdev_set_emu_opcode (vhci->btdev, opcode); +}
emulator/vhci.h +1 -0
@@ -27,3 +27,4 @@ int vhci_set_force_suspend(struct vhci *vhci, bool enable);int vhci_set_force_wakeup (struct vhci *vhci,bool enable);int vhci_set_msft_opcode (struct vhci *vhci,uint16_t opcode);int vhci_set_aosp_capable (struct vhci *vhci,bool enable); +int vhci_set_emu_opcode (struct vhci *vhci,uint16_t opcode);
Signature · 1 line
2.33.1
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=602722
---Test result---
Test Summary:
CheckPatch PASS 1.45 seconds GitLint FAIL 0.90 seconds Prep - Setup ELL PASS 42.06 seconds Build - Prep PASS 0.57 seconds Build - Configure PASS 8.51 seconds Build - Make FAIL 187.79 seconds Make Check FAIL 0.66 seconds Make Distcheck FAIL 126.19 seconds Build w/ext ELL - Configure PASS 8.29 seconds Build w/ext ELL - Make FAIL 160.94 seconds Incremental Build with patchesPASS 0.00 seconds
Details
##############################
Test: GitLint - FAIL
Desc: Run gitlint with rule in .gitlint Output:
[RFC,BlueZ] emulator: Add support for vendor commands
14: B3 Line contains hard tab characters (\t): " ."$........"
##############################
Test: Build - Make - FAIL
Desc: Build the BlueZ source tree
Output:emulator/btdev.c:37:10: fatal error: monitor/emulator.h: No such file or directory
37 | #include "monitor/emulator.h"
| ^~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[1]: *** [Makefile:7272: emulator/btdev.o] Error 1
make: *** [Makefile:4302: all] Error 2
##############################
Test: Make Check - FAIL
Desc: Run 'make check'
Output:emulator/btdev.c:37:10: fatal error: monitor/emulator.h: No such file or directory
37 | #include "monitor/emulator.h"
| ^~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[1]: *** [Makefile:7272: emulator/btdev.o] Error 1
make: *** [Makefile:11306: check] Error 2
##############################
Test: Make Distcheck - FAIL
Desc: Run distcheck to check the distribution
Output:../../emulator/btdev.c:37:10: fatal error: monitor/emulator.h: No such file or directory
37 | #include "monitor/emulator.h"
| ^~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[2]: *** [Makefile:8003: emulator/android_android_tester-btdev.o] Error 1 make[1]: *** [Makefile:4302: all] Error 2
make: *** [Makefile:11227: distcheck] Error 1
##############################
Test: Build w/ext ELL - Make - FAIL
Desc: Build BlueZ source with '--enable-external-ell' configuration Output:emulator/btdev.c:37:10: fatal error: monitor/emulator.h: No such file or directory
37 | #include "monitor/emulator.h"
| ^~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[1]: *** [Makefile:7272: emulator/btdev.o] Error 1
make: *** [Makefile:4302: all] Error 2
---
Regards,
Linux Bluetooth