From c6d256e3c68b79adf35623c8166032e64038039c Mon Sep 17 00:00:00 2001 From: liuhan Date: Wed, 20 Mar 2024 19:17:15 +0800 Subject: [PATCH] fix(example): fix host example have invalid checksum --- .../components/src/esp_host_frame.c | 61 ++++++++++--------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/examples/esp_zigbee_host/components/src/esp_host_frame.c b/examples/esp_zigbee_host/components/src/esp_host_frame.c index b4374db..f5e3ef3 100644 --- a/examples/esp_zigbee_host/components/src/esp_host_frame.c +++ b/examples/esp_zigbee_host/components/src/esp_host_frame.c @@ -47,35 +47,40 @@ esp_err_t esp_host_frame_input(const void *buffer, uint16_t len) break; } - /* Packet Header */ - esp_host_header_t *host_header = (esp_host_header_t *)output; - uint8_t *payload = NULL; - - if (host_header->len + data_head_len > outlen) { - ESP_LOGE(TAG, "Invalid packet len %d, expect %d", outlen, host_header->len + data_head_len); - ESP_LOG_BUFFER_HEX_LEVEL(TAG, output, outlen, ESP_LOG_ERROR); - ret = ESP_ERR_INVALID_SIZE; - break; - } - - /* CheckSum */ - uint16_t *checksum = (uint16_t *)(output + data_head_len + host_header->len); - uint16_t crc_val = esp_crc16_le(UINT16_MAX, output, (outlen - sizeof(uint16_t))); - if (crc_val != (*checksum)) { - ESP_LOGE(TAG, "Invalid checksum %02x, expect %02x", *checksum, crc_val); - ESP_LOG_BUFFER_HEX_LEVEL(TAG, output, outlen, ESP_LOG_ERROR); - ret = ESP_ERR_INVALID_CRC; - break; - } - - if (host_header->len != 0) { - payload = (uint8_t *)output + data_head_len; + uint8_t offerset = 0; + while (offerset != outlen) { + /* Packet Header */ + esp_host_header_t *host_header = (esp_host_header_t *)(output + offerset); + uint8_t *payload = NULL; + + if (host_header->len + data_head_len > outlen) { + ESP_LOGE(TAG, "Invalid packet len %d, expect %d", outlen, host_header->len + data_head_len); + ESP_LOG_BUFFER_HEX_LEVEL(TAG, output, outlen, ESP_LOG_ERROR); + ret = ESP_ERR_INVALID_SIZE; + break; + } + + /* CheckSum */ + uint16_t *checksum = (uint16_t *)(output + offerset + data_head_len + host_header->len); + uint16_t crc_val = esp_crc16_le(UINT16_MAX, output + offerset, data_head_len + host_header->len); + if (crc_val != (*checksum)) { + ESP_LOGE(TAG, "Invalid multiple checksum %02x, expect %02x", *checksum, crc_val); + ESP_LOG_BUFFER_HEX_LEVEL(TAG, output + offerset, (data_head_len + host_header->len + sizeof(uint16_t)), ESP_LOG_ERROR); + ret = ESP_ERR_INVALID_CRC; + break; + } + + if (host_header->len != 0) { + payload = (uint8_t *)output + offerset + data_head_len; + } + + ESP_LOG_BUFFER_HEX_LEVEL(TAG, output + offerset, (data_head_len + host_header->len + sizeof(uint16_t)), ESP_LOG_INFO); + + /* Packet Payload */ + ret = esp_host_zb_input(host_header, payload, host_header->len); + + offerset += (data_head_len + host_header->len + sizeof(uint16_t)); } - - ESP_LOG_BUFFER_HEX_LEVEL(TAG, output, outlen, ESP_LOG_INFO); - - /* Packet Payload */ - ret = esp_host_zb_input(host_header, payload, host_header->len); } while(0); if (output) {