nimble/host: Cleanup handling UUIDs in ATT

This patch adds private APIs to initialize UUIDs which should be used
in ATT code - they guarantee that only 16-bit and 128-bit UUIDs are
valid since public API function also allows 32-bit UUID which are not
allowed in ATT.
This commit is contained in:
Andrzej Kaczmarek
2018-10-19 17:52:12 +02:00
parent 5bdae413d4
commit d4871fe9a1
6 changed files with 49 additions and 24 deletions
+2 -2
View File
@@ -207,14 +207,14 @@ ble_att_clt_parse_find_info_entry(struct os_mbuf **rxom, uint8_t rsp_format,
switch (rsp_format) {
case BLE_ATT_FIND_INFO_RSP_FORMAT_16BIT:
rc = ble_uuid_init_from_mbuf(&idata->uuid, *rxom, 2, 2);
rc = ble_uuid_init_from_att_mbuf(&idata->uuid, *rxom, 2, 2);
if (rc != 0) {
return BLE_HS_EBADDATA;
}
break;
case BLE_ATT_FIND_INFO_RSP_FORMAT_128BIT:
rc = ble_uuid_init_from_mbuf(&idata->uuid, *rxom, 2, 16);
rc = ble_uuid_init_from_att_mbuf(&idata->uuid, *rxom, 2, 16);
if (rc != 0) {
return BLE_HS_EBADDATA;
}
+3 -4
View File
@@ -1432,8 +1432,8 @@ ble_att_svr_rx_read_type(uint16_t conn_handle, struct os_mbuf **rxom)
goto done;
}
rc = ble_uuid_init_from_mbuf(&uuid, *rxom, sizeof(*req),
pktlen - sizeof(*req));
rc = ble_uuid_init_from_att_mbuf(&uuid, *rxom, sizeof(*req),
pktlen - sizeof(*req));
if (rc != 0) {
att_err = BLE_ATT_ERR_INVALID_PDU;
rc = BLE_HS_EMSGSIZE;
@@ -1930,8 +1930,7 @@ ble_att_svr_rx_read_group_type(uint16_t conn_handle, struct os_mbuf **rxom)
}
om_uuid_len = OS_MBUF_PKTHDR(*rxom)->omp_len - sizeof(*req);
rc = ble_uuid_init_from_mbuf(&uuid, *rxom, sizeof(*req),
om_uuid_len);
rc = ble_uuid_init_from_att_mbuf(&uuid, *rxom, sizeof(*req), om_uuid_len);
if (rc != 0) {
att_err = BLE_ATT_ERR_INVALID_PDU;
err_handle = start_handle;
+14 -10
View File
@@ -1441,7 +1441,8 @@ ble_gattc_disc_all_svcs_rx_adata(struct ble_gattc_proc *proc,
switch (adata->value_len) {
case 2:
case 16:
rc = ble_uuid_init_from_buf(&service.uuid, adata->value, adata->value_len);
rc = ble_uuid_init_from_att_buf(&service.uuid, adata->value,
adata->value_len);
if (rc != 0) {
rc = BLE_HS_EBADDATA;
goto done;
@@ -1887,7 +1888,7 @@ ble_gattc_find_inc_svcs_rx_read_rsp(struct ble_gattc_proc *proc, int status,
ble_gattc_dbg_assert_proc_not_inserted(proc);
rc = ble_uuid_init_from_mbuf(&service.uuid, *om, 0, 16);
rc = ble_uuid_init_from_att_mbuf(&service.uuid, *om, 0, 16);
os_mbuf_free_chain(*om);
*om = NULL;
@@ -1964,6 +1965,8 @@ ble_gattc_find_inc_svcs_rx_adata(struct ble_gattc_proc *proc,
proc->find_inc_svcs.prev_handle = adata->att_handle;
rc = 0;
switch (adata->value_len) {
case BLE_GATTS_INC_SVC_LEN_NO_UUID:
proc->find_inc_svcs.cur_start = get_le16(adata->value + 0);
@@ -1974,16 +1977,17 @@ ble_gattc_find_inc_svcs_rx_adata(struct ble_gattc_proc *proc,
case BLE_GATTS_INC_SVC_LEN_UUID:
service.start_handle = get_le16(adata->value + 0);
service.end_handle = get_le16(adata->value + 2);
ble_uuid_init_from_buf(&service.uuid, adata->value + 4, 2);
rc = ble_uuid_init_from_att_buf(&service.uuid, adata->value + 4, 2);
if (rc != 0) {
rc = BLE_HS_EBADDATA;
}
break;
default:
rc = BLE_HS_EBADDATA;
goto done;
break;
}
rc = 0;
done:
if (call_cb) {
cbrc = ble_gattc_find_inc_svcs_cb(proc, 0, 0, &service);
@@ -2195,8 +2199,8 @@ ble_gattc_disc_all_chrs_rx_adata(struct ble_gattc_proc *proc,
switch (adata->value_len) {
case BLE_GATT_CHR_DECL_SZ_16:
case BLE_GATT_CHR_DECL_SZ_128:
rc = ble_uuid_init_from_buf(&chr.uuid, adata->value + 3,
adata->value_len - 3);
rc = ble_uuid_init_from_att_buf(&chr.uuid, adata->value + 3,
adata->value_len - 3);
if (rc != 0) {
rc = BLE_HS_EBADDATA;
goto done;
@@ -2423,8 +2427,8 @@ ble_gattc_disc_chr_uuid_rx_adata(struct ble_gattc_proc *proc,
switch (adata->value_len) {
case BLE_GATT_CHR_DECL_SZ_16:
case BLE_GATT_CHR_DECL_SZ_128:
rc = ble_uuid_init_from_buf(&chr.uuid, adata->value + 3,
adata->value_len - 3);
rc = ble_uuid_init_from_att_buf(&chr.uuid, adata->value + 3,
adata->value_len - 3);
if (rc != 0) {
rc = BLE_HS_EBADDATA;
goto done;
+21 -3
View File
@@ -155,8 +155,8 @@ ble_uuid_u16(const ble_uuid_t *uuid)
/* APIs below are private (ble_uuid_priv.h) */
int
ble_uuid_init_from_mbuf(ble_uuid_any_t *uuid, struct os_mbuf *om, int off,
int len)
ble_uuid_init_from_att_mbuf(ble_uuid_any_t *uuid, struct os_mbuf *om, int off,
int len)
{
uint8_t val[16];
int rc;
@@ -166,7 +166,25 @@ ble_uuid_init_from_mbuf(ble_uuid_any_t *uuid, struct os_mbuf *om, int off,
return rc;
}
rc = ble_uuid_init_from_buf(uuid, val, len);
rc = ble_uuid_init_from_att_buf(uuid, val, len);
return rc;
}
int
ble_uuid_init_from_att_buf(ble_uuid_any_t *uuid, const void *buf, size_t len)
{
int rc = 0;
if (len == 2) {
uuid->u.type = BLE_UUID_TYPE_16;
uuid->u16.value = get_le16(buf);
} else if (len == 16) {
uuid->u.type = BLE_UUID_TYPE_128;
memcpy(uuid->u128.value, buf, 16);
} else {
rc = BLE_HS_EINVAL;
}
return rc;
}
+5 -1
View File
@@ -28,7 +28,11 @@ extern "C" {
struct os_mbuf;
int ble_uuid_init_from_mbuf(ble_uuid_any_t *uuid, struct os_mbuf *om, int off, int len);
int ble_uuid_init_from_att_mbuf(ble_uuid_any_t *uuid, struct os_mbuf *om,
int off, int len);
int ble_uuid_init_from_att_buf(ble_uuid_any_t *uuid, const void *buf,
size_t len);
int ble_uuid_to_any(const ble_uuid_t *uuid, ble_uuid_any_t *uuid_any);
int ble_uuid_to_mbuf(const ble_uuid_t *uuid, struct os_mbuf *om);
int ble_uuid_flat(const ble_uuid_t *uuid, void *dst);
+4 -4
View File
@@ -1269,14 +1269,14 @@ ble_hs_test_util_verify_tx_find_info_rsp(
TEST_ASSERT(rsp.bafp_format ==
BLE_ATT_FIND_INFO_RSP_FORMAT_16BIT);
ble_uuid_init_from_mbuf(&uuid, om, off, 2);
ble_uuid_init_from_att_mbuf(&uuid, om, off, 2);
TEST_ASSERT(rc == 0);
off += 2;
} else {
TEST_ASSERT(rsp.bafp_format ==
BLE_ATT_FIND_INFO_RSP_FORMAT_128BIT);
rc = ble_uuid_init_from_mbuf(&uuid, om, off, 16);
rc = ble_uuid_init_from_att_mbuf(&uuid, om, off, 16);
TEST_ASSERT(rc == 0);
off += 16;
}
@@ -1328,10 +1328,10 @@ ble_hs_test_util_verify_tx_read_group_type_rsp(
off += 2;
if (entry->uuid->type == BLE_UUID_TYPE_16) {
rc = ble_uuid_init_from_mbuf(&uuid, om, off, 2);
rc = ble_uuid_init_from_att_mbuf(&uuid, om, off, 2);
TEST_ASSERT(rc == 0);
} else {
rc = ble_uuid_init_from_mbuf(&uuid, om, off, 16);
rc = ble_uuid_init_from_att_mbuf(&uuid, om, off, 16);
TEST_ASSERT(rc == 0);
}