mesh: deliver Network PDU from ADV Bearer to Network as MESH_NETWORK_PACKET

This commit is contained in:
Matthias Ringwald 2018-11-21 17:03:16 +01:00
parent 14fe90b179
commit 33674932a6
2 changed files with 37 additions and 33 deletions

View File

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

View File

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