You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ma...@apache.org on 2016/04/28 02:14:07 UTC

[08/50] [abbrv] incubator-mynewt-core git commit: ble host - major changes.

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e32f9f9f/net/nimble/host/src/test/ble_gap_test.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_gap_test.c b/net/nimble/host/src/test/ble_gap_test.c
index 85b630f..7da3d3f 100644
--- a/net/nimble/host/src/test/ble_gap_test.c
+++ b/net/nimble/host/src/test/ble_gap_test.c
@@ -110,27 +110,6 @@ ble_gap_test_util_connect_cb(int event, int status,
     return 0;
 }
 
-static int
-ble_gap_test_util_rx_hci_ack(int *cmd_idx, int cmd_fail_idx,
-                             uint8_t ogf, uint16_t ocf, uint8_t fail_status)
-{
-    uint16_t opcode;
-    int cur_idx;
-
-    opcode = (ogf << 10) | ocf;
-
-    cur_idx = *cmd_idx;
-    (*cmd_idx)++;
-
-    if (cur_idx == cmd_fail_idx) {
-        ble_hs_test_util_rx_ack(opcode, fail_status);
-        return 1;
-    } else {
-        ble_hs_test_util_rx_ack(opcode, 0);
-        return 0;
-    }
-}
-
 static void
 ble_gap_test_util_verify_tx_clear_wl(void)
 {
@@ -364,10 +343,14 @@ ble_gap_test_util_rx_update_complete(
     ble_gap_rx_update_complete(&evt);
 }
 
-static void
-ble_gap_test_util_rx_param_req(struct ble_gap_upd_params *params)
+static int
+ble_gap_test_util_rx_param_req(struct ble_gap_upd_params *params, int pos,
+                               int *cmd_idx, int cmd_fail_idx,
+                               uint8_t fail_status)
 {
     struct hci_le_conn_param_req evt;
+    uint16_t opcode;
+    uint8_t hci_status;
 
     evt.subevent_code = BLE_HCI_LE_SUBEV_REM_CONN_PARM_REQ;
     evt.connection_handle = 2;
@@ -375,8 +358,25 @@ ble_gap_test_util_rx_param_req(struct ble_gap_upd_params *params)
     evt.itvl_max = params->itvl_max;
     evt.latency = params->latency;
     evt.timeout = params->supervision_timeout;
+ 
+    if (pos) {
+        opcode = host_hci_opcode_join(BLE_HCI_OGF_LE,
+                                      BLE_HCI_OCF_LE_REM_CONN_PARAM_RR);
+    } else {
+        opcode = host_hci_opcode_join(BLE_HCI_OGF_LE,
+                                      BLE_HCI_OCF_LE_REM_CONN_PARAM_NRR);
+    }
+    if (*cmd_idx == cmd_fail_idx) {
+        hci_status = fail_status;
+    } else {
+        hci_status = 0;
+    }
+    (*cmd_idx)++;
 
+    ble_hs_test_util_set_ack(opcode, hci_status);
     ble_gap_rx_param_req(&evt);
+
+    return hci_status;
 }
 
 /*****************************************************************************
@@ -521,7 +521,6 @@ ble_gap_test_util_disc(uint8_t disc_mode, uint8_t *peer_addr,
 
     if (cmd_fail_idx > 1) {
         /* Verify tx of scan enable command. */
-        ble_hci_sched_wakeup();
         ble_gap_test_util_verify_tx_scan_enable(1);
     }
 
@@ -576,7 +575,15 @@ TEST_CASE(ble_gap_test_case_conn_disc_good)
         ble_gap_test_util_disc(d, peer_addr, &adv, -1, 0);
 
         TEST_ASSERT(ble_gap_master_in_progress());
-        TEST_ASSERT(ble_gap_test_disc_event == -1);
+        TEST_ASSERT(ble_gap_test_disc_event == BLE_GAP_EVENT_DISC_SUCCESS);
+        TEST_ASSERT(ble_gap_test_disc_status == 0);
+        TEST_ASSERT(ble_gap_test_disc_desc.event_type ==
+                    BLE_HCI_ADV_TYPE_ADV_IND);
+        TEST_ASSERT(ble_gap_test_disc_desc.addr_type == BLE_ADDR_TYPE_PUBLIC);
+        TEST_ASSERT(ble_gap_test_disc_desc.length_data == 3);
+        TEST_ASSERT(ble_gap_test_disc_desc.rssi == 0);
+        TEST_ASSERT(memcmp(ble_gap_test_disc_desc.addr, adv.addr, 6) == 0);
+        TEST_ASSERT(ble_gap_test_disc_arg == NULL);
     }
 }
 
@@ -706,51 +713,10 @@ TEST_CASE(ble_gap_test_case_conn_dir_bad_args)
     TEST_ASSERT(rc == BLE_HS_EALREADY);
 }
 
-TEST_CASE(ble_gap_test_case_conn_dir_bad_addr)
-{
-    struct hci_le_conn_complete evt;
-    int rc;
-
-    uint8_t peer_addr[6] = { 1, 2, 3, 4, 5, 6 };
-
-    ble_gap_test_util_init();
-
-    TEST_ASSERT(!ble_gap_master_in_progress());
-
-    rc = ble_hs_test_util_conn_initiate(BLE_ADDR_TYPE_PUBLIC, peer_addr, NULL,
-                                        ble_gap_test_util_connect_cb, NULL, 0);
-    TEST_ASSERT(rc == 0);
-
-    TEST_ASSERT(ble_gap_master_in_progress());
-
-    /* Verify tx of create connection command. */
-    ble_gap_test_util_verify_tx_create_conn(BLE_HCI_CONN_FILT_NO_WL);
-    TEST_ASSERT(ble_gap_master_in_progress());
-    TEST_ASSERT(ble_hs_conn_find(2) == NULL);
-
-    /* Receive connection complete event. */
-    memset(&evt, 0, sizeof evt);
-    evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE;
-    evt.status = BLE_ERR_SUCCESS;
-    evt.connection_handle = 2;
-    evt.role = BLE_HCI_LE_CONN_COMPLETE_ROLE_MASTER;
-    memcpy(evt.peer_addr, ((uint8_t[]){1,1,1,1,1,1}), 6);
-    rc = ble_gap_rx_conn_complete(&evt);
-    TEST_ASSERT(rc == BLE_HS_ECONTROLLER);
-
-    TEST_ASSERT(!ble_gap_master_in_progress());
-
-    TEST_ASSERT(ble_gap_test_conn_event == BLE_GAP_EVENT_CONN);
-    TEST_ASSERT(ble_gap_test_conn_desc.conn_handle == BLE_HS_CONN_HANDLE_NONE);
-
-    TEST_ASSERT(ble_hs_conn_find(2) == NULL);
-}
-
 TEST_SUITE(ble_gap_test_suite_conn_dir)
 {
     ble_gap_test_case_conn_dir_good();
     ble_gap_test_case_conn_dir_bad_args();
-    ble_gap_test_case_conn_dir_bad_addr();
 }
 
 /*****************************************************************************
@@ -1232,7 +1198,6 @@ ble_gap_test_util_stop_adv(uint8_t disc_mode, uint8_t conn_mode,
     TEST_ASSERT(rc == BLE_HS_HCI_ERR(hci_status));
 
     /* Verify tx of advertising enable command. */
-    ble_hci_sched_wakeup();
     ble_gap_test_util_verify_tx_adv_enable(0);
 }
 
@@ -1334,7 +1299,7 @@ ble_gap_test_util_update(struct ble_gap_upd_params *params,
     TEST_ASSERT(ble_gap_test_conn_desc.supervision_timeout ==
         params->supervision_timeout);
 
-    TEST_ASSERT(!ble_gap_update_in_progress(BLE_HS_CONN_HANDLE_NONE));
+    TEST_ASSERT(!ble_gap_update_in_progress(2));
 
     return;
 
@@ -1349,7 +1314,7 @@ fail:
                 BLE_GAP_INITIAL_CONN_LATENCY);
     TEST_ASSERT(ble_gap_test_conn_desc.supervision_timeout ==
                 BLE_GAP_INITIAL_SUPERVISION_TIMEOUT);
-    TEST_ASSERT(!ble_gap_update_in_progress(BLE_HS_CONN_HANDLE_NONE));
+    TEST_ASSERT(!ble_gap_update_in_progress(2));
 }
 
 static void
