You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by cc...@apache.org on 2016/02/23 21:34:16 UTC

[2/2] incubator-mynewt-larva git commit: (MYNEWT-127) - rsp. data unit tests.

(MYNEWT-127) - rsp. data unit tests.


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/commit/0861b893
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/0861b893
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/0861b893

Branch: refs/heads/develop
Commit: 0861b893c9377af353db5bd0a96cff258de859d3
Parents: 9a91c32
Author: Christopher Collins <cc...@gmail.com>
Authored: Tue Feb 23 12:31:15 2016 -0800
Committer: Christopher Collins <cc...@gmail.com>
Committed: Tue Feb 23 12:33:53 2016 -0800

----------------------------------------------------------------------
 net/nimble/host/src/test/ble_hs_adv_test.c  | 899 ++++++++++++++++++++---
 net/nimble/host/src/test/ble_hs_test_util.c |  34 +-
 net/nimble/host/src/test/ble_hs_test_util.h |   2 +-
 3 files changed, 797 insertions(+), 138 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/0861b893/net/nimble/host/src/test/ble_hs_adv_test.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_hs_adv_test.c b/net/nimble/host/src/test/ble_hs_adv_test.c
index 6286c37..62b68f1 100644
--- a/net/nimble/host/src/test/ble_hs_adv_test.c
+++ b/net/nimble/host/src/test/ble_hs_adv_test.c
@@ -47,6 +47,24 @@ ble_hs_adv_test_misc_verify_tx_adv_data_hdr(int data_len)
 }
 
 static void
+ble_hs_adv_test_misc_verify_tx_rsp_data_hdr(int data_len)
+{
+    uint16_t opcode;
+    uint8_t *sptr;
+
+    TEST_ASSERT(ble_hs_test_util_prev_hci_tx != NULL);
+
+    sptr = ble_hs_test_util_prev_hci_tx;
+
+    opcode = le16toh(sptr + 0);
+    TEST_ASSERT(BLE_HCI_OGF(opcode) == BLE_HCI_OGF_LE);
+    TEST_ASSERT(BLE_HCI_OCF(opcode) == BLE_HCI_OCF_LE_SET_SCAN_RSP_DATA);
+
+    TEST_ASSERT(sptr[2] == data_len + 1);
+    TEST_ASSERT(sptr[3] == data_len);
+}
+
+static void
 ble_hs_adv_test_misc_verify_tx_field(int off, uint8_t type, uint8_t val_len,
                                      void *val)
 {
@@ -74,8 +92,10 @@ ble_hs_adv_test_misc_calc_data_len(struct ble_hs_adv_test_field *fields)
     int len;
 
     len = 0;
-    for (field = fields; field->type != 0; field++) {
-        len += 2 + field->val_len;
+    if (fields != NULL) {
+        for (field = fields; field->type != 0; field++) {
+            len += 2 + field->val_len;
+        }
     }
 
     return len;
@@ -95,19 +115,36 @@ ble_hs_adv_test_misc_verify_tx_fields(int off,
 }
 
 static void
-ble_hs_adv_test_misc_verify_tx_data(struct ble_hs_adv_test_field *fields)
+ble_hs_adv_test_misc_verify_tx_adv_data(struct ble_hs_adv_test_field *fields)
 {
     int data_len;
 
     data_len = ble_hs_adv_test_misc_calc_data_len(fields);
     ble_hs_adv_test_misc_verify_tx_adv_data_hdr(data_len);
-    ble_hs_adv_test_misc_verify_tx_fields(BLE_ADV_TEST_DATA_OFF, fields);
+    if (fields != NULL) {
+        ble_hs_adv_test_misc_verify_tx_fields(BLE_ADV_TEST_DATA_OFF, fields);
+    }
+}
+
+static void
+ble_hs_adv_test_misc_verify_tx_rsp_data(struct ble_hs_adv_test_field *fields)
+{
+    int data_len;
+
+    data_len = ble_hs_adv_test_misc_calc_data_len(fields);
+    ble_hs_adv_test_misc_verify_tx_rsp_data_hdr(data_len);
+    if (fields != NULL) {
+        ble_hs_adv_test_misc_verify_tx_fields(BLE_ADV_TEST_DATA_OFF, fields);
+    }
 }
 
 static void
 ble_hs_adv_test_misc_tx_and_verify_data(
-    uint8_t disc_mode, struct ble_hs_adv_fields *adv_fields,
-    struct ble_hs_adv_test_field *test_fields)
+    uint8_t disc_mode,
+    struct ble_hs_adv_fields *adv_fields,
+    struct ble_hs_adv_test_field *test_adv_fields,
+    struct ble_hs_adv_fields *rsp_fields,
+    struct ble_hs_adv_test_field *test_rsp_fields)
 {
     int rc;
 
@@ -116,22 +153,31 @@ ble_hs_adv_test_misc_tx_and_verify_data(
     rc = ble_gap_adv_set_fields(adv_fields);
     TEST_ASSERT_FATAL(rc == 0);
 
+    rc = ble_gap_adv_rsp_set_fields(rsp_fields);
+    TEST_ASSERT_FATAL(rc == 0);
+
     rc = ble_gap_adv_start(disc_mode, BLE_GAP_CONN_MODE_UND, NULL, 0, NULL,
                            NULL, NULL);
     TEST_ASSERT_FATAL(rc == 0);
 
-    ble_hs_test_util_rx_und_adv_acks_count(3);
-    ble_hs_adv_test_misc_verify_tx_data(test_fields);
+    ble_hs_test_util_rx_und_adv_acks_count(0, 3);
+    ble_hs_adv_test_misc_verify_tx_adv_data(test_adv_fields);
+
+    ble_hs_test_util_rx_und_adv_acks_count(3, 1);
+    ble_hs_adv_test_misc_verify_tx_rsp_data(test_rsp_fields);
 }
 
 TEST_CASE(ble_hs_adv_test_case_flags)
 {
-    struct ble_hs_adv_fields fields;
+    struct ble_hs_adv_fields adv_fields;
+    struct ble_hs_adv_fields rsp_fields;
 
-    memset(&fields, 0, sizeof fields);
+    memset(&adv_fields, 0, sizeof adv_fields);
+    memset(&rsp_fields, 0, sizeof rsp_fields);
 
     /* Default flags. */
-    ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &fields,
+    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,
@@ -144,10 +190,10 @@ TEST_CASE(ble_hs_adv_test_case_flags)
                 .val_len = 1,
             },
             { 0 },
-        });
+        }, &rsp_fields, NULL);
 
     /* Flags |= limited discoverable. */
