Bluetooth: Controller: Use hci.h for ACL data

Switch to using the definitions in include/bluetooth/hci.h
for ACL data handling, both in RX and TX.

Jira: ZEP-726

Change-Id: I6b5f6de4ff568c4e73432df3edfa7d0a57f22fff
Signed-off-by: Carles Cufi <carles.cufi@nordicsemi.no>
This commit is contained in:
Carles Cufi 2016-09-13 10:36:50 +02:00 committed by Johan Hedberg
commit ec44eae44d

View file

@ -45,14 +45,6 @@ enum {
HCI_EVT = 0x04, HCI_EVT = 0x04,
}; };
struct __packed hci_data {
uint16_t handle:12;
uint16_t pb:2;
uint16_t bc:2;
uint16_t len;
uint8_t data[1];
};
static struct { static struct {
uint16_t rx_len; uint16_t rx_len;
uint8_t rx[HCI_PACKET_SIZE_MAX]; uint8_t rx[HCI_PACKET_SIZE_MAX];
@ -62,8 +54,8 @@ static struct {
#define HCI_EVT_LEN(evt) ((uint8_t)(1 + sizeof(struct bt_hci_evt_hdr) + \ #define HCI_EVT_LEN(evt) ((uint8_t)(1 + sizeof(struct bt_hci_evt_hdr) + \
evt->len)) evt->len))
#define HCI_DATA_LEN(dat) ((uint8_t)(1 + offsetof(struct hci_data, data) + \ #define HCI_DATA_LEN(data_hdr) ((uint8_t)(1 + sizeof(struct bt_hci_acl_hdr) + \
dat->len)) data_hdr->len))
#define _HCI_CC_LEN(st) ((uint8_t)(sizeof(struct bt_hci_evt_cmd_complete) + \ #define _HCI_CC_LEN(st) ((uint8_t)(sizeof(struct bt_hci_evt_cmd_complete) + \
sizeof(st))) sizeof(st)))
@ -864,18 +856,21 @@ 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 hci_data *data; struct bt_hci_acl_hdr *data;
uint16_t handle;
uint8_t flags;
if (!(hci_context.rx_len > offsetof(struct hci_data, data))) { if (!(hci_context.rx_len > sizeof(struct bt_hci_acl_hdr))) {
return; return;
} }
data = (struct hci_data *)&hci_context.rx[1]; data = (struct bt_hci_acl_hdr *)&hci_context.rx[1];
if (!(hci_context.rx_len >= if (!(hci_context.rx_len >=
(1 + offsetof(struct hci_data, data) + (1 + sizeof(struct bt_hci_acl_hdr) + data->len))) {
data->len))) {
return; return;
} }
handle = bt_acl_handle(data->handle);
flags = bt_acl_flags(data->handle);
struct radio_pdu_node_tx *radio_pdu_node_tx; struct radio_pdu_node_tx *radio_pdu_node_tx;
@ -884,18 +879,17 @@ static void hci_data_handle(void)
struct pdu_data *pdu_data; struct pdu_data *pdu_data;
pdu_data = (struct pdu_data *)radio_pdu_node_tx->pdu_data; pdu_data = (struct pdu_data *)radio_pdu_node_tx->pdu_data;
if (data->pb == 0x00 || data->pb == 0x02) { if (flags == BT_ACL_START_NO_FLUSH || flags == BT_ACL_START) {
pdu_data->ll_id = PDU_DATA_LLID_DATA_START; pdu_data->ll_id = PDU_DATA_LLID_DATA_START;
} 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 = data->len;
memcpy(&pdu_data->payload.lldata[0], memcpy(&pdu_data->payload.lldata[0],
&data->data[0], ((uint8_t *)data) + sizeof(struct bt_hci_acl_hdr),
data->len); data->len);
if (radio_tx_mem_enqueue(data->handle, radio_pdu_node_tx)) { if (radio_tx_mem_enqueue(handle, radio_pdu_node_tx)) {
radio_tx_mem_release radio_tx_mem_release(radio_pdu_node_tx);
(radio_pdu_node_tx);
} }
} }
@ -1272,15 +1266,14 @@ static void encode_data_ctrl(struct radio_pdu_node_rx *radio_pdu_node_rx,
static void encode_data(uint8_t *buf, uint8_t *len, uint8_t **out) static void encode_data(uint8_t *buf, uint8_t *len, uint8_t **out)
{ {
uint16_t instance;
struct hci_data *data;
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 pdu_data *pdu_data; struct pdu_data *pdu_data;
uint16_t handle;
radio_pdu_node_rx = (struct radio_pdu_node_rx *)buf; radio_pdu_node_rx = (struct radio_pdu_node_rx *)buf;
pdu_data = (struct pdu_data *)radio_pdu_node_rx->pdu_data; pdu_data = (struct pdu_data *)radio_pdu_node_rx->pdu_data;
instance = radio_pdu_node_rx->hdr.handle; handle = radio_pdu_node_rx->hdr.handle;
switch (pdu_data->ll_id) { switch (pdu_data->ll_id) {
case PDU_DATA_LLID_DATA_CONTINUE: case PDU_DATA_LLID_DATA_CONTINUE:
@ -1288,19 +1281,17 @@ static void encode_data(uint8_t *buf, uint8_t *len, uint8_t **out)
#if !TEST_DROP_RX #if !TEST_DROP_RX
hci_context.tx[0] = HCI_DATA; hci_context.tx[0] = HCI_DATA;
data = (struct hci_data *)&hci_context.tx[1]; acl = (struct bt_hci_acl_hdr *)&hci_context.tx[1];
data->handle = instance;
if (pdu_data->ll_id == PDU_DATA_LLID_DATA_START) { if (pdu_data->ll_id == PDU_DATA_LLID_DATA_START) {
data->pb = 0x02; acl->handle = bt_acl_handle_pack(handle, BT_ACL_START);
} else { } else {
data->pb = 0x01; acl->handle = bt_acl_handle_pack(handle, BT_ACL_CONT);
} }
data->bc = 0; acl->len = pdu_data->len;
data->len = pdu_data->len; memcpy(((uint8_t *)acl) + sizeof(struct bt_hci_acl_hdr),
memcpy(&data->data[0], &pdu_data->payload.lldata[0], &pdu_data->payload.lldata[0], pdu_data->len);
pdu_data->len);
*len = HCI_DATA_LEN(data); *len = HCI_DATA_LEN(acl);
*out = &hci_context.tx[0]; *out = &hci_context.tx[0];
#else #else
if (s_rx_cnt != pdu_data->payload.lldata[0]) { if (s_rx_cnt != pdu_data->payload.lldata[0]) {