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 ---