mesh: deliver Mesh Beacons from ADV Bearer to Beacon and higher layers as MESH_BEACON_PACKET

This commit is contained in:
Matthias Ringwald 2018-11-21 17:10:36 +01:00
parent 33674932a6
commit 4c8f56d7c4
4 changed files with 34 additions and 65 deletions

View File

@ -128,12 +128,14 @@ static void adv_bearer_packet_handler (uint8_t packet_type, uint16_t channel, ui
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);
break;
case MESH_MESSAGE_ID:
(*client_callbacks[type_id])(MESH_NETWORK_PACKET, 0, (uint8_t*) &data[2], data_len-2);
break;
case MESH_BEACON_ID:
(*client_callbacks[type_id])(MESH_BEACON_PACKET, 0, (uint8_t*) &data[2], data_len-2);
break;
default:
break;
}

View File

@ -62,30 +62,30 @@ static btstack_packet_handler_t unprovisioned_device_beacon_handler;
static btstack_packet_handler_t secure_network_beacon_handler;
static void beacon_packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
const uint8_t * data;
uint8_t beacon[23];
if (packet_type != HCI_EVENT_PACKET) return;
switch(packet[0]){
case HCI_EVENT_MESH_META:
switch(packet[2]){
case MESH_SUBEVENT_CAN_SEND_NOW:
beacon[0] = BEACON_TYPE_UNPROVISIONED_DEVICE;
memcpy(&beacon[1], beacon_device_uuid, 16);
big_endian_store_16(beacon, 17, beacon_oob_information);
big_endian_store_32(beacon, 19, beacon_uri_hash);
adv_bearer_send_mesh_beacon(beacon, sizeof(beacon));
switch (packet_type){
case HCI_EVENT_PACKET:
switch(packet[0]){
case HCI_EVENT_MESH_META:
switch(packet[2]){
case MESH_SUBEVENT_CAN_SEND_NOW:
beacon[0] = BEACON_TYPE_UNPROVISIONED_DEVICE;
memcpy(&beacon[1], beacon_device_uuid, 16);
big_endian_store_16(beacon, 17, beacon_oob_information);
big_endian_store_32(beacon, 19, beacon_uri_hash);
adv_bearer_send_mesh_beacon(beacon, sizeof(beacon));
break;
default:
break;
}
break;
default:
break;
}
break;
case GAP_EVENT_ADVERTISING_REPORT:
// check type
data = gap_event_advertising_report_get_data(packet);
log_info("beacon type %u", data[2]);
switch (data[2]){
case MESH_BEACON_PACKET:
log_info("beacon type %u", packet[0]);
switch (packet[0]){
case BEACON_TYPE_UNPROVISIONED_DEVICE:
if (unprovisioned_device_beacon_handler){
(*unprovisioned_device_beacon_handler)(packet_type, channel, packet, size);

View File

@ -202,22 +202,14 @@ static void mesh_message_handler (uint8_t packet_type, uint16_t channel, uint8_t
}
static void mesh_unprovisioned_beacon_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
if (packet_type != HCI_EVENT_PACKET) return;
uint8_t device_uuid[16];
if (packet_type != MESH_BEACON_PACKET) return;
uint8_t device_uuid[16];
uint16_t oob;
const uint8_t * data;
switch(packet[0]){
case GAP_EVENT_ADVERTISING_REPORT:
data = gap_event_advertising_report_get_data(packet);
memcpy(device_uuid, &packet[15], 16);
oob = big_endian_read_16(data, 31);
printf("received unprovisioned device beacon, oob data %x, device uuid: ", oob);
printf_hexdump(device_uuid, 16);
pb_adv_create_link(device_uuid);
break;
default:
break;
}
memcpy(device_uuid, &packet[1], 16);
oob = big_endian_read_16(packet, 17);
printf("received unprovisioned device beacon, oob data %x, device uuid: ", oob);
printf_hexdump(device_uuid, 16);
pb_adv_create_link(device_uuid);
}
uint8_t pts_device_uuid[16];

View File

@ -240,43 +240,18 @@ static void mesh_message_handler (uint8_t packet_type, uint16_t channel, uint8_t
static uint8_t device_uuid[16];
static void mesh_unprovisioned_beacon_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
if (packet_type != HCI_EVENT_PACKET) return;
if (packet_type != MESH_BEACON_PACKET) return;
uint16_t oob;
const uint8_t * data;
switch(packet[0]){
case GAP_EVENT_ADVERTISING_REPORT:
data = gap_event_advertising_report_get_data(packet);
memcpy(device_uuid, &packet[15], 16);
oob = big_endian_read_16(data, 31);
printf("received unprovisioned device beacon, oob data %x, device uuid: ", oob);
printf_hexdump(device_uuid, 16);
pb_adv_cid = pb_adv_create_link(device_uuid);
break;
default:
break;
}
memcpy(device_uuid, &packet[1], 16);
oob = big_endian_read_16(packet, 17);
printf("received unprovisioned device beacon, oob data %x, device uuid: ", oob);
printf_hexdump(device_uuid, 16);
pb_adv_create_link(device_uuid);
}
uint8_t pts_device_uuid[16];
const char * pts_device_uuid_string = "001BDC0810210B0E0A0C000B0E0A0C00";
static uint8_t adv_prov_invite_pdu[] = { 0x00, 0x00 };
static uint8_t adv_prov_start_pdu[] = { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00};
static uint8_t adv_prov_public_key_pdu[65];
static btstack_crypto_aes128_cmac_t mesh_cmac_request;
static uint8_t mesh_secure_network_beacon[22];
static uint8_t mesh_secure_network_beacon_auth_value[16];
static void mesh_secure_network_beacon_auth_value_calculated(void * arg){
UNUSED(arg);
memcpy(&mesh_secure_network_beacon[14], mesh_secure_network_beacon_auth_value, 8);
printf("Secure Network Beacon\n");
printf("- ");
printf_hexdump(mesh_secure_network_beacon, sizeof(mesh_secure_network_beacon));
adv_bearer_send_mesh_beacon(mesh_secure_network_beacon, sizeof(mesh_secure_network_beacon));
}
static void stdin_process(char cmd){
if (ui_chars_for_pin){
printf("%c", cmd);