diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2005-04-17 23:31:54 +0000 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2005-04-17 23:31:54 +0000 |
commit | 0887d119a0b61e38cbd3d30e207c09eb5a5ff463 (patch) | |
tree | 10f1c27e2281eed00c183d33a663ca275b7f4d9b /src | |
parent | be2d979b6a592484862e78bed355d079f7eeb1e6 (diff) |
Add function for remote extended features
Diffstat (limited to 'src')
-rw-r--r-- | src/hci.c | 54 |
1 files changed, 43 insertions, 11 deletions
@@ -969,6 +969,38 @@ int hci_read_remote_name_cancel(int dd, const bdaddr_t *bdaddr, int to) return 0; } +int hci_read_remote_version(int dd, uint16_t handle, struct hci_version *ver, int to) +{ + evt_read_remote_version_complete rp; + read_remote_version_cp cp; + struct hci_request rq; + + memset(&cp, 0, sizeof(cp)); + cp.handle = handle; + + memset(&rq, 0, sizeof(rq)); + rq.ogf = OGF_LINK_CTL; + rq.ocf = OCF_READ_REMOTE_VERSION; + rq.event = EVT_READ_REMOTE_VERSION_COMPLETE; + rq.cparam = &cp; + rq.clen = READ_REMOTE_VERSION_CP_SIZE; + rq.rparam = &rp; + rq.rlen = EVT_READ_REMOTE_VERSION_COMPLETE_SIZE; + + if (hci_send_req(dd, &rq, to) < 0) + return -1; + + if (rp.status) { + errno = EIO; + return -1; + } + + ver->manufacturer = btohs(rp.manufacturer); + ver->lmp_ver = rp.lmp_ver; + ver->lmp_subver = btohs(rp.lmp_subver); + return 0; +} + int hci_read_remote_features(int dd, uint16_t handle, uint8_t *features, int to) { evt_read_remote_features_complete rp; @@ -999,23 +1031,24 @@ int hci_read_remote_features(int dd, uint16_t handle, uint8_t *features, int to) return 0; } -int hci_read_remote_version(int dd, uint16_t handle, struct hci_version *ver, int to) +int hci_read_remote_ext_features(int dd, uint16_t handle, uint8_t page, uint8_t *max_page, uint8_t *features, int to) { - evt_read_remote_version_complete rp; - read_remote_version_cp cp; + evt_read_remote_ext_features_complete rp; + read_remote_ext_features_cp cp; struct hci_request rq; memset(&cp, 0, sizeof(cp)); - cp.handle = handle; + cp.handle = handle; + cp.page_num = page; memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_LINK_CTL; - rq.ocf = OCF_READ_REMOTE_VERSION; - rq.event = EVT_READ_REMOTE_VERSION_COMPLETE; + rq.ocf = OCF_READ_REMOTE_EXT_FEATURES; + rq.event = EVT_READ_REMOTE_EXT_FEATURES_COMPLETE; rq.cparam = &cp; - rq.clen = READ_REMOTE_VERSION_CP_SIZE; + rq.clen = READ_REMOTE_EXT_FEATURES_CP_SIZE; rq.rparam = &rp; - rq.rlen = EVT_READ_REMOTE_VERSION_COMPLETE_SIZE; + rq.rlen = EVT_READ_REMOTE_EXT_FEATURES_COMPLETE_SIZE; if (hci_send_req(dd, &rq, to) < 0) return -1; @@ -1025,9 +1058,8 @@ int hci_read_remote_version(int dd, uint16_t handle, struct hci_version *ver, in return -1; } - ver->manufacturer = btohs(rp.manufacturer); - ver->lmp_ver = rp.lmp_ver; - ver->lmp_subver = btohs(rp.lmp_subver); + *max_page = rp.max_page_num; + memcpy(features, rp.features, 8); return 0; } |