Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
source/bluenrg-hci/hci/controller/bluenrg_gap_aci.c@229:9981f62cdb1a, 2016-05-16 (annotated)
- 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?
User | Revision | Line number | New 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 | } |