xref: /nrf52832-nimble/packages/NimBLE-latest/nimble/controller/src/ble_ll_conn_priv.h (revision 042d53a763ad75cb1465103098bb88c245d95138)
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 
20*042d53a7SEvalZero #ifndef H_BLE_LL_CONN_PRIV_
21*042d53a7SEvalZero #define H_BLE_LL_CONN_PRIV_
22*042d53a7SEvalZero 
23*042d53a7SEvalZero #include "controller/ble_ll_conn.h"
24*042d53a7SEvalZero 
25*042d53a7SEvalZero #ifdef __cplusplus
26*042d53a7SEvalZero extern "C" {
27*042d53a7SEvalZero #endif
28*042d53a7SEvalZero 
29*042d53a7SEvalZero /*
30*042d53a7SEvalZero  * Definitions for min/max RX/TX time/bytes values allowed for connections.
31*042d53a7SEvalZero  * Source: Core 5.0 specification, Vol 6, Part B, section 4.5.10
32*042d53a7SEvalZero  */
33*042d53a7SEvalZero #define BLE_LL_CONN_SUPP_TIME_MIN           (328)   /* usecs */
34*042d53a7SEvalZero #define BLE_LL_CONN_SUPP_TIME_MAX           (17040) /* usecs */
35*042d53a7SEvalZero #define BLE_LL_CONN_SUPP_TIME_MIN_UNCODED   (328)   /* usecs */
36*042d53a7SEvalZero #define BLE_LL_CONN_SUPP_TIME_MAX_UNCODED   (2120)  /* usecs */
37*042d53a7SEvalZero #define BLE_LL_CONN_SUPP_TIME_MIN_CODED     (2704)  /* usecs */
38*042d53a7SEvalZero #define BLE_LL_CONN_SUPP_TIME_MAX_CODED     (17040) /* usecs */
39*042d53a7SEvalZero #define BLE_LL_CONN_SUPP_BYTES_MIN          (27)    /* bytes */
40*042d53a7SEvalZero #define BLE_LL_CONN_SUPP_BYTES_MAX          (251)   /* bytes */
41*042d53a7SEvalZero 
42*042d53a7SEvalZero /* Connection event timing */
43*042d53a7SEvalZero #define BLE_LL_CONN_INITIAL_OFFSET          (1250)
44*042d53a7SEvalZero #define BLE_LL_CONN_ITVL_USECS              (1250)
45*042d53a7SEvalZero #define BLE_LL_CONN_TX_WIN_USECS            (1250)
46*042d53a7SEvalZero #define BLE_LL_CONN_TX_OFF_USECS            (1250)
47*042d53a7SEvalZero #define BLE_LL_CONN_CE_USECS                (625)
48*042d53a7SEvalZero #define BLE_LL_CONN_TX_WIN_MIN              (1)         /* in tx win units */
49*042d53a7SEvalZero #define BLE_LL_CONN_SLAVE_LATENCY_MAX       (499)
50*042d53a7SEvalZero 
51*042d53a7SEvalZero /* Connection handle range */
52*042d53a7SEvalZero #define BLE_LL_CONN_MAX_CONN_HANDLE         (0x0EFF)
53*042d53a7SEvalZero 
54*042d53a7SEvalZero /* Offset (in bytes) of advertising address in connect request */
55*042d53a7SEvalZero #define BLE_LL_CONN_REQ_ADVA_OFF    (BLE_LL_PDU_HDR_LEN + BLE_DEV_ADDR_LEN)
56*042d53a7SEvalZero 
57*042d53a7SEvalZero /* Default authenticated payload timeout (30 seconds; in 10 msecs increments) */
58*042d53a7SEvalZero #define BLE_LL_CONN_DEF_AUTH_PYLD_TMO       (3000)
59*042d53a7SEvalZero #define BLE_LL_CONN_AUTH_PYLD_OS_TMO(x)     ble_npl_time_ms_to_ticks32((x) * 10)
60*042d53a7SEvalZero 
61*042d53a7SEvalZero 
62*042d53a7SEvalZero typedef void (*ble_ll_hci_post_cmd_complete_cb)(void);
63*042d53a7SEvalZero 
64*042d53a7SEvalZero /* Global Link Layer connection parameters */
65*042d53a7SEvalZero struct ble_ll_conn_global_params
66*042d53a7SEvalZero {
67*042d53a7SEvalZero     uint8_t master_chan_map[BLE_LL_CONN_CHMAP_LEN];
68*042d53a7SEvalZero     uint8_t num_used_chans;
69*042d53a7SEvalZero     uint8_t supp_max_tx_octets;
70*042d53a7SEvalZero     uint8_t supp_max_rx_octets;
71*042d53a7SEvalZero     uint8_t conn_init_max_tx_octets;
72*042d53a7SEvalZero     uint8_t sugg_tx_octets;
73*042d53a7SEvalZero     uint16_t sugg_tx_time;
74*042d53a7SEvalZero     uint16_t conn_init_max_tx_time;
75*042d53a7SEvalZero     uint16_t conn_init_max_tx_time_uncoded;
76*042d53a7SEvalZero     uint16_t conn_init_max_tx_time_coded;
77*042d53a7SEvalZero     uint16_t supp_max_tx_time;
78*042d53a7SEvalZero     uint16_t supp_max_rx_time;
79*042d53a7SEvalZero };
80*042d53a7SEvalZero extern struct ble_ll_conn_global_params g_ble_ll_conn_params;
81*042d53a7SEvalZero 
82*042d53a7SEvalZero /* Some data structures used by other LL routines */
83*042d53a7SEvalZero SLIST_HEAD(ble_ll_conn_active_list, ble_ll_conn_sm);
84*042d53a7SEvalZero STAILQ_HEAD(ble_ll_conn_free_list, ble_ll_conn_sm);
85*042d53a7SEvalZero extern struct ble_ll_conn_active_list g_ble_ll_conn_active_list;
86*042d53a7SEvalZero extern struct ble_ll_conn_free_list g_ble_ll_conn_free_list;
87*042d53a7SEvalZero 
88*042d53a7SEvalZero /* Pointer to connection state machine we are trying to create */
89*042d53a7SEvalZero extern struct ble_ll_conn_sm *g_ble_ll_conn_create_sm;
90*042d53a7SEvalZero 
91*042d53a7SEvalZero /* Generic interface */
92*042d53a7SEvalZero struct ble_ll_len_req;
93*042d53a7SEvalZero struct hci_create_conn;
94*042d53a7SEvalZero struct ble_mbuf_hdr;
95*042d53a7SEvalZero struct ble_ll_adv_sm;
96*042d53a7SEvalZero 
97*042d53a7SEvalZero void ble_ll_conn_sm_new(struct ble_ll_conn_sm *connsm);
98*042d53a7SEvalZero void ble_ll_conn_end(struct ble_ll_conn_sm *connsm, uint8_t ble_err);
99*042d53a7SEvalZero void ble_ll_conn_enqueue_pkt(struct ble_ll_conn_sm *connsm, struct os_mbuf *om,
100*042d53a7SEvalZero                              uint8_t hdr_byte, uint8_t length);
101*042d53a7SEvalZero struct ble_ll_conn_sm *ble_ll_conn_sm_get(void);
102*042d53a7SEvalZero void ble_ll_conn_master_init(struct ble_ll_conn_sm *connsm,
103*042d53a7SEvalZero                              struct hci_create_conn *hcc);
104*042d53a7SEvalZero #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV)
105*042d53a7SEvalZero void ble_ll_conn_ext_master_init(struct ble_ll_conn_sm *connsm,
106*042d53a7SEvalZero                                  struct hci_ext_create_conn *hcc);
107*042d53a7SEvalZero 
108*042d53a7SEvalZero void ble_ll_conn_ext_set_params(struct ble_ll_conn_sm *connsm,
109*042d53a7SEvalZero                                 struct hci_ext_conn_params *hcc_params,
110*042d53a7SEvalZero                                 int phy);
111*042d53a7SEvalZero #endif
112*042d53a7SEvalZero 
113*042d53a7SEvalZero struct ble_ll_conn_sm *ble_ll_conn_find_active_conn(uint16_t handle);
114*042d53a7SEvalZero void ble_ll_conn_datalen_update(struct ble_ll_conn_sm *connsm,
115*042d53a7SEvalZero                                 struct ble_ll_len_req *req);
116*042d53a7SEvalZero 
117*042d53a7SEvalZero /* Advertising interface */
118*042d53a7SEvalZero int ble_ll_conn_slave_start(uint8_t *rxbuf, uint8_t pat,
119*042d53a7SEvalZero                             struct ble_mbuf_hdr *rxhdr, bool force_csa2);
120*042d53a7SEvalZero 
121*042d53a7SEvalZero /* Link Layer interface */
122*042d53a7SEvalZero void ble_ll_conn_module_init(void);
123*042d53a7SEvalZero void ble_ll_conn_set_global_chanmap(uint8_t num_used_chans, uint8_t *chanmap);
124*042d53a7SEvalZero void ble_ll_conn_module_reset(void);
125*042d53a7SEvalZero void ble_ll_conn_tx_pkt_in(struct os_mbuf *om, uint16_t handle, uint16_t len);
126*042d53a7SEvalZero int ble_ll_conn_rx_isr_start(struct ble_mbuf_hdr *rxhdr, uint32_t aa);
127*042d53a7SEvalZero int ble_ll_conn_rx_isr_end(uint8_t *rxbuf, struct ble_mbuf_hdr *rxhdr);
128*042d53a7SEvalZero void ble_ll_conn_rx_data_pdu(struct os_mbuf *rxpdu, struct ble_mbuf_hdr *hdr);
129*042d53a7SEvalZero void ble_ll_init_rx_pkt_in(uint8_t pdu_type, uint8_t *rxbuf,
130*042d53a7SEvalZero                            struct ble_mbuf_hdr *ble_hdr);
131*042d53a7SEvalZero int ble_ll_init_rx_isr_start(uint8_t pdu_type, struct ble_mbuf_hdr *ble_hdr);
132*042d53a7SEvalZero int ble_ll_init_rx_isr_end(uint8_t *rxbuf, uint8_t crcok,
133*042d53a7SEvalZero                            struct ble_mbuf_hdr *ble_hdr);
134*042d53a7SEvalZero void ble_ll_conn_wfr_timer_exp(void);
135*042d53a7SEvalZero void ble_ll_conn_init_wfr_timer_exp(void);
136*042d53a7SEvalZero int ble_ll_conn_is_lru(struct ble_ll_conn_sm *s1, struct ble_ll_conn_sm *s2);
137*042d53a7SEvalZero uint32_t ble_ll_conn_get_ce_end_time(void);
138*042d53a7SEvalZero void ble_ll_conn_event_halt(void);
139*042d53a7SEvalZero uint8_t ble_ll_conn_calc_used_chans(uint8_t *chmap);
140*042d53a7SEvalZero void ble_ll_conn_reset_pending_aux_conn_rsp(void);
141*042d53a7SEvalZero bool ble_ll_conn_init_pending_aux_conn_rsp(void);
142*042d53a7SEvalZero /* HCI */
143*042d53a7SEvalZero void ble_ll_disconn_comp_event_send(struct ble_ll_conn_sm *connsm,
144*042d53a7SEvalZero                                     uint8_t reason);
145*042d53a7SEvalZero void ble_ll_auth_pyld_tmo_event_send(struct ble_ll_conn_sm *connsm);
146*042d53a7SEvalZero int ble_ll_conn_hci_disconnect_cmd(uint8_t *cmdbuf);
147*042d53a7SEvalZero int ble_ll_conn_hci_rd_rem_ver_cmd(uint8_t *cmdbuf);
148*042d53a7SEvalZero int ble_ll_conn_create(uint8_t *cmdbuf);
149*042d53a7SEvalZero int ble_ll_conn_hci_update(uint8_t *cmdbuf);
150*042d53a7SEvalZero int ble_ll_conn_hci_set_chan_class(uint8_t *cmdbuf);
151*042d53a7SEvalZero int ble_ll_conn_hci_param_reply(uint8_t *cmdbuf, int negative_reply,
152*042d53a7SEvalZero                                 uint8_t *rspbuf, uint8_t *rsplen);
153*042d53a7SEvalZero int ble_ll_conn_create_cancel(ble_ll_hci_post_cmd_complete_cb *post_cmd_cb);
154*042d53a7SEvalZero void ble_ll_conn_num_comp_pkts_event_send(struct ble_ll_conn_sm *connsm);
155*042d53a7SEvalZero void ble_ll_conn_comp_event_send(struct ble_ll_conn_sm *connsm, uint8_t status,
156*042d53a7SEvalZero                                  uint8_t *evbuf, struct ble_ll_adv_sm *advsm);
157*042d53a7SEvalZero void ble_ll_conn_timeout(struct ble_ll_conn_sm *connsm, uint8_t ble_err);
158*042d53a7SEvalZero int ble_ll_conn_hci_chk_conn_params(uint16_t itvl_min, uint16_t itvl_max,
159*042d53a7SEvalZero                                     uint16_t latency, uint16_t spvn_tmo);
160*042d53a7SEvalZero int ble_ll_conn_hci_read_rem_features(uint8_t *cmdbuf);
161*042d53a7SEvalZero int ble_ll_conn_hci_read_rem_features_complete(void);
162*042d53a7SEvalZero int ble_ll_conn_hci_rd_rssi(uint8_t *cmdbuf, uint8_t *rspbuf, uint8_t *rsplen);
163*042d53a7SEvalZero int ble_ll_conn_hci_rd_chan_map(uint8_t *cmdbuf, uint8_t *rspbuf,
164*042d53a7SEvalZero                                 uint8_t *rsplen);
165*042d53a7SEvalZero int ble_ll_conn_hci_set_data_len(uint8_t *cmdbuf, uint8_t *rspbuf,
166*042d53a7SEvalZero                                  uint8_t *rsplen);
167*042d53a7SEvalZero int ble_ll_conn_hci_le_start_encrypt(uint8_t *cmdbuf);
168*042d53a7SEvalZero int ble_ll_conn_hci_le_ltk_reply(uint8_t *cmdbuf, uint8_t *rspbuf,
169*042d53a7SEvalZero                                  uint8_t *rsplen);
170*042d53a7SEvalZero int ble_ll_conn_hci_le_ltk_neg_reply(uint8_t *cmdbuf, uint8_t *rspbuf,
171*042d53a7SEvalZero                                      uint8_t *rsplen);
172*042d53a7SEvalZero int ble_ll_conn_hci_wr_auth_pyld_tmo(uint8_t *cmdbuf, uint8_t *rsp,
173*042d53a7SEvalZero                                      uint8_t *rsplen);
174*042d53a7SEvalZero int ble_ll_conn_hci_rd_auth_pyld_tmo(uint8_t *cmdbuf, uint8_t *rsp,
175*042d53a7SEvalZero                                      uint8_t *rsplen);
176*042d53a7SEvalZero #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_PING) == 1)
177*042d53a7SEvalZero void ble_ll_conn_auth_pyld_timer_start(struct ble_ll_conn_sm *connsm);
178*042d53a7SEvalZero #else
179*042d53a7SEvalZero #define ble_ll_conn_auth_pyld_timer_start(x)
180*042d53a7SEvalZero #endif
181*042d53a7SEvalZero 
182*042d53a7SEvalZero int ble_ll_hci_cmd_rx(uint8_t *cmd, void *arg);
183*042d53a7SEvalZero int ble_ll_hci_acl_rx(struct os_mbuf *om, void *arg);
184*042d53a7SEvalZero 
185*042d53a7SEvalZero int ble_ll_conn_hci_le_rd_phy(uint8_t *cmdbuf, uint8_t *rsp, uint8_t *rsplen);
186*042d53a7SEvalZero int ble_ll_conn_hci_le_set_phy(uint8_t *cmdbuf);
187*042d53a7SEvalZero int ble_ll_conn_chk_phy_upd_start(struct ble_ll_conn_sm *connsm);
188*042d53a7SEvalZero #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV)
189*042d53a7SEvalZero int ble_ll_ext_conn_create(uint8_t *cmdbuf, uint8_t cmdlen);
190*042d53a7SEvalZero #endif
191*042d53a7SEvalZero #ifdef __cplusplus
192*042d53a7SEvalZero }
193*042d53a7SEvalZero #endif
194*042d53a7SEvalZero 
195*042d53a7SEvalZero #endif /* H_BLE_LL_CONN_PRIV_ */
196