/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ #ifndef H_BLE_HS_ADV_ #define H_BLE_HS_ADV_ #include #include "host/ble_uuid.h" #ifdef __cplusplus extern "C" { #endif #define BLE_HS_ADV_MAX_SZ BLE_HCI_MAX_ADV_DATA_LEN /** Max field payload size (account for 2-byte header). */ #define BLE_HS_ADV_MAX_FIELD_SZ (BLE_HS_ADV_MAX_SZ - 2) struct ble_hs_adv_field { uint8_t length; uint8_t type; uint8_t value[0]; }; typedef int (* ble_hs_adv_parse_func_t) (const struct ble_hs_adv_field *, void *); struct ble_hs_adv_fields { /*** 0x01 - Flags. */ uint8_t flags; /*** 0x02,0x03 - 16-bit service class UUIDs. */ const ble_uuid16_t *uuids16; uint8_t num_uuids16; unsigned uuids16_is_complete:1; /*** 0x04,0x05 - 32-bit service class UUIDs. */ const ble_uuid32_t *uuids32; uint8_t num_uuids32; unsigned uuids32_is_complete:1; /*** 0x06,0x07 - 128-bit service class UUIDs. */ const ble_uuid128_t *uuids128; uint8_t num_uuids128; unsigned uuids128_is_complete:1; /*** 0x08,0x09 - Local name. */ const uint8_t *name; uint8_t name_len; unsigned name_is_complete:1; /*** 0x0a - Tx power level. */ int8_t tx_pwr_lvl; unsigned tx_pwr_lvl_is_present:1; /*** 0x0d - Slave connection interval range. */ const uint8_t *slave_itvl_range; /*** 0x16 - Service data - 16-bit UUID. */ const uint8_t *svc_data_uuid16; uint8_t svc_data_uuid16_len; /*** 0x17 - Public target address. */ const uint8_t *public_tgt_addr; uint8_t num_public_tgt_addrs; /*** 0x19 - Appearance. */ uint16_t appearance; unsigned appearance_is_present:1; /*** 0x1a - Advertising interval. */ uint16_t adv_itvl; unsigned adv_itvl_is_present:1; /*** 0x20 - Service data - 32-bit UUID. */ const uint8_t *svc_data_uuid32; uint8_t svc_data_uuid32_len; /*** 0x21 - Service data - 128-bit UUID. */ const uint8_t *svc_data_uuid128; uint8_t svc_data_uuid128_len; /*** 0x24 - URI. */ const uint8_t *uri; uint8_t uri_len; /*** 0xff - Manufacturer specific data. */ const uint8_t *mfg_data; uint8_t mfg_data_len; }; #define BLE_HS_ADV_TYPE_FLAGS 0x01 #define BLE_HS_ADV_TYPE_INCOMP_UUIDS16 0x02 #define BLE_HS_ADV_TYPE_COMP_UUIDS16 0x03 #define BLE_HS_ADV_TYPE_INCOMP_UUIDS32 0x04 #define BLE_HS_ADV_TYPE_COMP_UUIDS32 0x05 #define BLE_HS_ADV_TYPE_INCOMP_UUIDS128 0x06 #define BLE_HS_ADV_TYPE_COMP_UUIDS128 0x07 #define BLE_HS_ADV_TYPE_INCOMP_NAME 0x08 #define BLE_HS_ADV_TYPE_COMP_NAME 0x09 #define BLE_HS_ADV_TYPE_TX_PWR_LVL 0x0a #define BLE_HS_ADV_TYPE_SLAVE_ITVL_RANGE 0x12 #define BLE_HS_ADV_TYPE_SOL_UUIDS16 0x14 #define BLE_HS_ADV_TYPE_SOL_UUIDS128 0x15 #define BLE_HS_ADV_TYPE_SVC_DATA_UUID16 0x16 #define BLE_HS_ADV_TYPE_PUBLIC_TGT_ADDR 0x17 #define BLE_HS_ADV_TYPE_RANDOM_TGT_ADDR 0x18 #define BLE_HS_ADV_TYPE_APPEARANCE 0x19 #define BLE_HS_ADV_TYPE_ADV_ITVL 0x1a #define BLE_HS_ADV_TYPE_SVC_DATA_UUID32 0x20 #define BLE_HS_ADV_TYPE_SVC_DATA_UUID128 0x21 #define BLE_HS_ADV_TYPE_URI 0x24 #define BLE_HS_ADV_TYPE_MESH_PROV 0x29 #define BLE_HS_ADV_TYPE_MESH_MESSAGE 0x2a #define BLE_HS_ADV_TYPE_MESH_BEACON 0x2b #define BLE_HS_ADV_TYPE_MFG_DATA 0xff #define BLE_HS_ADV_FLAGS_LEN 1 #define BLE_HS_ADV_F_DISC_LTD 0x01 #define BLE_HS_ADV_F_DISC_GEN 0x02 #define BLE_HS_ADV_F_BREDR_UNSUP 0x04 #define BLE_HS_ADV_TX_PWR_LVL_LEN 1 /** * Set the tx_pwr_lvl field to this if you want the stack to fill in the tx * power level field. */ #define BLE_HS_ADV_TX_PWR_LVL_AUTO (-128) #define BLE_HS_ADV_SLAVE_ITVL_RANGE_LEN 4 #define BLE_HS_ADV_SVC_DATA_UUID16_MIN_LEN 2 #define BLE_HS_ADV_PUBLIC_TGT_ADDR_ENTRY_LEN 6 #define BLE_HS_ADV_APPEARANCE_LEN 2 #define BLE_HS_ADV_ADV_ITVL_LEN 2 #define BLE_HS_ADV_SVC_DATA_UUID32_MIN_LEN 4 #define BLE_HS_ADV_SVC_DATA_UUID128_MIN_LEN 16 int ble_hs_adv_set_fields_mbuf(const struct ble_hs_adv_fields *adv_fields, struct os_mbuf *om); int ble_hs_adv_set_fields(const struct ble_hs_adv_fields *adv_fields, uint8_t *dst, uint8_t *dst_len, uint8_t max_len); int ble_hs_adv_parse_fields(struct ble_hs_adv_fields *adv_fields, const uint8_t *src, uint8_t src_len); int ble_hs_adv_parse(const uint8_t *data, uint8_t length, ble_hs_adv_parse_func_t func, void *user_data); #ifdef __cplusplus } #endif #endif