-    ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_LTD, &fields,
+    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_FLAGS,
@@ -161,10 +207,10 @@ TEST_CASE(ble_hs_adv_test_case_flags)
                 .val_len = 1,
             },
             { 0 },
-        });
+        }, &rsp_fields, NULL);
 
     /* Flags = general discoverable. */
-    ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_GEN, &fields,
+    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_FLAGS,
@@ -178,20 +224,23 @@ TEST_CASE(ble_hs_adv_test_case_flags)
                 .val_len = 1,
             },
             { 0 },
-        });
+        }, &rsp_fields, NULL);
 }
 
 TEST_CASE(ble_hs_adv_test_case_user)
 {
-    struct ble_hs_adv_fields fields;
+    struct ble_hs_adv_fields adv_fields;
+    struct ble_hs_adv_fields rsp_fields;
+
+    memset(&rsp_fields, 0, sizeof rsp_fields);
 
     /*** Complete 16-bit service class UUIDs. */
-    memset(&fields, 0, sizeof fields);
-    fields.uuids16 = (uint16_t[]) { 0x0001, 0x1234, 0x54ab };
-    fields.num_uuids16 = 3;
-    fields.uuids16_is_complete = 1;
+    memset(&adv_fields, 0, sizeof adv_fields);
+    adv_fields.uuids16 = (uint16_t[]) { 0x0001, 0x1234, 0x54ab };
+    adv_fields.num_uuids16 = 3;
+    adv_fields.uuids16_is_complete = 1;
 
-    ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &fields,
+    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_COMP_UUIDS16,
@@ -209,15 +258,15 @@ TEST_CASE(ble_hs_adv_test_case_user)
                 .val_len = 1,
             },
             { 0 },
-        });
+        }, &rsp_fields, NULL);
 
     /*** Incomplete 16-bit service class UUIDs. */
-    memset(&fields, 0, sizeof fields);
-    fields.uuids16 = (uint16_t[]) { 0x0001, 0x1234, 0x54ab };
-    fields.num_uuids16 = 3;
-    fields.uuids16_is_complete = 0;
+    memset(&adv_fields, 0, sizeof adv_fields);
+    adv_fields.uuids16 = (uint16_t[]) { 0x0001, 0x1234, 0x54ab };
+    adv_fields.num_uuids16 = 3;
+    adv_fields.uuids16_is_complete = 0;
 
-    ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &fields,
+    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_INCOMP_UUIDS16,
@@ -235,15 +284,15 @@ TEST_CASE(ble_hs_adv_test_case_user)
                 .val_len = 1,
             },
             { 0 },
-        });
+        }, &rsp_fields, NULL);
 
     /*** Complete 32-bit service class UUIDs. */
-    memset(&fields, 0, sizeof fields);
-    fields.uuids32 = (uint32_t[]) { 0x12345678, 0xabacadae };
-    fields.num_uuids32 = 2;
-    fields.uuids32_is_complete = 1;
+    memset(&adv_fields, 0, sizeof adv_fields);
+    adv_fields.uuids32 = (uint32_t[]) { 0x12345678, 0xabacadae };
+    adv_fields.num_uuids32 = 2;
+    adv_fields.uuids32_is_complete = 1;
 
-    ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &fields,
+    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_COMP_UUIDS32,
@@ -261,15 +310,15 @@ TEST_CASE(ble_hs_adv_test_case_user)
                 .val_len = 1,
             },
             { 0 },
-        });
+        }, &rsp_fields, NULL);
 
     /*** Incomplete 32-bit service class UUIDs. */
