1*1872d633SMatthias Ringwald #include <stdint.h>
2*1872d633SMatthias Ringwald #include <stddef.h>
3*1872d633SMatthias Ringwald
4*1872d633SMatthias Ringwald #include "classic/avrcp.h"
5*1872d633SMatthias Ringwald #include "classic/avrcp_controller.h"
6*1872d633SMatthias Ringwald #include "classic/avrcp_target.h"
7*1872d633SMatthias Ringwald #include "btstack_run_loop_posix.h"
8*1872d633SMatthias Ringwald #include "btstack_memory.h"
9*1872d633SMatthias Ringwald
10*1872d633SMatthias Ringwald static void (*packet_handler)(uint8_t packet_type, uint8_t *packet, uint16_t size);
11*1872d633SMatthias Ringwald
hci_transport_fuzz_set_baudrate(uint32_t baudrate)12*1872d633SMatthias Ringwald static int hci_transport_fuzz_set_baudrate(uint32_t baudrate){
13*1872d633SMatthias Ringwald return 0;
14*1872d633SMatthias Ringwald }
15*1872d633SMatthias Ringwald
hci_transport_fuzz_can_send_now(uint8_t packet_type)16*1872d633SMatthias Ringwald static int hci_transport_fuzz_can_send_now(uint8_t packet_type){
17*1872d633SMatthias Ringwald return 1;
18*1872d633SMatthias Ringwald }
19*1872d633SMatthias Ringwald
hci_transport_fuzz_send_packet(uint8_t packet_type,uint8_t * packet,int size)20*1872d633SMatthias Ringwald static int hci_transport_fuzz_send_packet(uint8_t packet_type, uint8_t * packet, int size){
21*1872d633SMatthias Ringwald return 0;
22*1872d633SMatthias Ringwald }
23*1872d633SMatthias Ringwald
hci_transport_fuzz_init(const void * transport_config)24*1872d633SMatthias Ringwald static void hci_transport_fuzz_init(const void * transport_config){
25*1872d633SMatthias Ringwald }
26*1872d633SMatthias Ringwald
hci_transport_fuzz_open(void)27*1872d633SMatthias Ringwald static int hci_transport_fuzz_open(void){
28*1872d633SMatthias Ringwald return 0;
29*1872d633SMatthias Ringwald }
30*1872d633SMatthias Ringwald
hci_transport_fuzz_close(void)31*1872d633SMatthias Ringwald static int hci_transport_fuzz_close(void){
32*1872d633SMatthias Ringwald return 0;
33*1872d633SMatthias Ringwald }
34*1872d633SMatthias Ringwald
hci_transport_fuzz_register_packet_handler(void (* handler)(uint8_t packet_type,uint8_t * packet,uint16_t size))35*1872d633SMatthias Ringwald static void hci_transport_fuzz_register_packet_handler(void (*handler)(uint8_t packet_type, uint8_t *packet, uint16_t size)){
36*1872d633SMatthias Ringwald packet_handler = handler;
37*1872d633SMatthias Ringwald }
38*1872d633SMatthias Ringwald
39*1872d633SMatthias Ringwald static const hci_transport_t hci_transport_fuzz = {
40*1872d633SMatthias Ringwald /* const char * name; */ "FUZZ",
41*1872d633SMatthias Ringwald /* void (*init) (const void *transport_config); */ &hci_transport_fuzz_init,
42*1872d633SMatthias Ringwald /* int (*open)(void); */ &hci_transport_fuzz_open,
43*1872d633SMatthias Ringwald /* int (*close)(void); */ &hci_transport_fuzz_close,
44*1872d633SMatthias Ringwald /* void (*register_packet_handler)(void (*handler)(...); */ &hci_transport_fuzz_register_packet_handler,
45*1872d633SMatthias Ringwald /* int (*can_send_packet_now)(uint8_t packet_type); */ &hci_transport_fuzz_can_send_now,
46*1872d633SMatthias Ringwald /* int (*send_packet)(...); */ &hci_transport_fuzz_send_packet,
47*1872d633SMatthias Ringwald /* int (*set_baudrate)(uint32_t baudrate); */ &hci_transport_fuzz_set_baudrate,
48*1872d633SMatthias Ringwald /* void (*reset_link)(void); */ NULL,
49*1872d633SMatthias Ringwald /* void (*set_sco_config)(uint16_t voice_setting, int num_connections); */ NULL,
50*1872d633SMatthias Ringwald };
51*1872d633SMatthias Ringwald
avrcp_client_packet_handler(uint8_t packet_type,uint16_t handle,uint8_t * packet,uint16_t size)52*1872d633SMatthias Ringwald static void avrcp_client_packet_handler(uint8_t packet_type, uint16_t handle, uint8_t *packet, uint16_t size){
53*1872d633SMatthias Ringwald }
54*1872d633SMatthias Ringwald
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)55*1872d633SMatthias Ringwald int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
56*1872d633SMatthias Ringwald const hci_con_handle_t ble_handle = 0x0005;
57*1872d633SMatthias Ringwald
58*1872d633SMatthias Ringwald static bool avrcp_initialized = false;
59*1872d633SMatthias Ringwald if (!avrcp_initialized){
60*1872d633SMatthias Ringwald avrcp_initialized = true;
61*1872d633SMatthias Ringwald btstack_memory_init();
62*1872d633SMatthias Ringwald btstack_run_loop_init(btstack_run_loop_posix_get_instance());
63*1872d633SMatthias Ringwald hci_init(&hci_transport_fuzz, NULL);
64*1872d633SMatthias Ringwald avrcp_init();
65*1872d633SMatthias Ringwald avrcp_controller_init();
66*1872d633SMatthias Ringwald avrcp_target_init();
67*1872d633SMatthias Ringwald avrcp_init_fuzz();
68*1872d633SMatthias Ringwald avrcp_controller_register_packet_handler(&avrcp_client_packet_handler);
69*1872d633SMatthias Ringwald avrcp_target_register_packet_handler(&avrcp_client_packet_handler);
70*1872d633SMatthias Ringwald }
71*1872d633SMatthias Ringwald avrcp_packet_handler_fuzz((uint8_t*)data, size);
72*1872d633SMatthias Ringwald return 0;
73*1872d633SMatthias Ringwald }
74