@@ -1405,19 +1370,16 @@ ble_gap_test_util_update_req_pos(struct ble_gap_upd_params *peer_params,
     TEST_ASSERT(!ble_gap_master_in_progress());
 
     ble_gap_test_conn_self_params = *self_params;
-    ble_gap_test_util_rx_param_req(peer_params);
+    rc = ble_gap_test_util_rx_param_req(peer_params, 1, &cmd_idx, cmd_fail_idx,
+                                        hci_status);
+    if (rc != 0) {
+        goto hci_fail;
+    }
     TEST_ASSERT(!ble_gap_master_in_progress());
-    TEST_ASSERT(ble_gap_update_in_progress(BLE_HS_CONN_HANDLE_NONE));
+    TEST_ASSERT(ble_gap_update_in_progress(2));
 
     /* Verify tx of connection parameters reply command. */
-    ble_hci_sched_wakeup();
     ble_gap_test_util_verify_tx_params_reply_pos();
-    rc = ble_gap_test_util_rx_hci_ack(&cmd_idx, cmd_fail_idx, BLE_HCI_OGF_LE,
-                                      BLE_HCI_OCF_LE_REM_CONN_PARAM_RR,
-                                      hci_status);
-    if (rc != 0) {
-        goto hci_fail;
-    }
 
     TEST_ASSERT(!ble_gap_master_in_progress());
     TEST_ASSERT(ble_gap_update_in_progress(2));
@@ -1426,7 +1388,7 @@ ble_gap_test_util_update_req_pos(struct ble_gap_upd_params *peer_params,
     ble_gap_test_util_rx_update_complete(0, self_params);
 
     TEST_ASSERT(!ble_gap_master_in_progress());
-    TEST_ASSERT(!ble_gap_update_in_progress(BLE_HS_CONN_HANDLE_NONE));
+    TEST_ASSERT(!ble_gap_update_in_progress(2));
 
     TEST_ASSERT(ble_gap_test_conn_event == BLE_GAP_EVENT_CONN_UPDATED);
     TEST_ASSERT(ble_gap_test_conn_status == 0);
@@ -1470,24 +1432,21 @@ ble_gap_test_util_update_req_neg(struct ble_gap_upd_params *peer_params,
                                  &reason);
 
     TEST_ASSERT(!ble_gap_master_in_progress());
-    TEST_ASSERT(!ble_gap_update_in_progress(BLE_HS_CONN_HANDLE_NONE));
+    TEST_ASSERT(!ble_gap_update_in_progress(2));
 
-    ble_gap_test_util_rx_param_req(peer_params);
+    rc = ble_gap_test_util_rx_param_req(peer_params, 0, &cmd_idx, cmd_fail_idx,
+                                        hci_status);
+    if (rc != 0) {
+        goto hci_fail;
+    }
     TEST_ASSERT(!ble_gap_master_in_progress());
-    TEST_ASSERT(ble_gap_update_in_progress(2));
+    TEST_ASSERT(!ble_gap_update_in_progress(2));
 
     /* Verify tx of connection parameters negative reply command. */
-    ble_hci_sched_wakeup();
     ble_gap_test_util_verify_tx_params_reply_neg(reason);
-    rc = ble_gap_test_util_rx_hci_ack(&cmd_idx, cmd_fail_idx, BLE_HCI_OGF_LE,
-                                      BLE_HCI_OCF_LE_REM_CONN_PARAM_NRR,
-                                      hci_status);
-    if (rc != 0) {
-        goto hci_fail;
-    }
 
     TEST_ASSERT(!ble_gap_master_in_progress());
-    TEST_ASSERT(!ble_gap_update_in_progress(BLE_HS_CONN_HANDLE_NONE));
+    TEST_ASSERT(!ble_gap_update_in_progress(2));
 
     return;
 
@@ -1524,7 +1483,7 @@ ble_gap_test_util_update_req_concurrent(
                                  NULL);
 
     TEST_ASSERT(!ble_gap_master_in_progress());
-    TEST_ASSERT(!ble_gap_update_in_progress(BLE_HS_CONN_HANDLE_NONE));
+    TEST_ASSERT(!ble_gap_update_in_progress(2));
 
     hci_status = cmd_fail_idx == 0 ? fail_status : 0;
     rc = ble_hs_test_util_conn_update(2, init_params, hci_status);
@@ -1547,20 +1506,16 @@ ble_gap_test_util_update_req_concurrent(
 
     /* Receive connection parameter update request from peer. */
     ble_gap_test_conn_self_params = *self_params;
-    ble_gap_test_util_rx_param_req(peer_params);
+    rc = ble_gap_test_util_rx_param_req(peer_params, 1, &cmd_idx, cmd_fail_idx,
+                                        hci_status);
+    if (rc != 0) {
+        goto hci_fail;
+    }
     TEST_ASSERT(!ble_gap_master_in_progress());
     TEST_ASSERT(ble_gap_update_in_progress(2));
 
     /* Verify tx of connection parameters reply command. */
-    ble_hci_sched_wakeup();
     ble_gap_test_util_verify_tx_params_reply_pos();
-    cmd_idx = 1;
-    rc = ble_gap_test_util_rx_hci_ack(&cmd_idx, cmd_fail_idx, BLE_HCI_OGF_LE,
-                                      BLE_HCI_OCF_LE_REM_CONN_PARAM_RR,
-                                      fail_status);
-    if (rc != 0) {
-        goto hci_fail;
-    }
 
     TEST_ASSERT(!ble_gap_master_in_progress());
     TEST_ASSERT(ble_gap_update_in_progress(2));

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e32f9f9f/net/nimble/host/src/test/ble_gatt_conn_test.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_gatt_conn_test.c b/net/nimble/host/src/test/ble_gatt_conn_test.c
index 1f31122..994f719 100644
--- a/net/nimble/host/src/test/ble_gatt_conn_test.c
+++ b/net/nimble/host/src/test/ble_gatt_conn_test.c
@@ -84,9 +84,6 @@ ble_gatt_conn_test_write_cb(uint16_t conn_handle, struct ble_gatt_error *error,
     TEST_ASSERT(error->status == BLE_HS_ENOTCONN);
     TEST_ASSERT(attr != NULL);
     TEST_ASSERT(attr->handle == BLE_GATT_BREAK_TEST_WRITE_ATTR_HANDLE);
-    TEST_ASSERT(attr->value_len == sizeof ble_gatt_conn_test_write_value);
-    TEST_ASSERT(memcmp(attr->value, ble_gatt_conn_test_write_value,
-                       sizeof ble_gatt_conn_test_write_value) == 0);
 
     return 0;
 }
@@ -159,6 +156,7 @@ TEST_CASE(ble_gatt_conn_test_disconnect)
     ble_gattc_connection_broken(BLE_GATT_BREAK_TEST_DISC_CHR_HANDLE);
     ble_gattc_connection_broken(BLE_GATT_BREAK_TEST_READ_HANDLE);
     ble_gattc_connection_broken(BLE_GATT_BREAK_TEST_WRITE_HANDLE);
+    /* XXX: Add remaining procedures. */
 
     TEST_ASSERT(disc_s_called == 1);
     TEST_ASSERT(disc_c_called == 1);
@@ -166,55 +164,9 @@ TEST_CASE(ble_gatt_conn_test_disconnect)
     TEST_ASSERT(write_called == 1);
 }
 
-TEST_CASE(ble_gatt_conn_test_congestion)
-{
-    struct ble_hs_conn *conn;
-    int rc;
-
-    ble_hs_test_util_init();
-
-    /* Allow only one outstanding packet per connection. */
-    ble_hs_cfg.max_outstanding_pkts_per_conn = 1;
-
-    /* Create a connection. */
-    conn = ble_hs_test_util_create_conn(1, ((uint8_t[]){1,2,3,4,5,6,7,8}),
-                                        NULL, NULL);
-
-    /* Try to send two data packets. */
-    rc = ble_gattc_write(1, 0x1234, ble_gatt_conn_test_write_value,
-                        sizeof ble_gatt_conn_test_write_value, NULL, NULL);
-    TEST_ASSERT_FATAL(rc == 0);
-
-    rc = ble_gattc_write(1, 0x1234, ble_gatt_conn_test_write_value,
-                        sizeof ble_gatt_conn_test_write_value, NULL, NULL);
-    TEST_ASSERT_FATAL(rc == 0);
-    ble_hs_test_util_tx_all();
-
-    /* Ensure only one packet got sent. */
-    TEST_ASSERT(conn->bhc_outstanding_pkts == 1);
-
-    /* Additional wakeups should not trigger the second send. */
-    ble_hs_test_util_tx_all();
-    TEST_ASSERT(conn->bhc_outstanding_pkts == 1);
-
-    /* Receive a num-packets-completed event. */
-    ble_hs_test_util_rx_num_completed_pkts_event(
-        (struct ble_hs_test_util_num_completed_pkts_entry []) {
-            { 1, 1 },
-            { 0 }});
-
-    /* Outstanding packet count should have been reduced to 0. */
-    TEST_ASSERT(conn->bhc_outstanding_pkts == 0);
-
-    /* Now the second write should get sent. */
-    ble_hs_test_util_tx_all();
-    TEST_ASSERT(conn->bhc_outstanding_pkts == 1);
-}
-
 TEST_SUITE(ble_gatt_break_suite)
 {
     ble_gatt_conn_test_disconnect();
-    ble_gatt_conn_test_congestion();
 }
 
 int

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e32f9f9f/net/nimble/host/src/test/ble_gatt_read_test.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_gatt_read_test.c b/net/nimble/host/src/test/ble_gatt_read_test.c
index 47392fb..edf7d63 100644
--- a/net/nimble/host/src/test/ble_gatt_read_test.c
+++ b/net/nimble/host/src/test/ble_gatt_read_test.c
@@ -43,9 +43,6 @@ int ble_gatt_read_test_complete;
 uint16_t ble_gatt_read_test_bad_conn_handle;
 int ble_gatt_read_test_bad_status;
 
-uint16_t ble_gatt_read_test_mult_handles[BLE_GATT_READ_TEST_MAX_ATTRS];
-uint8_t ble_gatt_read_test_mult_num_handles;
-
 static void
 ble_gatt_read_test_misc_init(void)
 {
@@ -97,6 +94,8 @@ ble_gatt_read_test_cb(uint16_t conn_handle, struct ble_gatt_error *error,
             ble_gatt_read_test_complete = 1;
             return 1;
         }
+    } else {
+        ble_gatt_read_test_complete = 1;
     }
 
     return 0;
@@ -149,46 +148,6 @@ ble_gatt_read_test_long_cb(uint16_t conn_handle, struct ble_gatt_error *error,
     return 0;
 }
 
-static int
-ble_gatt_read_test_mult_cb(uint16_t conn_handle, struct ble_gatt_error *error,
-                           uint16_t *attr_handles, uint8_t num_attr_handles,
-                           uint8_t *attr_data, uint16_t attr_data_len,
-                           void *arg)
-{
-    struct ble_gatt_read_test_attr *dst;
-    int i;
-
-    ble_gatt_read_test_mult_num_handles = num_attr_handles;
-    for (i = 0; i < num_attr_handles; i++) {
-        ble_gatt_read_test_mult_handles[i] = attr_handles[i];
-    }
-
-    if (error != NULL) {
-        ble_gatt_read_test_bad_conn_handle = conn_handle;
-        ble_gatt_read_test_bad_status = error->status;
-        ble_gatt_read_test_complete = 1;
-        return 0;
-    }
-
-    if (attr_data == NULL) {
-        ble_gatt_read_test_complete = 1;
-        return 0;
-    }
-
-    dst = ble_gatt_read_test_attrs + ble_gatt_read_test_num_attrs++;
-
-    TEST_ASSERT_FATAL(attr_data_len <= sizeof dst->value);
-
-    dst->conn_handle = conn_handle;
-    dst->handle = 0;
-    dst->value_len = attr_data_len;
-    memcpy(dst->value, attr_data, attr_data_len);
-
-    ble_gatt_read_test_complete = 1;
-
-    return 0;
-}
-
 static void
 ble_gatt_read_test_misc_rx_rsp_good_raw(struct ble_hs_conn *conn,
                                         uint8_t att_op,
@@ -500,7 +459,7 @@ ble_gatt_read_test_misc_mult_verify_good(struct ble_gatt_attr *attrs)
     }
 
     rc = ble_gattc_read_mult(conn->bhc_handle, handles, num_attrs,
-                             ble_gatt_read_test_mult_cb, NULL);
+                             ble_gatt_read_test_cb, NULL);
     TEST_ASSERT_FATAL(rc == 0);
 
     ble_gatt_read_test_misc_rx_rsp_good_raw(conn, BLE_ATT_OP_READ_MULT_RSP,
@@ -509,9 +468,6 @@ ble_gatt_read_test_misc_mult_verify_good(struct ble_gatt_attr *attrs)
     TEST_ASSERT(ble_gatt_read_test_complete);
     TEST_ASSERT(!ble_gattc_any_jobs());
     TEST_ASSERT(ble_gatt_read_test_attrs[0].conn_handle == conn->bhc_handle);
-    TEST_ASSERT(ble_gatt_read_test_mult_num_handles == num_attrs);
-    TEST_ASSERT(memcmp(ble_gatt_read_test_mult_handles, handles,
-                       num_attrs * 2) == 0);
     TEST_ASSERT(ble_gatt_read_test_attrs[0].value_len == off);
     TEST_ASSERT(memcmp(ble_gatt_read_test_attrs[0].value, expected_value,
                        off) == 0);
@@ -534,16 +490,13 @@ ble_gatt_read_test_misc_mult_verify_bad(uint8_t att_status,
     num_attrs = ble_gatt_read_test_misc_extract_handles(attrs, handles);
 
     rc = ble_gattc_read_mult(conn->bhc_handle, handles, num_attrs,
-                             ble_gatt_read_test_mult_cb, NULL);
+                             ble_gatt_read_test_cb, NULL);
     TEST_ASSERT_FATAL(rc == 0);
 
     ble_gatt_read_test_misc_rx_rsp_bad(conn, att_status, err_handle);
 
     TEST_ASSERT(ble_gatt_read_test_num_attrs == 0);
     TEST_ASSERT(ble_gatt_read_test_bad_conn_handle == conn->bhc_handle);
-    TEST_ASSERT(ble_gatt_read_test_mult_num_handles == num_attrs);
-    TEST_ASSERT(memcmp(ble_gatt_read_test_mult_handles, handles,
-                       num_attrs * 2) == 0);
     TEST_ASSERT(ble_gatt_read_test_bad_status ==
                 BLE_HS_ERR_ATT_BASE + att_status);
     TEST_ASSERT(!ble_gattc_any_jobs());

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e32f9f9f/net/nimble/host/src/test/ble_gatt_write_test.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_gatt_write_test.c b/net/nimble/host/src/test/ble_gatt_write_test.c
index 3c17114..b452e79 100644
--- a/net/nimble/host/src/test/ble_gatt_write_test.c
+++ b/net/nimble/host/src/test/ble_gatt_write_test.c
@@ -63,8 +63,6 @@ ble_gatt_write_test_cb_good(uint16_t conn_handle, struct ble_gatt_error *error,
     if (attr_len != NULL) {
         TEST_ASSERT(error == NULL);
         TEST_ASSERT(attr->handle == 100);
-        TEST_ASSERT(attr->value_len == *attr_len);
-        TEST_ASSERT(attr->value == ble_gatt_write_test_attr_value);
     } else {
         TEST_ASSERT(error != NULL);
         ble_gatt_write_test_error = *error;
@@ -348,15 +346,14 @@ TEST_CASE(ble_gatt_write_test_no_rsp)
 
     attr_len = 4;
     rc = ble_gattc_write_no_rsp(2, 100, ble_gatt_write_test_attr_value,
-                                attr_len, ble_gatt_write_test_cb_good,
-                                &attr_len);
+                                attr_len);
     TEST_ASSERT(rc == 0);
 
     /* Send the pending ATT Write Command. */
     ble_hs_test_util_tx_all();
 
-    /* No response expected; verify callback got called. */
-    TEST_ASSERT(ble_gatt_write_test_cb_called);
+    /* No response expected; verify callback not called. */
+    TEST_ASSERT(!ble_gatt_write_test_cb_called);
 }
 
 TEST_CASE(ble_gatt_write_test_rsp)

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e32f9f9f/net/nimble/host/src/test/ble_host_hci_test.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_host_hci_test.c b/net/nimble/host/src/test/ble_host_hci_test.c
index 778df9d..d451e7a 100644
--- a/net/nimble/host/src/test/ble_host_hci_test.c
+++ b/net/nimble/host/src/test/ble_host_hci_test.c
@@ -38,142 +38,9 @@ TEST_CASE(ble_host_hci_test_event_bad)
     TEST_ASSERT(rc == BLE_HS_ENOTSUP);
 }
 
-TEST_CASE(ble_host_hci_test_event_cmd_complete)
-{
-    uint8_t buf[BLE_HCI_EVENT_CMD_COMPLETE_HDR_LEN];
-    int rc;
-
-    ble_hs_test_util_init();
-
-    /*** Unsent OCF. */
-    ble_hs_test_util_build_cmd_complete(buf, sizeof buf, 1, 1, 12345);
-    rc = host_hci_event_rx(buf);
-    TEST_ASSERT(rc == BLE_HS_ENOENT);
-
-    /*** No error on NOP. */
-    ble_hs_test_util_build_cmd_complete(buf, sizeof buf, 1, 1,
-                                        BLE_HCI_OPCODE_NOP);
-    rc = host_hci_event_rx(buf);
-    TEST_ASSERT(rc == 0);
-
-    /*** Acknowledge sent command. */
-    rc = host_hci_cmd_le_set_adv_enable(0);
-    TEST_ASSERT(rc == 0);
-    ble_hs_test_util_build_cmd_complete(
-        buf, sizeof buf, 1, 1,
-        (BLE_HCI_OGF_LE << 10) | BLE_HCI_OCF_LE_SET_ADV_ENABLE);
-    rc = host_hci_event_rx(buf);
-    TEST_ASSERT(rc == 0);
-
-    /*** Duplicate ack is error. */
-    rc = host_hci_event_rx(buf);
-    TEST_ASSERT(rc == BLE_HS_ENOENT);
-}
-
-TEST_CASE(ble_host_hci_test_event_cmd_status)
-{
-    uint8_t buf[BLE_HCI_EVENT_CMD_STATUS_LEN];
-    int rc;
-
-    ble_hs_test_util_init();
-
-    /*** Unsent OCF. */
-    ble_hs_test_util_build_cmd_status(buf, sizeof buf, 0, 1, 12345);
-    rc = host_hci_event_rx(buf);
-    TEST_ASSERT(rc == BLE_HS_ENOENT);
-
-    /*** No error on NOP. */
-    ble_hs_test_util_build_cmd_complete(buf, sizeof buf, 0, 1,
-                                        BLE_HCI_OPCODE_NOP);
-    rc = host_hci_event_rx(buf);
-    TEST_ASSERT(rc == 0);
-
-    /*** Acknowledge sent command. */
-    rc = host_hci_cmd_le_set_adv_enable(0);
-    TEST_ASSERT(rc == 0);
-    ble_hs_test_util_build_cmd_status(
-        buf, sizeof buf, BLE_ERR_SUCCESS, 1,
-        (BLE_HCI_OGF_LE << 10) | BLE_HCI_OCF_LE_SET_ADV_ENABLE);
-    rc = host_hci_event_rx(buf);
-    TEST_ASSERT(rc == 0);
-
-    /*** Duplicate ack is error. */
-    rc = host_hci_event_rx(buf);
-    TEST_ASSERT(rc == BLE_HS_ENOENT);
-}
-
-static int ble_host_hci_test_tx_called;
-static uint8_t ble_host_hci_test_handle;
-
-static int
-ble_host_hci_test_util_tx_cb(void *arg)
-{
-    ble_host_hci_test_tx_called++;
-    return 0;
-}
-
-static void
-ble_host_hci_test_util_ack_cb(struct ble_hci_ack *ack, void *arg)
-{ }
-
-TEST_CASE(ble_host_hci_test_cancel_bad)
-{
-    int rc;
-
-    /*** Nonexistant handle. */
-    rc = ble_hci_sched_cancel(123);
-    TEST_ASSERT(rc == BLE_HS_ENOENT);
-}
-
-TEST_CASE(ble_host_hci_test_cancel_pending)
-{
-    uint8_t hci_handle;
-    int rc;
-
-    rc = ble_hci_sched_enqueue(ble_host_hci_test_util_tx_cb, NULL,
-                               &hci_handle);
-    TEST_ASSERT_FATAL(rc == 0);
-    TEST_ASSERT(hci_handle != BLE_HCI_SCHED_HANDLE_NONE);
-
-    rc = ble_hci_sched_cancel(hci_handle);
-    TEST_ASSERT(rc == 0);
-
-    ble_hci_sched_wakeup();
-    TEST_ASSERT(ble_host_hci_test_tx_called == 0);
-}
-
-TEST_CASE(ble_host_hci_test_cancel_cur)
-{
-    uint8_t hci_handle;
-    int rc;
-
-    ble_hci_sched_set_ack_cb(ble_host_hci_test_util_ack_cb, NULL);
-    rc = ble_hci_sched_enqueue(ble_host_hci_test_util_tx_cb, NULL,
-                               &hci_handle);
-    TEST_ASSERT_FATAL(rc == 0);
-    TEST_ASSERT(hci_handle != BLE_HCI_SCHED_HANDLE_NONE);
-
-    ble_host_hci_test_handle = hci_handle;
-
-    ble_hci_sched_wakeup();
-
-    TEST_ASSERT(ble_host_hci_test_tx_called == 1);
-    TEST_ASSERT(ble_hci_sched_get_ack_cb() != NULL);
-
-    rc = ble_hci_sched_cancel(hci_handle);
-    TEST_ASSERT_FATAL(rc == 0);
-
-    TEST_ASSERT(ble_hci_sched_get_ack_cb() == NULL);
-}
-
 TEST_SUITE(ble_host_hci_suite)
 {
     ble_host_hci_test_event_bad();
-    ble_host_hci_test_event_cmd_complete();
-    ble_host_hci_test_event_cmd_status();
-    ble_host_hci_test_cancel_bad();
-    ble_host_hci_test_cancel_pending();
-    ble_host_hci_test_cancel_cur();
 }
 
 int

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e32f9f9f/net/nimble/host/src/test/ble_hs_conn_test.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_hs_conn_test.c b/net/nimble/host/src/test/ble_hs_conn_test.c
index 5a23700..fa23c18 100644
--- a/net/nimble/host/src/test/ble_hs_conn_test.c
+++ b/net/nimble/host/src/test/ble_hs_conn_test.c
@@ -110,8 +110,6 @@ TEST_CASE(ble_hs_conn_test_direct_connectable_success)
                                     NULL, 0, 0);
     TEST_ASSERT(rc == 0);
 
