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_BTSHELL_PRIV_ 21*042d53a7SEvalZero #define H_BTSHELL_PRIV_ 22*042d53a7SEvalZero 23*042d53a7SEvalZero #include <inttypes.h> 24*042d53a7SEvalZero #include "nimble/ble.h" 25*042d53a7SEvalZero #include "nimble/nimble_opt.h" 26*042d53a7SEvalZero #include "modlog/modlog.h" 27*042d53a7SEvalZero 28*042d53a7SEvalZero #include "host/ble_gatt.h" 29*042d53a7SEvalZero #include "host/ble_gap.h" 30*042d53a7SEvalZero 31*042d53a7SEvalZero #ifdef __cplusplus 32*042d53a7SEvalZero extern "C" { 33*042d53a7SEvalZero #endif 34*042d53a7SEvalZero 35*042d53a7SEvalZero struct ble_gap_white_entry; 36*042d53a7SEvalZero struct ble_hs_adv_fields; 37*042d53a7SEvalZero struct ble_gap_upd_params; 38*042d53a7SEvalZero struct ble_gap_conn_params; 39*042d53a7SEvalZero struct hci_adv_params; 40*042d53a7SEvalZero struct ble_l2cap_sig_update_req; 41*042d53a7SEvalZero struct ble_l2cap_sig_update_params; 42*042d53a7SEvalZero union ble_store_value; 43*042d53a7SEvalZero union ble_store_key; 44*042d53a7SEvalZero struct ble_gap_adv_params; 45*042d53a7SEvalZero struct ble_gap_conn_desc; 46*042d53a7SEvalZero struct ble_gap_disc_params; 47*042d53a7SEvalZero 48*042d53a7SEvalZero struct btshell_dsc { 49*042d53a7SEvalZero SLIST_ENTRY(btshell_dsc) next; 50*042d53a7SEvalZero struct ble_gatt_dsc dsc; 51*042d53a7SEvalZero }; 52*042d53a7SEvalZero SLIST_HEAD(btshell_dsc_list, btshell_dsc); 53*042d53a7SEvalZero 54*042d53a7SEvalZero struct btshell_chr { 55*042d53a7SEvalZero SLIST_ENTRY(btshell_chr) next; 56*042d53a7SEvalZero struct ble_gatt_chr chr; 57*042d53a7SEvalZero 58*042d53a7SEvalZero struct btshell_dsc_list dscs; 59*042d53a7SEvalZero }; 60*042d53a7SEvalZero SLIST_HEAD(btshell_chr_list, btshell_chr); 61*042d53a7SEvalZero 62*042d53a7SEvalZero struct btshell_svc { 63*042d53a7SEvalZero SLIST_ENTRY(btshell_svc) next; 64*042d53a7SEvalZero struct ble_gatt_svc svc; 65*042d53a7SEvalZero struct btshell_chr_list chrs; 66*042d53a7SEvalZero }; 67*042d53a7SEvalZero 68*042d53a7SEvalZero SLIST_HEAD(btshell_svc_list, btshell_svc); 69*042d53a7SEvalZero 70*042d53a7SEvalZero struct btshell_l2cap_coc { 71*042d53a7SEvalZero SLIST_ENTRY(btshell_l2cap_coc) next; 72*042d53a7SEvalZero struct ble_l2cap_chan *chan; 73*042d53a7SEvalZero }; 74*042d53a7SEvalZero 75*042d53a7SEvalZero SLIST_HEAD(btshell_l2cap_coc_list, btshell_l2cap_coc); 76*042d53a7SEvalZero 77*042d53a7SEvalZero struct btshell_conn { 78*042d53a7SEvalZero uint16_t handle; 79*042d53a7SEvalZero struct btshell_svc_list svcs; 80*042d53a7SEvalZero struct btshell_l2cap_coc_list coc_list; 81*042d53a7SEvalZero }; 82*042d53a7SEvalZero 83*042d53a7SEvalZero struct btshell_scan_opts { 84*042d53a7SEvalZero uint16_t limit; 85*042d53a7SEvalZero uint8_t ignore_legacy:1; 86*042d53a7SEvalZero }; 87*042d53a7SEvalZero 88*042d53a7SEvalZero extern struct btshell_conn btshell_conns[MYNEWT_VAL(BLE_MAX_CONNECTIONS)]; 89*042d53a7SEvalZero extern int btshell_num_conns; 90*042d53a7SEvalZero 91*042d53a7SEvalZero int btshell_exchange_mtu(uint16_t conn_handle); 92*042d53a7SEvalZero int btshell_disc_svcs(uint16_t conn_handle); 93*042d53a7SEvalZero int btshell_disc_svc_by_uuid(uint16_t conn_handle, const ble_uuid_t *uuid); 94*042d53a7SEvalZero int btshell_disc_all_chrs(uint16_t conn_handle, uint16_t start_handle, 95*042d53a7SEvalZero uint16_t end_handle); 96*042d53a7SEvalZero int btshell_disc_chrs_by_uuid(uint16_t conn_handle, uint16_t start_handle, 97*042d53a7SEvalZero uint16_t end_handle, const ble_uuid_t *uuid); 98*042d53a7SEvalZero int btshell_disc_all_dscs(uint16_t conn_handle, uint16_t start_handle, 99*042d53a7SEvalZero uint16_t end_handle); 100*042d53a7SEvalZero int btshell_disc_full(uint16_t conn_handle); 101*042d53a7SEvalZero int btshell_find_inc_svcs(uint16_t conn_handle, uint16_t start_handle, 102*042d53a7SEvalZero uint16_t end_handle); 103*042d53a7SEvalZero int btshell_read(uint16_t conn_handle, uint16_t attr_handle); 104*042d53a7SEvalZero int btshell_read_long(uint16_t conn_handle, uint16_t attr_handle, 105*042d53a7SEvalZero uint16_t offset); 106*042d53a7SEvalZero int btshell_read_by_uuid(uint16_t conn_handle, uint16_t start_handle, 107*042d53a7SEvalZero uint16_t end_handle, const ble_uuid_t *uuid); 108*042d53a7SEvalZero int btshell_read_mult(uint16_t conn_handle, uint16_t *attr_handles, 109*042d53a7SEvalZero int num_attr_handles); 110*042d53a7SEvalZero int btshell_write(uint16_t conn_handle, uint16_t attr_handle, 111*042d53a7SEvalZero struct os_mbuf *om); 112*042d53a7SEvalZero int btshell_write_no_rsp(uint16_t conn_handle, uint16_t attr_handle, 113*042d53a7SEvalZero struct os_mbuf *om); 114*042d53a7SEvalZero int btshell_write_long(uint16_t conn_handle, uint16_t attr_handle, 115*042d53a7SEvalZero uint16_t offset, struct os_mbuf *om); 116*042d53a7SEvalZero int btshell_write_reliable(uint16_t conn_handle, 117*042d53a7SEvalZero struct ble_gatt_attr *attrs, int num_attrs); 118*042d53a7SEvalZero #if MYNEWT_VAL(BLE_EXT_ADV) 119*042d53a7SEvalZero int btshell_ext_adv_configure(uint8_t instance, 120*042d53a7SEvalZero const struct ble_gap_ext_adv_params *params, 121*042d53a7SEvalZero int8_t *selected_tx_power); 122*042d53a7SEvalZero int btshell_ext_adv_start(uint8_t instance, int duration, 123*042d53a7SEvalZero int max_events, bool restart); 124*042d53a7SEvalZero int btshell_ext_adv_stop(uint8_t instance); 125*042d53a7SEvalZero #endif 126*042d53a7SEvalZero int btshell_adv_start(uint8_t own_addr_type, const ble_addr_t *direct_addr, 127*042d53a7SEvalZero int32_t duration_ms, 128*042d53a7SEvalZero const struct ble_gap_adv_params *params, 129*042d53a7SEvalZero bool restart); 130*042d53a7SEvalZero int btshell_adv_stop(void); 131*042d53a7SEvalZero int btshell_conn_initiate(uint8_t own_addr_type, const ble_addr_t *peer_addr, 132*042d53a7SEvalZero int32_t duration_ms, 133*042d53a7SEvalZero struct ble_gap_conn_params *params); 134*042d53a7SEvalZero int btshell_ext_conn_initiate(uint8_t own_addr_type, 135*042d53a7SEvalZero const ble_addr_t *peer_addr, 136*042d53a7SEvalZero int32_t duration_ms, 137*042d53a7SEvalZero struct ble_gap_conn_params *phy_1m_params, 138*042d53a7SEvalZero struct ble_gap_conn_params *phy_2m_params, 139*042d53a7SEvalZero struct ble_gap_conn_params *phy_coded_params); 140*042d53a7SEvalZero int btshell_conn_cancel(void); 141*042d53a7SEvalZero int btshell_term_conn(uint16_t conn_handle, uint8_t reason); 142*042d53a7SEvalZero int btshell_wl_set(ble_addr_t *addrs, int addrs_count); 143*042d53a7SEvalZero int btshell_scan(uint8_t own_addr_type, int32_t duration_ms, 144*042d53a7SEvalZero const struct ble_gap_disc_params *disc_params, void *cb_args); 145*042d53a7SEvalZero int btshell_ext_scan(uint8_t own_addr_type, uint16_t duration, uint16_t period, 146*042d53a7SEvalZero uint8_t filter_duplicates, uint8_t filter_policy, 147*042d53a7SEvalZero uint8_t limited, 148*042d53a7SEvalZero const struct ble_gap_ext_disc_params *uncoded_params, 149*042d53a7SEvalZero const struct ble_gap_ext_disc_params *coded_params, 150*042d53a7SEvalZero void *cb_args); 151*042d53a7SEvalZero int btshell_scan_cancel(void); 152*042d53a7SEvalZero int btshell_update_conn(uint16_t conn_handle, 153*042d53a7SEvalZero struct ble_gap_upd_params *params); 154*042d53a7SEvalZero void btshell_notify(uint16_t attr_handle); 155*042d53a7SEvalZero int btshell_datalen(uint16_t conn_handle, uint16_t tx_octets, 156*042d53a7SEvalZero uint16_t tx_time); 157*042d53a7SEvalZero int btshell_l2cap_update(uint16_t conn_handle, 158*042d53a7SEvalZero struct ble_l2cap_sig_update_params *params); 159*042d53a7SEvalZero int btshell_sec_start(uint16_t conn_handle); 160*042d53a7SEvalZero int btshell_sec_pair(uint16_t conn_handle); 161*042d53a7SEvalZero int btshell_sec_unpair(ble_addr_t *peer_addr); 162*042d53a7SEvalZero int btshell_sec_restart(uint16_t conn_handle, uint8_t *ltk, uint16_t ediv, 163*042d53a7SEvalZero uint64_t rand_val, int auth); 164*042d53a7SEvalZero int btshell_tx_start(uint16_t handle, uint16_t len, uint16_t rate, 165*042d53a7SEvalZero uint16_t num); 166*042d53a7SEvalZero int btshell_rssi(uint16_t conn_handle, int8_t *out_rssi); 167*042d53a7SEvalZero int btshell_l2cap_create_srv(uint16_t psm, int accept_response); 168*042d53a7SEvalZero int btshell_l2cap_connect(uint16_t conn, uint16_t psm); 169*042d53a7SEvalZero int btshell_l2cap_disconnect(uint16_t conn, uint16_t idx); 170*042d53a7SEvalZero int btshell_l2cap_send(uint16_t conn, uint16_t idx, uint16_t bytes); 171*042d53a7SEvalZero 172*042d53a7SEvalZero /** GATT server. */ 173*042d53a7SEvalZero #define GATT_SVR_SVC_ALERT_UUID 0x1811 174*042d53a7SEvalZero #define GATT_SVR_CHR_SUP_NEW_ALERT_CAT_UUID 0x2A47 175*042d53a7SEvalZero #define GATT_SVR_CHR_NEW_ALERT 0x2A46 176*042d53a7SEvalZero #define GATT_SVR_CHR_SUP_UNR_ALERT_CAT_UUID 0x2A48 177*042d53a7SEvalZero #define GATT_SVR_CHR_UNR_ALERT_STAT_UUID 0x2A45 178*042d53a7SEvalZero #define GATT_SVR_CHR_ALERT_NOT_CTRL_PT 0x2A44 179*042d53a7SEvalZero 180*042d53a7SEvalZero void gatt_svr_register_cb(struct ble_gatt_register_ctxt *ctxt, void *arg); 181*042d53a7SEvalZero int gatt_svr_init(void); 182*042d53a7SEvalZero void gatt_svr_print_svcs(void); 183*042d53a7SEvalZero 184*042d53a7SEvalZero /** Misc. */ 185*042d53a7SEvalZero void print_bytes(const uint8_t *bytes, int len); 186*042d53a7SEvalZero void print_mbuf(const struct os_mbuf *om); 187*042d53a7SEvalZero void print_addr(const void *addr); 188*042d53a7SEvalZero void print_uuid(const ble_uuid_t *uuid); 189*042d53a7SEvalZero int svc_is_empty(const struct btshell_svc *svc); 190*042d53a7SEvalZero uint16_t chr_end_handle(const struct btshell_svc *svc, 191*042d53a7SEvalZero const struct btshell_chr *chr); 192*042d53a7SEvalZero int chr_is_empty(const struct btshell_svc *svc, const struct btshell_chr *chr); 193*042d53a7SEvalZero void print_conn_desc(const struct ble_gap_conn_desc *desc); 194*042d53a7SEvalZero void print_svc(struct btshell_svc *svc); 195*042d53a7SEvalZero 196*042d53a7SEvalZero #ifdef __cplusplus 197*042d53a7SEvalZero } 198*042d53a7SEvalZero #endif 199*042d53a7SEvalZero 200*042d53a7SEvalZero #endif 201