From 81ff7ff65a8c64f75a3e84ab13a02c524aa3fa47 Mon Sep 17 00:00:00 2001 From: Hauke Petersen Date: Mon, 25 Mar 2019 18:53:51 +0100 Subject: [PATCH] ble/bluetil: add ble address helper submodule --- Makefile.dep | 4 + sys/include/net/bluetil/addr.h | 81 +++++++++++++++++++ sys/net/ble/bluetil/bluetil_addr/Makefile | 1 + .../ble/bluetil/bluetil_addr/bluetil_addr.c | 80 ++++++++++++++++++ 4 files changed, 166 insertions(+) create mode 100644 sys/include/net/bluetil/addr.h create mode 100644 sys/net/ble/bluetil/bluetil_addr/Makefile create mode 100644 sys/net/ble/bluetil/bluetil_addr/bluetil_addr.c diff --git a/Makefile.dep b/Makefile.dep index 5e5872a9e7..a0e6ff9229 100644 --- a/Makefile.dep +++ b/Makefile.dep @@ -781,6 +781,10 @@ ifneq (,$(filter skald,$(USEMODULE))) USEMODULE += random endif +ifneq (,$(filter bluetil_addr,$(USEMODULE))) + USEMODULE += fmt +endif + ifneq (,$(filter cord_epsim_standalone,$(USEMODULE))) USEMODULE += cord_epsim USEMODULE += xtimer diff --git a/sys/include/net/bluetil/addr.h b/sys/include/net/bluetil/addr.h new file mode 100644 index 0000000000..f69907bc63 --- /dev/null +++ b/sys/include/net/bluetil/addr.h @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2019 Freie Universität Berlin + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @defgroup ble_bluetil_addr BLE Address Helper + * @ingroup ble_bluetil + * @brief Generic BLE address handling functions + * @{ + * + * @file + * @brief Interface for the generic BLE address helper functions + * + * @author Hauke Petersen + */ + +#ifndef NET_BLUETIL_ADDR_H +#define NET_BLUETIL_ADDR_H + +#include + +#include "net/ble.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief The length of a BLE address string in bytes (including '\0') + */ +#define BLUETIL_ADDR_STRLEN (18U) + +/** + * @brief The length of an IPv6 IID string in bytes (including '\0') + */ +#define BLUETIL_IPV6_IID_STRLEN (28U) + +/** + * @brief Convert the given BLE address to a human readable string + * + * @param[out] out '\0' terminated address string, *must* be able to hold + * BLUETIL_ADDR_STRLEN bytes + * @param[in] addr address buffer, *must* hold BLE_ADDR_LEN bytes + */ +void bluetil_addr_sprint(char *out, const uint8_t *addr); + +/** + * @brief Print the given BLE address to STDOUT + * + * @param[in] addr address to print, is expected to hold BLE_ADDR_LEN bytes + */ +void bluetil_addr_print(const uint8_t *addr); + +/** + * @brief Get a string representation of the given BLE addresses IID-based + * link local address + * + * @param[out] out '\0' terminated string, *must* be able to hold + * BLUETIL_IPV6_IID_STRLEN bytes + * @param[in] addr address to convert, , *must* hold BLE_ADDR_LEN bytes + */ +void bluetil_addr_ipv6_l2ll_sprint(char *out, const uint8_t *addr); + +/** + * @brief Dump the given BLE addresses IPv6 IID-based link local address to + * STDIO + * + * @param[in] addr generate IID for this address + */ +void bluetil_addr_ipv6_l2ll_print(const uint8_t *addr); + +#ifdef __cplusplus +} +#endif + +#endif /* NET_BLUETIL_ADDR_H */ +/** @} */ diff --git a/sys/net/ble/bluetil/bluetil_addr/Makefile b/sys/net/ble/bluetil/bluetil_addr/Makefile new file mode 100644 index 0000000000..48422e909a --- /dev/null +++ b/sys/net/ble/bluetil/bluetil_addr/Makefile @@ -0,0 +1 @@ +include $(RIOTBASE)/Makefile.base diff --git a/sys/net/ble/bluetil/bluetil_addr/bluetil_addr.c b/sys/net/ble/bluetil/bluetil_addr/bluetil_addr.c new file mode 100644 index 0000000000..910f4121e0 --- /dev/null +++ b/sys/net/ble/bluetil/bluetil_addr/bluetil_addr.c @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2019 Freie Universität Berlin + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup ble_bluetil_addr + * @{ + * + * @file + * @brief Implementation of generic BLE address helper functions + * + * @author Hauke Petersen + * + * @} + */ + +#include +#include + +#include "fmt.h" +#include "assert.h" +#include "net/eui48.h" +#include "net/bluetil/addr.h" + +void bluetil_addr_sprint(char *out, const uint8_t *addr) +{ + assert(out); + assert(addr); + + fmt_byte_hex(out, addr[5]); + for (int i = 4; i >= 0; i--) { + out += 2; + *out++ = ':'; + fmt_byte_hex(out, addr[i]); + } + out += 2; + *out = '\0'; +} + +void bluetil_addr_print(const uint8_t *addr) +{ + assert(addr); + + char str[BLUETIL_ADDR_STRLEN]; + bluetil_addr_sprint(str, addr); + printf("%s", str); +} + +void bluetil_addr_ipv6_l2ll_sprint(char *out, const uint8_t *addr) +{ + assert(out); + assert(addr); + + eui64_t iid; + eui48_to_ipv6_iid(&iid, (const eui48_t *)addr); + memcpy(out, "[FE80::", 6); + out += 6; + for (unsigned i = 0; i < 4; i++) { + *out++ = ':'; + fmt_byte_hex(out, iid.uint8[i * 2]); + out += 2; + fmt_byte_hex(out, iid.uint8[(i * 2) + 1]); + out += 2; + } + *out++ = ']'; + *out = '\0'; +} + +void bluetil_addr_ipv6_l2ll_print(const uint8_t *addr) +{ + assert(addr); + + char tmp[BLUETIL_IPV6_IID_STRLEN]; + bluetil_addr_ipv6_l2ll_sprint(tmp, addr); + printf("%s", tmp); +}