-    ble_hci_sched_wakeup();
-
     TEST_ASSERT(!ble_gap_master_in_progress());
     TEST_ASSERT(ble_gap_slave_in_progress());
 
@@ -220,72 +218,6 @@ TEST_CASE(ble_hs_conn_test_undirect_connectable_success)
     TEST_ASSERT(chan->blc_peer_mtu == 0);
     TEST_ASSERT(chan->blc_default_mtu == BLE_ATT_MTU_DFLT);
 }
-TEST_CASE(ble_hs_conn_test_completed_pkts)
-{
-    struct ble_hs_conn *conn1;
-    struct ble_hs_conn *conn2;
-
-    ble_hs_test_util_init();
-
-    conn1 = ble_hs_test_util_create_conn(1, ((uint8_t[]){2,3,4,5,6,7,8,9}),
-                                         NULL, NULL);
-    conn2 = ble_hs_test_util_create_conn(2, ((uint8_t[]){3,4,5,6,7,8,9,10}),
-                                         NULL, NULL);
-
-    conn1->bhc_outstanding_pkts = 5;
-    conn2->bhc_outstanding_pkts = 5;
-
-    /*** Event specifies nonexistent connection; no effect. */
-    ble_hs_test_util_rx_num_completed_pkts_event(
-        (struct ble_hs_test_util_num_completed_pkts_entry []) {
-            { 5, 5 },
-            { 0 }});
-    TEST_ASSERT(conn1->bhc_outstanding_pkts == 5);
-    TEST_ASSERT(conn2->bhc_outstanding_pkts == 5);
-
-    /*** Event specifies connection 1. */
-    ble_hs_test_util_rx_num_completed_pkts_event(
-        (struct ble_hs_test_util_num_completed_pkts_entry []) {
-            { 1, 1 },
-            { 0 }});
-    TEST_ASSERT(conn1->bhc_outstanding_pkts == 4);
-    TEST_ASSERT(conn2->bhc_outstanding_pkts == 5);
-
-    /*** Event specifies connection 2. */
-    ble_hs_test_util_rx_num_completed_pkts_event(
-        (struct ble_hs_test_util_num_completed_pkts_entry []) {
-            { 2, 1 },
-            { 0 }});
-    TEST_ASSERT(conn1->bhc_outstanding_pkts == 4);
-    TEST_ASSERT(conn2->bhc_outstanding_pkts == 4);
-
-    /*** Event specifies connections 1 and 2. */
-    ble_hs_test_util_rx_num_completed_pkts_event(
-        (struct ble_hs_test_util_num_completed_pkts_entry []) {
-            { 1, 2 },
-            { 2, 2 },
-            { 0 }});
-    TEST_ASSERT(conn1->bhc_outstanding_pkts == 2);
-    TEST_ASSERT(conn2->bhc_outstanding_pkts == 2);
-
-    /*** Event specifies connections 1, 2, and nonexistent. */
-    ble_hs_test_util_rx_num_completed_pkts_event(
-        (struct ble_hs_test_util_num_completed_pkts_entry []) {
-            { 1, 1 },
-            { 2, 1 },
-            { 10, 50 },
-            { 0 }});
-    TEST_ASSERT(conn1->bhc_outstanding_pkts == 1);
-    TEST_ASSERT(conn2->bhc_outstanding_pkts == 1);
-
-    /*** Don't wrap when count gets out of sync. */
-    ble_hs_test_util_rx_num_completed_pkts_event(
-        (struct ble_hs_test_util_num_completed_pkts_entry []) {
-            { 1, 10 },
-            { 0 }});
-    TEST_ASSERT(conn1->bhc_outstanding_pkts == 0);
-    TEST_ASSERT(conn2->bhc_outstanding_pkts == 1);
-}
 
 TEST_SUITE(conn_suite)
 {
@@ -294,7 +226,6 @@ TEST_SUITE(conn_suite)
     ble_hs_conn_test_direct_connectable_success();
     ble_hs_conn_test_direct_connectable_hci_errors();
     ble_hs_conn_test_undirect_connectable_success();
-    ble_hs_conn_test_completed_pkts();
 }
 
 int

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e32f9f9f/net/nimble/host/src/test/ble_hs_test.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_hs_test.c b/net/nimble/host/src/test/ble_hs_test.c
index 61150a6..183774e 100644
--- a/net/nimble/host/src/test/ble_hs_test.c
+++ b/net/nimble/host/src/test/ble_hs_test.c
@@ -49,28 +49,27 @@ int
 main(void)
 {
     tu_config.tc_print_results = 1;
-    tu_config.tc_system_assert = 1;
     tu_init();
 
-    ble_l2cap_test_all();
-    ble_l2cap_sm_test_all();
-    ble_att_svr_test_all();
     ble_att_clt_test_all();
-    ble_host_hci_test_all();
-    ble_hs_conn_test_all();
-    ble_os_test_all();
-    ble_uuid_test_all();
-    ble_gatt_disc_s_test_all();
+    ble_att_svr_test_all();
+    ble_gap_test_all();
+    ble_gatt_conn_test_all();
     ble_gatt_disc_c_test_all();
     ble_gatt_disc_d_test_all();
+    ble_gatt_disc_s_test_all();
+    ble_gatt_find_s_test_all();
     ble_gatt_read_test_all();
     ble_gatt_write_test_all();
-    ble_gatt_conn_test_all();
-    ble_hs_adv_test_all();
-    ble_gatts_reg_test_all();
     ble_gatts_notify_test_all();
-    ble_gatt_find_s_test_all();
-    ble_gap_test_all();
+    ble_gatts_reg_test_all();
+    ble_host_hci_test_all();
+    ble_hs_adv_test_all();
+    ble_hs_conn_test_all();
+    ble_l2cap_sm_test_all();
+    ble_l2cap_test_all();
+    ble_os_test_all();
+    ble_uuid_test_all();
 
     return tu_any_failed;
 }

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e32f9f9f/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 0741cc3..d8c9dab 100644
--- a/net/nimble/host/src/test/ble_hs_test_util.c
+++ b/net/nimble/host/src/test/ble_hs_test_util.c
@@ -37,6 +37,8 @@
 #define BLE_HS_TEST_UTIL_LE_OPCODE(ocf) \
     host_hci_opcode_join(BLE_HCI_OGF_LE, (ocf))
 