-    memset(&fields, 0, sizeof fields);
-    fields.uuids32 = (uint32_t[]) { 0x12345678, 0xabacadae };
-    fields.num_uuids32 = 2;
-    fields.uuids32_is_complete = 0;
+    memset(&adv_fields, 0, sizeof adv_fields);
+    adv_fields.uuids32 = (uint32_t[]) { 0x12345678, 0xabacadae };
+    adv_fields.num_uuids32 = 2;
+    adv_fields.uuids32_is_complete = 0;
 
-    ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &fields,
+    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_INCOMP_UUIDS32,
@@ -287,18 +336,18 @@ TEST_CASE(ble_hs_adv_test_case_user)
                 .val_len = 1,
             },
             { 0 },
-        });
+        }, &rsp_fields, NULL);
 
     /*** Complete 128-bit service class UUIDs. */
-    memset(&fields, 0, sizeof fields);
-    fields.uuids128 = (uint8_t[]) {
+    memset(&adv_fields, 0, sizeof adv_fields);
+    adv_fields.uuids128 = (uint8_t[]) {
         0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
         0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
     };
-    fields.num_uuids128 = 1;
-    fields.uuids128_is_complete = 1;
+    adv_fields.num_uuids128 = 1;
+    adv_fields.uuids128_is_complete = 1;
 
-    ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &fields,
+    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_COMP_UUIDS128,
@@ -319,18 +368,18 @@ TEST_CASE(ble_hs_adv_test_case_user)
                 .val_len = 1,
             },
             { 0 },
-        });
+        }, &rsp_fields, NULL);
 
     /*** Incomplete 128-bit service class UUIDs. */
-    memset(&fields, 0, sizeof fields);
-    fields.uuids128 = (uint8_t[]) {
+    memset(&adv_fields, 0, sizeof adv_fields);
+    adv_fields.uuids128 = (uint8_t[]) {
         0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
         0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
     };
-    fields.num_uuids128 = 1;
-    fields.uuids128_is_complete = 0;
+    adv_fields.num_uuids128 = 1;
+    adv_fields.uuids128_is_complete = 0;
 
-    ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &fields,
+    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_INCOMP_UUIDS128,
@@ -351,15 +400,15 @@ TEST_CASE(ble_hs_adv_test_case_user)
                 .val_len = 1,
             },
             { 0 },
-        });
+        }, &rsp_fields, NULL);
 
     /*** Complete name. */
-    memset(&fields, 0, sizeof fields);
-    fields.name = (uint8_t *)"myname";
-    fields.name_len = 6;
-    fields.name_is_complete = 1;
+    memset(&adv_fields, 0, sizeof adv_fields);
+    adv_fields.name = (uint8_t *)"myname";
+    adv_fields.name_len = 6;
+    adv_fields.name_is_complete = 1;
 
-    ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &fields,
+    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_COMP_NAME,
@@ -377,15 +426,15 @@ TEST_CASE(ble_hs_adv_test_case_user)
                 .val_len = 1,
             },
             { 0 },
-        });
+        }, &rsp_fields, NULL);
 
     /*** Incomplete name. */
-    memset(&fields, 0, sizeof fields);
-    fields.name = (uint8_t *)"myname";
-    fields.name_len = 6;
-    fields.name_is_complete = 0;
+    memset(&adv_fields, 0, sizeof adv_fields);
+    adv_fields.name = (uint8_t *)"myname";
+    adv_fields.name_len = 6;
+    adv_fields.name_is_complete = 0;
 
-    ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &fields,
+    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_INCOMP_NAME,
@@ -403,13 +452,13 @@ TEST_CASE(ble_hs_adv_test_case_user)
                 .val_len = 1,
             },
             { 0 },
-        });
+        }, &rsp_fields, NULL);
 
     /*** Class of device. */
-    memset(&fields, 0, sizeof fields);
-    fields.device_class = (uint8_t[]){ 1,2,3 };
+    memset(&adv_fields, 0, sizeof adv_fields);
+    adv_fields.device_class = (uint8_t[]){ 1,2,3 };
 
-    ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &fields,
+    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_DEVICE_CLASS,
@@ -427,13 +476,13 @@ TEST_CASE(ble_hs_adv_test_case_user)
                 .val_len = 1,
             },
             { 0 },
-        });
+        }, &rsp_fields, NULL);
 
     /*** Slave interval range. */
-    memset(&fields, 0, sizeof fields);
-    fields.slave_itvl_range = (uint8_t[]){ 1,2,3,4 };
+    memset(&adv_fields, 0, sizeof adv_fields);
+    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, &fields,
+    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_SLAVE_ITVL_RANGE,
@@ -451,14 +500,14 @@ TEST_CASE(ble_hs_adv_test_case_user)
                 .val_len = 1,
             },
             { 0 },
-        });
+        }, &rsp_fields, NULL);
 
     /*** 0x16 - Service data - 16-bit UUID. */
-    memset(&fields, 0, sizeof fields);
-    fields.svc_data_uuid16 = (uint8_t[]){ 1,2,3,4 };
-    fields.svc_data_uuid16_len = 4;
+    memset(&adv_fields, 0, sizeof adv_fields);
+    adv_fields.svc_data_uuid16 = (uint8_t[]){ 1,2,3,4 };
+    adv_fields.svc_data_uuid16_len = 4;
 
