Repository: incubator-mynewt-core Updated Branches: refs/heads/develop c4023a2f8 -> 0fc206fb9
MYNEWT-564 BLE Host - Allow byte buf for adv data Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/0fc206fb Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/0fc206fb Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/0fc206fb Branch: refs/heads/develop Commit: 0fc206fb9d22dd7eb706b4ef0daeaf7f6823c494 Parents: c4023a2 Author: Christopher Collins <ccoll...@apache.org> Authored: Wed Jan 25 19:05:08 2017 -0800 Committer: Christopher Collins <ccoll...@apache.org> Committed: Wed Jan 25 19:05:08 2017 -0800 ---------------------------------------------------------------------- apps/blecent/src/misc.c | 4 +- apps/bleprph/src/main.c | 11 +- apps/bleprph_oic/src/main.c | 11 +- apps/blesplit/src/main.c | 11 +- apps/bletiny/src/cmd.c | 1 - apps/bletiny/src/main.c | 2 +- apps/bleuart/src/main.c | 11 +- apps/ocf_sample/src/ocf_ble.c | 11 +- net/nimble/host/include/host/ble_gap.h | 4 +- net/nimble/host/include/host/ble_hs_adv.h | 8 +- net/nimble/host/src/ble_gap.c | 249 +++++------- net/nimble/host/src/ble_gap_priv.h | 8 +- net/nimble/host/src/ble_hs_adv.c | 18 +- net/nimble/host/src/ble_hs_adv_priv.h | 2 - net/nimble/host/test/src/ble_gap_test.c | 55 +-- net/nimble/host/test/src/ble_hs_adv_test.c | 484 ++++++++++------------- net/nimble/host/test/src/ble_hs_conn_test.c | 2 +- net/nimble/host/test/src/ble_hs_test_util.c | 83 +++- net/nimble/host/test/src/ble_hs_test_util.h | 7 +- 19 files changed, 439 insertions(+), 543 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0fc206fb/apps/blecent/src/misc.c ---------------------------------------------------------------------- diff --git a/apps/blecent/src/misc.c b/apps/blecent/src/misc.c index 18f723b..81abcae 100644 --- a/apps/blecent/src/misc.c +++ b/apps/blecent/src/misc.c @@ -103,12 +103,12 @@ print_conn_desc(const struct ble_gap_conn_desc *desc) void print_adv_fields(const struct ble_hs_adv_fields *fields) { - char s[BLE_HCI_MAX_ADV_DATA_LEN]; + char s[BLE_HS_ADV_MAX_SZ]; const uint8_t *u8p; ble_uuid_any_t uuid; int i; - if (fields->flags_is_present) { + if (fields->flags != 0) { BLECENT_LOG(DEBUG, " flags=0x%02x\n", fields->flags); } http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0fc206fb/apps/bleprph/src/main.c ---------------------------------------------------------------------- diff --git a/apps/bleprph/src/main.c b/apps/bleprph/src/main.c index 0153d36..962a345 100755 --- a/apps/bleprph/src/main.c +++ b/apps/bleprph/src/main.c @@ -94,14 +94,15 @@ bleprph_advertise(void) memset(&fields, 0, sizeof fields); - /* Indicate that the flags field should be included; specify a value of 0 - * to instruct the stack to fill the value in for us. + /* Advertise two flags: + * o Discoverability in forthcoming advertisement (general) + * o BLE-only (BR/EDR unsupported). */ - fields.flags_is_present = 1; - fields.flags = 0; + fields.flags = BLE_HS_ADV_F_DISC_GEN | + BLE_HS_ADV_F_BREDR_UNSUP; /* Indicate that the TX power level field should be included; have the - * stack fill this one automatically as well. This is done by assiging the + * stack fill this value automatically. This is done by assiging the * special value BLE_HS_ADV_TX_PWR_LVL_AUTO. */ fields.tx_pwr_lvl_is_present = 1; http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0fc206fb/apps/bleprph_oic/src/main.c ---------------------------------------------------------------------- diff --git a/apps/bleprph_oic/src/main.c b/apps/bleprph_oic/src/main.c index 514584f..513c875 100755 --- a/apps/bleprph_oic/src/main.c +++ b/apps/bleprph_oic/src/main.c @@ -98,14 +98,15 @@ bleprph_advertise(void) memset(&fields, 0, sizeof fields); - /* Indicate that the flags field should be included; specify a value of 0 - * to instruct the stack to fill the value in for us. + /* Advertise two flags: + * o Discoverability in forthcoming advertisement (general) + * o BLE-only (BR/EDR unsupported). */ - fields.flags_is_present = 1; - fields.flags = 0; + fields.flags = BLE_HS_ADV_F_DISC_GEN | + BLE_HS_ADV_F_BREDR_UNSUP; /* Indicate that the TX power level field should be included; have the - * stack fill this one automatically as well. This is done by assiging the + * stack fill this value automatically. This is done by assiging the * special value BLE_HS_ADV_TX_PWR_LVL_AUTO. */ fields.tx_pwr_lvl_is_present = 1; http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0fc206fb/apps/blesplit/src/main.c ---------------------------------------------------------------------- diff --git a/apps/blesplit/src/main.c b/apps/blesplit/src/main.c index 92a7cb8..4643e1c 100755 --- a/apps/blesplit/src/main.c +++ b/apps/blesplit/src/main.c @@ -94,14 +94,15 @@ blesplit_advertise(void) memset(&fields, 0, sizeof fields); - /* Indicate that the flags field should be included; specify a value of 0 - * to instruct the stack to fill the value in for us. + /* Advertise two flags: + * o Discoverability in forthcoming advertisement (general) + * o BLE-only (BR/EDR unsupported). */ - fields.flags_is_present = 1; - fields.flags = 0; + fields.flags = BLE_HS_ADV_F_DISC_GEN | + BLE_HS_ADV_F_BREDR_UNSUP; /* Indicate that the TX power level field should be included; have the - * stack fill this one automatically as well. This is done by assiging the + * stack fill this value automatically. This is done by assiging the * special value BLE_HS_ADV_TX_PWR_LVL_AUTO. */ fields.tx_pwr_lvl_is_present = 1; http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0fc206fb/apps/bletiny/src/cmd.c ---------------------------------------------------------------------- diff --git a/apps/bletiny/src/cmd.c b/apps/bletiny/src/cmd.c index 533d163..13eae4d 100644 --- a/apps/bletiny/src/cmd.c +++ b/apps/bletiny/src/cmd.c @@ -1927,7 +1927,6 @@ cmd_set_adv_data(void) tmp = parse_arg_long_bounds("flags", 0, UINT8_MAX, &rc); if (rc == 0) { adv_fields.flags = tmp; - adv_fields.flags_is_present = 1; } else if (rc != ENOENT) { console_printf("invalid 'flags' parameter\n"); help_cmd_long_bounds("flags", 0, UINT8_MAX); http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0fc206fb/apps/bletiny/src/main.c ---------------------------------------------------------------------- diff --git a/apps/bletiny/src/main.c b/apps/bletiny/src/main.c index 9403bfd..b0ed15d 100755 --- a/apps/bletiny/src/main.c +++ b/apps/bletiny/src/main.c @@ -124,7 +124,7 @@ bletiny_print_adv_fields(const struct ble_hs_adv_fields *fields) ble_uuid_any_t uuid; int i; - if (fields->flags_is_present) { + if (fields->flags != 0) { console_printf(" flags=0x%02x:\n", fields->flags); if (!(fields->flags & BLE_HS_ADV_F_DISC_LTD) && http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0fc206fb/apps/bleuart/src/main.c ---------------------------------------------------------------------- diff --git a/apps/bleuart/src/main.c b/apps/bleuart/src/main.c index 6147fcd..270bb70 100755 --- a/apps/bleuart/src/main.c +++ b/apps/bleuart/src/main.c @@ -75,14 +75,15 @@ bleuart_advertise(void) memset(&fields, 0, sizeof fields); - /* Indicate that the flags field should be included; specify a value of 0 - * to instruct the stack to fill the value in for us. + /* Advertise two flags: + * o Discoverability in forthcoming advertisement (general) + * o BLE-only (BR/EDR unsupported). */ - fields.flags_is_present = 1; - fields.flags = 0; + fields.flags = BLE_HS_ADV_F_DISC_GEN | + BLE_HS_ADV_F_BREDR_UNSUP; /* Indicate that the TX power level field should be included; have the - * stack fill this one automatically as well. This is done by assiging the + * stack fill this value automatically. This is done by assiging the * special value BLE_HS_ADV_TX_PWR_LVL_AUTO. */ fields.tx_pwr_lvl_is_present = 1; http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0fc206fb/apps/ocf_sample/src/ocf_ble.c ---------------------------------------------------------------------- diff --git a/apps/ocf_sample/src/ocf_ble.c b/apps/ocf_sample/src/ocf_ble.c index 6ae636b..21e015a 100644 --- a/apps/ocf_sample/src/ocf_ble.c +++ b/apps/ocf_sample/src/ocf_ble.c @@ -116,14 +116,15 @@ ocf_ble_advertise(void) memset(&fields, 0, sizeof fields); - /* Indicate that the flags field should be included; specify a value of 0 - * to instruct the stack to fill the value in for us. + /* Advertise two flags: + * o Discoverability in forthcoming advertisement (general) + * o BLE-only (BR/EDR unsupported). */ - fields.flags_is_present = 1; - fields.flags = 0; + fields.flags = BLE_HS_ADV_F_DISC_GEN | + BLE_HS_ADV_F_BREDR_UNSUP; /* Indicate that the TX power level field should be included; have the - * stack fill this one automatically as well. This is done by assiging the + * stack fill this value automatically. This is done by assiging the * special value BLE_HS_ADV_TX_PWR_LVL_AUTO. */ fields.tx_pwr_lvl_is_present = 1; http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0fc206fb/net/nimble/host/include/host/ble_gap.h ---------------------------------------------------------------------- diff --git a/net/nimble/host/include/host/ble_gap.h b/net/nimble/host/include/host/ble_gap.h index e960975..f24c4e0 100644 --- a/net/nimble/host/include/host/ble_gap.h +++ b/net/nimble/host/include/host/ble_gap.h @@ -543,7 +543,9 @@ int ble_gap_adv_start(uint8_t own_addr_type, uint8_t peer_addr_type, ble_gap_event_fn *cb, void *cb_arg); int ble_gap_adv_stop(void); int ble_gap_adv_active(void); -int ble_gap_adv_set_fields(const struct ble_hs_adv_fields *adv_fields); +int ble_gap_adv_set_data(const uint8_t *data, int data_len); +int ble_gap_adv_rsp_set_data(const uint8_t *data, int data_len); +int ble_gap_adv_set_fields(const struct ble_hs_adv_fields *rsp_fields); int ble_gap_adv_rsp_set_fields(const struct ble_hs_adv_fields *rsp_fields); int ble_gap_disc(uint8_t own_addr_type, int32_t duration_ms, const struct ble_gap_disc_params *disc_params, http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0fc206fb/net/nimble/host/include/host/ble_hs_adv.h ---------------------------------------------------------------------- diff --git a/net/nimble/host/include/host/ble_hs_adv.h b/net/nimble/host/include/host/ble_hs_adv.h index 024e708..3ea9a19 100644 --- a/net/nimble/host/include/host/ble_hs_adv.h +++ b/net/nimble/host/include/host/ble_hs_adv.h @@ -26,13 +26,14 @@ 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_HCI_MAX_ADV_DATA_LEN - 2) +#define BLE_HS_ADV_MAX_FIELD_SZ (BLE_HS_ADV_MAX_SZ - 2) struct ble_hs_adv_fields { /*** 0x01 - Flags. */ uint8_t flags; - unsigned flags_is_present:1; /*** 0x02,0x03 - 16-bit service class UUIDs. */ uint16_t *uuids16; @@ -178,6 +179,9 @@ struct ble_hs_adv_fields { #define BLE_HS_ADV_SVC_DATA_UUID128_MIN_LEN 16 +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); + #ifdef __cplusplus } #endif http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0fc206fb/net/nimble/host/src/ble_gap.c ---------------------------------------------------------------------- diff --git a/net/nimble/host/src/ble_gap.c b/net/nimble/host/src/ble_gap.c index f36656a..8d46aa4 100644 --- a/net/nimble/host/src/ble_gap.c +++ b/net/nimble/host/src/ble_gap.c @@ -73,14 +73,6 @@ #define BLE_GAP_UPDATE_TIMEOUT (30 * OS_TICKS_PER_SEC) -/** - * The maximum amount of user data that can be put into the advertising data. - * The stack will automatically insert the flags field on its own if requested - * by the application, limiting the maximum amount of user data. - */ -#define BLE_GAP_ADV_DATA_LIMIT_FLAGS (BLE_HCI_MAX_ADV_DATA_LEN - 3) -#define BLE_GAP_ADV_DATA_LIMIT_NO_FLAGS BLE_HCI_MAX_ADV_DATA_LEN - #define BLE_GAP_MAX_UPDATE_ENTRIES 1 static const struct ble_gap_conn_params ble_gap_conn_params_dflt = { @@ -142,8 +134,6 @@ static bssnz_t struct { uint8_t rsp_data[BLE_HCI_MAX_ADV_DATA_LEN]; uint8_t adv_data_len; uint8_t rsp_data_len; - - unsigned adv_auto_flags:1; } ble_gap_slave; struct ble_gap_update_entry { @@ -185,10 +175,10 @@ STATS_NAME_START(ble_gap_stats) STATS_NAME(ble_gap_stats, adv_stop_fail) STATS_NAME(ble_gap_stats, adv_start) STATS_NAME(ble_gap_stats, adv_start_fail) - STATS_NAME(ble_gap_stats, adv_set_fields) - STATS_NAME(ble_gap_stats, adv_set_fields_fail) - STATS_NAME(ble_gap_stats, adv_rsp_set_fields) - STATS_NAME(ble_gap_stats, adv_rsp_set_fields_fail) + STATS_NAME(ble_gap_stats, adv_set_data) + STATS_NAME(ble_gap_stats, adv_set_data_fail) + STATS_NAME(ble_gap_stats, adv_rsp_set_data) + STATS_NAME(ble_gap_stats, adv_rsp_set_data_fail) STATS_NAME(ble_gap_stats, discover) STATS_NAME(ble_gap_stats, discover_fail) STATS_NAME(ble_gap_stats, initiate) @@ -1592,7 +1582,7 @@ done: ble_hs_unlock(); if (rc != 0) { - STATS_INC(ble_gap_stats, adv_set_fields_fail); + STATS_INC(ble_gap_stats, adv_set_data_fail); } return rc; @@ -1603,93 +1593,6 @@ done: *****************************************************************************/ static int -ble_gap_adv_rsp_data_tx(void) -{ - uint8_t buf[BLE_HCI_CMD_HDR_LEN + BLE_HCI_SET_SCAN_RSP_DATA_LEN]; - int rc; - - rc = ble_hs_hci_cmd_build_le_set_scan_rsp_data(ble_gap_slave.rsp_data, - ble_gap_slave.rsp_data_len, - buf, sizeof buf); - if (rc != 0) { - return rc; - } - - rc = ble_hs_hci_cmd_tx_empty_ack(buf); - if (rc != 0) { - return rc; - } - - return 0; -} - -static void -ble_gap_adv_data_set_flags(void) -{ - uint8_t flags; - int rc; - - /* Calculate the value of the flags field from the discoverable mode. */ - flags = 0; - switch (ble_gap_slave.disc_mode) { - case BLE_GAP_DISC_MODE_NON: - break; - - case BLE_GAP_DISC_MODE_LTD: - flags |= BLE_HS_ADV_F_DISC_LTD; - break; - - case BLE_GAP_DISC_MODE_GEN: - flags |= BLE_HS_ADV_F_DISC_GEN; - break; - - default: - BLE_HS_DBG_ASSERT(0); - break; - } - - flags |= BLE_HS_ADV_F_BREDR_UNSUP; - - if (flags != 0) { - rc = ble_hs_adv_set_flat(BLE_HS_ADV_TYPE_FLAGS, 1, &flags, - ble_gap_slave.adv_data, - &ble_gap_slave.adv_data_len, - BLE_HCI_MAX_ADV_DATA_LEN); - BLE_HS_DBG_ASSERT_EVAL(rc == 0); - } -} - -static int -ble_gap_adv_data_tx(void) -{ - uint8_t buf[BLE_HCI_CMD_HDR_LEN + BLE_HCI_SET_ADV_DATA_LEN]; - int rc; - - /* Calculate the flags AD field if requested by application. Clear the - * auto flag after encoding the flags so that we don't get repeated flags - * fields on subsequent advertising procedures. - */ - if (ble_gap_slave.adv_auto_flags) { - ble_gap_adv_data_set_flags(); - ble_gap_slave.adv_auto_flags = 0; - } - - rc = ble_hs_hci_cmd_build_le_set_adv_data(ble_gap_slave.adv_data, - ble_gap_slave.adv_data_len, - buf, sizeof buf); - if (rc != 0) { - return rc; - } - - rc = ble_hs_hci_cmd_tx_empty_ack(buf); - if (rc != 0) { - return rc; - } - - return 0; -} - -static int ble_gap_adv_type(const struct ble_gap_adv_params *adv_params) { switch (adv_params->conn_mode) { @@ -1953,18 +1856,6 @@ ble_gap_adv_start(uint8_t own_addr_type, uint8_t peer_addr_type, goto done; } - if (adv_params->conn_mode != BLE_GAP_CONN_MODE_DIR) { - rc = ble_gap_adv_data_tx(); - if (rc != 0) { - goto done; - } - - rc = ble_gap_adv_rsp_data_tx(); - if (rc != 0) { - goto done; - } - } - ble_gap_slave.op = BLE_GAP_OP_S_ADV; rc = ble_gap_adv_enable_tx(1); @@ -1991,25 +1882,20 @@ done: /** * Configures the data to include in subsequent advertisements. * - * @param adv_fields Specifies the advertisement data. + * @param data Buffer containing the advertising data. + * @param data_len The size of the advertising data, in bytes. * * @return 0 on success; * BLE_HS_EBUSY if advertising is in progress; - * BLE_HS_EMSGSIZE if the specified data is too - * large to fit in an advertisement; * Other nonzero on failure. */ int -ble_gap_adv_set_fields(const struct ble_hs_adv_fields *adv_fields) +ble_gap_adv_set_data(const uint8_t *data, int data_len) { -#if !NIMBLE_BLE_ADVERTISE - return BLE_HS_ENOTSUP; -#endif - - int max_sz; + uint8_t buf[BLE_HCI_CMD_HDR_LEN + BLE_HCI_SET_SCAN_RSP_DATA_LEN]; int rc; - STATS_INC(ble_gap_stats, adv_set_fields); + STATS_INC(ble_gap_stats, adv_set_data); ble_hs_lock(); @@ -2019,76 +1905,125 @@ ble_gap_adv_set_fields(const struct ble_hs_adv_fields *adv_fields) goto done; } - /* If application has requested the stack to calculate the flags field - * automatically (flags == 0), there is less room for user data. - */ - if (adv_fields->flags_is_present && adv_fields->flags == 0) { - max_sz = BLE_GAP_ADV_DATA_LIMIT_FLAGS; - ble_gap_slave.adv_auto_flags = 1; - } else { - max_sz = BLE_GAP_ADV_DATA_LIMIT_NO_FLAGS; - ble_gap_slave.adv_auto_flags = 0; + rc = ble_hs_hci_cmd_build_le_set_adv_data(data, data_len, buf, sizeof buf); + if (rc != 0) { + return BLE_HS_HCI_ERR(rc); } - rc = ble_hs_adv_set_fields(adv_fields, ble_gap_slave.adv_data, - &ble_gap_slave.adv_data_len, max_sz); + rc = ble_hs_hci_cmd_tx_empty_ack(buf); if (rc != 0) { - goto done; + return rc; } + rc = 0; + done: ble_hs_unlock(); - - if (rc != 0) { - STATS_INC(ble_gap_stats, adv_set_fields_fail); - } return rc; } /** * Configures the data to include in subsequent scan responses. * - * @param adv_fields Specifies the scan response data. + * @param data Buffer containing the scan response data. + * @param data_len The size of the response data, in bytes. * * @return 0 on success; * BLE_HS_EBUSY if advertising is in progress; - * BLE_HS_EMSGSIZE if the specified data is too - * large to fit in an advertisement; * Other nonzero on failure. */ int -ble_gap_adv_rsp_set_fields(const struct ble_hs_adv_fields *rsp_fields) +ble_gap_adv_rsp_set_data(const uint8_t *data, int data_len) { -#if !NIMBLE_BLE_ADVERTISE - return BLE_HS_ENOTSUP; -#endif - + uint8_t buf[BLE_HCI_CMD_HDR_LEN + BLE_HCI_SET_SCAN_RSP_DATA_LEN]; int rc; - STATS_INC(ble_gap_stats, adv_rsp_set_fields); - ble_hs_lock(); - /* Don't allow response fields to be set while advertising is active. */ + /* Don't allow advertising fields to be set while advertising is active. */ if (ble_gap_slave.op != BLE_GAP_OP_NULL) { rc = BLE_HS_EBUSY; goto done; } - rc = ble_hs_adv_set_fields(rsp_fields, ble_gap_slave.rsp_data, - &ble_gap_slave.rsp_data_len, - BLE_HCI_MAX_ADV_DATA_LEN); + rc = ble_hs_hci_cmd_build_le_set_scan_rsp_data(data, data_len, + buf, sizeof buf); if (rc != 0) { - goto done; + return BLE_HS_HCI_ERR(rc); + } + + rc = ble_hs_hci_cmd_tx_empty_ack(buf); + if (rc != 0) { + return rc; } + rc = 0; + done: ble_hs_unlock(); + return rc; +} +/** + * Configures the fields to include in subsequent advertisements. This is a + * higher-level version of ble_gap_adv_set_data(). + * + * @param adv_fields Specifies the advertisement data. + * + * @return 0 on success; + * BLE_HS_EBUSY if advertising is in progress; + * BLE_HS_EMSGSIZE if the specified data is too + * large to fit in an advertisement; + * Other nonzero on failure. + */ +int +ble_gap_adv_set_fields(const struct ble_hs_adv_fields *adv_fields) +{ + uint8_t buf[BLE_HS_ADV_MAX_SZ]; + uint8_t buf_sz; + int rc; + + rc = ble_hs_adv_set_fields(adv_fields, buf, &buf_sz, sizeof buf); if (rc != 0) { - STATS_INC(ble_gap_stats, adv_rsp_set_fields_fail); + return rc; } - return rc; + + rc = ble_gap_adv_set_data(buf, buf_sz); + if (rc != 0) { + return rc; + } + + return 0; +} + +/** + * Configures the fields to include in subsequent scan responses. This is a + * higher-level version of ble_gap_adv_rsp_set_data(). + * + * @param adv_fields Specifies the scan response data. + * + * @return 0 on success; + * BLE_HS_EBUSY if advertising is in progress; + * Other nonzero on failure. + */ +int +ble_gap_adv_rsp_set_fields(const struct ble_hs_adv_fields *rsp_fields) +{ + uint8_t buf[BLE_HS_ADV_MAX_SZ]; + uint8_t buf_sz; + int rc; + + rc = ble_hs_adv_set_fields(rsp_fields, buf, &buf_sz, sizeof buf); + if (rc != 0) { + return rc; + } + + rc = ble_gap_adv_rsp_set_data(buf, buf_sz); + if (rc != 0) { + return rc; + } + + return 0; } /** http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0fc206fb/net/nimble/host/src/ble_gap_priv.h ---------------------------------------------------------------------- diff --git a/net/nimble/host/src/ble_gap_priv.h b/net/nimble/host/src/ble_gap_priv.h index a1f7429..c67efe4 100644 --- a/net/nimble/host/src/ble_gap_priv.h +++ b/net/nimble/host/src/ble_gap_priv.h @@ -42,10 +42,10 @@ STATS_SECT_START(ble_gap_stats) STATS_SECT_ENTRY(adv_stop_fail) STATS_SECT_ENTRY(adv_start) STATS_SECT_ENTRY(adv_start_fail) - STATS_SECT_ENTRY(adv_set_fields) - STATS_SECT_ENTRY(adv_set_fields_fail) - STATS_SECT_ENTRY(adv_rsp_set_fields) - STATS_SECT_ENTRY(adv_rsp_set_fields_fail) + STATS_SECT_ENTRY(adv_set_data) + STATS_SECT_ENTRY(adv_set_data_fail) + STATS_SECT_ENTRY(adv_rsp_set_data) + STATS_SECT_ENTRY(adv_rsp_set_data_fail) STATS_SECT_ENTRY(discover) STATS_SECT_ENTRY(discover_fail) STATS_SECT_ENTRY(initiate) http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0fc206fb/net/nimble/host/src/ble_hs_adv.c ---------------------------------------------------------------------- diff --git a/net/nimble/host/src/ble_hs_adv.c b/net/nimble/host/src/ble_hs_adv.c index 729887f..09d4c53 100644 --- a/net/nimble/host/src/ble_hs_adv.c +++ b/net/nimble/host/src/ble_hs_adv.c @@ -108,7 +108,7 @@ ble_hs_adv_set_array32(uint8_t type, uint8_t num_elems, const uint32_t *elems, } /** - * Sets the significant part of the data in outgoing advertisements. + * Converts a high-level set of fields to a byte buffer. * * @return 0 on success; nonzero on failure. */ @@ -127,19 +127,14 @@ ble_hs_adv_set_fields(const struct ble_hs_adv_fields *adv_fields, *dst_len = 0; /*** 0x01 - Flags. */ - /* The application has three options concerning the flags field: - * 1. Don't include it in advertisements (!flags_is_present). - * 2. Explicitly specify the value (flags_is_present && flags != 0). - * 3. Let stack calculate the value (flags_is_present && flags == 0). - * - * For option 3, the calculation is delayed until advertising is enabled. - * The delay is necessary because the flags value depends on the type of - * advertising being performed which is not known at this time. + /* The application has two options concerning the flags field: + * 1. Don't include it in advertisements (flags == 0). + * 2. Explicitly specify the value (flags != 0). * * Note: The CSS prohibits advertising a flags value of 0, so this method - * of specifying option 2 vs. 3 is sound. + * of specifying option 1 vs. 2 is sound. */ - if (adv_fields->flags_is_present && adv_fields->flags != 0) { + if (adv_fields->flags != 0) { rc = ble_hs_adv_set_flat(BLE_HS_ADV_TYPE_FLAGS, 1, &adv_fields->flags, dst, dst_len, max_len); } @@ -432,7 +427,6 @@ ble_hs_adv_parse_one_field(struct ble_hs_adv_fields *adv_fields, return BLE_HS_EBADDATA; } adv_fields->flags = *data; - adv_fields->flags_is_present = 1; break; case BLE_HS_ADV_TYPE_INCOMP_UUIDS16: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0fc206fb/net/nimble/host/src/ble_hs_adv_priv.h ---------------------------------------------------------------------- diff --git a/net/nimble/host/src/ble_hs_adv_priv.h b/net/nimble/host/src/ble_hs_adv_priv.h index 052d20c..f913b09 100644 --- a/net/nimble/host/src/ble_hs_adv_priv.h +++ b/net/nimble/host/src/ble_hs_adv_priv.h @@ -26,8 +26,6 @@ extern "C" { int ble_hs_adv_set_flat(uint8_t type, int data_len, const void *data, uint8_t *dst, uint8_t *dst_len, uint8_t max_len); -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, uint8_t *src, uint8_t src_len); http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0fc206fb/net/nimble/host/test/src/ble_gap_test.c ---------------------------------------------------------------------- diff --git a/net/nimble/host/test/src/ble_gap_test.c b/net/nimble/host/test/src/ble_gap_test.c index 7b3dd54..7aaebee 100644 --- a/net/nimble/host/test/src/ble_gap_test.c +++ b/net/nimble/host/test/src/ble_gap_test.c @@ -251,6 +251,7 @@ ble_gap_test_util_verify_tx_adv_data(void) /* Note: Content of message verified in ble_hs_adv_test.c. */ } +#if 0 static void ble_gap_test_util_verify_tx_rsp_data(void) { @@ -262,6 +263,7 @@ ble_gap_test_util_verify_tx_rsp_data(void) ¶m_len); (void)param; /* XXX: Verify other fields. */ } +#endif static void ble_gap_test_util_verify_tx_adv_enable(int enabled) @@ -631,7 +633,7 @@ TEST_CASE(ble_gap_test_case_disc_ltd_mismatch) .length_data = 0, .rssi = 0, .addr = { 1, 2, 3, 4, 5, 6 }, - .data = (uint8_t[BLE_HCI_MAX_ADV_DATA_LEN]){ + .data = (uint8_t[BLE_HS_ADV_MAX_SZ]){ 2, BLE_HS_ADV_TYPE_FLAGS, BLE_HS_ADV_F_DISC_GEN, @@ -1362,21 +1364,22 @@ ble_gap_test_util_adv(uint8_t own_addr_type, uint8_t peer_addr_type, cmd_idx = 0; - if (conn_mode != BLE_GAP_CONN_MODE_DIR) { - memset(&adv_fields, 0, sizeof adv_fields); - adv_fields.tx_pwr_lvl_is_present = 1; - adv_fields.tx_pwr_lvl = BLE_HS_ADV_TX_PWR_LVL_AUTO; + memset(&adv_fields, 0, sizeof adv_fields); + adv_fields.tx_pwr_lvl_is_present = 1; + adv_fields.tx_pwr_lvl = BLE_HS_ADV_TX_PWR_LVL_AUTO; - hci_status = ble_hs_test_util_exp_hci_status(cmd_idx, cmd_fail_idx, - fail_status); - rc = ble_hs_test_util_adv_set_fields(&adv_fields, hci_status); - - if (adv_fields.tx_pwr_lvl_is_present && - adv_fields.tx_pwr_lvl == BLE_HS_ADV_TX_PWR_LVL_AUTO) { + rc = ble_hs_test_util_adv_set_fields(&adv_fields, cmd_fail_idx, + fail_status); + if (cmd_fail_idx < 2) { + hci_status = fail_status; + } else { + hci_status = 0; + } + TEST_ASSERT_FATAL(rc == BLE_HS_HCI_ERR(hci_status)); + cmd_idx += 2; - TEST_ASSERT_FATAL(rc == BLE_HS_HCI_ERR(hci_status)); - cmd_idx++; - } + if (rc == 0) { + ble_gap_test_util_verify_tx_adv_data(); } if (fail_status == 0 || cmd_fail_idx >= cmd_idx) { @@ -1386,6 +1389,7 @@ ble_gap_test_util_adv(uint8_t own_addr_type, uint8_t peer_addr_type, cmd_fail_idx - cmd_idx, fail_status); TEST_ASSERT(rc == BLE_HS_HCI_ERR(fail_status)); + cmd_idx++; } if (fail_status == 0 || cmd_fail_idx >= cmd_idx) { @@ -1394,20 +1398,6 @@ ble_gap_test_util_adv(uint8_t own_addr_type, uint8_t peer_addr_type, } cmd_idx++; - if (conn_mode != BLE_GAP_CONN_MODE_DIR) { - if (fail_status == 0 || cmd_fail_idx >= cmd_idx) { - /* Verify tx of set advertise data command. */ - ble_gap_test_util_verify_tx_adv_data(); - } - cmd_idx++; - - if (fail_status == 0 || cmd_fail_idx >= cmd_idx) { - /* Verify tx of set scan response data command. */ - ble_gap_test_util_verify_tx_rsp_data(); - } - cmd_idx++; - } - if (fail_status == 0 || cmd_fail_idx >= cmd_idx) { /* Verify tx of set advertise enable command. */ ble_gap_test_util_verify_tx_adv_enable(1); @@ -1625,20 +1615,13 @@ TEST_CASE(ble_gap_test_case_adv_ctlr_fail) TEST_CASE(ble_gap_test_case_adv_hci_fail) { uint8_t peer_addr[6] = { 1, 2, 3, 4, 5, 6 }; - int num_hci_cmds; int fail_idx; int d; int c; for (c = BLE_GAP_CONN_MODE_NON; c < BLE_GAP_CONN_MODE_MAX; c++) { - if (c == BLE_GAP_CONN_MODE_DIR) { - num_hci_cmds = 2; - } else { - num_hci_cmds = 5; - } - for (d = BLE_GAP_DISC_MODE_NON; d < BLE_GAP_DISC_MODE_MAX; d++) { - for (fail_idx = 0; fail_idx < num_hci_cmds; fail_idx++) { + for (fail_idx = 0; fail_idx < 4; fail_idx++) { ble_gap_test_util_adv(BLE_ADDR_TYPE_PUBLIC, BLE_ADDR_TYPE_PUBLIC, peer_addr, c, d, 0, fail_idx, BLE_ERR_UNSUPPORTED); http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0fc206fb/net/nimble/host/test/src/ble_hs_adv_test.c ---------------------------------------------------------------------- diff --git a/net/nimble/host/test/src/ble_hs_adv_test.c b/net/nimble/host/test/src/ble_hs_adv_test.c index 0a06374..b21f4b3 100644 --- a/net/nimble/host/test/src/ble_hs_adv_test.c +++ b/net/nimble/host/test/src/ble_hs_adv_test.c @@ -148,11 +148,15 @@ ble_hs_adv_test_misc_tx_and_verify_data( adv_params = ble_hs_test_util_adv_params; adv_params.disc_mode = disc_mode; - rc = ble_hs_test_util_adv_set_fields(adv_fields, 0); + rc = ble_hs_test_util_adv_set_fields(adv_fields, 0, 0); TEST_ASSERT_FATAL(rc == 0); + ble_hs_adv_test_misc_verify_tx_adv_data(test_adv_fields); - rc = ble_gap_adv_rsp_set_fields(rsp_fields); - TEST_ASSERT_FATAL(rc == 0); + if (test_rsp_fields != NULL) { + rc = ble_hs_test_util_adv_rsp_set_fields(rsp_fields, 0, 0); + TEST_ASSERT_FATAL(rc == 0); + ble_hs_adv_test_misc_verify_tx_rsp_data(test_rsp_fields); + } rc = ble_hs_test_util_adv_start(BLE_ADDR_TYPE_PUBLIC, 0, NULL, &adv_params, BLE_HS_FOREVER, NULL, NULL, 0, 0); @@ -161,9 +165,6 @@ ble_hs_adv_test_misc_tx_and_verify_data( /* Discard the adv-enable command. */ ble_hs_test_util_get_last_hci_tx(); - ble_hs_adv_test_misc_verify_tx_rsp_data(test_rsp_fields); - ble_hs_adv_test_misc_verify_tx_adv_data(test_adv_fields); - /* Ensure the same data gets sent on repeated advertise procedures. */ rc = ble_hs_test_util_adv_stop(0); TEST_ASSERT_FATAL(rc == 0); @@ -174,74 +175,6 @@ ble_hs_adv_test_misc_tx_and_verify_data( /* Discard the adv-enable command. */ ble_hs_test_util_get_last_hci_tx(); - - ble_hs_adv_test_misc_verify_tx_rsp_data(test_rsp_fields); - ble_hs_adv_test_misc_verify_tx_adv_data(test_adv_fields); -} - -TEST_CASE(ble_hs_adv_test_case_flags) -{ - struct ble_hs_adv_fields adv_fields; - struct ble_hs_adv_fields rsp_fields; - - memset(&adv_fields, 0, sizeof adv_fields); - memset(&rsp_fields, 0, sizeof rsp_fields); - - /* Default flags. */ - adv_fields.flags_is_present = 1; - adv_fields.tx_pwr_lvl_is_present = 1; - adv_fields.tx_pwr_lvl = BLE_HS_ADV_TX_PWR_LVL_AUTO; - ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, - &adv_fields, - (struct ble_hs_adv_test_field[]) { - { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, - .val_len = 1, - }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, - .val_len = 1, - }, - { 0 }, - }, &rsp_fields, NULL); - - /* Flags |= limited discoverable. */ - ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_LTD, &adv_fields, - (struct ble_hs_adv_test_field[]) { - { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, - .val_len = 1, - }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]) { - BLE_HS_ADV_F_DISC_LTD | BLE_HS_ADV_F_BREDR_UNSUP - }, - .val_len = 1, - }, - { 0 }, - }, &rsp_fields, NULL); - - /* Flags = general discoverable. */ - ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_GEN, &adv_fields, - (struct ble_hs_adv_test_field[]) { - { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, - .val_len = 1, - }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]) { - BLE_HS_ADV_F_DISC_GEN | BLE_HS_ADV_F_BREDR_UNSUP - }, - .val_len = 1, - }, - { 0 }, - }, &rsp_fields, NULL); } TEST_CASE(ble_hs_adv_test_case_user) @@ -253,7 +186,7 @@ TEST_CASE(ble_hs_adv_test_case_user) /*** Complete 16-bit service class UUIDs. */ memset(&adv_fields, 0, sizeof adv_fields); - adv_fields.flags_is_present = 1; + adv_fields.flags = BLE_HS_ADV_F_BREDR_UNSUP; adv_fields.tx_pwr_lvl_is_present = 1; adv_fields.tx_pwr_lvl = BLE_HS_ADV_TX_PWR_LVL_AUTO; adv_fields.uuids16 = (uint16_t[]) { 0x0001, 0x1234, 0x54ab }; @@ -263,6 +196,11 @@ TEST_CASE(ble_hs_adv_test_case_user) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .val_len = 1, + }, + { .type = BLE_HS_ADV_TYPE_COMP_UUIDS16, .val = (uint8_t[]) { 0x01, 0x00, 0x34, 0x12, 0xab, 0x54 }, .val_len = 6, @@ -272,17 +210,12 @@ TEST_CASE(ble_hs_adv_test_case_user) .val = (uint8_t[]){ 0 }, .val_len = 1, }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, - .val_len = 1, - }, { 0 }, }, &rsp_fields, NULL); /*** Incomplete 16-bit service class UUIDs. */ memset(&adv_fields, 0, sizeof adv_fields); - adv_fields.flags_is_present = 1; + adv_fields.flags = BLE_HS_ADV_F_BREDR_UNSUP; adv_fields.tx_pwr_lvl_is_present = 1; adv_fields.uuids16 = (uint16_t[]) { 0x0001, 0x1234, 0x54ab }; adv_fields.num_uuids16 = 3; @@ -291,6 +224,11 @@ TEST_CASE(ble_hs_adv_test_case_user) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .val_len = 1, + }, + { .type = BLE_HS_ADV_TYPE_INCOMP_UUIDS16, .val = (uint8_t[]) { 0x01, 0x00, 0x34, 0x12, 0xab, 0x54 }, .val_len = 6, @@ -300,17 +238,12 @@ TEST_CASE(ble_hs_adv_test_case_user) .val = (uint8_t[]){ 0 }, .val_len = 1, }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, - .val_len = 1, - }, { 0 }, }, &rsp_fields, NULL); /*** Complete 32-bit service class UUIDs. */ memset(&adv_fields, 0, sizeof adv_fields); - adv_fields.flags_is_present = 1; + adv_fields.flags = BLE_HS_ADV_F_BREDR_UNSUP; adv_fields.tx_pwr_lvl_is_present = 1; adv_fields.uuids32 = (uint32_t[]) { 0x12345678, 0xabacadae }; adv_fields.num_uuids32 = 2; @@ -319,6 +252,11 @@ TEST_CASE(ble_hs_adv_test_case_user) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .val_len = 1, + }, + { .type = BLE_HS_ADV_TYPE_COMP_UUIDS32, .val = (uint8_t[]) { 0x78,0x56,0x34,0x12,0xae,0xad,0xac,0xab }, .val_len = 8, @@ -328,17 +266,12 @@ TEST_CASE(ble_hs_adv_test_case_user) .val = (uint8_t[]){ 0 }, .val_len = 1, }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, - .val_len = 1, - }, { 0 }, }, &rsp_fields, NULL); /*** Incomplete 32-bit service class UUIDs. */ memset(&adv_fields, 0, sizeof adv_fields); - adv_fields.flags_is_present = 1; + adv_fields.flags = BLE_HS_ADV_F_BREDR_UNSUP; adv_fields.tx_pwr_lvl_is_present = 1; adv_fields.uuids32 = (uint32_t[]) { 0x12345678, 0xabacadae }; adv_fields.num_uuids32 = 2; @@ -347,6 +280,11 @@ TEST_CASE(ble_hs_adv_test_case_user) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .val_len = 1, + }, + { .type = BLE_HS_ADV_TYPE_INCOMP_UUIDS32, .val = (uint8_t[]) { 0x78,0x56,0x34,0x12,0xae,0xad,0xac,0xab }, .val_len = 8, @@ -356,17 +294,12 @@ TEST_CASE(ble_hs_adv_test_case_user) .val = (uint8_t[]){ 0 }, .val_len = 1, }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, - .val_len = 1, - }, { 0 }, }, &rsp_fields, NULL); /*** Complete 128-bit service class UUIDs. */ memset(&adv_fields, 0, sizeof adv_fields); - adv_fields.flags_is_present = 1; + adv_fields.flags = BLE_HS_ADV_F_BREDR_UNSUP; adv_fields.tx_pwr_lvl_is_present = 1; adv_fields.uuids128 = (uint8_t[]) { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, @@ -378,6 +311,11 @@ TEST_CASE(ble_hs_adv_test_case_user) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .val_len = 1, + }, + { .type = BLE_HS_ADV_TYPE_COMP_UUIDS128, .val = (uint8_t[]) { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, @@ -390,17 +328,12 @@ TEST_CASE(ble_hs_adv_test_case_user) .val = (uint8_t[]){ 0 }, .val_len = 1, }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, - .val_len = 1, - }, { 0 }, }, &rsp_fields, NULL); /*** Incomplete 128-bit service class UUIDs. */ memset(&adv_fields, 0, sizeof adv_fields); - adv_fields.flags_is_present = 1; + adv_fields.flags = BLE_HS_ADV_F_BREDR_UNSUP; adv_fields.tx_pwr_lvl_is_present = 1; adv_fields.uuids128 = (uint8_t[]) { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, @@ -412,6 +345,11 @@ TEST_CASE(ble_hs_adv_test_case_user) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .val_len = 1, + }, + { .type = BLE_HS_ADV_TYPE_INCOMP_UUIDS128, .val = (uint8_t[]) { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, @@ -424,17 +362,12 @@ TEST_CASE(ble_hs_adv_test_case_user) .val = (uint8_t[]){ 0 }, .val_len = 1, }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, - .val_len = 1, - }, { 0 }, }, &rsp_fields, NULL); /*** Complete name. */ memset(&adv_fields, 0, sizeof adv_fields); - adv_fields.flags_is_present = 1; + adv_fields.flags = BLE_HS_ADV_F_BREDR_UNSUP; adv_fields.tx_pwr_lvl_is_present = 1; adv_fields.name = (uint8_t *)"myname"; adv_fields.name_len = 6; @@ -443,6 +376,11 @@ TEST_CASE(ble_hs_adv_test_case_user) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .val_len = 1, + }, + { .type = BLE_HS_ADV_TYPE_COMP_NAME, .val = (uint8_t*)"myname", .val_len = 6, @@ -452,17 +390,12 @@ TEST_CASE(ble_hs_adv_test_case_user) .val = (uint8_t[]){ 0 }, .val_len = 1, }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, - .val_len = 1, - }, { 0 }, }, &rsp_fields, NULL); /*** Incomplete name. */ memset(&adv_fields, 0, sizeof adv_fields); - adv_fields.flags_is_present = 1; + adv_fields.flags = BLE_HS_ADV_F_BREDR_UNSUP; adv_fields.tx_pwr_lvl_is_present = 1; adv_fields.name = (uint8_t *)"myname"; adv_fields.name_len = 6; @@ -471,6 +404,11 @@ TEST_CASE(ble_hs_adv_test_case_user) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .val_len = 1, + }, + { .type = BLE_HS_ADV_TYPE_INCOMP_NAME, .val = (uint8_t*)"myname", .val_len = 6, @@ -480,23 +418,23 @@ TEST_CASE(ble_hs_adv_test_case_user) .val = (uint8_t[]){ 0 }, .val_len = 1, }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, - .val_len = 1, - }, { 0 }, }, &rsp_fields, NULL); /*** Class of device. */ memset(&adv_fields, 0, sizeof adv_fields); - adv_fields.flags_is_present = 1; + adv_fields.flags = BLE_HS_ADV_F_BREDR_UNSUP; adv_fields.tx_pwr_lvl_is_present = 1; adv_fields.device_class = (uint8_t[]){ 1,2,3 }; ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .val_len = 1, + }, + { .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, .val = (uint8_t[]){ 0 }, .val_len = 1, @@ -506,23 +444,23 @@ TEST_CASE(ble_hs_adv_test_case_user) .val = (uint8_t[]) { 1,2,3 }, .val_len = BLE_HS_ADV_DEVICE_CLASS_LEN, }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, - .val_len = 1, - }, { 0 }, }, &rsp_fields, NULL); /*** Slave interval range. */ memset(&adv_fields, 0, sizeof adv_fields); - adv_fields.flags_is_present = 1; + adv_fields.flags = BLE_HS_ADV_F_BREDR_UNSUP; adv_fields.tx_pwr_lvl_is_present = 1; adv_fields.slave_itvl_range = (uint8_t[]){ 1,2,3,4 }; ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .val_len = 1, + }, + { .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, .val = (uint8_t[]){ 0 }, .val_len = 1, @@ -532,17 +470,12 @@ TEST_CASE(ble_hs_adv_test_case_user) .val = (uint8_t[]) { 1,2,3,4 }, .val_len = BLE_HS_ADV_SLAVE_ITVL_RANGE_LEN, }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, - .val_len = 1, - }, { 0 }, }, &rsp_fields, NULL); /*** 0x16 - Service data - 16-bit UUID. */ memset(&adv_fields, 0, sizeof adv_fields); - adv_fields.flags_is_present = 1; + adv_fields.flags = BLE_HS_ADV_F_BREDR_UNSUP; adv_fields.tx_pwr_lvl_is_present = 1; adv_fields.svc_data_uuid16 = (uint8_t[]){ 1,2,3,4 }; adv_fields.svc_data_uuid16_len = 4; @@ -550,6 +483,11 @@ TEST_CASE(ble_hs_adv_test_case_user) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .val_len = 1, + }, + { .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, .val = (uint8_t[]){ 0 }, .val_len = 1, @@ -559,17 +497,12 @@ TEST_CASE(ble_hs_adv_test_case_user) .val = (uint8_t[]) { 1,2,3,4 }, .val_len = 4, }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, - .val_len = 1, - }, { 0 }, }, &rsp_fields, NULL); /*** 0x17 - Public target address. */ memset(&adv_fields, 0, sizeof adv_fields); - adv_fields.flags_is_present = 1; + adv_fields.flags = BLE_HS_ADV_F_BREDR_UNSUP; adv_fields.tx_pwr_lvl_is_present = 1; adv_fields.public_tgt_addr = (uint8_t[]){ 1,2,3,4,5,6, 6,5,4,3,2,1 }; adv_fields.num_public_tgt_addrs = 2; @@ -577,6 +510,11 @@ TEST_CASE(ble_hs_adv_test_case_user) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .val_len = 1, + }, + { .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, .val = (uint8_t[]){ 0 }, .val_len = 1, @@ -586,17 +524,12 @@ TEST_CASE(ble_hs_adv_test_case_user) .val = (uint8_t[]){ 1,2,3,4,5,6, 6,5,4,3,2,1 }, .val_len = 2 * BLE_HS_ADV_PUBLIC_TGT_ADDR_ENTRY_LEN, }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, - .val_len = 1, - }, { 0 }, }, &rsp_fields, NULL); /*** 0x19 - Appearance. */ memset(&adv_fields, 0, sizeof adv_fields); - adv_fields.flags_is_present = 1; + adv_fields.flags = BLE_HS_ADV_F_BREDR_UNSUP; adv_fields.tx_pwr_lvl_is_present = 1; adv_fields.appearance = 0x1234; adv_fields.appearance_is_present = 1; @@ -604,6 +537,11 @@ TEST_CASE(ble_hs_adv_test_case_user) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .val_len = 1, + }, + { .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, .val = (uint8_t[]){ 0 }, .val_len = 1, @@ -613,17 +551,12 @@ TEST_CASE(ble_hs_adv_test_case_user) .val = (uint8_t[]){ 0x34, 0x12 }, .val_len = BLE_HS_ADV_APPEARANCE_LEN, }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, - .val_len = 1, - }, { 0 }, }, &rsp_fields, NULL); /*** 0x1a - Advertising interval. */ memset(&adv_fields, 0, sizeof adv_fields); - adv_fields.flags_is_present = 1; + adv_fields.flags = BLE_HS_ADV_F_BREDR_UNSUP; adv_fields.tx_pwr_lvl_is_present = 1; adv_fields.adv_itvl = 0x1234; adv_fields.adv_itvl_is_present = 1; @@ -631,6 +564,11 @@ TEST_CASE(ble_hs_adv_test_case_user) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .val_len = 1, + }, + { .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, .val = (uint8_t[]){ 0 }, .val_len = 1, @@ -640,23 +578,23 @@ TEST_CASE(ble_hs_adv_test_case_user) .val = (uint8_t[]){ 0x34, 0x12 }, .val_len = BLE_HS_ADV_ADV_ITVL_LEN, }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, - .val_len = 1, - }, { 0 }, }, &rsp_fields, NULL); /*** 0x1b - LE bluetooth device address. */ memset(&adv_fields, 0, sizeof adv_fields); - adv_fields.flags_is_present = 1; + adv_fields.flags = BLE_HS_ADV_F_BREDR_UNSUP; adv_fields.tx_pwr_lvl_is_present = 1; adv_fields.le_addr = (uint8_t[]){ 1,2,3,4,5,6,7 }; ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .val_len = 1, + }, + { .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, .val = (uint8_t[]){ 0 }, .val_len = 1, @@ -666,17 +604,12 @@ TEST_CASE(ble_hs_adv_test_case_user) .val = (uint8_t[]) { 1,2,3,4,5,6,7 }, .val_len = BLE_HS_ADV_LE_ADDR_LEN, }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, - .val_len = 1, - }, { 0 }, }, &rsp_fields, NULL); /*** 0x1c - LE role. */ memset(&adv_fields, 0, sizeof adv_fields); - adv_fields.flags_is_present = 1; + adv_fields.flags = BLE_HS_ADV_F_BREDR_UNSUP; adv_fields.tx_pwr_lvl_is_present = 1; adv_fields.le_role = BLE_HS_ADV_LE_ROLE_BOTH_PERIPH_PREF; adv_fields.le_role_is_present = 1; @@ -684,6 +617,11 @@ TEST_CASE(ble_hs_adv_test_case_user) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .val_len = 1, + }, + { .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, .val = (uint8_t[]){ 0 }, .val_len = 1, @@ -693,17 +631,12 @@ TEST_CASE(ble_hs_adv_test_case_user) .val = (uint8_t[]) { BLE_HS_ADV_LE_ROLE_BOTH_PERIPH_PREF }, .val_len = 1, }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, - .val_len = 1, - }, { 0 }, }, &rsp_fields, NULL); /*** 0x20 - Service data - 32-bit UUID. */ memset(&adv_fields, 0, sizeof adv_fields); - adv_fields.flags_is_present = 1; + adv_fields.flags = BLE_HS_ADV_F_BREDR_UNSUP; adv_fields.tx_pwr_lvl_is_present = 1; adv_fields.svc_data_uuid32 = (uint8_t[]){ 1,2,3,4,5 }; adv_fields.svc_data_uuid32_len = 5; @@ -711,6 +644,11 @@ TEST_CASE(ble_hs_adv_test_case_user) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .val_len = 1, + }, + { .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, .val = (uint8_t[]){ 0 }, .val_len = 1, @@ -720,17 +658,12 @@ TEST_CASE(ble_hs_adv_test_case_user) .val = (uint8_t[]) { 1,2,3,4,5 }, .val_len = 5, }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, - .val_len = 1, - }, { 0 }, }, &rsp_fields, NULL); /*** 0x21 - Service data - 128-bit UUID. */ memset(&adv_fields, 0, sizeof adv_fields); - adv_fields.flags_is_present = 1; + adv_fields.flags = BLE_HS_ADV_F_BREDR_UNSUP; adv_fields.tx_pwr_lvl_is_present = 1; adv_fields.svc_data_uuid128 = (uint8_t[]){ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 }; @@ -739,6 +672,11 @@ TEST_CASE(ble_hs_adv_test_case_user) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .val_len = 1, + }, + { .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, .val = (uint8_t[]){ 0 }, .val_len = 1, @@ -749,17 +687,12 @@ TEST_CASE(ble_hs_adv_test_case_user) 11,12,13,14,15,16,17,18 }, .val_len = 18, }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, - .val_len = 1, - }, { 0 }, }, &rsp_fields, NULL); /*** 0x24 - URI. */ memset(&adv_fields, 0, sizeof adv_fields); - adv_fields.flags_is_present = 1; + adv_fields.flags = BLE_HS_ADV_F_BREDR_UNSUP; adv_fields.tx_pwr_lvl_is_present = 1; adv_fields.uri = (uint8_t[]){ 1,2,3,4 }; adv_fields.uri_len = 4; @@ -767,6 +700,11 @@ TEST_CASE(ble_hs_adv_test_case_user) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .val_len = 1, + }, + { .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, .val = (uint8_t[]){ 0 }, .val_len = 1, @@ -776,17 +714,12 @@ TEST_CASE(ble_hs_adv_test_case_user) .val = (uint8_t[]) { 1,2,3,4 }, .val_len = 4, }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, - .val_len = 1, - }, { 0 }, }, &rsp_fields, NULL); /*** 0xff - Manufacturer specific data. */ memset(&adv_fields, 0, sizeof adv_fields); - adv_fields.flags_is_present = 1; + adv_fields.flags = BLE_HS_ADV_F_BREDR_UNSUP; adv_fields.tx_pwr_lvl_is_present = 1; adv_fields.mfg_data = (uint8_t[]){ 1,2,3,4 }; adv_fields.mfg_data_len = 4; @@ -794,6 +727,11 @@ TEST_CASE(ble_hs_adv_test_case_user) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .val_len = 1, + }, + { .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, .val = (uint8_t[]){ 0 }, .val_len = 1, @@ -803,11 +741,6 @@ TEST_CASE(ble_hs_adv_test_case_user) .val = (uint8_t[]) { 1,2,3,4 }, .val_len = 4, }, - { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, - .val_len = 1, - }, { 0 }, }, &rsp_fields, NULL); } @@ -818,7 +751,7 @@ TEST_CASE(ble_hs_adv_test_case_user_rsp) struct ble_hs_adv_fields adv_fields; memset(&adv_fields, 0, sizeof adv_fields); - adv_fields.flags_is_present = 1; + adv_fields.flags = BLE_HS_ADV_F_BREDR_UNSUP; adv_fields.tx_pwr_lvl_is_present = 1; /*** Complete 16-bit service class UUIDs. */ @@ -830,13 +763,13 @@ TEST_CASE(ble_hs_adv_test_case_user_rsp) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, .val_len = 1, }, { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, + .val = (uint8_t[]){ 0 }, .val_len = 1, }, { 0 }, @@ -860,13 +793,13 @@ TEST_CASE(ble_hs_adv_test_case_user_rsp) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, .val_len = 1, }, { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, + .val = (uint8_t[]){ 0 }, .val_len = 1, }, { 0 }, @@ -890,13 +823,13 @@ TEST_CASE(ble_hs_adv_test_case_user_rsp) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, .val_len = 1, }, { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, + .val = (uint8_t[]){ 0 }, .val_len = 1, }, { 0 }, @@ -920,13 +853,13 @@ TEST_CASE(ble_hs_adv_test_case_user_rsp) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, .val_len = 1, }, { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, + .val = (uint8_t[]){ 0 }, .val_len = 1, }, { 0 }, @@ -953,13 +886,13 @@ TEST_CASE(ble_hs_adv_test_case_user_rsp) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, .val_len = 1, }, { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, + .val = (uint8_t[]){ 0 }, .val_len = 1, }, { 0 }, @@ -989,13 +922,13 @@ TEST_CASE(ble_hs_adv_test_case_user_rsp) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, .val_len = 1, }, { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, + .val = (uint8_t[]){ 0 }, .val_len = 1, }, { 0 }, @@ -1022,13 +955,13 @@ TEST_CASE(ble_hs_adv_test_case_user_rsp) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, .val_len = 1, }, { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, + .val = (uint8_t[]){ 0 }, .val_len = 1, }, { 0 }, @@ -1052,13 +985,13 @@ TEST_CASE(ble_hs_adv_test_case_user_rsp) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, .val_len = 1, }, { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, + .val = (uint8_t[]){ 0 }, .val_len = 1, }, { 0 }, @@ -1080,13 +1013,13 @@ TEST_CASE(ble_hs_adv_test_case_user_rsp) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, .val_len = 1, }, { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, + .val = (uint8_t[]){ 0 }, .val_len = 1, }, { 0 }, @@ -1108,13 +1041,13 @@ TEST_CASE(ble_hs_adv_test_case_user_rsp) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, .val_len = 1, }, { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, + .val = (uint8_t[]){ 0 }, .val_len = 1, }, { 0 }, @@ -1137,13 +1070,13 @@ TEST_CASE(ble_hs_adv_test_case_user_rsp) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, .val_len = 1, }, { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, + .val = (uint8_t[]){ 0 }, .val_len = 1, }, { 0 }, @@ -1166,13 +1099,13 @@ TEST_CASE(ble_hs_adv_test_case_user_rsp) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, .val_len = 1, }, { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, + .val = (uint8_t[]){ 0 }, .val_len = 1, }, { 0 }, @@ -1195,13 +1128,13 @@ TEST_CASE(ble_hs_adv_test_case_user_rsp) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, .val_len = 1, }, { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, + .val = (uint8_t[]){ 0 }, .val_len = 1, }, { 0 }, @@ -1224,13 +1157,13 @@ TEST_CASE(ble_hs_adv_test_case_user_rsp) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, .val_len = 1, }, { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, + .val = (uint8_t[]){ 0 }, .val_len = 1, }, { 0 }, @@ -1252,13 +1185,13 @@ TEST_CASE(ble_hs_adv_test_case_user_rsp) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, .val_len = 1, }, { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, + .val = (uint8_t[]){ 0 }, .val_len = 1, }, { 0 }, @@ -1281,13 +1214,13 @@ TEST_CASE(ble_hs_adv_test_case_user_rsp) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, .val_len = 1, }, { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, + .val = (uint8_t[]){ 0 }, .val_len = 1, }, { 0 }, @@ -1310,13 +1243,13 @@ TEST_CASE(ble_hs_adv_test_case_user_rsp) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, .val_len = 1, }, { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, + .val = (uint8_t[]){ 0 }, .val_len = 1, }, { 0 }, @@ -1340,13 +1273,13 @@ TEST_CASE(ble_hs_adv_test_case_user_rsp) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, .val_len = 1, }, { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, + .val = (uint8_t[]){ 0 }, .val_len = 1, }, { 0 }, @@ -1370,13 +1303,13 @@ TEST_CASE(ble_hs_adv_test_case_user_rsp) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, .val_len = 1, }, { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, + .val = (uint8_t[]){ 0 }, .val_len = 1, }, { 0 }, @@ -1399,13 +1332,13 @@ TEST_CASE(ble_hs_adv_test_case_user_rsp) ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &adv_fields, (struct ble_hs_adv_test_field[]) { { - .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, - .val = (uint8_t[]){ 0 }, + .type = BLE_HS_ADV_TYPE_FLAGS, + .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, .val_len = 1, }, { - .type = BLE_HS_ADV_TYPE_FLAGS, - .val = (uint8_t[]){ BLE_HS_ADV_F_BREDR_UNSUP }, + .type = BLE_HS_ADV_TYPE_TX_PWR_LVL, + .val = (uint8_t[]){ 0 }, .val_len = 1, }, { 0 }, @@ -1470,7 +1403,6 @@ TEST_SUITE(ble_hs_adv_test_suite) { tu_suite_set_post_test_cb(ble_hs_test_util_post_test, NULL); - ble_hs_adv_test_case_flags(); ble_hs_adv_test_case_user(); ble_hs_adv_test_case_user_rsp(); ble_hs_adv_test_case_user_full_payload(); http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0fc206fb/net/nimble/host/test/src/ble_hs_conn_test.c ---------------------------------------------------------------------- diff --git a/net/nimble/host/test/src/ble_hs_conn_test.c b/net/nimble/host/test/src/ble_hs_conn_test.c index a5fdba7..5563dde 100644 --- a/net/nimble/host/test/src/ble_hs_conn_test.c +++ b/net/nimble/host/test/src/ble_hs_conn_test.c @@ -162,7 +162,7 @@ TEST_CASE(ble_hs_conn_test_undirect_connectable_success) /* Initiate advertising. */ memset(&adv_fields, 0, sizeof adv_fields); adv_fields.tx_pwr_lvl_is_present = 1; - rc = ble_gap_adv_set_fields(&adv_fields); + rc = ble_hs_test_util_adv_set_fields(&adv_fields, 0, 0); TEST_ASSERT_FATAL(rc == 0); adv_params = ble_hs_test_util_adv_params; http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0fc206fb/net/nimble/host/test/src/ble_hs_test_util.c ---------------------------------------------------------------------- diff --git a/net/nimble/host/test/src/ble_hs_test_util.c b/net/nimble/host/test/src/ble_hs_test_util.c index 919ec9b..2e8ecbc 100644 --- a/net/nimble/host/test/src/ble_hs_test_util.c +++ b/net/nimble/host/test/src/ble_hs_test_util.c @@ -689,23 +689,37 @@ ble_hs_test_util_verify_tx_rd_pwr(void) } int -ble_hs_test_util_adv_set_fields(struct ble_hs_adv_fields *adv_fields, - uint8_t hci_status) +ble_hs_test_util_adv_set_fields(const struct ble_hs_adv_fields *adv_fields, + int cmd_fail_idx, uint8_t hci_status) { + struct ble_hs_test_util_phony_ack acks[3]; int auto_pwr; int rc; + int i; auto_pwr = adv_fields->tx_pwr_lvl_is_present && adv_fields->tx_pwr_lvl == BLE_HS_ADV_TX_PWR_LVL_AUTO; + i = 0; if (auto_pwr) { - ble_hs_test_util_set_ack_params( - ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE, - BLE_HCI_OCF_LE_RD_ADV_CHAN_TXPWR), - hci_status, - ((uint8_t[1]){0}), 1); + acks[i] = (struct ble_hs_test_util_phony_ack) { + BLE_HS_TEST_UTIL_LE_OPCODE(BLE_HCI_OCF_LE_RD_ADV_CHAN_TXPWR), + ble_hs_test_util_exp_hci_status(i, cmd_fail_idx, hci_status), + {0}, + 1, + }; + i++; } + acks[i] = (struct ble_hs_test_util_phony_ack) { + BLE_HS_TEST_UTIL_LE_OPCODE(BLE_HCI_OCF_LE_SET_ADV_DATA), + ble_hs_test_util_exp_hci_status(i, cmd_fail_idx, hci_status), + }; + i++; + + memset(acks + i, 0, sizeof acks[i]); + ble_hs_test_util_set_ack_seq(acks); + rc = ble_gap_adv_set_fields(adv_fields); if (rc == 0 && auto_pwr) { /* Verify tx of set advertising params command. */ @@ -716,6 +730,47 @@ ble_hs_test_util_adv_set_fields(struct ble_hs_adv_fields *adv_fields, } int +ble_hs_test_util_adv_rsp_set_fields(const struct ble_hs_adv_fields *adv_fields, + int cmd_fail_idx, uint8_t hci_status) +{ + struct ble_hs_test_util_phony_ack acks[3]; + int auto_pwr; + int rc; + int i; + + auto_pwr = adv_fields->tx_pwr_lvl_is_present && + adv_fields->tx_pwr_lvl == BLE_HS_ADV_TX_PWR_LVL_AUTO; + + i = 0; + if (auto_pwr) { + acks[i] = (struct ble_hs_test_util_phony_ack) { + BLE_HS_TEST_UTIL_LE_OPCODE(BLE_HCI_OCF_LE_RD_ADV_CHAN_TXPWR), + ble_hs_test_util_exp_hci_status(i, cmd_fail_idx, hci_status), + {0}, + 1, + }; + i++; + } + + acks[i] = (struct ble_hs_test_util_phony_ack) { + BLE_HS_TEST_UTIL_LE_OPCODE(BLE_HCI_OCF_LE_SET_SCAN_RSP_DATA), + ble_hs_test_util_exp_hci_status(i, cmd_fail_idx, hci_status), + }; + i++; + + memset(acks + i, 0, sizeof acks[i]); + ble_hs_test_util_set_ack_seq(acks); + + rc = ble_gap_adv_rsp_set_fields(adv_fields); + if (rc == 0 && auto_pwr) { + /* Verify tx of set advertising params command. */ + ble_hs_test_util_verify_tx_rd_pwr(); + } + + return rc; +} + +int ble_hs_test_util_adv_start(uint8_t own_addr_type, uint8_t peer_addr_type, const uint8_t *peer_addr, const struct ble_gap_adv_params *adv_params, @@ -735,20 +790,6 @@ ble_hs_test_util_adv_start(uint8_t own_addr_type, }; i++; - if (adv_params->conn_mode != BLE_GAP_CONN_MODE_DIR) { - acks[i] = (struct ble_hs_test_util_phony_ack) { - BLE_HS_TEST_UTIL_LE_OPCODE(BLE_HCI_OCF_LE_SET_ADV_DATA), - ble_hs_test_util_exp_hci_status(i, fail_idx, fail_status), - }; - i++; - - acks[i] = (struct ble_hs_test_util_phony_ack) { - BLE_HS_TEST_UTIL_LE_OPCODE(BLE_HCI_OCF_LE_SET_SCAN_RSP_DATA), - ble_hs_test_util_exp_hci_status(i, fail_idx, fail_status), - }; - i++; - } - acks[i] = (struct ble_hs_test_util_phony_ack) { BLE_HS_TEST_UTIL_LE_OPCODE(BLE_HCI_OCF_LE_SET_ADV_ENABLE), ble_hs_test_util_exp_hci_status(i, fail_idx, fail_status), http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0fc206fb/net/nimble/host/test/src/ble_hs_test_util.h ---------------------------------------------------------------------- diff --git a/net/nimble/host/test/src/ble_hs_test_util.h b/net/nimble/host/test/src/ble_hs_test_util.h index 8f3d94e..041bb4d 100644 --- a/net/nimble/host/test/src/ble_hs_test_util.h +++ b/net/nimble/host/test/src/ble_hs_test_util.h @@ -122,8 +122,11 @@ int ble_hs_test_util_disc(uint8_t own_addr_type, int32_t duration_ms, int ble_hs_test_util_disc_cancel(uint8_t ack_status); void ble_hs_test_util_verify_tx_disconnect(uint16_t handle, uint8_t reason); void ble_hs_test_util_verify_tx_create_conn(const struct hci_create_conn *exp); -int ble_hs_test_util_adv_set_fields(struct ble_hs_adv_fields *adv_fields, - uint8_t hci_status); +int ble_hs_test_util_adv_set_fields(const struct ble_hs_adv_fields *adv_fields, + int cmd_fail_idx, uint8_t hci_status); +int ble_hs_test_util_adv_rsp_set_fields( + const struct ble_hs_adv_fields *adv_fields, + int cmd_fail_idx, uint8_t hci_status); int ble_hs_test_util_adv_start(uint8_t own_addr_type, uint8_t peer_addr_type, const uint8_t *peer_addr,