+struct os_eventq ble_hs_test_util_evq;
+
 os_membuf_t ble_hs_test_util_mbuf_mpool_data[BLE_HS_TEST_UTIL_MEMPOOL_SIZE];
 struct os_mbuf_pool ble_hs_test_util_mbuf_pool;
 struct os_mempool ble_hs_test_util_mbuf_mpool;
@@ -134,7 +136,7 @@ ble_hs_test_util_build_cmd_status(uint8_t *dst, int len,
 struct ble_hs_test_util_phony_ack {
     uint16_t opcode;
     uint8_t status;
-    uint8_t *evt_params;
+    uint8_t evt_params[256];
     uint8_t evt_params_len;
 };
 
@@ -143,7 +145,7 @@ ble_hs_test_util_phony_acks[BLE_HS_TEST_UTIL_PHONY_ACK_MAX];
 static int ble_hs_test_util_num_phony_acks;
 
 static int
-ble_hs_test_util_phony_ack_cb(void *cmd, uint8_t *ack, int ack_buf_len)
+ble_hs_test_util_phony_ack_cb(uint8_t *ack, int ack_buf_len)
 {
     struct ble_hs_test_util_phony_ack *entry;
 
@@ -170,13 +172,30 @@ ble_hs_test_util_phony_ack_cb(void *cmd, uint8_t *ack, int ack_buf_len)
 }
 
 void
-ble_hs_test_util_set_ack(uint16_t opcode, uint8_t status)
+ble_hs_test_util_set_ack_params(uint16_t opcode, uint8_t status, void *params,
+                                uint8_t params_len)
 {
-    ble_hs_test_util_phony_acks[0].opcode = opcode;
-    ble_hs_test_util_phony_acks[0].status = status;
+    struct ble_hs_test_util_phony_ack *ack;
+
+    ack = ble_hs_test_util_phony_acks + 0;
+    ack->opcode = opcode;
+    ack->status = status;
+
+    if (params == NULL || params_len == 0) {
+        ack->evt_params_len = 0;
+    } else {
+        memcpy(ack->evt_params, params, params_len);
+        ack->evt_params_len = params_len;
+    }
     ble_hs_test_util_num_phony_acks = 1;
 
-    ble_hci_block_set_phony_ack_cb(ble_hs_test_util_phony_ack_cb);
+    ble_hci_set_phony_ack_cb(ble_hs_test_util_phony_ack_cb);
+}
+
+void
+ble_hs_test_util_set_ack(uint16_t opcode, uint8_t status)
+{
+    ble_hs_test_util_set_ack_params(opcode, status, NULL, 0);
 }
 
 static void
@@ -189,7 +208,7 @@ ble_hs_test_util_set_ack_seq(struct ble_hs_test_util_phony_ack *acks)
     }
     ble_hs_test_util_num_phony_acks = i;
 
