l2cap.c (624873c3b8e4eb947f3fea11c92910ab141db4a9) | l2cap.c (66a726407acdab10cd9cfc3d51a507b822221f33) |
---|---|
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 --- 949 unchanged lines hidden (view full) --- 958 l2cap_fixed_channel_t * channel = (l2cap_fixed_channel_t*) btstack_linked_list_iterator_next(&it); 959 if (channel->local_cid == cid) { 960 return channel; 961 } 962 } 963 return NULL; 964} 965 | 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 --- 949 unchanged lines hidden (view full) --- 958 l2cap_fixed_channel_t * channel = (l2cap_fixed_channel_t*) btstack_linked_list_iterator_next(&it); 959 if (channel->local_cid == cid) { 960 return channel; 961 } 962 } 963 return NULL; 964} 965 |
966static void l2cap_report_channel_open_failed(l2cap_channel_t * channel, uint8_t status){ | 966static void l2cap_handle_channel_open_failed(l2cap_channel_t * channel, uint8_t status){ 967#ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE 968 // emit ertm buffer released, as it's not needed. if in basic mode, it was either not allocated or already released 969 if (channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION){ 970 l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_ERTM_BUFFER_RELEASED); 971 } 972#endif |
967 l2cap_emit_channel_opened(channel, status); 968} 969 | 973 l2cap_emit_channel_opened(channel, status); 974} 975 |
976static void l2cap_handle_channel_closed(l2cap_channel_t * channel){ 977#ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE 978 // emit ertm buffer released, as it's not needed anymore. if in basic mode, it was either not allocated or already released 979 if (channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION){ 980 l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_ERTM_BUFFER_RELEASED); 981 } 982#endif 983 l2cap_emit_channel_closed(channel); 984} 985 |
|
970// used for fixed channels in LE (ATT/SM) and Classic (Connectionless Channel). CID < 0x04 971static l2cap_fixed_channel_t * l2cap_fixed_channel_for_channel_id(uint16_t local_cid){ 972 if (local_cid >= 0x40) return NULL; 973 return (l2cap_fixed_channel_t*) l2cap_channel_item_by_cid(local_cid); 974} 975 976// used for Classic Channels + LE Data Channels. local_cid >= 0x40 977#ifdef L2CAP_USES_CHANNELS --- 87 unchanged lines hidden (view full) --- 1065 l2cap_channel_t * channel = l2cap_channel_for_rtx_timer(ts); 1066 if (!channel) return; 1067 1068 log_info("l2cap_rtx_timeout for local cid 0x%02x", channel->local_cid); 1069 1070 // "When terminating the channel, it is not necessary to send a L2CAP_DisconnectReq 1071 // and enter WAIT_DISCONNECT state. Channels can be transitioned directly to the CLOSED state." 1072 // notify client | 986// used for fixed channels in LE (ATT/SM) and Classic (Connectionless Channel). CID < 0x04 987static l2cap_fixed_channel_t * l2cap_fixed_channel_for_channel_id(uint16_t local_cid){ 988 if (local_cid >= 0x40) return NULL; 989 return (l2cap_fixed_channel_t*) l2cap_channel_item_by_cid(local_cid); 990} 991 992// used for Classic Channels + LE Data Channels. local_cid >= 0x40 993#ifdef L2CAP_USES_CHANNELS --- 87 unchanged lines hidden (view full) --- 1081 l2cap_channel_t * channel = l2cap_channel_for_rtx_timer(ts); 1082 if (!channel) return; 1083 1084 log_info("l2cap_rtx_timeout for local cid 0x%02x", channel->local_cid); 1085 1086 // "When terminating the channel, it is not necessary to send a L2CAP_DisconnectReq 1087 // and enter WAIT_DISCONNECT state. Channels can be transitioned directly to the CLOSED state." 1088 // notify client |
1073 l2cap_report_channel_open_failed(channel, L2CAP_CONNECTION_RESPONSE_RESULT_RTX_TIMEOUT); | 1089 l2cap_handle_channel_open_failed(channel, L2CAP_CONNECTION_RESPONSE_RESULT_RTX_TIMEOUT); |
1074 1075 // discard channel 1076 // no need to stop timer here, it is removed from list during timer callback 1077 btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel); 1078 btstack_memory_l2cap_channel_free(channel); 1079} 1080 1081#endif --- 846 unchanged lines hidden (view full) --- 1928 done = 1; 1929 btstack_linked_list_iterator_init(&it, &l2cap_channels); 1930 while (btstack_linked_list_iterator_has_next(&it)){ 1931 l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it); 1932 if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue; 1933 if (channel->state == L2CAP_STATE_EMIT_OPEN_FAILED_AND_DISCARD){ 1934 done = 0; 1935 // failure, forward error code | 1090 1091 // discard channel 1092 // no need to stop timer here, it is removed from list during timer callback 1093 btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel); 1094 btstack_memory_l2cap_channel_free(channel); 1095} 1096 1097#endif --- 846 unchanged lines hidden (view full) --- 1944 done = 1; 1945 btstack_linked_list_iterator_init(&it, &l2cap_channels); 1946 while (btstack_linked_list_iterator_has_next(&it)){ 1947 l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it); 1948 if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue; 1949 if (channel->state == L2CAP_STATE_EMIT_OPEN_FAILED_AND_DISCARD){ 1950 done = 0; 1951 // failure, forward error code |
1936 l2cap_report_channel_open_failed(channel, status); | 1952 l2cap_handle_channel_open_failed(channel, status); |
1937 // discard channel 1938 l2cap_stop_rtx(channel); 1939 btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel); 1940 btstack_memory_l2cap_channel_free(channel); 1941 break; 1942 } 1943 } 1944 } --- 96 unchanged lines hidden (view full) --- 2041 // still, the compiler insists on a return value 2042 return 0; 2043} 2044#endif 2045 2046#ifdef ENABLE_CLASSIC 2047static void l2cap_handle_hci_disconnect_event(l2cap_channel_t * channel){ 2048 if (l2cap_send_open_failed_on_hci_disconnect(channel)){ | 1953 // discard channel 1954 l2cap_stop_rtx(channel); 1955 btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel); 1956 btstack_memory_l2cap_channel_free(channel); 1957 break; 1958 } 1959 } 1960 } --- 96 unchanged lines hidden (view full) --- 2057 // still, the compiler insists on a return value 2058 return 0; 2059} 2060#endif 2061 2062#ifdef ENABLE_CLASSIC 2063static void l2cap_handle_hci_disconnect_event(l2cap_channel_t * channel){ 2064 if (l2cap_send_open_failed_on_hci_disconnect(channel)){ |
2049 l2cap_report_channel_open_failed(channel, L2CAP_CONNECTION_BASEBAND_DISCONNECT); | 2065 l2cap_handle_channel_open_failed(channel, L2CAP_CONNECTION_BASEBAND_DISCONNECT); |
2050 } else { | 2066 } else { |
2051 l2cap_emit_channel_closed(channel); | 2067 l2cap_handle_channel_closed(channel); |
2052 } 2053 btstack_memory_l2cap_channel_free(channel); 2054} 2055#endif 2056 2057#ifdef ENABLE_LE_DATA_CHANNELS 2058static void l2cap_handle_hci_le_disconnect_event(l2cap_channel_t * channel){ 2059 if (l2cap_send_open_failed_on_hci_disconnect(channel)){ --- 409 unchanged lines hidden (view full) --- 2469 if (option_type == L2CAP_CONFIG_OPTION_TYPE_RETRANSMISSION_AND_FLOW_CONTROL && length == 9){ 2470 switch (channel->mode){ 2471 case L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION: 2472 if (channel->ertm_mandatory){ 2473 // ?? 2474 } else { 2475 // On 'Reject - Unacceptable Parameters' to our optional ERTM request, fall back to BASIC mode 2476 if (result == L2CAP_CONF_RESULT_UNACCEPTABLE_PARAMETERS){ | 2068 } 2069 btstack_memory_l2cap_channel_free(channel); 2070} 2071#endif 2072 2073#ifdef ENABLE_LE_DATA_CHANNELS 2074static void l2cap_handle_hci_le_disconnect_event(l2cap_channel_t * channel){ 2075 if (l2cap_send_open_failed_on_hci_disconnect(channel)){ --- 409 unchanged lines hidden (view full) --- 2485 if (option_type == L2CAP_CONFIG_OPTION_TYPE_RETRANSMISSION_AND_FLOW_CONTROL && length == 9){ 2486 switch (channel->mode){ 2487 case L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION: 2488 if (channel->ertm_mandatory){ 2489 // ?? 2490 } else { 2491 // On 'Reject - Unacceptable Parameters' to our optional ERTM request, fall back to BASIC mode 2492 if (result == L2CAP_CONF_RESULT_UNACCEPTABLE_PARAMETERS){ |
2493 l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_ERTM_BUFFER_RELEASED); |
|
2477 channel->mode = L2CAP_CHANNEL_MODE_BASIC; 2478 } 2479 } 2480 break; 2481 case L2CAP_CHANNEL_MODE_BASIC: 2482 if (result == L2CAP_CONF_RESULT_UNACCEPTABLE_PARAMETERS){ 2483 // On 'Reject - Unacceptable Parameters' to our Basic mode request, disconnect 2484 channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST; --- 79 unchanged lines hidden (view full) --- 2564 case 1: 2565 // connection pending. get some coffee, but start the ERTX 2566 l2cap_start_ertx(channel); 2567 break; 2568 default: 2569 // channel closed 2570 channel->state = L2CAP_STATE_CLOSED; 2571 // map l2cap connection response result to BTstack status enumeration | 2494 channel->mode = L2CAP_CHANNEL_MODE_BASIC; 2495 } 2496 } 2497 break; 2498 case L2CAP_CHANNEL_MODE_BASIC: 2499 if (result == L2CAP_CONF_RESULT_UNACCEPTABLE_PARAMETERS){ 2500 // On 'Reject - Unacceptable Parameters' to our Basic mode request, disconnect 2501 channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST; --- 79 unchanged lines hidden (view full) --- 2581 case 1: 2582 // connection pending. get some coffee, but start the ERTX 2583 l2cap_start_ertx(channel); 2584 break; 2585 default: 2586 // channel closed 2587 channel->state = L2CAP_STATE_CLOSED; 2588 // map l2cap connection response result to BTstack status enumeration |
2572 l2cap_report_channel_open_failed(channel, L2CAP_CONNECTION_RESPONSE_RESULT_SUCCESSFUL + result); | 2589 l2cap_handle_channel_open_failed(channel, L2CAP_CONNECTION_RESPONSE_RESULT_SUCCESSFUL + result); |
2573 2574 // drop link key if security block 2575 if (L2CAP_CONNECTION_RESPONSE_RESULT_SUCCESSFUL + result == L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_SECURITY){ 2576 gap_drop_link_key_for_bd_addr(channel->address); 2577 } 2578 2579 // discard channel 2580 btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel); --- 149 unchanged lines hidden (view full) --- 2730 if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue; 2731 if (channel->con_handle != handle) continue; 2732 // bail if ERTM was requested but is not supported 2733 if ((channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION) && ((connection->l2cap_state.extended_feature_mask & 0x08) == 0)){ 2734 if (channel->ertm_mandatory){ 2735 // channel closed 2736 channel->state = L2CAP_STATE_CLOSED; 2737 // map l2cap connection response result to BTstack status enumeration | 2590 2591 // drop link key if security block 2592 if (L2CAP_CONNECTION_RESPONSE_RESULT_SUCCESSFUL + result == L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_SECURITY){ 2593 gap_drop_link_key_for_bd_addr(channel->address); 2594 } 2595 2596 // discard channel 2597 btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel); --- 149 unchanged lines hidden (view full) --- 2747 if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue; 2748 if (channel->con_handle != handle) continue; 2749 // bail if ERTM was requested but is not supported 2750 if ((channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION) && ((connection->l2cap_state.extended_feature_mask & 0x08) == 0)){ 2751 if (channel->ertm_mandatory){ 2752 // channel closed 2753 channel->state = L2CAP_STATE_CLOSED; 2754 // map l2cap connection response result to BTstack status enumeration |
2738 l2cap_report_channel_open_failed(channel, L2CAP_CONNECTION_RESPONSE_RESULT_ERTM_NOT_SUPPORTED); | 2755 l2cap_handle_channel_open_failed(channel, L2CAP_CONNECTION_RESPONSE_RESULT_ERTM_NOT_SUPPORTED); |
2739 // discard channel 2740 btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel); 2741 btstack_memory_l2cap_channel_free(channel); 2742 continue; 2743 } else { 2744 // fallback to Basic mode | 2756 // discard channel 2757 btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel); 2758 btstack_memory_l2cap_channel_free(channel); 2759 continue; 2760 } else { 2761 // fallback to Basic mode |
2762 l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_ERTM_BUFFER_RELEASED); |
|
2745 channel->mode = L2CAP_CHANNEL_MODE_BASIC; 2746 } 2747 } 2748 // start connecting 2749 if (channel->state == L2CAP_STATE_WAIT_OUTGOING_EXTENDED_FEATURES){ 2750 channel->state = L2CAP_STATE_WILL_SEND_CONNECTION_REQUEST; 2751 } 2752 // respond to connection request --- 695 unchanged lines hidden (view full) --- 3448 if (!channel) return; 3449 channel->packet_handler = the_packet_handler; 3450} 3451 3452#ifdef ENABLE_CLASSIC 3453// finalize closed channel - l2cap_handle_disconnect_request & DISCONNECTION_RESPONSE 3454void l2cap_finialize_channel_close(l2cap_channel_t * channel){ 3455 channel->state = L2CAP_STATE_CLOSED; | 2763 channel->mode = L2CAP_CHANNEL_MODE_BASIC; 2764 } 2765 } 2766 // start connecting 2767 if (channel->state == L2CAP_STATE_WAIT_OUTGOING_EXTENDED_FEATURES){ 2768 channel->state = L2CAP_STATE_WILL_SEND_CONNECTION_REQUEST; 2769 } 2770 // respond to connection request --- 695 unchanged lines hidden (view full) --- 3466 if (!channel) return; 3467 channel->packet_handler = the_packet_handler; 3468} 3469 3470#ifdef ENABLE_CLASSIC 3471// finalize closed channel - l2cap_handle_disconnect_request & DISCONNECTION_RESPONSE 3472void l2cap_finialize_channel_close(l2cap_channel_t * channel){ 3473 channel->state = L2CAP_STATE_CLOSED; |
3456 l2cap_emit_channel_closed(channel); | 3474 l2cap_handle_channel_closed(channel); |
3457 // discard channel 3458 l2cap_stop_rtx(channel); 3459 btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel); 3460 btstack_memory_l2cap_channel_free(channel); 3461} 3462#endif 3463 3464#ifdef L2CAP_USES_CHANNELS --- 391 unchanged lines hidden --- | 3475 // discard channel 3476 l2cap_stop_rtx(channel); 3477 btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel); 3478 btstack_memory_l2cap_channel_free(channel); 3479} 3480#endif 3481 3482#ifdef L2CAP_USES_CHANNELS --- 391 unchanged lines hidden --- |