xref: /btstack/src/classic/hfp.c (revision d2621a777e3ea08a4ddf6f62253312d7306e7df7)
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
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the copyright holders nor the names of
14  *    contributors may be used to endorse or promote products derived
15  *    from this software without specific prior written permission.
16  * 4. Any redistribution, use, or modification is done solely for
17  *    personal benefit and not for any commercial purpose or for
18  *    monetary gain.
19  *
20  * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
21  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN
24  * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
27  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
30  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  * Please inquire about commercial licensing options at
34  * [email protected]
35  *
36  */
37 
38 #define BTSTACK_FILE__ "hfp.c"
39 
40 
41 #include "btstack_config.h"
42 
43 #include <stdint.h>
44 #include <stdio.h>
45 #include <string.h>
46 #include <inttypes.h>
47 
48 #include "bluetooth_sdp.h"
49 #include "btstack_debug.h"
50 #include "btstack_event.h"
51 #include "btstack_memory.h"
52 #include "btstack_run_loop.h"
53 #include "classic/sdp_client_rfcomm.h"
54 #include "classic/sdp_server.h"
55 #include "classic/sdp_util.h"
56 #include "classic/sdp_client.h"
57 #include "hci.h"
58 #include "hci_cmd.h"
59 #include "hci_dump.h"
60 
61 #if defined(ENABLE_CC256X_ASSISTED_HFP) && !defined(ENABLE_SCO_OVER_PCM)
62 #error "Assisted HFP is only possible over PCM/I2S. Please add define: ENABLE_SCO_OVER_PCM"
63 #endif
64 
65 #if defined(ENABLE_BCM_PCM_WBS) && !defined(ENABLE_SCO_OVER_PCM)
66 #error "WBS for PCM is only possible over PCM/I2S. Please add define: ENABLE_SCO_OVER_PCM"
67 #endif
68 
69 #define HFP_HF_FEATURES_SIZE 10
70 #define HFP_AG_FEATURES_SIZE 12
71 
72 typedef struct {
73     hfp_role_t local_role;
74     bd_addr_t  remote_address;
75 } hfp_sdp_query_context_t;
76 
77 // globals
78 
79 static btstack_linked_list_t hfp_connections ;
80 
81 static btstack_packet_handler_t hfp_hf_callback;
82 static btstack_packet_handler_t hfp_ag_callback;
83 
84 static btstack_packet_handler_t hfp_hf_rfcomm_packet_handler;
85 static btstack_packet_handler_t hfp_ag_rfcomm_packet_handler;
86 
87 static uint16_t hfp_allowed_sco_packet_types;
88 static hfp_connection_t * hfp_sco_establishment_active;
89 
90 static hfp_sdp_query_context_t                 hfp_sdp_query_context;
91 static btstack_context_callback_registration_t hfp_sdp_query_request;
92 
93 
94 
95 
96 
97 // custom commands
98 static btstack_linked_list_t hfp_custom_commands_ag;
99 static btstack_linked_list_t hfp_custom_commands_hf;
100 
101 // prototypes
102 static hfp_link_settings_t hfp_next_link_setting_for_connection(hfp_link_settings_t current_setting, hfp_connection_t * hfp_connection, uint8_t eSCO_S4_supported);
103 static void parse_sequence(hfp_connection_t * context);
104 
105 
106 #define CODEC_MASK_CVSD   (1 << HFP_CODEC_CVSD)
107 #define CODEC_MASK_OTHER ((1 << HFP_CODEC_MSBC) | (1 << HFP_CODEC_LC3_SWB))
108 
109 static const struct {
110     const uint16_t max_latency;
111     const uint8_t  retransmission_effort;
112     const uint16_t packet_types;
113     const bool     eSCO;
114     const uint8_t  codec_mask;
115 } hfp_link_settings [] = {
116         {0x0004, 0xff, SCO_PACKET_TYPES_HV1,  false, CODEC_MASK_CVSD }, // HFP_LINK_SETTINGS_D0
117         {0x0005, 0xff, SCO_PACKET_TYPES_HV3,  false, CODEC_MASK_CVSD }, // HFP_LINK_SETTINGS_D1
118         {0x0007, 0x01, SCO_PACKET_TYPES_EV3,  true,  CODEC_MASK_CVSD }, // HFP_LINK_SETTINGS_S1
119         {0x0007, 0x01, SCO_PACKET_TYPES_2EV3, true,  CODEC_MASK_CVSD }, // HFP_LINK_SETTINGS_S2
120         {0x000a, 0x01, SCO_PACKET_TYPES_2EV3, true,  CODEC_MASK_CVSD }, // HFP_LINK_SETTINGS_S3
121         {0x000c, 0x02, SCO_PACKET_TYPES_2EV3, true,  CODEC_MASK_CVSD }, // HFP_LINK_SETTINGS_S4
122         {0x0008, 0x02, SCO_PACKET_TYPES_EV3,  true,  CODEC_MASK_OTHER}, // HFP_LINK_SETTINGS_T1
123         {0x000d, 0x02, SCO_PACKET_TYPES_2EV3, true,  CODEC_MASK_OTHER}  // HFP_LINK_SETTINGS_T2
124 };
125 
126 // table 5.8 'mandatory safe settings' for eSCO + similar entries for SCO
127 static const struct hfp_mandatory_safe_setting {
128     const uint8_t codec_mask;
129     const bool secure_connection_in_use;
130     hfp_link_settings_t link_setting;
131 } hfp_mandatory_safe_settings[] = {
132         { CODEC_MASK_CVSD,  false, HFP_LINK_SETTINGS_D1},
133         { CODEC_MASK_CVSD,  true,  HFP_LINK_SETTINGS_D1},
134         { CODEC_MASK_CVSD,  false, HFP_LINK_SETTINGS_S1},
135         { CODEC_MASK_CVSD,  true,  HFP_LINK_SETTINGS_S4},
136         { CODEC_MASK_OTHER, false, HFP_LINK_SETTINGS_T1},
137         { CODEC_MASK_OTHER, true,  HFP_LINK_SETTINGS_T2},
138 };
139 
140 static const char * hfp_hf_features[] = {
141         "EC and/or NR function",
142         "Three-way calling",
143         "CLI presentation capability",
144         "Voice recognition activation",
145         "Remote volume control",
146 
147         "Enhanced call status",
148         "Enhanced call control",
149 
150         "Codec negotiation",
151 
152         "HF Indicators",
153         "eSCO S4 (and T2) Settings Supported",
154         "Reserved for future definition"
155 };
156 
157 static const char * hfp_ag_features[] = {
158         "Three-way calling",
159         "EC and/or NR function",
160         "Voice recognition function",
161         "In-band ring tone capability",
162         "Attach a number to a voice tag",
163         "Ability to reject a call",
164         "Enhanced call status",
165         "Enhanced call control",
166         "Extended Error Result Codes",
167         "Codec negotiation",
168         "HF Indicators",
169         "eSCO S4 (and T2) Settings Supported",
170         "Reserved for future definition"
171 };
172 
173 static const char * hfp_enhanced_call_dir[] = {
174         "outgoing",
175         "incoming"
176 };
177 
178 static const char * hfp_enhanced_call_status[] = {
179         "active",
180         "held",
181         "outgoing dialing",
182         "outgoing alerting",
183         "incoming",
184         "incoming waiting",
185         "call held by response and hold"
186 };
187 
188 static const char * hfp_enhanced_call_mode[] = {
189         "voice",
190         "data",
191         "fax"
192 };
193 
194 static const char * hfp_enhanced_call_mpty[] = {
195         "not a conference call",
196         "conference call"
197 };
198 
199 const char * hfp_enhanced_call_dir2str(uint16_t index){
200     if (index <= HFP_ENHANCED_CALL_DIR_INCOMING) return hfp_enhanced_call_dir[index];
201     return "not defined";
202 }
203 
204 const char * hfp_enhanced_call_status2str(uint16_t index){
205     if (index <= HFP_ENHANCED_CALL_STATUS_CALL_HELD_BY_RESPONSE_AND_HOLD) return hfp_enhanced_call_status[index];
206     return "not defined";
207 }
208 
209 const char * hfp_enhanced_call_mode2str(uint16_t index){
210     if (index <= HFP_ENHANCED_CALL_MODE_FAX) return hfp_enhanced_call_mode[index];
211     return "not defined";
212 }
213 
214 const char * hfp_enhanced_call_mpty2str(uint16_t index){
215     if (index <= HFP_ENHANCED_CALL_MPTY_CONFERENCE_CALL) return hfp_enhanced_call_mpty[index];
216     return "not defined";
217 }
218 
219 static uint16_t hfp_parse_indicator_index(hfp_connection_t * hfp_connection){
220     uint16_t index = btstack_atoi((char *)&hfp_connection->line_buffer[0]);
221 
222     if (index > HFP_MAX_NUM_INDICATORS){
223         log_info("ignoring invalid indicator index bigger then HFP_MAX_NUM_INDICATORS");
224         return HFP_MAX_NUM_INDICATORS - 1;
225     }
226 
227     // indicator index enumeration starts with 1, we substract 1 to store in array with starting index 0
228     if (index > 0){
229         index -= 1;
230     } else {
231         log_info("ignoring invalid indicator index 0");
232         return 0;
233     }
234     return index;
235 }
236 
237 static void hfp_next_indicators_index(hfp_connection_t * hfp_connection){
238     if (hfp_connection->parser_item_index < HFP_MAX_NUM_INDICATORS - 1){
239         hfp_connection->parser_item_index++;
240     } else {
241         log_info("Ignoring additional indicator");
242     }
243 }
244 
245 static void hfp_next_codec_index(hfp_connection_t * hfp_connection){
246     if (hfp_connection->parser_item_index < HFP_MAX_NUM_CODECS - 1){
247         hfp_connection->parser_item_index++;
248     } else {
249         log_info("Ignoring additional codec index");
250     }
251 }
252 
253 static void hfp_next_remote_call_services_index(hfp_connection_t * hfp_connection){
254     if (hfp_connection->remote_call_services_index < HFP_MAX_NUM_CALL_SERVICES - 1){
255         hfp_connection->remote_call_services_index++;
256     } else {
257         log_info("Ignoring additional remote_call_services");
258     }
259 }
260 
261 const char * hfp_hf_feature(int index){
262     if (index > HFP_HF_FEATURES_SIZE){
263         return hfp_hf_features[HFP_HF_FEATURES_SIZE];
264     }
265     return hfp_hf_features[index];
266 }
267 
268 const char * hfp_ag_feature(int index){
269     if (index > HFP_AG_FEATURES_SIZE){
270         return hfp_ag_features[HFP_AG_FEATURES_SIZE];
271     }
272     return hfp_ag_features[index];
273 }
274 
275 int send_str_over_rfcomm(uint16_t cid, const char * command){
276     if (!rfcomm_can_send_packet_now(cid)) return 1;
277     log_info("HFP_TX %s", command);
278     int err = rfcomm_send(cid, (uint8_t*) command, (uint16_t) strlen(command));
279     if (err){
280         log_error("rfcomm_send -> error 0x%02x \n", err);
281     }
282 #ifdef ENABLE_HFP_AT_MESSAGES
283     hfp_connection_t * hfp_connection = get_hfp_connection_context_for_rfcomm_cid(cid);
284     hfp_emit_string_event(hfp_connection, HFP_SUBEVENT_AT_MESSAGE_SENT, command);
285 #endif
286     return 1;
287 }
288 
289 int hfp_supports_codec(uint8_t codec, int codecs_nr, uint8_t * codecs){
290 
291     // mSBC requires support for eSCO connections
292     if ((codec == HFP_CODEC_MSBC) && !hci_extended_sco_link_supported()) return 0;
293 
294     int i;
295     for (i = 0; i < codecs_nr; i++){
296         if (codecs[i] != codec) continue;
297         return 1;
298     }
299     return 0;
300 }
301 
302 void hfp_hf_drop_mSBC_if_eSCO_not_supported(uint8_t * codecs, uint8_t * codecs_nr){
303     if (hci_extended_sco_link_supported()) return;
304     uint8_t i;
305     int filtered_codec_count = 0;
306     for (i=0; i < *codecs_nr; i++){
307         if (codecs[i] != HFP_CODEC_MSBC) {
308             codecs[filtered_codec_count++] = codecs[i];
309         }
310     }
311     *codecs_nr = filtered_codec_count;
312 }
313 
314 // UTILS
315 int get_bit(uint16_t bitmap, int position){
316     return (bitmap >> position) & 1;
317 }
318 
319 int store_bit(uint32_t bitmap, int position, uint8_t value){
320     if (value){
321         bitmap |= 1 << position;
322     } else {
323         bitmap &= ~ (1 << position);
324     }
325     return bitmap;
326 }
327 
328 int join(char * buffer, int buffer_size, uint8_t * values, int values_nr){
329     if (buffer_size < (values_nr * 3)) return 0;
330     int i;
331     int offset = 0;
332     for (i = 0; i < (values_nr-1); i++) {
333       offset += snprintf(buffer+offset, buffer_size-offset, "%d,", values[i]); // puts string into buffer
334     }
335     if (i<values_nr){
336         offset += snprintf(buffer+offset, buffer_size-offset, "%d", values[i]);
337     }
338     return offset;
339 }
340 
341 int join_bitmap(char * buffer, int buffer_size, uint32_t values, int values_nr){
342     if (buffer_size < (values_nr * 3)) return 0;
343 
344     int i;
345     int offset = 0;
346     for (i = 0; i < (values_nr-1); i++) {
347       offset += snprintf(buffer+offset, buffer_size-offset, "%d,", get_bit(values,i)); // puts string into buffer
348     }
349 
350     if (i<values_nr){
351         offset += snprintf(buffer+offset, buffer_size-offset, "%d", get_bit(values,i));
352     }
353     return offset;
354 }
355 static void hfp_emit_event_for_role(hfp_role_t local_role, uint8_t * packet, uint16_t size){
356     switch (local_role){
357         case HFP_ROLE_HF:
358             (*hfp_hf_callback)(HCI_EVENT_PACKET, 0, packet, size);
359             break;
360         case HFP_ROLE_AG:
361             (*hfp_ag_callback)(HCI_EVENT_PACKET, 0, packet, size);
362             break;
363         default:
364             btstack_unreachable();
365             break;
366     }
367 }
368 
369 static void hfp_emit_event_for_context(hfp_connection_t * hfp_connection, uint8_t * packet, uint16_t size){
370     if (!hfp_connection) return;
371     hfp_emit_event_for_role(hfp_connection->local_role, packet, size);
372 }
373 
374 void hfp_emit_simple_event(hfp_connection_t * hfp_connection, uint8_t event_subtype){
375     hci_con_handle_t acl_handle = (hfp_connection != NULL) ? hfp_connection->acl_handle : HCI_CON_HANDLE_INVALID;
376     uint8_t event[5];
377     event[0] = HCI_EVENT_HFP_META;
378     event[1] = sizeof(event) - 2;
379     event[2] = event_subtype;
380     little_endian_store_16(event, 3, acl_handle);
381     hfp_emit_event_for_context(hfp_connection, event, sizeof(event));
382 }
383 
384 void hfp_emit_event(hfp_connection_t * hfp_connection, uint8_t event_subtype, uint8_t value){
385     hci_con_handle_t acl_handle = (hfp_connection != NULL) ? hfp_connection->acl_handle : HCI_CON_HANDLE_INVALID;
386     uint8_t event[6];
387     event[0] = HCI_EVENT_HFP_META;
388     event[1] = sizeof(event) - 2;
389     event[2] = event_subtype;
390     little_endian_store_16(event, 3, acl_handle);
391     event[5] = value; // status 0 == OK
392     hfp_emit_event_for_context(hfp_connection, event, sizeof(event));
393 }
394 
395 void hfp_emit_voice_recognition_enabled(hfp_connection_t * hfp_connection, uint8_t status){
396     btstack_assert(hfp_connection != NULL);
397 
398     uint8_t event[7];
399     event[0] = HCI_EVENT_HFP_META;
400     event[1] = sizeof(event) - 2;
401     event[2] = HFP_SUBEVENT_VOICE_RECOGNITION_ACTIVATED;
402 
403     little_endian_store_16(event, 3, hfp_connection->acl_handle);
404     event[5] = status; // 0:success
405     event[6] = hfp_connection->enhanced_voice_recognition_enabled ? 1 : 0;
406     hfp_emit_event_for_context(hfp_connection, event, sizeof(event));
407 }
408 
409 void hfp_emit_voice_recognition_disabled(hfp_connection_t * hfp_connection, uint8_t status){
410     btstack_assert(hfp_connection != NULL);
411 
412     uint8_t event[6];
413     event[0] = HCI_EVENT_HFP_META;
414     event[1] = sizeof(event) - 2;
415     event[2] = HFP_SUBEVENT_VOICE_RECOGNITION_DEACTIVATED;
416 
417     little_endian_store_16(event, 3, hfp_connection->acl_handle);
418     event[5] = status; // 0:success
419     hfp_emit_event_for_context(hfp_connection, event, sizeof(event));
420 }
421 
422 void hfp_emit_enhanced_voice_recognition_hf_ready_for_audio_event(hfp_connection_t * hfp_connection, uint8_t status){
423     hci_con_handle_t acl_handle = (hfp_connection != NULL) ? hfp_connection->acl_handle : HCI_CON_HANDLE_INVALID;
424 
425     uint8_t event[6];
426     event[0] = HCI_EVENT_HFP_META;
427     event[1] = sizeof(event) - 2;
428     event[2] = HFP_SUBEVENT_ENHANCED_VOICE_RECOGNITION_HF_READY_FOR_AUDIO;
429     little_endian_store_16(event, 3, acl_handle);
430     event[5] = status;
431     hfp_emit_event_for_context(hfp_connection, event, sizeof(event));
432 }
433 
434 void hfp_emit_enhanced_voice_recognition_state_event(hfp_connection_t * hfp_connection, uint8_t status){
435     hci_con_handle_t acl_handle = (hfp_connection != NULL) ? hfp_connection->acl_handle : HCI_CON_HANDLE_INVALID;
436 
437     uint8_t event[6];
438     event[0] = HCI_EVENT_HFP_META;
439     event[1] = sizeof(event) - 2;
440     switch (hfp_connection->ag_vra_state){
441         case HFP_VOICE_RECOGNITION_STATE_AG_READY_TO_ACCEPT_AUDIO_INPUT:
442             event[2] = HFP_SUBEVENT_ENHANCED_VOICE_RECOGNITION_AG_READY_TO_ACCEPT_AUDIO_INPUT;
443             break;
444         case HFP_VOICE_RECOGNITION_STATE_AG_IS_STARTING_SOUND:
445             event[2] = HFP_SUBEVENT_ENHANCED_VOICE_RECOGNITION_AG_IS_STARTING_SOUND;
446             break;
447         case HFP_VOICE_RECOGNITION_STATE_AG_IS_PROCESSING_AUDIO_INPUT:
448             event[2] = HFP_SUBEVENT_ENHANCED_VOICE_RECOGNITION_AG_IS_PROCESSING_AUDIO_INPUT;
449             break;
450         default:
451             btstack_unreachable();
452             break;
453     }
454 
455     little_endian_store_16(event, 3, acl_handle);
456     event[5] = status;
457     hfp_emit_event_for_context(hfp_connection, event, sizeof(event));
458 }
459 
460 void hfp_emit_slc_connection_event(hfp_role_t local_role, uint8_t status, hci_con_handle_t con_handle, bd_addr_t addr){
461     uint8_t event[12];
462     int pos = 0;
463     event[pos++] = HCI_EVENT_HFP_META;
464     event[pos++] = sizeof(event) - 2;
465     event[pos++] = HFP_SUBEVENT_SERVICE_LEVEL_CONNECTION_ESTABLISHED;
466     little_endian_store_16(event, pos, con_handle);
467     pos += 2;
468     event[pos++] = status; // status 0 == OK
469     reverse_bd_addr(addr,&event[pos]);
470     pos += 6;
471     hfp_emit_event_for_role(local_role, event, sizeof(event));
472 }
473 
474 static void hfp_emit_audio_connection_released(hfp_connection_t * hfp_connection, hci_con_handle_t sco_handle){
475     btstack_assert(hfp_connection != NULL);
476     uint8_t event[7];
477     int pos = 0;
478     event[pos++] = HCI_EVENT_HFP_META;
479     event[pos++] = sizeof(event) - 2;
480     event[pos++] = HFP_SUBEVENT_AUDIO_CONNECTION_RELEASED;
481     little_endian_store_16(event, pos, hfp_connection->acl_handle);
482     pos += 2;
483     little_endian_store_16(event, pos, sco_handle);
484     pos += 2;
485     hfp_emit_event_for_context(hfp_connection, event, sizeof(event));
486 }
487 
488 void hfp_emit_sco_connection_established(hfp_connection_t *hfp_connection, uint8_t status, uint8_t negotiated_codec,
489                                          uint16_t rx_packet_length, uint16_t tx_packet_length) {
490     btstack_assert(hfp_connection != NULL);
491     uint8_t event[17];
492     int pos = 0;
493     event[pos++] = HCI_EVENT_HFP_META;
494     event[pos++] = sizeof(event) - 2;
495     event[pos++] = HFP_SUBEVENT_AUDIO_CONNECTION_ESTABLISHED;
496     little_endian_store_16(event, pos, hfp_connection->acl_handle);
497     pos += 2;
498     event[pos++] = status; // status 0 == OK
499     little_endian_store_16(event, pos, hfp_connection->sco_handle);
500     pos += 2;
501     reverse_bd_addr(hfp_connection->remote_addr,&event[pos]);
502     pos += 6;
503     event[pos++] = negotiated_codec;
504     little_endian_store_16(event, pos, hfp_connection->packet_types);
505     hfp_emit_event_for_context(hfp_connection, event, sizeof(event));
506 }
507 
508 void hfp_emit_string_event(hfp_connection_t * hfp_connection, uint8_t event_subtype, const char * value){
509     btstack_assert(hfp_connection != NULL);
510 #ifdef ENABLE_HFP_AT_MESSAGES
511     uint8_t event[256];
512 #else
513     uint8_t event[40];
514 #endif
515     uint16_t string_len = btstack_min((uint16_t) strlen(value), sizeof(event) - 6);
516     event[0] = HCI_EVENT_HFP_META;
517     event[1] = 4 + string_len;
518     event[2] = event_subtype;
519     little_endian_store_16(event, 3, hfp_connection->acl_handle);
520     memcpy((char*)&event[5], value, string_len);
521     event[5 + string_len] = 0;
522     hfp_emit_event_for_context(hfp_connection, event, 6 + string_len);
523 }
524 
525 btstack_linked_list_t * hfp_get_connections(void){
526     return (btstack_linked_list_t *) &hfp_connections;
527 }
528 
529 hfp_connection_t * get_hfp_connection_context_for_rfcomm_cid(uint16_t cid){
530     btstack_linked_list_iterator_t it;
531     btstack_linked_list_iterator_init(&it, hfp_get_connections());
532     while (btstack_linked_list_iterator_has_next(&it)){
533         hfp_connection_t * hfp_connection = (hfp_connection_t *)btstack_linked_list_iterator_next(&it);
534         if (hfp_connection->rfcomm_cid == cid){
535             return hfp_connection;
536         }
537     }
538     return NULL;
539 }
540 
541 hfp_connection_t * get_hfp_connection_context_for_bd_addr(bd_addr_t bd_addr, hfp_role_t hfp_role){
542     btstack_linked_list_iterator_t it;
543     btstack_linked_list_iterator_init(&it, hfp_get_connections());
544     while (btstack_linked_list_iterator_has_next(&it)){
545         hfp_connection_t * hfp_connection = (hfp_connection_t *)btstack_linked_list_iterator_next(&it);
546         if ((memcmp(hfp_connection->remote_addr, bd_addr, 6) == 0) && (hfp_connection->local_role == hfp_role)) {
547             return hfp_connection;
548         }
549     }
550     return NULL;
551 }
552 
553 hfp_connection_t * get_hfp_connection_context_for_sco_handle(uint16_t handle, hfp_role_t hfp_role){
554     btstack_linked_list_iterator_t it;
555     btstack_linked_list_iterator_init(&it, hfp_get_connections());
556     while (btstack_linked_list_iterator_has_next(&it)){
557         hfp_connection_t * hfp_connection = (hfp_connection_t *)btstack_linked_list_iterator_next(&it);
558         if ((hfp_connection->sco_handle == handle) && (hfp_connection->local_role == hfp_role)){
559             return hfp_connection;
560         }
561     }
562     return NULL;
563 }
564 
565 hfp_connection_t * get_hfp_connection_context_for_acl_handle(uint16_t handle, hfp_role_t hfp_role){
566     btstack_linked_list_iterator_t it;
567     btstack_linked_list_iterator_init(&it, hfp_get_connections());
568     while (btstack_linked_list_iterator_has_next(&it)){
569         hfp_connection_t * hfp_connection = (hfp_connection_t *)btstack_linked_list_iterator_next(&it);
570         if ((hfp_connection->acl_handle == handle) && (hfp_connection->local_role == hfp_role)){
571             return hfp_connection;
572         }
573     }
574     return NULL;
575 }
576 
577 
578 static void hfp_reset_voice_recognition(hfp_connection_t * hfp_connection){
579     btstack_assert(hfp_connection != NULL);
580     hfp_voice_recognition_activation_status_t current_vra_state = hfp_connection->vra_state;
581     hfp_connection->vra_state = HFP_VRA_VOICE_RECOGNITION_OFF;
582 
583     if (current_vra_state != HFP_VRA_VOICE_RECOGNITION_OFF){
584         hfp_emit_voice_recognition_disabled(hfp_connection, ERROR_CODE_SUCCESS);
585     } else if (hfp_connection->vra_state_requested != HFP_VRA_VOICE_RECOGNITION_OFF){
586         hfp_emit_voice_recognition_disabled(hfp_connection, ERROR_CODE_SUCCESS);
587     }
588 
589     hfp_connection->vra_state_requested = HFP_VRA_VOICE_RECOGNITION_OFF;
590     hfp_connection->activate_voice_recognition = false;
591     hfp_connection->deactivate_voice_recognition = false;
592     hfp_connection->enhanced_voice_recognition_enabled = false;
593     hfp_connection->ag_vra_status = 0;
594     hfp_connection->ag_vra_state = HFP_VOICE_RECOGNITION_STATE_AG_READY;
595 }
596 
597 void hfp_reset_context_flags(hfp_connection_t * hfp_connection){
598     if (!hfp_connection) return;
599     hfp_connection->ok_pending = 0;
600     hfp_connection->send_error = 0;
601 
602     hfp_connection->found_equal_sign = false;
603 
604     hfp_connection->change_status_update_for_individual_ag_indicators = 0;
605     hfp_connection->operator_name_changed = 0;
606 
607     hfp_connection->enable_extended_audio_gateway_error_report = 0;
608     hfp_connection->extended_audio_gateway_error = 0;
609 
610     // establish codecs hfp_connection
611     hfp_connection->suggested_codec = 0;
612     hfp_connection->negotiated_codec = 0;
613     hfp_connection->codec_confirmed = 0;
614 
615     hfp_connection->establish_audio_connection = 0;
616     hfp_connection->call_waiting_notification_enabled = 0;
617     hfp_connection->command = HFP_CMD_NONE;
618     hfp_connection->enable_status_update_for_ag_indicators = 0xFF;
619     hfp_connection->clip_have_alpha = false;
620     hfp_reset_voice_recognition(hfp_connection);
621 }
622 
623 static hfp_connection_t * create_hfp_connection_context(void){
624     hfp_connection_t * hfp_connection = btstack_memory_hfp_connection_get();
625     if (!hfp_connection) return NULL;
626 
627     hfp_connection->state = HFP_IDLE;
628     hfp_connection->call_state = HFP_CALL_IDLE;
629     hfp_connection->codecs_state = HFP_CODECS_IDLE;
630 
631     hfp_connection->parser_state = HFP_PARSER_CMD_HEADER;
632 
633     hfp_connection->acl_handle = HCI_CON_HANDLE_INVALID;
634     hfp_connection->sco_handle = HCI_CON_HANDLE_INVALID;
635 
636     hfp_reset_context_flags(hfp_connection);
637 
638     btstack_linked_list_add(&hfp_connections, (btstack_linked_item_t*)hfp_connection);
639     return hfp_connection;
640 }
641 
642 void hfp_finalize_connection_context(hfp_connection_t * hfp_connection){
643     btstack_linked_list_remove(&hfp_connections, (btstack_linked_item_t*) hfp_connection);
644     btstack_memory_hfp_connection_free(hfp_connection);
645 }
646 
647 static hfp_connection_t * hfp_create_connection(bd_addr_t bd_addr, hfp_role_t local_role){
648     hfp_connection_t * hfp_connection = get_hfp_connection_context_for_bd_addr(bd_addr, local_role);
649     if (hfp_connection) return  hfp_connection;
650     hfp_connection = create_hfp_connection_context();
651     if (!hfp_connection) {
652         return NULL;
653     }
654     (void)memcpy(hfp_connection->remote_addr, bd_addr, 6);
655     hfp_connection->local_role = local_role;
656     log_info("Create HFP context %p: role %u, addr %s", hfp_connection, local_role, bd_addr_to_str(bd_addr));
657 
658     return hfp_connection;
659 }
660 
661 /* @param network.
662  * 0 == no ability to reject a call.
663  * 1 == ability to reject a call.
664  */
665 
666 /* @param suported_features
667  * HF bit 0: EC and/or NR function (yes/no, 1 = yes, 0 = no)
668  * HF bit 1: Call waiting or three-way calling(yes/no, 1 = yes, 0 = no)
669  * HF bit 2: CLI presentation capability (yes/no, 1 = yes, 0 = no)
670  * HF bit 3: Voice recognition activation (yes/no, 1= yes, 0 = no)
671  * HF bit 4: Remote volume control (yes/no, 1 = yes, 0 = no)
672  * HF bit 5: Wide band speech (yes/no, 1 = yes, 0 = no)
673  */
674  /* Bit position:
675  * AG bit 0: Three-way calling (yes/no, 1 = yes, 0 = no)
676  * AG bit 1: EC and/or NR function (yes/no, 1 = yes, 0 = no)
677  * AG bit 2: Voice recognition function (yes/no, 1 = yes, 0 = no)
678  * AG bit 3: In-band ring tone capability (yes/no, 1 = yes, 0 = no)
679  * AG bit 4: Attach a phone number to a voice tag (yes/no, 1 = yes, 0 = no)
680  * AG bit 5: Wide band speech (yes/no, 1 = yes, 0 = no)
681  */
682 
683 void hfp_create_sdp_record(uint8_t * service, uint32_t service_record_handle, uint16_t service_uuid, int rfcomm_channel_nr, const char * name){
684     uint8_t* attribute;
685     de_create_sequence(service);
686 
687     // 0x0000 "Service Record Handle"
688     de_add_number(service, DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_SERVICE_RECORD_HANDLE);
689     de_add_number(service, DE_UINT, DE_SIZE_32, service_record_handle);
690 
691     // 0x0001 "Service Class ID List"
692     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_SERVICE_CLASS_ID_LIST);
693     attribute = de_push_sequence(service);
694     {
695         //  "UUID for Service"
696         de_add_number(attribute, DE_UUID, DE_SIZE_16, service_uuid);
697         de_add_number(attribute, DE_UUID, DE_SIZE_16, BLUETOOTH_SERVICE_CLASS_GENERIC_AUDIO);
698     }
699     de_pop_sequence(service, attribute);
700 
701     // 0x0004 "Protocol Descriptor List"
702     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_PROTOCOL_DESCRIPTOR_LIST);
703     attribute = de_push_sequence(service);
704     {
705         uint8_t* l2cpProtocol = de_push_sequence(attribute);
706         {
707             de_add_number(l2cpProtocol,  DE_UUID, DE_SIZE_16, BLUETOOTH_PROTOCOL_L2CAP);
708         }
709         de_pop_sequence(attribute, l2cpProtocol);
710 
711         uint8_t* rfcomm = de_push_sequence(attribute);
712         {
713             de_add_number(rfcomm,  DE_UUID, DE_SIZE_16, BLUETOOTH_PROTOCOL_RFCOMM);  // rfcomm_service
714             de_add_number(rfcomm,  DE_UINT, DE_SIZE_8,  rfcomm_channel_nr);  // rfcomm channel
715         }
716         de_pop_sequence(attribute, rfcomm);
717     }
718     de_pop_sequence(service, attribute);
719 
720 
721     // 0x0005 "Public Browse Group"
722     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_BROWSE_GROUP_LIST); // public browse group
723     attribute = de_push_sequence(service);
724     {
725         de_add_number(attribute,  DE_UUID, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_PUBLIC_BROWSE_ROOT);
726     }
727     de_pop_sequence(service, attribute);
728 
729     // 0x0009 "Bluetooth Profile Descriptor List"
730     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_BLUETOOTH_PROFILE_DESCRIPTOR_LIST);
731     attribute = de_push_sequence(service);
732     {
733         uint8_t *sppProfile = de_push_sequence(attribute);
734         {
735             de_add_number(sppProfile,  DE_UUID, DE_SIZE_16, BLUETOOTH_SERVICE_CLASS_HANDSFREE);
736             de_add_number(sppProfile,  DE_UINT, DE_SIZE_16, 0x0108); // Verision 1.8
737         }
738         de_pop_sequence(attribute, sppProfile);
739     }
740     de_pop_sequence(service, attribute);
741 
742     // 0x0100 "Service Name"
743     de_add_number(service,  DE_UINT, DE_SIZE_16, 0x0100);
744     de_add_data(service,  DE_STRING, (uint16_t) strlen(name), (uint8_t *) name);
745 }
746 
747 static void hfp_handle_slc_setup_error(hfp_connection_t * hfp_connection, uint8_t status){
748     // cache fields for event
749     hfp_role_t local_role = hfp_connection->local_role;
750     bd_addr_t remote_addr;
751     // cppcheck-suppress uninitvar ; remote_addr is reported as uninitialized although it's the destination of the memcpy
752     (void)memcpy(remote_addr, hfp_connection->remote_addr, 6);
753     // finalize connection struct
754     hfp_finalize_connection_context(hfp_connection);
755     // emit event
756     hfp_emit_slc_connection_event(local_role, status, HCI_CON_HANDLE_INVALID, remote_addr);
757 }
758 
759 static void handle_query_rfcomm_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
760     UNUSED(packet_type);    // ok: handling own sdp events
761     UNUSED(channel);        // ok: no channel
762     UNUSED(size);           // ok: handling own sdp events
763 
764     hfp_connection_t * hfp_connection = get_hfp_connection_context_for_bd_addr(hfp_sdp_query_context.remote_address, hfp_sdp_query_context.local_role);
765     if (hfp_connection == NULL) {
766         log_info("connection with %s and local role %d not found", hfp_sdp_query_context.remote_address, hfp_sdp_query_context.local_role);
767         return;
768     }
769 
770     switch (hci_event_packet_get_type(packet)){
771         case SDP_EVENT_QUERY_RFCOMM_SERVICE:
772             hfp_connection->rfcomm_channel_nr = sdp_event_query_rfcomm_service_get_rfcomm_channel(packet);
773             break;
774         case SDP_EVENT_QUERY_COMPLETE:
775             if (hfp_connection->rfcomm_channel_nr > 0){
776                 hfp_connection->state = HFP_W4_RFCOMM_CONNECTED;
777                 btstack_packet_handler_t packet_handler;
778                 switch (hfp_connection->local_role){
779                     case HFP_ROLE_AG:
780                         packet_handler = hfp_ag_rfcomm_packet_handler;
781                         break;
782                     case HFP_ROLE_HF:
783                         packet_handler = hfp_hf_rfcomm_packet_handler;
784                         break;
785                     default:
786                         btstack_assert(false);
787                         return;
788                 }
789 
790                 rfcomm_create_channel(packet_handler, hfp_connection->remote_addr, hfp_connection->rfcomm_channel_nr, NULL);
791 
792             } else {
793                 uint8_t status = sdp_event_query_complete_get_status(packet);
794                 if (status == ERROR_CODE_SUCCESS){
795                     // report service not found
796                     status = SDP_SERVICE_NOT_FOUND;
797                 }
798                 hfp_handle_slc_setup_error(hfp_connection, status);
799                 log_info("rfcomm service not found, status 0x%02x", status);
800             }
801 
802             // register the SDP Query request to check if there is another connection waiting for the query
803             // ignore ERROR_CODE_COMMAND_DISALLOWED because in that case, we already have requested an SDP callback
804             (void) sdp_client_register_query_callback(&hfp_sdp_query_request);
805             break;
806         default:
807             break;
808     }
809 }
810 
811 // returns 0 if unexpected error or no other link options remained, otherwise 1
812 static int hfp_handle_failed_sco_connection(uint8_t status){
813 
814     if (!hfp_sco_establishment_active){
815         log_info("(e)SCO Connection failed but not started by us");
816         return 0;
817     }
818 
819     log_info("(e)SCO Connection failed 0x%02x", status);
820     switch (status){
821         case ERROR_CODE_SCO_AIR_MODE_REJECTED:
822         case ERROR_CODE_SCO_INTERVAL_REJECTED:
823         case ERROR_CODE_SCO_OFFSET_REJECTED:
824         case ERROR_CODE_UNSPECIFIED_ERROR:
825         case ERROR_CODE_UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE:
826         case ERROR_CODE_UNSUPPORTED_REMOTE_FEATURE_UNSUPPORTED_LMP_FEATURE:
827             break;
828         default:
829             return 0;
830     }
831 
832     // note: eSCO_S4 supported flag not available, but it's only relevant for highest CVSD link setting (and the current failed)
833     hfp_link_settings_t next_setting = hfp_next_link_setting_for_connection(hfp_sco_establishment_active->link_setting, hfp_sco_establishment_active, false);
834 
835     // handle no valid setting found
836     if (next_setting == HFP_LINK_SETTINGS_NONE) {
837         if (hfp_sco_establishment_active->negotiated_codec == HFP_CODEC_MSBC){
838             log_info("T2/T1 failed, fallback to CVSD - D1");
839             hfp_sco_establishment_active->negotiated_codec = HFP_CODEC_CVSD;
840             hfp_sco_establishment_active->sco_for_msbc_failed = 1;
841             hfp_sco_establishment_active->ag_send_common_codec = true;
842             hfp_sco_establishment_active->link_setting = HFP_LINK_SETTINGS_D1;
843         } else {
844             // no other options
845             return 0;
846         }
847     }
848 
849     log_info("e)SCO Connection: try new link_setting %d", next_setting);
850     hfp_sco_establishment_active->establish_audio_connection = 1;
851     hfp_sco_establishment_active->link_setting = next_setting;
852     hfp_sco_establishment_active = NULL;
853     return 1;
854 }
855 
856 void hfp_handle_hci_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size, hfp_role_t local_role){
857     UNUSED(packet_type);
858     UNUSED(channel);    // ok: no channel
859     UNUSED(size);
860 
861     bd_addr_t event_addr;
862     hci_con_handle_t handle;
863     hfp_connection_t * hfp_connection = NULL;
864     uint8_t status;
865 
866     log_debug("HFP HCI event handler type %u, event type %x, size %u", packet_type, hci_event_packet_get_type(packet), size);
867 
868     switch (hci_event_packet_get_type(packet)) {
869 
870         case HCI_EVENT_CONNECTION_REQUEST:
871             switch(hci_event_connection_request_get_link_type(packet)){
872                 case 0: //  SCO
873                 case 2: // eSCO
874                     hci_event_connection_request_get_bd_addr(packet, event_addr);
875                     hfp_connection = get_hfp_connection_context_for_bd_addr(event_addr, local_role);
876                     if (!hfp_connection) break;
877                     if (hci_event_connection_request_get_link_type(packet) == 2){
878                         hfp_connection->accept_sco = 2;
879                     } else {
880                         hfp_connection->accept_sco = 1;
881                     }
882 #ifdef ENABLE_CC256X_ASSISTED_HFP
883                     hfp_cc256x_prepare_for_sco(hfp_connection);
884 #endif
885 #ifdef ENABLE_BCM_PCM_WBS
886                     hfp_bcm_prepare_for_sco(hfp_connection);
887 #endif
888 #ifdef ENABLE_RTK_PCM_WBS
889                     hfp_connection->rtk_send_sco_config = true;
890 #endif
891                     log_info("accept sco %u\n", hfp_connection->accept_sco);
892                     hfp_sco_establishment_active = hfp_connection;
893                     break;
894                 default:
895                     break;
896             }
897             break;
898 
899         case HCI_EVENT_COMMAND_STATUS:
900             if (hci_event_command_status_get_command_opcode(packet) == hci_setup_synchronous_connection.opcode) {
901                 if (hfp_sco_establishment_active == NULL) break;
902                 status = hci_event_command_status_get_status(packet);
903                 if (status == ERROR_CODE_SUCCESS) break;
904 
905                 hfp_connection = hfp_sco_establishment_active;
906                 if (hfp_handle_failed_sco_connection(status)) break;
907                 hfp_connection->establish_audio_connection = 0;
908                 hfp_connection->state = HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED;
909                 hfp_emit_sco_connection_established(hfp_connection, status,
910                                                     hfp_connection->negotiated_codec, 0, 0);
911             }
912             break;
913 
914         case HCI_EVENT_SYNCHRONOUS_CONNECTION_COMPLETE:{
915             if (hfp_sco_establishment_active == NULL) break;
916             hci_event_synchronous_connection_complete_get_bd_addr(packet, event_addr);
917             hfp_connection = get_hfp_connection_context_for_bd_addr(event_addr, local_role);
918             if (!hfp_connection) {
919                 log_error("HFP: connection does not exist for remote with addr %s.", bd_addr_to_str(event_addr));
920                 return;
921             }
922 
923             status = hci_event_synchronous_connection_complete_get_status(packet);
924             if (status != ERROR_CODE_SUCCESS){
925                 hfp_connection->accept_sco = 0;
926                 if (hfp_handle_failed_sco_connection(status)) break;
927 
928                 hfp_connection->establish_audio_connection = 0;
929                 hfp_connection->state = HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED;
930                 hfp_emit_sco_connection_established(hfp_connection, status,
931                                                     hfp_connection->negotiated_codec, 0, 0);
932                 break;
933             }
934 
935             uint16_t sco_handle = hci_event_synchronous_connection_complete_get_handle(packet);
936             uint8_t  link_type = hci_event_synchronous_connection_complete_get_link_type(packet);
937             uint8_t  transmission_interval = hci_event_synchronous_connection_complete_get_transmission_interval(packet);  // measured in slots
938             uint8_t  retransmission_interval = hci_event_synchronous_connection_complete_get_retransmission_interval(packet);// measured in slots
939             uint16_t rx_packet_length = hci_event_synchronous_connection_complete_get_rx_packet_length(packet); // measured in bytes
940             uint16_t tx_packet_length = hci_event_synchronous_connection_complete_get_tx_packet_length(packet); // measured in bytes
941 
942             switch (link_type){
943                 case 0x00:
944                     log_info("SCO Connection established.");
945                     if (transmission_interval != 0) log_error("SCO Connection: transmission_interval not zero: %d.", transmission_interval);
946                     if (retransmission_interval != 0) log_error("SCO Connection: retransmission_interval not zero: %d.", retransmission_interval);
947                     if (rx_packet_length != 0) log_error("SCO Connection: rx_packet_length not zero: %d.", rx_packet_length);
948                     if (tx_packet_length != 0) log_error("SCO Connection: tx_packet_length not zero: %d.", tx_packet_length);
949                     break;
950                 case 0x02:
951                     log_info("eSCO Connection established. \n");
952                     break;
953                 default:
954                     log_error("(e)SCO reserved link_type 0x%2x", link_type);
955                     break;
956             }
957 
958             log_info("sco_handle 0x%2x, address %s, transmission_interval %u slots, retransmission_interval %u slots, "
959                  " rx_packet_length %u bytes, tx_packet_length %u bytes, air_mode 0x%2x (0x02 == CVSD)\n", sco_handle,
960                  bd_addr_to_str(event_addr), transmission_interval, retransmission_interval, rx_packet_length, tx_packet_length,
961                  hci_event_synchronous_connection_complete_get_air_mode(packet));
962 
963             if (hfp_connection->state == HFP_W4_CONNECTION_ESTABLISHED_TO_SHUTDOWN){
964                 log_info("SCO about to disconnect: HFP_W4_CONNECTION_ESTABLISHED_TO_SHUTDOWN");
965                 hfp_connection->state = HFP_W2_DISCONNECT_SCO;
966                 break;
967             }
968             hfp_connection->sco_handle = sco_handle;
969             hfp_connection->establish_audio_connection = 0;
970 
971             hfp_connection->state = HFP_AUDIO_CONNECTION_ESTABLISHED;
972 
973             switch (hfp_connection->vra_state){
974                 case HFP_VRA_VOICE_RECOGNITION_ACTIVATED:
975                     hfp_connection->ag_audio_connection_opened_before_vra = false;
976                     break;
977                 default:
978                     hfp_connection->ag_audio_connection_opened_before_vra = true;
979                     break;
980             }
981             hfp_emit_sco_connection_established(hfp_connection, status,
982                                                 hfp_connection->negotiated_codec, rx_packet_length, tx_packet_length);
983             break;
984         }
985 
986         case HCI_EVENT_DISCONNECTION_COMPLETE:
987             handle = little_endian_read_16(packet,3);
988             hfp_connection = get_hfp_connection_context_for_sco_handle(handle, local_role);
989 
990             if (!hfp_connection) break;
991 
992 #ifdef ENABLE_CC256X_ASSISTED_HFP
993             hfp_connection->cc256x_send_wbs_disassociate = true;
994 #endif
995 #ifdef ENABLE_BCM_PCM_WBS
996             hfp_connection->bcm_send_disable_wbs = true;
997 #endif
998             if (hfp_connection->sco_handle == handle){
999                 hfp_connection->sco_handle = HCI_CON_HANDLE_INVALID;
1000                 hfp_connection->release_audio_connection = 0;
1001                 hfp_connection->state = HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED;
1002                 hfp_emit_audio_connection_released(hfp_connection, handle);
1003 
1004                 hfp_connection->ag_audio_connection_opened_before_vra = false;
1005 
1006                 if (hfp_connection->acl_handle == HCI_CON_HANDLE_INVALID){
1007                     hfp_reset_voice_recognition(hfp_connection);
1008                     hfp_emit_event(hfp_connection, HFP_SUBEVENT_SERVICE_LEVEL_CONNECTION_RELEASED, 0);
1009                     hfp_finalize_connection_context(hfp_connection);
1010                     break;
1011                 } else if (hfp_connection->release_slc_connection == 1){
1012                     hfp_connection->release_slc_connection = 0;
1013                     hfp_connection->state = HFP_W2_DISCONNECT_RFCOMM;
1014                     rfcomm_disconnect(hfp_connection->acl_handle);
1015                 }
1016             }
1017 
1018             if (hfp_connection->state == HFP_W4_SCO_DISCONNECTED_TO_SHUTDOWN){
1019                 // RFCOMM already closed -> remote power off
1020 #if defined(ENABLE_CC256X_ASSISTED_HFP) || defined (ENABLE_BCM_PCM_WBS)
1021                 hfp_connection->state = HFP_W4_WBS_SHUTDOWN;
1022 #else
1023                 hfp_finalize_connection_context(hfp_connection);
1024 #endif
1025                 break;
1026             }
1027             break;
1028 
1029         default:
1030             break;
1031     }
1032 }
1033 
1034 
1035 void hfp_handle_rfcomm_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size, hfp_role_t local_role){
1036     UNUSED(packet_type);
1037     UNUSED(channel);    // ok: no channel
1038     UNUSED(size);
1039 
1040     bd_addr_t event_addr;
1041     uint16_t rfcomm_cid;
1042     hfp_connection_t * hfp_connection = NULL;
1043     uint8_t status;
1044 
1045     log_debug("HFP packet_handler type %u, event type %x, size %u", packet_type, hci_event_packet_get_type(packet), size);
1046 
1047     switch (hci_event_packet_get_type(packet)) {
1048 
1049         case RFCOMM_EVENT_INCOMING_CONNECTION:
1050             // data: event (8), len(8), address(48), channel (8), rfcomm_cid (16)
1051             rfcomm_event_incoming_connection_get_bd_addr(packet, event_addr);
1052             hfp_connection = hfp_create_connection(event_addr, local_role);
1053             if (!hfp_connection){
1054                 log_info("hfp: no memory to accept incoming connection - decline");
1055                 rfcomm_decline_connection(rfcomm_event_incoming_connection_get_rfcomm_cid(packet));
1056                 return;
1057             }
1058             if (hfp_connection->state != HFP_IDLE) {
1059                 log_error("hfp: incoming connection but not idle, reject");
1060                 rfcomm_decline_connection(rfcomm_event_incoming_connection_get_rfcomm_cid(packet));
1061                 return;
1062             }
1063 
1064             hfp_connection->rfcomm_cid = rfcomm_event_incoming_connection_get_rfcomm_cid(packet);
1065             hfp_connection->state = HFP_W4_RFCOMM_CONNECTED;
1066             rfcomm_accept_connection(hfp_connection->rfcomm_cid);
1067             break;
1068 
1069         case RFCOMM_EVENT_CHANNEL_OPENED:
1070             rfcomm_event_channel_opened_get_bd_addr(packet, event_addr);
1071 
1072             hfp_connection = get_hfp_connection_context_for_bd_addr(event_addr, local_role);
1073             btstack_assert(hfp_connection != NULL);
1074 
1075             if (hfp_connection->state != HFP_W4_RFCOMM_CONNECTED){
1076                 break;
1077             }
1078 
1079             status = rfcomm_event_channel_opened_get_status(packet);
1080             if (status != ERROR_CODE_SUCCESS) {
1081                 hfp_handle_slc_setup_error(hfp_connection, status);
1082                 break;
1083             }
1084 
1085             hfp_connection->acl_handle = rfcomm_event_channel_opened_get_con_handle(packet);
1086             hfp_connection->rfcomm_cid = rfcomm_event_channel_opened_get_rfcomm_cid(packet);
1087             hfp_connection->rfcomm_mtu = rfcomm_event_channel_opened_get_max_frame_size(packet);
1088             bd_addr_copy(hfp_connection->remote_addr, event_addr);
1089             hfp_connection->state = HFP_EXCHANGE_SUPPORTED_FEATURES;
1090 
1091             rfcomm_request_can_send_now_event(hfp_connection->rfcomm_cid);
1092             break;
1093 
1094         case RFCOMM_EVENT_CHANNEL_CLOSED:
1095             rfcomm_cid = little_endian_read_16(packet,2);
1096             hfp_connection = get_hfp_connection_context_for_rfcomm_cid(rfcomm_cid);
1097             if (!hfp_connection) break;
1098             switch (hfp_connection->state){
1099                 case HFP_W4_RFCOMM_DISCONNECTED_AND_RESTART:
1100                     hfp_connection->acl_handle = HCI_CON_HANDLE_INVALID;
1101                     hfp_connection->state = HFP_IDLE;
1102                     hfp_establish_service_level_connection(hfp_connection->remote_addr, hfp_connection->service_uuid, local_role);
1103                     break;
1104 
1105                 case HFP_AUDIO_CONNECTION_ESTABLISHED:
1106                     // service connection was released, this implicitly releases audio connection as well
1107                     hfp_connection->release_audio_connection = 0;
1108                     hfp_connection->acl_handle = HCI_CON_HANDLE_INVALID;
1109                     hfp_connection->state = HFP_W4_SCO_DISCONNECTED_TO_SHUTDOWN;
1110                     gap_disconnect(hfp_connection->sco_handle);
1111                     break;
1112 
1113                 default:
1114                     // regular case
1115                     hfp_reset_voice_recognition(hfp_connection);
1116                     hfp_emit_event(hfp_connection, HFP_SUBEVENT_SERVICE_LEVEL_CONNECTION_RELEASED, 0);
1117                     hfp_finalize_connection_context(hfp_connection);
1118                     break;
1119             }
1120             break;
1121 
1122         default:
1123             break;
1124     }
1125 }
1126 // translates command string into hfp_command_t CMD
1127 
1128 typedef struct {
1129     const char * command;
1130     hfp_command_t command_id;
1131 } hfp_command_entry_t;
1132 
1133 static hfp_command_entry_t hfp_ag_command_table[] = {
1134     { "AT+BAC=",   HFP_CMD_AVAILABLE_CODECS },
1135     { "AT+BCC",    HFP_CMD_TRIGGER_CODEC_CONNECTION_SETUP },
1136     { "AT+BCS=",   HFP_CMD_HF_CONFIRMED_CODEC },
1137     { "AT+BIA=",   HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE, }, // +BIA:<enabled>,,<enabled>,,,<enabled>
1138     { "AT+BIEV=",  HFP_CMD_HF_INDICATOR_STATUS },
1139     { "AT+BIND=",  HFP_CMD_LIST_GENERIC_STATUS_INDICATORS },
1140     { "AT+BIND=?", HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS },
1141     { "AT+BIND?",  HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS_STATE },
1142     { "AT+BINP=",  HFP_CMD_HF_REQUEST_PHONE_NUMBER },
1143     { "AT+BLDN",   HFP_CMD_REDIAL_LAST_NUMBER },
1144     { "AT+BRSF=",  HFP_CMD_SUPPORTED_FEATURES },
1145     { "AT+BTRH=",  HFP_CMD_RESPONSE_AND_HOLD_COMMAND },
1146     { "AT+BTRH?",  HFP_CMD_RESPONSE_AND_HOLD_QUERY },
1147     { "AT+BVRA=",  HFP_CMD_HF_ACTIVATE_VOICE_RECOGNITION },
1148     { "AT+CCWA=",  HFP_CMD_ENABLE_CALL_WAITING_NOTIFICATION},
1149     { "AT+CHLD=",  HFP_CMD_CALL_HOLD },
1150     { "AT+CHLD=?", HFP_CMD_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES },
1151     { "AT+CHUP",   HFP_CMD_HANG_UP_CALL },
1152     { "AT+CIND=?", HFP_CMD_RETRIEVE_AG_INDICATORS },
1153     { "AT+CIND?",  HFP_CMD_RETRIEVE_AG_INDICATORS_STATUS },
1154     { "AT+CLCC",   HFP_CMD_LIST_CURRENT_CALLS },
1155     { "AT+CLIP=",  HFP_CMD_ENABLE_CLIP},
1156     { "AT+CMEE=",  HFP_CMD_ENABLE_EXTENDED_AUDIO_GATEWAY_ERROR},
1157     { "AT+CMER=",  HFP_CMD_ENABLE_INDICATOR_STATUS_UPDATE },
1158     { "AT+CNUM",   HFP_CMD_GET_SUBSCRIBER_NUMBER_INFORMATION },
1159     { "AT+COPS=",  HFP_CMD_QUERY_OPERATOR_SELECTION_NAME_FORMAT },
1160     { "AT+COPS?",  HFP_CMD_QUERY_OPERATOR_SELECTION_NAME },
1161     { "AT+NREC=",  HFP_CMD_TURN_OFF_EC_AND_NR, },
1162     { "AT+VGM=",   HFP_CMD_SET_MICROPHONE_GAIN },
1163     { "AT+VGS=",   HFP_CMD_SET_SPEAKER_GAIN },
1164     { "AT+VTS=",   HFP_CMD_TRANSMIT_DTMF_CODES },
1165     { "ATA",       HFP_CMD_CALL_ANSWERED },
1166 };
1167 
1168 static hfp_command_entry_t hfp_hf_command_table[] = {
1169     { "+BCS:",  HFP_CMD_AG_SUGGESTED_CODEC },
1170     { "+BIND:", HFP_CMD_SET_GENERIC_STATUS_INDICATOR_STATUS },
1171     { "+BINP:", HFP_CMD_AG_SENT_PHONE_NUMBER },
1172     { "+BRSF:", HFP_CMD_SUPPORTED_FEATURES },
1173     { "+BSIR:", HFP_CMD_CHANGE_IN_BAND_RING_TONE_SETTING },
1174     { "+BTRH:", HFP_CMD_RESPONSE_AND_HOLD_STATUS },
1175     { "+BVRA:", HFP_CMD_AG_ACTIVATE_VOICE_RECOGNITION },
1176     { "+CCWA:", HFP_CMD_AG_SENT_CALL_WAITING_NOTIFICATION_UPDATE, },
1177     { "+CHLD:", HFP_CMD_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES },
1178     { "+CIEV:", HFP_CMD_TRANSFER_AG_INDICATOR_STATUS},
1179     { "+CIND:", HFP_CMD_RETRIEVE_AG_INDICATORS_GENERIC },
1180     { "+CLCC:", HFP_CMD_LIST_CURRENT_CALLS },
1181     { "+CLIP:", HFP_CMD_AG_SENT_CLIP_INFORMATION },
1182     { "+CME ERROR:", HFP_CMD_EXTENDED_AUDIO_GATEWAY_ERROR },
1183     { "+CNUM:", HFP_CMD_GET_SUBSCRIBER_NUMBER_INFORMATION},
1184     { "+COPS:", HFP_CMD_QUERY_OPERATOR_SELECTION_NAME },
1185     { "+VGM:",  HFP_CMD_SET_MICROPHONE_GAIN },
1186     { "+VGM=",  HFP_CMD_SET_MICROPHONE_GAIN },
1187     { "+VGS:",  HFP_CMD_SET_SPEAKER_GAIN},
1188     { "+VGS=",  HFP_CMD_SET_SPEAKER_GAIN},
1189     { "ERROR",  HFP_CMD_ERROR},
1190     { "NOP",    HFP_CMD_NONE}, // dummy command used by unit tests
1191     { "OK",     HFP_CMD_OK },
1192     { "RING",   HFP_CMD_RING },
1193 };
1194 
1195 static const hfp_custom_at_command_t *
1196 hfp_custom_command_lookup(bool isHandsFree, const char *text) {
1197     btstack_linked_list_t * custom_commands = isHandsFree ? &hfp_custom_commands_hf : &hfp_custom_commands_ag;
1198     btstack_linked_list_iterator_t it;
1199     btstack_linked_list_iterator_init(&it, custom_commands);
1200     while (btstack_linked_list_iterator_has_next(&it)) {
1201         hfp_custom_at_command_t *at_command = (hfp_custom_at_command_t *) btstack_linked_list_iterator_next(&it);
1202         int match = strcmp(text, at_command->command);
1203         if (match == 0) {
1204             return at_command;
1205         }
1206     }
1207     return NULL;
1208 }
1209 
1210 static hfp_command_t parse_command(const char * line_buffer, int isHandsFree){
1211 
1212     // check for custom commands, AG only
1213     const hfp_custom_at_command_t * custom_at_command = hfp_custom_command_lookup(isHandsFree, line_buffer);
1214     if (custom_at_command != NULL){
1215         return HFP_CMD_CUSTOM_MESSAGE;
1216     }
1217 
1218     // table lookup based on role
1219     uint16_t num_entries;
1220     hfp_command_entry_t * table;
1221     if (isHandsFree == 0){
1222         table = hfp_ag_command_table;
1223         num_entries = sizeof(hfp_ag_command_table) / sizeof(hfp_command_entry_t);
1224     } else {
1225         table = hfp_hf_command_table;
1226         num_entries = sizeof(hfp_hf_command_table) / sizeof(hfp_command_entry_t);
1227     }
1228     // binary search
1229     uint16_t left = 0;
1230     uint16_t right = num_entries - 1;
1231     while (left <= right){
1232         uint16_t middle = left + (right - left) / 2;
1233         hfp_command_entry_t *entry = &table[middle];
1234         int match = strcmp(line_buffer, entry->command);
1235         if (match < 0){
1236             // search term is lower than middle element
1237             if (right == 0) break;
1238             right = middle - 1;
1239         } else if (match == 0){
1240             return entry->command_id;
1241         } else {
1242             // search term is higher than middle element
1243             left = middle + 1;
1244         }
1245     }
1246 
1247     // note: if parser in CMD_HEADER state would treats digits and maybe '+' as separator, match on "ATD" would work.
1248     // note: phone number is currently expected in line_buffer[3..]
1249     // prefix match on 'ATD', AG only
1250     if ((isHandsFree == 0) && (strncmp(line_buffer, HFP_CALL_PHONE_NUMBER, strlen(HFP_CALL_PHONE_NUMBER)) == 0)){
1251         return HFP_CMD_CALL_PHONE_NUMBER;
1252     }
1253 
1254     // Valid looking, but unknown commands/responses
1255     if ((isHandsFree == 0) && (strncmp(line_buffer, "AT+", 3) == 0)){
1256         return HFP_CMD_UNKNOWN;
1257     }
1258 
1259     if ((isHandsFree != 0) && (strncmp(line_buffer, "+", 1) == 0)){
1260         return HFP_CMD_UNKNOWN;
1261     }
1262 
1263     return HFP_CMD_NONE;
1264 }
1265 
1266 static void hfp_parser_store_byte(hfp_connection_t * hfp_connection, uint8_t byte){
1267     if ((hfp_connection->line_size + 1) >= HFP_MAX_VR_TEXT_SIZE) return;
1268     hfp_connection->line_buffer[hfp_connection->line_size++] = byte;
1269     hfp_connection->line_buffer[hfp_connection->line_size] = 0;
1270 }
1271 static int hfp_parser_is_buffer_empty(hfp_connection_t * hfp_connection){
1272     return hfp_connection->line_size == 0;
1273 }
1274 
1275 static int hfp_parser_is_end_of_line(uint8_t byte){
1276     return (byte == '\n') || (byte == '\r');
1277 }
1278 
1279 void hfp_parser_reset_line_buffer(hfp_connection_t *hfp_connection) {
1280     hfp_connection->line_size = 0;
1281     // we don't set the first byte to '\0' to allow access to last argument e.g. in hfp_hf_handle_rfcommand
1282 }
1283 
1284 static void hfp_parser_store_if_token(hfp_connection_t * hfp_connection, uint8_t byte){
1285     switch (byte){
1286         case ',':
1287 		case '-':
1288         case ';':
1289         case '(':
1290         case ')':
1291         case '\n':
1292         case '\r':
1293             break;
1294         default:
1295             hfp_parser_store_byte(hfp_connection, byte);
1296             break;
1297     }
1298 }
1299 
1300 static bool hfp_parser_is_separator( uint8_t byte){
1301     switch (byte){
1302         case ',':
1303 		case '-':
1304         case ';':
1305         case '\n':
1306         case '\r':
1307             return true;
1308         default:
1309             return false;
1310     }
1311 }
1312 
1313 static bool hfp_parse_byte(hfp_connection_t * hfp_connection, uint8_t byte, int isHandsFree){
1314 
1315     // handle doubles quotes
1316     if (byte == '"'){
1317         hfp_connection->parser_quoted = !hfp_connection->parser_quoted;
1318         return true;
1319     }
1320     if (hfp_connection->parser_quoted) {
1321         hfp_parser_store_byte(hfp_connection, byte);
1322         return true;
1323     }
1324 
1325     // ignore spaces outside command or double quotes (required e.g. for '+CME ERROR:..") command
1326     if ((byte == ' ') && (hfp_connection->parser_state != HFP_PARSER_CMD_HEADER)) return true;
1327 
1328     bool processed = true;
1329 
1330     switch (hfp_connection->parser_state) {
1331         case HFP_PARSER_CMD_HEADER:
1332             switch (byte) {
1333                 case '\n':
1334                 case '\r':
1335                 case ';':
1336                     // ignore separator
1337                     break;
1338                 case ':':
1339                 case '?':
1340                     // store separator
1341                     hfp_parser_store_byte(hfp_connection, byte);
1342                     break;
1343                 case '=':
1344                     // equal sign: remember and wait for next char to decided between '=?' and '=\?'
1345                     hfp_connection->found_equal_sign = true;
1346                     hfp_parser_store_byte(hfp_connection, byte);
1347                     return true;
1348                 default:
1349                     // store if not lookahead
1350                     if (!hfp_connection->found_equal_sign) {
1351                         hfp_parser_store_byte(hfp_connection, byte);
1352                         return true;
1353                     }
1354                     // mark as lookahead
1355                     processed = false;
1356                     break;
1357             }
1358 
1359             // ignore empty tokens
1360             if (hfp_parser_is_buffer_empty(hfp_connection)) return true;
1361 
1362             // parse
1363             hfp_connection->command = parse_command((char *)hfp_connection->line_buffer, isHandsFree);
1364 
1365             // pick +CIND version based on connection state: descriptions during SLC vs. states later
1366             if (hfp_connection->command == HFP_CMD_RETRIEVE_AG_INDICATORS_GENERIC){
1367                 switch(hfp_connection->state){
1368                     case HFP_W4_RETRIEVE_INDICATORS_STATUS:
1369                         hfp_connection->command = HFP_CMD_RETRIEVE_AG_INDICATORS_STATUS;
1370                         break;
1371                     case HFP_W4_RETRIEVE_INDICATORS:
1372                         hfp_connection->command = HFP_CMD_RETRIEVE_AG_INDICATORS;
1373                         break;
1374                     default:
1375                         hfp_connection->command = HFP_CMD_UNKNOWN;
1376                         break;
1377                 }
1378             }
1379 
1380             log_info("command string '%s', handsfree %u -> cmd id %u", (char *)hfp_connection->line_buffer, isHandsFree, hfp_connection->command);
1381 
1382             // store command id for custom command and just store rest of line
1383             if (hfp_connection->command == HFP_CMD_CUSTOM_MESSAGE){
1384                 const hfp_custom_at_command_t * at_command = hfp_custom_command_lookup(isHandsFree, (const char *) hfp_connection->line_buffer);
1385                 hfp_connection->custom_at_command_id = at_command->command_id;
1386                 hfp_connection->parser_state = HFP_PARSER_CUSTOM_COMMAND;
1387                 return true;
1388             }
1389 
1390             // next state
1391             hfp_parser_reset_line_buffer(hfp_connection);
1392             hfp_connection->parser_state = HFP_PARSER_CMD_SEQUENCE;
1393 
1394             return processed;
1395 
1396         case HFP_PARSER_CMD_SEQUENCE:
1397             // handle empty fields
1398             if ((byte == ',' ) && (hfp_connection->line_size == 0)){
1399                 hfp_connection->line_buffer[0] = 0;
1400                 hfp_connection->ignore_value = 1;
1401                 parse_sequence(hfp_connection);
1402                 return true;
1403             }
1404 
1405             hfp_parser_store_if_token(hfp_connection, byte);
1406             if (!hfp_parser_is_separator(byte)) return true;
1407 
1408             // ignore empty tokens
1409             switch (hfp_connection->command){
1410                 case HFP_CMD_AG_ACTIVATE_VOICE_RECOGNITION:
1411                     // don't ignore empty string
1412                     break;
1413                 default:
1414                     if (hfp_parser_is_buffer_empty(hfp_connection) && (hfp_connection->ignore_value == 0)) {
1415                         return true;
1416                     }
1417                     break;
1418             }
1419 
1420             parse_sequence(hfp_connection);
1421 
1422             hfp_parser_reset_line_buffer(hfp_connection);
1423 
1424             switch (hfp_connection->command){
1425                 case HFP_CMD_AG_SENT_PHONE_NUMBER:
1426                 case HFP_CMD_AG_SENT_CALL_WAITING_NOTIFICATION_UPDATE:
1427                 case HFP_CMD_AG_SENT_CLIP_INFORMATION:
1428                 case HFP_CMD_TRANSFER_AG_INDICATOR_STATUS:
1429                 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME:
1430                 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME_FORMAT:
1431                 case HFP_CMD_RETRIEVE_AG_INDICATORS:
1432                 case HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS_STATE:
1433                 case HFP_CMD_HF_INDICATOR_STATUS:
1434                     hfp_connection->parser_state = HFP_PARSER_SECOND_ITEM;
1435                     break;
1436                 default:
1437                     break;
1438             }
1439             return true;
1440 
1441         case HFP_PARSER_SECOND_ITEM:
1442 
1443             hfp_parser_store_if_token(hfp_connection, byte);
1444             if (!hfp_parser_is_separator(byte)) return true;
1445 
1446             switch (hfp_connection->command){
1447                 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME:
1448                     log_info("format %s, ", hfp_connection->line_buffer);
1449                     hfp_connection->network_operator.format =  btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1450                     break;
1451                 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME_FORMAT:
1452                     log_info("format %s \n", hfp_connection->line_buffer);
1453                     hfp_connection->network_operator.format =  btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1454                     break;
1455                 case HFP_CMD_LIST_GENERIC_STATUS_INDICATORS:
1456                 case HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS:
1457                 case HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS_STATE:
1458                     hfp_connection->generic_status_indicators[hfp_connection->parser_item_index].state = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer);
1459                     break;
1460                 case HFP_CMD_TRANSFER_AG_INDICATOR_STATUS:
1461                     hfp_connection->ag_indicators[hfp_connection->parser_item_index].status = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer);
1462                     log_info("%d \n", hfp_connection->ag_indicators[hfp_connection->parser_item_index].status);
1463                     hfp_connection->ag_indicators[hfp_connection->parser_item_index].status_changed = 1;
1464                     break;
1465                 case HFP_CMD_RETRIEVE_AG_INDICATORS:
1466                     hfp_connection->ag_indicators[hfp_connection->parser_item_index].min_range = btstack_atoi((char *)hfp_connection->line_buffer);
1467                     log_info("%s, ", hfp_connection->line_buffer);
1468                     break;
1469                 case HFP_CMD_AG_SENT_PHONE_NUMBER:
1470                 case HFP_CMD_AG_SENT_CALL_WAITING_NOTIFICATION_UPDATE:
1471                 case HFP_CMD_AG_SENT_CLIP_INFORMATION:
1472                     hfp_connection->bnip_type = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer);
1473                     break;
1474                 case HFP_CMD_HF_INDICATOR_STATUS:
1475                     hfp_connection->parser_indicator_value = btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1476                     break;
1477                 default:
1478                     break;
1479             }
1480 
1481             hfp_parser_reset_line_buffer(hfp_connection);
1482 
1483             hfp_connection->parser_state = HFP_PARSER_THIRD_ITEM;
1484 
1485             return true;
1486 
1487         case HFP_PARSER_THIRD_ITEM:
1488 
1489             hfp_parser_store_if_token(hfp_connection, byte);
1490             if (!hfp_parser_is_separator(byte)) return true;
1491 
1492             switch (hfp_connection->command){
1493                 case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME:
1494                     btstack_strcpy(hfp_connection->network_operator.name, HFP_MAX_NETWORK_OPERATOR_NAME_SIZE,  (char *)hfp_connection->line_buffer);
1495                     break;
1496                 case HFP_CMD_RETRIEVE_AG_INDICATORS:
1497                     hfp_connection->ag_indicators[hfp_connection->parser_item_index].max_range = btstack_atoi((char *)hfp_connection->line_buffer);
1498                     hfp_next_indicators_index(hfp_connection);
1499                     hfp_connection->ag_indicators_nr = hfp_connection->parser_item_index;
1500                     break;
1501                 case HFP_CMD_AG_SENT_CLIP_INFORMATION:
1502                 case HFP_CMD_AG_SENT_CALL_WAITING_NOTIFICATION_UPDATE:
1503                     // track if last argument exists
1504                     hfp_connection->clip_have_alpha = hfp_connection->line_size != 0;
1505                     break;
1506                 default:
1507                     break;
1508             }
1509 
1510             hfp_parser_reset_line_buffer(hfp_connection);
1511 
1512             if (hfp_connection->command == HFP_CMD_RETRIEVE_AG_INDICATORS){
1513                 hfp_connection->parser_state = HFP_PARSER_CMD_SEQUENCE;
1514             }
1515             return true;
1516 
1517         case HFP_PARSER_CUSTOM_COMMAND:
1518             hfp_parser_store_byte(hfp_connection, byte);
1519             return true;
1520 
1521         default:
1522             btstack_assert(false);
1523             return true;
1524     }
1525 }
1526 
1527 void hfp_parse(hfp_connection_t * hfp_connection, uint8_t byte, int isHandsFree){
1528     bool processed = false;
1529     while (!processed){
1530         processed = hfp_parse_byte(hfp_connection, byte, isHandsFree);
1531     }
1532     // reset parser state on end-of-line
1533     if (hfp_parser_is_end_of_line(byte)){
1534         hfp_connection->found_equal_sign = false;
1535         hfp_connection->parser_item_index = 0;
1536         hfp_connection->parser_state = HFP_PARSER_CMD_HEADER;
1537     }
1538 }
1539 
1540 static void parse_sequence(hfp_connection_t * hfp_connection){
1541     int value;
1542     switch (hfp_connection->command){
1543         case HFP_CMD_SET_GENERIC_STATUS_INDICATOR_STATUS:
1544             value = btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1545             int i;
1546             switch (hfp_connection->parser_item_index){
1547                 case 0:
1548                     for (i=0;i<hfp_connection->generic_status_indicators_nr;i++){
1549                         if (hfp_connection->generic_status_indicators[i].uuid == value){
1550                             hfp_connection->parser_indicator_index = i;
1551                             break;
1552                         }
1553                     }
1554                     break;
1555                 case 1:
1556                     if (hfp_connection->parser_indicator_index <0) break;
1557                     hfp_connection->generic_status_indicators[hfp_connection->parser_indicator_index].state = value;
1558                     log_info("HFP_CMD_SET_GENERIC_STATUS_INDICATOR_STATUS set indicator at index %u, to %u\n",
1559                      hfp_connection->parser_item_index, value);
1560                     break;
1561                 default:
1562                     break;
1563             }
1564             hfp_next_indicators_index(hfp_connection);
1565             break;
1566 
1567         case HFP_CMD_GET_SUBSCRIBER_NUMBER_INFORMATION:
1568             switch(hfp_connection->parser_item_index){
1569                 case 0:
1570                     // <alpha>: This optional field is not supported, and shall be left blank.
1571                     break;
1572                 case 1:
1573                     // <number>: Quoted string containing the phone number in the format specified by <type>.
1574                     btstack_strcpy(hfp_connection->bnip_number, sizeof(hfp_connection->bnip_number), (char *)hfp_connection->line_buffer);
1575                     break;
1576                 case 2:
1577                     /*
1578                       <type> field specifies the format of the phone number provided, and can be one of the following values:
1579                       - values 128-143: The phone number format may be a national or international format, and may contain prefix and/or escape digits. No changes on the number presentation are required.
1580                      - values 144-159: The phone number format is an international number, including the country code prefix. If the plus sign ("+") is not included as part of the number and shall be added by the AG as needed.
1581                      - values 160-175: National number. No prefix nor escape digits included.
1582                      */
1583                     value = btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1584                     hfp_connection->bnip_type = value;
1585                     break;
1586                 case 3:
1587                     // <speed>: This optional field is not supported, and shall be left blank.
1588                     break;
1589                 case 4:
1590                     // <service>: Indicates which service this phone number relates to. Shall be either 4 (voice) or 5 (fax).
1591                 default:
1592                     break;
1593             }
1594             // index > 2 are ignored in switch above
1595             hfp_connection->parser_item_index++;
1596             break;
1597         case HFP_CMD_LIST_CURRENT_CALLS:
1598             switch(hfp_connection->parser_item_index){
1599                 case 0:
1600                     value = btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1601                     hfp_connection->clcc_idx = value;
1602                     break;
1603                 case 1:
1604                     value = btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1605                     hfp_connection->clcc_dir = value;
1606                     break;
1607                 case 2:
1608                     value = btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1609                     hfp_connection->clcc_status = value;
1610                     break;
1611                 case 3:
1612                     value = btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1613                     hfp_connection->clcc_mode = value;
1614                     break;
1615                 case 4:
1616                     value = btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1617                     hfp_connection->clcc_mpty = value;
1618                     break;
1619                 case 5:
1620                     btstack_strcpy(hfp_connection->bnip_number, sizeof(hfp_connection->bnip_number), (char *)hfp_connection->line_buffer);
1621                     break;
1622                 case 6:
1623                     value = btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1624                     hfp_connection->bnip_type = value;
1625                     break;
1626                 default:
1627                     break;
1628             }
1629             // index > 6 are ignored in switch above
1630             hfp_connection->parser_item_index++;
1631             break;
1632         case HFP_CMD_SET_MICROPHONE_GAIN:
1633             value = btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1634             hfp_connection->microphone_gain = value;
1635             log_info("hfp parse HFP_CMD_SET_MICROPHONE_GAIN %d\n", value);
1636             break;
1637         case HFP_CMD_SET_SPEAKER_GAIN:
1638             value = btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1639             hfp_connection->speaker_gain = value;
1640             log_info("hfp parse HFP_CMD_SET_SPEAKER_GAIN %d\n", value);
1641             break;
1642         case HFP_CMD_TURN_OFF_EC_AND_NR:
1643             value = btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1644             hfp_connection->ag_echo_and_noise_reduction = value;
1645             log_info("hfp parse HFP_CMD_TURN_OFF_EC_AND_NR %d\n", value);
1646             break;
1647         case HFP_CMD_CHANGE_IN_BAND_RING_TONE_SETTING:
1648             value = btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1649             hfp_connection->remote_supported_features = store_bit(hfp_connection->remote_supported_features, HFP_AGSF_IN_BAND_RING_TONE, value);
1650             log_info("hfp parse HFP_CHANGE_IN_BAND_RING_TONE_SETTING %d\n", value);
1651             break;
1652         case HFP_CMD_HF_CONFIRMED_CODEC:
1653             hfp_connection->codec_confirmed = btstack_atoi((char*)hfp_connection->line_buffer);
1654             log_info("hfp parse HFP_CMD_HF_CONFIRMED_CODEC %d\n", hfp_connection->codec_confirmed);
1655             break;
1656         case HFP_CMD_AG_SUGGESTED_CODEC:
1657             hfp_connection->suggested_codec = btstack_atoi((char*)hfp_connection->line_buffer);
1658             log_info("hfp parse HFP_CMD_AG_SUGGESTED_CODEC %d\n", hfp_connection->suggested_codec);
1659             break;
1660         case HFP_CMD_SUPPORTED_FEATURES:
1661             hfp_connection->remote_supported_features = btstack_atoi((char*)hfp_connection->line_buffer);
1662             log_info("Parsed supported feature %d\n", (int) hfp_connection->remote_supported_features);
1663             break;
1664         case HFP_CMD_AVAILABLE_CODECS:
1665             log_info("Parsed codec %s\n", hfp_connection->line_buffer);
1666             hfp_connection->remote_codecs[hfp_connection->parser_item_index] = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer);
1667             hfp_next_codec_index(hfp_connection);
1668             hfp_connection->remote_codecs_nr = hfp_connection->parser_item_index;
1669             break;
1670         case HFP_CMD_RETRIEVE_AG_INDICATORS:
1671             btstack_strcpy((char *)hfp_connection->ag_indicators[hfp_connection->parser_item_index].name, HFP_MAX_INDICATOR_DESC_SIZE, (char *)hfp_connection->line_buffer);
1672             hfp_connection->ag_indicators[hfp_connection->parser_item_index].index = hfp_connection->parser_item_index+1;
1673             log_info("Indicator %d: %s (", hfp_connection->ag_indicators_nr+1, hfp_connection->line_buffer);
1674             break;
1675         case HFP_CMD_RETRIEVE_AG_INDICATORS_STATUS:
1676             log_info("Parsed Indicator %d with status: %s\n", hfp_connection->parser_item_index+1, hfp_connection->line_buffer);
1677             hfp_connection->ag_indicators[hfp_connection->parser_item_index].status = btstack_atoi((char *) hfp_connection->line_buffer);
1678             hfp_next_indicators_index(hfp_connection);
1679             break;
1680         case HFP_CMD_ENABLE_INDICATOR_STATUS_UPDATE:
1681             hfp_next_indicators_index(hfp_connection);
1682             if (hfp_connection->parser_item_index != 4) break;
1683             log_info("Parsed Enable indicators: %s\n", hfp_connection->line_buffer);
1684             value = btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1685             hfp_connection->enable_status_update_for_ag_indicators = (uint8_t) value;
1686             break;
1687         case HFP_CMD_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES:
1688             log_info("Parsed Support call hold: %s\n", hfp_connection->line_buffer);
1689             if (hfp_connection->line_size > 2 ) break;
1690             memcpy((char *)hfp_connection->remote_call_services[hfp_connection->remote_call_services_index].name, (char *)hfp_connection->line_buffer, HFP_CALL_SERVICE_SIZE-1);
1691             hfp_connection->remote_call_services[hfp_connection->remote_call_services_index].name[HFP_CALL_SERVICE_SIZE - 1] = 0;
1692             hfp_next_remote_call_services_index(hfp_connection);
1693             break;
1694         case HFP_CMD_LIST_GENERIC_STATUS_INDICATORS:
1695         case HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS:
1696             log_info("Parsed Generic status indicator: %s\n", hfp_connection->line_buffer);
1697             hfp_connection->generic_status_indicators[hfp_connection->parser_item_index].uuid = (uint16_t)btstack_atoi((char*)hfp_connection->line_buffer);
1698             hfp_next_indicators_index(hfp_connection);
1699             hfp_connection->generic_status_indicators_nr = hfp_connection->parser_item_index;
1700             break;
1701         case HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS_STATE:
1702             // HF parses inital AG gen. ind. state
1703             log_info("Parsed List generic status indicator %s state: ", hfp_connection->line_buffer);
1704             hfp_connection->parser_item_index = hfp_parse_indicator_index(hfp_connection);
1705             break;
1706         case HFP_CMD_HF_INDICATOR_STATUS:
1707             hfp_connection->parser_indicator_index = hfp_parse_indicator_index(hfp_connection);
1708             log_info("Parsed HF indicator index %u", hfp_connection->parser_indicator_index);
1709             break;
1710         case HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE:
1711             // AG parses new gen. ind. state
1712             if (hfp_connection->ignore_value){
1713                 hfp_connection->ignore_value = 0;
1714                 log_info("Parsed Enable AG indicator pos %u('%s') - unchanged (stays %u)\n", hfp_connection->parser_item_index,
1715                     hfp_connection->ag_indicators[hfp_connection->parser_item_index].name, hfp_connection->ag_indicators[hfp_connection->parser_item_index].enabled);
1716             }
1717             else if (hfp_connection->ag_indicators[hfp_connection->parser_item_index].mandatory){
1718                 log_info("Parsed Enable AG indicator pos %u('%s') - ignore (mandatory)\n",
1719                     hfp_connection->parser_item_index, hfp_connection->ag_indicators[hfp_connection->parser_item_index].name);
1720             } else {
1721                 value = btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1722                 hfp_connection->ag_indicators[hfp_connection->parser_item_index].enabled = value;
1723                 log_info("Parsed Enable AG indicator pos %u('%s'): %u\n", hfp_connection->parser_item_index,
1724                     hfp_connection->ag_indicators[hfp_connection->parser_item_index].name, value);
1725             }
1726             hfp_next_indicators_index(hfp_connection);
1727             break;
1728         case HFP_CMD_TRANSFER_AG_INDICATOR_STATUS:
1729             // indicators are indexed starting with 1
1730             hfp_connection->parser_item_index = hfp_parse_indicator_index(hfp_connection);
1731             log_info("Parsed status of the AG indicator %d, status ", hfp_connection->parser_item_index);
1732             break;
1733         case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME:
1734             hfp_connection->network_operator.mode = btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1735             log_info("Parsed network operator mode: %d, ", hfp_connection->network_operator.mode);
1736             break;
1737         case HFP_CMD_QUERY_OPERATOR_SELECTION_NAME_FORMAT:
1738             if (hfp_connection->line_buffer[0] == '3'){
1739                 log_info("Parsed Set network operator format : %s, ", hfp_connection->line_buffer);
1740                 break;
1741             }
1742             // TODO emit ERROR, wrong format
1743             log_info("ERROR Set network operator format: index %s not supported\n", hfp_connection->line_buffer);
1744             break;
1745         case HFP_CMD_ERROR:
1746             break;
1747         case HFP_CMD_EXTENDED_AUDIO_GATEWAY_ERROR:
1748             hfp_connection->extended_audio_gateway_error = 1;
1749             hfp_connection->extended_audio_gateway_error_value = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer);
1750             break;
1751         case HFP_CMD_ENABLE_EXTENDED_AUDIO_GATEWAY_ERROR:
1752             hfp_connection->enable_extended_audio_gateway_error_report = (uint8_t)btstack_atoi((char*)hfp_connection->line_buffer);
1753             hfp_connection->ok_pending = 1;
1754             hfp_connection->extended_audio_gateway_error = 0;
1755             break;
1756         case HFP_CMD_AG_SENT_PHONE_NUMBER:
1757         case HFP_CMD_AG_SENT_CALL_WAITING_NOTIFICATION_UPDATE:
1758         case HFP_CMD_AG_SENT_CLIP_INFORMATION:
1759             btstack_strcpy((char *)hfp_connection->bnip_number, sizeof(hfp_connection->bnip_number), (char *)hfp_connection->line_buffer);
1760             break;
1761         case HFP_CMD_CALL_HOLD:
1762             hfp_connection->ag_call_hold_action = hfp_connection->line_buffer[0] - '0';
1763             if (hfp_connection->line_buffer[1] != '\0'){
1764                 hfp_connection->call_index = btstack_atoi((char *)&hfp_connection->line_buffer[1]);
1765             }
1766             break;
1767         case HFP_CMD_RESPONSE_AND_HOLD_COMMAND:
1768             hfp_connection->ag_response_and_hold_action = btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1769             break;
1770         case HFP_CMD_TRANSMIT_DTMF_CODES:
1771             hfp_connection->ag_dtmf_code = hfp_connection->line_buffer[0];
1772             break;
1773         case HFP_CMD_ENABLE_CLIP:
1774             hfp_connection->clip_enabled = hfp_connection->line_buffer[0] != '0';
1775             break;
1776         case HFP_CMD_ENABLE_CALL_WAITING_NOTIFICATION:
1777             hfp_connection->call_waiting_notification_enabled = hfp_connection->line_buffer[0] != '0';
1778             break;
1779         case HFP_CMD_HF_ACTIVATE_VOICE_RECOGNITION:
1780             value = btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1781             hfp_connection->ag_activate_voice_recognition_value = value;
1782             break;
1783         case HFP_CMD_AG_ACTIVATE_VOICE_RECOGNITION:
1784             switch(hfp_connection->parser_item_index){
1785                 case 0:
1786                     hfp_connection->ag_vra_status = btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1787                     break;
1788                 case 1:
1789                     hfp_connection->ag_vra_state = (hfp_voice_recognition_state_t) btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1790                     break;
1791                 case 2:
1792                     hfp_connection->ag_msg.text_id = 0;
1793                     for (i = 0 ; i < 4; i++){
1794                         hfp_connection->ag_msg.text_id = (hfp_connection->ag_msg.text_id << 4) | nibble_for_char(hfp_connection->line_buffer[i]);
1795                     }
1796                     break;
1797                 case 3:
1798                     hfp_connection->ag_msg.text_type = (hfp_text_type_t) btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1799                     break;
1800                 case 4:
1801                     hfp_connection->ag_msg.text_operation = (hfp_text_operation_t) btstack_atoi((char *)&hfp_connection->line_buffer[0]);
1802                     break;
1803                 case 5:
1804                     hfp_connection->line_buffer[hfp_connection->line_size] = 0;
1805                     hfp_connection->ag_vra_msg_length = hfp_connection->line_size + 1;
1806                     break;
1807                 default:
1808                     break;
1809             }
1810             hfp_connection->parser_item_index++;
1811             break;
1812         default:
1813             break;
1814     }
1815 }
1816 
1817 static void hfp_handle_start_sdp_client_query(void * context){
1818     UNUSED(context);
1819 
1820     btstack_linked_list_iterator_t it;
1821     btstack_linked_list_iterator_init(&it, &hfp_connections);
1822     while (btstack_linked_list_iterator_has_next(&it)){
1823         hfp_connection_t * connection = (hfp_connection_t *)btstack_linked_list_iterator_next(&it);
1824 
1825         if (connection->state != HFP_W2_SEND_SDP_QUERY) continue;
1826 
1827         connection->state = HFP_W4_SDP_QUERY_COMPLETE;
1828         hfp_sdp_query_context.local_role = connection->local_role;
1829         (void)memcpy(hfp_sdp_query_context.remote_address, connection->remote_addr, 6);
1830         sdp_client_query_rfcomm_channel_and_name_for_service_class_uuid(&handle_query_rfcomm_event, connection->remote_addr, connection->service_uuid);
1831         return;
1832     }
1833 }
1834 
1835 uint8_t hfp_establish_service_level_connection(bd_addr_t bd_addr, uint16_t service_uuid, hfp_role_t local_role){
1836     hfp_connection_t * connection = get_hfp_connection_context_for_bd_addr(bd_addr, local_role);
1837     if (connection){
1838         return ERROR_CODE_COMMAND_DISALLOWED;
1839     }
1840 
1841     connection = hfp_create_connection(bd_addr, local_role);
1842     if (!connection){
1843         return BTSTACK_MEMORY_ALLOC_FAILED;
1844     }
1845 
1846     connection->state = HFP_W2_SEND_SDP_QUERY;
1847 
1848     bd_addr_copy(connection->remote_addr, bd_addr);
1849     connection->service_uuid = service_uuid;
1850 
1851     hfp_sdp_query_request.callback = &hfp_handle_start_sdp_client_query;
1852     // ignore ERROR_CODE_COMMAND_DISALLOWED because in that case, we already have requested an SDP callback
1853     (void) sdp_client_register_query_callback(&hfp_sdp_query_request);
1854     return ERROR_CODE_SUCCESS;
1855 }
1856 
1857 void hfp_trigger_release_service_level_connection(hfp_connection_t * hfp_connection){
1858     // called internally, NULL check already performed
1859     btstack_assert(hfp_connection != NULL);
1860 
1861     hfp_trigger_release_audio_connection(hfp_connection);
1862     if (hfp_connection->state < HFP_W4_RFCOMM_CONNECTED){
1863         hfp_connection->state = HFP_IDLE;
1864         return;
1865     }
1866 
1867     if (hfp_connection->state == HFP_W4_RFCOMM_CONNECTED){
1868         hfp_connection->state = HFP_W4_CONNECTION_ESTABLISHED_TO_SHUTDOWN;
1869         return;
1870     }
1871     hfp_connection->release_slc_connection = 1;
1872     if (hfp_connection->state < HFP_W4_SCO_CONNECTED){
1873         hfp_connection->state = HFP_W2_DISCONNECT_RFCOMM;
1874         return;
1875     }
1876 
1877     if (hfp_connection->state < HFP_W4_SCO_DISCONNECTED){
1878         hfp_connection->state = HFP_W2_DISCONNECT_SCO;
1879         hfp_connection->release_audio_connection = 1;
1880         return;
1881     }
1882 }
1883 
1884 uint8_t hfp_trigger_release_audio_connection(hfp_connection_t * hfp_connection){
1885     // called internally, NULL check already performed
1886     btstack_assert(hfp_connection != NULL);
1887     if (hfp_connection->state <= HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED){
1888         return ERROR_CODE_COMMAND_DISALLOWED;
1889     }
1890     switch (hfp_connection->state) {
1891         case HFP_W2_CONNECT_SCO:
1892             hfp_connection->state = HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED;
1893             break;
1894         case HFP_W4_SCO_CONNECTED:
1895         case HFP_AUDIO_CONNECTION_ESTABLISHED:
1896             hfp_connection->release_audio_connection = 1;
1897             break;
1898         default:
1899             return ERROR_CODE_COMMAND_DISALLOWED;
1900     }
1901     return ERROR_CODE_SUCCESS;
1902 }
1903 
1904 void hfp_setup_synchronous_connection(hfp_connection_t * hfp_connection){
1905     // all packet types, fixed bandwidth
1906     int setting = hfp_connection->link_setting;
1907     log_info("hfp_setup_synchronous_connection using setting nr %u", setting);
1908     hfp_sco_establishment_active = hfp_connection;
1909     uint16_t sco_voice_setting = hci_get_sco_voice_setting();
1910     if (hfp_connection->negotiated_codec != HFP_CODEC_CVSD){
1911 #ifdef ENABLE_BCM_PCM_WBS
1912         sco_voice_setting = 0x0063; // Transparent data, 16-bit for BCM controllers
1913 #else
1914         sco_voice_setting = 0x0043; // Transparent data, 8-bit otherwise
1915 #endif
1916     }
1917     uint16_t packet_types = hfp_link_settings[setting].packet_types;
1918     hfp_connection->packet_types = packet_types;
1919 
1920     // get packet types - bits 6-9 are 'don't allow'
1921     uint16_t packet_types_flipped = packet_types ^ 0x03c0;
1922     hci_send_cmd(&hci_setup_synchronous_connection, hfp_connection->acl_handle, 8000, 8000, hfp_link_settings[setting].max_latency,
1923         sco_voice_setting, hfp_link_settings[setting].retransmission_effort, packet_types_flipped);
1924 }
1925 
1926 hfp_link_settings_t hfp_safe_settings_for_context(bool use_eSCO, uint8_t negotiated_codec, bool secure_connection_in_use){
1927     uint8_t i;
1928     hfp_link_settings_t link_setting = HFP_LINK_SETTINGS_NONE;
1929     for (i=0 ; i < ( sizeof(hfp_mandatory_safe_settings) / sizeof(struct hfp_mandatory_safe_setting) ) ; i++){
1930         if (hfp_link_settings[(uint8_t)(hfp_mandatory_safe_settings[i].link_setting)].eSCO != use_eSCO) continue;
1931         if ((hfp_mandatory_safe_settings[i].codec_mask & (1 << negotiated_codec)) == 0) continue;
1932         if (hfp_mandatory_safe_settings[i].secure_connection_in_use != secure_connection_in_use) continue;
1933         link_setting = hfp_mandatory_safe_settings[i].link_setting;
1934         break;
1935     }
1936     return link_setting;
1937 }
1938 
1939 void hfp_accept_synchronous_connection(hfp_connection_t * hfp_connection, bool use_eSCO){
1940 
1941     bool secure_connection_in_use = gap_secure_connection(hfp_connection->acl_handle);
1942 
1943     // lookup safe settings based on SCO type, SC use and Codec type
1944     hfp_link_settings_t link_setting = hfp_safe_settings_for_context(use_eSCO, hfp_connection->negotiated_codec, secure_connection_in_use);
1945     btstack_assert(link_setting != HFP_LINK_SETTINGS_NONE);
1946 
1947     uint16_t max_latency = hfp_link_settings[(uint8_t) link_setting].max_latency;
1948     uint16_t retransmission_effort = hfp_link_settings[(uint8_t) link_setting].retransmission_effort;
1949 
1950     // safer to allow more packet types:
1951     uint16_t packet_types = use_eSCO ? (SCO_PACKET_TYPES_EV3 | SCO_PACKET_TYPES_2EV3) : (SCO_PACKET_TYPES_HV1 | SCO_PACKET_TYPES_HV3);
1952 
1953     // transparent data for non-CVSD connections or if codec provided by Controller
1954     uint16_t sco_voice_setting = hci_get_sco_voice_setting();
1955     if (hfp_connection->negotiated_codec != HFP_CODEC_CVSD){
1956 #ifdef ENABLE_BCM_PCM_WBS
1957         sco_voice_setting = 0x0063; // Transparent data, 16-bit for BCM controllers
1958 #else
1959         sco_voice_setting = 0x0043; // Transparent data, 8-bit otherwise
1960 #endif
1961     }
1962 
1963     // filter packet types
1964     packet_types &= hfp_get_sco_packet_types();
1965 
1966     hfp_connection->packet_types = packet_types;
1967 
1968     // bits 6-9 are 'don't allow'
1969     uint16_t packet_types_flipped = packet_types ^ 0x3c0;
1970 
1971     log_info("HFP: sending hci_accept_connection_request, packet types 0x%04x, sco_voice_setting 0x%02x", packet_types, sco_voice_setting);
1972     hci_send_cmd(&hci_accept_synchronous_connection, hfp_connection->remote_addr, 8000, 8000, max_latency,
1973                  sco_voice_setting, retransmission_effort, packet_types_flipped);
1974 }
1975 
1976 #ifdef ENABLE_CC256X_ASSISTED_HFP
1977 void hfp_cc256x_prepare_for_sco(hfp_connection_t * hfp_connection){
1978     hfp_connection->cc256x_send_write_codec_config = true;
1979     if (hfp_connection->negotiated_codec == HFP_CODEC_MSBC){
1980         hfp_connection->cc256x_send_wbs_associate = true;
1981     }
1982 }
1983 
1984 void hfp_cc256x_write_codec_config(hfp_connection_t * hfp_connection){
1985     uint32_t sample_rate_hz;
1986     uint16_t clock_rate_khz;
1987     if (hfp_connection->negotiated_codec == HFP_CODEC_MSBC){
1988         clock_rate_khz = 512;
1989         sample_rate_hz = 16000;
1990     } else {
1991         clock_rate_khz = 256;
1992         sample_rate_hz = 8000;
1993     }
1994     uint8_t clock_direction = 0;        // master
1995     uint16_t frame_sync_duty_cycle = 0; // i2s with 50%
1996     uint8_t  frame_sync_edge = 1;       // rising edge
1997     uint8_t  frame_sync_polarity = 0;   // active high
1998     uint8_t  reserved = 0;
1999     uint16_t size = 16;
2000     uint16_t chan_1_offset = 1;
2001     uint16_t chan_2_offset = chan_1_offset + size;
2002     uint8_t  out_edge = 1;              // rising
2003     uint8_t  in_edge = 0;               // falling
2004     hci_send_cmd(&hci_ti_write_codec_config, clock_rate_khz, clock_direction, sample_rate_hz, frame_sync_duty_cycle,
2005                  frame_sync_edge, frame_sync_polarity, reserved,
2006                  size, chan_1_offset, out_edge, size, chan_1_offset, in_edge, reserved,
2007                  size, chan_2_offset, out_edge, size, chan_2_offset, in_edge, reserved);
2008 }
2009 #endif
2010 
2011 #ifdef ENABLE_BCM_PCM_WBS
2012 void hfp_bcm_prepare_for_sco(hfp_connection_t * hfp_connection){
2013     hfp_connection->bcm_send_write_i2spcm_interface_param = true;
2014     if (hfp_connection->negotiated_codec == HFP_CODEC_MSBC){
2015         hfp_connection->bcm_send_enable_wbs = true;
2016     }
2017 }
2018 void hfp_bcm_write_i2spcm_interface_param(hfp_connection_t * hfp_connection){
2019     uint8_t sample_rate = (hfp_connection->negotiated_codec == HFP_CODEC_MSBC) ? 1 : 0;
2020     // i2s enable, master, 8/16 kHz, 512 kHz
2021     hci_send_cmd(&hci_bcm_write_i2spcm_interface_paramhci_bcm_write_i2spcm_interface_param, 1, 1, sample_rate, 2);
2022 }
2023 #endif
2024 
2025 void hfp_set_hf_callback(btstack_packet_handler_t callback){
2026     hfp_hf_callback = callback;
2027 }
2028 
2029 void hfp_set_ag_callback(btstack_packet_handler_t callback){
2030     hfp_ag_callback = callback;
2031 }
2032 
2033 void hfp_set_ag_rfcomm_packet_handler(btstack_packet_handler_t handler){
2034     hfp_ag_rfcomm_packet_handler = handler;
2035 }
2036 
2037 void hfp_set_hf_rfcomm_packet_handler(btstack_packet_handler_t handler){
2038     hfp_hf_rfcomm_packet_handler = handler;
2039 }
2040 
2041 void hfp_init(void){
2042     hfp_allowed_sco_packet_types = SCO_PACKET_TYPES_ALL;
2043 }
2044 
2045 void hfp_deinit(void){
2046     hfp_allowed_sco_packet_types = 0;
2047     hfp_connections = NULL;
2048     hfp_hf_callback = NULL;
2049     hfp_ag_callback = NULL;
2050     hfp_hf_rfcomm_packet_handler = NULL;
2051     hfp_ag_rfcomm_packet_handler = NULL;
2052     hfp_sco_establishment_active = NULL;
2053     hfp_custom_commands_ag = NULL;
2054     hfp_custom_commands_hf = NULL;
2055     (void) memset(&hfp_sdp_query_context, 0, sizeof(hfp_sdp_query_context_t));
2056     (void) memset(&hfp_sdp_query_request, 0, sizeof(btstack_context_callback_registration_t));
2057 }
2058 
2059 void hfp_set_sco_packet_types(uint16_t packet_types){
2060     hfp_allowed_sco_packet_types = packet_types;
2061 }
2062 
2063 uint16_t hfp_get_sco_packet_types(void){
2064     return hfp_allowed_sco_packet_types;
2065 }
2066 
2067 hfp_link_settings_t hfp_next_link_setting(hfp_link_settings_t current_setting, bool local_eSCO_supported, bool remote_eSCO_supported, bool eSCO_S4_supported, uint8_t negotiated_codec){
2068     int8_t setting = (int8_t) current_setting;
2069     bool can_use_eSCO = local_eSCO_supported && remote_eSCO_supported;
2070     while (setting > 0){
2071         setting--;
2072         // skip if eSCO required but not available
2073         if (hfp_link_settings[setting].eSCO && !can_use_eSCO) continue;
2074         // skip if S4 but not supported
2075         if ((setting == (int8_t) HFP_LINK_SETTINGS_S4) && !eSCO_S4_supported) continue;
2076         // skip wrong codec
2077         if ((hfp_link_settings[setting].codec_mask & (1 << negotiated_codec)) == 0) continue;
2078         // skip disabled packet types
2079         uint16_t required_packet_types = hfp_link_settings[setting].packet_types;
2080         uint16_t allowed_packet_types  = hfp_allowed_sco_packet_types;
2081         if ((required_packet_types & allowed_packet_types) == 0) continue;
2082 
2083         // found matching setting
2084         return (hfp_link_settings_t) setting;
2085     }
2086     return HFP_LINK_SETTINGS_NONE;
2087 }
2088 
2089 static hfp_link_settings_t hfp_next_link_setting_for_connection(hfp_link_settings_t current_setting, hfp_connection_t * hfp_connection, uint8_t eSCO_S4_supported){
2090     bool local_eSCO_supported  = hci_extended_sco_link_supported();
2091     bool remote_eSCO_supported = hci_remote_esco_supported(hfp_connection->acl_handle);
2092     uint8_t negotiated_codec   = hfp_connection->negotiated_codec;
2093     return  hfp_next_link_setting(current_setting, local_eSCO_supported, remote_eSCO_supported, eSCO_S4_supported, negotiated_codec);
2094 }
2095 
2096 void hfp_init_link_settings(hfp_connection_t * hfp_connection, uint8_t eSCO_S4_supported){
2097     // get highest possible link setting
2098     hfp_connection->link_setting = hfp_next_link_setting_for_connection(HFP_LINK_SETTINGS_NONE, hfp_connection, eSCO_S4_supported);
2099     log_info("hfp_init_link_settings: %u", hfp_connection->link_setting);
2100 }
2101 
2102 #define HFP_HF_RX_DEBUG_PRINT_LINE 80
2103 
2104 void hfp_log_rfcomm_message(const char * tag, uint8_t * packet, uint16_t size){
2105 #ifdef ENABLE_LOG_INFO
2106     // encode \n\r
2107     char printable[HFP_HF_RX_DEBUG_PRINT_LINE+2];
2108     int i = 0;
2109     int pos;
2110     for (pos=0 ; (pos < size) && (i < (HFP_HF_RX_DEBUG_PRINT_LINE - 3)) ; pos++){
2111         switch (packet[pos]){
2112             case '\n':
2113                 printable[i++] = '\\';
2114                 printable[i++] = 'n';
2115                 break;
2116             case '\r':
2117                 printable[i++] = '\\';
2118                 printable[i++] = 'r';
2119                 break;
2120             default:
2121                 printable[i++] = packet[pos];
2122                 break;
2123         }
2124     }
2125     printable[i] = 0;
2126     log_info("%s: '%s'", tag, printable);
2127 #endif
2128 }
2129 
2130 void hfp_register_custom_ag_command(hfp_custom_at_command_t * custom_at_command){
2131     btstack_linked_list_add(&hfp_custom_commands_ag, (btstack_linked_item_t *) custom_at_command);
2132 }
2133 
2134 void hfp_register_custom_hf_command(hfp_custom_at_command_t * custom_at_command){
2135     btstack_linked_list_add(&hfp_custom_commands_hf, (btstack_linked_item_t *) custom_at_command);
2136 }
2137 
2138 // HFP H2 Synchronization - might get moved into a hfp_h2.c
2139 
2140 // find position of h2 sync header, returns -1 if not found, or h2 sync position
2141 static int16_t hfp_h2_sync_find(const uint8_t * frame_data, uint16_t frame_len){
2142     uint16_t i;
2143     for (i=0;i<(frame_len - 1);i++){
2144         // check: first byte == 1
2145         uint8_t h2_first_byte = frame_data[i];
2146         if (h2_first_byte == 0x01) {
2147             uint8_t h2_second_byte = frame_data[i + 1];
2148             // check lower nibble of second byte == 0x08
2149             if ((h2_second_byte & 0x0F) == 8) {
2150                 // check if bits 0+2 == bits 1+3
2151                 uint8_t hn = h2_second_byte >> 4;
2152                 if (((hn >> 1) & 0x05) == (hn & 0x05)) {
2153                     return (int16_t) i;
2154                 }
2155             }
2156         }
2157     }
2158     return -1;
2159 }
2160 
2161 static void hfp_h2_sync_reset(hfp_h2_sync_t * hfp_h2_sync){
2162     hfp_h2_sync->frame_len = 0;
2163 }
2164 
2165 void hfp_h2_sync_init(hfp_h2_sync_t * hfp_h2_sync,
2166                       bool (*callback)(bool bad_frame, const uint8_t * frame_data, uint16_t frame_len)){
2167     hfp_h2_sync->callback = callback;
2168     hfp_h2_sync->dropped_bytes = 0;
2169     hfp_h2_sync_reset(hfp_h2_sync);
2170 }
2171 
2172 static void hfp_h2_report_bad_frames(hfp_h2_sync_t *hfp_h2_sync){
2173     // report bad frames
2174     while (hfp_h2_sync->dropped_bytes >= HFP_H2_SYNC_FRAME_SIZE){
2175         hfp_h2_sync->dropped_bytes -= HFP_H2_SYNC_FRAME_SIZE;
2176         (void)(*hfp_h2_sync->callback)(true,NULL, HFP_H2_SYNC_FRAME_SIZE);
2177     }
2178 }
2179 
2180 static void hfp_h2_sync_drop_bytes(hfp_h2_sync_t * hfp_h2_sync, uint16_t bytes_to_drop){
2181     btstack_assert(bytes_to_drop <= hfp_h2_sync->frame_len);
2182     memmove(hfp_h2_sync->frame_data, &hfp_h2_sync->frame_data[bytes_to_drop], hfp_h2_sync->frame_len - bytes_to_drop);
2183     hfp_h2_sync->dropped_bytes += bytes_to_drop;
2184     hfp_h2_sync->frame_len     -= bytes_to_drop;
2185     hfp_h2_report_bad_frames(hfp_h2_sync);
2186 }
2187 
2188 void hfp_h2_sync_process(hfp_h2_sync_t *hfp_h2_sync, bool bad_frame, const uint8_t *frame_data, uint16_t frame_len) {
2189 
2190     if (bad_frame){
2191         // drop all data
2192         hfp_h2_sync->dropped_bytes += hfp_h2_sync->frame_len;
2193         hfp_h2_sync->frame_len = 0;
2194         // all new data is bad, too
2195         hfp_h2_sync->dropped_bytes += frame_len;
2196         // report frames
2197         hfp_h2_report_bad_frames(hfp_h2_sync);
2198         return;
2199     }
2200 
2201     while (frame_len > 0){
2202         // Fill hfp_h2_sync->frame_buffer
2203         uint16_t bytes_free_in_frame_buffer = HFP_H2_SYNC_FRAME_SIZE - hfp_h2_sync->frame_len;
2204         uint16_t bytes_to_append = btstack_min(frame_len, bytes_free_in_frame_buffer);
2205         memcpy(&hfp_h2_sync->frame_data[hfp_h2_sync->frame_len], frame_data, bytes_to_append);
2206         frame_data             += bytes_to_append;
2207         frame_len              -= bytes_to_append;
2208         hfp_h2_sync->frame_len += bytes_to_append;
2209         // check complete frame for h2 sync
2210         if (hfp_h2_sync->frame_len == HFP_H2_SYNC_FRAME_SIZE){
2211             bool valid_frame = true;
2212             int16_t h2_pos = hfp_h2_sync_find(hfp_h2_sync->frame_data, hfp_h2_sync->frame_len);
2213             if (h2_pos < 0){
2214                 // no h2 sync, no valid frame, keep last byte if it is 0x01
2215                 if (hfp_h2_sync->frame_data[HFP_H2_SYNC_FRAME_SIZE-1] == 0x01){
2216                     hfp_h2_sync_drop_bytes(hfp_h2_sync, HFP_H2_SYNC_FRAME_SIZE - 1);
2217                 } else {
2218                     hfp_h2_sync_drop_bytes(hfp_h2_sync, HFP_H2_SYNC_FRAME_SIZE);
2219                 }
2220                 valid_frame = false;
2221             }
2222             else if (h2_pos > 0){
2223                 // drop data before h2 sync
2224                 hfp_h2_sync_drop_bytes(hfp_h2_sync, h2_pos);
2225                 valid_frame = false;
2226             }
2227             if (valid_frame) {
2228                 // h2 sync at pos 0 and complete frame
2229                 bool codec_ok = (*hfp_h2_sync->callback)(false, hfp_h2_sync->frame_data, hfp_h2_sync->frame_len);
2230                 if (codec_ok){
2231                     hfp_h2_sync_reset(hfp_h2_sync);
2232                 } else {
2233                     // drop first two bytes
2234                     hfp_h2_sync_drop_bytes(hfp_h2_sync, 2);
2235                 }
2236             }
2237         }
2238     }
2239 }
2240