-    ble_hci_block_set_phony_ack_cb(ble_hs_test_util_phony_ack_cb);
+    ble_hci_set_phony_ack_cb(ble_hs_test_util_phony_ack_cb);
 }
 
 struct ble_hs_conn *
@@ -320,7 +339,7 @@ ble_hs_test_util_adv_start(uint8_t discoverable_mode,
         acks[i] = (struct ble_hs_test_util_phony_ack) {
             BLE_HS_TEST_UTIL_LE_OPCODE(BLE_HCI_OCF_LE_RD_ADV_CHAN_TXPWR),
             fail_idx == i ? fail_status : 0,
-            (uint8_t[]) { 0 },
+            { 0 },
             1,
         };
         i++;
@@ -414,65 +433,16 @@ ble_hs_test_util_conn_update(uint16_t conn_handle,
     return rc;
 }
 
-void
-ble_hs_test_util_rx_ack_param(uint16_t opcode, uint8_t status, void *param,
-                              int param_len)
-{
-    uint8_t buf[256];
-    int rc;
-
-    ble_hs_test_util_build_cmd_complete(buf, sizeof buf, param_len + 1, 1,
-                                        opcode);
-    buf[BLE_HCI_EVENT_CMD_COMPLETE_HDR_LEN] = status;
-    memcpy(buf + BLE_HCI_EVENT_CMD_COMPLETE_HDR_LEN + 1, param, param_len);
-
-    rc = host_hci_event_rx(buf);
-    TEST_ASSERT(rc == 0);
-}
-
-void
-ble_hs_test_util_rx_ack(uint16_t opcode, uint8_t status)
-{
-    uint8_t buf[BLE_HCI_EVENT_CMD_STATUS_LEN];
-    int rc;
-
-    ble_hs_test_util_build_cmd_status(buf, sizeof buf, status, 1, opcode);
-    rc = host_hci_event_rx(buf);
-    TEST_ASSERT(rc == 0);
-}
-
-void
-ble_hs_test_util_rx_hci_buf_size_ack(uint16_t buf_size)
+int
+ble_hs_test_util_security_initiate(uint16_t conn_handle, uint8_t hci_status)
 {
-    uint8_t buf[BLE_HCI_EVENT_CMD_COMPLETE_HDR_LEN +
-                BLE_HCI_RD_BUF_SIZE_RSPLEN + 1];
     int rc;
 
-    ble_hs_test_util_build_cmd_complete(buf, sizeof buf,
-                                        BLE_HCI_RD_BUF_SIZE_RSPLEN + 1, 1,
-                                        (BLE_HCI_OGF_LE << 10) |
-                                            BLE_HCI_OCF_LE_RD_BUF_SIZE);
-
-    buf[BLE_HCI_EVENT_CMD_COMPLETE_HDR_LEN + 0] = 0;
-    htole16(buf + BLE_HCI_EVENT_CMD_COMPLETE_HDR_LEN + 1, buf_size);
-    buf[BLE_HCI_EVENT_CMD_COMPLETE_HDR_LEN + 3] = 1;
-
-    rc = host_hci_event_rx(buf);
-    TEST_ASSERT(rc == 0);
-}
-
-void
-ble_hs_test_util_rx_le_ack_param(uint16_t ocf, uint8_t status, void *param,
-                                 int param_len)
-{
-    ble_hs_test_util_rx_ack_param((BLE_HCI_OGF_LE << 10) | ocf, status, param,
-                                  param_len);
-}
+    ble_hs_test_util_set_ack(
+        BLE_HS_TEST_UTIL_LE_OPCODE(BLE_HCI_OCF_LE_START_ENCRYPT), hci_status);
 
-void
-ble_hs_test_util_rx_le_ack(uint16_t ocf, uint8_t status)
-{
-    ble_hs_test_util_rx_ack((BLE_HCI_OGF_LE << 10) | ocf, status);
+    rc = ble_gap_security_initiate(conn_handle);
+    return rc;
 }
 
 int
@@ -560,24 +530,39 @@ ble_hs_test_util_rx_att_err_rsp(struct ble_hs_conn *conn, uint8_t req_op,
 }
 
 void
-ble_hs_test_util_rx_startup_acks(void)
+ble_hs_test_util_set_startup_acks(void)
 {
-    uint8_t supp_feat[8];
-
-    memset(supp_feat, 0, sizeof supp_feat);
-
     /* Receive acknowledgements for the startup sequence.  We sent the
      * corresponding requests when the host task was started.
      */
-    ble_hs_test_util_rx_ack(
-        (BLE_HCI_OGF_CTLR_BASEBAND << 10) | BLE_HCI_OCF_CB_RESET, 0);
-    ble_hs_test_util_rx_ack(
-        (BLE_HCI_OGF_CTLR_BASEBAND << 10) | BLE_HCI_OCF_CB_SET_EVENT_MASK,
-        0);
-    ble_hs_test_util_rx_le_ack(BLE_HCI_OCF_LE_SET_EVENT_MASK, 0);
-    ble_hs_test_util_rx_hci_buf_size_ack(0xffff);
-    ble_hs_test_util_rx_le_ack_param(BLE_HCI_OCF_LE_RD_LOC_SUPP_FEAT, 0,
-                                     supp_feat, sizeof supp_feat);
+    ble_hs_test_util_set_ack_seq(((struct ble_hs_test_util_phony_ack[]) {
+        {
+            .opcode = host_hci_opcode_join(BLE_HCI_OGF_CTLR_BASEBAND,
+                                           BLE_HCI_OCF_CB_RESET),
+        },
+        {
+            .opcode = host_hci_opcode_join(BLE_HCI_OGF_CTLR_BASEBAND,
+                                           BLE_HCI_OCF_CB_SET_EVENT_MASK),
+        },
+        {
+            .opcode = host_hci_opcode_join(BLE_HCI_OGF_LE,
+                                           BLE_HCI_OCF_LE_SET_EVENT_MASK),
+        },
+        {
+            .opcode = host_hci_opcode_join(BLE_HCI_OGF_LE,
+                                           BLE_HCI_OCF_LE_RD_BUF_SIZE),
+            .evt_params = { 0xff, 0xff, 1 },
+            .evt_params_len = 3,
+        },
+        {
+            .opcode = host_hci_opcode_join(BLE_HCI_OGF_LE,
+                                           BLE_HCI_OCF_LE_RD_LOC_SUPP_FEAT),
+            .evt_params = { 0 },
+            .evt_params_len = 8,
+        },
+
+        { 0 }
+    }));
 }
 
 void
@@ -641,11 +626,7 @@ ble_hs_test_util_verify_tx_hci(uint8_t ogf, uint16_t ocf,
 void
 ble_hs_test_util_tx_all(void)
 {
-    ble_gattc_wakeup();
-    ble_l2cap_sig_wakeup();
-    ble_l2cap_sm_wakeup();
     ble_hs_process_tx_data_queue();
-    ble_hci_sched_wakeup();
 }
 
 void
@@ -662,12 +643,14 @@ ble_hs_test_util_init(void)
 
     tu_init();
 
+    os_eventq_init(&ble_hs_test_util_evq);
+
     os_msys_reset();
     stats_module_reset();
 
     cfg = ble_hs_cfg_dflt;
     cfg.max_connections = 8;
-    rc = ble_hs_init(10, &cfg);
+    rc = ble_hs_init(&ble_hs_test_util_evq, &cfg);
     TEST_ASSERT_FATAL(rc == 0);
 
     rc = os_mempool_init(&ble_hs_test_util_mbuf_mpool,
@@ -686,7 +669,7 @@ ble_hs_test_util_init(void)
     rc = os_msys_register(&ble_hs_test_util_mbuf_pool);
     TEST_ASSERT_FATAL(rc == 0);
 
-    ble_hci_block_set_phony_ack_cb(NULL);
+    ble_hci_set_phony_ack_cb(NULL);
 
     /* Don't limit a connection's ability to transmit; simplify tests. */
     ble_hs_cfg.max_outstanding_pkts_per_conn = 0;

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e32f9f9f/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 0bbeb52..aea5f08 100644
--- a/net/nimble/host/src/test/ble_hs_test_util.h
+++ b/net/nimble/host/src/test/ble_hs_test_util.h
@@ -26,6 +26,7 @@
 struct ble_hs_conn;
 struct ble_l2cap_chan;
 
+struct os_eventq ble_hs_test_util_evq;
 extern struct os_mbuf *ble_hs_test_util_prev_tx;
 
 struct ble_hs_test_util_num_completed_pkts_entry {
@@ -33,6 +34,8 @@ struct ble_hs_test_util_num_completed_pkts_entry {
     uint16_t num_pkts;
 };
 
+void ble_hs_test_util_set_ack_params(uint16_t opcode, uint8_t status,
+                                     void *params, uint8_t params_len);
 void ble_hs_test_util_set_ack(uint16_t opcode, uint8_t status);
 void *ble_hs_test_util_get_first_hci_tx(void);
 void *ble_hs_test_util_get_last_hci_tx(void);
@@ -71,10 +74,8 @@ int ble_hs_test_util_wl_set(struct ble_gap_white_entry *white_list,
 int ble_hs_test_util_conn_update(uint16_t conn_handle,
                                  struct ble_gap_upd_params *params,
                                  uint8_t hci_status);
-void ble_hs_test_util_rx_ack(uint16_t opcode, uint8_t status);
-void ble_hs_test_util_rx_ack_param(uint16_t opcode, uint8_t status,
-                                   void *param, int param_len);
-void ble_hs_test_util_rx_le_ack(uint16_t ocf, uint8_t status);
+int ble_hs_test_util_security_initiate(uint16_t conn_handle,
+                                       uint8_t hci_status);
 int ble_hs_test_util_l2cap_rx_first_frag(struct ble_hs_conn *conn,
                                          uint16_t cid,
                                          struct hci_data_hdr *hci_hdr,
@@ -82,15 +83,13 @@ int ble_hs_test_util_l2cap_rx_first_frag(struct ble_hs_conn *conn,
 int ble_hs_test_util_l2cap_rx(struct ble_hs_conn *conn,
                               struct hci_data_hdr *hci_hdr,
                               struct os_mbuf *om);
-void ble_hs_test_util_rx_le_ack_param(uint16_t ocf, uint8_t status,
-                                      void *param, int param_len);
 int ble_hs_test_util_l2cap_rx_payload_flat(struct ble_hs_conn *conn,
                                            struct ble_l2cap_chan *chan,
                                            const void *data, int len);
 void ble_hs_test_util_rx_hci_buf_size_ack(uint16_t buf_size);
 void ble_hs_test_util_rx_att_err_rsp(struct ble_hs_conn *conn, uint8_t req_op,
                                      uint8_t error_code, uint16_t err_handle);
-void ble_hs_test_util_rx_startup_acks(void);
+void ble_hs_test_util_set_startup_acks(void);
 void ble_hs_test_util_rx_num_completed_pkts_event(
     struct ble_hs_test_util_num_completed_pkts_entry *entries);
 uint8_t *ble_hs_test_util_verify_tx_hci(uint8_t ogf, uint16_t ocf,

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e32f9f9f/net/nimble/host/src/test/ble_l2cap_sm_test.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_l2cap_sm_test.c b/net/nimble/host/src/test/ble_l2cap_sm_test.c
index e0234ae..86b69c3 100644
--- a/net/nimble/host/src/test/ble_l2cap_sm_test.c
+++ b/net/nimble/host/src/test/ble_l2cap_sm_test.c
@@ -303,14 +303,15 @@ ble_l2cap_sm_test_util_verify_tx_lt_key_req_reply(uint16_t conn_handle,
 }
 
 static void
-ble_l2cap_sm_test_util_rx_lt_key_req_reply_ack(uint8_t status,
-                                               uint16_t conn_handle)
+ble_l2cap_sm_test_util_set_lt_key_req_reply_ack(uint8_t status,
+                                                uint16_t conn_handle)
 {
-    uint8_t params[BLE_HCI_LT_KEY_REQ_REPLY_ACK_PARAM_LEN - 1];
+    static uint8_t params[BLE_HCI_LT_KEY_REQ_REPLY_ACK_PARAM_LEN - 1];
 
     htole16(params, conn_handle);
-    ble_hs_test_util_rx_le_ack_param(BLE_HCI_OCF_LE_LT_KEY_REQ_REPLY, status,
-                                     params, sizeof params);
+    ble_hs_test_util_set_ack_params(
+        host_hci_opcode_join(BLE_HCI_OGF_LE, BLE_HCI_OCF_LE_LT_KEY_REQ_REPLY),
+        status, params, sizeof params);
 }
 
 static void
@@ -412,21 +413,16 @@ ble_l2cap_sm_test_util_peer_lgcy_good(
     TEST_ASSERT(ble_l2cap_sm_dbg_num_procs() == 1);
 
     /* Receive a long term key request from the controller. */
+    ble_l2cap_sm_test_util_set_lt_key_req_reply_ack(0, 2);
     ble_l2cap_sm_test_util_rx_lt_key_req(2, r, ediv);
     TEST_ASSERT(!conn->bhc_sec_params.enc_enabled);
     TEST_ASSERT(ble_l2cap_sm_dbg_num_procs() == 1);
 
     /* Ensure we sent the expected long term key request reply command. */
-    ble_hs_test_util_tx_all();
     ble_l2cap_sm_test_util_verify_tx_lt_key_req_reply(2, stk);
     TEST_ASSERT(!conn->bhc_sec_params.enc_enabled);
     TEST_ASSERT(ble_l2cap_sm_dbg_num_procs() == 1);
 
-    /* Receive a command complete event. */
-    ble_l2cap_sm_test_util_rx_lt_key_req_reply_ack(0, 2);
-    TEST_ASSERT(!conn->bhc_sec_params.enc_enabled);
-    TEST_ASSERT(ble_l2cap_sm_dbg_num_procs() == 1);
-
     /* Receive an encryption changed event. */
     ble_l2cap_sm_test_util_rx_enc_change(2, 0, 1);
 
@@ -493,7 +489,6 @@ ble_l2cap_sm_test_util_peer_lgcy_fail(
 
     /* Receive a pair random from the peer. */
     ble_l2cap_sm_test_util_rx_random(conn, random_req);
-    TEST_ASSERT(ble_l2cap_sm_dbg_num_procs() == 1);
 
     /* Ensure we sent the expected pair fail. */
     ble_hs_test_util_tx_all();
@@ -568,8 +563,8 @@ TEST_CASE(ble_l2cap_sm_test_case_peer_lgcy_jw_good)
         BLE_L2CAP_SM_PAIR_ALG_JW,
         NULL,
         ((uint8_t[16]) {
-            0xe6, 0xb3, 0x05, 0xd4, 0xc3, 0x67, 0xf0, 0x45,
-            0x38, 0x8f, 0xe7, 0x33, 0x0d, 0x51, 0x8e, 0xa4,
+            0xa4, 0x8e, 0x51, 0x0d, 0x33, 0xe7, 0x8f, 0x38,
+            0x45, 0xf0, 0x67, 0xc3, 0xd4, 0x05, 0xb3, 0xe6,
         }),
         0,
         0
@@ -664,7 +659,7 @@ ble_l2cap_sm_test_util_us_lgcy_good(
     TEST_ASSERT(ble_l2cap_sm_dbg_num_procs() == 0);
 
     /* Initiate the pairing procedure. */
-    rc = ble_gap_security_initiate(2);
+    rc = ble_hs_test_util_security_initiate(2, 0);
     TEST_ASSERT_FATAL(rc == 0);
 
     /* Ensure we sent the expected pair request. */
@@ -706,11 +701,6 @@ ble_l2cap_sm_test_util_us_lgcy_good(
     TEST_ASSERT(!conn->bhc_sec_params.enc_enabled);
     TEST_ASSERT(ble_l2cap_sm_dbg_num_procs() == 1);
 
-    /* Receive a command status event. */
-    ble_hs_test_util_rx_le_ack(BLE_HCI_OCF_LE_START_ENCRYPT, 0);
-    TEST_ASSERT(!conn->bhc_sec_params.enc_enabled);
-    TEST_ASSERT(ble_l2cap_sm_dbg_num_procs() == 1);
-
     /* Receive an encryption changed event. */
     ble_l2cap_sm_test_util_rx_enc_change(2, 0, 1);
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e32f9f9f/net/nimble/host/src/test/ble_l2cap_test.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_l2cap_test.c b/net/nimble/host/src/test/ble_l2cap_test.c
index c9e116c..9cde642 100644
--- a/net/nimble/host/src/test/ble_l2cap_test.c
+++ b/net/nimble/host/src/test/ble_l2cap_test.c
@@ -471,10 +471,6 @@ ble_l2cap_test_util_peer_updates(int accept)
     ble_l2cap_test_util_verify_tx_update_rsp(1, !accept);
 
     if (accept) {
-        /* Ensure update request gets sent. */
-        ble_gattc_wakeup();
-        ble_hci_sched_wakeup();
-
         params.itvl_min = 0x200;
         params.itvl_max = 0x300;
         params.latency = 0;
@@ -574,13 +570,11 @@ TEST_CASE(ble_l2cap_test_case_sig_update_init_fail_master)
     params.timeout_multiplier = 0x100;
     rc = ble_l2cap_sig_update(conn->bhc_handle, &params,
                               ble_l2cap_test_util_update_cb, NULL);
-    TEST_ASSERT_FATAL(rc == 0);
+    TEST_ASSERT_FATAL(rc == BLE_HS_EINVAL);
 
+    /* Ensure callback never called. */
     ble_hs_test_util_tx_all();
-
-    /* Ensure callback indicates failure. */
-    TEST_ASSERT(ble_l2cap_test_update_status == BLE_HS_EINVAL);
-    TEST_ASSERT(ble_l2cap_test_update_arg == NULL);
+    TEST_ASSERT(ble_l2cap_test_update_status == -1);
 }
 
 TEST_CASE(ble_l2cap_test_case_sig_update_init_fail_bad_id)

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e32f9f9f/net/nimble/host/src/test/ble_os_test.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_os_test.c b/net/nimble/host/src/test/ble_os_test.c
index b8f3901..e95e567 100644
--- a/net/nimble/host/src/test/ble_os_test.c
+++ b/net/nimble/host/src/test/ble_os_test.c
@@ -28,39 +28,51 @@
 
 #ifdef ARCH_sim
 #define BLE_OS_TEST_STACK_SIZE      1024
+#define BLE_OS_TEST_APP_STACK_SIZE  1024
 #else
 #define BLE_OS_TEST_STACK_SIZE      256
+#define BLE_OS_TEST_APP_STACK_SIZE  256
 #endif
 
-#define BLE_OS_TEST_HS_PRIO         10
+#define BLE_OS_TEST_APP_PRIO         9
+#define BLE_OS_TEST_TASK_PRIO        10
 
 static struct os_task ble_os_test_task;
+static struct os_task ble_os_test_app_task;
 static os_stack_t ble_os_test_stack[OS_STACK_ALIGN(BLE_OS_TEST_STACK_SIZE)];
 
+static os_stack_t
+ble_os_test_app_stack[OS_STACK_ALIGN(BLE_OS_TEST_APP_STACK_SIZE)];
+
 static uint8_t ble_os_test_peer_addr[6] = { 1, 2, 3, 4, 5, 6 };
 
+static void ble_os_test_app_task_handler(void *arg);
+
 static void
-ble_os_test_misc_rx_ack(uint8_t ogf, uint8_t ocf, uint8_t status)
+ble_os_test_init_app_task(void)
 {
-    uint16_t opcode;
-    uint8_t *cmd;
     int rc;
 
-    cmd = os_memblock_get(&g_hci_cmd_pool);
-    TEST_ASSERT_FATAL(cmd != NULL);
-
-    opcode = (ogf << 10) | ocf;
-    ble_hs_test_util_build_cmd_status(cmd, BLE_HCI_EVENT_CMD_STATUS_LEN,
-                                      status, 1, opcode);
-
-    rc = ble_hci_transport_ctlr_event_send(cmd);
-    TEST_ASSERT(rc == 0);
+    rc = os_task_init(&ble_os_test_app_task,
+                      "ble_gap_terminate_test_task",
+                      ble_os_test_app_task_handler, NULL,
+                      BLE_OS_TEST_APP_PRIO, OS_WAIT_FOREVER,
+                      ble_os_test_app_stack,
+                      OS_STACK_ALIGN(BLE_OS_TEST_APP_STACK_SIZE));
+    TEST_ASSERT_FATAL(rc == 0);
 }
 
 static void
-ble_os_test_misc_rx_le_ack(uint16_t ocf, uint8_t status)
+ble_os_test_misc_init(void)
 {
-    ble_os_test_misc_rx_ack(BLE_HCI_OGF_LE, ocf, status);
+    ble_hs_test_util_init();
+
+    ble_os_test_init_app_task();
+
+    /* Receive acknowledgements for the startup sequence.  We sent the
+     * corresponding requests when the host task was started.
+     */
+    ble_hs_test_util_set_startup_acks();
 }
 
 static int
@@ -90,11 +102,6 @@ ble_gap_direct_connect_test_task_handler(void *arg)
     int cb_called;
     int rc;
 
-    /* Receive acknowledgements for the startup sequence.  We sent the
-     * corresponding requests when the host task was started.
-     */
-    ble_hs_test_util_rx_startup_acks();
-
     /* Set the connect callback so we can verify that it gets called with the
      * proper arguments.
      */
@@ -130,12 +137,12 @@ ble_gap_direct_connect_test_task_handler(void *arg)
 
 TEST_CASE(ble_gap_direct_connect_test_case)
 {
-    ble_hs_test_util_init();
+    ble_os_test_misc_init();
 
     os_task_init(&ble_os_test_task,
                  "ble_gap_direct_connect_test_task",
                  ble_gap_direct_connect_test_task_handler, NULL,
-                 BLE_OS_TEST_HS_PRIO + 1, OS_WAIT_FOREVER, ble_os_test_stack,
+                 BLE_OS_TEST_TASK_PRIO, OS_WAIT_FOREVER, ble_os_test_stack,
                  OS_STACK_ALIGN(BLE_OS_TEST_STACK_SIZE));
 
     os_start();
@@ -163,7 +170,7 @@ ble_gap_gen_disc_test_task_handler(void *arg)
     /* Receive acknowledgements for the startup sequence.  We sent the
      * corresponding requests when the host task was started.
      */
-    ble_hs_test_util_rx_startup_acks();
+    ble_hs_test_util_set_startup_acks();
 
     /* Set the connect callback so we can verify that it gets called with the
      * proper arguments.
@@ -177,7 +184,7 @@ ble_gap_gen_disc_test_task_handler(void *arg)
     TEST_ASSERT(!ble_gap_master_in_progress());
 
     /* Initiate the general discovery procedure with a 200 ms timeout. */
-    rc = ble_hs_test_util_disc(200, BLE_GAP_DISC_MODE_GEN,
+    rc = ble_hs_test_util_disc(300, BLE_GAP_DISC_MODE_GEN,
                                BLE_HCI_SCAN_TYPE_ACTIVE,
                                BLE_HCI_SCAN_FILT_NO_WL,
                                ble_gap_gen_disc_test_connect_cb,
@@ -198,9 +205,12 @@ ble_gap_gen_disc_test_task_handler(void *arg)
     TEST_ASSERT(ble_gap_master_in_progress());
     TEST_ASSERT(!cb_called);
 
-    /* Wait 150 more ms; verify scan completed. */
-    os_time_delay(150 * OS_TICKS_PER_SEC / 1000);
-    ble_os_test_misc_rx_le_ack(BLE_HCI_OCF_LE_SET_SCAN_ENABLE, 0);
+    ble_hs_test_util_set_ack(
+        host_hci_opcode_join(BLE_HCI_OGF_LE, BLE_HCI_OCF_LE_SET_SCAN_ENABLE),
+        0);
+
+    /* Wait 250 more ms; verify scan completed. */
+    os_time_delay(250 * OS_TICKS_PER_SEC / 1000);
     TEST_ASSERT(ble_hs_conn_first() == NULL);
     TEST_ASSERT(!ble_gap_master_in_progress());
     TEST_ASSERT(cb_called);
@@ -210,12 +220,12 @@ ble_gap_gen_disc_test_task_handler(void *arg)
 
 TEST_CASE(ble_gap_gen_disc_test_case)
 {
-    ble_hs_test_util_init();
+    ble_os_test_misc_init();
 
     os_task_init(&ble_os_test_task,
                  "ble_gap_gen_disc_test_task",
                  ble_gap_gen_disc_test_task_handler, NULL,
-                 BLE_OS_TEST_HS_PRIO + 1, OS_WAIT_FOREVER, ble_os_test_stack,
+                 BLE_OS_TEST_TASK_PRIO, OS_WAIT_FOREVER, ble_os_test_stack,
                  OS_STACK_ALIGN(BLE_OS_TEST_STACK_SIZE));
 
     os_start();
@@ -252,7 +262,7 @@ ble_gap_terminate_test_task_handler(void *arg)
     /* Receive acknowledgements for the startup sequence.  We sent the
      * corresponding requests when the host task was started.
      */
-    ble_hs_test_util_rx_startup_acks();
+    ble_hs_test_util_set_startup_acks();
 
     /* Set the connect callback so we can verify that it gets called with the
      * proper arguments.
@@ -314,14 +324,39 @@ ble_gap_terminate_test_task_handler(void *arg)
     tu_restart();
 }
 
+static void
+ble_os_test_app_task_handler(void *arg)
+{
+    struct os_callout_func *cf;
+    struct os_event *ev;
+    int rc;
+
+    rc = ble_hs_start();
+    TEST_ASSERT(rc == 0);
+
+    while (1) {
+        ev = os_eventq_get(&ble_hs_test_util_evq);
+        switch (ev->ev_type) {
+        case OS_EVENT_T_TIMER:
+            cf = (struct os_callout_func *)ev;
+            assert(cf->cf_func);
+            cf->cf_func(cf->cf_arg);
+            break;
+        default:
+            assert(0);
+            break;
+        }
+    }
+}
+
 TEST_CASE(ble_gap_terminate_test_case)
 {
-    ble_hs_test_util_init();
+    ble_os_test_misc_init();
 
     os_task_init(&ble_os_test_task,
                  "ble_gap_terminate_test_task",
                  ble_gap_terminate_test_task_handler, NULL,
-                 BLE_OS_TEST_HS_PRIO + 1, OS_WAIT_FOREVER, ble_os_test_stack,
+                 BLE_OS_TEST_TASK_PRIO, OS_WAIT_FOREVER, ble_os_test_stack,
                  OS_STACK_ALIGN(BLE_OS_TEST_STACK_SIZE));
 
     os_start();

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e32f9f9f/net/nimble/include/nimble/hci_common.h
----------------------------------------------------------------------
diff --git a/net/nimble/include/nimble/hci_common.h b/net/nimble/include/nimble/hci_common.h
index e2874a7..2d43652 100644
--- a/net/nimble/include/nimble/hci_common.h
+++ b/net/nimble/include/nimble/hci_common.h
@@ -142,7 +142,7 @@
 
 /* --- LE read buffer size (OCF 0x0002) --- */
 #define BLE_HCI_RD_BUF_SIZE_LEN             (0)
-#define BLE_HCI_RD_BUF_SIZE_RSPLEN          (3)
+#define BLE_HCI_RD_BUF_SIZE_RSPLEN          (3) /* No status byte. */
 
 /* --- LE read local supported features (OCF 0x0003) --- */
 #define BLE_HCI_RD_LOC_SUPP_FEAT_RSPLEN     (8)