Bluetooth: Create separate bt_recv_prio() API

Since callers of bt_recv() have so far anyway been required to know in
which context to call it (based on e.g. bt_hci_evt_is_prio) it's
cleaner to have two separate APIs: bt_recv and bt_recv_prio.

Change-Id: Icd0d9aed9c51ffd2def31432c4ffcc16a9f13ccd
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
This commit is contained in:
Johan Hedberg 2017-01-02 13:43:12 +02:00
parent 3341d7d2b5
commit d64f47d956
6 changed files with 55 additions and 39 deletions

View file

@ -251,8 +251,8 @@ static inline void read_payload(void)
rx.have_hdr = false;
if (prio) {
BT_DBG("Calling bt_recv(%p)", buf);
bt_recv(buf);
BT_DBG("Calling bt_recv_prio(%p)", buf);
bt_recv_prio(buf);
} else {
BT_DBG("Putting buf %p to rx fifo", buf);
net_buf_put(&rx.fifo, buf);

View file

@ -35,7 +35,6 @@
extern "C" {
#endif
#if defined(CONFIG_BLUETOOTH_RECV_IS_RX_THREAD)
/** Helper for the HCI driver to know which events are ok to be passed
* through the RX thread and which must be given to bt_recv() from another
* context. If this function returns true it's safe to pass the event
@ -60,11 +59,13 @@ static inline bool bt_hci_evt_is_prio(uint8_t evt)
return false;
}
}
#endif
/* Receive data from the controller/HCI driver */
int bt_recv(struct net_buf *buf);
/* Receive priority event from the controller/HCI driver */
int bt_recv_prio(struct net_buf *buf);
enum bt_hci_driver_bus {
BT_HCI_DRIVER_BUS_VIRTUAL = 0,
BT_HCI_DRIVER_BUS_USB = 1,

View file

@ -222,7 +222,7 @@ static void recv_thread(void *p1, void *p2, void *p3)
bt_buf_set_type(buf, BT_BUF_EVT);
hci_num_cmplt_encode(buf, handle, num_cmplt);
BT_DBG("Num Complete: 0x%04x:%u", handle, num_cmplt);
bt_recv(buf);
bt_recv_prio(buf);
k_yield();
}
@ -294,7 +294,7 @@ static int cmd_handle(struct net_buf *buf)
err = hci_cmd_handle(buf, evt);
if (!err && evt->len) {
BT_DBG("Replying with event of %u bytes", evt->len);
bt_recv(evt);
bt_recv_prio(evt);
} else {
net_buf_unref(evt);
}

View file

@ -2605,6 +2605,8 @@ static void hci_event(struct net_buf *buf)
BT_DBG("event 0x%02x", hdr->evt);
BT_ASSERT(!bt_hci_evt_is_prio(hdr->evt));
net_buf_pull(buf, sizeof(*hdr));
switch (hdr->evt) {
@ -3412,37 +3414,6 @@ int bt_send(struct net_buf *buf)
return bt_dev.drv->send(buf);
}
static inline void handle_event(struct net_buf *buf)
{
struct bt_hci_evt_hdr *hdr = (void *)buf->data;
switch (hdr->evt) {
case BT_HCI_EVT_CMD_COMPLETE:
net_buf_pull(buf, sizeof(*hdr));
hci_cmd_complete(buf);
break;
case BT_HCI_EVT_CMD_STATUS:
net_buf_pull(buf, sizeof(*hdr));
hci_cmd_status(buf);
break;
#if defined(CONFIG_BLUETOOTH_CONN)
case BT_HCI_EVT_NUM_COMPLETED_PACKETS:
net_buf_pull(buf, sizeof(*hdr));
hci_num_completed_packets(buf);
break;
#endif /* CONFIG_BLUETOOTH_CONN */
default:
#if defined(CONFIG_BLUETOOTH_RECV_IS_RX_THREAD)
hci_event(net_buf_ref(buf));
#else
net_buf_put(&bt_dev.rx_queue, net_buf_ref(buf));
#endif
break;
}
net_buf_unref(buf);
}
int bt_recv(struct net_buf *buf)
{
bt_monitor_send(bt_monitor_opcode(buf), buf->data, buf->len);
@ -3466,7 +3437,11 @@ int bt_recv(struct net_buf *buf)
return 0;
#endif /* BLUETOOTH_CONN */
case BT_BUF_EVT:
handle_event(buf);
#if defined(CONFIG_BLUETOOTH_RECV_IS_RX_THREAD)
hci_event(buf);
#else
net_buf_put(&bt_dev.rx_queue, buf);
#endif
return 0;
default:
BT_ERR("Invalid buf type %u", bt_buf_get_type(buf));
@ -3475,6 +3450,41 @@ int bt_recv(struct net_buf *buf)
}
}
int bt_recv_prio(struct net_buf *buf)
{
struct bt_hci_evt_hdr *hdr = (void *)buf->data;
bt_monitor_send(bt_monitor_opcode(buf), buf->data, buf->len);
BT_ASSERT(bt_buf_get_type(buf) == BT_BUF_EVT);
BT_ASSERT(buf->len >= sizeof(*hdr));
BT_ASSERT(bt_hci_evt_is_prio(hdr->evt));
net_buf_pull(buf, sizeof(*hdr));
switch (hdr->evt) {
case BT_HCI_EVT_CMD_COMPLETE:
hci_cmd_complete(buf);
break;
case BT_HCI_EVT_CMD_STATUS:
hci_cmd_status(buf);
break;
#if defined(CONFIG_BLUETOOTH_CONN)
case BT_HCI_EVT_NUM_COMPLETED_PACKETS:
hci_num_completed_packets(buf);
break;
#endif /* CONFIG_BLUETOOTH_CONN */
default:
net_buf_unref(buf);
BT_ASSERT(0);
return -EINVAL;
}
net_buf_unref(buf);
return 0;
}
int bt_hci_driver_register(struct bt_hci_driver *drv)
{
if (bt_dev.drv) {

View file

@ -87,7 +87,7 @@ static void send_cmd_status(uint16_t opcode, uint8_t status)
evt->opcode = sys_cpu_to_le16(opcode);
evt->status = status;
bt_recv(buf);
bt_recv_prio(buf);
}
static uint8_t generate_keys(EccPoint *pkey, uint32_t private_key[8])

View file

@ -100,6 +100,11 @@ int bt_recv(struct net_buf *buf)
return 0;
}
int bt_recv_prio(struct net_buf *buf)
{
return bt_recv(buf);
}
int bt_send(struct net_buf *buf)
{
BT_DBG("buf %p len %u", buf, buf->len);