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; if (gap_event_advertising_report_get_advertising_event_type(packet) != 0x03) break;
data = gap_event_advertising_report_get_data(packet); data = gap_event_advertising_report_get_data(packet);
data_len = gap_event_advertising_report_get_data_length(packet); data_len = gap_event_advertising_report_get_data_length(packet);
// log_info_hexdump(data, data_len); // log_info_hexdump(data, data_len);
switch(data[1]){ switch(data[1]){
case BLUETOOTH_DATA_TYPE_MESH_MESSAGE: 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; return;
} }
if (client_callbacks[type_id]){ if (client_callbacks[type_id]){
switch (type_id){
case PB_ADV_ID:
case MESH_BEACON_ID:
(*client_callbacks[type_id])(packet_type, channel, packet, size); (*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; break;
default: default:

View File

@ -502,13 +502,20 @@ static void mesh_network_run(void){
} }
static void mesh_message_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ 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_network_pdu_t * network_pdu;
mesh_provisioning_data_t provisioning_data;
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]){ switch(packet[0]){
case HCI_EVENT_MESH_META: case HCI_EVENT_MESH_META:
switch(packet[2]){ switch(packet[2]){
@ -522,25 +529,11 @@ static void mesh_message_handler (uint8_t packet_type, uint16_t channel, uint8_t
break; break;
} }
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: default:
break; break;
} }
break;
}
} }
void mesh_network_init(void){ void mesh_network_init(void){