-    ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &fields,
+    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_SVC_DATA_UUID16,
@@ -476,14 +525,14 @@ TEST_CASE(ble_hs_adv_test_case_user)
                 .val_len = 1,
             },
             { 0 },
-        });
+        }, &rsp_fields, NULL);
 
     /*** 0x17 - Public target address. */
-    memset(&fields, 0, sizeof fields);
-    fields.public_tgt_addr = (uint8_t[]){ 1,2,3,4,5,6, 6,5,4,3,2,1 };
-    fields.num_public_tgt_addrs = 2;
+    memset(&adv_fields, 0, sizeof adv_fields);
+    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;
 
-    ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &fields,
+    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_PUBLIC_TGT_ADDR,
@@ -501,14 +550,14 @@ TEST_CASE(ble_hs_adv_test_case_user)
                 .val_len = 1,
             },
             { 0 },
-        });
+        }, &rsp_fields, NULL);
 
     /*** 0x19 - Appearance. */
-    memset(&fields, 0, sizeof fields);
-    fields.appearance = 0x1234;
-    fields.appearance_is_present = 1;
+    memset(&adv_fields, 0, sizeof adv_fields);
+    adv_fields.appearance = 0x1234;
+    adv_fields.appearance_is_present = 1;
 
-    ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &fields,
+    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_APPEARANCE,
@@ -526,14 +575,14 @@ TEST_CASE(ble_hs_adv_test_case_user)
                 .val_len = 1,
             },
             { 0 },
-        });
+        }, &rsp_fields, NULL);
 
     /*** 0x1a - Advertising interval. */
-    memset(&fields, 0, sizeof fields);
-    fields.adv_itvl = 0x1234;
-    fields.adv_itvl_is_present = 1;
+    memset(&adv_fields, 0, sizeof adv_fields);
+    adv_fields.adv_itvl = 0x1234;
+    adv_fields.adv_itvl_is_present = 1;
 
-    ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &fields,
+    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_ADV_ITVL,
@@ -551,13 +600,13 @@ TEST_CASE(ble_hs_adv_test_case_user)
                 .val_len = 1,
             },
             { 0 },
-        });
+        }, &rsp_fields, NULL);
 
     /*** 0x1b - LE bluetooth device address. */
-    memset(&fields, 0, sizeof fields);
-    fields.le_addr = (uint8_t[]){ 1,2,3,4,5,6,7 };
+    memset(&adv_fields, 0, sizeof adv_fields);
+    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, &fields,
+    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_LE_ADDR,
@@ -575,14 +624,14 @@ TEST_CASE(ble_hs_adv_test_case_user)
                 .val_len = 1,
             },
             { 0 },
-        });
+        }, &rsp_fields, NULL);
 
     /*** 0x1c - LE role. */
-    memset(&fields, 0, sizeof fields);
-    fields.le_role = BLE_HS_ADV_LE_ROLE_BOTH_PERIPH_PREF;
-    fields.le_role_is_present = 1;
+    memset(&adv_fields, 0, sizeof adv_fields);
+    adv_fields.le_role = BLE_HS_ADV_LE_ROLE_BOTH_PERIPH_PREF;
+    adv_fields.le_role_is_present = 1;
 
-    ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &fields,
+    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_LE_ROLE,
@@ -600,14 +649,14 @@ TEST_CASE(ble_hs_adv_test_case_user)
                 .val_len = 1,
             },
             { 0 },
-        });
+        }, &rsp_fields, NULL);
 
     /*** 0x20 - Service data - 32-bit UUID. */
-    memset(&fields, 0, sizeof fields);
-    fields.svc_data_uuid32 = (uint8_t[]){ 1,2,3,4,5 };
-    fields.svc_data_uuid32_len = 5;
+    memset(&adv_fields, 0, sizeof adv_fields);
+    adv_fields.svc_data_uuid32 = (uint8_t[]){ 1,2,3,4,5 };
+    adv_fields.svc_data_uuid32_len = 5;
 
-    ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &fields,
+    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_SVC_DATA_UUID32,
@@ -625,15 +674,15 @@ TEST_CASE(ble_hs_adv_test_case_user)
                 .val_len = 1,
             },
             { 0 },
-        });
+        }, &rsp_fields, NULL);
 
     /*** 0x21 - Service data - 128-bit UUID. */
-    memset(&fields, 0, sizeof fields);
-    fields.svc_data_uuid128 =
+    memset(&adv_fields, 0, sizeof adv_fields);
+    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 };
-    fields.svc_data_uuid128_len = 18;
+    adv_fields.svc_data_uuid128_len = 18;
 
-    ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &fields,
+    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_SVC_DATA_UUID128,
@@ -652,14 +701,14 @@ TEST_CASE(ble_hs_adv_test_case_user)
                 .val_len = 1,
             },
             { 0 },
-        });
+        }, &rsp_fields, NULL);
 
     /*** 0x24 - URI. */
