Bluetooth: Controller: Make HCI endianness-independent
Use the sys_ macros from byteorder.h to access all HCI structure members that are endianness-dependent. Jira: ZEP-726 Change-Id: I950f8eaca7048bf7972c2c4c347cfd5bbba17eb6 Signed-off-by: Carles Cufi <carles.cufi@nordicsemi.no>
This commit is contained in:
parent
c320abc72c
commit
4c9f1017c8
1 changed files with 119 additions and 69 deletions
|
@ -96,9 +96,11 @@ static struct {
|
||||||
static void disconnect(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
static void disconnect(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
||||||
{
|
{
|
||||||
struct bt_hci_cp_disconnect *cmd = (void *)cp;
|
struct bt_hci_cp_disconnect *cmd = (void *)cp;
|
||||||
|
uint16_t handle;
|
||||||
uint32_t status;
|
uint32_t status;
|
||||||
|
|
||||||
status = radio_terminate_ind_send(cmd->handle, cmd->reason);
|
handle = sys_le16_to_cpu(cmd->handle);
|
||||||
|
status = radio_terminate_ind_send(handle, cmd->reason);
|
||||||
|
|
||||||
evt->evt = BT_HCI_EVT_CMD_STATUS;
|
evt->evt = BT_HCI_EVT_CMD_STATUS;
|
||||||
evt->len = sizeof(struct bt_hci_evt_cmd_status);
|
evt->len = sizeof(struct bt_hci_evt_cmd_status);
|
||||||
|
@ -109,9 +111,11 @@ static void disconnect(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
||||||
static void read_remote_ver_info(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
static void read_remote_ver_info(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
||||||
{
|
{
|
||||||
struct bt_hci_cp_read_remote_version_info *cmd = (void *)cp;
|
struct bt_hci_cp_read_remote_version_info *cmd = (void *)cp;
|
||||||
|
uint16_t handle;
|
||||||
uint32_t status;
|
uint32_t status;
|
||||||
|
|
||||||
status = radio_version_ind_send(cmd->handle);
|
handle = sys_le16_to_cpu(cmd->handle);
|
||||||
|
status = radio_version_ind_send(handle);
|
||||||
|
|
||||||
evt->evt = BT_HCI_EVT_CMD_STATUS;
|
evt->evt = BT_HCI_EVT_CMD_STATUS;
|
||||||
evt->len = sizeof(struct bt_hci_evt_cmd_status);
|
evt->len = sizeof(struct bt_hci_evt_cmd_status);
|
||||||
|
@ -188,10 +192,10 @@ static void read_local_version_info(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
||||||
|
|
||||||
rp->status = 0x00;
|
rp->status = 0x00;
|
||||||
rp->hci_version = 0;
|
rp->hci_version = 0;
|
||||||
rp->hci_revision = 0;
|
rp->hci_revision = sys_cpu_to_le16(0);
|
||||||
rp->lmp_version = RADIO_BLE_VERSION_NUMBER;
|
rp->lmp_version = RADIO_BLE_VERSION_NUMBER;
|
||||||
rp->manufacturer = RADIO_BLE_COMPANY_ID;
|
rp->manufacturer = sys_cpu_to_le16(RADIO_BLE_COMPANY_ID);
|
||||||
rp->lmp_subversion = RADIO_BLE_SUB_VERSION_NUMBER;
|
rp->lmp_subversion = sys_cpu_to_le16(RADIO_BLE_SUB_VERSION_NUMBER);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void read_supported_commands(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
static void read_supported_commands(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
||||||
|
@ -306,7 +310,7 @@ static void le_read_buffer_size(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
||||||
|
|
||||||
rp->status = 0x00;
|
rp->status = 0x00;
|
||||||
|
|
||||||
rp->le_max_len = RADIO_LL_LENGTH_OCTETS_RX_MAX;
|
rp->le_max_len = sys_cpu_to_le16(RADIO_LL_LENGTH_OCTETS_RX_MAX);
|
||||||
rp->le_max_num = RADIO_PACKET_COUNT_TX_MAX;
|
rp->le_max_num = RADIO_PACKET_COUNT_TX_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -341,8 +345,11 @@ static void le_set_adv_param(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
||||||
uint8_t const c_adv_type[] = {
|
uint8_t const c_adv_type[] = {
|
||||||
PDU_ADV_TYPE_ADV_IND, PDU_ADV_TYPE_DIRECT_IND,
|
PDU_ADV_TYPE_ADV_IND, PDU_ADV_TYPE_DIRECT_IND,
|
||||||
PDU_ADV_TYPE_SCAN_IND, PDU_ADV_TYPE_NONCONN_IND };
|
PDU_ADV_TYPE_SCAN_IND, PDU_ADV_TYPE_NONCONN_IND };
|
||||||
|
uint16_t min_interval;
|
||||||
|
|
||||||
ll_adv_params_set(cmd->min_interval, c_adv_type[cmd->type],
|
min_interval = sys_le16_to_cpu(cmd->min_interval);
|
||||||
|
|
||||||
|
ll_adv_params_set(min_interval, c_adv_type[cmd->type],
|
||||||
cmd->own_addr_type, cmd->direct_addr.type,
|
cmd->own_addr_type, cmd->direct_addr.type,
|
||||||
&cmd->direct_addr.a.val[0], cmd->channel_map,
|
&cmd->direct_addr.a.val[0], cmd->channel_map,
|
||||||
cmd->filter_policy);
|
cmd->filter_policy);
|
||||||
|
@ -405,9 +412,14 @@ static void le_set_adv_enable(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
||||||
static void le_set_scan_params(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
static void le_set_scan_params(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
||||||
{
|
{
|
||||||
struct bt_hci_cp_le_set_scan_params *cmd = (void *)cp;
|
struct bt_hci_cp_le_set_scan_params *cmd = (void *)cp;
|
||||||
|
uint16_t interval;
|
||||||
|
uint16_t window;
|
||||||
|
|
||||||
ll_scan_params_set(cmd->scan_type, cmd->interval, cmd->window,
|
interval = sys_le16_to_cpu(cmd->interval);
|
||||||
cmd->addr_type, cmd->filter_policy);
|
window = sys_le16_to_cpu(cmd->window);
|
||||||
|
|
||||||
|
ll_scan_params_set(cmd->scan_type, interval, window, cmd->addr_type,
|
||||||
|
cmd->filter_policy);
|
||||||
|
|
||||||
evt->evt = BT_HCI_EVT_CMD_COMPLETE;
|
evt->evt = BT_HCI_EVT_CMD_COMPLETE;
|
||||||
evt->len = HCI_CC_LEN(struct bt_hci_evt_cc_status);
|
evt->len = HCI_CC_LEN(struct bt_hci_evt_cc_status);
|
||||||
|
@ -431,17 +443,25 @@ static void le_set_scan_enable(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
||||||
static void le_create_connection(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
static void le_create_connection(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
||||||
{
|
{
|
||||||
struct bt_hci_cp_le_create_conn *cmd = (void *)cp;
|
struct bt_hci_cp_le_create_conn *cmd = (void *)cp;
|
||||||
|
uint16_t supervision_timeout;
|
||||||
|
uint16_t conn_interval_max;
|
||||||
|
uint16_t scan_interval;
|
||||||
|
uint16_t conn_latency;
|
||||||
|
uint16_t scan_window;
|
||||||
uint32_t status;
|
uint32_t status;
|
||||||
|
|
||||||
status = ll_create_connection(cmd->scan_interval,
|
scan_interval = sys_le16_to_cpu(cmd->scan_interval);
|
||||||
cmd->scan_window,
|
scan_window = sys_le16_to_cpu(cmd->scan_window);
|
||||||
|
conn_interval_max = sys_le16_to_cpu(cmd->conn_interval_max);
|
||||||
|
conn_latency = sys_le16_to_cpu(cmd->conn_latency);
|
||||||
|
supervision_timeout = sys_le16_to_cpu(cmd->supervision_timeout);
|
||||||
|
|
||||||
|
status = ll_create_connection(scan_interval, scan_window,
|
||||||
cmd->filter_policy,
|
cmd->filter_policy,
|
||||||
cmd->peer_addr.type,
|
cmd->peer_addr.type,
|
||||||
&cmd->peer_addr.a.val[0],
|
&cmd->peer_addr.a.val[0],
|
||||||
cmd->own_addr_type,
|
cmd->own_addr_type, conn_interval_max,
|
||||||
cmd->conn_interval_max,
|
conn_latency, supervision_timeout);
|
||||||
cmd->conn_latency,
|
|
||||||
cmd->supervision_timeout);
|
|
||||||
|
|
||||||
evt->evt = BT_HCI_EVT_CMD_STATUS;
|
evt->evt = BT_HCI_EVT_CMD_STATUS;
|
||||||
evt->len = sizeof(struct bt_hci_evt_cmd_status);
|
evt->len = sizeof(struct bt_hci_evt_cmd_status);
|
||||||
|
@ -500,13 +520,22 @@ static void le_add_dev_to_wl(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
||||||
static void le_conn_update(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
static void le_conn_update(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
||||||
{
|
{
|
||||||
struct hci_cp_le_conn_update *cmd = (void *)cp;
|
struct hci_cp_le_conn_update *cmd = (void *)cp;
|
||||||
|
uint16_t supervision_timeout;
|
||||||
|
uint16_t conn_interval_max;
|
||||||
|
uint16_t conn_latency;
|
||||||
uint32_t status;
|
uint32_t status;
|
||||||
|
uint16_t handle;
|
||||||
|
|
||||||
|
handle = sys_le16_to_cpu(cmd->handle);
|
||||||
|
conn_interval_max = sys_le16_to_cpu(cmd->conn_interval_max);
|
||||||
|
conn_latency = sys_le16_to_cpu(cmd->conn_latency);
|
||||||
|
supervision_timeout = sys_le16_to_cpu(cmd->supervision_timeout);
|
||||||
|
|
||||||
/** @todo if peer supports LE Conn Param Req,
|
/** @todo if peer supports LE Conn Param Req,
|
||||||
* use Req cmd (1) instead of Initiate cmd (0).
|
* use Req cmd (1) instead of Initiate cmd (0).
|
||||||
*/
|
*/
|
||||||
status = radio_conn_update(cmd->handle, 0, 0, cmd->conn_interval_max,
|
status = radio_conn_update(handle, 0, 0, conn_interval_max,
|
||||||
cmd->conn_latency, cmd->supervision_timeout);
|
conn_latency, supervision_timeout);
|
||||||
|
|
||||||
evt->evt = BT_HCI_EVT_CMD_STATUS;
|
evt->evt = BT_HCI_EVT_CMD_STATUS;
|
||||||
evt->len = sizeof(struct bt_hci_evt_cmd_status);
|
evt->len = sizeof(struct bt_hci_evt_cmd_status);
|
||||||
|
@ -531,8 +560,10 @@ static void le_read_remote_features(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
||||||
{
|
{
|
||||||
struct bt_hci_cp_le_read_remote_features *cmd = (void *)cp;
|
struct bt_hci_cp_le_read_remote_features *cmd = (void *)cp;
|
||||||
uint32_t status;
|
uint32_t status;
|
||||||
|
uint16_t handle;
|
||||||
|
|
||||||
status = radio_feature_req_send(cmd->handle);
|
handle = sys_le16_to_cpu(cmd->handle);
|
||||||
|
status = radio_feature_req_send(handle);
|
||||||
|
|
||||||
evt->evt = BT_HCI_EVT_CMD_STATUS;
|
evt->evt = BT_HCI_EVT_CMD_STATUS;
|
||||||
evt->len = sizeof(struct bt_hci_evt_cmd_status);
|
evt->len = sizeof(struct bt_hci_evt_cmd_status);
|
||||||
|
@ -575,8 +606,10 @@ static void le_start_encryption(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
||||||
{
|
{
|
||||||
struct bt_hci_cp_le_start_encryption *cmd = (void *)cp;
|
struct bt_hci_cp_le_start_encryption *cmd = (void *)cp;
|
||||||
uint32_t status;
|
uint32_t status;
|
||||||
|
uint16_t handle;
|
||||||
|
|
||||||
status = radio_enc_req_send(cmd->handle,
|
handle = sys_le16_to_cpu(cmd->handle);
|
||||||
|
status = radio_enc_req_send(handle,
|
||||||
(uint8_t *)&cmd->rand,
|
(uint8_t *)&cmd->rand,
|
||||||
(uint8_t *)&cmd->ediv,
|
(uint8_t *)&cmd->ediv,
|
||||||
&cmd->ltk[0]);
|
&cmd->ltk[0]);
|
||||||
|
@ -592,8 +625,10 @@ static void le_ltk_req_reply(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
||||||
struct bt_hci_cp_le_ltk_req_reply *cmd = (void *)cp;
|
struct bt_hci_cp_le_ltk_req_reply *cmd = (void *)cp;
|
||||||
struct bt_hci_rp_le_ltk_req_reply *rp = HCI_CC_RP(evt);
|
struct bt_hci_rp_le_ltk_req_reply *rp = HCI_CC_RP(evt);
|
||||||
uint32_t status;
|
uint32_t status;
|
||||||
|
uint16_t handle;
|
||||||
|
|
||||||
status = radio_start_enc_req_send(cmd->handle, 0x00, &cmd->ltk[0]);
|
handle = sys_le16_to_cpu(cmd->handle);
|
||||||
|
status = radio_start_enc_req_send(handle, 0x00, &cmd->ltk[0]);
|
||||||
|
|
||||||
evt->evt = BT_HCI_EVT_CMD_COMPLETE;
|
evt->evt = BT_HCI_EVT_CMD_COMPLETE;
|
||||||
evt->len = HCI_CC_LEN(*rp);
|
evt->len = HCI_CC_LEN(*rp);
|
||||||
|
@ -606,9 +641,11 @@ static void le_ltk_req_neg_reply(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
||||||
struct bt_hci_cp_le_ltk_req_neg_reply *cmd = (void *)cp;
|
struct bt_hci_cp_le_ltk_req_neg_reply *cmd = (void *)cp;
|
||||||
struct bt_hci_rp_le_ltk_req_neg_reply *rp = HCI_CC_RP(evt);
|
struct bt_hci_rp_le_ltk_req_neg_reply *rp = HCI_CC_RP(evt);
|
||||||
uint32_t status;
|
uint32_t status;
|
||||||
|
uint16_t handle;
|
||||||
|
|
||||||
status = radio_start_enc_req_send(cmd->handle,
|
handle = sys_le16_to_cpu(cmd->handle);
|
||||||
BT_HCI_ERR_PIN_OR_KEY_MISSING, NULL);
|
status = radio_start_enc_req_send(handle, BT_HCI_ERR_PIN_OR_KEY_MISSING,
|
||||||
|
NULL);
|
||||||
|
|
||||||
evt->evt = BT_HCI_EVT_CMD_COMPLETE;
|
evt->evt = BT_HCI_EVT_CMD_COMPLETE;
|
||||||
evt->len = HCI_CC_LEN(*rp);
|
evt->len = HCI_CC_LEN(*rp);
|
||||||
|
@ -632,12 +669,19 @@ static void le_conn_param_req_reply(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
||||||
{
|
{
|
||||||
struct bt_hci_cp_le_conn_param_req_reply *cmd = (void *)cp;
|
struct bt_hci_cp_le_conn_param_req_reply *cmd = (void *)cp;
|
||||||
struct bt_hci_rp_le_conn_param_req_reply *rp = HCI_CC_RP(evt);
|
struct bt_hci_rp_le_conn_param_req_reply *rp = HCI_CC_RP(evt);
|
||||||
|
uint16_t interval_max;
|
||||||
|
uint16_t latency;
|
||||||
|
uint16_t timeout;
|
||||||
uint32_t status;
|
uint32_t status;
|
||||||
|
uint16_t handle;
|
||||||
|
|
||||||
status = radio_conn_update(cmd->handle, 2, 0,
|
handle = sys_le16_to_cpu(cmd->handle);
|
||||||
cmd->interval_max,
|
interval_max = sys_le16_to_cpu(cmd->interval_max);
|
||||||
cmd->latency,
|
latency = sys_le16_to_cpu(cmd->latency);
|
||||||
cmd->timeout);
|
timeout = sys_le16_to_cpu(cmd->timeout);
|
||||||
|
|
||||||
|
status = radio_conn_update(handle, 2, 0, interval_max, latency,
|
||||||
|
timeout);
|
||||||
|
|
||||||
evt->evt = BT_HCI_EVT_CMD_COMPLETE;
|
evt->evt = BT_HCI_EVT_CMD_COMPLETE;
|
||||||
evt->len = HCI_CC_LEN(*rp);
|
evt->len = HCI_CC_LEN(*rp);
|
||||||
|
@ -650,8 +694,10 @@ static void le_conn_param_req_neg_reply(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
||||||
struct bt_hci_cp_le_conn_param_req_neg_reply *cmd = (void *)cp;
|
struct bt_hci_cp_le_conn_param_req_neg_reply *cmd = (void *)cp;
|
||||||
struct bt_hci_rp_le_conn_param_req_neg_reply *rp = HCI_CC_RP(evt);
|
struct bt_hci_rp_le_conn_param_req_neg_reply *rp = HCI_CC_RP(evt);
|
||||||
uint32_t status;
|
uint32_t status;
|
||||||
|
uint16_t handle;
|
||||||
|
|
||||||
status = radio_conn_update(cmd->handle, 2, cmd->reason, 0, 0, 0);
|
handle = sys_le16_to_cpu(cmd->handle);
|
||||||
|
status = radio_conn_update(handle, 2, cmd->reason, 0, 0, 0);
|
||||||
|
|
||||||
evt->evt = BT_HCI_EVT_CMD_COMPLETE;
|
evt->evt = BT_HCI_EVT_CMD_COMPLETE;
|
||||||
evt->len = HCI_CC_LEN(*rp);
|
evt->len = HCI_CC_LEN(*rp);
|
||||||
|
@ -664,9 +710,13 @@ static void le_set_data_len(uint8_t *cp, struct bt_hci_evt_hdr *evt)
|
||||||
struct bt_hci_cp_le_set_data_len *cmd = (void *)cp;
|
struct bt_hci_cp_le_set_data_len *cmd = (void *)cp;
|
||||||
struct bt_hci_rp_le_set_data_len *rp = HCI_CC_RP(evt);
|
struct bt_hci_rp_le_set_data_len *rp = HCI_CC_RP(evt);
|
||||||
uint32_t status;
|
uint32_t status;
|
||||||
|
uint16_t tx_octets;
|
||||||
|
uint16_t handle;
|
||||||
|
|
||||||
|
handle = sys_le16_to_cpu(cmd->handle);
|
||||||
|
tx_octets = sys_le16_to_cpu(cmd->tx_octets);
|
||||||
/** @todo add reject_ext_ind support in ctrl.c */
|
/** @todo add reject_ext_ind support in ctrl.c */
|
||||||
status = radio_length_req_send(cmd->handle, cmd->tx_octets);
|
status = radio_length_req_send(handle, tx_octets);
|
||||||
|
|
||||||
evt->evt = BT_HCI_EVT_CMD_COMPLETE;
|
evt->evt = BT_HCI_EVT_CMD_COMPLETE;
|
||||||
evt->len = HCI_CC_LEN(*rp);
|
evt->len = HCI_CC_LEN(*rp);
|
||||||
|
@ -803,13 +853,13 @@ static int controller_cmd_handle(uint8_t ocf, uint8_t *cp, uint8_t *len,
|
||||||
static void hci_cmd_handle(struct bt_hci_cmd_hdr *cmd, uint8_t *len,
|
static void hci_cmd_handle(struct bt_hci_cmd_hdr *cmd, uint8_t *len,
|
||||||
uint8_t **out)
|
uint8_t **out)
|
||||||
{
|
{
|
||||||
struct bt_hci_evt_hdr *evt;
|
|
||||||
struct bt_hci_evt_cmd_complete *cc;
|
struct bt_hci_evt_cmd_complete *cc;
|
||||||
struct bt_hci_evt_cmd_status *cs;
|
struct bt_hci_evt_cmd_status *cs;
|
||||||
int err;
|
struct bt_hci_evt_hdr *evt;
|
||||||
uint16_t opcode;
|
uint16_t opcode;
|
||||||
uint8_t ocf;
|
uint8_t ocf;
|
||||||
uint8_t *cp;
|
uint8_t *cp;
|
||||||
|
int err;
|
||||||
|
|
||||||
*out = &hci_context.tx[0];
|
*out = &hci_context.tx[0];
|
||||||
hci_context.tx[0] = HCI_EVT;
|
hci_context.tx[0] = HCI_EVT;
|
||||||
|
@ -852,12 +902,12 @@ static void hci_cmd_handle(struct bt_hci_cmd_hdr *cmd, uint8_t *len,
|
||||||
switch (evt->evt) {
|
switch (evt->evt) {
|
||||||
case BT_HCI_EVT_CMD_COMPLETE:
|
case BT_HCI_EVT_CMD_COMPLETE:
|
||||||
cc->ncmd = 1;
|
cc->ncmd = 1;
|
||||||
cc->opcode = opcode;
|
cc->opcode = cmd->opcode;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BT_HCI_EVT_CMD_STATUS:
|
case BT_HCI_EVT_CMD_STATUS:
|
||||||
cs->ncmd = 1;
|
cs->ncmd = 1;
|
||||||
cs->opcode = opcode;
|
cs->opcode = cmd->opcode;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -866,23 +916,27 @@ static void hci_cmd_handle(struct bt_hci_cmd_hdr *cmd, uint8_t *len,
|
||||||
|
|
||||||
static void hci_data_handle(void)
|
static void hci_data_handle(void)
|
||||||
{
|
{
|
||||||
struct bt_hci_acl_hdr *data;
|
struct radio_pdu_node_tx *radio_pdu_node_tx;
|
||||||
|
struct bt_hci_acl_hdr *acl;
|
||||||
uint16_t handle;
|
uint16_t handle;
|
||||||
uint8_t flags;
|
uint8_t flags;
|
||||||
|
uint16_t len;
|
||||||
|
|
||||||
if (!(hci_context.rx_len > sizeof(struct bt_hci_acl_hdr))) {
|
if (!(hci_context.rx_len > sizeof(struct bt_hci_acl_hdr))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
data = (struct bt_hci_acl_hdr *)&hci_context.rx[1];
|
acl = (struct bt_hci_acl_hdr *)&hci_context.rx[1];
|
||||||
|
len = sys_le16_to_cpu(acl->len);
|
||||||
if (!(hci_context.rx_len >=
|
if (!(hci_context.rx_len >=
|
||||||
(1 + sizeof(struct bt_hci_acl_hdr) + data->len))) {
|
(1 + sizeof(struct bt_hci_acl_hdr) + len))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
handle = bt_acl_handle(data->handle);
|
|
||||||
flags = bt_acl_flags(data->handle);
|
|
||||||
|
|
||||||
struct radio_pdu_node_tx *radio_pdu_node_tx;
|
handle = sys_le16_to_cpu(acl->handle);
|
||||||
|
/* assigning flags first because handle will be overwritten */
|
||||||
|
flags = bt_acl_flags(handle);
|
||||||
|
handle = bt_acl_handle(handle);
|
||||||
|
|
||||||
radio_pdu_node_tx = radio_tx_mem_acquire();
|
radio_pdu_node_tx = radio_tx_mem_acquire();
|
||||||
if (radio_pdu_node_tx) {
|
if (radio_pdu_node_tx) {
|
||||||
|
@ -894,10 +948,9 @@ static void hci_data_handle(void)
|
||||||
} else {
|
} else {
|
||||||
pdu_data->ll_id = PDU_DATA_LLID_DATA_CONTINUE;
|
pdu_data->ll_id = PDU_DATA_LLID_DATA_CONTINUE;
|
||||||
}
|
}
|
||||||
pdu_data->len = data->len;
|
pdu_data->len = len;
|
||||||
memcpy(&pdu_data->payload.lldata[0],
|
memcpy(&pdu_data->payload.lldata[0],
|
||||||
((uint8_t *)data) + sizeof(struct bt_hci_acl_hdr),
|
((uint8_t *)acl) + sizeof(struct bt_hci_acl_hdr), len);
|
||||||
data->len);
|
|
||||||
if (radio_tx_mem_enqueue(handle, radio_pdu_node_tx)) {
|
if (radio_tx_mem_enqueue(handle, radio_pdu_node_tx)) {
|
||||||
radio_tx_mem_release(radio_pdu_node_tx);
|
radio_tx_mem_release(radio_pdu_node_tx);
|
||||||
}
|
}
|
||||||
|
@ -997,13 +1050,13 @@ static void le_conn_complete(struct pdu_data *pdu_data, uint16_t handle,
|
||||||
HCI_ME(evt)->subevent = BT_HCI_EVT_LE_CONN_COMPLETE;
|
HCI_ME(evt)->subevent = BT_HCI_EVT_LE_CONN_COMPLETE;
|
||||||
|
|
||||||
sep->status = radio_cc->status;
|
sep->status = radio_cc->status;
|
||||||
sep->handle = handle;
|
sep->handle = sys_cpu_to_le16(handle);
|
||||||
sep->role = radio_cc->role;
|
sep->role = radio_cc->role;
|
||||||
sep->peer_addr.type = radio_cc->peer_addr_type;
|
sep->peer_addr.type = radio_cc->peer_addr_type;
|
||||||
memcpy(&sep->peer_addr.a.val[0], &radio_cc->peer_addr[0], BDADDR_SIZE);
|
memcpy(&sep->peer_addr.a.val[0], &radio_cc->peer_addr[0], BDADDR_SIZE);
|
||||||
sep->interval = radio_cc->interval;
|
sep->interval = sys_cpu_to_le16(radio_cc->interval);
|
||||||
sep->latency = radio_cc->latency;
|
sep->latency = sys_cpu_to_le16(radio_cc->latency);
|
||||||
sep->supv_timeout = radio_cc->timeout;
|
sep->supv_timeout = sys_cpu_to_le16(radio_cc->timeout);
|
||||||
sep->clock_accuracy = radio_cc->mca;
|
sep->clock_accuracy = radio_cc->mca;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1016,7 +1069,7 @@ static void disconn_complete(struct pdu_data *pdu_data, uint16_t handle,
|
||||||
evt->len = sizeof(*ep);
|
evt->len = sizeof(*ep);
|
||||||
|
|
||||||
ep->status = 0x00;
|
ep->status = 0x00;
|
||||||
ep->handle = handle;
|
ep->handle = sys_cpu_to_le16(handle);
|
||||||
ep->reason = *((uint8_t *)pdu_data);
|
ep->reason = *((uint8_t *)pdu_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1034,10 +1087,10 @@ static void le_conn_update_complete(struct pdu_data *pdu_data, uint16_t handle,
|
||||||
HCI_ME(evt)->subevent = BT_HCI_EVT_LE_CONN_UPDATE_COMPLETE;
|
HCI_ME(evt)->subevent = BT_HCI_EVT_LE_CONN_UPDATE_COMPLETE;
|
||||||
|
|
||||||
sep->status = radio_cu->status;
|
sep->status = radio_cu->status;
|
||||||
sep->handle = handle;
|
sep->handle = sys_cpu_to_le16(handle);
|
||||||
sep->interval = radio_cu->interval;
|
sep->interval = sys_cpu_to_le16(radio_cu->interval);
|
||||||
sep->latency = radio_cu->latency;
|
sep->latency = sys_cpu_to_le16(radio_cu->latency);
|
||||||
sep->supv_timeout = radio_cu->timeout;
|
sep->supv_timeout = sys_cpu_to_le16(radio_cu->timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void enc_refresh_complete(struct pdu_data *pdu_data, uint16_t handle,
|
static void enc_refresh_complete(struct pdu_data *pdu_data, uint16_t handle,
|
||||||
|
@ -1049,7 +1102,7 @@ static void enc_refresh_complete(struct pdu_data *pdu_data, uint16_t handle,
|
||||||
evt->len = sizeof(*ep);
|
evt->len = sizeof(*ep);
|
||||||
|
|
||||||
ep->status = 0x00;
|
ep->status = 0x00;
|
||||||
ep->handle = handle;
|
ep->handle = sys_cpu_to_le16(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void auth_payload_timeout_exp(struct pdu_data *pdu_data, uint16_t handle,
|
static void auth_payload_timeout_exp(struct pdu_data *pdu_data, uint16_t handle,
|
||||||
|
@ -1060,7 +1113,7 @@ static void auth_payload_timeout_exp(struct pdu_data *pdu_data, uint16_t handle,
|
||||||
evt->evt = BT_HCI_EVT_AUTH_PAYLOAD_TIMEOUT_EXP;
|
evt->evt = BT_HCI_EVT_AUTH_PAYLOAD_TIMEOUT_EXP;
|
||||||
evt->len = sizeof(*ep);
|
evt->len = sizeof(*ep);
|
||||||
|
|
||||||
ep->handle = handle;
|
ep->handle = sys_cpu_to_le16(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void encode_control(struct radio_pdu_node_rx *radio_pdu_node_rx,
|
static void encode_control(struct radio_pdu_node_rx *radio_pdu_node_rx,
|
||||||
|
@ -1122,7 +1175,7 @@ static void le_ltk_request(struct pdu_data *pdu_data, uint16_t handle,
|
||||||
evt->len = HCI_ME_LEN(*sep);
|
evt->len = HCI_ME_LEN(*sep);
|
||||||
HCI_ME(evt)->subevent = BT_HCI_EVT_LE_LTK_REQUEST;
|
HCI_ME(evt)->subevent = BT_HCI_EVT_LE_LTK_REQUEST;
|
||||||
|
|
||||||
sep->handle = handle;
|
sep->handle = sys_cpu_to_le16(handle);
|
||||||
memcpy(&sep->rand, pdu_data->payload.llctrl.ctrldata.enc_req.rand,
|
memcpy(&sep->rand, pdu_data->payload.llctrl.ctrldata.enc_req.rand,
|
||||||
sizeof(uint64_t));
|
sizeof(uint64_t));
|
||||||
memcpy(&sep->ediv, pdu_data->payload.llctrl.ctrldata.enc_req.ediv,
|
memcpy(&sep->ediv, pdu_data->payload.llctrl.ctrldata.enc_req.ediv,
|
||||||
|
@ -1138,7 +1191,7 @@ static void encrypt_change(uint8_t err, uint16_t handle,
|
||||||
evt->len = sizeof(*ep);
|
evt->len = sizeof(*ep);
|
||||||
|
|
||||||
ep->status = err;
|
ep->status = err;
|
||||||
ep->handle = handle;
|
ep->handle = sys_cpu_to_le16(handle);
|
||||||
ep->encrypt = !err ? 1 : 0;
|
ep->encrypt = !err ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1152,7 +1205,7 @@ static void le_remote_feat_complete(struct pdu_data *pdu_data, uint16_t handle,
|
||||||
HCI_ME(evt)->subevent = BT_HCI_EV_LE_REMOTE_FEAT_COMPLETE;
|
HCI_ME(evt)->subevent = BT_HCI_EV_LE_REMOTE_FEAT_COMPLETE;
|
||||||
|
|
||||||
sep->status = 0x00;
|
sep->status = 0x00;
|
||||||
sep->handle = handle;
|
sep->handle = sys_cpu_to_le16(handle);
|
||||||
memcpy(&sep->features[0],
|
memcpy(&sep->features[0],
|
||||||
&pdu_data->payload.llctrl.ctrldata.feature_rsp.features[0],
|
&pdu_data->payload.llctrl.ctrldata.feature_rsp.features[0],
|
||||||
sizeof(sep->features));
|
sizeof(sep->features));
|
||||||
|
@ -1167,8 +1220,7 @@ static void remote_version_info(struct pdu_data *pdu_data, uint16_t handle,
|
||||||
evt->len = sizeof(*ep);
|
evt->len = sizeof(*ep);
|
||||||
|
|
||||||
ep->status = 0x00;
|
ep->status = 0x00;
|
||||||
ep->handle = handle;
|
ep->handle = sys_cpu_to_le16(handle);
|
||||||
|
|
||||||
ep->version =
|
ep->version =
|
||||||
pdu_data->payload.llctrl.ctrldata.version_ind.version_number;
|
pdu_data->payload.llctrl.ctrldata.version_ind.version_number;
|
||||||
ep->manufacturer =
|
ep->manufacturer =
|
||||||
|
@ -1186,16 +1238,13 @@ static void le_conn_param_req(struct pdu_data *pdu_data, uint16_t handle,
|
||||||
evt->len = HCI_ME_LEN(*sep);
|
evt->len = HCI_ME_LEN(*sep);
|
||||||
HCI_ME(evt)->subevent = BT_HCI_EVT_LE_CONN_PARAM_REQ;
|
HCI_ME(evt)->subevent = BT_HCI_EVT_LE_CONN_PARAM_REQ;
|
||||||
|
|
||||||
sep->handle = handle;
|
sep->handle = sys_cpu_to_le16(handle);
|
||||||
|
|
||||||
sep->interval_min =
|
sep->interval_min =
|
||||||
pdu_data->payload.llctrl.ctrldata.conn_param_req.interval_min;
|
pdu_data->payload.llctrl.ctrldata.conn_param_req.interval_min;
|
||||||
sep->interval_max =
|
sep->interval_max =
|
||||||
pdu_data->payload.llctrl.ctrldata.conn_param_req.interval_max;
|
pdu_data->payload.llctrl.ctrldata.conn_param_req.interval_max;
|
||||||
sep->latency =
|
sep->latency = pdu_data->payload.llctrl.ctrldata.conn_param_req.latency;
|
||||||
pdu_data->payload.llctrl.ctrldata.conn_param_req.latency;
|
sep->timeout = pdu_data->payload.llctrl.ctrldata.conn_param_req.timeout;
|
||||||
sep->timeout =
|
|
||||||
pdu_data->payload.llctrl.ctrldata.conn_param_req.timeout;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void le_data_len_change(struct pdu_data *pdu_data, uint16_t handle,
|
static void le_data_len_change(struct pdu_data *pdu_data, uint16_t handle,
|
||||||
|
@ -1207,8 +1256,7 @@ static void le_data_len_change(struct pdu_data *pdu_data, uint16_t handle,
|
||||||
evt->len = HCI_ME_LEN(*sep);
|
evt->len = HCI_ME_LEN(*sep);
|
||||||
HCI_ME(evt)->subevent = BT_HCI_EVT_LE_DATA_LEN_CHANGE;
|
HCI_ME(evt)->subevent = BT_HCI_EVT_LE_DATA_LEN_CHANGE;
|
||||||
|
|
||||||
sep->handle = handle;
|
sep->handle = sys_cpu_to_le16(handle);
|
||||||
|
|
||||||
sep->max_tx_octets =
|
sep->max_tx_octets =
|
||||||
pdu_data->payload.llctrl.ctrldata.length_rsp.max_tx_octets;
|
pdu_data->payload.llctrl.ctrldata.length_rsp.max_tx_octets;
|
||||||
sep->max_tx_time =
|
sep->max_tx_time =
|
||||||
|
@ -1279,6 +1327,7 @@ static void encode_data(uint8_t *buf, uint8_t *len, uint8_t **out)
|
||||||
struct radio_pdu_node_rx *radio_pdu_node_rx;
|
struct radio_pdu_node_rx *radio_pdu_node_rx;
|
||||||
struct bt_hci_acl_hdr *acl;
|
struct bt_hci_acl_hdr *acl;
|
||||||
struct pdu_data *pdu_data;
|
struct pdu_data *pdu_data;
|
||||||
|
uint16_t handle_flags;
|
||||||
uint16_t handle;
|
uint16_t handle;
|
||||||
|
|
||||||
radio_pdu_node_rx = (struct radio_pdu_node_rx *)buf;
|
radio_pdu_node_rx = (struct radio_pdu_node_rx *)buf;
|
||||||
|
@ -1293,11 +1342,12 @@ static void encode_data(uint8_t *buf, uint8_t *len, uint8_t **out)
|
||||||
|
|
||||||
acl = (struct bt_hci_acl_hdr *)&hci_context.tx[1];
|
acl = (struct bt_hci_acl_hdr *)&hci_context.tx[1];
|
||||||
if (pdu_data->ll_id == PDU_DATA_LLID_DATA_START) {
|
if (pdu_data->ll_id == PDU_DATA_LLID_DATA_START) {
|
||||||
acl->handle = bt_acl_handle_pack(handle, BT_ACL_START);
|
handle_flags = bt_acl_handle_pack(handle, BT_ACL_START);
|
||||||
} else {
|
} else {
|
||||||
acl->handle = bt_acl_handle_pack(handle, BT_ACL_CONT);
|
handle_flags = bt_acl_handle_pack(handle, BT_ACL_CONT);
|
||||||
}
|
}
|
||||||
acl->len = pdu_data->len;
|
acl->handle = sys_cpu_to_le16(handle_flags);
|
||||||
|
acl->len = sys_cpu_to_le16(pdu_data->len);
|
||||||
memcpy(((uint8_t *)acl) + sizeof(struct bt_hci_acl_hdr),
|
memcpy(((uint8_t *)acl) + sizeof(struct bt_hci_acl_hdr),
|
||||||
&pdu_data->payload.lldata[0], pdu_data->len);
|
&pdu_data->payload.lldata[0], pdu_data->len);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue