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_HS_CONN_ 21*042d53a7SEvalZero #define H_BLE_HS_CONN_ 22*042d53a7SEvalZero 23*042d53a7SEvalZero #include <inttypes.h> 24*042d53a7SEvalZero #include "ble_l2cap_priv.h" 25*042d53a7SEvalZero #include "ble_gatt_priv.h" 26*042d53a7SEvalZero #include "ble_att_priv.h" 27*042d53a7SEvalZero #ifdef __cplusplus 28*042d53a7SEvalZero extern "C" { 29*042d53a7SEvalZero #endif 30*042d53a7SEvalZero 31*042d53a7SEvalZero struct hci_le_conn_complete; 32*042d53a7SEvalZero struct hci_create_conn; 33*042d53a7SEvalZero struct ble_l2cap_chan; 34*042d53a7SEvalZero 35*042d53a7SEvalZero typedef uint8_t ble_hs_conn_flags_t; 36*042d53a7SEvalZero 37*042d53a7SEvalZero #define BLE_HS_CONN_F_MASTER 0x01 38*042d53a7SEvalZero #define BLE_HS_CONN_F_TERMINATING 0x02 39*042d53a7SEvalZero #define BLE_HS_CONN_F_TX_FRAG 0x04 /* Cur ACL packet partially txed. */ 40*042d53a7SEvalZero 41*042d53a7SEvalZero struct ble_hs_conn { 42*042d53a7SEvalZero SLIST_ENTRY(ble_hs_conn) bhc_next; 43*042d53a7SEvalZero uint16_t bhc_handle; 44*042d53a7SEvalZero uint8_t bhc_our_addr_type; 45*042d53a7SEvalZero #if MYNEWT_VAL(BLE_EXT_ADV) 46*042d53a7SEvalZero uint8_t bhc_our_rnd_addr[6]; 47*042d53a7SEvalZero #endif 48*042d53a7SEvalZero ble_addr_t bhc_peer_addr; 49*042d53a7SEvalZero ble_addr_t bhc_our_rpa_addr; 50*042d53a7SEvalZero ble_addr_t bhc_peer_rpa_addr; 51*042d53a7SEvalZero 52*042d53a7SEvalZero uint16_t bhc_itvl; 53*042d53a7SEvalZero uint16_t bhc_latency; 54*042d53a7SEvalZero uint16_t bhc_supervision_timeout; 55*042d53a7SEvalZero uint8_t bhc_master_clock_accuracy; 56*042d53a7SEvalZero 57*042d53a7SEvalZero uint32_t supported_feat; 58*042d53a7SEvalZero 59*042d53a7SEvalZero ble_hs_conn_flags_t bhc_flags; 60*042d53a7SEvalZero 61*042d53a7SEvalZero struct ble_l2cap_chan_list bhc_channels; 62*042d53a7SEvalZero struct ble_l2cap_chan *bhc_rx_chan; /* Channel rxing current packet. */ 63*042d53a7SEvalZero ble_npl_time_t bhc_rx_timeout; 64*042d53a7SEvalZero 65*042d53a7SEvalZero /** 66*042d53a7SEvalZero * Count of packets sent over this connection that the controller has not 67*042d53a7SEvalZero * transmitted or flushed yet. 68*042d53a7SEvalZero */ 69*042d53a7SEvalZero uint16_t bhc_outstanding_pkts; 70*042d53a7SEvalZero 71*042d53a7SEvalZero #if MYNEWT_VAL(BLE_HS_FLOW_CTRL) 72*042d53a7SEvalZero /** 73*042d53a7SEvalZero * Count of packets received over this connection that have been processed 74*042d53a7SEvalZero * and freed. 75*042d53a7SEvalZero */ 76*042d53a7SEvalZero uint16_t bhc_completed_pkts; 77*042d53a7SEvalZero #endif 78*042d53a7SEvalZero 79*042d53a7SEvalZero /** Queue of outgoing packets that could not be sent. */ 80*042d53a7SEvalZero STAILQ_HEAD(, os_mbuf_pkthdr) bhc_tx_q; 81*042d53a7SEvalZero 82*042d53a7SEvalZero struct ble_att_svr_conn bhc_att_svr; 83*042d53a7SEvalZero struct ble_gatts_conn bhc_gatt_svr; 84*042d53a7SEvalZero 85*042d53a7SEvalZero struct ble_gap_sec_state bhc_sec_state; 86*042d53a7SEvalZero 87*042d53a7SEvalZero ble_gap_event_fn *bhc_cb; 88*042d53a7SEvalZero void *bhc_cb_arg; 89*042d53a7SEvalZero }; 90*042d53a7SEvalZero 91*042d53a7SEvalZero struct ble_hs_conn_addrs { 92*042d53a7SEvalZero ble_addr_t our_id_addr; 93*042d53a7SEvalZero ble_addr_t peer_id_addr; 94*042d53a7SEvalZero ble_addr_t our_ota_addr; 95*042d53a7SEvalZero ble_addr_t peer_ota_addr; 96*042d53a7SEvalZero }; 97*042d53a7SEvalZero 98*042d53a7SEvalZero int ble_hs_conn_can_alloc(void); 99*042d53a7SEvalZero struct ble_hs_conn *ble_hs_conn_alloc(uint16_t conn_handle); 100*042d53a7SEvalZero void ble_hs_conn_free(struct ble_hs_conn *conn); 101*042d53a7SEvalZero void ble_hs_conn_insert(struct ble_hs_conn *conn); 102*042d53a7SEvalZero void ble_hs_conn_remove(struct ble_hs_conn *conn); 103*042d53a7SEvalZero struct ble_hs_conn *ble_hs_conn_find(uint16_t conn_handle); 104*042d53a7SEvalZero struct ble_hs_conn *ble_hs_conn_find_assert(uint16_t conn_handle); 105*042d53a7SEvalZero struct ble_hs_conn *ble_hs_conn_find_by_addr(const ble_addr_t *addr); 106*042d53a7SEvalZero struct ble_hs_conn *ble_hs_conn_find_by_idx(int idx); 107*042d53a7SEvalZero int ble_hs_conn_exists(uint16_t conn_handle); 108*042d53a7SEvalZero struct ble_hs_conn *ble_hs_conn_first(void); 109*042d53a7SEvalZero struct ble_l2cap_chan *ble_hs_conn_chan_find_by_scid(struct ble_hs_conn *conn, 110*042d53a7SEvalZero uint16_t cid); 111*042d53a7SEvalZero struct ble_l2cap_chan *ble_hs_conn_chan_find_by_dcid(struct ble_hs_conn *conn, 112*042d53a7SEvalZero uint16_t cid); 113*042d53a7SEvalZero int ble_hs_conn_chan_insert(struct ble_hs_conn *conn, 114*042d53a7SEvalZero struct ble_l2cap_chan *chan); 115*042d53a7SEvalZero void 116*042d53a7SEvalZero ble_hs_conn_delete_chan(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan); 117*042d53a7SEvalZero 118*042d53a7SEvalZero void ble_hs_conn_addrs(const struct ble_hs_conn *conn, 119*042d53a7SEvalZero struct ble_hs_conn_addrs *addrs); 120*042d53a7SEvalZero int32_t ble_hs_conn_timer(void); 121*042d53a7SEvalZero 122*042d53a7SEvalZero int ble_hs_conn_init(void); 123*042d53a7SEvalZero 124*042d53a7SEvalZero #ifdef __cplusplus 125*042d53a7SEvalZero } 126*042d53a7SEvalZero #endif 127*042d53a7SEvalZero 128*042d53a7SEvalZero #endif 129