From 5dcb6ca76171651fe69c23e08ff6c6f87a646b79 Mon Sep 17 00:00:00 2001
From: Matthias Ringwald <matthias@ringwald.ch>
Date: Wed, 3 Oct 2018 17:19:22 +0200
Subject: [PATCH] Revert "l2cap ertm: allow SDU of szie MPS in first packet
 that contains L2CAP SDU Length"

This reverts commit f6fb536452573216b8c12692b87b78ef0221df9e.
---
 CHANGELOG.md                 |  1 -
 example/le_streamer.c        |  2 +-
 example/le_streamer_client.c |  9 ++++-----
 example/pbap_client_demo.c   |  2 +-
 example/sdp_rfcomm_query.c   |  2 +-
 src/classic/goep_client.c    | 14 +++++++-------
 src/classic/pbap_client.c    |  9 +--------
 src/l2cap.c                  | 25 +++++--------------------
 8 files changed, 20 insertions(+), 44 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index d5ed2ce37..4063b8d4c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,7 +11,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
 
 ### Fixed
 - L2CAP: fix issue with outgoing connection before read remote supported complete when other channels exist
-- L2CAP ERTM: allow SDU of szie MPS in first packet that contains L2CAP SDU Length
 - HFP: decline incoming RFCOMM connection after outgoing connection was started
 
 ## Changes September 2018
