1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, 13 * software distributed under the License is distributed on an 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 * KIND, either express or implied. See the License for the 16 * specific language governing permissions and limitations 17 * under the License. 18 */ 19 20 #ifndef H_BLE_ATT_CMD_ 21 #define H_BLE_ATT_CMD_ 22 23 #include <inttypes.h> 24 #include <stddef.h> 25 #include "os/os_mbuf.h" 26 27 #ifdef __cplusplus 28 extern "C" { 29 #endif 30 31 struct ble_att_hdr { 32 uint8_t opcode; 33 uint8_t data[0]; 34 } __attribute__((packed)); 35 36 /** 37 * | Parameter | Size (octets) | 38 * +------------------------------------+-------------------+ 39 * | Attribute Opcode | 1 | 40 * | Request Opcode In Error | 1 | 41 * | Attribute Handle In Error | 2 | 42 * | Error Code | 1 | 43 */ 44 #define BLE_ATT_ERROR_RSP_SZ 5 45 struct ble_att_error_rsp { 46 uint8_t baep_req_op; 47 uint16_t baep_handle; 48 uint8_t baep_error_code; 49 } __attribute__((packed)); 50 51 /** 52 * | Parameter | Size (octets) | 53 * +------------------------------------+-------------------+ 54 * | Attribute Opcode | 1 | 55 * | Server Rx MTU | 2 | 56 */ 57 #define BLE_ATT_MTU_CMD_SZ 3 58 struct ble_att_mtu_cmd { 59 uint16_t bamc_mtu; 60 } __attribute__((packed)); 61 62 /** 63 * | Parameter | Size (octets) | 64 * +------------------------------------+-------------------+ 65 * | Attribute Opcode | 1 | 66 * | Starting Handle | 2 | 67 * | Ending Handle | 2 | 68 */ 69 #define BLE_ATT_FIND_INFO_REQ_SZ 5 70 struct ble_att_find_info_req { 71 uint16_t bafq_start_handle; 72 uint16_t bafq_end_handle; 73 } __attribute__((packed)); 74 75 /** 76 * | Parameter | Size (octets) | 77 * +------------------------------------+-------------------+ 78 * | Attribute Opcode | 1 | 79 * | Format | 1 | 80 * | Information Data | 4 to (ATT_MTU-2) | 81 */ 82 #define BLE_ATT_FIND_INFO_RSP_BASE_SZ 2 83 struct ble_att_find_info_rsp { 84 uint8_t bafp_format; 85 /* Followed by information data. */ 86 } __attribute__((packed)); 87 88 #define BLE_ATT_FIND_INFO_RSP_FORMAT_16BIT 1 89 #define BLE_ATT_FIND_INFO_RSP_FORMAT_128BIT 2 90 91 #define BLE_ATT_FIND_INFO_IDATA_16_SZ 4 92 #define BLE_ATT_FIND_INFO_IDATA_128_SZ 18 93 94 /** 95 * | Parameter | Size (octets) | 96 * +------------------------------------+-------------------+ 97 * | Attribute Opcode | 1 | 98 * | Starting Handle | 2 | 99 * | Ending Handle | 2 | 100 * | Attribute Type | 2 | 101 * | Attribute Value | 0 to (ATT_MTU-7) | 102 */ 103 #define BLE_ATT_FIND_TYPE_VALUE_REQ_BASE_SZ 7 104 struct ble_att_find_type_value_req { 105 uint16_t bavq_start_handle; 106 uint16_t bavq_end_handle; 107 uint16_t bavq_attr_type; 108 uint16_t bavq_value[0]; 109 } __attribute__((packed)); 110 111 /** 112 * | Parameter | Size (octets) | 113 * +------------------------------------+-------------------+ 114 * | Attribute Opcode | 1 | 115 * | Information Data | 4 to (ATT_MTU-1) | 116 */ 117 #define BLE_ATT_FIND_TYPE_VALUE_RSP_BASE_SZ 1 118 #define BLE_ATT_FIND_TYPE_VALUE_HINFO_BASE_SZ 4 119 120 struct ble_att_handle_group { 121 uint16_t attr_handle; 122 uint16_t group_end_handle; 123 } __attribute__((packed)); 124 125 struct ble_att_find_type_value_rsp { 126 struct ble_att_handle_group list[0]; 127 } __attribute__((packed)); 128 129 /** 130 * | Parameter | Size (octets) | 131 * +------------------------------------+-------------------+ 132 * | Attribute Opcode | 1 | 133 * | Starting Handle | 2 | 134 * | Ending Handle | 2 | 135 * | Attribute Type | 2 or 16 | 136 */ 137 #define BLE_ATT_READ_TYPE_REQ_BASE_SZ 5 138 #define BLE_ATT_READ_TYPE_REQ_SZ_16 7 139 #define BLE_ATT_READ_TYPE_REQ_SZ_128 21 140 struct ble_att_read_type_req { 141 uint16_t batq_start_handle; 142 uint16_t batq_end_handle; 143 uint8_t uuid[0]; 144 } __attribute__((packed)); 145 146 /** 147 * | Parameter | Size (octets) | 148 * +------------------------------------+-------------------+ 149 * | Attribute Opcode | 1 | 150 * | Length | 1 | 151 * | Attribute Data List | 2 to (ATT_MTU-2) | 152 */ 153 #define BLE_ATT_READ_TYPE_RSP_BASE_SZ 2 154 155 struct ble_att_attr_data_list { 156 uint16_t handle; 157 uint8_t value[0]; 158 } __attribute__((packed)); 159 160 struct ble_att_read_type_rsp { 161 uint8_t batp_length; 162 struct ble_att_attr_data_list batp_list[0]; 163 } __attribute__((packed)); 164 165 #define BLE_ATT_READ_TYPE_ADATA_BASE_SZ 2 166 #define BLE_ATT_READ_TYPE_ADATA_SZ_16 6 167 #define BLE_ATT_READ_TYPE_ADATA_SZ_128 20 168 169 /** 170 * | Parameter | Size (octets) | 171 * +------------------------------------+-------------------+ 172 * | Attribute Opcode | 1 | 173 * | Attribute Handle | 2 | 174 */ 175 #define BLE_ATT_READ_REQ_SZ 3 176 struct ble_att_read_req { 177 uint16_t barq_handle; 178 } __attribute__((packed)); 179 180 /** 181 * | Parameter | Size (octets) | 182 * +------------------------------------+-------------------+ 183 * | Attribute Opcode | 1 | 184 * | Attribute Value | 0 to (ATT_MTU-1) | 185 */ 186 #define BLE_ATT_READ_RSP_BASE_SZ 1 187 188 /** 189 * | Parameter | Size (octets) | 190 * +------------------------------------+-------------------+ 191 * | Attribute Opcode | 1 | 192 * | Attribute Handle | 2 | 193 * | Value Offset | 2 | 194 */ 195 #define BLE_ATT_READ_BLOB_REQ_SZ 5 196 struct ble_att_read_blob_req { 197 uint16_t babq_handle; 198 uint16_t babq_offset; 199 } __attribute__((packed)); 200 201 /** 202 * | Parameter | Size (octets) | 203 * +------------------------------------+-------------------+ 204 * | Attribute Opcode | 1 | 205 * | Attribute Value | 0 to (ATT_MTU-1) | 206 */ 207 #define BLE_ATT_READ_BLOB_RSP_BASE_SZ 1 208 209 /** 210 * | Parameter | Size (octets) | 211 * +------------------------------------+-------------------+ 212 * | Attribute Opcode | 1 | 213 * | Set Of Handles | 4 to (ATT_MTU-1) | 214 */ 215 #define BLE_ATT_READ_MULT_REQ_BASE_SZ 1 216 struct ble_att_read_mult_req { 217 uint16_t handles[0]; 218 } __attribute__((packed)); 219 220 /** 221 * | Parameter | Size (octets) | 222 * +------------------------------------+-------------------+ 223 * | Attribute Opcode | 1 | 224 * | Set Of Values | 4 to (ATT_MTU-1) | 225 */ 226 #define BLE_ATT_READ_MULT_RSP_BASE_SZ 1 227 228 /** 229 * | Parameter | Size (octets) | 230 * +------------------------------------+-------------------+ 231 * | Attribute Opcode | 1 | 232 * | Starting Handle | 2 | 233 * | Ending Handle | 2 | 234 * | Attribute Group Type | 2 or 16 | 235 */ 236 #define BLE_ATT_READ_GROUP_TYPE_REQ_BASE_SZ 5 237 #define BLE_ATT_READ_GROUP_TYPE_REQ_SZ_16 7 238 #define BLE_ATT_READ_GROUP_TYPE_REQ_SZ_128 21 239 struct ble_att_read_group_type_req { 240 uint16_t bagq_start_handle; 241 uint16_t bagq_end_handle; 242 uint8_t uuid[0]; 243 } __attribute__((packed)); 244 245 /** 246 * | Parameter | Size (octets) | 247 * +------------------------------------+-------------------+ 248 * | Attribute Opcode | 1 | 249 * | Length | 1 | 250 * | Attribute Data List | 2 to (ATT_MTU-2) | 251 */ 252 #define BLE_ATT_READ_GROUP_TYPE_RSP_BASE_SZ 2 253 struct ble_att_read_group_type_rsp { 254 uint8_t bagp_length; 255 } __attribute__((packed)); 256 257 #define BLE_ATT_READ_GROUP_TYPE_ADATA_BASE_SZ 4 258 #define BLE_ATT_READ_GROUP_TYPE_ADATA_SZ_16 6 259 #define BLE_ATT_READ_GROUP_TYPE_ADATA_SZ_128 20 260 261 /** 262 * | Parameter | Size (octets) | 263 * +------------------------------------+-------------------+ 264 * | Attribute Opcode | 1 | 265 * | Attribute Handle | 2 | 266 * | Attribute Value | 0 to (ATT_MTU-3) | 267 */ 268 #define BLE_ATT_WRITE_REQ_BASE_SZ 3 269 struct ble_att_write_req { 270 uint16_t bawq_handle; 271 uint8_t value[0]; 272 } __attribute__((packed)); 273 274 #define BLE_ATT_WRITE_RSP_SZ 1 275 276 /** 277 * | Parameter | Size (octets) | 278 * +------------------------------------+-------------------+ 279 * | Attribute Opcode | 1 | 280 * | Attribute Handle | 2 | 281 * | Value Offset | 2 | 282 * | Part Attribute Value | 0 to (ATT_MTU-5) | 283 */ 284 #define BLE_ATT_PREP_WRITE_CMD_BASE_SZ 5 285 struct ble_att_prep_write_cmd { 286 uint16_t bapc_handle; 287 uint16_t bapc_offset; 288 uint16_t bapc_value[0]; 289 } __attribute__((packed)); 290 291 /** 292 * | Parameter | Size (octets) | 293 * +------------------------------------+-------------------+ 294 * | Attribute Opcode | 1 | 295 * | Flags | 1 | 296 */ 297 #define BLE_ATT_EXEC_WRITE_REQ_SZ 2 298 struct ble_att_exec_write_req { 299 uint8_t baeq_flags; 300 } __attribute__((packed)); 301 302 #define BLE_ATT_EXEC_WRITE_F_CANCEL 0x00 303 #define BLE_ATT_EXEC_WRITE_F_EXECUTE 0x01 304 305 /** 306 * | Parameter | Size (octets) | 307 * +------------------------------------+-------------------+ 308 * | Attribute Opcode | 1 | 309 */ 310 #define BLE_ATT_EXEC_WRITE_RSP_SZ 1 311 312 /** 313 * | Parameter | Size (octets) | 314 * +------------------------------------+-------------------+ 315 * | Attribute Opcode | 1 | 316 * | Attribute Handle | 2 | 317 * | Attribute Value | 0 to (ATT_MTU-3) | 318 */ 319 #define BLE_ATT_NOTIFY_REQ_BASE_SZ 3 320 struct ble_att_notify_req { 321 uint16_t banq_handle; 322 } __attribute__((packed)); 323 324 /** 325 * | Parameter | Size (octets) | 326 * +------------------------------------+-------------------+ 327 * | Attribute Opcode | 1 | 328 * | Attribute Handle | 2 | 329 * | Attribute Value | 0 to (ATT_MTU-3) | 330 */ 331 #define BLE_ATT_INDICATE_REQ_BASE_SZ 3 332 struct ble_att_indicate_req { 333 uint16_t baiq_handle; 334 } __attribute__((packed)); 335 336 /** 337 * | Parameter | Size (octets) | 338 * +------------------------------------+-------------------+ 339 * | Attribute Opcode | 1 | 340 */ 341 #define BLE_ATT_INDICATE_RSP_SZ 1 342 343 /** 344 * | Parameter | Size (octets) | 345 * +------------------------------------+-------------------+ 346 * | Attribute Opcode | 1 | 347 * | Attribute Handle | 2 | 348 * | Attribute Value | 0 to (ATT_MTU-3) | 349 */ 350 #define BLE_ATT_WRITE_CMD_BASE_SZ 3 351 struct ble_att_write_cmd { 352 uint16_t handle; 353 uint8_t value[0]; 354 } __attribute__((packed)); 355 356 void ble_att_error_rsp_parse(const void *payload, int len, 357 struct ble_att_error_rsp *rsp); 358 void ble_att_error_rsp_write(void *payload, int len, 359 const struct ble_att_error_rsp *rsp); 360 void ble_att_error_rsp_log(const struct ble_att_error_rsp *cmd); 361 void ble_att_mtu_req_parse(const void *payload, int len, 362 struct ble_att_mtu_cmd *cmd); 363 void ble_att_mtu_req_write(void *payload, int len, 364 const struct ble_att_mtu_cmd *cmd); 365 void ble_att_mtu_rsp_parse(const void *payload, int len, 366 struct ble_att_mtu_cmd *cmd); 367 void ble_att_mtu_rsp_write(void *payload, int len, 368 const struct ble_att_mtu_cmd *cmd); 369 void ble_att_mtu_cmd_log(const struct ble_att_mtu_cmd *cmd); 370 void ble_att_find_info_req_parse(const void *payload, int len, 371 struct ble_att_find_info_req *req); 372 void ble_att_find_info_req_write(void *payload, int len, 373 const struct ble_att_find_info_req *req); 374 void ble_att_find_info_req_log(const struct ble_att_find_info_req *cmd); 375 void ble_att_find_info_rsp_parse(const void *payload, int len, 376 struct ble_att_find_info_rsp *rsp); 377 void ble_att_find_info_rsp_write(void *payload, int len, 378 const struct ble_att_find_info_rsp *rsp); 379 void ble_att_find_info_rsp_log(const struct ble_att_find_info_rsp *cmd); 380 void ble_att_find_type_value_req_parse( 381 const void *payload, int len, struct ble_att_find_type_value_req *req); 382 void ble_att_find_type_value_req_write( 383 void *payload, int len, const struct ble_att_find_type_value_req *req); 384 void ble_att_find_type_value_req_log( 385 const struct ble_att_find_type_value_req *cmd); 386 void ble_att_read_type_req_parse(const void *payload, int len, 387 struct ble_att_read_type_req *req); 388 void ble_att_read_type_req_write(void *payload, int len, 389 const struct ble_att_read_type_req *req); 390 void ble_att_read_type_req_log(const struct ble_att_read_type_req *cmd); 391 void ble_att_read_type_rsp_parse(const void *payload, int len, 392 struct ble_att_read_type_rsp *rsp); 393 void ble_att_read_type_rsp_write(void *payload, int len, 394 const struct ble_att_read_type_rsp *rsp); 395 void ble_att_read_type_rsp_log(const struct ble_att_read_type_rsp *cmd); 396 void ble_att_read_req_parse(const void *payload, int len, 397 struct ble_att_read_req *req); 398 void ble_att_read_req_write(void *payload, int len, 399 const struct ble_att_read_req *req); 400 void ble_att_read_req_log(const struct ble_att_read_req *cmd); 401 void ble_att_read_blob_req_parse(const void *payload, int len, 402 struct ble_att_read_blob_req *req); 403 void ble_att_read_blob_req_write(void *payload, int len, 404 const struct ble_att_read_blob_req *req); 405 void ble_att_read_blob_req_log(const struct ble_att_read_blob_req *cmd); 406 void ble_att_read_mult_req_parse(const void *payload, int len); 407 void ble_att_read_mult_req_write(void *payload, int len); 408 void ble_att_read_mult_rsp_parse(const void *payload, int len); 409 void ble_att_read_mult_rsp_write(void *payload, int len); 410 void ble_att_read_group_type_req_parse( 411 const void *payload, int len, struct ble_att_read_group_type_req *req); 412 void ble_att_read_group_type_req_write( 413 void *payload, int len, const struct ble_att_read_group_type_req *req); 414 void ble_att_read_group_type_req_log( 415 const struct ble_att_read_group_type_req *cmd); 416 void ble_att_read_group_type_rsp_parse( 417 const void *payload, int len, struct ble_att_read_group_type_rsp *rsp); 418 void ble_att_read_group_type_rsp_write( 419 void *payload, int len, const struct ble_att_read_group_type_rsp *rsp); 420 void ble_att_read_group_type_rsp_log( 421 const struct ble_att_read_group_type_rsp *cmd); 422 void ble_att_write_req_parse(const void *payload, int len, 423 struct ble_att_write_req *req); 424 void ble_att_write_req_write(void *payload, int len, 425 const struct ble_att_write_req *req); 426 void ble_att_write_cmd_parse(const void *payload, int len, 427 struct ble_att_write_req *req); 428 void ble_att_write_cmd_write(void *payload, int len, 429 const struct ble_att_write_req *req); 430 void ble_att_write_cmd_log(const struct ble_att_write_cmd *cmd); 431 void ble_att_write_req_log(const struct ble_att_write_req *req); 432 void ble_att_prep_write_req_parse(const void *payload, int len, 433 struct ble_att_prep_write_cmd *cmd); 434 void ble_att_prep_write_req_write(void *payload, int len, 435 const struct ble_att_prep_write_cmd *cmd); 436 void ble_att_prep_write_cmd_log(const struct ble_att_prep_write_cmd *cmd); 437 void ble_att_prep_write_rsp_parse(const void *payload, int len, 438 struct ble_att_prep_write_cmd *cmd); 439 void ble_att_prep_write_rsp_write(void *payload, int len, 440 const struct ble_att_prep_write_cmd *cmd); 441 void ble_att_exec_write_req_parse(const void *payload, int len, 442 struct ble_att_exec_write_req *req); 443 void ble_att_exec_write_req_log(const struct ble_att_exec_write_req *cmd); 444 void ble_att_exec_write_req_write(void *payload, int len, 445 const struct ble_att_exec_write_req *req); 446 void ble_att_exec_write_rsp_parse(const void *payload, int len); 447 void ble_att_exec_write_rsp_write(void *payload, int len); 448 void ble_att_notify_req_parse(const void *payload, int len, 449 struct ble_att_notify_req *req); 450 void ble_att_notify_req_write(void *payload, int len, 451 const struct ble_att_notify_req *req); 452 void ble_att_notify_req_log(const struct ble_att_notify_req *cmd); 453 void ble_att_indicate_req_parse(const void *payload, int len, 454 struct ble_att_indicate_req *req); 455 void ble_att_indicate_req_write(void *payload, int len, 456 const struct ble_att_indicate_req *req); 457 void ble_att_indicate_rsp_parse(const void *payload, int len); 458 void ble_att_indicate_rsp_write(void *payload, int len); 459 void ble_att_indicate_req_log(const struct ble_att_indicate_req *cmd); 460 461 void *ble_att_cmd_prepare(uint8_t opcode, size_t len, struct os_mbuf *txom); 462 void *ble_att_cmd_get(uint8_t opcode, size_t len, struct os_mbuf **txom); 463 int ble_att_tx(uint16_t conn_handle, struct os_mbuf *txom); 464 465 #ifdef __cplusplus 466 } 467 #endif 468 469 #endif 470