1*042d53a7SEvalZero /*
2*042d53a7SEvalZero * Licensed to the Apache Software Foundation (ASF) under one
3*042d53a7SEvalZero * or more contributor license agreements. See the NOTICE file
4*042d53a7SEvalZero * distributed with this work for additional information
5*042d53a7SEvalZero * regarding copyright ownership. The ASF licenses this file
6*042d53a7SEvalZero * to you under the Apache License, Version 2.0 (the
7*042d53a7SEvalZero * "License"); you may not use this file except in compliance
8*042d53a7SEvalZero * with the License. You may obtain a copy of the License at
9*042d53a7SEvalZero *
10*042d53a7SEvalZero * http://www.apache.org/licenses/LICENSE-2.0
11*042d53a7SEvalZero *
12*042d53a7SEvalZero * Unless required by applicable law or agreed to in writing,
13*042d53a7SEvalZero * software distributed under the License is distributed on an
14*042d53a7SEvalZero * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15*042d53a7SEvalZero * KIND, either express or implied. See the License for the
16*042d53a7SEvalZero * specific language governing permissions and limitations
17*042d53a7SEvalZero * under the License.
18*042d53a7SEvalZero */
19*042d53a7SEvalZero #include <stdint.h>
20*042d53a7SEvalZero #include <assert.h>
21*042d53a7SEvalZero #include <string.h>
22*042d53a7SEvalZero #include "syscfg/syscfg.h"
23*042d53a7SEvalZero #include "nimble/ble.h"
24*042d53a7SEvalZero #include "nimble/hci_common.h"
25*042d53a7SEvalZero #include "nimble/ble_hci_trans.h"
26*042d53a7SEvalZero #include "controller/ble_ll.h"
27*042d53a7SEvalZero #include "controller/ble_ll_hci.h"
28*042d53a7SEvalZero #include "controller/ble_ll_ctrl.h"
29*042d53a7SEvalZero #include "ble_ll_conn_priv.h"
30*042d53a7SEvalZero
31*042d53a7SEvalZero #if (BLETEST_CONCURRENT_CONN_TEST == 1)
32*042d53a7SEvalZero extern void bletest_ltk_req_reply(uint16_t handle);
33*042d53a7SEvalZero #endif
34*042d53a7SEvalZero
35*042d53a7SEvalZero /**
36*042d53a7SEvalZero * Send a data length change event for a connection to the host.
37*042d53a7SEvalZero *
38*042d53a7SEvalZero * @param connsm Pointer to connection state machine
39*042d53a7SEvalZero */
40*042d53a7SEvalZero void
ble_ll_hci_ev_datalen_chg(struct ble_ll_conn_sm * connsm)41*042d53a7SEvalZero ble_ll_hci_ev_datalen_chg(struct ble_ll_conn_sm *connsm)
42*042d53a7SEvalZero {
43*042d53a7SEvalZero uint8_t *evbuf;
44*042d53a7SEvalZero
45*042d53a7SEvalZero if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_DATA_LEN_CHG)) {
46*042d53a7SEvalZero evbuf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI);
47*042d53a7SEvalZero if (evbuf) {
48*042d53a7SEvalZero evbuf[0] = BLE_HCI_EVCODE_LE_META;
49*042d53a7SEvalZero evbuf[1] = BLE_HCI_LE_DATA_LEN_CHG_LEN;
50*042d53a7SEvalZero evbuf[2] = BLE_HCI_LE_SUBEV_DATA_LEN_CHG;
51*042d53a7SEvalZero put_le16(evbuf + 3, connsm->conn_handle);
52*042d53a7SEvalZero put_le16(evbuf + 5, connsm->eff_max_tx_octets);
53*042d53a7SEvalZero put_le16(evbuf + 7, connsm->eff_max_tx_time);
54*042d53a7SEvalZero put_le16(evbuf + 9, connsm->eff_max_rx_octets);
55*042d53a7SEvalZero put_le16(evbuf + 11, connsm->eff_max_rx_time);
56*042d53a7SEvalZero ble_ll_hci_event_send(evbuf);
57*042d53a7SEvalZero }
58*042d53a7SEvalZero }
59*042d53a7SEvalZero }
60*042d53a7SEvalZero
61*042d53a7SEvalZero /**
62*042d53a7SEvalZero * Send a connection parameter request event for a connection to the host.
63*042d53a7SEvalZero *
64*042d53a7SEvalZero * @param connsm Pointer to connection state machine
65*042d53a7SEvalZero */
66*042d53a7SEvalZero void
ble_ll_hci_ev_rem_conn_parm_req(struct ble_ll_conn_sm * connsm,struct ble_ll_conn_params * cp)67*042d53a7SEvalZero ble_ll_hci_ev_rem_conn_parm_req(struct ble_ll_conn_sm *connsm,
68*042d53a7SEvalZero struct ble_ll_conn_params *cp)
69*042d53a7SEvalZero {
70*042d53a7SEvalZero uint8_t *evbuf;
71*042d53a7SEvalZero
72*042d53a7SEvalZero if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_REM_CONN_PARM_REQ)) {
73*042d53a7SEvalZero evbuf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI);
74*042d53a7SEvalZero if (evbuf) {
75*042d53a7SEvalZero evbuf[0] = BLE_HCI_EVCODE_LE_META;
76*042d53a7SEvalZero evbuf[1] = BLE_HCI_LE_REM_CONN_PARM_REQ_LEN;
77*042d53a7SEvalZero evbuf[2] = BLE_HCI_LE_SUBEV_REM_CONN_PARM_REQ;
78*042d53a7SEvalZero put_le16(evbuf + 3, connsm->conn_handle);
79*042d53a7SEvalZero put_le16(evbuf + 5, cp->interval_min);
80*042d53a7SEvalZero put_le16(evbuf + 7, cp->interval_max);
81*042d53a7SEvalZero put_le16(evbuf + 9, cp->latency);
82*042d53a7SEvalZero put_le16(evbuf + 11, cp->timeout);
83*042d53a7SEvalZero ble_ll_hci_event_send(evbuf);
84*042d53a7SEvalZero }
85*042d53a7SEvalZero }
86*042d53a7SEvalZero }
87*042d53a7SEvalZero
88*042d53a7SEvalZero /**
89*042d53a7SEvalZero * Send a connection update event.
90*042d53a7SEvalZero *
91*042d53a7SEvalZero * @param connsm Pointer to connection state machine
92*042d53a7SEvalZero * @param status The error code.
93*042d53a7SEvalZero */
94*042d53a7SEvalZero void
ble_ll_hci_ev_conn_update(struct ble_ll_conn_sm * connsm,uint8_t status)95*042d53a7SEvalZero ble_ll_hci_ev_conn_update(struct ble_ll_conn_sm *connsm, uint8_t status)
96*042d53a7SEvalZero {
97*042d53a7SEvalZero uint8_t *evbuf;
98*042d53a7SEvalZero
99*042d53a7SEvalZero if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_CONN_UPD_COMPLETE)) {
100*042d53a7SEvalZero evbuf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI);
101*042d53a7SEvalZero if (evbuf) {
102*042d53a7SEvalZero evbuf[0] = BLE_HCI_EVCODE_LE_META;
103*042d53a7SEvalZero evbuf[1] = BLE_HCI_LE_CONN_UPD_LEN;
104*042d53a7SEvalZero evbuf[2] = BLE_HCI_LE_SUBEV_CONN_UPD_COMPLETE;
105*042d53a7SEvalZero evbuf[3] = status;
106*042d53a7SEvalZero put_le16(evbuf + 4, connsm->conn_handle);
107*042d53a7SEvalZero put_le16(evbuf + 6, connsm->conn_itvl);
108*042d53a7SEvalZero put_le16(evbuf + 8, connsm->slave_latency);
109*042d53a7SEvalZero put_le16(evbuf + 10, connsm->supervision_tmo);
110*042d53a7SEvalZero ble_ll_hci_event_send(evbuf);
111*042d53a7SEvalZero }
112*042d53a7SEvalZero }
113*042d53a7SEvalZero }
114*042d53a7SEvalZero
115*042d53a7SEvalZero #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION) == 1)
116*042d53a7SEvalZero void
ble_ll_hci_ev_encrypt_chg(struct ble_ll_conn_sm * connsm,uint8_t status)117*042d53a7SEvalZero ble_ll_hci_ev_encrypt_chg(struct ble_ll_conn_sm *connsm, uint8_t status)
118*042d53a7SEvalZero {
119*042d53a7SEvalZero uint8_t evcode;
120*042d53a7SEvalZero uint8_t *evbuf;
121*042d53a7SEvalZero uint8_t evlen;
122*042d53a7SEvalZero
123*042d53a7SEvalZero if (CONN_F_ENC_CHANGE_SENT(connsm) == 0) {
124*042d53a7SEvalZero evcode = BLE_HCI_EVCODE_ENCRYPT_CHG;
125*042d53a7SEvalZero evlen = BLE_HCI_EVENT_ENCRYPT_CHG_LEN;
126*042d53a7SEvalZero } else {
127*042d53a7SEvalZero evcode = BLE_HCI_EVCODE_ENC_KEY_REFRESH;
128*042d53a7SEvalZero evlen = BLE_HCI_EVENT_ENC_KEY_REFRESH_LEN;
129*042d53a7SEvalZero }
130*042d53a7SEvalZero
131*042d53a7SEvalZero if (ble_ll_hci_is_event_enabled(evcode)) {
132*042d53a7SEvalZero evbuf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI);
133*042d53a7SEvalZero if (evbuf) {
134*042d53a7SEvalZero evbuf[0] = evcode;
135*042d53a7SEvalZero evbuf[1] = evlen;
136*042d53a7SEvalZero evbuf[2] = status;
137*042d53a7SEvalZero put_le16(evbuf + 3, connsm->conn_handle);
138*042d53a7SEvalZero if (evcode == BLE_HCI_EVCODE_ENCRYPT_CHG) {
139*042d53a7SEvalZero if (status == BLE_ERR_SUCCESS) {
140*042d53a7SEvalZero evbuf[5] = 0x01;
141*042d53a7SEvalZero } else {
142*042d53a7SEvalZero evbuf[5] = 0;
143*042d53a7SEvalZero }
144*042d53a7SEvalZero }
145*042d53a7SEvalZero ble_ll_hci_event_send(evbuf);
146*042d53a7SEvalZero }
147*042d53a7SEvalZero }
148*042d53a7SEvalZero CONN_F_ENC_CHANGE_SENT(connsm) = 1;
149*042d53a7SEvalZero }
150*042d53a7SEvalZero
151*042d53a7SEvalZero /**
152*042d53a7SEvalZero * Send a long term key request event for a connection to the host.
153*042d53a7SEvalZero *
154*042d53a7SEvalZero * @param connsm Pointer to connection state machine
155*042d53a7SEvalZero */
156*042d53a7SEvalZero int
ble_ll_hci_ev_ltk_req(struct ble_ll_conn_sm * connsm)157*042d53a7SEvalZero ble_ll_hci_ev_ltk_req(struct ble_ll_conn_sm *connsm)
158*042d53a7SEvalZero {
159*042d53a7SEvalZero int rc;
160*042d53a7SEvalZero uint8_t *evbuf;
161*042d53a7SEvalZero
162*042d53a7SEvalZero if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_LT_KEY_REQ)) {
163*042d53a7SEvalZero evbuf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI);
164*042d53a7SEvalZero if (evbuf) {
165*042d53a7SEvalZero evbuf[0] = BLE_HCI_EVCODE_LE_META;
166*042d53a7SEvalZero evbuf[1] = BLE_HCI_LE_LT_KEY_REQ_LEN;
167*042d53a7SEvalZero evbuf[2] = BLE_HCI_LE_SUBEV_LT_KEY_REQ;
168*042d53a7SEvalZero put_le16(evbuf + 3, connsm->conn_handle);
169*042d53a7SEvalZero put_le64(evbuf + 5, connsm->enc_data.host_rand_num);
170*042d53a7SEvalZero put_le16(evbuf + 13, connsm->enc_data.enc_div);
171*042d53a7SEvalZero ble_ll_hci_event_send(evbuf);
172*042d53a7SEvalZero }
173*042d53a7SEvalZero rc = 0;
174*042d53a7SEvalZero } else {
175*042d53a7SEvalZero rc = -1;
176*042d53a7SEvalZero }
177*042d53a7SEvalZero
178*042d53a7SEvalZero #if (BLETEST_CONCURRENT_CONN_TEST == 1)
179*042d53a7SEvalZero if (rc == 0) {
180*042d53a7SEvalZero bletest_ltk_req_reply(connsm->conn_handle);
181*042d53a7SEvalZero }
182*042d53a7SEvalZero #endif
183*042d53a7SEvalZero return rc;
184*042d53a7SEvalZero }
185*042d53a7SEvalZero #endif
186*042d53a7SEvalZero
187*042d53a7SEvalZero void
ble_ll_hci_ev_rd_rem_used_feat(struct ble_ll_conn_sm * connsm,uint8_t status)188*042d53a7SEvalZero ble_ll_hci_ev_rd_rem_used_feat(struct ble_ll_conn_sm *connsm, uint8_t status)
189*042d53a7SEvalZero {
190*042d53a7SEvalZero uint8_t *evbuf;
191*042d53a7SEvalZero
192*042d53a7SEvalZero if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_RD_REM_USED_FEAT)) {
193*042d53a7SEvalZero evbuf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI);
194*042d53a7SEvalZero if (evbuf) {
195*042d53a7SEvalZero evbuf[0] = BLE_HCI_EVCODE_LE_META;
196*042d53a7SEvalZero evbuf[1] = BLE_HCI_LE_RD_REM_USED_FEAT_LEN;
197*042d53a7SEvalZero evbuf[2] = BLE_HCI_LE_SUBEV_RD_REM_USED_FEAT;
198*042d53a7SEvalZero evbuf[3] = status;
199*042d53a7SEvalZero put_le16(evbuf + 4, connsm->conn_handle);
200*042d53a7SEvalZero memset(evbuf + 6, 0, BLE_HCI_RD_LOC_SUPP_FEAT_RSPLEN);
201*042d53a7SEvalZero evbuf[6] = connsm->conn_features;
202*042d53a7SEvalZero memcpy(evbuf + 7, connsm->remote_features, 7);
203*042d53a7SEvalZero ble_ll_hci_event_send(evbuf);
204*042d53a7SEvalZero }
205*042d53a7SEvalZero }
206*042d53a7SEvalZero }
207*042d53a7SEvalZero
208*042d53a7SEvalZero void
ble_ll_hci_ev_rd_rem_ver(struct ble_ll_conn_sm * connsm,uint8_t status)209*042d53a7SEvalZero ble_ll_hci_ev_rd_rem_ver(struct ble_ll_conn_sm *connsm, uint8_t status)
210*042d53a7SEvalZero {
211*042d53a7SEvalZero uint8_t *evbuf;
212*042d53a7SEvalZero
213*042d53a7SEvalZero if (ble_ll_hci_is_event_enabled(BLE_HCI_EVCODE_RD_REM_VER_INFO_CMP)) {
214*042d53a7SEvalZero evbuf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI);
215*042d53a7SEvalZero if (evbuf) {
216*042d53a7SEvalZero evbuf[0] = BLE_HCI_EVCODE_RD_REM_VER_INFO_CMP;
217*042d53a7SEvalZero evbuf[1] = BLE_HCI_EVENT_RD_RM_VER_LEN;
218*042d53a7SEvalZero evbuf[2] = status;
219*042d53a7SEvalZero put_le16(evbuf + 3, connsm->conn_handle);
220*042d53a7SEvalZero evbuf[5] = connsm->vers_nr;
221*042d53a7SEvalZero put_le16(evbuf + 6, connsm->comp_id);
222*042d53a7SEvalZero put_le16(evbuf + 8, connsm->sub_vers_nr);
223*042d53a7SEvalZero ble_ll_hci_event_send(evbuf);
224*042d53a7SEvalZero }
225*042d53a7SEvalZero }
226*042d53a7SEvalZero }
227*042d53a7SEvalZero
228*042d53a7SEvalZero /**
229*042d53a7SEvalZero * Send a HW error to the host.
230*042d53a7SEvalZero *
231*042d53a7SEvalZero * @param hw_err
232*042d53a7SEvalZero *
233*042d53a7SEvalZero * @return int 0: event masked or event sent, -1 otherwise
234*042d53a7SEvalZero */
235*042d53a7SEvalZero int
ble_ll_hci_ev_hw_err(uint8_t hw_err)236*042d53a7SEvalZero ble_ll_hci_ev_hw_err(uint8_t hw_err)
237*042d53a7SEvalZero {
238*042d53a7SEvalZero int rc;
239*042d53a7SEvalZero uint8_t *evbuf;
240*042d53a7SEvalZero
241*042d53a7SEvalZero rc = 0;
242*042d53a7SEvalZero if (ble_ll_hci_is_event_enabled(BLE_HCI_EVCODE_HW_ERROR)) {
243*042d53a7SEvalZero evbuf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI);
244*042d53a7SEvalZero if (evbuf) {
245*042d53a7SEvalZero evbuf[0] = BLE_HCI_EVCODE_HW_ERROR;
246*042d53a7SEvalZero evbuf[1] = BLE_HCI_EVENT_HW_ERROR_LEN;
247*042d53a7SEvalZero evbuf[2] = hw_err;
248*042d53a7SEvalZero ble_ll_hci_event_send(evbuf);
249*042d53a7SEvalZero } else {
250*042d53a7SEvalZero rc = -1;
251*042d53a7SEvalZero }
252*042d53a7SEvalZero }
253*042d53a7SEvalZero return rc;
254*042d53a7SEvalZero }
255*042d53a7SEvalZero
256*042d53a7SEvalZero void
ble_ll_hci_ev_databuf_overflow(void)257*042d53a7SEvalZero ble_ll_hci_ev_databuf_overflow(void)
258*042d53a7SEvalZero {
259*042d53a7SEvalZero uint8_t *evbuf;
260*042d53a7SEvalZero
261*042d53a7SEvalZero if (ble_ll_hci_is_event_enabled(BLE_HCI_EVCODE_DATA_BUF_OVERFLOW)) {
262*042d53a7SEvalZero evbuf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI);
263*042d53a7SEvalZero if (evbuf) {
264*042d53a7SEvalZero evbuf[0] = BLE_HCI_EVCODE_DATA_BUF_OVERFLOW;
265*042d53a7SEvalZero evbuf[1] = BLE_HCI_EVENT_DATABUF_OVERFLOW_LEN;
266*042d53a7SEvalZero evbuf[2] = BLE_HCI_EVENT_ACL_BUF_OVERFLOW;
267*042d53a7SEvalZero ble_ll_hci_event_send(evbuf);
268*042d53a7SEvalZero }
269*042d53a7SEvalZero }
270*042d53a7SEvalZero }
271*042d53a7SEvalZero
272*042d53a7SEvalZero /**
273*042d53a7SEvalZero * Send a LE Channel Selection Algorithm event.
274*042d53a7SEvalZero *
275*042d53a7SEvalZero * @param connsm Pointer to connection state machine
276*042d53a7SEvalZero */
277*042d53a7SEvalZero #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CSA2) == 1)
278*042d53a7SEvalZero void
ble_ll_hci_ev_le_csa(struct ble_ll_conn_sm * connsm)279*042d53a7SEvalZero ble_ll_hci_ev_le_csa(struct ble_ll_conn_sm *connsm)
280*042d53a7SEvalZero {
281*042d53a7SEvalZero uint8_t *evbuf;
282*042d53a7SEvalZero
283*042d53a7SEvalZero if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_CHAN_SEL_ALG)) {
284*042d53a7SEvalZero evbuf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI);
285*042d53a7SEvalZero if (evbuf) {
286*042d53a7SEvalZero evbuf[0] = BLE_HCI_EVCODE_LE_META;
287*042d53a7SEvalZero evbuf[1] = BLE_HCI_LE_SUBEV_CHAN_SEL_ALG_LEN;
288*042d53a7SEvalZero evbuf[2] = BLE_HCI_LE_SUBEV_CHAN_SEL_ALG;
289*042d53a7SEvalZero put_le16(evbuf + 3, connsm->conn_handle);
290*042d53a7SEvalZero evbuf[5] = connsm->csmflags.cfbit.csa2_supp ? 0x01 : 0x00;
291*042d53a7SEvalZero ble_ll_hci_event_send(evbuf);
292*042d53a7SEvalZero }
293*042d53a7SEvalZero }
294*042d53a7SEvalZero }
295*042d53a7SEvalZero #endif
296*042d53a7SEvalZero
297*042d53a7SEvalZero /**
298*042d53a7SEvalZero * Sends the LE Scan Request Received event
299*042d53a7SEvalZero *
300*042d53a7SEvalZero */
301*042d53a7SEvalZero #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV)
302*042d53a7SEvalZero void
ble_ll_hci_ev_send_scan_req_recv(uint8_t adv_handle,const uint8_t * peer,uint8_t peer_addr_type)303*042d53a7SEvalZero ble_ll_hci_ev_send_scan_req_recv(uint8_t adv_handle, const uint8_t *peer,
304*042d53a7SEvalZero uint8_t peer_addr_type)
305*042d53a7SEvalZero {
306*042d53a7SEvalZero uint8_t *evbuf;
307*042d53a7SEvalZero
308*042d53a7SEvalZero if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_SCAN_REQ_RCVD)) {
309*042d53a7SEvalZero evbuf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI);
310*042d53a7SEvalZero if (evbuf) {
311*042d53a7SEvalZero evbuf[0] = BLE_HCI_EVCODE_LE_META;
312*042d53a7SEvalZero evbuf[1] = BLE_HCI_LE_SUBEV_SCAN_REQ_RCVD_LEN;
313*042d53a7SEvalZero evbuf[2] = BLE_HCI_LE_SUBEV_SCAN_REQ_RCVD;
314*042d53a7SEvalZero evbuf[3] = adv_handle;
315*042d53a7SEvalZero evbuf[4] = peer_addr_type;
316*042d53a7SEvalZero memcpy(&evbuf[5], peer, BLE_DEV_ADDR_LEN);
317*042d53a7SEvalZero ble_ll_hci_event_send(evbuf);
318*042d53a7SEvalZero }
319*042d53a7SEvalZero }
320*042d53a7SEvalZero }
321*042d53a7SEvalZero #endif
322*042d53a7SEvalZero
323*042d53a7SEvalZero /**
324*042d53a7SEvalZero * Sends the LE Scan Timeout Event
325*042d53a7SEvalZero *
326*042d53a7SEvalZero */
327*042d53a7SEvalZero #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV)
328*042d53a7SEvalZero void
ble_ll_hci_ev_send_scan_timeout(void)329*042d53a7SEvalZero ble_ll_hci_ev_send_scan_timeout(void)
330*042d53a7SEvalZero {
331*042d53a7SEvalZero uint8_t *evbuf;
332*042d53a7SEvalZero
333*042d53a7SEvalZero if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_SCAN_TIMEOUT)) {
334*042d53a7SEvalZero evbuf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI);
335*042d53a7SEvalZero if (evbuf) {
336*042d53a7SEvalZero evbuf[0] = BLE_HCI_EVCODE_LE_META;
337*042d53a7SEvalZero evbuf[1] = BLE_HCI_LE_SUBEV_SCAN_TIMEOUT_LEN;
338*042d53a7SEvalZero evbuf[2] = BLE_HCI_LE_SUBEV_SCAN_TIMEOUT;
339*042d53a7SEvalZero ble_ll_hci_event_send(evbuf);
340*042d53a7SEvalZero }
341*042d53a7SEvalZero }
342*042d53a7SEvalZero }
343*042d53a7SEvalZero #endif
344*042d53a7SEvalZero
345*042d53a7SEvalZero /**
346*042d53a7SEvalZero * Sends the LE Advertising Set Terminated event
347*042d53a7SEvalZero *
348*042d53a7SEvalZero */
349*042d53a7SEvalZero #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV)
350*042d53a7SEvalZero void
ble_ll_hci_ev_send_adv_set_terminated(uint8_t status,uint8_t adv_handle,uint16_t conn_handle,uint8_t events)351*042d53a7SEvalZero ble_ll_hci_ev_send_adv_set_terminated(uint8_t status, uint8_t adv_handle,
352*042d53a7SEvalZero uint16_t conn_handle, uint8_t events)
353*042d53a7SEvalZero {
354*042d53a7SEvalZero uint8_t *evbuf;
355*042d53a7SEvalZero
356*042d53a7SEvalZero if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_ADV_SET_TERMINATED)) {
357*042d53a7SEvalZero evbuf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI);
358*042d53a7SEvalZero if (evbuf) {
359*042d53a7SEvalZero evbuf[0] = BLE_HCI_EVCODE_LE_META;
360*042d53a7SEvalZero evbuf[1] = BLE_HCI_LE_SUBEV_ADV_SET_TERMINATED_LEN;
361*042d53a7SEvalZero evbuf[2] = BLE_HCI_LE_SUBEV_ADV_SET_TERMINATED;
362*042d53a7SEvalZero evbuf[3] = status;
363*042d53a7SEvalZero evbuf[4] = adv_handle;
364*042d53a7SEvalZero put_le16(evbuf + 5, conn_handle);
365*042d53a7SEvalZero evbuf[7] = events;
366*042d53a7SEvalZero ble_ll_hci_event_send(evbuf);
367*042d53a7SEvalZero }
368*042d53a7SEvalZero }
369*042d53a7SEvalZero }
370*042d53a7SEvalZero #endif
371*042d53a7SEvalZero
372*042d53a7SEvalZero /**
373*042d53a7SEvalZero * Send a PHY update complete event
374*042d53a7SEvalZero *
375*042d53a7SEvalZero * @param connsm Pointer to connection state machine
376*042d53a7SEvalZero * @param status error status of event
377*042d53a7SEvalZero */
378*042d53a7SEvalZero #if (BLE_LL_BT5_PHY_SUPPORTED == 1)
379*042d53a7SEvalZero int
ble_ll_hci_ev_phy_update(struct ble_ll_conn_sm * connsm,uint8_t status)380*042d53a7SEvalZero ble_ll_hci_ev_phy_update(struct ble_ll_conn_sm *connsm, uint8_t status)
381*042d53a7SEvalZero {
382*042d53a7SEvalZero int rc;
383*042d53a7SEvalZero uint8_t *evbuf;
384*042d53a7SEvalZero
385*042d53a7SEvalZero rc = 0;
386*042d53a7SEvalZero if (ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_PHY_UPDATE_COMPLETE)) {
387*042d53a7SEvalZero evbuf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI);
388*042d53a7SEvalZero if (evbuf) {
389*042d53a7SEvalZero evbuf[0] = BLE_HCI_EVCODE_LE_META;
390*042d53a7SEvalZero evbuf[1] = BLE_HCI_LE_PHY_UPD_LEN;
391*042d53a7SEvalZero evbuf[2] = BLE_HCI_LE_SUBEV_PHY_UPDATE_COMPLETE;
392*042d53a7SEvalZero evbuf[3] = status;
393*042d53a7SEvalZero put_le16(evbuf + 4, connsm->conn_handle);
394*042d53a7SEvalZero evbuf[6] = connsm->phy_data.cur_tx_phy;
395*042d53a7SEvalZero evbuf[7] = connsm->phy_data.cur_rx_phy;
396*042d53a7SEvalZero ble_ll_hci_event_send(evbuf);
397*042d53a7SEvalZero } else {
398*042d53a7SEvalZero rc = BLE_ERR_MEM_CAPACITY;
399*042d53a7SEvalZero }
400*042d53a7SEvalZero }
401*042d53a7SEvalZero return rc;
402*042d53a7SEvalZero }
403*042d53a7SEvalZero #endif
404*042d53a7SEvalZero
405*042d53a7SEvalZero void
ble_ll_hci_ev_send_vendor_err(char * file,uint32_t line)406*042d53a7SEvalZero ble_ll_hci_ev_send_vendor_err(char *file, uint32_t line)
407*042d53a7SEvalZero {
408*042d53a7SEvalZero uint8_t *evbuf;
409*042d53a7SEvalZero uint8_t file_len = strlen(file);
410*042d53a7SEvalZero
411*042d53a7SEvalZero evbuf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI);
412*042d53a7SEvalZero if (!evbuf) {
413*042d53a7SEvalZero return;
414*042d53a7SEvalZero }
415*042d53a7SEvalZero
416*042d53a7SEvalZero evbuf[0] = BLE_HCI_EVCODE_VENDOR_DEBUG;
417*042d53a7SEvalZero evbuf[1] = file_len + sizeof(line) + 1;
418*042d53a7SEvalZero /* Debug id for future use */
419*042d53a7SEvalZero evbuf[2] = 0x00;
420*042d53a7SEvalZero memcpy(&evbuf[3], file, file_len);
421*042d53a7SEvalZero put_le32(&evbuf[3] + file_len, line);
422*042d53a7SEvalZero ble_ll_hci_event_send(evbuf);
423*042d53a7SEvalZero }
424