blob: d3576c5950a2e4c92762206c0c8d24642124a368 [file] [log] [blame]
/*
* 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_UUID_
#define H_BLE_UUID_
/**
* @brief Bluetooth UUID
* @defgroup bt_uuid Bluetooth UUID
* @ingroup bt_host
* @{
*/
#include <inttypes.h>
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
struct os_mbuf;
/** Type of UUID */
enum {
/** 16-bit UUID (BT SIG assigned) */
BLE_UUID_TYPE_16 = 16,
/** 32-bit UUID (BT SIG assigned) */
BLE_UUID_TYPE_32 = 32,
/** 128-bit UUID */
BLE_UUID_TYPE_128 = 128,
};
/** Generic UUID type, to be used only as a pointer */
typedef struct {
/** Type of the UUID */
uint8_t type;
} ble_uuid_t;
/** 16-bit UUID */
typedef struct {
ble_uuid_t u;
uint16_t value;
} ble_uuid16_t;
/** 32-bit UUID */
typedef struct {
ble_uuid_t u;
uint32_t value;
} ble_uuid32_t;
/** 128-bit UUID */
typedef struct {
ble_uuid_t u;
uint8_t value[16];
} ble_uuid128_t;
/** Universal UUID type, to be used for any-UUID static allocation */
typedef union {
ble_uuid_t u;
ble_uuid16_t u16;
ble_uuid32_t u32;
ble_uuid128_t u128;
} ble_uuid_any_t;
#define BLE_UUID16_INIT(uuid16) \
{ \
.u.type = BLE_UUID_TYPE_16, \
.value = (uuid16), \
}
#define BLE_UUID32_INIT(uuid32) \
{ \
.u.type = BLE_UUID_TYPE_32, \
.value = (uuid32), \
}
#define BLE_UUID128_INIT(uuid128...) \
{ \
.u.type = BLE_UUID_TYPE_128, \
.value = { uuid128 }, \
}
#define BLE_UUID16_DECLARE(uuid16) \
((ble_uuid_t *) (&(ble_uuid16_t) BLE_UUID16_INIT(uuid16)))
#define BLE_UUID32_DECLARE(uuid32) \
((ble_uuid_t *) (&(ble_uuid32_t) BLE_UUID32_INIT(uuid32)))
#define BLE_UUID128_DECLARE(uuid128...) \
((ble_uuid_t *) (&(ble_uuid128_t) BLE_UUID128_INIT(uuid128)))
#define BLE_UUID16(u) \
((ble_uuid16_t *) (u))
#define BLE_UUID32(u) \
((ble_uuid32_t *) (u))
#define BLE_UUID128(u) \
((ble_uuid128_t *) (u))
/** Size of buffer needed to store UUID as a string.
* Includes trailing \0.
*/
#define BLE_UUID_STR_LEN (37)
/** @brief Constructs a UUID object from a byte array.
*
* @param uuid On success, this gets populated with the constructed UUID.
* @param buf The source buffer to parse.
* @param len The size of the buffer, in bytes.
*
* @return 0 on success, BLE_HS_EINVAL if the source buffer does not contain
* a valid UUID.
*/
int ble_uuid_init_from_buf(ble_uuid_any_t *uuid, const void *buf, size_t len);
/** @brief Compares two Bluetooth UUIDs.
*
* @param uuid1 The first UUID to compare.
* @param uuid2 The second UUID to compare.
*
* @return 0 if the two UUIDs are equal, nonzero if the UUIDs differ.
*/
int ble_uuid_cmp(const ble_uuid_t *uuid1, const ble_uuid_t *uuid2);
/** @brief Copy Bluetooth UUID
*
* @param dst Destination UUID.
* @param src Source UUID.
*/
void ble_uuid_copy(ble_uuid_any_t *dst, const ble_uuid_t *src);
/** @brief Converts the specified UUID to its string representation.
*
* Example string representations:
* o 16-bit: 0x1234
* o 32-bit: 0x12345678
* o 128-bit: 12345678-1234-1234-1234-123456789abc
*
* @param uuid The source UUID to convert.
* @param dst The destination buffer.
*
* @return A pointer to the supplied destination buffer.
*/
char *ble_uuid_to_str(const ble_uuid_t *uuid, char *dst);
/** @brief Converts the specified 16-bit UUID to a uint16_t.
*
* @param uuid The source UUID to convert.
*
* @return The converted integer on success, NULL if the specified UUID is
* not 16 bits.
*/
uint16_t ble_uuid_u16(const ble_uuid_t *uuid);
#ifdef __cplusplus
}
#endif
/**
* @}
*/
#endif /* _BLE_HOST_UUID_H */