hci.c (7aa35f6a68be293b189765703d55a2983fa71909) hci.c (2a6c0f8203a6e80b026f1d5508f53de0dbb70501)
1/*
2 * Copyright (C) 2014 BlueKitchen GmbH
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright

--- 219 unchanged lines hidden (view full) ---

228static void hci_iso_stream_finalize(hci_iso_stream_t * iso_stream);
229static hci_iso_stream_t * hci_iso_stream_for_cis_handle(hci_con_handle_t cis_handle);
230static void hci_iso_stream_requested_finalize(void);
231static void hci_iso_stream_requested_confirm(void);
232static void hci_iso_packet_handler(uint8_t * packet, uint16_t size);
233static le_audio_big_t * hci_big_for_handle(uint8_t big_handle);
234static void hci_emit_big_created(const le_audio_big_t * big, uint8_t status);
235static void hci_emit_big_terminated(const le_audio_big_t * big);
1/*
2 * Copyright (C) 2014 BlueKitchen GmbH
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright

--- 219 unchanged lines hidden (view full) ---

228static void hci_iso_stream_finalize(hci_iso_stream_t * iso_stream);
229static hci_iso_stream_t * hci_iso_stream_for_cis_handle(hci_con_handle_t cis_handle);
230static void hci_iso_stream_requested_finalize(void);
231static void hci_iso_stream_requested_confirm(void);
232static void hci_iso_packet_handler(uint8_t * packet, uint16_t size);
233static le_audio_big_t * hci_big_for_handle(uint8_t big_handle);
234static void hci_emit_big_created(const le_audio_big_t * big, uint8_t status);
235static void hci_emit_big_terminated(const le_audio_big_t * big);
236static void hci_emit_big_sync_created(const le_audio_big_sync_t * big_sync, uint8_t status);
237static void hci_emit_big_sync_stopped(const le_audio_big_sync_t * big_sync);
238static le_audio_big_sync_t * hci_big_sync_for_handle(uint8_t big_handle);
236#endif /* ENABLE_LE_ISOCHRONOUS_STREAMS */
237#endif /* ENABLE_BLE */
238
239// the STACK is here
240#ifndef HAVE_MALLOC
241static hci_stack_t hci_stack_static;
242#endif
243static hci_stack_t * hci_stack = NULL;

--- 2508 unchanged lines hidden (view full) ---