-    memset(&fields, 0, sizeof fields);
-    fields.uri = (uint8_t[]){ 1,2,3,4 };
-    fields.uri_len = 4;
+    memset(&adv_fields, 0, sizeof adv_fields);
+    adv_fields.uri = (uint8_t[]){ 1,2,3,4 };
+    adv_fields.uri_len = 4;
 
-    ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &fields,
+    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_URI,
@@ -677,14 +726,14 @@ TEST_CASE(ble_hs_adv_test_case_user)
                 .val_len = 1,
             },
             { 0 },
-        });
+        }, &rsp_fields, NULL);
 
     /*** 0xff - Manufacturer specific data. */
-    memset(&fields, 0, sizeof fields);
-    fields.mfg_data = (uint8_t[]){ 1,2,3,4 };
-    fields.mfg_data_len = 4;
+    memset(&adv_fields, 0, sizeof adv_fields);
+    adv_fields.mfg_data = (uint8_t[]){ 1,2,3,4 };
+    adv_fields.mfg_data_len = 4;
 
-    ble_hs_adv_test_misc_tx_and_verify_data(BLE_GAP_DISC_MODE_NON, &fields,
+    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_MFG_DATA,
@@ -702,6 +751,613 @@ TEST_CASE(ble_hs_adv_test_case_user)
                 .val_len = 1,
             },
             { 0 },
