diff --git a/src/mesh/mesh_network.c b/src/mesh/mesh_network.c index d9c8f8082..a4c994d79 100644 --- a/src/mesh/mesh_network.c +++ b/src/mesh/mesh_network.c @@ -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); } /* diff --git a/src/mesh/mesh_upper_transport.c b/src/mesh/mesh_upper_transport.c index 43c590aee..fc75381e2 100644 --- a/src/mesh/mesh_upper_transport.c +++ b/src/mesh/mesh_upper_transport.c @@ -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; diff --git a/test/mesh/mesh_message_test.cpp b/test/mesh/mesh_message_test.cpp index ac4a17075..aa0b2f76e 100644 --- a/test/mesh/mesh_message_test.cpp +++ b/test/mesh/mesh_message_test.cpp @@ -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();