diff --git a/example/le_streamer.c b/example/le_streamer.c
index 4108f1704..5e002f1ac 100644
--- a/example/le_streamer.c
+++ b/example/le_streamer.c
@@ -160,7 +160,7 @@ static void le_streamer_setup(void){
     uint8_t adv_type = 0;
     bd_addr_t null_addr;
     memset(null_addr, 0, 6);
-    gap_advertisements_set_params(adv_int_min, adv_int_max, adv_type, 0, null_addr, 1, 0x00);
+    gap_advertisements_set_params(adv_int_min, adv_int_max, adv_type, 0, null_addr, 0x07, 0x00);
     gap_advertisements_set_data(adv_data_len, (uint8_t*) adv_data);
     gap_advertisements_enable(1);
 
diff --git a/example/le_streamer_client.c b/example/le_streamer_client.c
index f109a5003..57d0ba8b3 100644
--- a/example/le_streamer_client.c
+++ b/example/le_streamer_client.c
@@ -221,7 +221,7 @@ static void handle_gatt_client_event(uint8_t packet_type, uint16_t channel, uint
                     // service query complete, look for characteristic
                     state = TC_W4_CHARACTERISTIC_RX_RESULT;
                     printf("Search for LE Streamer RX characteristic.\n");
-                    gatt_client_discover_characteristics_for_service_by_uuid16(handle_gatt_client_event, connection_handle, &le_streamer_service, 0xff01);
+                    gatt_client_discover_characteristics_for_service_by_uuid128(handle_gatt_client_event, connection_handle, &le_streamer_service, le_streamer_characteristic_rx_uuid);
                     break;
                 default:
                     break;
@@ -240,7 +240,7 @@ static void handle_gatt_client_event(uint8_t packet_type, uint16_t channel, uint
                         break;  
                     } 
                     // rx characteristiic found, look for tx characteristic
-                    state = TC_W4_CHARACTERISTIC_RX_RESULT;
+                    state = TC_W4_CHARACTERISTIC_TX_RESULT;
                     printf("Search for LE Streamer TX characteristic.\n");
                     gatt_client_discover_characteristics_for_service_by_uuid128(handle_gatt_client_event, connection_handle, &le_streamer_service, le_streamer_characteristic_tx_uuid);
                     break;
@@ -362,7 +362,7 @@ static void hci_event_handler(uint8_t packet_type, uint16_t channel, uint8_t *pa
         case GAP_EVENT_ADVERTISING_REPORT:
             if (state != TC_W4_SCAN_RESULT) return;
             // check name in advertisement
-            if (!advertisement_report_contains_name("ESP_GATTS_DEMO", packet)) return;
+            if (!advertisement_report_contains_name("LE Streamer", packet)) return;
             // store address and type
             gap_event_advertising_report_get_address(packet, le_streamer_addr);
             le_streamer_addr_type = gap_event_advertising_report_get_address_type(packet);
@@ -385,8 +385,7 @@ static void hci_event_handler(uint8_t packet_type, uint16_t channel, uint8_t *pa
             // query primary services
             printf("Search for LE Streamer service.\n");
             state = TC_W4_SERVICE_RESULT;
-            gatt_client_discover_primary_services_by_uuid16(handle_gatt_client_event, connection_handle, 0x00ff);
-            // gatt_client_discover_primary_services_by_uuid128(handle_gatt_client_event, connection_handle, le_streamer_service_uuid);
+            gatt_client_discover_primary_services_by_uuid128(handle_gatt_client_event, connection_handle, le_streamer_service_uuid);
             break;
         case HCI_EVENT_DISCONNECTION_COMPLETE:
             // unregister listener
diff --git a/example/pbap_client_demo.c b/example/pbap_client_demo.c
index be3df5861..2366672da 100644
--- a/example/pbap_client_demo.c
+++ b/example/pbap_client_demo.c
@@ -72,7 +72,7 @@ static bd_addr_t    remote_addr;
 // Nexus 7 "30-85-A9-54-2E-78"
 // iPhone SE "BC:EC:5D:E6:15:03"
 // PTS "001BDC080AA5"
-static  char * remote_addr_string = "001BDC080AA5";
+static  char * remote_addr_string = "BC:EC:5D:E6:15:03";
 
 static char * phone_number = "911";
 
diff --git a/example/sdp_rfcomm_query.c b/example/sdp_rfcomm_query.c
index 532345b65..5532a1db9 100644
--- a/example/sdp_rfcomm_query.c
+++ b/example/sdp_rfcomm_query.c
@@ -59,7 +59,7 @@
 static void handle_query_rfcomm_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
 
 // static bd_addr_t remote = {0x04,0x0C,0xCE,0xE4,0x85,0xD3};
-static bd_addr_t remote = {0x00, 0x1A, 0x7D, 0xDA, 0x71, 0x01};
+static bd_addr_t remote = {0x84, 0x38, 0x35, 0x65, 0xD1, 0x15};
 
 static uint8_t  service_index = 0;
 static uint8_t  channel_nr[10];
diff --git a/src/classic/goep_client.c b/src/classic/goep_client.c
index adcd66c27..b11b2fb7c 100644
--- a/src/classic/goep_client.c
+++ b/src/classic/goep_client.c
@@ -60,7 +60,7 @@
 // goep_client.c
 //
 
-#define ENABLE_GOEP_L2CAP
+// #define ENABLE_GOEP_L2CAP
 
 typedef enum {
     GOEP_INIT,
@@ -97,15 +97,15 @@ static const unsigned int attribute_value_buffer_size = sizeof(attribute_value);
 static uint8_t goep_packet_buffer[100];
 
 #ifdef ENABLE_GOEP_L2CAP
-static uint8_t ertm_buffer[2000];
+static uint8_t ertm_buffer[1000];
 static l2cap_ertm_config_t ertm_config = {
     1,  // ertm mandatory
     2,  // max transmit, some tests require > 1
     2000,
     12000,
-    250,    // l2cap ertm mtu
-    2,
-    2,
+    144,    // l2cap ertm mtu
+    4,
+    4,
 };
 #endif
 
@@ -376,7 +376,7 @@ static void goep_client_add_variable_header(uint16_t goep_cid, uint8_t header_ty
     goep_client_packet_append(header_data, header_data_length);
 }
 
-#if 1
+#if 0
 static void goep_client_add_byte_header(uint16_t goep_cid, uint8_t header_type, uint8_t value){
     UNUSED(goep_cid);
     uint8_t header[2];
@@ -481,7 +481,7 @@ void goep_client_create_disconnect_request(uint16_t goep_cid){
 void goep_client_create_get_request(uint16_t goep_cid){
     goep_client_packet_init(goep_cid, OBEX_OPCODE_GET | OBEX_OPCODE_FINAL_BIT_MASK);
     goep_client_packet_add_connection_id(goep_cid);
-    goep_client_add_byte_header(goep_cid, OBEX_HEADER_SINGLE_RESPONSE_MODE, 0x01);
+    // goep_client_add_byte_header(goep_cid, OBEX_HEADER_SINGLE_RESPONSE_MODE, 0x01);
 }
 
 void goep_client_create_set_path_request(uint16_t goep_cid, uint8_t flags){
diff --git a/src/classic/pbap_client.c b/src/classic/pbap_client.c
index da80393c0..521bc9ab4 100644
--- a/src/classic/pbap_client.c
+++ b/src/classic/pbap_client.c
@@ -279,8 +279,8 @@ static void pbap_handle_can_send_now(void){
         case PBAP_W2_PULL_PHONEBOOK:
         case PBAP_W2_GET_PHONEBOOK_SIZE:
             goep_client_create_get_request(pbap_client->goep_cid);
-            goep_client_add_header_name(pbap_client->goep_cid, "telecom/pb.vcf");
             goep_client_add_header_type(pbap_client->goep_cid, pbap_phonebook_type);
+            goep_client_add_header_name(pbap_client->goep_cid, pbap_phonebook_name);
             if (pbap_client->state == PBAP_W2_GET_PHONEBOOK_SIZE){
                 // Regular TLV wih 1-byte len
                 application_parameters[0] = PBAP_APPLICATION_PARAMETER_MAX_LIST_COUNT;
@@ -290,13 +290,6 @@ static void pbap_handle_can_send_now(void){
                 // state
                 pbap_client->state = PBAP_W4_GET_PHONEBOOK_SIZE_COMPLETE;
             } else {
-#if 1
-                // Regular TLV wih 1-byte len
-                application_parameters[0] = PBAP_APPLICATION_PARAMETER_MAX_LIST_COUNT;
-                application_parameters[1] = 2;
-                big_endian_store_16(application_parameters, 2, 0xffff);
-                goep_client_add_header_application_parameters(pbap_client->goep_cid, 4, &application_parameters[0]);
-#endif
                 // state
                 pbap_client->state = PBAP_W4_PHONEBOOK;
             }
diff --git a/src/l2cap.c b/src/l2cap.c
index 4de7d8698..48ac96dec 100644
--- a/src/l2cap.c
+++ b/src/l2cap.c
@@ -3200,26 +3200,11 @@ static void l2cap_acl_classic_handler(hci_con_handle_t handle, uint8_t *packet,
                         }
 
                         // get SDU
-                        const uint8_t * payload_data = &packet[COMPLETE_L2CAP_HEADER+2];
-                        uint16_t        payload_len  = size-(COMPLETE_L2CAP_HEADER+2+fcs_size);
+                        const uint8_t * sdu_data = &packet[COMPLETE_L2CAP_HEADER+2];
+                        uint16_t        sdu_len  = size-(COMPLETE_L2CAP_HEADER+2+fcs_size);
 
                         // assert SDU size is smaller or equal to our buffers
-                        uint16_t max_payload_size = 0;
-                        switch (sar){
-                            case L2CAP_SEGMENTATION_AND_REASSEMBLY_UNSEGMENTED_L2CAP_SDU:
-                            case L2CAP_SEGMENTATION_AND_REASSEMBLY_START_OF_L2CAP_SDU:
-                                // SDU Length + MPS
-                                max_payload_size = l2cap_channel->local_mps + 2;
-                                break;
-                            case L2CAP_SEGMENTATION_AND_REASSEMBLY_CONTINUATION_OF_L2CAP_SDU:
-                            case L2CAP_SEGMENTATION_AND_REASSEMBLY_END_OF_L2CAP_SDU:
-                                max_payload_size = l2cap_channel->local_mps;
-                                break;
-                        }
-                        if (payload_len > max_payload_size){
-                            log_info("payload len %u > max payload %u -> drop packet", payload_len, max_payload_size);
-                            break;
-                        }
+                        if (sdu_len > l2cap_channel->local_mps) break;
 
                         // check ordering
                         if (l2cap_channel->expected_tx_seq == tx_seq){
@@ -3228,7 +3213,7 @@ static void l2cap_acl_classic_handler(hci_con_handle_t handle, uint8_t *packet,
                             l2cap_channel->req_seq         = l2cap_channel->expected_tx_seq;
  
                             // process SDU
-                            l2cap_ertm_handle_in_sequence_sdu(l2cap_channel, sar, payload_data, payload_len);
+                            l2cap_ertm_handle_in_sequence_sdu(l2cap_channel, sar, sdu_data, sdu_len);
 
                             // process stored segments
                             while (1){
@@ -3258,7 +3243,7 @@ static void l2cap_acl_classic_handler(hci_con_handle_t handle, uint8_t *packet,
                             int delta = (tx_seq - l2cap_channel->expected_tx_seq) & 0x3f;
                             if (delta < 2){
                                 // store segment
-                                l2cap_ertm_handle_out_of_sequence_sdu(l2cap_channel, sar, delta, payload_data, payload_len);
+                                l2cap_ertm_handle_out_of_sequence_sdu(l2cap_channel, sar, delta, sdu_data, sdu_len);
 
                                 log_info("Received unexpected frame TxSeq %u but expected %u -> send S-SREJ", tx_seq, l2cap_channel->expected_tx_seq);
                                 l2cap_channel->send_supervisor_frame_selective_reject = 1;