2752 big->state = LE_AUDIO_BIG_STATE_ACTIVE;
2753 hci_emit_big_created(big, ERROR_CODE_SUCCESS);
2754 } else {
2755 big->state = LE_AUDIO_BIG_STATE_SETUP_ISO_PATH;
2756 }
2757 } else {
2758 big->state = LE_AUDIO_BIG_STATE_SETUP_ISO_PATHS_FAILED;
2759 big->state_vars.status = status;
239#endif /* ENABLE_LE_ISOCHRONOUS_STREAMS */
240#endif /* ENABLE_BLE */
241
242// the STACK is here
243#ifndef HAVE_MALLOC
244static hci_stack_t hci_stack_static;
245#endif
246static hci_stack_t * hci_stack = NULL;

--- 2508 unchanged lines hidden (view full) ---

2755 big->state = LE_AUDIO_BIG_STATE_ACTIVE;
2756 hci_emit_big_created(big, ERROR_CODE_SUCCESS);
2757 } else {
2758 big->state = LE_AUDIO_BIG_STATE_SETUP_ISO_PATH;
2759 }
2760 } else {
2761 big->state = LE_AUDIO_BIG_STATE_SETUP_ISO_PATHS_FAILED;
2762 big->state_vars.status = status;
2760 break;
2761 }
2762 return;
2763 }
2764 }
2763 }
2764 return;
2765 }
2766 }
2767 btstack_linked_list_iterator_init(&it, &hci_stack->le_audio_big_syncs);
2768 while (btstack_linked_list_iterator_has_next(&it)) {
2769 le_audio_big_sync_t *big_sync = (le_audio_big_sync_t *) btstack_linked_list_iterator_next(&it);
2770 if (big_sync->state == LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH){
2771 status = packet[OFFSET_OF_DATA_IN_COMMAND_COMPLETE];
2772 if (status == ERROR_CODE_SUCCESS){
2773 big_sync->state_vars.next_bis++;
2774 if (big_sync->state_vars.next_bis == big_sync->num_bis){
2775 big_sync->state = LE_AUDIO_BIG_STATE_ACTIVE;
2776 hci_emit_big_sync_created(big_sync, ERROR_CODE_SUCCESS);
2777 } else {
2778 big_sync->state = LE_AUDIO_BIG_STATE_SETUP_ISO_PATH;
2779 }
2780 } else {
2781 big_sync->state = LE_AUDIO_BIG_STATE_SETUP_ISO_PATHS_FAILED;
2782 big_sync->state_vars.status = status;
2783 }
2784 return;
2785 }
2786 }
2765 break;
2766 }
2787 break;
2788 }
2789 case HCI_OPCODE_HCI_LE_BIG_TERMINATE_SYNC: {
2790 // lookup BIG by state
2791 btstack_linked_list_iterator_t it;
2792 btstack_linked_list_iterator_init(&it, &hci_stack->le_audio_big_syncs);
2793 while (btstack_linked_list_iterator_has_next(&it)) {
2794 le_audio_big_sync_t *big_sync = (le_audio_big_sync_t *) btstack_linked_list_iterator_next(&it);
2795 if (big_sync->state == LE_AUDIO_BIG_STATE_W4_TERMINATED){
2796 btstack_linked_list_iterator_remove(&it);
2797 switch (big_sync->state){
2798 case LE_AUDIO_BIG_STATE_W4_TERMINATED_AFTER_SETUP_FAILED:
2799 hci_emit_big_sync_created(big_sync, big_sync->state_vars.status);
2800 break;
2801 default:
2802 hci_emit_big_sync_stopped(big_sync);
2803 break;
2804 }
2805 return;
2806 }
2807 }
2808 break;
2809 }
2767#endif
2768#endif
2769 default:
2770 break;
2771 }
2772}
2773
2774static void handle_command_status_event(uint8_t * packet, uint16_t size) {

--- 287 unchanged lines hidden (view full) ---

3062#ifdef ENABLE_CLASSIC
3063 hci_link_type_t link_type;
3064 bd_addr_t addr;
3065 bd_addr_type_t addr_type;
3066#endif
3067#ifdef ENABLE_LE_ISOCHRONOUS_STREAMS
3068 hci_iso_stream_t * iso_stream;
3069 le_audio_big_t * big;
2810#endif
2811#endif
2812 default:
2813 break;
2814 }
2815}
2816
2817static void handle_command_status_event(uint8_t * packet, uint16_t size) {

--- 287 unchanged lines hidden (view full) ---

3105#ifdef ENABLE_CLASSIC
3106 hci_link_type_t link_type;
3107 bd_addr_t addr;
3108 bd_addr_type_t addr_type;
3109#endif
3110#ifdef ENABLE_LE_ISOCHRONOUS_STREAMS
3111 hci_iso_stream_t * iso_stream;
3112 le_audio_big_t * big;
3113 le_audio_big_sync_t * big_sync;
3070#endif
3071
3072 // log_info("HCI:EVENT:%02x", hci_event_packet_get_type(packet));
3073
3074 switch (hci_event_packet_get_type(packet)) {
3075
3076 case HCI_EVENT_COMMAND_COMPLETE:
3077 handle_command_complete_event(packet, size);

--- 692 unchanged lines hidden (view full) ---

3770 uint8_t status = packet[3];
3771 if (status == ERROR_CODE_SUCCESS){
3772 // store bis_con_handles and trigger iso path setup
3773 uint8_t num_bis = btstack_min(MAX_NR_BIS, packet[20]);
3774 uint8_t i;
3775 for (i=0;i<num_bis;i++){
3776 big->bis_con_handles[i] = little_endian_read_16(packet, 21 + (2 * i));
3777 }
3114#endif
3115
3116 // log_info("HCI:EVENT:%02x", hci_event_packet_get_type(packet));
3117
3118 switch (hci_event_packet_get_type(packet)) {
3119
3120 case HCI_EVENT_COMMAND_COMPLETE:
3121 handle_command_complete_event(packet, size);

--- 692 unchanged lines hidden (view full) ---

3814 uint8_t status = packet[3];
3815 if (status == ERROR_CODE_SUCCESS){
3816 // store bis_con_handles and trigger iso path setup
3817 uint8_t num_bis = btstack_min(MAX_NR_BIS, packet[20]);
3818 uint8_t i;
3819 for (i=0;i<num_bis;i++){
3820 big->bis_con_handles[i] = little_endian_read_16(packet, 21 + (2 * i));
3821 }
3778 big->state = LE_AUDIO_BIG_STATE_SETUP_ISO_PATH;
3779 big->state_vars.next_bis = 0;
3822 if (big->state == LE_AUDIO_BIG_STATE_W4_ESTABLISHED) {
3823 big->state = LE_AUDIO_BIG_STATE_SETUP_ISO_PATH;
3824 big->state_vars.next_bis = 0;
3825 }
3780 } else {
3826 } else {
3781 // create BIG failed
3827 // create BIG failed or has been stopped by us
3782 btstack_linked_list_remove(&hci_stack->le_audio_bigs, (btstack_linked_item_t *) big);
3828 btstack_linked_list_remove(&hci_stack->le_audio_bigs, (btstack_linked_item_t *) big);
3783 hci_emit_big_created(big, status);
3829 if (big->state == LE_AUDIO_BIG_STATE_W4_ESTABLISHED){
3830 hci_emit_big_created(big, status);
3831 } else {
3832 hci_emit_big_terminated(big);
3833 }
3784 }
3785 }
3786 break;
3787 case HCI_SUBEVENT_LE_TERMINATE_BIG_COMPLETE:
3788 big = hci_big_for_handle(hci_subevent_le_terminate_big_complete_get_big_handle(packet));
3789 if (big != NULL){
3790 btstack_linked_list_remove(&hci_stack->le_audio_bigs, (btstack_linked_item_t *) big);
3791 switch (big->state){
3792 case LE_AUDIO_BIG_STATE_W4_TERMINATED_AFTER_SETUP_FAILED:
3793 hci_emit_big_created(big, big->state_vars.status);
3794 break;
3795 default:
3796 hci_emit_big_terminated(big);
3797 break;
3798 }
3799 }
3800 break;
3834 }
3835 }
3836 break;
3837 case HCI_SUBEVENT_LE_TERMINATE_BIG_COMPLETE:
3838 big = hci_big_for_handle(hci_subevent_le_terminate_big_complete_get_big_handle(packet));
3839 if (big != NULL){
3840 btstack_linked_list_remove(&hci_stack->le_audio_bigs, (btstack_linked_item_t *) big);
3841 switch (big->state){
3842 case LE_AUDIO_BIG_STATE_W4_TERMINATED_AFTER_SETUP_FAILED:
3843 hci_emit_big_created(big, big->state_vars.status);
3844 break;
3845 default:
3846 hci_emit_big_terminated(big);
3847 break;
3848 }
3849 }
3850 break;
3851 case HCI_SUBEVENT_LE_BIG_SYNC_ESTABLISHED:
3852 big_sync = hci_big_sync_for_handle(packet[4]);
3853 if (big_sync != NULL){
3854 uint8_t status = packet[3];
3855 if (status == ERROR_CODE_SUCCESS){
3856 // store bis_con_handles and trigger iso path setup
3857 uint8_t num_bis = btstack_min(MAX_NR_BIS, packet[16]);
3858 uint8_t i;
3859 for (i=0;i<num_bis;i++){
3860 big_sync->bis_con_handles[i] = little_endian_read_16(packet, 17 + (2 * i));
3861 }
3862 if (big_sync->state == LE_AUDIO_BIG_STATE_W4_ESTABLISHED) {
3863 // trigger iso path setup
3864 big_sync->state = LE_AUDIO_BIG_STATE_SETUP_ISO_PATH;
3865 big_sync->state_vars.next_bis = 0;
3866 }
3867 } else {
3868 // create BIG Sync failed or has been stopped by us
3869 btstack_linked_list_remove(&hci_stack->le_audio_big_syncs, (btstack_linked_item_t *) big_sync);
3870 if (big_sync->state == LE_AUDIO_BIG_STATE_W4_ESTABLISHED) {
3871 hci_emit_big_sync_created(big_sync, status);
3872 } else {
3873 hci_emit_big_sync_stopped(big_sync);
3874 }
3875 }
3876 }
3877 break;
3878 case HCI_SUBEVENT_LE_BIG_SYNC_LOST:
3879 big_sync = hci_big_sync_for_handle(packet[4]);
3880 if (big_sync != NULL){
3881 btstack_linked_list_remove(&hci_stack->le_audio_big_syncs, (btstack_linked_item_t *) big_sync);
3882 hci_emit_big_sync_stopped(big_sync);
3883 }
3884 break;
3801#endif
3802 default:
3803 break;
3804 }
3805 break;
3806#endif
3807 case HCI_EVENT_VENDOR_SPECIFIC:
3808 // Vendor specific commands often create vendor specific event instead of num completed packets

