From 7cb45abf1be53a097a65330bfdd8b1ed7a2600a1 Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Fri, 27 Mar 2020 21:37:49 +0100 Subject: [PATCH] mesh: replace network_header in mesh_segmented_pdu by individual fields --- src/mesh/mesh_lower_transport.c | 19 +++++++++------- src/mesh/mesh_network.h | 25 ++++++--------------- src/mesh/mesh_upper_transport.c | 40 ++++++++++++++++----------------- 3 files changed, 38 insertions(+), 46 deletions(-) diff --git a/src/mesh/mesh_lower_transport.c b/src/mesh/mesh_lower_transport.c index 1338c6251..be23634e7 100644 --- a/src/mesh/mesh_lower_transport.c +++ b/src/mesh/mesh_lower_transport.c @@ -89,22 +89,22 @@ static void mesh_lower_transport_report_segments_as_processed(mesh_segmented_pdu } uint16_t mesh_message_nid(mesh_segmented_pdu_t * message_pdu){ - return message_pdu->network_header[0] & 0x7f; + return message_pdu->ivi_nid & 0x7f; } uint16_t mesh_message_ctl(mesh_segmented_pdu_t * message_pdu){ - return message_pdu->network_header[1] >> 7; + return message_pdu->ctl_ttl >> 7; } static uint16_t mesh_message_ttl(mesh_segmented_pdu_t * message_pdu){ - return message_pdu->network_header[1] & 0x7f; + return message_pdu->ctl_ttl & 0x7f; } static uint32_t mesh_message_seq(mesh_segmented_pdu_t * message_pdu){ - return big_endian_read_24(message_pdu->network_header, 2); + return message_pdu->seq; } static uint16_t mesh_message_src(mesh_segmented_pdu_t * message_pdu){ - return big_endian_read_16(message_pdu->network_header, 5); + return message_pdu->src; } static uint16_t mesh_message_dest(mesh_segmented_pdu_t * message_pdu){ - return big_endian_read_16(message_pdu->network_header, 7); + return message_pdu->dst; } static uint32_t mesh_message_seq_zero(mesh_segmented_pdu_t * message_pdu){ return message_pdu->seq_zero; @@ -479,9 +479,12 @@ static mesh_segmented_pdu_t * mesh_lower_transport_pdu_for_segmented_message(mes if (!pdu) return NULL; // cache network pdu header - (void)memcpy(pdu->network_header, network_pdu->data, 9); + pdu->ivi_nid = network_pdu->data[0]; + pdu->ctl_ttl = network_pdu->data[1]; + pdu->src = big_endian_read_16(network_pdu->data, 5); + pdu->dst = big_endian_read_16(network_pdu->data, 7); // store lower 24 bit of SeqAuth for App / Device Nonce - big_endian_store_24(pdu->network_header, 2, seq_auth); + pdu->seq = seq_auth; // store meta data in new pdu pdu->netkey_index = network_pdu->netkey_index; diff --git a/src/mesh/mesh_network.h b/src/mesh/mesh_network.h index 542815e99..ae9e64744 100644 --- a/src/mesh/mesh_network.h +++ b/src/mesh/mesh_network.h @@ -109,19 +109,14 @@ typedef struct mesh_network_pdu { #define MESH_TRANSPORT_FLAG_SEQ_RESERVED 1 #define MESH_TRANSPORT_FLAG_CONTROL 2 -typedef struct { - // generic pdu header - mesh_pdu_t pdu_header; - // meta data transport layer - uint16_t appkey_index; - // MESH_TRANSPORT_FLAG - uint16_t flags; - // pdu segment - mesh_network_pdu_t * segment; -} mesh_unsegmented_pdu_t; - typedef struct { mesh_pdu_t pdu_header; + // network header + uint8_t ivi_nid; + uint8_t ctl_ttl; + uint16_t src; + uint16_t dst; + uint32_t seq; // rx/tx: acknowledgement timer / segment transmission timer btstack_timer_source_t acknowledgement_timer; @@ -137,8 +132,6 @@ typedef struct { uint8_t transmic_len; // akf - aid for access, opcode for control uint8_t akf_aid_control; - // network pdu header - uint8_t network_header[9]; // MESH_TRANSPORT_FLAG uint16_t flags; // acknowledgement timer active @@ -203,15 +196,11 @@ typedef struct { typedef struct { // generic pdu header mesh_pdu_t pdu_header; - // ivi_nid + // network header uint8_t ivi_nid; - // ctl_ttl uint8_t ctl_ttl; - // src uint16_t src; - // dst uint16_t dst; - // seq uint32_t seq; // meta data network layer uint16_t netkey_index; diff --git a/src/mesh/mesh_upper_transport.c b/src/mesh/mesh_upper_transport.c index 538691d86..4ebab12e1 100644 --- a/src/mesh/mesh_upper_transport.c +++ b/src/mesh/mesh_upper_transport.c @@ -541,11 +541,11 @@ static void mesh_upper_transport_send_access_segmented(mesh_upper_transport_pdu_ // setup segmented_pdu header // (void)memcpy(segmented_pdu->network_header, upper_pdu->network_header, 9); // TODO: use fields in mesh_segmented_pdu_t and setup network header in lower transport - segmented_pdu->network_header[0] = upper_pdu->ivi_nid; - segmented_pdu->network_header[1] = upper_pdu->ctl_ttl; - big_endian_store_24(segmented_pdu->network_header, 2, upper_pdu->seq); - big_endian_store_16(segmented_pdu->network_header, 5, upper_pdu->src); - big_endian_store_16(segmented_pdu->network_header, 7, upper_pdu->dst); + segmented_pdu->ivi_nid = upper_pdu->ivi_nid; + segmented_pdu->ctl_ttl = upper_pdu->ctl_ttl; + segmented_pdu->seq = upper_pdu->seq; + segmented_pdu->src = upper_pdu->src; + segmented_pdu->dst = upper_pdu->dst; // queue up upper_pdu->lower_pdu = (mesh_pdu_t *) segmented_pdu; @@ -722,11 +722,11 @@ static void mesh_upper_transport_send_segmented_control_pdu(mesh_upper_transport // setup segmented_pdu header // TODO: use fields in mesh_segmented_pdu_t and setup network header in lower transport - segmented_pdu->network_header[0] = upper_pdu->ivi_nid; - segmented_pdu->network_header[1] = upper_pdu->ctl_ttl; - big_endian_store_24(segmented_pdu->network_header, 2, upper_pdu->seq); - big_endian_store_16(segmented_pdu->network_header, 5, upper_pdu->src); - big_endian_store_16(segmented_pdu->network_header, 7, upper_pdu->dst); + segmented_pdu->ivi_nid = upper_pdu->ivi_nid; + segmented_pdu->ctl_ttl = upper_pdu->ctl_ttl; + segmented_pdu->seq = upper_pdu->seq; + segmented_pdu->src = upper_pdu->src; + segmented_pdu->dst = upper_pdu->dst; // queue up upper_pdu->lower_pdu = (mesh_pdu_t *) segmented_pdu; @@ -813,11 +813,11 @@ static void mesh_upper_transport_run(void){ incoming_control_pdu->len = message_pdu->len; incoming_control_pdu->netkey_index = message_pdu->netkey_index; incoming_control_pdu->akf_aid_control = message_pdu->akf_aid_control; - incoming_access_decrypted->ivi_nid = message_pdu->network_header[0]; - incoming_access_decrypted->ctl_ttl = message_pdu->network_header[1]; - incoming_access_decrypted->seq = big_endian_read_24(message_pdu->network_header, 2); - incoming_access_decrypted->src = big_endian_read_16(message_pdu->network_header, 5); - incoming_access_decrypted->dst = big_endian_read_16(message_pdu->network_header, 7); + incoming_access_decrypted->ivi_nid = message_pdu->ivi_nid; + incoming_access_decrypted->ctl_ttl = message_pdu->ctl_ttl; + incoming_access_decrypted->seq = message_pdu->seq; + incoming_access_decrypted->src = message_pdu->src; + incoming_access_decrypted->dst = message_pdu->dst; mesh_print_hex("Assembled payload", incoming_control_pdu->data, incoming_control_pdu->len); @@ -838,11 +838,11 @@ static void mesh_upper_transport_run(void){ incoming_access_decrypted->netkey_index = message_pdu->netkey_index; incoming_access_decrypted->transmic_len = message_pdu->transmic_len; incoming_access_decrypted->akf_aid_control = message_pdu->akf_aid_control; - incoming_access_decrypted->ivi_nid = message_pdu->network_header[0]; - incoming_access_decrypted->ctl_ttl = message_pdu->network_header[1]; - incoming_access_decrypted->seq = big_endian_read_24(message_pdu->network_header, 2); - incoming_access_decrypted->src = big_endian_read_16(message_pdu->network_header, 5); - incoming_access_decrypted->dst = big_endian_read_16(message_pdu->network_header, 7); + incoming_access_decrypted->ivi_nid = message_pdu->ivi_nid; + incoming_access_decrypted->ctl_ttl = message_pdu->ctl_ttl; + incoming_access_decrypted->seq = message_pdu->seq; + incoming_access_decrypted->src = message_pdu->src; + incoming_access_decrypted->dst = message_pdu->dst; mesh_upper_transport_process_access_message(); }