gatt_client.c (1aa9e3e881e80275d21a99a71d9aa1ff99a8772b) | gatt_client.c (ac4c2bc67db821e66add0ae52f56e15328e5d1e8) |
---|---|
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 --- 1405 unchanged lines hidden (view full) --- 1414 gatt_client_run(); 1415} 1416 1417static void gatt_client_handle_att_response(gatt_client_t * gatt_client, uint8_t * packet, uint16_t size) { 1418 uint8_t error_code; 1419 switch (packet[0]) { 1420 case ATT_EXCHANGE_MTU_RESPONSE: { 1421 if (size < 3u) break; | 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 --- 1405 unchanged lines hidden (view full) --- 1414 gatt_client_run(); 1415} 1416 1417static void gatt_client_handle_att_response(gatt_client_t * gatt_client, uint8_t * packet, uint16_t size) { 1418 uint8_t error_code; 1419 switch (packet[0]) { 1420 case ATT_EXCHANGE_MTU_RESPONSE: { 1421 if (size < 3u) break; |
1422 bool update_att_mtu = true; |
|
1422 uint16_t remote_rx_mtu = little_endian_read_16(packet, 1); 1423 uint16_t local_rx_mtu = l2cap_max_le_mtu(); | 1423 uint16_t remote_rx_mtu = little_endian_read_16(packet, 1); 1424 uint16_t local_rx_mtu = l2cap_max_le_mtu(); |
1425#ifdef ENABLE_GATT_OVER_CLASSIC 1426 if (gatt_client->l2cap_psm != 0){ 1427 local_rx_mtu = gatt_client->mtu; 1428 } else { 1429 update_att_mtu = false; 1430 } 1431#endif |
|
1424 uint16_t mtu = (remote_rx_mtu < local_rx_mtu) ? remote_rx_mtu : local_rx_mtu; 1425 1426 // set gatt client mtu 1427 gatt_client->mtu = mtu; 1428 gatt_client->mtu_state = MTU_EXCHANGED; 1429 | 1432 uint16_t mtu = (remote_rx_mtu < local_rx_mtu) ? remote_rx_mtu : local_rx_mtu; 1433 1434 // set gatt client mtu 1435 gatt_client->mtu = mtu; 1436 gatt_client->mtu_state = MTU_EXCHANGED; 1437 |
1430 // set per connection mtu state - for fixed channel 1431 hci_connection_t *hci_connection = hci_connection_for_handle(gatt_client->con_handle); 1432 hci_connection->att_connection.mtu = gatt_client->mtu; 1433 hci_connection->att_connection.mtu_exchanged = true; 1434 | 1438 if (update_att_mtu){ 1439 // set per connection mtu state - for fixed channel 1440 hci_connection_t *hci_connection = hci_connection_for_handle(gatt_client->con_handle); 1441 hci_connection->att_connection.mtu = gatt_client->mtu; 1442 hci_connection->att_connection.mtu_exchanged = true; 1443 } |
1435 emit_gatt_mtu_exchanged_result_event(gatt_client, gatt_client->mtu); 1436 break; 1437 } 1438 case ATT_READ_BY_GROUP_TYPE_RESPONSE: 1439 switch (gatt_client->gatt_client_state) { 1440 case P_W4_SERVICE_QUERY_RESULT: 1441 report_gatt_services(gatt_client, packet, size); 1442 trigger_next_service_query(gatt_client, get_last_result_handle_from_service_list(packet, size)); --- 1250 unchanged lines hidden (view full) --- 2693 switch (packet_type){ 2694 case HCI_EVENT_PACKET: 2695 switch (hci_event_packet_get_type(packet)) { 2696 case L2CAP_EVENT_CHANNEL_OPENED: 2697 status = l2cap_event_channel_opened_get_status(packet); 2698 gatt_client = gatt_client_get_context_for_l2cap_cid(l2cap_event_channel_opened_get_local_cid(packet)); 2699 btstack_assert(gatt_client != NULL); 2700 gatt_client->con_handle = l2cap_event_channel_opened_get_handle(packet); | 1444 emit_gatt_mtu_exchanged_result_event(gatt_client, gatt_client->mtu); 1445 break; 1446 } 1447 case ATT_READ_BY_GROUP_TYPE_RESPONSE: 1448 switch (gatt_client->gatt_client_state) { 1449 case P_W4_SERVICE_QUERY_RESULT: 1450 report_gatt_services(gatt_client, packet, size); 1451 trigger_next_service_query(gatt_client, get_last_result_handle_from_service_list(packet, size)); --- 1250 unchanged lines hidden (view full) --- 2702 switch (packet_type){ 2703 case HCI_EVENT_PACKET: 2704 switch (hci_event_packet_get_type(packet)) { 2705 case L2CAP_EVENT_CHANNEL_OPENED: 2706 status = l2cap_event_channel_opened_get_status(packet); 2707 gatt_client = gatt_client_get_context_for_l2cap_cid(l2cap_event_channel_opened_get_local_cid(packet)); 2708 btstack_assert(gatt_client != NULL); 2709 gatt_client->con_handle = l2cap_event_channel_opened_get_handle(packet); |
2710 gatt_client->mtu = l2cap_event_channel_opened_get_remote_mtu(packet); |
|
2701 gatt_client_classic_handle_connected(gatt_client, status); 2702 case L2CAP_EVENT_CHANNEL_CLOSED: 2703 // TODO: 2704 break; 2705 default: 2706 break; 2707 } 2708 break; 2709 case L2CAP_DATA_PACKET: 2710 gatt_client = gatt_client_get_context_for_l2cap_cid(channel); | 2711 gatt_client_classic_handle_connected(gatt_client, status); 2712 case L2CAP_EVENT_CHANNEL_CLOSED: 2713 // TODO: 2714 break; 2715 default: 2716 break; 2717 } 2718 break; 2719 case L2CAP_DATA_PACKET: 2720 gatt_client = gatt_client_get_context_for_l2cap_cid(channel); |
2711 gatt_client = gatt_client_get_context_for_l2cap_cid(l2cap_event_channel_opened_get_local_cid(packet)); | |
2712 btstack_assert(gatt_client != NULL); 2713 log_info("l2cap data received"); 2714 break; 2715 } 2716} 2717 2718static void gatt_client_handle_sdp_client_query_attribute_value(gatt_client_t * connection, uint8_t *packet){ 2719 des_iterator_t des_list_it; --- 90 unchanged lines hidden (view full) --- 2810 if (gatt_client == NULL){ 2811 return ERROR_CODE_MEMORY_CAPACITY_EXCEEDED; 2812 } 2813 // init state 2814 gatt_client->con_handle = HCI_CON_HANDLE_INVALID; 2815 memcpy(gatt_client->addr, addr, 6); 2816 gatt_client->mtu = ATT_DEFAULT_MTU; 2817 gatt_client->security_level = LEVEL_0; | 2721 btstack_assert(gatt_client != NULL); 2722 log_info("l2cap data received"); 2723 break; 2724 } 2725} 2726 2727static void gatt_client_handle_sdp_client_query_attribute_value(gatt_client_t * connection, uint8_t *packet){ 2728 des_iterator_t des_list_it; --- 90 unchanged lines hidden (view full) --- 2819 if (gatt_client == NULL){ 2820 return ERROR_CODE_MEMORY_CAPACITY_EXCEEDED; 2821 } 2822 // init state 2823 gatt_client->con_handle = HCI_CON_HANDLE_INVALID; 2824 memcpy(gatt_client->addr, addr, 6); 2825 gatt_client->mtu = ATT_DEFAULT_MTU; 2826 gatt_client->security_level = LEVEL_0; |
2818 if (gatt_client_mtu_exchange_enabled){ 2819 gatt_client->mtu_state = SEND_MTU_EXCHANGE; 2820 } else { 2821 gatt_client->mtu_state = MTU_AUTO_EXCHANGE_DISABLED; 2822 } | 2827 gatt_client->mtu_state = MTU_AUTO_EXCHANGE_DISABLED; |
2823 gatt_client->gatt_client_state = P_W2_SDP_QUERY; 2824 gatt_client->sdp_query_request.callback = &gatt_client_classic_sdp_start; 2825 gatt_client->sdp_query_request.context = gatt_client; 2826 gatt_client->callback = callback; 2827 btstack_linked_list_add(&gatt_client_connections, (btstack_linked_item_t*)gatt_client); 2828 sdp_client_register_query_callback(&gatt_client->sdp_query_request); 2829 return ERROR_CODE_COMMAND_DISALLOWED; 2830} --- 21 unchanged lines hidden --- | 2828 gatt_client->gatt_client_state = P_W2_SDP_QUERY; 2829 gatt_client->sdp_query_request.callback = &gatt_client_classic_sdp_start; 2830 gatt_client->sdp_query_request.context = gatt_client; 2831 gatt_client->callback = callback; 2832 btstack_linked_list_add(&gatt_client_connections, (btstack_linked_item_t*)gatt_client); 2833 sdp_client_register_query_callback(&gatt_client->sdp_query_request); 2834 return ERROR_CODE_COMMAND_DISALLOWED; 2835} --- 21 unchanged lines hidden --- |