mesh: replace network_header in mesh_segmented_pdu by individual fields

This commit is contained in:
Matthias Ringwald 2020-03-27 21:37:49 +01:00
parent a249589839
commit 7cb45abf1b
3 changed files with 38 additions and 46 deletions

View File

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

View File

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

View File

@ -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();
}