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