mesh: use mesh_network_pdu/unsegmented_control for unsegmented control

This commit is contained in:
Matthias Ringwald 2020-03-25 15:39:06 +01:00
parent 0da6acd083
commit 8ec600ff6d
3 changed files with 21 additions and 10 deletions

View File

@ -1110,10 +1110,10 @@ void mesh_network_encrypt_proxy_configuration_message(mesh_network_pdu_t * netwo
* @param dest
*/
void mesh_network_setup_pdu(mesh_network_pdu_t * network_pdu, uint16_t netkey_index, uint8_t nid, uint8_t ctl, uint8_t ttl, uint32_t seq, uint16_t src, uint16_t dest, const uint8_t * transport_pdu_data, uint8_t transport_pdu_len){
memset(network_pdu, 0, sizeof(mesh_network_pdu_t));
// set netkey_index
network_pdu->netkey_index = netkey_index;
// setup header
network_pdu->len = 0;
network_pdu->data[network_pdu->len++] = (mesh_get_iv_index_for_tx() << 7) | nid;
uint8_t ctl_ttl = (ctl << 7) | (ttl & 0x7f);
network_pdu->data[network_pdu->len++] = ctl_ttl;
@ -1126,6 +1126,8 @@ void mesh_network_setup_pdu(mesh_network_pdu_t * network_pdu, uint16_t netkey_in
(void)memcpy(&network_pdu->data[network_pdu->len], transport_pdu_data,
transport_pdu_len);
network_pdu->len += transport_pdu_len;
// zero rest of packet
memset(&network_pdu->data[network_pdu->len], 0, MESH_NETWORK_PAYLOAD_MAX - transport_pdu_len);
}
/*

View File

@ -116,8 +116,6 @@ static btstack_linked_list_t upper_transport_outgoing;
void mesh_upper_transport_send_access_pdu(mesh_pdu_t *pdu){
switch (pdu->pdu_type){
case MESH_PDU_TYPE_UNSEGMENTED:
case MESH_PDU_TYPE_ACCESS:
case MESH_PDU_TYPE_UPPER_SEGMENTED_ACCESS:
case MESH_PDU_TYPE_UPPER_UNSEGMENTED_ACCESS:
break;
@ -131,8 +129,15 @@ void mesh_upper_transport_send_access_pdu(mesh_pdu_t *pdu){
}
void mesh_upper_transport_send_control_pdu(mesh_pdu_t * pdu){
if (pdu->pdu_type == MESH_PDU_TYPE_NETWORK){
btstack_assert( ((mesh_network_pdu_t *) pdu)->len >= 9);
switch (pdu->pdu_type){
case MESH_PDU_TYPE_UPPER_SEGMENTED_CONTROL:
break;
case MESH_PDU_TYPE_UPPER_UNSEGMENTED_CONTROL:
btstack_assert( ((mesh_network_pdu_t *) pdu)->len >= 9);
break;
default:
btstack_assert(false);
break;
}
btstack_linked_list_add_tail(&upper_transport_outgoing, (btstack_linked_item_t*) pdu);
@ -589,7 +594,7 @@ static uint8_t mesh_upper_transport_setup_segmented_control_pdu(mesh_transport_p
uint8_t mesh_upper_transport_setup_control_pdu(mesh_pdu_t * pdu, uint16_t netkey_index,
uint8_t ttl, uint16_t src, uint16_t dest, uint8_t opcode, const uint8_t * control_pdu_data, uint16_t control_pdu_len){
switch (pdu->pdu_type){
case MESH_PDU_TYPE_NETWORK:
case MESH_PDU_TYPE_UPPER_UNSEGMENTED_CONTROL:
return mesh_upper_transport_setup_unsegmented_control_pdu((mesh_network_pdu_t *) pdu, netkey_index, ttl, src, dest, opcode, control_pdu_data, control_pdu_len);
default:
btstack_assert(0);
@ -1105,7 +1110,7 @@ static void mesh_upper_transport_run(void){
mesh_unsegmented_pdu_t * unsegmented_pdu;
switch (pdu->pdu_type){
case MESH_PDU_TYPE_NETWORK:
case MESH_PDU_TYPE_UPPER_UNSEGMENTED_CONTROL:
btstack_assert(mesh_pdu_ctl(pdu) != 0);
mesh_upper_transport_send_unsegmented_control_pdu((mesh_network_pdu_t *) pdu);
break;

View File

@ -106,6 +106,7 @@ static void gatt_bearer_emit_connected(void){
uint16_t mesh_pdu_dst(mesh_pdu_t * pdu){
switch (pdu->pdu_type){
case MESH_PDU_TYPE_NETWORK:
case MESH_PDU_TYPE_UPPER_UNSEGMENTED_CONTROL:
return mesh_network_dst((mesh_network_pdu_t *) pdu);
case MESH_PDU_TYPE_UNSEGMENTED:
return mesh_network_dst(((mesh_unsegmented_pdu_t *) pdu)->segment);
@ -122,6 +123,7 @@ uint16_t mesh_pdu_dst(mesh_pdu_t * pdu){
uint16_t mesh_pdu_ctl(mesh_pdu_t * pdu){
switch (pdu->pdu_type){
case MESH_PDU_TYPE_NETWORK:
case MESH_PDU_TYPE_UPPER_UNSEGMENTED_CONTROL:
return mesh_network_control((mesh_network_pdu_t *) pdu);
case MESH_PDU_TYPE_ACCESS:
return mesh_access_ctl((mesh_access_pdu_t *) pdu);
@ -438,15 +440,14 @@ static void expect_adv_network_pdu(const uint8_t * data, uint16_t len){
adv_bearer_emit_sent();
}
static mesh_upper_transport_pdu_t upper_pdu = { 0 };
void test_send_access_message(uint16_t netkey_index, uint16_t appkey_index, uint8_t ttl, uint16_t src, uint16_t dest, uint8_t szmic, char * control_pdu, int count, char ** lower_transport_pdus, char ** network_pdus){
transport_pdu_len = strlen(control_pdu) / 2;
btstack_parse_hex(control_pdu, transport_pdu_len, transport_pdu_data);
static mesh_upper_transport_pdu_t upper_pdu = { 0 };
upper_pdu.flags = 0;
mesh_pdu_t * pdu = (mesh_pdu_t *) &upper_pdu;
if (count == 1 ){
// send as unsegmented access pdu
upper_pdu.pdu_header.pdu_type = MESH_PDU_TYPE_UPPER_UNSEGMENTED_ACCESS;
@ -454,6 +455,8 @@ void test_send_access_message(uint16_t netkey_index, uint16_t appkey_index, uin
// send as segmented access pdu
upper_pdu.pdu_header.pdu_type = MESH_PDU_TYPE_UPPER_SEGMENTED_ACCESS;
}
mesh_pdu_t * pdu = (mesh_pdu_t *) &upper_pdu;
mesh_upper_transport_setup_access_pdu(pdu, netkey_index, appkey_index, ttl, src, dest, szmic, transport_pdu_data, transport_pdu_len);
mesh_upper_transport_send_access_pdu(pdu);
@ -490,6 +493,7 @@ void test_send_control_message(uint16_t netkey_index, uint8_t ttl, uint16_t src,
if (transport_pdu_len < 12){
// send as unsegmented control pdu
pdu = (mesh_pdu_t *) mesh_network_pdu_get();
pdu->pdu_type = MESH_PDU_TYPE_UPPER_UNSEGMENTED_CONTROL;
} else {
// send as segmented control pdu
pdu = (mesh_pdu_t *) mesh_transport_pdu_get();