mesh: use MESH_PROXY_ events

This commit is contained in:
Matthias Ringwald 2019-05-23 18:16:18 +02:00
parent 82b0bf4283
commit b54c10cd15
3 changed files with 30 additions and 22 deletions

View File

@ -75,15 +75,14 @@ static att_service_handler_t mesh_proxy_service;
static mesh_proxy_t mesh_proxy;
static void mesh_proxy_service_emit_link_open(hci_con_handle_t con_handle, uint8_t status){
uint8_t event[7] = { HCI_EVENT_MESH_META, 5, MESH_PB_TRANSPORT_LINK_OPEN, status};
static void mesh_proxy_service_emit_connected(hci_con_handle_t con_handle){
uint8_t event[5] = { HCI_EVENT_MESH_META, 3, MESH_PROXY_CONNECTED};
little_endian_store_16(event, 4, con_handle);
event[6] = PB_TYPE_GATT;
mesh_proxy_service_packet_handler(HCI_EVENT_PACKET, 0, event, sizeof(event));
}
static void mesh_proxy_service_emit_link_close(hci_con_handle_t con_handle, uint8_t reason){
uint8_t event[5] = { HCI_EVENT_MESH_META, 3, MESH_PB_TRANSPORT_LINK_CLOSED};
static void mesh_proxy_service_emit_disconnected(hci_con_handle_t con_handle){
uint8_t event[5] = { HCI_EVENT_MESH_META, 3, MESH_PROXY_DISCONNECTED};
little_endian_store_16(event, 4, con_handle);
mesh_proxy_service_packet_handler(HCI_EVENT_PACKET, 0, event, sizeof(event));
}
@ -140,9 +139,9 @@ static int mesh_proxy_service_write_callback(hci_con_handle_t con_handle, uint16
instance->data_out_client_configuration_descriptor_value = little_endian_read_16(buffer, 0);
log_info("mesh_proxy_service_write_callback: data out notify enabled %d, con handle 0x%02x", instance->data_out_client_configuration_descriptor_value, con_handle);
if (instance->data_out_client_configuration_descriptor_value){
mesh_proxy_service_emit_link_open(con_handle, 0);
mesh_proxy_service_emit_connected(con_handle);
} else {
mesh_proxy_service_emit_link_close(con_handle, 0);
mesh_proxy_service_emit_disconnected(con_handle);
}
return 0;
}

View File

@ -97,6 +97,14 @@ static void gatt_bearer_emit_can_send_now(void){
}
}
static void gatt_bearer_emit_event_for_all(uint8_t * packet, uint16_t size){
unsigned int i;
for (i=0; i < NUM_TYPES; i++){
if ( client_callbacks[i] == NULL) continue;
(*client_callbacks[last_sender])(HCI_EVENT_PACKET, 0, packet, size);
}
}
static void gatt_bearer_request(mesh_msg_type_t type_id){
request_can_send_now[type_id] = 1;
mesh_proxy_service_server_request_can_send_now(gatt_bearer_con_handle);
@ -219,14 +227,15 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe
switch (hci_event_packet_get_type(packet)) {
case HCI_EVENT_MESH_META:
switch (hci_event_mesh_meta_get_subevent_code(packet)){
case MESH_PB_TRANSPORT_LINK_OPEN:
case MESH_PB_TRANSPORT_LINK_CLOSED:
case MESH_PROXY_DISCONNECTED:
gatt_bearer_mtu = ATT_DEFAULT_MTU;
gatt_bearer_con_handle = mesh_pb_transport_link_open_event_get_pb_transport_cid(packet);
if ((*client_callbacks[MESH_MSG_TYPE_NETWORK_PDU])){
(*client_callbacks[MESH_MSG_TYPE_NETWORK_PDU])(HCI_EVENT_PACKET, 0, packet, size);
}
break;
gatt_bearer_con_handle = mesh_proxy_connected_event_get_con_handle(packet);
gatt_bearer_emit_event_for_all(packet, size);
break;
case MESH_PROXY_CONNECTED:
gatt_bearer_con_handle = HCI_CON_HANDLE_INVALID;
gatt_bearer_emit_event_for_all(packet, size);
break;
case MESH_SUBEVENT_CAN_SEND_NOW:
con_handle = little_endian_read_16(packet, 3);
if (con_handle == HCI_CON_HANDLE_INVALID) return;

View File

@ -441,7 +441,7 @@ static void packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *pack
}
}
static void mesh_message_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
static void mesh_provisioning_message_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
if (packet_type != HCI_EVENT_PACKET) return;
mesh_provisioning_data_t provisioning_data;
mesh_network_key_t * network_key;
@ -2673,7 +2673,7 @@ static void virtual_address_complete(void * arg){
static void key_derived(void * arg){
}
static void packet_handler_for_mesh_beacon(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
static void mesh_proxy_packet_handler_beacon(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
printf("packet_handler_for_mesh_beacon\n");
switch (packet_type){
@ -2701,7 +2701,7 @@ static void packet_handler_for_mesh_beacon(uint8_t packet_type, uint16_t channel
}
}
static void packet_handler_for_mesh_network_pdu(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
static void mesh_proxy_packet_handler_network_pdu(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
printf("packet_handler_for_mesh_network_pdu\n");
switch (packet_type){
@ -2714,8 +2714,8 @@ static void packet_handler_for_mesh_network_pdu(uint8_t packet_type, uint16_t ch
switch (hci_event_packet_get_type(packet)){
case HCI_EVENT_MESH_META:
switch (hci_event_mesh_meta_get_subevent_code(packet)){
case MESH_PB_TRANSPORT_LINK_OPEN:
printf("mesh_proxy_server: MESH_PB_TRANSPORT_LINK_OPEN\n");
case MESH_PROXY_CONNECTED:
printf("mesh_proxy_server: MESH_PROXY_CONNECTED\n");
printf("+ Setup Secure Network Beacon\n");
mesh_secure_network_beacon[0] = BEACON_TYPE_SECURE_NETWORK;
mesh_secure_network_beacon[1] = mesh_flags;
@ -2880,8 +2880,8 @@ int btstack_main(void)
// Setup GATT bearer
gatt_bearer_init();
gatt_bearer_register_for_mesh_network_pdu(&packet_handler_for_mesh_network_pdu);
gatt_bearer_register_for_mesh_beacon(&packet_handler_for_mesh_beacon);
gatt_bearer_register_for_mesh_network_pdu(&mesh_proxy_packet_handler_network_pdu);
gatt_bearer_register_for_mesh_beacon(&mesh_proxy_packet_handler_beacon);
gatt_bearer_register_for_mesh_proxy_configuration(&packet_handler_for_mesh_proxy_configuration);
mesh_network_set_proxy_message_handler(proxy_configuration_message_handler);
@ -2894,7 +2894,7 @@ int btstack_main(void)
// Provisioning in device role
provisioning_device_init(device_uuid);
provisioning_device_register_packet_handler(&mesh_message_handler);
provisioning_device_register_packet_handler(&mesh_provisioning_message_handler);
// Network layer
mesh_network_init();