--- 2084 unchanged lines hidden (view full) ---

5893#endif
5894
5895 return false;
5896}
5897
5898#ifdef ENABLE_LE_ISOCHRONOUS_STREAMS
5899static bool hci_run_iso_tasks(void){
5900 btstack_linked_list_iterator_t it;
3885#endif
3886 default:
3887 break;
3888 }
3889 break;
3890#endif
3891 case HCI_EVENT_VENDOR_SPECIFIC:
3892 // Vendor specific commands often create vendor specific event instead of num completed packets

--- 2084 unchanged lines hidden (view full) ---

5977#endif
5978
5979 return false;
5980}
5981
5982#ifdef ENABLE_LE_ISOCHRONOUS_STREAMS
5983static bool hci_run_iso_tasks(void){
5984 btstack_linked_list_iterator_t it;
5985
5986 // BIG
5901 btstack_linked_list_iterator_init(&it, &hci_stack->le_audio_bigs);
5902 while (btstack_linked_list_iterator_has_next(&it)){
5903 le_audio_big_t * big = (le_audio_big_t *) btstack_linked_list_iterator_next(&it);
5904 switch (big->state){
5905 case LE_AUDIO_BIG_STATE_CREATE:
5906 big->state = LE_AUDIO_BIG_STATE_W4_ESTABLISHED;
5907 hci_send_cmd(&hci_le_create_big,
5908 big->params->big_handle,

--- 10 unchanged lines hidden (view full) ---

5919 big->params->broadcast_code);
5920 return true;
5921 case LE_AUDIO_BIG_STATE_SETUP_ISO_PATH:
5922 big->state = LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH;
5923 hci_send_cmd(&hci_le_setup_iso_data_path, big->bis_con_handles[big->state_vars.next_bis], 0, 0, 0, 0, 0, 0, 0, NULL);
5924 return true;
5925 case LE_AUDIO_BIG_STATE_SETUP_ISO_PATHS_FAILED:
5926 big->state = LE_AUDIO_BIG_STATE_W4_TERMINATED_AFTER_SETUP_FAILED;
5987 btstack_linked_list_iterator_init(&it, &hci_stack->le_audio_bigs);
5988 while (btstack_linked_list_iterator_has_next(&it)){
5989 le_audio_big_t * big = (le_audio_big_t *) btstack_linked_list_iterator_next(&it);
5990 switch (big->state){
5991 case LE_AUDIO_BIG_STATE_CREATE:
5992 big->state = LE_AUDIO_BIG_STATE_W4_ESTABLISHED;
5993 hci_send_cmd(&hci_le_create_big,
5994 big->params->big_handle,

--- 10 unchanged lines hidden (view full) ---

6005 big->params->broadcast_code);
6006 return true;
6007 case LE_AUDIO_BIG_STATE_SETUP_ISO_PATH:
6008 big->state = LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH;
6009 hci_send_cmd(&hci_le_setup_iso_data_path, big->bis_con_handles[big->state_vars.next_bis], 0, 0, 0, 0, 0, 0, 0, NULL);
6010 return true;
6011 case LE_AUDIO_BIG_STATE_SETUP_ISO_PATHS_FAILED:
6012 big->state = LE_AUDIO_BIG_STATE_W4_TERMINATED_AFTER_SETUP_FAILED;
5927 hci_send_cmd(&hci_le_terminate_big, big->big_handle);
6013 hci_send_cmd(&hci_le_terminate_big, big->big_handle, big->state_vars.status);
5928 break;
5929 case LE_AUDIO_BIG_STATE_TERMINATE:
5930 big->state = LE_AUDIO_BIG_STATE_W4_TERMINATED;
6014 break;
6015 case LE_AUDIO_BIG_STATE_TERMINATE:
6016 big->state = LE_AUDIO_BIG_STATE_W4_TERMINATED;
5931 hci_send_cmd(&hci_le_terminate_big, big->big_handle);
6017 hci_send_cmd(&hci_le_terminate_big, big->big_handle, ERROR_CODE_SUCCESS);
5932 return true;
5933 default:
5934 break;
5935 }
5936 }
6018 return true;
6019 default:
6020 break;
6021 }
6022 }
6023
6024 // BIG Sync
6025 btstack_linked_list_iterator_init(&it, &hci_stack->le_audio_big_syncs);
6026 while (btstack_linked_list_iterator_has_next(&it)){
6027 le_audio_big_sync_t * big_sync = (le_audio_big_sync_t *) btstack_linked_list_iterator_next(&it);
6028 switch (big_sync->state){
6029 case LE_AUDIO_BIG_STATE_CREATE:
6030 big_sync->state = LE_AUDIO_BIG_STATE_W4_ESTABLISHED;
6031 hci_send_cmd(&hci_le_big_create_sync,
6032 big_sync->params->big_handle,
6033 big_sync->params->sync_handle,
6034 big_sync->params->encryption,
6035 big_sync->params->broadcast_code,
6036 big_sync->params->mse,
6037 big_sync->params->big_sync_timeout_10ms,
6038 big_sync->params->num_bis,
6039 big_sync->params->bis_indices);
6040 return true;
6041 case LE_AUDIO_BIG_STATE_SETUP_ISO_PATH:
6042 big_sync->state = LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH;
6043 hci_send_cmd(&hci_le_setup_iso_data_path, big_sync->bis_con_handles[big_sync->state_vars.next_bis], 1, 0, 0, 0, 0, 0, 0, NULL);
6044 return true;
6045 case LE_AUDIO_BIG_STATE_SETUP_ISO_PATHS_FAILED:
6046 big_sync->state = LE_AUDIO_BIG_STATE_W4_TERMINATED_AFTER_SETUP_FAILED;
6047 hci_send_cmd(&hci_le_big_terminate_sync, big_sync->big_handle);
6048 break;
6049 case LE_AUDIO_BIG_STATE_TERMINATE:
6050 big_sync->state = LE_AUDIO_BIG_STATE_W4_TERMINATED;
6051 hci_send_cmd(&hci_le_big_terminate_sync, big_sync->big_handle);
6052 return true;
6053 default:
6054 break;
6055 }
6056 }
6057
5937 return false;
5938}
5939#endif /* ENABLE_LE_ISOCHRONOUS_STREAMS */
5940#endif
5941
5942static bool hci_run_general_pending_commands(void){
5943 btstack_linked_item_t * it;
5944 for (it = (btstack_linked_item_t *) hci_stack->connections; it != NULL; it = it->next){

--- 2813 unchanged lines hidden (view full) ---

8758 uint16_t pos = 0;
8759 event[pos++] = HCI_EVENT_META_GAP;
8760 event[pos++] = 2;
8761 event[pos++] = GAP_SUBEVENT_BIG_TERMINATED;
8762 event[pos++] = big->big_handle;
8763 hci_emit_event(event, pos, 0);
8764}
8765
6058 return false;
6059}
6060#endif /* ENABLE_LE_ISOCHRONOUS_STREAMS */
6061#endif
6062
6063static bool hci_run_general_pending_commands(void){
6064 btstack_linked_item_t * it;
6065 for (it = (btstack_linked_item_t *) hci_stack->connections; it != NULL; it = it->next){

--- 2813 unchanged lines hidden (view full) ---

8879 uint16_t pos = 0;
8880 event[pos++] = HCI_EVENT_META_GAP;
8881 event[pos++] = 2;
8882 event[pos++] = GAP_SUBEVENT_BIG_TERMINATED;
8883 event[pos++] = big->big_handle;
8884 hci_emit_event(event, pos, 0);
8885}
8886
8887static void hci_emit_big_sync_created(const le_audio_big_sync_t * big_sync, uint8_t status){
8888 uint8_t event [6 + (MAX_NR_BIS * 2)];
8889 uint16_t pos = 0;
8890 event[pos++] = HCI_EVENT_META_GAP;
8891 event[pos++] = 4;
8892 event[pos++] = GAP_SUBEVENT_BIG_SYNC_CREATED;
8893 event[pos++] = status;
8894 event[pos++] = big_sync->big_handle;
8895 event[pos++] = big_sync->num_bis;
8896 uint8_t i;
8897 for (i=0;i<big_sync->num_bis;i++){
8898 little_endian_store_16(event, pos, big_sync->bis_con_handles[i]);
8899 pos += 2;
8900 }
8901 hci_emit_event(event, pos, 0);
8902}
8903
8904static void hci_emit_big_sync_stopped(const le_audio_big_sync_t * big_sync){
8905 uint8_t event [4];
8906 uint16_t pos = 0;
8907 event[pos++] = HCI_EVENT_META_GAP;
8908 event[pos++] = 2;
8909 event[pos++] = GAP_SUBEVENT_BIG_SYNC_STOPPED;
8910 event[pos++] = big_sync->big_handle;
8911 hci_emit_event(event, pos, 0);
8912}
8913
8766static le_audio_big_t * hci_big_for_handle(uint8_t big_handle){
8767 btstack_linked_list_iterator_t it;
8768 btstack_linked_list_iterator_init(&it, &hci_stack->le_audio_bigs);
8769 while (btstack_linked_list_iterator_has_next(&it)){
8770 le_audio_big_t * big = (le_audio_big_t *) btstack_linked_list_iterator_next(&it);
8771 if ( big->big_handle == big_handle ) {
8772 return big;
8773 }
8774 }
8775 return NULL;
8776}
8777
8914static le_audio_big_t * hci_big_for_handle(uint8_t big_handle){
8915 btstack_linked_list_iterator_t it;
8916 btstack_linked_list_iterator_init(&it, &hci_stack->le_audio_bigs);
8917 while (btstack_linked_list_iterator_has_next(&it)){
8918 le_audio_big_t * big = (le_audio_big_t *) btstack_linked_list_iterator_next(&it);
8919 if ( big->big_handle == big_handle ) {
8920 return big;
8921 }
8922 }
8923 return NULL;
8924}
8925
8926static le_audio_big_sync_t * hci_big_sync_for_handle(uint8_t big_handle){
8927 btstack_linked_list_iterator_t it;
8928 btstack_linked_list_iterator_init(&it, &hci_stack->le_audio_big_syncs);
8929 while (btstack_linked_list_iterator_has_next(&it)){
8930 le_audio_big_sync_t * big_sync = (le_audio_big_sync_t *) btstack_linked_list_iterator_next(&it);
8931 if ( big_sync->big_handle == big_handle ) {
8932 return big_sync;
8933 }
8934 }
8935 return NULL;
8936}
8937
8778uint8_t gap_big_create(le_audio_big_t * storage, le_audio_big_params_t * big_params){
8779 if (hci_big_for_handle(big_params->big_handle) != NULL){
8780 return ERROR_CODE_ACL_CONNECTION_ALREADY_EXISTS;
8781 }
8938uint8_t gap_big_create(le_audio_big_t * storage, le_audio_big_params_t * big_params){
8939 if (hci_big_for_handle(big_params->big_handle) != NULL){
8940 return ERROR_CODE_ACL_CONNECTION_ALREADY_EXISTS;
8941 }
8782
8783 if (big_params->num_bis == 0){
8784 return ERROR_CODE_INVALID_HCI_COMMAND_PARAMETERS;
8785 }
8786 if (big_params->num_bis > MAX_NR_BIS){
8787 return ERROR_CODE_INVALID_HCI_COMMAND_PARAMETERS;
8788 }
8789
8790 le_audio_big_t * big = storage;
8791 big->big_handle = big_params->big_handle;
8792 big->params = big_params;
8793 big->state = LE_AUDIO_BIG_STATE_CREATE;
8794 big->num_bis = big_params->num_bis;
8795 btstack_linked_list_add(&hci_stack->le_audio_bigs, (btstack_linked_item_t *) big);
8796
8797 hci_run();
8798
8799 return ERROR_CODE_SUCCESS;
8800}
8801
8942 if (big_params->num_bis == 0){
8943 return ERROR_CODE_INVALID_HCI_COMMAND_PARAMETERS;
8944 }
8945 if (big_params->num_bis > MAX_NR_BIS){
8946 return ERROR_CODE_INVALID_HCI_COMMAND_PARAMETERS;
8947 }
8948
8949 le_audio_big_t * big = storage;
8950 big->big_handle = big_params->big_handle;
8951 big->params = big_params;
8952 big->state = LE_AUDIO_BIG_STATE_CREATE;
8953 big->num_bis = big_params->num_bis;
8954 btstack_linked_list_add(&hci_stack->le_audio_bigs, (btstack_linked_item_t *) big);
8955
8956 hci_run();
8957
8958 return ERROR_CODE_SUCCESS;
8959}
8960
8961uint8_t gap_big_sync_create(le_audio_big_sync_t * storage, le_audio_big_sync_params_t * big_sync_params){
8962 if (hci_big_sync_for_handle(big_sync_params->big_handle) != NULL){
8963 return ERROR_CODE_ACL_CONNECTION_ALREADY_EXISTS;
8964 }
8965 if (big_sync_params->num_bis == 0){
8966 return ERROR_CODE_INVALID_HCI_COMMAND_PARAMETERS;
8967 }
8968 if (big_sync_params->num_bis > MAX_NR_BIS){
8969 return ERROR_CODE_INVALID_HCI_COMMAND_PARAMETERS;
8970 }
8971
8972 le_audio_big_sync_t * big_sync = storage;
8973 big_sync->big_handle = big_sync_params->big_handle;
8974 big_sync->params = big_sync_params;
8975 big_sync->state = LE_AUDIO_BIG_STATE_CREATE;
8976 big_sync->num_bis = big_sync_params->num_bis;
8977 btstack_linked_list_add(&hci_stack->le_audio_big_syncs, (btstack_linked_item_t *) big_sync);
8978
8979 hci_run();
8980
8981 return ERROR_CODE_SUCCESS;
8982}
8983
8802uint8_t gap_big_terminate(uint8_t big_handle){
8803 le_audio_big_t * big = hci_big_for_handle(big_handle);
8804 if (big == NULL){
8805 return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER;
8806 }
8807 switch (big->state){
8808 case LE_AUDIO_BIG_STATE_CREATE:
8809 btstack_linked_list_remove(&hci_stack->le_audio_bigs, (btstack_linked_item_t *) big);
8984uint8_t gap_big_terminate(uint8_t big_handle){
8985 le_audio_big_t * big = hci_big_for_handle(big_handle);
8986 if (big == NULL){
8987 return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER;
8988 }
8989 switch (big->state){
8990 case LE_AUDIO_BIG_STATE_CREATE:
8991 btstack_linked_list_remove(&hci_stack->le_audio_bigs, (btstack_linked_item_t *) big);
8992 hci_emit_big_terminated(big);
8810 break;
8993 break;
8811 case LE_AUDIO_BIG_STATE_W4_ESTABLISHED:
8812 big->state = LE_AUDIO_BIG_STATE_W4_ESTABLISHED_THEN_TERMINATE;
8994 case LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH:
8995 big->state = LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH_THEN_TERMINATE;
8813 break;
8996 break;
8997 case LE_AUDIO_BIG_STATE_W4_ESTABLISHED:
8814 case LE_AUDIO_BIG_STATE_SETUP_ISO_PATH:
8815 case LE_AUDIO_BIG_STATE_ACTIVE:
8816 big->state = LE_AUDIO_BIG_STATE_TERMINATE;
8817 hci_run();
8818 break;
8998 case LE_AUDIO_BIG_STATE_SETUP_ISO_PATH:
8999 case LE_AUDIO_BIG_STATE_ACTIVE:
9000 big->state = LE_AUDIO_BIG_STATE_TERMINATE;
9001 hci_run();
9002 break;
9003 default:
9004 return ERROR_CODE_COMMAND_DISALLOWED;
9005 }
9006 return ERROR_CODE_SUCCESS;
9007}
9008
9009uint8_t gap_big_sync_terminate(uint8_t big_handle){
9010 le_audio_big_sync_t * big_sync = hci_big_sync_for_handle(big_handle);
9011 if (big_sync == NULL){
9012 return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER;
9013 }
9014 switch (big_sync->state){
9015 case LE_AUDIO_BIG_STATE_CREATE:
9016 btstack_linked_list_remove(&hci_stack->le_audio_big_syncs, (btstack_linked_item_t *) big_sync);
9017 hci_emit_big_sync_stopped(big_sync);
9018 break;
8819 case LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH:
9019 case LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH:
8820 big->state = LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH_THEN_TERMINATE;
9020 big_sync->state = LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH_THEN_TERMINATE;
8821 break;
9021 break;
9022 case LE_AUDIO_BIG_STATE_W4_ESTABLISHED:
9023 case LE_AUDIO_BIG_STATE_SETUP_ISO_PATH:
9024 case LE_AUDIO_BIG_STATE_ACTIVE:
9025 big_sync->state = LE_AUDIO_BIG_STATE_TERMINATE;
9026 hci_run();
9027 break;
8822 default:
8823 return ERROR_CODE_COMMAND_DISALLOWED;
8824 }
8825 return ERROR_CODE_SUCCESS;
8826}
8827
8828#endif
8829#endif /* ENABLE_BLE */

--- 69 unchanged lines hidden ---
9028 default:
9029 return ERROR_CODE_COMMAND_DISALLOWED;
9030 }
9031 return ERROR_CODE_SUCCESS;
9032}
9033
9034#endif
9035#endif /* ENABLE_BLE */

--- 69 unchanged lines hidden ---