+        }, &rsp_fields, NULL);
+}
+
+TEST_CASE(ble_hs_adv_test_case_user_rsp)
+{
+    struct ble_hs_adv_fields rsp_fields;
+    struct ble_hs_adv_fields adv_fields;
+
+    memset(&adv_fields, 0, sizeof adv_fields);
+
+    /*** Complete 16-bit service class UUIDs. */
+    memset(&rsp_fields, 0, sizeof rsp_fields);
+    rsp_fields.uuids16 = (uint16_t[]) { 0x0001, 0x1234, 0x54ab };
+    rsp_fields.num_uuids16 = 3;
+    rsp_fields.uuids16_is_complete = 1;
+
+    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[]){ 0x00 },
+                .val_len = 1,
+            },
+            { 0 },
+        },
+        &rsp_fields,
+        (struct ble_hs_adv_test_field[]) {
+            {
+                .type = BLE_HS_ADV_TYPE_COMP_UUIDS16,
+                .val = (uint8_t[]) { 0x01, 0x00, 0x34, 0x12, 0xab, 0x54 },
+                .val_len = 6,
+            },
+            { 0 },
+        });
+
+    /*** Incomplete 16-bit service class UUIDs. */
+    memset(&rsp_fields, 0, sizeof rsp_fields);
+    rsp_fields.uuids16 = (uint16_t[]) { 0x0001, 0x1234, 0x54ab };
+    rsp_fields.num_uuids16 = 3;
+    rsp_fields.uuids16_is_complete = 0;
+
+    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[]){ 0x00 },
+                .val_len = 1,
+            },
+            { 0 },
+        },
+        &rsp_fields,
+        (struct ble_hs_adv_test_field[]) {
+            {
+                .type = BLE_HS_ADV_TYPE_INCOMP_UUIDS16,
+                .val = (uint8_t[]) { 0x01, 0x00, 0x34, 0x12, 0xab, 0x54 },
+                .val_len = 6,
+            },
+            { 0 },
+        });
+
+    /*** Complete 32-bit service class UUIDs. */
+    memset(&rsp_fields, 0, sizeof rsp_fields);
+    rsp_fields.uuids32 = (uint32_t[]) { 0x12345678, 0xabacadae };
+    rsp_fields.num_uuids32 = 2;
+    rsp_fields.uuids32_is_complete = 1;
+
+    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[]){ 0x00 },
+                .val_len = 1,
+            },
+            { 0 },
+        },
+        &rsp_fields,
+        (struct ble_hs_adv_test_field[]) {
+            {
+                .type = BLE_HS_ADV_TYPE_COMP_UUIDS32,
+                .val = (uint8_t[]) { 0x78,0x56,0x34,0x12,0xae,0xad,0xac,0xab },
+                .val_len = 8,
+            },
+            { 0 },
+        });
+
+    /*** Incomplete 32-bit service class UUIDs. */
+    memset(&rsp_fields, 0, sizeof rsp_fields);
+    rsp_fields.uuids32 = (uint32_t[]) { 0x12345678, 0xabacadae };
+    rsp_fields.num_uuids32 = 2;
+    rsp_fields.uuids32_is_complete = 0;
+
+    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[]){ 0x00 },
+                .val_len = 1,
+            },
+            { 0 },
+        },
+        &rsp_fields,
+        (struct ble_hs_adv_test_field[]) {
+            {
+                .type = BLE_HS_ADV_TYPE_INCOMP_UUIDS32,
+                .val = (uint8_t[]) { 0x78,0x56,0x34,0x12,0xae,0xad,0xac,0xab },
+                .val_len = 8,
+            },
+            { 0 },
+        });
+
+    /*** Complete 128-bit service class UUIDs. */
+    memset(&rsp_fields, 0, sizeof rsp_fields);
+    rsp_fields.uuids128 = (uint8_t[]) {
+        0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+        0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
+    };
+    rsp_fields.num_uuids128 = 1;
+    rsp_fields.uuids128_is_complete = 1;
+
+    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[]){ 0x00 },
+                .val_len = 1,
+            },
+            { 0 },
+        },
+        &rsp_fields,
+        (struct ble_hs_adv_test_field[]) {
+            {
+                .type = BLE_HS_ADV_TYPE_COMP_UUIDS128,
+                .val = (uint8_t[]) {
+                    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+                    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
+                },
+                .val_len = 16,
+            },
+            { 0 },
+        });
+
+    /*** Incomplete 128-bit service class UUIDs. */
+    memset(&rsp_fields, 0, sizeof rsp_fields);
+    rsp_fields.uuids128 = (uint8_t[]) {
+        0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+        0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
+    };
+    rsp_fields.num_uuids128 = 1;
+    rsp_fields.uuids128_is_complete = 0;
+
+    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[]){ 0x00 },
+                .val_len = 1,
+            },
+            { 0 },
+        },
+        &rsp_fields,
+        (struct ble_hs_adv_test_field[]) {
+            {
+                .type = BLE_HS_ADV_TYPE_INCOMP_UUIDS128,
+                .val = (uint8_t[]) {
+                    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+                    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
+                },
+                .val_len = 16,
+            },
+            { 0 },
+        });
+
+    /*** Complete name. */
+    memset(&rsp_fields, 0, sizeof rsp_fields);
+    rsp_fields.name = (uint8_t *)"myname";
+    rsp_fields.name_len = 6;
+    rsp_fields.name_is_complete = 1;
+
+    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[]){ 0x00 },
+                .val_len = 1,
+            },
+            { 0 },
+        },
+        &rsp_fields,
+        (struct ble_hs_adv_test_field[]) {
+            {
+                .type = BLE_HS_ADV_TYPE_COMP_NAME,
+                .val = (uint8_t*)"myname",
+                .val_len = 6,
+            },
+            { 0 },
+        });
+
+    /*** Incomplete name. */
+    memset(&rsp_fields, 0, sizeof rsp_fields);
+    rsp_fields.name = (uint8_t *)"myname";
+    rsp_fields.name_len = 6;
+    rsp_fields.name_is_complete = 0;
+
+    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[]){ 0x00 },
+                .val_len = 1,
+            },
+            { 0 },
+        },
+        &rsp_fields,
+        (struct ble_hs_adv_test_field[]) {
+            {
+                .type = BLE_HS_ADV_TYPE_INCOMP_NAME,
+                .val = (uint8_t*)"myname",
+                .val_len = 6,
+            },
+            { 0 },
+        });
+
+    /*** Class of device. */
+    memset(&rsp_fields, 0, sizeof rsp_fields);
+    rsp_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[]){ 0x00 },
+                .val_len = 1,
+            },
+            { 0 },
+        },
+        &rsp_fields,
+        (struct ble_hs_adv_test_field[]) {
+            {
+                .type = BLE_HS_ADV_TYPE_DEVICE_CLASS,
+                .val = (uint8_t[]) { 1,2,3 },
+                .val_len = BLE_HS_ADV_DEVICE_CLASS_LEN,
+            },
+            { 0 },
+        });
+
+    /*** Slave interval range. */
+    memset(&rsp_fields, 0, sizeof rsp_fields);
+    rsp_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[]){ 0x00 },
+                .val_len = 1,
+            },
+            { 0 },
+        },
+        &rsp_fields,
+        (struct ble_hs_adv_test_field[]) {
+            {
+                .type = BLE_HS_ADV_TYPE_SLAVE_ITVL_RANGE,
+                .val = (uint8_t[]) { 1,2,3,4 },
+                .val_len = BLE_HS_ADV_SLAVE_ITVL_RANGE_LEN,
+            },
+            { 0 },
+        });
+
+    /*** 0x16 - Service data - 16-bit UUID. */
+    memset(&rsp_fields, 0, sizeof rsp_fields);
+    rsp_fields.svc_data_uuid16 = (uint8_t[]){ 1,2,3,4 };
+    rsp_fields.svc_data_uuid16_len = 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[]){ 0x00 },
+                .val_len = 1,
+            },
+            { 0 },
+        },
+        &rsp_fields,
+        (struct ble_hs_adv_test_field[]) {
+            {
+                .type = BLE_HS_ADV_TYPE_SVC_DATA_UUID16,
+                .val = (uint8_t[]) { 1,2,3,4 },
+                .val_len = 4,
+            },
+            { 0 },
+        });
+
+    /*** 0x17 - Public target address. */
+    memset(&rsp_fields, 0, sizeof rsp_fields);
+    rsp_fields.public_tgt_addr = (uint8_t[]){ 1,2,3,4,5,6, 6,5,4,3,2,1 };
+    rsp_fields.num_public_tgt_addrs = 2;
+
+    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[]){ 0x00 },
+                .val_len = 1,
+            },
+            { 0 },
+        },
+        &rsp_fields,
+        (struct ble_hs_adv_test_field[]) {
+            {
+                .type = BLE_HS_ADV_TYPE_PUBLIC_TGT_ADDR,
+                .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,
+            },
+            { 0 },
+        });
+
+    /*** 0x19 - Appearance. */
+    memset(&rsp_fields, 0, sizeof rsp_fields);
+    rsp_fields.appearance = 0x1234;
+    rsp_fields.appearance_is_present = 1;
+
+    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[]){ 0x00 },
+                .val_len = 1,
+            },
+            { 0 },
+        },
+        &rsp_fields,
+        (struct ble_hs_adv_test_field[]) {
+            {
+                .type = BLE_HS_ADV_TYPE_APPEARANCE,
+                .val = (uint8_t[]){ 0x34, 0x12 },
+                .val_len = BLE_HS_ADV_APPEARANCE_LEN,
+            },
+            { 0 },
+        });
+
+    /*** 0x1a - Advertising interval. */
+    memset(&rsp_fields, 0, sizeof rsp_fields);
+    rsp_fields.adv_itvl = 0x1234;
+    rsp_fields.adv_itvl_is_present = 1;
+
+    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[]){ 0x00 },
+                .val_len = 1,
+            },
+            { 0 },
+        },
+        &rsp_fields,
+        (struct ble_hs_adv_test_field[]) {
+            {
+                .type = BLE_HS_ADV_TYPE_ADV_ITVL,
+                .val = (uint8_t[]){ 0x34, 0x12 },
+                .val_len = BLE_HS_ADV_ADV_ITVL_LEN,
+            },
+            { 0 },
+        });
+
+    /*** 0x1b - LE bluetooth device address. */
+    memset(&rsp_fields, 0, sizeof rsp_fields);
+    rsp_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[]){ 0x00 },
+                .val_len = 1,
+            },
+            { 0 },
+        },
+        &rsp_fields,
+        (struct ble_hs_adv_test_field[]) {
+            {
+                .type = BLE_HS_ADV_TYPE_LE_ADDR,
+                .val = (uint8_t[]) { 1,2,3,4,5,6,7 },
+                .val_len = BLE_HS_ADV_LE_ADDR_LEN,
+            },
+            { 0 },
+        });
+
+    /*** 0x1c - LE role. */
+    memset(&rsp_fields, 0, sizeof rsp_fields);
+    rsp_fields.le_role = BLE_HS_ADV_LE_ROLE_BOTH_PERIPH_PREF;
+    rsp_fields.le_role_is_present = 1;
+
+    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[]){ 0x00 },
+                .val_len = 1,
+            },
+            { 0 },
+        },
+        &rsp_fields,
+        (struct ble_hs_adv_test_field[]) {
+            {
+                .type = BLE_HS_ADV_TYPE_LE_ROLE,
+                .val = (uint8_t[]) { BLE_HS_ADV_LE_ROLE_BOTH_PERIPH_PREF },
+                .val_len = 1,
+            },
+            { 0 },
+        });
+
+    /*** 0x20 - Service data - 32-bit UUID. */
+    memset(&rsp_fields, 0, sizeof rsp_fields);
+    rsp_fields.svc_data_uuid32 = (uint8_t[]){ 1,2,3,4,5 };
+    rsp_fields.svc_data_uuid32_len = 5;
+
+    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[]){ 0x00 },
+                .val_len = 1,
+            },
+            { 0 },
+        },
+        &rsp_fields,
+        (struct ble_hs_adv_test_field[]) {
+            {
+                .type = BLE_HS_ADV_TYPE_SVC_DATA_UUID32,
+                .val = (uint8_t[]) { 1,2,3,4,5 },
+                .val_len = 5,
+            },
+            { 0 },
+        });
+
+    /*** 0x21 - Service data - 128-bit UUID. */
+    memset(&rsp_fields, 0, sizeof rsp_fields);
+    rsp_fields.svc_data_uuid128 =
+        (uint8_t[]){ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 };
+    rsp_fields.svc_data_uuid128_len = 18;
+
+    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[]){ 0x00 },
+                .val_len = 1,
+            },
+            { 0 },
+        },
+        &rsp_fields,
+        (struct ble_hs_adv_test_field[]) {
+            {
+                .type = BLE_HS_ADV_TYPE_SVC_DATA_UUID128,
+                .val = (uint8_t[]){ 1,2,3,4,5,6,7,8,9,10,
+                                    11,12,13,14,15,16,17,18 },
+                .val_len = 18,
+            },
+            { 0 },
+        });
+
+    /*** 0x24 - URI. */
+    memset(&rsp_fields, 0, sizeof rsp_fields);
+    rsp_fields.uri = (uint8_t[]){ 1,2,3,4 };
+    rsp_fields.uri_len = 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[]){ 0x00 },
+                .val_len = 1,
+            },
+            { 0 },
+        },
+        &rsp_fields,
+        (struct ble_hs_adv_test_field[]) {
+            {
+                .type = BLE_HS_ADV_TYPE_URI,
+                .val = (uint8_t[]) { 1,2,3,4 },
+                .val_len = 4,
+            },
+            { 0 },
+        });
+
+    /*** 0xff - Manufacturer specific data. */
+    memset(&rsp_fields, 0, sizeof rsp_fields);
+    rsp_fields.mfg_data = (uint8_t[]){ 1,2,3,4 };
+    rsp_fields.mfg_data_len = 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[]){ 0x00 },
+                .val_len = 1,
+            },
+            { 0 },
+        },
+        &rsp_fields,
+        (struct ble_hs_adv_test_field[]) {
+            {
+                .type = BLE_HS_ADV_TYPE_MFG_DATA,
+                .val = (uint8_t[]) { 1,2,3,4 },
+                .val_len = 4,
+            },
+            { 0 },
         });
 }
 
@@ -709,6 +1365,7 @@ TEST_SUITE(ble_hs_adv_test_suite)
 {
     ble_hs_adv_test_case_flags();
     ble_hs_adv_test_case_user();
+    ble_hs_adv_test_case_user_rsp();
 }
 
 int

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/0861b893/net/nimble/host/src/test/ble_hs_test_util.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_hs_test_util.c b/net/nimble/host/src/test/ble_hs_test_util.c
index ffe73fa..642df70 100644
--- a/net/nimble/host/src/test/ble_hs_test_util.c
+++ b/net/nimble/host/src/test/ble_hs_test_util.c
@@ -298,62 +298,64 @@ ble_hs_test_util_rx_num_completed_pkts_event(
 }
 
 void
-ble_hs_test_util_rx_und_adv_acks_count(int count)
+ble_hs_test_util_rx_und_adv_acks_count(int start, int count)
 {
-    if (count > 0) {
+    int end;
+    int i;
+
+    i = 0;
+    end = start + count;
+
+    if (i >= start && i < end) {
         /* Receive set-adv-params ack. */
         ble_hci_sched_wakeup();
         ble_hs_test_util_rx_le_ack(BLE_HCI_OCF_LE_SET_ADV_PARAMS,
                                    BLE_ERR_SUCCESS);
         TEST_ASSERT(ble_gap_slave_in_progress());
-
-        count--;
     }
+    i++;
 
-    if (count > 0) {
+    if (i >= start && i < end) {
         /* Receive read-power-level ack. */
         ble_hci_sched_wakeup();
         ble_hs_test_util_rx_le_ack_param(BLE_HCI_OCF_LE_RD_ADV_CHAN_TXPWR,
                                          BLE_ERR_SUCCESS, (uint8_t[]){0}, 1);
         TEST_ASSERT(ble_gap_slave_in_progress());
-
-        count--;
     }
+    i++;
 
-    if (count > 0) {
+    if (i >= start && i < end) {
         /* Receive set-adv-data ack. */
         ble_hci_sched_wakeup();
         ble_hs_test_util_rx_le_ack(BLE_HCI_OCF_LE_SET_ADV_DATA,
                                    BLE_ERR_SUCCESS);
         TEST_ASSERT(ble_gap_slave_in_progress());
-
-        count--;
     }
+    i++;
 
-    if (count > 0) {
+    if (i >= start && i < end) {
         /* Receive set-scan-response-data ack. */
         ble_hci_sched_wakeup();
         ble_hs_test_util_rx_le_ack(BLE_HCI_OCF_LE_SET_SCAN_RSP_DATA,
                                    BLE_ERR_SUCCESS);
         TEST_ASSERT(ble_gap_slave_in_progress());
-
-        count--;
     }
+    i++;
 
-    if (count > 0) {
+    if (i >= start && i < end) {
         /* Receive set-adv-enable ack. */
         ble_hci_sched_wakeup();
         ble_hs_test_util_rx_le_ack(BLE_HCI_OCF_LE_SET_ADV_ENABLE,
                                    BLE_ERR_SUCCESS);
         TEST_ASSERT(ble_gap_slave_in_progress());
-        count--;
     }
+    i++;
 }
 
 void
 ble_hs_test_util_rx_und_adv_acks(void)
 {
-    ble_hs_test_util_rx_und_adv_acks_count(5);
+    ble_hs_test_util_rx_und_adv_acks_count(0, 5);
 }
 
 void

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/0861b893/net/nimble/host/src/test/ble_hs_test_util.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_hs_test_util.h b/net/nimble/host/src/test/ble_hs_test_util.h
index a6f2b54..1b9b44b 100644
--- a/net/nimble/host/src/test/ble_hs_test_util.h
+++ b/net/nimble/host/src/test/ble_hs_test_util.h
@@ -63,7 +63,7 @@ void ble_hs_test_util_rx_startup_acks(void);
 void ble_hs_test_util_rx_num_completed_pkts_event(
     struct ble_hs_test_util_num_completed_pkts_entry *entries);
 void ble_hs_test_util_rx_und_adv_acks(void);
-void ble_hs_test_util_rx_und_adv_acks_count(int count);
+void ble_hs_test_util_rx_und_adv_acks_count(int start, int count);
 void ble_hs_test_util_rx_dir_adv_acks(void);
 uint8_t *ble_hs_test_util_verify_tx_hci(uint8_t ogf, uint16_t ocf,
                                         uint8_t *out_param_len);