Commit 8e4a73f4 authored by Marcel Holtmann's avatar Marcel Holtmann

[Bluetooth] Update inquiry cache from clock offset event

The HCI clock offset event contains the actual clock offset for the
connection. It is the same value that is received from an inquiry
response and it can be used to make further reconnections faster.
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent 7af32eeb
...@@ -576,6 +576,13 @@ struct hci_ev_rmt_version { ...@@ -576,6 +576,13 @@ struct hci_ev_rmt_version {
__u16 lmp_subver; __u16 lmp_subver;
} __attribute__ ((packed)); } __attribute__ ((packed));
#define HCI_EV_CLOCK_OFFSET 0x01C
struct hci_ev_clock_offset {
__u8 status;
__u16 handle;
__u16 clock_offset;
} __attribute__ ((packed));
/* Internal events generated by Bluetooth stack */ /* Internal events generated by Bluetooth stack */
#define HCI_EV_STACK_INTERNAL 0xFD #define HCI_EV_STACK_INTERNAL 0xFD
struct hci_ev_stack_internal { struct hci_ev_stack_internal {
......
...@@ -818,6 +818,30 @@ static inline void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff ...@@ -818,6 +818,30 @@ static inline void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff
{ {
} }
/* Clock Offset */
static inline void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb)
{
struct hci_ev_clock_offset *ev = (struct hci_ev_clock_offset *) skb->data;
struct hci_conn *conn = NULL;
__u16 handle = __le16_to_cpu(ev->handle);
BT_DBG("%s status %d", hdev->name, ev->status);
hci_dev_lock(hdev);
conn = hci_conn_hash_lookup_handle(hdev, handle);
if (conn && !ev->status) {
struct inquiry_entry *ie;
if ((ie = hci_inquiry_cache_lookup(hdev, &conn->dst))) {
ie->data.clock_offset = ev->clock_offset;
ie->timestamp = jiffies;
}
}
hci_dev_unlock(hdev);
}
void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb) void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
{ {
struct hci_event_hdr *hdr = (struct hci_event_hdr *) skb->data; struct hci_event_hdr *hdr = (struct hci_event_hdr *) skb->data;
...@@ -886,6 +910,10 @@ void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -886,6 +910,10 @@ void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
hci_link_key_notify_evt(hdev, skb); hci_link_key_notify_evt(hdev, skb);
break; break;
case HCI_EV_CLOCK_OFFSET:
hci_clock_offset_evt(hdev, skb);
break;
case HCI_EV_CMD_STATUS: case HCI_EV_CMD_STATUS:
cs = (struct hci_ev_cmd_status *) skb->data; cs = (struct hci_ev_cmd_status *) skb->data;
skb_pull(skb, sizeof(cs)); skb_pull(skb, sizeof(cs));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment