mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-01-26 12:35:25 +00:00
remote name caching: moved from hci.c into daemon.c
This commit is contained in:
parent
2c8dc43e81
commit
4f396e87e6
@ -207,11 +207,6 @@ static void packet_handler (uint8_t packet_type, uint8_t *packet, uint16_t size)
|
|||||||
continue_remote_names();
|
continue_remote_names();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BTSTACK_EVENT_REMOTE_NAME_CACHED:
|
|
||||||
bt_flip_addr(addr, &packet[3]);
|
|
||||||
printf("Cached remote name for %s: '%s'\n", bd_addr_to_str(addr), &packet[9]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HCI_EVENT_REMOTE_NAME_REQUEST_COMPLETE:
|
case HCI_EVENT_REMOTE_NAME_REQUEST_COMPLETE:
|
||||||
bt_flip_addr(addr, &packet[3]);
|
bt_flip_addr(addr, &packet[3]);
|
||||||
index = getDeviceIndexForAddress(addr);
|
index = getDeviceIndexForAddress(addr);
|
||||||
|
@ -1488,8 +1488,19 @@ static void app_run(void){
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void daemon_emit_packet(void * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
|
||||||
|
if (connection) {
|
||||||
|
socket_connection_send_packet(connection, packet_type, channel, packet, size);
|
||||||
|
} else {
|
||||||
|
socket_connection_send_packet_all(packet_type, channel, packet, size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t remote_name_event[2+1+6+DEVICE_NAME_LEN+1]; // +1 for \0 in log_info
|
||||||
static void daemon_packet_handler(void * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
|
static void daemon_packet_handler(void * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
|
||||||
uint16_t cid;
|
uint16_t cid;
|
||||||
|
int i;
|
||||||
|
bd_addr_t addr;
|
||||||
switch (packet_type) {
|
switch (packet_type) {
|
||||||
case HCI_EVENT_PACKET:
|
case HCI_EVENT_PACKET:
|
||||||
deamon_status_event_handler(packet, size);
|
deamon_status_event_handler(packet, size);
|
||||||
@ -1500,11 +1511,56 @@ static void daemon_packet_handler(void * connection, uint8_t packet_type, uint16
|
|||||||
daemon_retry_parked();
|
daemon_retry_parked();
|
||||||
// no need to tell clients
|
// no need to tell clients
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
case HCI_EVENT_REMOTE_NAME_REQUEST_COMPLETE:
|
||||||
|
if (!remote_device_db) break;
|
||||||
|
if (packet[2]) break; // status not ok
|
||||||
|
|
||||||
|
bt_flip_addr(addr, &packet[3]);
|
||||||
|
// fix for invalid remote names - terminate on 0xff
|
||||||
|
for (i=0; i<248;i++){
|
||||||
|
if (packet[9+i] == 0xff){
|
||||||
|
packet[9+i] = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
packet[9+248] = 0;
|
||||||
|
remote_device_db->put_name(addr, (device_name_t *)&packet[9]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HCI_EVENT_INQUIRY_RESULT:
|
||||||
|
case HCI_EVENT_INQUIRY_RESULT_WITH_RSSI:{
|
||||||
|
if (!remote_device_db) break;
|
||||||
|
|
||||||
|
// first send inq result packet
|
||||||
|
daemon_emit_packet(connection, packet_type, channel, packet, size);
|
||||||
|
|
||||||
|
// then send cached remote names
|
||||||
|
int offset = 3;
|
||||||
|
for (i=0; i<packet[2];i++){
|
||||||
|
bt_flip_addr(addr, &packet[offset]);
|
||||||
|
if (remote_device_db->get_name(addr, (device_name_t *) &remote_name_event[9])){
|
||||||
|
remote_name_event[0] = BTSTACK_EVENT_REMOTE_NAME_CACHED;
|
||||||
|
remote_name_event[1] = sizeof(remote_name_event) - 2 - 1;
|
||||||
|
remote_name_event[2] = 0; // just to be compatible with HCI_EVENT_REMOTE_NAME_REQUEST_COMPLETE
|
||||||
|
bt_flip_addr(&remote_name_event[3], addr);
|
||||||
|
|
||||||
|
remote_name_event[9+248] = 0; // assert \0 for log_info
|
||||||
|
log_info("BTSTACK_EVENT_REMOTE_NAME_CACHED %s = '%s'", bd_addr_to_str(addr), &remote_name_event[9]);
|
||||||
|
hci_dump_packet(HCI_EVENT_PACKET, 0, remote_name_event, sizeof(remote_name_event)-1);
|
||||||
|
daemon_emit_packet(connection, HCI_EVENT_PACKET, channel, remote_name_event, sizeof(remote_name_event) -1);
|
||||||
|
}
|
||||||
|
offset += 14; // 6 + 1 + 1 + 1 + 3 + 2;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
case RFCOMM_EVENT_CREDITS:
|
case RFCOMM_EVENT_CREDITS:
|
||||||
// RFCOMM CREDITS received...
|
// RFCOMM CREDITS received...
|
||||||
daemon_retry_parked();
|
daemon_retry_parked();
|
||||||
break;
|
break;
|
||||||
case RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE:
|
|
||||||
|
case RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE:
|
||||||
cid = little_endian_read_16(packet, 13);
|
cid = little_endian_read_16(packet, 13);
|
||||||
connection = connection_for_rfcomm_cid(cid);
|
connection = connection_for_rfcomm_cid(cid);
|
||||||
if (!connection) break;
|
if (!connection) break;
|
||||||
@ -1570,11 +1626,7 @@ static void daemon_packet_handler(void * connection, uint8_t packet_type, uint16
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (connection) {
|
daemon_emit_packet(connection, packet_type, channel, packet, size);
|
||||||
socket_connection_send_packet(connection, packet_type, channel, packet, size);
|
|
||||||
} else {
|
|
||||||
socket_connection_send_packet_all(packet_type, channel, packet, size);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void l2cap_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t * packet, uint16_t size){
|
static void l2cap_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t * packet, uint16_t size){
|
||||||
|
44
src/hci.c
44
src/hci.c
@ -1631,50 +1631,6 @@ static void event_handler(uint8_t *packet, int size){
|
|||||||
hci_emit_security_level(handle, gap_security_level_for_connection(conn));
|
hci_emit_security_level(handle, gap_security_level_for_connection(conn));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HCI_EVENT_REMOTE_NAME_REQUEST_COMPLETE:
|
|
||||||
if (!hci_stack->remote_device_db) break;
|
|
||||||
if (packet[2]) break; // status not ok
|
|
||||||
bt_flip_addr(addr, &packet[3]);
|
|
||||||
// fix for invalid remote names - terminate on 0xff
|
|
||||||
for (i=0; i<248;i++){
|
|
||||||
if (packet[9+i] == 0xff){
|
|
||||||
packet[9+i] = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
packet[9+248] = 0;
|
|
||||||
hci_stack->remote_device_db->put_name(addr, (device_name_t *)&packet[9]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HCI_EVENT_INQUIRY_RESULT:
|
|
||||||
case HCI_EVENT_INQUIRY_RESULT_WITH_RSSI:{
|
|
||||||
if (!hci_stack->remote_device_db) break;
|
|
||||||
// first send inq result packet
|
|
||||||
hci_stack->packet_handler(HCI_EVENT_PACKET, packet, size);
|
|
||||||
// then send cached remote names
|
|
||||||
int offset = 3;
|
|
||||||
for (i=0; i<packet[2];i++){
|
|
||||||
bt_flip_addr(addr, &packet[offset]);
|
|
||||||
|
|
||||||
// consider moving this daemon
|
|
||||||
uint8_t event[2+1+6+DEVICE_NAME_LEN+1]; // +1 for \0 in log_info
|
|
||||||
if (hci_stack->remote_device_db->get_name(addr, (device_name_t *) &event[9])){
|
|
||||||
event[0] = BTSTACK_EVENT_REMOTE_NAME_CACHED;
|
|
||||||
event[1] = sizeof(event) - 2 - 1;
|
|
||||||
event[2] = 0; // just to be compatible with HCI_EVENT_REMOTE_NAME_REQUEST_COMPLETE
|
|
||||||
bt_flip_addr(&event[3], addr);
|
|
||||||
|
|
||||||
event[9+248] = 0; // assert \0 for log_info
|
|
||||||
log_info("BTSTACK_EVENT_REMOTE_NAME_CACHED %s = '%s'", bd_addr_to_str(addr), &event[9]);
|
|
||||||
|
|
||||||
hci_dump_packet(HCI_EVENT_PACKET, 0, event, sizeof(event)-1);
|
|
||||||
hci_stack->packet_handler(HCI_EVENT_PACKET, event, sizeof(event)-1);
|
|
||||||
}
|
|
||||||
offset += 14; // 6 + 1 + 1 + 1 + 3 + 2;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// HCI_EVENT_DISCONNECTION_COMPLETE
|
// HCI_EVENT_DISCONNECTION_COMPLETE
|
||||||
// has been split, to first notify stack before shutting connection down
|
// has been split, to first notify stack before shutting connection down
|
||||||
// see end of function, too.
|
// see end of function, too.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user