1*c3ab9523SMatthias Ringwald #include <stdint.h>
2*c3ab9523SMatthias Ringwald #include <stddef.h>
3*c3ab9523SMatthias Ringwald
4*c3ab9523SMatthias Ringwald #include "classic/avrcp.h"
5*c3ab9523SMatthias Ringwald #include "classic/avrcp_controller.h"
6*c3ab9523SMatthias Ringwald #include "classic/avrcp_target.h"
7*c3ab9523SMatthias Ringwald #include "btstack_run_loop_posix.h"
8*c3ab9523SMatthias Ringwald #include "btstack_memory.h"
9*c3ab9523SMatthias Ringwald #include "classic/a2dp_sink.h"
10*c3ab9523SMatthias Ringwald
11*c3ab9523SMatthias Ringwald static void (*packet_handler)(uint8_t packet_type, uint8_t *packet, uint16_t size);
12*c3ab9523SMatthias Ringwald
hci_transport_fuzz_set_baudrate(uint32_t baudrate)13*c3ab9523SMatthias Ringwald static int hci_transport_fuzz_set_baudrate(uint32_t baudrate){
14*c3ab9523SMatthias Ringwald return 0;
15*c3ab9523SMatthias Ringwald }
16*c3ab9523SMatthias Ringwald
hci_transport_fuzz_can_send_now(uint8_t packet_type)17*c3ab9523SMatthias Ringwald static int hci_transport_fuzz_can_send_now(uint8_t packet_type){
18*c3ab9523SMatthias Ringwald return 1;
19*c3ab9523SMatthias Ringwald }
20*c3ab9523SMatthias Ringwald
hci_transport_fuzz_send_packet(uint8_t packet_type,uint8_t * packet,int size)21*c3ab9523SMatthias Ringwald static int hci_transport_fuzz_send_packet(uint8_t packet_type, uint8_t * packet, int size){
22*c3ab9523SMatthias Ringwald return 0;
23*c3ab9523SMatthias Ringwald }
24*c3ab9523SMatthias Ringwald
hci_transport_fuzz_init(const void * transport_config)25*c3ab9523SMatthias Ringwald static void hci_transport_fuzz_init(const void * transport_config){
26*c3ab9523SMatthias Ringwald }
27*c3ab9523SMatthias Ringwald
hci_transport_fuzz_open(void)28*c3ab9523SMatthias Ringwald static int hci_transport_fuzz_open(void){
29*c3ab9523SMatthias Ringwald return 0;
30*c3ab9523SMatthias Ringwald }
31*c3ab9523SMatthias Ringwald
hci_transport_fuzz_close(void)32*c3ab9523SMatthias Ringwald static int hci_transport_fuzz_close(void){
33*c3ab9523SMatthias Ringwald return 0;
34*c3ab9523SMatthias Ringwald }
35*c3ab9523SMatthias Ringwald
hci_transport_fuzz_register_packet_handler(void (* handler)(uint8_t packet_type,uint8_t * packet,uint16_t size))36*c3ab9523SMatthias Ringwald static void hci_transport_fuzz_register_packet_handler(void (*handler)(uint8_t packet_type, uint8_t *packet, uint16_t size)){
37*c3ab9523SMatthias Ringwald packet_handler = handler;
38*c3ab9523SMatthias Ringwald }
39*c3ab9523SMatthias Ringwald
40*c3ab9523SMatthias Ringwald static const hci_transport_t hci_transport_fuzz = {
41*c3ab9523SMatthias Ringwald /* const char * name; */ "FUZZ",
42*c3ab9523SMatthias Ringwald /* void (*init) (const void *transport_config); */ &hci_transport_fuzz_init,
43*c3ab9523SMatthias Ringwald /* int (*open)(void); */ &hci_transport_fuzz_open,
44*c3ab9523SMatthias Ringwald /* int (*close)(void); */ &hci_transport_fuzz_close,
45*c3ab9523SMatthias Ringwald /* void (*register_packet_handler)(void (*handler)(...); */ &hci_transport_fuzz_register_packet_handler,
46*c3ab9523SMatthias Ringwald /* int (*can_send_packet_now)(uint8_t packet_type); */ &hci_transport_fuzz_can_send_now,
47*c3ab9523SMatthias Ringwald /* int (*send_packet)(...); */ &hci_transport_fuzz_send_packet,
48*c3ab9523SMatthias Ringwald /* int (*set_baudrate)(uint32_t baudrate); */ &hci_transport_fuzz_set_baudrate,
49*c3ab9523SMatthias Ringwald /* void (*reset_link)(void); */ NULL,
50*c3ab9523SMatthias Ringwald /* void (*set_sco_config)(uint16_t voice_setting, int num_connections); */ NULL,
51*c3ab9523SMatthias Ringwald };
52*c3ab9523SMatthias Ringwald
avdtp_client_packet_handler(uint8_t packet_type,uint16_t handle,uint8_t * packet,uint16_t size)53*c3ab9523SMatthias Ringwald static void avdtp_client_packet_handler(uint8_t packet_type, uint16_t handle, uint8_t *packet, uint16_t size){
54*c3ab9523SMatthias Ringwald }
55*c3ab9523SMatthias Ringwald
56*c3ab9523SMatthias Ringwald static uint8_t a2dp_local_seid;
57*c3ab9523SMatthias Ringwald static uint8_t media_sbc_codec_configuration[4];
58*c3ab9523SMatthias Ringwald static uint8_t media_sbc_codec_capabilities[] = {
59*c3ab9523SMatthias Ringwald 0xFF,//(AVDTP_SBC_44100 << 4) | AVDTP_SBC_STEREO,
60*c3ab9523SMatthias Ringwald 0xFF,//(AVDTP_SBC_BLOCK_LENGTH_16 << 4) | (AVDTP_SBC_SUBBANDS_8 << 2) | AVDTP_SBC_ALLOCATION_METHOD_LOUDNESS,
61*c3ab9523SMatthias Ringwald 2, 53
62*c3ab9523SMatthias Ringwald };
63*c3ab9523SMatthias Ringwald
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)64*c3ab9523SMatthias Ringwald int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
65*c3ab9523SMatthias Ringwald const hci_con_handle_t ble_handle = 0x0005;
66*c3ab9523SMatthias Ringwald const uint16_t l2cap_cid = 0x41;
67*c3ab9523SMatthias Ringwald
68*c3ab9523SMatthias Ringwald static bool avrcp_initialized = false;
69*c3ab9523SMatthias Ringwald if (!avrcp_initialized){
70*c3ab9523SMatthias Ringwald avrcp_initialized = true;
71*c3ab9523SMatthias Ringwald btstack_memory_init();
72*c3ab9523SMatthias Ringwald btstack_run_loop_init(btstack_run_loop_posix_get_instance());
73*c3ab9523SMatthias Ringwald hci_init(&hci_transport_fuzz, NULL);
74*c3ab9523SMatthias Ringwald l2cap_init();
75*c3ab9523SMatthias Ringwald avdtp_init();
76*c3ab9523SMatthias Ringwald avdtp_sink_init();
77*c3ab9523SMatthias Ringwald avdtp_source_init();
78*c3ab9523SMatthias Ringwald avdtp_sink_register_packet_handler(&avdtp_client_packet_handler);
79*c3ab9523SMatthias Ringwald avdtp_source_register_packet_handler(&avdtp_client_packet_handler);
80*c3ab9523SMatthias Ringwald avdtp_stream_endpoint_t * local_stream_endpoint = a2dp_sink_create_stream_endpoint(AVDTP_AUDIO,
81*c3ab9523SMatthias Ringwald AVDTP_CODEC_SBC, media_sbc_codec_capabilities, sizeof(media_sbc_codec_capabilities),
82*c3ab9523SMatthias Ringwald media_sbc_codec_configuration, sizeof(media_sbc_codec_configuration));
83*c3ab9523SMatthias Ringwald avdtp_init_fuzz();
84*c3ab9523SMatthias Ringwald }
85*c3ab9523SMatthias Ringwald avdtp_packet_handler_fuzz((uint8_t*)data, size);
86*c3ab9523SMatthias Ringwald return 0;
87*c3ab9523SMatthias Ringwald }
88