diff options
author | Sudha Bheemanna <b.sudha@samsung.com> | 2015-09-16 16:34:53 +0530 |
---|---|---|
committer | Pyun DoHyun <dh79.pyun@samsung.com> | 2015-12-06 17:41:54 -0800 |
commit | a399864284077d907d9a6e67e796a12e11798b73 (patch) | |
tree | dbb4a747cbc7535eda7a522dab0d2686f16b3fdd /lib | |
parent | 8205fcd12b45df23375c868880e9fb4f33fca8a0 (diff) | |
download | bluez-a399864284077d907d9a6e67e796a12e11798b73.tar.gz bluez-a399864284077d907d9a6e67e796a12e11798b73.tar.bz2 bluez-a399864284077d907d9a6e67e796a12e11798b73.zip |
Added code for LE Data length extension feature.submit/tizen_wearable/20151207.014418submit/tizen_tv/20151207.014413submit/tizen_mobile/20151207.014408accepted/tizen/wearable/20151207.124359accepted/tizen/tv/20151207.124247accepted/tizen/mobile/20151207.124010
Change-Id: I7c7cd8760935b378aa6f7e578ca27ddb1ba40176
Signed-off-by: Sudha Bheemanna <b.sudha@samsung.com>
Diffstat (limited to 'lib')
-rwxr-xr-x[-rw-r--r--] | lib/hci.c | 133 | ||||
-rwxr-xr-x[-rw-r--r--] | lib/hci.h | 46 | ||||
-rwxr-xr-x[-rw-r--r--] | lib/mgmt.h | 39 |
3 files changed, 217 insertions, 1 deletions
diff --git a/lib/hci.c b/lib/hci.c index bc453f7a..7fd251f8 100644..100755 --- a/lib/hci.c +++ b/lib/hci.c @@ -592,7 +592,8 @@ static hci_map commands_map[] = { { "LE Receiver Test", 228 }, { "LE Transmitter Test", 229 }, { "LE Test End", 230 }, - { "Reserved", 231 }, + { "LE Read Maximum Data Length", 231 }, + { "Reserved", 232 }, { NULL } }; @@ -3117,3 +3118,133 @@ int hci_le_read_remote_features(int dd, uint16_t handle, uint8_t *features, int return 0; } + +#ifdef __TIZEN_PATCH__ +int hci_le_read_maximum_data_length( + int dd, uint8_t *status, uint16_t *tx_octets, + uint16_t *tx_time, uint16_t *rx_octets, + uint16_t *rx_time, int to) +{ + le_read_maximum_data_length_rp rp; + struct hci_request rq; + + memset(&rq, 0, sizeof(rq)); + memset(&rp, 0, sizeof(rp)); + + rq.ogf = OGF_LE_CTL; + rq.ocf = OCF_LE_READ_MAXIMUM_DATA_LENGTH; + rq.rparam = &rp; + rq.rlen = LE_READ_MAXIMUM_DATA_LENGTH_SIZE; + + if (hci_send_req(dd, &rq, to) < 0) + return -1; + + if (rp.status) { + errno = EIO; + return -1; + } + + *tx_octets = rp.max_tx_octets; + *tx_time = rp.max_tx_time; + *rx_octets = rp.max_rx_octets; + *rx_time = rp.max_rx_time; + *status = rp.status; + return 0; +} + +int hci_le_write_host_suggested_data_length( + int dd, uint16_t *def_tx_octets, + uint16_t *def_tx_time, int to) +{ + le_write_host_suggested_data_length_cp cp; + struct hci_request rq; + uint8_t status; + + memset(&cp, 0, sizeof(cp)); + cp.def_tx_octets = def_tx_octets; + cp.def_tx_time = def_tx_time; + + memset(&rq, 0, sizeof(rq)); + rq.ogf = OGF_LE_CTL; + rq.ocf = OCF_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH; + rq.cparam = &cp; + rq.clen = LE_WRITE_HOST_SUGGESTED_DATA_LENGTH_CP_SIZE; + rq.rparam = &status; + rq.rlen = 1; + + if (hci_send_req(dd, &rq, to) < 0) + return -1; + + if (status) { + errno = EIO; + return -1; + } + + return 0; +} + +int hci_le_read_host_suggested_data_length( + int dd, uint8_t *status, uint16_t *def_tx_octets, + uint16_t *def_tx_time, int to) +{ + le_read_host_suggested_data_length_rp rp; + struct hci_request rq; + + memset(&rp, 0, sizeof(rp)); + memset(&rq, 0, sizeof(rq)); + + rq.ogf = OGF_LE_CTL; + rq.ocf = OCF_LE_READ_HOST_SUGGESTED_DATA_LENGTH; + rq.rparam = &rp; + rq.rlen = LE_READ_HOST_SUGGESTED_DATA_LENGTH_SIZE; + + if (hci_send_req(dd, &rq, to) < 0) + return -1; + + if (rp.status) { + errno = EIO; + return -1; + } + + *def_tx_octets = rp.def_tx_octets; + *def_tx_time = rp.def_tx_time; + *status = rp.status; + return 0; +} + +int hci_le_set_data_length( + int dd, const bdaddr_t *bdaddr, uint16_t *max_tx_octets, + uint16_t *max_tx_time, int to) +{ + le_set_data_length_cp cp; + le_set_data_length_rp rp; + struct hci_request rq; + uint8_t status; + + memset(&cp, 0, sizeof(cp)); + memset(&rp, 0, sizeof(rp)); + + bacpy(&cp.bdaddr, bdaddr); + cp.max_tx_octets = max_tx_octets; + cp.max_tx_time = max_tx_time; + + memset(&rq, 0, sizeof(rq)); + rq.ogf = OGF_LE_CTL; + rq.ocf = OCF_LE_SET_DATA_LENGTH; + rq.cparam = &cp; + rq.clen = LE_SET_DATA_LENGTH_CP_SIZE; + rq.rparam = &rp; + rq.rlen = LE_SET_DATA_LENGTH_RP_SIZE; + + if (hci_send_req(dd, &rq, to) < 0) + return -1; + + if (rp.status) { + errno = EIO; + return -1; + } + + return 0; +} + +#endif diff --git a/lib/hci.h b/lib/hci.h index 8f524ff8..ae7be46d 100644..100755 --- a/lib/hci.h +++ b/lib/hci.h @@ -1710,6 +1710,52 @@ typedef struct { } __attribute__ ((packed)) le_test_end_rp; #define LE_TEST_END_RP_SIZE 3 +#ifdef __TIZEN_PATCH__ +#define OCF_LE_READ_MAXIMUM_DATA_LENGTH 0x002F +typedef struct { + uint8_t status; + uint16_t max_tx_octets; + uint16_t max_tx_time; + uint16_t max_rx_octets; + uint16_t max_rx_time; +} __attribute__ ((packed)) +le_read_maximum_data_length_rp; +#define LE_READ_MAXIMUM_DATA_LENGTH_SIZE 9 + +#define OCF_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH 0x0030 +typedef struct { + uint16_t def_tx_octets; + uint16_t def_tx_time; +} __attribute__ ((packed)) +le_write_host_suggested_data_length_cp; +#define LE_WRITE_HOST_SUGGESTED_DATA_LENGTH_CP_SIZE 4 + +#define OCF_LE_READ_HOST_SUGGESTED_DATA_LENGTH 0x0024 +typedef struct { + uint8_t status; + uint16_t def_tx_octets; + uint16_t def_tx_time; +} __attribute__ ((packed)) +le_read_host_suggested_data_length_rp; +#define LE_READ_HOST_SUGGESTED_DATA_LENGTH_SIZE 5 + +#define OCF_LE_SET_DATA_LENGTH 0x0022 +typedef struct { + bdaddr_t bdaddr; + uint16_t max_tx_octets; + uint16_t max_tx_time; +} __attribute__ ((packed)) +le_set_data_length_cp; +#define LE_SET_DATA_LENGTH_CP_SIZE 10 + +typedef struct { + uint16_t handle; + uint8_t status; +} __attribute__ ((packed)) +le_set_data_length_rp; +#define LE_SET_DATA_LENGTH_RP_SIZE 3 +#endif + #define OCF_LE_ADD_DEVICE_TO_RESOLV_LIST 0x0027 typedef struct { uint8_t bdaddr_type; diff --git a/lib/mgmt.h b/lib/mgmt.h index 6a8f603b..6bec10e6 100644..100755 --- a/lib/mgmt.h +++ b/lib/mgmt.h @@ -908,6 +908,36 @@ struct mgmt_cp_disconnect_6lowpan { struct mgmt_addr_info addr; } __packed; +#define MGMT_OP_LE_READ_MAXIMUM_DATA_LENGTH (TIZEN_OP_CODE_BASE + 0x15) +struct mgmt_rp_le_read_maximum_data_length { + uint8_t status; + uint16_t max_tx_octets; + uint16_t max_tx_time; + uint16_t max_rx_octets; + uint16_t max_rx_time; +} __packed; + +#define MGMT_OP_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH (TIZEN_OP_CODE_BASE + 0x16) +struct mgmt_cp_le_write_host_suggested_data_length { + uint16_t def_tx_octets; + uint16_t def_tx_time; +} __packed; + +#define MGMT_OP_LE_READ_HOST_SUGGESTED_DATA_LENGTH (TIZEN_OP_CODE_BASE + 0x17) +struct mgmt_rp_le_read_host_suggested_data_length { + uint8_t status; + uint16_t def_tx_octets; + uint16_t def_tx_time; +} __packed; + +#define MGMT_OP_LE_SET_DATA_LENGTH (TIZEN_OP_CODE_BASE + 0x18) +struct mgmt_cp_le_set_data_length { + bdaddr_t bdaddr; + uint16_t max_tx_octets; + uint16_t max_tx_time; +} __packed; +#define MGMT_LE_SET_DATA_LENGTH_SIZE 10 + /* Currently there is no support in kernel for below MGMT cmd opcodes. */ #if 0 // Not defined in kernel #define MGMT_OP_READ_RSSI (TIZEN_OP_CODE_BASE + 0x11) @@ -1039,6 +1069,15 @@ struct mgmt_ev_6lowpan_conn_state_changed { uint8_t connected; } __packed; +#define MGMT_EV_LE_DATA_LENGTH_CHANGED (TIZEN_EV_BASE + 0x0d) +struct mgmt_ev_le_data_length_changed { + struct mgmt_addr_info addr; + int16_t max_tx_octets; + int16_t max_tx_time; + int16_t max_rx_octets; + int16_t max_rx_time; +} __packed; + /* Currently there is no support in kernel for below MGMT events. */ #if 0 // Not defined in kernel #define MGMT_EV_NEW_LOCAL_IRK (TIZEN_EV_BASE + 0x0b) |