Projet_BMC / X_NUCLEO_IDB0XA1

Dependents:   BMC

Committer:
Andrea Palmieri
Date:
Mon May 16 17:22:03 2016 +0200
Revision:
229:9981f62cdb1a
Parent:
132:51056160fa4a
Child:
249:2e94d2835c45
Fix issues and add features

- Fix handles management
- Fix UUIDs management
- Implement API to read random address
- Fix clearing/setting of ADV payload
- Fix scanning behaviour
- Fix scanning while a connection is ongoing
- Implement Char Descriptor discovery
- Implement scanning/advertising filter policy (White List partial management)
- Update underlying BlueNRG stack
- Cosmetics

Signed-off-by: Andrea Palmieri <andrea.palmieri@st.com>

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wolfgang Betz 132:51056160fa4a 1 /******************** (C) COPYRIGHT 2014 STMicroelectronics ********************
Wolfgang Betz 132:51056160fa4a 2 * File Name : bluenrg_hci.c
Wolfgang Betz 132:51056160fa4a 3 * Author : AMS - HEA&RF BU
Wolfgang Betz 132:51056160fa4a 4 * Version : V1.0.0
Wolfgang Betz 132:51056160fa4a 5 * Date : 4-Oct-2013
Wolfgang Betz 132:51056160fa4a 6 * Description : File with HCI commands for BlueNRG FW6.0 and above.
Wolfgang Betz 132:51056160fa4a 7 ********************************************************************************
Wolfgang Betz 132:51056160fa4a 8 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
Wolfgang Betz 132:51056160fa4a 9 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
Wolfgang Betz 132:51056160fa4a 10 * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
Wolfgang Betz 132:51056160fa4a 11 * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
Wolfgang Betz 132:51056160fa4a 12 * CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
Wolfgang Betz 132:51056160fa4a 13 * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
Wolfgang Betz 132:51056160fa4a 14 *******************************************************************************/
Wolfgang Betz 132:51056160fa4a 15
Wolfgang Betz 132:51056160fa4a 16 #include "hal_types.h"
Wolfgang Betz 132:51056160fa4a 17 #include "osal.h"
Wolfgang Betz 132:51056160fa4a 18 #include "ble_status.h"
Wolfgang Betz 132:51056160fa4a 19 #include "hal.h"
Wolfgang Betz 132:51056160fa4a 20 #include "osal.h"
Wolfgang Betz 132:51056160fa4a 21 #include "hci_const.h"
Wolfgang Betz 132:51056160fa4a 22 #include "bluenrg_aci_const.h"
Wolfgang Betz 132:51056160fa4a 23 #include "bluenrg_gap_aci.h"
Wolfgang Betz 132:51056160fa4a 24 #include "bluenrg_gatt_server.h"
Wolfgang Betz 132:51056160fa4a 25 #include "bluenrg_gap.h"
Wolfgang Betz 132:51056160fa4a 26
Wolfgang Betz 132:51056160fa4a 27 #define MIN(a,b) ((a) < (b) )? (a) : (b)
Wolfgang Betz 132:51056160fa4a 28 #define MAX(a,b) ((a) > (b) )? (a) : (b)
Wolfgang Betz 132:51056160fa4a 29
Wolfgang Betz 132:51056160fa4a 30 tBleStatus aci_gap_init_IDB05A1(uint8_t role, uint8_t privacy_enabled, uint8_t device_name_char_len, uint16_t* service_handle, uint16_t* dev_name_char_handle, uint16_t* appearance_char_handle)
Wolfgang Betz 132:51056160fa4a 31 {
Wolfgang Betz 132:51056160fa4a 32 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 33 gap_init_cp_IDB05A1 cp;
Wolfgang Betz 132:51056160fa4a 34 gap_init_rp resp;
Wolfgang Betz 132:51056160fa4a 35
Wolfgang Betz 132:51056160fa4a 36 cp.role = role;
Wolfgang Betz 132:51056160fa4a 37 cp.privacy_enabled = privacy_enabled;
Wolfgang Betz 132:51056160fa4a 38 cp.device_name_char_len = device_name_char_len;
Wolfgang Betz 132:51056160fa4a 39
Wolfgang Betz 132:51056160fa4a 40 Osal_MemSet(&resp, 0, sizeof(resp));
Wolfgang Betz 132:51056160fa4a 41
Wolfgang Betz 132:51056160fa4a 42 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 43 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 44 rq.ocf = OCF_GAP_INIT;
Wolfgang Betz 132:51056160fa4a 45 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 46 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 47 rq.rparam = &resp;
Wolfgang Betz 132:51056160fa4a 48 rq.rlen = GAP_INIT_RP_SIZE;
Wolfgang Betz 132:51056160fa4a 49
Wolfgang Betz 132:51056160fa4a 50 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 51 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 52
Wolfgang Betz 132:51056160fa4a 53 if (resp.status) {
Wolfgang Betz 132:51056160fa4a 54 return resp.status;
Wolfgang Betz 132:51056160fa4a 55 }
Wolfgang Betz 132:51056160fa4a 56
Wolfgang Betz 132:51056160fa4a 57 *service_handle = btohs(resp.service_handle);
Wolfgang Betz 132:51056160fa4a 58 *dev_name_char_handle = btohs(resp.dev_name_char_handle);
Wolfgang Betz 132:51056160fa4a 59 *appearance_char_handle = btohs(resp.appearance_char_handle);
Wolfgang Betz 132:51056160fa4a 60
Wolfgang Betz 132:51056160fa4a 61 return 0;
Wolfgang Betz 132:51056160fa4a 62 }
Wolfgang Betz 132:51056160fa4a 63 tBleStatus aci_gap_init_IDB04A1(uint8_t role, uint16_t* service_handle, uint16_t* dev_name_char_handle, uint16_t* appearance_char_handle)
Wolfgang Betz 132:51056160fa4a 64 {
Wolfgang Betz 132:51056160fa4a 65 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 66 gap_init_cp_IDB04A1 cp;
Wolfgang Betz 132:51056160fa4a 67 gap_init_rp resp;
Wolfgang Betz 132:51056160fa4a 68
Wolfgang Betz 132:51056160fa4a 69 cp.role = role;
Wolfgang Betz 132:51056160fa4a 70
Wolfgang Betz 132:51056160fa4a 71 Osal_MemSet(&resp, 0, sizeof(resp));
Wolfgang Betz 132:51056160fa4a 72
Wolfgang Betz 132:51056160fa4a 73 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 74 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 75 rq.ocf = OCF_GAP_INIT;
Wolfgang Betz 132:51056160fa4a 76 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 77 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 78 rq.rparam = &resp;
Wolfgang Betz 132:51056160fa4a 79 rq.rlen = GAP_INIT_RP_SIZE;
Wolfgang Betz 132:51056160fa4a 80
Wolfgang Betz 132:51056160fa4a 81 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 82 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 83
Wolfgang Betz 132:51056160fa4a 84 if (resp.status) {
Wolfgang Betz 132:51056160fa4a 85 return resp.status;
Wolfgang Betz 132:51056160fa4a 86 }
Wolfgang Betz 132:51056160fa4a 87
Wolfgang Betz 132:51056160fa4a 88 *service_handle = btohs(resp.service_handle);
Wolfgang Betz 132:51056160fa4a 89 *dev_name_char_handle = btohs(resp.dev_name_char_handle);
Wolfgang Betz 132:51056160fa4a 90 *appearance_char_handle = btohs(resp.appearance_char_handle);
Wolfgang Betz 132:51056160fa4a 91
Wolfgang Betz 132:51056160fa4a 92 return 0;
Wolfgang Betz 132:51056160fa4a 93 }
Wolfgang Betz 132:51056160fa4a 94
Wolfgang Betz 132:51056160fa4a 95 tBleStatus aci_gap_set_non_discoverable(void)
Wolfgang Betz 132:51056160fa4a 96 {
Wolfgang Betz 132:51056160fa4a 97 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 98 uint8_t status;
Wolfgang Betz 132:51056160fa4a 99
Wolfgang Betz 132:51056160fa4a 100 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 101 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 102 rq.ocf = OCF_GAP_SET_NON_DISCOVERABLE;
Wolfgang Betz 132:51056160fa4a 103 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 104 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 105
Wolfgang Betz 132:51056160fa4a 106 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 107 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 108
Wolfgang Betz 132:51056160fa4a 109 return status;
Wolfgang Betz 132:51056160fa4a 110 }
Wolfgang Betz 132:51056160fa4a 111
Wolfgang Betz 132:51056160fa4a 112 tBleStatus aci_gap_set_limited_discoverable(uint8_t AdvType, uint16_t AdvIntervMin, uint16_t AdvIntervMax,
Wolfgang Betz 132:51056160fa4a 113 uint8_t OwnAddrType, uint8_t AdvFilterPolicy, uint8_t LocalNameLen,
Wolfgang Betz 132:51056160fa4a 114 const char *LocalName, uint8_t ServiceUUIDLen, uint8_t* ServiceUUIDList,
Wolfgang Betz 132:51056160fa4a 115 uint16_t SlaveConnIntervMin, uint16_t SlaveConnIntervMax)
Wolfgang Betz 132:51056160fa4a 116 {
Wolfgang Betz 132:51056160fa4a 117 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 118 uint8_t status;
Wolfgang Betz 132:51056160fa4a 119 uint8_t buffer[40];
Wolfgang Betz 132:51056160fa4a 120 uint8_t indx = 0;
Wolfgang Betz 132:51056160fa4a 121
Andrea Palmieri 229:9981f62cdb1a 122 if((unsigned int)(LocalNameLen+ServiceUUIDLen+14) > sizeof(buffer))
Wolfgang Betz 132:51056160fa4a 123 return BLE_STATUS_INVALID_PARAMS;
Wolfgang Betz 132:51056160fa4a 124
Wolfgang Betz 132:51056160fa4a 125 buffer[indx] = AdvType;
Wolfgang Betz 132:51056160fa4a 126 indx++;
Wolfgang Betz 132:51056160fa4a 127
Wolfgang Betz 132:51056160fa4a 128 AdvIntervMin = htobs(AdvIntervMin);
Wolfgang Betz 132:51056160fa4a 129 Osal_MemCpy(buffer + indx, &AdvIntervMin, 2);
Wolfgang Betz 132:51056160fa4a 130 indx += 2;
Wolfgang Betz 132:51056160fa4a 131
Wolfgang Betz 132:51056160fa4a 132 AdvIntervMax = htobs(AdvIntervMax);
Wolfgang Betz 132:51056160fa4a 133 Osal_MemCpy(buffer + indx, &AdvIntervMax, 2);
Wolfgang Betz 132:51056160fa4a 134 indx += 2;
Wolfgang Betz 132:51056160fa4a 135
Wolfgang Betz 132:51056160fa4a 136 buffer[indx] = OwnAddrType;
Wolfgang Betz 132:51056160fa4a 137 indx++;
Wolfgang Betz 132:51056160fa4a 138
Wolfgang Betz 132:51056160fa4a 139 buffer[indx] = AdvFilterPolicy;
Wolfgang Betz 132:51056160fa4a 140 indx++;
Wolfgang Betz 132:51056160fa4a 141
Wolfgang Betz 132:51056160fa4a 142 buffer[indx] = LocalNameLen;
Wolfgang Betz 132:51056160fa4a 143 indx++;
Wolfgang Betz 132:51056160fa4a 144
Wolfgang Betz 132:51056160fa4a 145 Osal_MemCpy(buffer + indx, LocalName, LocalNameLen);
Wolfgang Betz 132:51056160fa4a 146 indx += LocalNameLen;
Wolfgang Betz 132:51056160fa4a 147
Wolfgang Betz 132:51056160fa4a 148 buffer[indx] = ServiceUUIDLen;
Wolfgang Betz 132:51056160fa4a 149 indx++;
Wolfgang Betz 132:51056160fa4a 150
Wolfgang Betz 132:51056160fa4a 151 Osal_MemCpy(buffer + indx, ServiceUUIDList, ServiceUUIDLen);
Wolfgang Betz 132:51056160fa4a 152 indx += ServiceUUIDLen;
Wolfgang Betz 132:51056160fa4a 153
Wolfgang Betz 132:51056160fa4a 154 Osal_MemCpy(buffer + indx, &SlaveConnIntervMin, 2);
Wolfgang Betz 132:51056160fa4a 155 indx += 2;
Wolfgang Betz 132:51056160fa4a 156
Wolfgang Betz 132:51056160fa4a 157 Osal_MemCpy(buffer + indx, &SlaveConnIntervMax, 2);
Wolfgang Betz 132:51056160fa4a 158 indx += 2;
Wolfgang Betz 132:51056160fa4a 159
Wolfgang Betz 132:51056160fa4a 160 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 161 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 162 rq.ocf = OCF_GAP_SET_LIMITED_DISCOVERABLE;
Wolfgang Betz 132:51056160fa4a 163 rq.cparam = (void *)buffer;
Wolfgang Betz 132:51056160fa4a 164 rq.clen = indx;
Wolfgang Betz 132:51056160fa4a 165 rq.event = EVT_CMD_STATUS;
Wolfgang Betz 132:51056160fa4a 166 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 167 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 168
Wolfgang Betz 132:51056160fa4a 169 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 170 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 171
Wolfgang Betz 132:51056160fa4a 172 return status;
Wolfgang Betz 132:51056160fa4a 173 }
Wolfgang Betz 132:51056160fa4a 174
Wolfgang Betz 132:51056160fa4a 175 tBleStatus aci_gap_set_discoverable(uint8_t AdvType, uint16_t AdvIntervMin, uint16_t AdvIntervMax,
Wolfgang Betz 132:51056160fa4a 176 uint8_t OwnAddrType, uint8_t AdvFilterPolicy, uint8_t LocalNameLen,
Wolfgang Betz 132:51056160fa4a 177 const char *LocalName, uint8_t ServiceUUIDLen, uint8_t* ServiceUUIDList,
Wolfgang Betz 132:51056160fa4a 178 uint16_t SlaveConnIntervMin, uint16_t SlaveConnIntervMax)
Wolfgang Betz 132:51056160fa4a 179 {
Wolfgang Betz 132:51056160fa4a 180 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 181 uint8_t status;
Wolfgang Betz 132:51056160fa4a 182 uint8_t buffer[40];
Wolfgang Betz 132:51056160fa4a 183 uint8_t indx = 0;
Wolfgang Betz 132:51056160fa4a 184
Wolfgang Betz 132:51056160fa4a 185 if ((unsigned int)(LocalNameLen+ServiceUUIDLen+14) > sizeof(buffer))
Wolfgang Betz 132:51056160fa4a 186 return BLE_STATUS_INVALID_PARAMS;
Wolfgang Betz 132:51056160fa4a 187
Wolfgang Betz 132:51056160fa4a 188 buffer[indx] = AdvType;
Wolfgang Betz 132:51056160fa4a 189 indx++;
Wolfgang Betz 132:51056160fa4a 190
Wolfgang Betz 132:51056160fa4a 191 AdvIntervMin = htobs(AdvIntervMin);
Wolfgang Betz 132:51056160fa4a 192 Osal_MemCpy(buffer + indx, &AdvIntervMin, 2);
Wolfgang Betz 132:51056160fa4a 193 indx += 2;
Wolfgang Betz 132:51056160fa4a 194
Wolfgang Betz 132:51056160fa4a 195 AdvIntervMax = htobs(AdvIntervMax);
Wolfgang Betz 132:51056160fa4a 196 Osal_MemCpy(buffer + indx, &AdvIntervMax, 2);
Wolfgang Betz 132:51056160fa4a 197 indx += 2;
Wolfgang Betz 132:51056160fa4a 198
Wolfgang Betz 132:51056160fa4a 199 buffer[indx] = OwnAddrType;
Wolfgang Betz 132:51056160fa4a 200 indx++;
Wolfgang Betz 132:51056160fa4a 201
Wolfgang Betz 132:51056160fa4a 202 buffer[indx] = AdvFilterPolicy;
Wolfgang Betz 132:51056160fa4a 203 indx++;
Wolfgang Betz 132:51056160fa4a 204
Wolfgang Betz 132:51056160fa4a 205 buffer[indx] = LocalNameLen;
Wolfgang Betz 132:51056160fa4a 206 indx++;
Wolfgang Betz 132:51056160fa4a 207
Wolfgang Betz 132:51056160fa4a 208 Osal_MemCpy(buffer + indx, LocalName, LocalNameLen);
Wolfgang Betz 132:51056160fa4a 209 indx += LocalNameLen;
Wolfgang Betz 132:51056160fa4a 210
Wolfgang Betz 132:51056160fa4a 211 buffer[indx] = ServiceUUIDLen;
Wolfgang Betz 132:51056160fa4a 212 indx++;
Wolfgang Betz 132:51056160fa4a 213
Wolfgang Betz 132:51056160fa4a 214 Osal_MemCpy(buffer + indx, ServiceUUIDList, ServiceUUIDLen);
Wolfgang Betz 132:51056160fa4a 215 indx += ServiceUUIDLen;
Wolfgang Betz 132:51056160fa4a 216
Wolfgang Betz 132:51056160fa4a 217 SlaveConnIntervMin = htobs(SlaveConnIntervMin);
Wolfgang Betz 132:51056160fa4a 218 Osal_MemCpy(buffer + indx, &SlaveConnIntervMin, 2);
Wolfgang Betz 132:51056160fa4a 219 indx += 2;
Wolfgang Betz 132:51056160fa4a 220
Wolfgang Betz 132:51056160fa4a 221 SlaveConnIntervMax = htobs(SlaveConnIntervMax);
Wolfgang Betz 132:51056160fa4a 222 Osal_MemCpy(buffer + indx, &SlaveConnIntervMax, 2);
Wolfgang Betz 132:51056160fa4a 223 indx += 2;
Wolfgang Betz 132:51056160fa4a 224
Wolfgang Betz 132:51056160fa4a 225 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 226 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 227 rq.ocf = OCF_GAP_SET_DISCOVERABLE;
Wolfgang Betz 132:51056160fa4a 228 rq.cparam = (void *)buffer;
Wolfgang Betz 132:51056160fa4a 229 rq.clen = indx;
Wolfgang Betz 132:51056160fa4a 230 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 231 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 232
Wolfgang Betz 132:51056160fa4a 233 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 234 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 235
Wolfgang Betz 132:51056160fa4a 236 if (status) {
Wolfgang Betz 132:51056160fa4a 237 return status;
Wolfgang Betz 132:51056160fa4a 238 }
Wolfgang Betz 132:51056160fa4a 239
Wolfgang Betz 132:51056160fa4a 240 return 0;
Wolfgang Betz 132:51056160fa4a 241 }
Wolfgang Betz 132:51056160fa4a 242
Wolfgang Betz 132:51056160fa4a 243 tBleStatus aci_gap_set_direct_connectable_IDB05A1(uint8_t own_addr_type, uint8_t directed_adv_type, uint8_t initiator_addr_type, const uint8_t *initiator_addr)
Wolfgang Betz 132:51056160fa4a 244 {
Wolfgang Betz 132:51056160fa4a 245 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 246 gap_set_direct_conectable_cp_IDB05A1 cp;
Wolfgang Betz 132:51056160fa4a 247 uint8_t status;
Wolfgang Betz 132:51056160fa4a 248
Wolfgang Betz 132:51056160fa4a 249 cp.own_bdaddr_type = own_addr_type;
Wolfgang Betz 132:51056160fa4a 250 cp.directed_adv_type = directed_adv_type;
Wolfgang Betz 132:51056160fa4a 251 cp.direct_bdaddr_type = initiator_addr_type;
Wolfgang Betz 132:51056160fa4a 252 Osal_MemCpy(cp.direct_bdaddr, initiator_addr, 6);
Wolfgang Betz 132:51056160fa4a 253
Wolfgang Betz 132:51056160fa4a 254 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 255 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 256 rq.ocf = OCF_GAP_SET_DIRECT_CONNECTABLE;
Wolfgang Betz 132:51056160fa4a 257 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 258 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 259 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 260 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 261
Wolfgang Betz 132:51056160fa4a 262 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 263 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 264
Wolfgang Betz 132:51056160fa4a 265 return status;
Wolfgang Betz 132:51056160fa4a 266 }
Wolfgang Betz 132:51056160fa4a 267
Wolfgang Betz 132:51056160fa4a 268 tBleStatus aci_gap_set_direct_connectable_IDB04A1(uint8_t own_addr_type, uint8_t initiator_addr_type, const uint8_t *initiator_addr)
Wolfgang Betz 132:51056160fa4a 269 {
Wolfgang Betz 132:51056160fa4a 270 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 271 gap_set_direct_conectable_cp_IDB04A1 cp;
Wolfgang Betz 132:51056160fa4a 272 uint8_t status;
Wolfgang Betz 132:51056160fa4a 273
Wolfgang Betz 132:51056160fa4a 274 cp.own_bdaddr_type = own_addr_type;
Wolfgang Betz 132:51056160fa4a 275 cp.direct_bdaddr_type = initiator_addr_type;
Wolfgang Betz 132:51056160fa4a 276 Osal_MemCpy(cp.direct_bdaddr, initiator_addr, 6);
Wolfgang Betz 132:51056160fa4a 277
Wolfgang Betz 132:51056160fa4a 278 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 279 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 280 rq.ocf = OCF_GAP_SET_DIRECT_CONNECTABLE;
Wolfgang Betz 132:51056160fa4a 281 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 282 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 283 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 284 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 285
Wolfgang Betz 132:51056160fa4a 286 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 287 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 288
Wolfgang Betz 132:51056160fa4a 289 return status;
Wolfgang Betz 132:51056160fa4a 290 }
Wolfgang Betz 132:51056160fa4a 291
Wolfgang Betz 132:51056160fa4a 292 tBleStatus aci_gap_set_io_capability(uint8_t io_capability)
Wolfgang Betz 132:51056160fa4a 293 {
Wolfgang Betz 132:51056160fa4a 294 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 295 uint8_t status;
Wolfgang Betz 132:51056160fa4a 296 gap_set_io_capability_cp cp;
Wolfgang Betz 132:51056160fa4a 297
Wolfgang Betz 132:51056160fa4a 298 cp.io_capability = io_capability;
Wolfgang Betz 132:51056160fa4a 299
Wolfgang Betz 132:51056160fa4a 300 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 301 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 302 rq.ocf = OCF_GAP_SET_IO_CAPABILITY;
Wolfgang Betz 132:51056160fa4a 303 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 304 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 305 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 306 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 307
Wolfgang Betz 132:51056160fa4a 308 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 309 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 310
Wolfgang Betz 132:51056160fa4a 311 return status;
Wolfgang Betz 132:51056160fa4a 312 }
Wolfgang Betz 132:51056160fa4a 313
Wolfgang Betz 132:51056160fa4a 314 tBleStatus aci_gap_set_auth_requirement(uint8_t mitm_mode,
Wolfgang Betz 132:51056160fa4a 315 uint8_t oob_enable,
Wolfgang Betz 132:51056160fa4a 316 uint8_t oob_data[16],
Wolfgang Betz 132:51056160fa4a 317 uint8_t min_encryption_key_size,
Wolfgang Betz 132:51056160fa4a 318 uint8_t max_encryption_key_size,
Wolfgang Betz 132:51056160fa4a 319 uint8_t use_fixed_pin,
Wolfgang Betz 132:51056160fa4a 320 uint32_t fixed_pin,
Wolfgang Betz 132:51056160fa4a 321 uint8_t bonding_mode)
Wolfgang Betz 132:51056160fa4a 322 {
Wolfgang Betz 132:51056160fa4a 323 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 324 gap_set_auth_requirement_cp cp;
Wolfgang Betz 132:51056160fa4a 325 uint8_t status;
Wolfgang Betz 132:51056160fa4a 326
Wolfgang Betz 132:51056160fa4a 327 cp.mitm_mode = mitm_mode;
Wolfgang Betz 132:51056160fa4a 328 cp.oob_enable = oob_enable;
Wolfgang Betz 132:51056160fa4a 329 Osal_MemCpy(cp.oob_data, oob_data, 16);
Wolfgang Betz 132:51056160fa4a 330 cp.min_encryption_key_size = min_encryption_key_size;
Wolfgang Betz 132:51056160fa4a 331 cp.max_encryption_key_size = max_encryption_key_size;
Wolfgang Betz 132:51056160fa4a 332 cp.use_fixed_pin = use_fixed_pin;
Wolfgang Betz 132:51056160fa4a 333 cp.fixed_pin = htobl(fixed_pin);
Wolfgang Betz 132:51056160fa4a 334 cp.bonding_mode = bonding_mode;
Wolfgang Betz 132:51056160fa4a 335
Wolfgang Betz 132:51056160fa4a 336 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 337 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 338 rq.ocf = OCF_GAP_SET_AUTH_REQUIREMENT;
Wolfgang Betz 132:51056160fa4a 339 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 340 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 341 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 342 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 343
Wolfgang Betz 132:51056160fa4a 344 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 345 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 346
Wolfgang Betz 132:51056160fa4a 347 if (status) {
Wolfgang Betz 132:51056160fa4a 348 return status;
Wolfgang Betz 132:51056160fa4a 349 }
Wolfgang Betz 132:51056160fa4a 350
Wolfgang Betz 132:51056160fa4a 351 return 0;
Wolfgang Betz 132:51056160fa4a 352 }
Wolfgang Betz 132:51056160fa4a 353
Wolfgang Betz 132:51056160fa4a 354 tBleStatus aci_gap_set_author_requirement(uint16_t conn_handle, uint8_t authorization_enable)
Wolfgang Betz 132:51056160fa4a 355 {
Wolfgang Betz 132:51056160fa4a 356 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 357 gap_set_author_requirement_cp cp;
Wolfgang Betz 132:51056160fa4a 358 uint8_t status;
Wolfgang Betz 132:51056160fa4a 359
Wolfgang Betz 132:51056160fa4a 360 cp.conn_handle = htobs(conn_handle);
Wolfgang Betz 132:51056160fa4a 361 cp.authorization_enable = authorization_enable;
Wolfgang Betz 132:51056160fa4a 362
Wolfgang Betz 132:51056160fa4a 363 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 364 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 365 rq.ocf = OCF_GAP_SET_AUTHOR_REQUIREMENT;
Wolfgang Betz 132:51056160fa4a 366 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 367 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 368 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 369 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 370
Wolfgang Betz 132:51056160fa4a 371 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 372 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 373
Wolfgang Betz 132:51056160fa4a 374 return status;
Wolfgang Betz 132:51056160fa4a 375 }
Wolfgang Betz 132:51056160fa4a 376
Wolfgang Betz 132:51056160fa4a 377 tBleStatus aci_gap_pass_key_response(uint16_t conn_handle, uint32_t passkey)
Wolfgang Betz 132:51056160fa4a 378 {
Wolfgang Betz 132:51056160fa4a 379 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 380 gap_passkey_response_cp cp;
Wolfgang Betz 132:51056160fa4a 381 uint8_t status;
Wolfgang Betz 132:51056160fa4a 382
Wolfgang Betz 132:51056160fa4a 383 cp.conn_handle = htobs(conn_handle);
Wolfgang Betz 132:51056160fa4a 384 cp.passkey = htobl(passkey);
Wolfgang Betz 132:51056160fa4a 385
Wolfgang Betz 132:51056160fa4a 386 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 387 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 388 rq.ocf = OCF_GAP_PASSKEY_RESPONSE;
Wolfgang Betz 132:51056160fa4a 389 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 390 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 391 rq.event = EVT_CMD_STATUS;
Wolfgang Betz 132:51056160fa4a 392 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 393 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 394
Wolfgang Betz 132:51056160fa4a 395 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 396 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 397
Wolfgang Betz 132:51056160fa4a 398 return status;
Wolfgang Betz 132:51056160fa4a 399 }
Wolfgang Betz 132:51056160fa4a 400
Wolfgang Betz 132:51056160fa4a 401 tBleStatus aci_gap_authorization_response(uint16_t conn_handle, uint8_t authorize)
Wolfgang Betz 132:51056160fa4a 402 {
Wolfgang Betz 132:51056160fa4a 403 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 404 gap_authorization_response_cp cp;
Wolfgang Betz 132:51056160fa4a 405 uint8_t status;
Wolfgang Betz 132:51056160fa4a 406
Wolfgang Betz 132:51056160fa4a 407 cp.conn_handle = htobs(conn_handle);
Wolfgang Betz 132:51056160fa4a 408 cp.authorize = authorize;
Wolfgang Betz 132:51056160fa4a 409
Wolfgang Betz 132:51056160fa4a 410 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 411 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 412 rq.ocf = OCF_GAP_AUTHORIZATION_RESPONSE;
Wolfgang Betz 132:51056160fa4a 413 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 414 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 415 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 416 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 417
Wolfgang Betz 132:51056160fa4a 418 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 419 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 420
Wolfgang Betz 132:51056160fa4a 421 return status;
Wolfgang Betz 132:51056160fa4a 422 }
Wolfgang Betz 132:51056160fa4a 423
Wolfgang Betz 132:51056160fa4a 424 tBleStatus aci_gap_set_non_connectable_IDB05A1(uint8_t adv_type, uint8_t own_address_type)
Wolfgang Betz 132:51056160fa4a 425 {
Wolfgang Betz 132:51056160fa4a 426 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 427 gap_set_non_connectable_cp_IDB05A1 cp;
Wolfgang Betz 132:51056160fa4a 428 uint8_t status;
Wolfgang Betz 132:51056160fa4a 429
Wolfgang Betz 132:51056160fa4a 430 cp.advertising_event_type = adv_type;
Wolfgang Betz 132:51056160fa4a 431 cp.own_address_type = own_address_type;
Wolfgang Betz 132:51056160fa4a 432 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 433 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 434 rq.ocf = OCF_GAP_SET_NON_CONNECTABLE;
Wolfgang Betz 132:51056160fa4a 435 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 436 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 437 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 438 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 439
Wolfgang Betz 132:51056160fa4a 440 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 441 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 442
Wolfgang Betz 132:51056160fa4a 443 return status;
Wolfgang Betz 132:51056160fa4a 444 }
Wolfgang Betz 132:51056160fa4a 445
Wolfgang Betz 132:51056160fa4a 446 tBleStatus aci_gap_set_non_connectable_IDB04A1(uint8_t adv_type)
Wolfgang Betz 132:51056160fa4a 447 {
Wolfgang Betz 132:51056160fa4a 448 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 449 gap_set_non_connectable_cp_IDB04A1 cp;
Wolfgang Betz 132:51056160fa4a 450 uint8_t status;
Wolfgang Betz 132:51056160fa4a 451
Wolfgang Betz 132:51056160fa4a 452 cp.advertising_event_type = adv_type;
Wolfgang Betz 132:51056160fa4a 453
Wolfgang Betz 132:51056160fa4a 454 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 455 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 456 rq.ocf = OCF_GAP_SET_NON_CONNECTABLE;
Wolfgang Betz 132:51056160fa4a 457 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 458 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 459 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 460 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 461
Wolfgang Betz 132:51056160fa4a 462 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 463 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 464
Wolfgang Betz 132:51056160fa4a 465 return status;
Wolfgang Betz 132:51056160fa4a 466 }
Wolfgang Betz 132:51056160fa4a 467
Wolfgang Betz 132:51056160fa4a 468 tBleStatus aci_gap_set_undirected_connectable(uint8_t own_addr_type, uint8_t adv_filter_policy)
Wolfgang Betz 132:51056160fa4a 469 {
Wolfgang Betz 132:51056160fa4a 470 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 471 gap_set_undirected_connectable_cp cp;
Wolfgang Betz 132:51056160fa4a 472 uint8_t status;
Wolfgang Betz 132:51056160fa4a 473
Wolfgang Betz 132:51056160fa4a 474 cp.own_addr_type = own_addr_type;
Wolfgang Betz 132:51056160fa4a 475 cp.adv_filter_policy = adv_filter_policy;
Wolfgang Betz 132:51056160fa4a 476
Wolfgang Betz 132:51056160fa4a 477 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 478 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 479 rq.ocf = OCF_GAP_SET_UNDIRECTED_CONNECTABLE;
Wolfgang Betz 132:51056160fa4a 480 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 481 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 482 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 483 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 484
Wolfgang Betz 132:51056160fa4a 485 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 486 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 487
Wolfgang Betz 132:51056160fa4a 488 return status;
Wolfgang Betz 132:51056160fa4a 489 }
Wolfgang Betz 132:51056160fa4a 490
Wolfgang Betz 132:51056160fa4a 491 tBleStatus aci_gap_slave_security_request(uint16_t conn_handle, uint8_t bonding, uint8_t mitm_protection)
Wolfgang Betz 132:51056160fa4a 492 {
Wolfgang Betz 132:51056160fa4a 493 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 494 gap_slave_security_request_cp cp;
Wolfgang Betz 132:51056160fa4a 495 uint8_t status;
Wolfgang Betz 132:51056160fa4a 496
Wolfgang Betz 132:51056160fa4a 497 cp.conn_handle = htobs(conn_handle);
Wolfgang Betz 132:51056160fa4a 498 cp.bonding = bonding;
Wolfgang Betz 132:51056160fa4a 499 cp.mitm_protection = mitm_protection;
Wolfgang Betz 132:51056160fa4a 500
Wolfgang Betz 132:51056160fa4a 501 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 502 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 503 rq.ocf = OCF_GAP_SLAVE_SECURITY_REQUEST;
Wolfgang Betz 132:51056160fa4a 504 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 505 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 506 rq.event = EVT_CMD_STATUS;
Wolfgang Betz 132:51056160fa4a 507 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 508 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 509
Wolfgang Betz 132:51056160fa4a 510 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 511 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 512
Wolfgang Betz 132:51056160fa4a 513 return status;
Wolfgang Betz 132:51056160fa4a 514
Wolfgang Betz 132:51056160fa4a 515 }
Wolfgang Betz 132:51056160fa4a 516
Wolfgang Betz 132:51056160fa4a 517 tBleStatus aci_gap_update_adv_data(uint8_t AdvLen, const uint8_t *AdvData)
Wolfgang Betz 132:51056160fa4a 518 {
Wolfgang Betz 132:51056160fa4a 519 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 520 uint8_t status;
Wolfgang Betz 132:51056160fa4a 521 uint8_t buffer[32];
Wolfgang Betz 132:51056160fa4a 522 uint8_t indx = 0;
Wolfgang Betz 132:51056160fa4a 523
Wolfgang Betz 132:51056160fa4a 524 if (AdvLen > (sizeof(buffer)-1))
Wolfgang Betz 132:51056160fa4a 525 return BLE_STATUS_INVALID_PARAMS;
Wolfgang Betz 132:51056160fa4a 526
Wolfgang Betz 132:51056160fa4a 527 buffer[indx] = AdvLen;
Wolfgang Betz 132:51056160fa4a 528 indx++;
Wolfgang Betz 132:51056160fa4a 529
Wolfgang Betz 132:51056160fa4a 530 Osal_MemCpy(buffer + indx, AdvData, AdvLen);
Wolfgang Betz 132:51056160fa4a 531 indx += AdvLen;
Wolfgang Betz 132:51056160fa4a 532
Wolfgang Betz 132:51056160fa4a 533 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 534 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 535 rq.ocf = OCF_GAP_UPDATE_ADV_DATA;
Wolfgang Betz 132:51056160fa4a 536 rq.cparam = (void *)buffer;
Wolfgang Betz 132:51056160fa4a 537 rq.clen = indx;
Wolfgang Betz 132:51056160fa4a 538 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 539 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 540
Wolfgang Betz 132:51056160fa4a 541 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 542 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 543
Wolfgang Betz 132:51056160fa4a 544 return status;
Wolfgang Betz 132:51056160fa4a 545 }
Wolfgang Betz 132:51056160fa4a 546
Wolfgang Betz 132:51056160fa4a 547 tBleStatus aci_gap_delete_ad_type(uint8_t ad_type)
Wolfgang Betz 132:51056160fa4a 548 {
Wolfgang Betz 132:51056160fa4a 549 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 550 gap_delete_ad_type_cp cp;
Wolfgang Betz 132:51056160fa4a 551 uint8_t status;
Wolfgang Betz 132:51056160fa4a 552
Wolfgang Betz 132:51056160fa4a 553 cp.ad_type = ad_type;
Wolfgang Betz 132:51056160fa4a 554
Wolfgang Betz 132:51056160fa4a 555 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 556 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 557 rq.ocf = OCF_GAP_DELETE_AD_TYPE;
Wolfgang Betz 132:51056160fa4a 558 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 559 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 560 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 561 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 562
Wolfgang Betz 132:51056160fa4a 563 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 564 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 565
Wolfgang Betz 132:51056160fa4a 566 return status;
Wolfgang Betz 132:51056160fa4a 567 }
Wolfgang Betz 132:51056160fa4a 568
Wolfgang Betz 132:51056160fa4a 569 tBleStatus aci_gap_get_security_level(uint8_t* mitm_protection, uint8_t* bonding,
Wolfgang Betz 132:51056160fa4a 570 uint8_t* oob_data, uint8_t* passkey_required)
Wolfgang Betz 132:51056160fa4a 571 {
Wolfgang Betz 132:51056160fa4a 572 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 573 gap_get_security_level_rp resp;
Wolfgang Betz 132:51056160fa4a 574
Wolfgang Betz 132:51056160fa4a 575 Osal_MemSet(&resp, 0, sizeof(resp));
Wolfgang Betz 132:51056160fa4a 576
Wolfgang Betz 132:51056160fa4a 577 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 578 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 579 rq.ocf = OCF_GAP_GET_SECURITY_LEVEL;
Wolfgang Betz 132:51056160fa4a 580 rq.rparam = &resp;
Wolfgang Betz 132:51056160fa4a 581 rq.rlen = GAP_GET_SECURITY_LEVEL_RP_SIZE;
Wolfgang Betz 132:51056160fa4a 582
Wolfgang Betz 132:51056160fa4a 583 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 584 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 585
Wolfgang Betz 132:51056160fa4a 586 if (resp.status) {
Wolfgang Betz 132:51056160fa4a 587 return resp.status;
Wolfgang Betz 132:51056160fa4a 588 }
Wolfgang Betz 132:51056160fa4a 589
Wolfgang Betz 132:51056160fa4a 590 *mitm_protection = resp.mitm_protection;
Wolfgang Betz 132:51056160fa4a 591 *bonding = resp.bonding;
Wolfgang Betz 132:51056160fa4a 592 *oob_data = resp.oob_data;
Wolfgang Betz 132:51056160fa4a 593 *passkey_required = resp.passkey_required;
Wolfgang Betz 132:51056160fa4a 594
Wolfgang Betz 132:51056160fa4a 595 return resp.status;
Wolfgang Betz 132:51056160fa4a 596 }
Wolfgang Betz 132:51056160fa4a 597
Wolfgang Betz 132:51056160fa4a 598 tBleStatus aci_gap_configure_whitelist(void)
Wolfgang Betz 132:51056160fa4a 599 {
Wolfgang Betz 132:51056160fa4a 600 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 601 uint8_t status;
Wolfgang Betz 132:51056160fa4a 602
Wolfgang Betz 132:51056160fa4a 603 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 604 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 605 rq.ocf = OCF_GAP_CONFIGURE_WHITELIST;
Wolfgang Betz 132:51056160fa4a 606 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 607 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 608
Wolfgang Betz 132:51056160fa4a 609 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 610 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 611
Wolfgang Betz 132:51056160fa4a 612 return status;
Wolfgang Betz 132:51056160fa4a 613 }
Wolfgang Betz 132:51056160fa4a 614
Wolfgang Betz 132:51056160fa4a 615 tBleStatus aci_gap_terminate(uint16_t conn_handle, uint8_t reason)
Wolfgang Betz 132:51056160fa4a 616 {
Wolfgang Betz 132:51056160fa4a 617 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 618 gap_terminate_cp cp;
Wolfgang Betz 132:51056160fa4a 619 uint8_t status;
Wolfgang Betz 132:51056160fa4a 620
Wolfgang Betz 132:51056160fa4a 621 cp.handle = htobs(conn_handle);
Wolfgang Betz 132:51056160fa4a 622 cp.reason = reason;
Wolfgang Betz 132:51056160fa4a 623
Wolfgang Betz 132:51056160fa4a 624 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 625 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 626 rq.ocf = OCF_GAP_TERMINATE;
Wolfgang Betz 132:51056160fa4a 627 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 628 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 629 rq.event = EVT_CMD_STATUS;
Wolfgang Betz 132:51056160fa4a 630 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 631 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 632
Wolfgang Betz 132:51056160fa4a 633 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 634 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 635
Wolfgang Betz 132:51056160fa4a 636 return status;
Wolfgang Betz 132:51056160fa4a 637 }
Wolfgang Betz 132:51056160fa4a 638
Wolfgang Betz 132:51056160fa4a 639 tBleStatus aci_gap_clear_security_database(void)
Wolfgang Betz 132:51056160fa4a 640 {
Wolfgang Betz 132:51056160fa4a 641 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 642 uint8_t status;
Wolfgang Betz 132:51056160fa4a 643
Wolfgang Betz 132:51056160fa4a 644 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 645 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 646 rq.ocf = OCF_GAP_CLEAR_SECURITY_DB;
Wolfgang Betz 132:51056160fa4a 647 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 648 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 649
Wolfgang Betz 132:51056160fa4a 650 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 651 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 652
Wolfgang Betz 132:51056160fa4a 653 return status;
Wolfgang Betz 132:51056160fa4a 654 }
Wolfgang Betz 132:51056160fa4a 655
Wolfgang Betz 132:51056160fa4a 656 tBleStatus aci_gap_allow_rebond_IDB05A1(uint16_t conn_handle)
Wolfgang Betz 132:51056160fa4a 657 {
Wolfgang Betz 132:51056160fa4a 658 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 659 gap_allow_rebond_cp_IDB05A1 cp;
Wolfgang Betz 132:51056160fa4a 660 uint8_t status;
Wolfgang Betz 132:51056160fa4a 661
Wolfgang Betz 132:51056160fa4a 662 cp.conn_handle = conn_handle;
Wolfgang Betz 132:51056160fa4a 663
Wolfgang Betz 132:51056160fa4a 664 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 665 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 666 rq.ocf = OCF_GAP_ALLOW_REBOND_DB;
Wolfgang Betz 132:51056160fa4a 667 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 668 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 669 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 670 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 671
Wolfgang Betz 132:51056160fa4a 672 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 673 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 674
Wolfgang Betz 132:51056160fa4a 675 return status;
Wolfgang Betz 132:51056160fa4a 676 }
Wolfgang Betz 132:51056160fa4a 677 tBleStatus aci_gap_allow_rebond_IDB04A1(void)
Wolfgang Betz 132:51056160fa4a 678 {
Wolfgang Betz 132:51056160fa4a 679 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 680 uint8_t status;
Wolfgang Betz 132:51056160fa4a 681
Wolfgang Betz 132:51056160fa4a 682 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 683 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 684 rq.ocf = OCF_GAP_ALLOW_REBOND_DB;
Wolfgang Betz 132:51056160fa4a 685 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 686 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 687
Wolfgang Betz 132:51056160fa4a 688 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 689 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 690
Wolfgang Betz 132:51056160fa4a 691 return status;
Wolfgang Betz 132:51056160fa4a 692 }
Wolfgang Betz 132:51056160fa4a 693
Wolfgang Betz 132:51056160fa4a 694 tBleStatus aci_gap_start_limited_discovery_proc(uint16_t scanInterval, uint16_t scanWindow,
Wolfgang Betz 132:51056160fa4a 695 uint8_t own_address_type, uint8_t filterDuplicates)
Wolfgang Betz 132:51056160fa4a 696 {
Wolfgang Betz 132:51056160fa4a 697 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 698 gap_start_limited_discovery_proc_cp cp;
Wolfgang Betz 132:51056160fa4a 699 uint8_t status;
Wolfgang Betz 132:51056160fa4a 700
Wolfgang Betz 132:51056160fa4a 701 cp.scanInterval = htobs(scanInterval);
Wolfgang Betz 132:51056160fa4a 702 cp.scanWindow = htobs(scanWindow);
Wolfgang Betz 132:51056160fa4a 703 cp.own_address_type = own_address_type;
Wolfgang Betz 132:51056160fa4a 704 cp.filterDuplicates = filterDuplicates;
Wolfgang Betz 132:51056160fa4a 705
Wolfgang Betz 132:51056160fa4a 706 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 707 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 708 rq.ocf = OCF_GAP_START_LIMITED_DISCOVERY_PROC;
Wolfgang Betz 132:51056160fa4a 709 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 710 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 711 rq.event = EVT_CMD_STATUS;
Wolfgang Betz 132:51056160fa4a 712 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 713 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 714
Wolfgang Betz 132:51056160fa4a 715 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 716 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 717
Wolfgang Betz 132:51056160fa4a 718 return status;
Wolfgang Betz 132:51056160fa4a 719 }
Wolfgang Betz 132:51056160fa4a 720
Wolfgang Betz 132:51056160fa4a 721 tBleStatus aci_gap_start_general_discovery_proc(uint16_t scanInterval, uint16_t scanWindow,
Wolfgang Betz 132:51056160fa4a 722 uint8_t own_address_type, uint8_t filterDuplicates)
Wolfgang Betz 132:51056160fa4a 723 {
Wolfgang Betz 132:51056160fa4a 724 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 725 gap_start_general_discovery_proc_cp cp;
Wolfgang Betz 132:51056160fa4a 726 uint8_t status;
Wolfgang Betz 132:51056160fa4a 727
Wolfgang Betz 132:51056160fa4a 728 cp.scanInterval = htobs(scanInterval);
Wolfgang Betz 132:51056160fa4a 729 cp.scanWindow = htobs(scanWindow);
Wolfgang Betz 132:51056160fa4a 730 cp.own_address_type = own_address_type;
Wolfgang Betz 132:51056160fa4a 731 cp.filterDuplicates = filterDuplicates;
Wolfgang Betz 132:51056160fa4a 732
Wolfgang Betz 132:51056160fa4a 733 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 734 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 735 rq.ocf = OCF_GAP_START_GENERAL_DISCOVERY_PROC;
Wolfgang Betz 132:51056160fa4a 736 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 737 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 738 rq.event = EVT_CMD_STATUS;
Wolfgang Betz 132:51056160fa4a 739 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 740 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 741
Wolfgang Betz 132:51056160fa4a 742 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 743 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 744
Wolfgang Betz 132:51056160fa4a 745 return status;
Wolfgang Betz 132:51056160fa4a 746 }
Wolfgang Betz 132:51056160fa4a 747
Wolfgang Betz 132:51056160fa4a 748
Wolfgang Betz 132:51056160fa4a 749 tBleStatus aci_gap_start_name_discovery_proc(uint16_t scanInterval, uint16_t scanWindow,
Wolfgang Betz 132:51056160fa4a 750 uint8_t peer_bdaddr_type, tBDAddr peer_bdaddr,
Wolfgang Betz 132:51056160fa4a 751 uint8_t own_bdaddr_type, uint16_t conn_min_interval,
Wolfgang Betz 132:51056160fa4a 752 uint16_t conn_max_interval, uint16_t conn_latency,
Wolfgang Betz 132:51056160fa4a 753 uint16_t supervision_timeout, uint16_t min_conn_length,
Wolfgang Betz 132:51056160fa4a 754 uint16_t max_conn_length)
Wolfgang Betz 132:51056160fa4a 755 {
Wolfgang Betz 132:51056160fa4a 756 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 757 gap_start_name_discovery_proc_cp cp;
Wolfgang Betz 132:51056160fa4a 758 uint8_t status;
Wolfgang Betz 132:51056160fa4a 759
Wolfgang Betz 132:51056160fa4a 760 cp.scanInterval = htobs(scanInterval);
Wolfgang Betz 132:51056160fa4a 761 cp.scanWindow = htobs(scanWindow);
Wolfgang Betz 132:51056160fa4a 762 cp.peer_bdaddr_type = peer_bdaddr_type;
Wolfgang Betz 132:51056160fa4a 763 Osal_MemCpy(cp.peer_bdaddr, peer_bdaddr, 6);
Wolfgang Betz 132:51056160fa4a 764 cp.own_bdaddr_type = own_bdaddr_type;
Wolfgang Betz 132:51056160fa4a 765 cp.conn_min_interval = htobs(conn_min_interval);
Wolfgang Betz 132:51056160fa4a 766 cp.conn_max_interval = htobs(conn_max_interval);
Wolfgang Betz 132:51056160fa4a 767 cp.conn_latency = htobs(conn_latency);
Wolfgang Betz 132:51056160fa4a 768 cp.supervision_timeout = htobs(supervision_timeout);
Wolfgang Betz 132:51056160fa4a 769 cp.min_conn_length = htobs(min_conn_length);
Wolfgang Betz 132:51056160fa4a 770 cp.max_conn_length = htobs(max_conn_length);
Wolfgang Betz 132:51056160fa4a 771
Wolfgang Betz 132:51056160fa4a 772 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 773 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 774 rq.ocf = OCF_GAP_START_NAME_DISCOVERY_PROC;
Wolfgang Betz 132:51056160fa4a 775 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 776 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 777 rq.event = EVT_CMD_STATUS;
Wolfgang Betz 132:51056160fa4a 778 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 779 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 780
Wolfgang Betz 132:51056160fa4a 781 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 782 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 783
Wolfgang Betz 132:51056160fa4a 784 return status;
Wolfgang Betz 132:51056160fa4a 785 }
Wolfgang Betz 132:51056160fa4a 786
Wolfgang Betz 132:51056160fa4a 787 tBleStatus aci_gap_start_auto_conn_establish_proc_IDB05A1(uint16_t scanInterval, uint16_t scanWindow,
Wolfgang Betz 132:51056160fa4a 788 uint8_t own_bdaddr_type, uint16_t conn_min_interval,
Wolfgang Betz 132:51056160fa4a 789 uint16_t conn_max_interval, uint16_t conn_latency,
Wolfgang Betz 132:51056160fa4a 790 uint16_t supervision_timeout, uint16_t min_conn_length,
Wolfgang Betz 132:51056160fa4a 791 uint16_t max_conn_length,
Wolfgang Betz 132:51056160fa4a 792 uint8_t num_whitelist_entries,
Wolfgang Betz 132:51056160fa4a 793 const uint8_t *addr_array)
Wolfgang Betz 132:51056160fa4a 794 {
Wolfgang Betz 132:51056160fa4a 795 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 796 uint8_t status;
Wolfgang Betz 132:51056160fa4a 797 uint8_t buffer[HCI_MAX_PAYLOAD_SIZE];
Wolfgang Betz 132:51056160fa4a 798 uint8_t indx = 0;
Wolfgang Betz 132:51056160fa4a 799
Wolfgang Betz 132:51056160fa4a 800 if (((num_whitelist_entries*7)+25) > HCI_MAX_PAYLOAD_SIZE)
Wolfgang Betz 132:51056160fa4a 801 return BLE_STATUS_INVALID_PARAMS;
Wolfgang Betz 132:51056160fa4a 802
Wolfgang Betz 132:51056160fa4a 803 scanInterval = htobs(scanInterval);
Wolfgang Betz 132:51056160fa4a 804 Osal_MemCpy(buffer + indx, &scanInterval, 2);
Wolfgang Betz 132:51056160fa4a 805 indx += 2;
Wolfgang Betz 132:51056160fa4a 806
Wolfgang Betz 132:51056160fa4a 807 scanWindow = htobs(scanWindow);
Wolfgang Betz 132:51056160fa4a 808 Osal_MemCpy(buffer + indx, &scanWindow, 2);
Wolfgang Betz 132:51056160fa4a 809 indx += 2;
Wolfgang Betz 132:51056160fa4a 810
Wolfgang Betz 132:51056160fa4a 811 buffer[indx] = own_bdaddr_type;
Wolfgang Betz 132:51056160fa4a 812 indx++;
Wolfgang Betz 132:51056160fa4a 813
Wolfgang Betz 132:51056160fa4a 814 conn_min_interval = htobs(conn_min_interval);
Wolfgang Betz 132:51056160fa4a 815 Osal_MemCpy(buffer + indx, &conn_min_interval, 2);
Wolfgang Betz 132:51056160fa4a 816 indx += 2;
Wolfgang Betz 132:51056160fa4a 817
Wolfgang Betz 132:51056160fa4a 818 conn_max_interval = htobs(conn_max_interval);
Wolfgang Betz 132:51056160fa4a 819 Osal_MemCpy(buffer + indx, &conn_max_interval, 2);
Wolfgang Betz 132:51056160fa4a 820 indx += 2;
Wolfgang Betz 132:51056160fa4a 821
Wolfgang Betz 132:51056160fa4a 822 conn_latency = htobs(conn_latency);
Wolfgang Betz 132:51056160fa4a 823 Osal_MemCpy(buffer + indx, &conn_latency, 2);
Wolfgang Betz 132:51056160fa4a 824 indx += 2;
Wolfgang Betz 132:51056160fa4a 825
Wolfgang Betz 132:51056160fa4a 826 supervision_timeout = htobs(supervision_timeout);
Wolfgang Betz 132:51056160fa4a 827 Osal_MemCpy(buffer + indx, &supervision_timeout, 2);
Wolfgang Betz 132:51056160fa4a 828 indx += 2;
Wolfgang Betz 132:51056160fa4a 829
Wolfgang Betz 132:51056160fa4a 830 min_conn_length = htobs(min_conn_length);
Wolfgang Betz 132:51056160fa4a 831 Osal_MemCpy(buffer + indx, &min_conn_length, 2);
Wolfgang Betz 132:51056160fa4a 832 indx += 2;
Wolfgang Betz 132:51056160fa4a 833
Wolfgang Betz 132:51056160fa4a 834 max_conn_length = htobs(max_conn_length);
Wolfgang Betz 132:51056160fa4a 835 Osal_MemCpy(buffer + indx, &max_conn_length, 2);
Wolfgang Betz 132:51056160fa4a 836 indx += 2;
Wolfgang Betz 132:51056160fa4a 837
Wolfgang Betz 132:51056160fa4a 838 buffer[indx] = num_whitelist_entries;
Wolfgang Betz 132:51056160fa4a 839 indx++;
Wolfgang Betz 132:51056160fa4a 840
Wolfgang Betz 132:51056160fa4a 841 Osal_MemCpy(buffer + indx, addr_array, (num_whitelist_entries*7));
Wolfgang Betz 132:51056160fa4a 842 indx += num_whitelist_entries * 7;
Wolfgang Betz 132:51056160fa4a 843
Wolfgang Betz 132:51056160fa4a 844 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 845 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 846 rq.ocf = OCF_GAP_START_AUTO_CONN_ESTABLISH_PROC;
Wolfgang Betz 132:51056160fa4a 847 rq.cparam = (void *)buffer;
Wolfgang Betz 132:51056160fa4a 848 rq.clen = indx;
Wolfgang Betz 132:51056160fa4a 849 rq.event = EVT_CMD_STATUS;
Wolfgang Betz 132:51056160fa4a 850 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 851 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 852
Wolfgang Betz 132:51056160fa4a 853 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 854 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 855
Wolfgang Betz 132:51056160fa4a 856 return status;
Wolfgang Betz 132:51056160fa4a 857 }
Wolfgang Betz 132:51056160fa4a 858
Wolfgang Betz 132:51056160fa4a 859 tBleStatus aci_gap_start_auto_conn_establish_proc_IDB04A1(uint16_t scanInterval, uint16_t scanWindow,
Wolfgang Betz 132:51056160fa4a 860 uint8_t own_bdaddr_type, uint16_t conn_min_interval,
Wolfgang Betz 132:51056160fa4a 861 uint16_t conn_max_interval, uint16_t conn_latency,
Wolfgang Betz 132:51056160fa4a 862 uint16_t supervision_timeout, uint16_t min_conn_length,
Wolfgang Betz 132:51056160fa4a 863 uint16_t max_conn_length,
Wolfgang Betz 132:51056160fa4a 864 uint8_t use_reconn_addr,
Wolfgang Betz 132:51056160fa4a 865 const tBDAddr reconn_addr,
Wolfgang Betz 132:51056160fa4a 866 uint8_t num_whitelist_entries,
Wolfgang Betz 132:51056160fa4a 867 const uint8_t *addr_array)
Wolfgang Betz 132:51056160fa4a 868 {
Wolfgang Betz 132:51056160fa4a 869 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 870 uint8_t status;
Wolfgang Betz 132:51056160fa4a 871 uint8_t buffer[HCI_MAX_PAYLOAD_SIZE];
Wolfgang Betz 132:51056160fa4a 872 uint8_t indx = 0;
Wolfgang Betz 132:51056160fa4a 873
Wolfgang Betz 132:51056160fa4a 874 if (((num_whitelist_entries*7)+25) > HCI_MAX_PAYLOAD_SIZE)
Wolfgang Betz 132:51056160fa4a 875 return BLE_STATUS_INVALID_PARAMS;
Wolfgang Betz 132:51056160fa4a 876
Wolfgang Betz 132:51056160fa4a 877 scanInterval = htobs(scanInterval);
Wolfgang Betz 132:51056160fa4a 878 Osal_MemCpy(buffer + indx, &scanInterval, 2);
Wolfgang Betz 132:51056160fa4a 879 indx += 2;
Wolfgang Betz 132:51056160fa4a 880
Wolfgang Betz 132:51056160fa4a 881 scanWindow = htobs(scanWindow);
Wolfgang Betz 132:51056160fa4a 882 Osal_MemCpy(buffer + indx, &scanWindow, 2);
Wolfgang Betz 132:51056160fa4a 883 indx += 2;
Wolfgang Betz 132:51056160fa4a 884
Wolfgang Betz 132:51056160fa4a 885 buffer[indx] = own_bdaddr_type;
Wolfgang Betz 132:51056160fa4a 886 indx++;
Wolfgang Betz 132:51056160fa4a 887
Wolfgang Betz 132:51056160fa4a 888 conn_min_interval = htobs(conn_min_interval);
Wolfgang Betz 132:51056160fa4a 889 Osal_MemCpy(buffer + indx, &conn_min_interval, 2);
Wolfgang Betz 132:51056160fa4a 890 indx += 2;
Wolfgang Betz 132:51056160fa4a 891
Wolfgang Betz 132:51056160fa4a 892 conn_max_interval = htobs(conn_max_interval);
Wolfgang Betz 132:51056160fa4a 893 Osal_MemCpy(buffer + indx, &conn_max_interval, 2);
Wolfgang Betz 132:51056160fa4a 894 indx += 2;
Wolfgang Betz 132:51056160fa4a 895
Wolfgang Betz 132:51056160fa4a 896 conn_latency = htobs(conn_latency);
Wolfgang Betz 132:51056160fa4a 897 Osal_MemCpy(buffer + indx, &conn_latency, 2);
Wolfgang Betz 132:51056160fa4a 898 indx += 2;
Wolfgang Betz 132:51056160fa4a 899
Wolfgang Betz 132:51056160fa4a 900 supervision_timeout = htobs(supervision_timeout);
Wolfgang Betz 132:51056160fa4a 901 Osal_MemCpy(buffer + indx, &supervision_timeout, 2);
Wolfgang Betz 132:51056160fa4a 902 indx += 2;
Wolfgang Betz 132:51056160fa4a 903
Wolfgang Betz 132:51056160fa4a 904 min_conn_length = htobs(min_conn_length);
Wolfgang Betz 132:51056160fa4a 905 Osal_MemCpy(buffer + indx, &min_conn_length, 2);
Wolfgang Betz 132:51056160fa4a 906 indx += 2;
Wolfgang Betz 132:51056160fa4a 907
Wolfgang Betz 132:51056160fa4a 908 max_conn_length = htobs(max_conn_length);
Wolfgang Betz 132:51056160fa4a 909 Osal_MemCpy(buffer + indx, &max_conn_length, 2);
Wolfgang Betz 132:51056160fa4a 910 indx += 2;
Wolfgang Betz 132:51056160fa4a 911
Wolfgang Betz 132:51056160fa4a 912 buffer[indx] = use_reconn_addr;
Wolfgang Betz 132:51056160fa4a 913 indx++;
Wolfgang Betz 132:51056160fa4a 914
Wolfgang Betz 132:51056160fa4a 915 Osal_MemCpy(buffer + indx, reconn_addr, 6);
Wolfgang Betz 132:51056160fa4a 916 indx += 6;
Wolfgang Betz 132:51056160fa4a 917
Wolfgang Betz 132:51056160fa4a 918 buffer[indx] = num_whitelist_entries;
Wolfgang Betz 132:51056160fa4a 919 indx++;
Wolfgang Betz 132:51056160fa4a 920
Wolfgang Betz 132:51056160fa4a 921 Osal_MemCpy(buffer + indx, addr_array, (num_whitelist_entries*7));
Wolfgang Betz 132:51056160fa4a 922 indx += num_whitelist_entries * 7;
Wolfgang Betz 132:51056160fa4a 923
Wolfgang Betz 132:51056160fa4a 924 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 925 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 926 rq.ocf = OCF_GAP_START_AUTO_CONN_ESTABLISH_PROC;
Wolfgang Betz 132:51056160fa4a 927 rq.cparam = (void *)buffer;
Wolfgang Betz 132:51056160fa4a 928 rq.clen = indx;
Wolfgang Betz 132:51056160fa4a 929 rq.event = EVT_CMD_STATUS;
Wolfgang Betz 132:51056160fa4a 930 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 931 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 932
Wolfgang Betz 132:51056160fa4a 933 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 934 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 935
Wolfgang Betz 132:51056160fa4a 936 return status;
Wolfgang Betz 132:51056160fa4a 937 }
Wolfgang Betz 132:51056160fa4a 938
Wolfgang Betz 132:51056160fa4a 939 tBleStatus aci_gap_start_general_conn_establish_proc_IDB05A1(uint8_t scan_type, uint16_t scan_interval, uint16_t scan_window,
Wolfgang Betz 132:51056160fa4a 940 uint8_t own_address_type, uint8_t filter_duplicates)
Wolfgang Betz 132:51056160fa4a 941 {
Wolfgang Betz 132:51056160fa4a 942 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 943 gap_start_general_conn_establish_proc_cp_IDB05A1 cp;
Wolfgang Betz 132:51056160fa4a 944 uint8_t status;
Wolfgang Betz 132:51056160fa4a 945
Wolfgang Betz 132:51056160fa4a 946 cp.scan_type = scan_type;
Wolfgang Betz 132:51056160fa4a 947 cp.scan_interval = htobs(scan_interval);
Wolfgang Betz 132:51056160fa4a 948 cp.scan_window = htobs(scan_window);
Wolfgang Betz 132:51056160fa4a 949 cp.own_address_type = own_address_type;
Wolfgang Betz 132:51056160fa4a 950 cp.filter_duplicates = filter_duplicates;
Wolfgang Betz 132:51056160fa4a 951
Wolfgang Betz 132:51056160fa4a 952 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 953 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 954 rq.ocf = OCF_GAP_START_GENERAL_CONN_ESTABLISH_PROC;
Wolfgang Betz 132:51056160fa4a 955 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 956 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 957 rq.event = EVT_CMD_STATUS;
Wolfgang Betz 132:51056160fa4a 958 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 959 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 960
Wolfgang Betz 132:51056160fa4a 961 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 962 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 963
Wolfgang Betz 132:51056160fa4a 964 return status;
Wolfgang Betz 132:51056160fa4a 965 }
Wolfgang Betz 132:51056160fa4a 966 tBleStatus aci_gap_start_general_conn_establish_proc_IDB04A1(uint8_t scan_type, uint16_t scan_interval, uint16_t scan_window,
Wolfgang Betz 132:51056160fa4a 967 uint8_t own_address_type, uint8_t filter_duplicates, uint8_t use_reconn_addr, const tBDAddr reconn_addr)
Wolfgang Betz 132:51056160fa4a 968 {
Wolfgang Betz 132:51056160fa4a 969 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 970 gap_start_general_conn_establish_proc_cp_IDB04A1 cp;
Wolfgang Betz 132:51056160fa4a 971 uint8_t status;
Wolfgang Betz 132:51056160fa4a 972
Wolfgang Betz 132:51056160fa4a 973 cp.scan_type = scan_type;
Wolfgang Betz 132:51056160fa4a 974 cp.scan_interval = htobs(scan_interval);
Wolfgang Betz 132:51056160fa4a 975 cp.scan_window = htobs(scan_window);
Wolfgang Betz 132:51056160fa4a 976 cp.own_address_type = own_address_type;
Wolfgang Betz 132:51056160fa4a 977 cp.filter_duplicates = filter_duplicates;
Wolfgang Betz 132:51056160fa4a 978 cp.use_reconn_addr = use_reconn_addr;
Wolfgang Betz 132:51056160fa4a 979 Osal_MemCpy(cp.reconn_addr, reconn_addr, 6);
Wolfgang Betz 132:51056160fa4a 980
Wolfgang Betz 132:51056160fa4a 981 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 982 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 983 rq.ocf = OCF_GAP_START_GENERAL_CONN_ESTABLISH_PROC;
Wolfgang Betz 132:51056160fa4a 984 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 985 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 986 rq.event = EVT_CMD_STATUS;
Wolfgang Betz 132:51056160fa4a 987 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 988 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 989
Wolfgang Betz 132:51056160fa4a 990 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 991 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 992
Wolfgang Betz 132:51056160fa4a 993 return status;
Wolfgang Betz 132:51056160fa4a 994 }
Wolfgang Betz 132:51056160fa4a 995
Wolfgang Betz 132:51056160fa4a 996 tBleStatus aci_gap_start_selective_conn_establish_proc(uint8_t scan_type, uint16_t scan_interval, uint16_t scan_window,
Wolfgang Betz 132:51056160fa4a 997 uint8_t own_address_type, uint8_t filter_duplicates, uint8_t num_whitelist_entries,
Wolfgang Betz 132:51056160fa4a 998 const uint8_t *addr_array)
Wolfgang Betz 132:51056160fa4a 999 {
Wolfgang Betz 132:51056160fa4a 1000 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 1001 gap_start_selective_conn_establish_proc_cp cp;
Wolfgang Betz 132:51056160fa4a 1002 uint8_t status;
Wolfgang Betz 132:51056160fa4a 1003
Wolfgang Betz 132:51056160fa4a 1004 if (((num_whitelist_entries*7)+GAP_START_SELECTIVE_CONN_ESTABLISH_PROC_CP_SIZE) > HCI_MAX_PAYLOAD_SIZE)
Wolfgang Betz 132:51056160fa4a 1005 return BLE_STATUS_INVALID_PARAMS;
Wolfgang Betz 132:51056160fa4a 1006
Wolfgang Betz 132:51056160fa4a 1007 cp.scan_type = scan_type;
Wolfgang Betz 132:51056160fa4a 1008 cp.scan_interval = htobs(scan_interval);
Wolfgang Betz 132:51056160fa4a 1009 cp.scan_window = htobs(scan_window);
Wolfgang Betz 132:51056160fa4a 1010 cp.own_address_type = own_address_type;
Wolfgang Betz 132:51056160fa4a 1011 cp.filter_duplicates = filter_duplicates;
Wolfgang Betz 132:51056160fa4a 1012 cp.num_whitelist_entries = num_whitelist_entries;
Wolfgang Betz 132:51056160fa4a 1013
Wolfgang Betz 132:51056160fa4a 1014 Osal_MemCpy(cp.addr_array, addr_array, (num_whitelist_entries*7));
Wolfgang Betz 132:51056160fa4a 1015
Wolfgang Betz 132:51056160fa4a 1016 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 1017 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 1018 rq.ocf = OCF_GAP_START_SELECTIVE_CONN_ESTABLISH_PROC;
Wolfgang Betz 132:51056160fa4a 1019 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 1020 rq.clen = GAP_START_SELECTIVE_CONN_ESTABLISH_PROC_CP_SIZE + (num_whitelist_entries*7);
Wolfgang Betz 132:51056160fa4a 1021 rq.event = EVT_CMD_STATUS;
Wolfgang Betz 132:51056160fa4a 1022 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 1023 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 1024
Wolfgang Betz 132:51056160fa4a 1025 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 1026 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 1027
Wolfgang Betz 132:51056160fa4a 1028 return status;
Wolfgang Betz 132:51056160fa4a 1029 }
Wolfgang Betz 132:51056160fa4a 1030
Wolfgang Betz 132:51056160fa4a 1031 tBleStatus aci_gap_create_connection(uint16_t scanInterval, uint16_t scanWindow,
Wolfgang Betz 132:51056160fa4a 1032 uint8_t peer_bdaddr_type, tBDAddr peer_bdaddr,
Wolfgang Betz 132:51056160fa4a 1033 uint8_t own_bdaddr_type, uint16_t conn_min_interval,
Wolfgang Betz 132:51056160fa4a 1034 uint16_t conn_max_interval, uint16_t conn_latency,
Wolfgang Betz 132:51056160fa4a 1035 uint16_t supervision_timeout, uint16_t min_conn_length,
Wolfgang Betz 132:51056160fa4a 1036 uint16_t max_conn_length)
Wolfgang Betz 132:51056160fa4a 1037 {
Wolfgang Betz 132:51056160fa4a 1038 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 1039 gap_create_connection_cp cp;
Wolfgang Betz 132:51056160fa4a 1040 uint8_t status;
Wolfgang Betz 132:51056160fa4a 1041
Wolfgang Betz 132:51056160fa4a 1042 cp.scanInterval = htobs(scanInterval);
Wolfgang Betz 132:51056160fa4a 1043 cp.scanWindow = htobs(scanWindow);
Wolfgang Betz 132:51056160fa4a 1044 cp.peer_bdaddr_type = peer_bdaddr_type;
Wolfgang Betz 132:51056160fa4a 1045 Osal_MemCpy(cp.peer_bdaddr, peer_bdaddr, 6);
Wolfgang Betz 132:51056160fa4a 1046 cp.own_bdaddr_type = own_bdaddr_type;
Wolfgang Betz 132:51056160fa4a 1047 cp.conn_min_interval = htobs(conn_min_interval);
Wolfgang Betz 132:51056160fa4a 1048 cp.conn_max_interval = htobs(conn_max_interval);
Wolfgang Betz 132:51056160fa4a 1049 cp.conn_latency = htobs(conn_latency);
Wolfgang Betz 132:51056160fa4a 1050 cp.supervision_timeout = htobs(supervision_timeout);
Wolfgang Betz 132:51056160fa4a 1051 cp.min_conn_length = htobs(min_conn_length);
Wolfgang Betz 132:51056160fa4a 1052 cp.max_conn_length = htobs(max_conn_length);
Wolfgang Betz 132:51056160fa4a 1053
Wolfgang Betz 132:51056160fa4a 1054 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 1055 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 1056 rq.ocf = OCF_GAP_CREATE_CONNECTION;
Wolfgang Betz 132:51056160fa4a 1057 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 1058 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 1059 rq.event = EVT_CMD_STATUS;
Wolfgang Betz 132:51056160fa4a 1060 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 1061 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 1062
Wolfgang Betz 132:51056160fa4a 1063 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 1064 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 1065
Wolfgang Betz 132:51056160fa4a 1066 return status;
Wolfgang Betz 132:51056160fa4a 1067 }
Wolfgang Betz 132:51056160fa4a 1068
Wolfgang Betz 132:51056160fa4a 1069 tBleStatus aci_gap_terminate_gap_procedure(uint8_t procedure_code)
Wolfgang Betz 132:51056160fa4a 1070 {
Wolfgang Betz 132:51056160fa4a 1071 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 1072 uint8_t status;
Wolfgang Betz 132:51056160fa4a 1073
Wolfgang Betz 132:51056160fa4a 1074 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 1075 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 1076 rq.ocf = OCF_GAP_TERMINATE_GAP_PROCEDURE;
Wolfgang Betz 132:51056160fa4a 1077 rq.cparam = &procedure_code;
Wolfgang Betz 132:51056160fa4a 1078 rq.clen = 1;
Wolfgang Betz 132:51056160fa4a 1079 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 1080 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 1081
Wolfgang Betz 132:51056160fa4a 1082 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 1083 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 1084
Wolfgang Betz 132:51056160fa4a 1085 return status;
Wolfgang Betz 132:51056160fa4a 1086
Wolfgang Betz 132:51056160fa4a 1087 }
Wolfgang Betz 132:51056160fa4a 1088
Wolfgang Betz 132:51056160fa4a 1089 tBleStatus aci_gap_start_connection_update(uint16_t conn_handle, uint16_t conn_min_interval,
Wolfgang Betz 132:51056160fa4a 1090 uint16_t conn_max_interval, uint16_t conn_latency,
Wolfgang Betz 132:51056160fa4a 1091 uint16_t supervision_timeout, uint16_t min_conn_length,
Wolfgang Betz 132:51056160fa4a 1092 uint16_t max_conn_length)
Wolfgang Betz 132:51056160fa4a 1093 {
Wolfgang Betz 132:51056160fa4a 1094 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 1095 gap_start_connection_update_cp cp;
Wolfgang Betz 132:51056160fa4a 1096 uint8_t status;
Wolfgang Betz 132:51056160fa4a 1097
Wolfgang Betz 132:51056160fa4a 1098 cp.conn_handle = htobs(conn_handle);
Wolfgang Betz 132:51056160fa4a 1099 cp.conn_min_interval = htobs(conn_min_interval);
Wolfgang Betz 132:51056160fa4a 1100 cp.conn_max_interval = htobs(conn_max_interval);
Wolfgang Betz 132:51056160fa4a 1101 cp.conn_latency = htobs(conn_latency);
Wolfgang Betz 132:51056160fa4a 1102 cp.supervision_timeout = htobs(supervision_timeout);
Wolfgang Betz 132:51056160fa4a 1103 cp.min_conn_length = htobs(min_conn_length);
Wolfgang Betz 132:51056160fa4a 1104 cp.max_conn_length = htobs(max_conn_length);
Wolfgang Betz 132:51056160fa4a 1105
Wolfgang Betz 132:51056160fa4a 1106 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 1107 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 1108 rq.ocf = OCF_GAP_START_CONNECTION_UPDATE;
Wolfgang Betz 132:51056160fa4a 1109 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 1110 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 1111 rq.event = EVT_CMD_STATUS;
Wolfgang Betz 132:51056160fa4a 1112 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 1113 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 1114
Wolfgang Betz 132:51056160fa4a 1115 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 1116 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 1117
Wolfgang Betz 132:51056160fa4a 1118 return status;
Wolfgang Betz 132:51056160fa4a 1119 }
Wolfgang Betz 132:51056160fa4a 1120
Wolfgang Betz 132:51056160fa4a 1121 tBleStatus aci_gap_send_pairing_request(uint16_t conn_handle, uint8_t force_rebond)
Wolfgang Betz 132:51056160fa4a 1122 {
Wolfgang Betz 132:51056160fa4a 1123 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 1124 gap_send_pairing_request_cp cp;
Wolfgang Betz 132:51056160fa4a 1125 uint8_t status;
Wolfgang Betz 132:51056160fa4a 1126
Wolfgang Betz 132:51056160fa4a 1127 cp.conn_handle = htobs(conn_handle);
Wolfgang Betz 132:51056160fa4a 1128 cp.force_rebond = force_rebond;
Wolfgang Betz 132:51056160fa4a 1129
Wolfgang Betz 132:51056160fa4a 1130 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 1131 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 1132 rq.ocf = OCF_GAP_SEND_PAIRING_REQUEST;
Wolfgang Betz 132:51056160fa4a 1133 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 1134 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 1135 rq.event = EVT_CMD_STATUS;
Wolfgang Betz 132:51056160fa4a 1136 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 1137 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 1138
Wolfgang Betz 132:51056160fa4a 1139 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 1140 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 1141
Wolfgang Betz 132:51056160fa4a 1142 return status;
Wolfgang Betz 132:51056160fa4a 1143 }
Wolfgang Betz 132:51056160fa4a 1144
Wolfgang Betz 132:51056160fa4a 1145 tBleStatus aci_gap_resolve_private_address_IDB05A1(const tBDAddr private_address, tBDAddr actual_address)
Wolfgang Betz 132:51056160fa4a 1146 {
Wolfgang Betz 132:51056160fa4a 1147 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 1148 gap_resolve_private_address_cp cp;
Wolfgang Betz 132:51056160fa4a 1149 gap_resolve_private_address_rp rp;
Wolfgang Betz 132:51056160fa4a 1150
Wolfgang Betz 132:51056160fa4a 1151 Osal_MemCpy(cp.address, private_address, 6);
Wolfgang Betz 132:51056160fa4a 1152
Wolfgang Betz 132:51056160fa4a 1153 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 1154 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 1155 rq.ocf = OCF_GAP_RESOLVE_PRIVATE_ADDRESS;
Wolfgang Betz 132:51056160fa4a 1156 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 1157 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 1158 rq.rparam = &rp;
Wolfgang Betz 132:51056160fa4a 1159 rq.rlen = sizeof(rp);
Wolfgang Betz 132:51056160fa4a 1160
Wolfgang Betz 132:51056160fa4a 1161 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 1162 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 1163
Wolfgang Betz 132:51056160fa4a 1164 if(rp.status)
Wolfgang Betz 132:51056160fa4a 1165 return rp.status;
Wolfgang Betz 132:51056160fa4a 1166
Wolfgang Betz 132:51056160fa4a 1167 Osal_MemCpy(actual_address, rp.address, sizeof(actual_address));
Wolfgang Betz 132:51056160fa4a 1168
Wolfgang Betz 132:51056160fa4a 1169 return 0;
Wolfgang Betz 132:51056160fa4a 1170 }
Wolfgang Betz 132:51056160fa4a 1171 tBleStatus aci_gap_resolve_private_address_IDB04A1(const tBDAddr address)
Wolfgang Betz 132:51056160fa4a 1172 {
Wolfgang Betz 132:51056160fa4a 1173 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 1174 gap_resolve_private_address_cp cp;
Wolfgang Betz 132:51056160fa4a 1175 uint8_t status;
Wolfgang Betz 132:51056160fa4a 1176
Wolfgang Betz 132:51056160fa4a 1177 Osal_MemCpy(cp.address, address, 6);
Wolfgang Betz 132:51056160fa4a 1178
Wolfgang Betz 132:51056160fa4a 1179 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 1180 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 1181 rq.ocf = OCF_GAP_RESOLVE_PRIVATE_ADDRESS;
Wolfgang Betz 132:51056160fa4a 1182 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 1183 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 1184 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 1185 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 1186
Wolfgang Betz 132:51056160fa4a 1187 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 1188 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 1189
Wolfgang Betz 132:51056160fa4a 1190 return status;
Wolfgang Betz 132:51056160fa4a 1191 }
Wolfgang Betz 132:51056160fa4a 1192
Wolfgang Betz 132:51056160fa4a 1193 tBleStatus aci_gap_set_broadcast_mode(uint16_t adv_interv_min, uint16_t adv_interv_max, uint8_t adv_type,
Wolfgang Betz 132:51056160fa4a 1194 uint8_t own_addr_type, uint8_t adv_data_length, const uint8_t *adv_data, uint8_t num_whitelist_entries,
Wolfgang Betz 132:51056160fa4a 1195 const uint8_t *addr_array)
Wolfgang Betz 132:51056160fa4a 1196 {
Wolfgang Betz 132:51056160fa4a 1197 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 1198 gap_set_broadcast_mode_cp cp;
Wolfgang Betz 132:51056160fa4a 1199 uint8_t status;
Wolfgang Betz 132:51056160fa4a 1200 uint8_t indx = 0;
Wolfgang Betz 132:51056160fa4a 1201 uint8_t variable_size = 1 + adv_data_length + 1 + num_whitelist_entries*7;
Wolfgang Betz 132:51056160fa4a 1202
Wolfgang Betz 132:51056160fa4a 1203 if (variable_size > sizeof(cp.var_len_data) )
Wolfgang Betz 132:51056160fa4a 1204 return BLE_STATUS_INVALID_PARAMS;
Wolfgang Betz 132:51056160fa4a 1205
Wolfgang Betz 132:51056160fa4a 1206 cp.adv_interv_min = htobs(adv_interv_min);
Wolfgang Betz 132:51056160fa4a 1207 cp.adv_interv_max = htobs(adv_interv_max);
Wolfgang Betz 132:51056160fa4a 1208 cp.adv_type = adv_type;
Wolfgang Betz 132:51056160fa4a 1209 cp.own_addr_type = own_addr_type;
Wolfgang Betz 132:51056160fa4a 1210
Wolfgang Betz 132:51056160fa4a 1211 cp.var_len_data[indx] = adv_data_length;
Wolfgang Betz 132:51056160fa4a 1212 indx++;
Wolfgang Betz 132:51056160fa4a 1213 Osal_MemCpy(cp.var_len_data + indx, adv_data, adv_data_length);
Wolfgang Betz 132:51056160fa4a 1214 indx += adv_data_length;
Wolfgang Betz 132:51056160fa4a 1215 cp.var_len_data[indx] = num_whitelist_entries;
Wolfgang Betz 132:51056160fa4a 1216 indx ++;
Wolfgang Betz 132:51056160fa4a 1217 Osal_MemCpy(cp.var_len_data + indx, addr_array, num_whitelist_entries*7);
Wolfgang Betz 132:51056160fa4a 1218
Wolfgang Betz 132:51056160fa4a 1219 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 1220 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 1221 rq.ocf = OCF_GAP_SET_BROADCAST_MODE;
Wolfgang Betz 132:51056160fa4a 1222 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 1223 rq.clen = GAP_SET_BROADCAST_MODE_CP_SIZE + variable_size;
Wolfgang Betz 132:51056160fa4a 1224 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 1225 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 1226
Wolfgang Betz 132:51056160fa4a 1227 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 1228 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 1229
Wolfgang Betz 132:51056160fa4a 1230 return status;
Wolfgang Betz 132:51056160fa4a 1231 }
Wolfgang Betz 132:51056160fa4a 1232
Wolfgang Betz 132:51056160fa4a 1233 tBleStatus aci_gap_start_observation_procedure(uint16_t scan_interval, uint16_t scan_window, uint8_t scan_type,
Wolfgang Betz 132:51056160fa4a 1234 uint8_t own_address_type, uint8_t filter_duplicates)
Wolfgang Betz 132:51056160fa4a 1235 {
Wolfgang Betz 132:51056160fa4a 1236 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 1237 gap_start_observation_proc_cp cp;
Wolfgang Betz 132:51056160fa4a 1238 uint8_t status;
Wolfgang Betz 132:51056160fa4a 1239
Wolfgang Betz 132:51056160fa4a 1240 cp.scan_interval = scan_interval;
Wolfgang Betz 132:51056160fa4a 1241 cp.scan_window = scan_window;
Wolfgang Betz 132:51056160fa4a 1242 cp.scan_type = scan_type;
Wolfgang Betz 132:51056160fa4a 1243 cp.own_address_type = own_address_type;
Wolfgang Betz 132:51056160fa4a 1244 cp.filter_duplicates = filter_duplicates;
Wolfgang Betz 132:51056160fa4a 1245
Wolfgang Betz 132:51056160fa4a 1246 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 1247 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 1248 rq.ocf = OCF_GAP_START_OBSERVATION_PROC;
Wolfgang Betz 132:51056160fa4a 1249 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 1250 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 1251 rq.event = EVT_CMD_STATUS;
Wolfgang Betz 132:51056160fa4a 1252 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 1253 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 1254
Wolfgang Betz 132:51056160fa4a 1255 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 1256 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 1257
Wolfgang Betz 132:51056160fa4a 1258 return status;
Wolfgang Betz 132:51056160fa4a 1259 }
Wolfgang Betz 132:51056160fa4a 1260
Wolfgang Betz 132:51056160fa4a 1261 tBleStatus aci_gap_is_device_bonded(uint8_t peer_address_type, const tBDAddr peer_address)
Wolfgang Betz 132:51056160fa4a 1262 {
Wolfgang Betz 132:51056160fa4a 1263 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 1264 gap_is_device_bonded_cp cp;
Wolfgang Betz 132:51056160fa4a 1265 uint8_t status;
Wolfgang Betz 132:51056160fa4a 1266
Wolfgang Betz 132:51056160fa4a 1267 cp.peer_address_type = peer_address_type;
Wolfgang Betz 132:51056160fa4a 1268 Osal_MemCpy(cp.peer_address, peer_address, sizeof(cp.peer_address));
Wolfgang Betz 132:51056160fa4a 1269
Wolfgang Betz 132:51056160fa4a 1270 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 1271 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 1272 rq.ocf = OCF_GAP_IS_DEVICE_BONDED;
Wolfgang Betz 132:51056160fa4a 1273 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 1274 rq.clen = sizeof(cp);
Wolfgang Betz 132:51056160fa4a 1275 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 1276 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 1277
Wolfgang Betz 132:51056160fa4a 1278 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 1279 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 1280
Wolfgang Betz 132:51056160fa4a 1281 return status;
Wolfgang Betz 132:51056160fa4a 1282 }
Wolfgang Betz 132:51056160fa4a 1283
Wolfgang Betz 132:51056160fa4a 1284 tBleStatus aci_gap_get_bonded_devices(uint8_t *num_devices, uint8_t *device_list, uint8_t device_list_size)
Wolfgang Betz 132:51056160fa4a 1285 {
Wolfgang Betz 132:51056160fa4a 1286 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 1287 gap_get_bonded_devices_rp rp;
Wolfgang Betz 132:51056160fa4a 1288
Wolfgang Betz 132:51056160fa4a 1289 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 1290 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 1291 rq.ocf = OCF_GAP_GET_BONDED_DEVICES;
Wolfgang Betz 132:51056160fa4a 1292 rq.rparam = &rp;
Wolfgang Betz 132:51056160fa4a 1293 rq.rlen = sizeof(rp);
Wolfgang Betz 132:51056160fa4a 1294
Wolfgang Betz 132:51056160fa4a 1295 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 1296 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 1297
Wolfgang Betz 132:51056160fa4a 1298 if (rp.status) {
Wolfgang Betz 132:51056160fa4a 1299 return rp.status;
Wolfgang Betz 132:51056160fa4a 1300 }
Wolfgang Betz 132:51056160fa4a 1301
Wolfgang Betz 132:51056160fa4a 1302 *num_devices = rp.num_addr;
Andrea Palmieri 229:9981f62cdb1a 1303 if(device_list != NULL)
Andrea Palmieri 229:9981f62cdb1a 1304 Osal_MemCpy(device_list, rp.dev_list, MIN(device_list_size,rp.num_addr*7));
Wolfgang Betz 132:51056160fa4a 1305
Wolfgang Betz 132:51056160fa4a 1306 return 0;
Wolfgang Betz 132:51056160fa4a 1307 }