diff --git a/src/ble/mesh/adv_bearer.c b/src/ble/mesh/adv_bearer.c index 2a2f3b14b..db5476efe 100644 --- a/src/ble/mesh/adv_bearer.c +++ b/src/ble/mesh/adv_bearer.c @@ -110,6 +110,7 @@ static void adv_bearer_packet_handler (uint8_t packet_type, uint16_t channel, ui if (gap_event_advertising_report_get_advertising_event_type(packet) != 0x03) break; data = gap_event_advertising_report_get_data(packet); data_len = gap_event_advertising_report_get_data_length(packet); + // log_info_hexdump(data, data_len); switch(data[1]){ case BLUETOOTH_DATA_TYPE_MESH_MESSAGE: @@ -125,7 +126,17 @@ static void adv_bearer_packet_handler (uint8_t packet_type, uint16_t channel, ui return; } if (client_callbacks[type_id]){ - (*client_callbacks[type_id])(packet_type, channel, packet, size); + switch (type_id){ + case PB_ADV_ID: + case MESH_BEACON_ID: + (*client_callbacks[type_id])(packet_type, channel, packet, size); + break; + case MESH_MESSAGE_ID: + (*client_callbacks[type_id])(MESH_NETWORK_PACKET, 0, (uint8_t*) &data[2], data_len-2); + break; + default: + break; + } } break; default: diff --git a/src/ble/mesh/mesh_network.c b/src/ble/mesh/mesh_network.c index c5abfd76f..d4b13cd99 100644 --- a/src/ble/mesh/mesh_network.c +++ b/src/ble/mesh/mesh_network.c @@ -502,44 +502,37 @@ static void mesh_network_run(void){ } static void mesh_message_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ - if (packet_type != HCI_EVENT_PACKET) return; - const uint8_t * adv_data; - const uint8_t * pdu_data; - uint8_t pdu_len; - uint8_t adv_len; + mesh_network_pdu_t * network_pdu; - mesh_provisioning_data_t provisioning_data; - switch(packet[0]){ - case HCI_EVENT_MESH_META: - switch(packet[2]){ - case MESH_SUBEVENT_CAN_SEND_NOW: - if (btstack_linked_list_empty(&network_pdus_outgoing)) break; - network_pdu = (mesh_network_pdu_t *) btstack_linked_list_pop(&network_pdus_outgoing); - adv_bearer_send_mesh_message(network_pdu->data, network_pdu->len); - btstack_memory_mesh_network_pdu_free(network_pdu); + + switch (packet_type){ + case MESH_NETWORK_PACKET: + // check len. minimal transport PDU len = 1, 32 bit NetMIC -> 13 bytes + if (size < 13) break; + + printf("received mesh message (len %u): ", size); + printf_hexdump(packet, size); + mesh_network_received_message(packet, size); + break; + + case HCI_EVENT_PACKET: + switch(packet[0]){ + case HCI_EVENT_MESH_META: + switch(packet[2]){ + case MESH_SUBEVENT_CAN_SEND_NOW: + if (btstack_linked_list_empty(&network_pdus_outgoing)) break; + network_pdu = (mesh_network_pdu_t *) btstack_linked_list_pop(&network_pdus_outgoing); + adv_bearer_send_mesh_message(network_pdu->data, network_pdu->len); + btstack_memory_mesh_network_pdu_free(network_pdu); + break; + default: + break; + } break; default: break; } break; - case GAP_EVENT_ADVERTISING_REPORT: - adv_len = gap_event_advertising_report_get_data_length(packet); - adv_data = gap_event_advertising_report_get_data(packet); - // validate data item len - pdu_len = adv_data[0] - 1; - printf("adv len %u pdu len %u\n", adv_len, pdu_len); - - if ((pdu_len + 2) > adv_len) break; - if (pdu_len < 13) break; // transport PDU len = 0, 32 bit NetMIC - - // get transport pdu - pdu_data = &adv_data[2]; - printf("received mesh message: "); - printf_hexdump(pdu_data, pdu_len); - mesh_network_received_message(pdu_data, pdu_len); - break; - default: - break; } }