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 2015/11/19 20:52:31 UTC

incubator-mynewt-larva git commit: (ble host) Send MTU response as server.

Repository: incubator-mynewt-larva
Updated Branches:
  refs/heads/master c9d16694d -> 03abc47b0


(ble host) Send MTU response as server.


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/03abc47b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/03abc47b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/03abc47b

Branch: refs/heads/master
Commit: 03abc47b044e6f73c4a3751e42131cc6d9750117
Parents: c9d1669
Author: Christopher Collins <cc...@gmail.com>
Authored: Thu Nov 19 11:52:12 2015 -0800
Committer: Christopher Collins <cc...@gmail.com>
Committed: Thu Nov 19 11:52:12 2015 -0800

----------------------------------------------------------------------
 net/nimble/host/src/ble_hs_att.c            |  76 +++++++++++----
 net/nimble/host/src/ble_hs_att_cmd.c        |  54 +++++------
 net/nimble/host/src/ble_hs_att_cmd.h        |  28 ++----
 net/nimble/host/src/ble_l2cap.c             |   6 +-
 net/nimble/host/src/ble_l2cap.h             |   6 +-
 net/nimble/host/src/test/ble_hs_att_test.c  | 116 +++++++++++++++++------
 net/nimble/host/src/test/ble_hs_conn_test.c |   4 +-
 7 files changed, 190 insertions(+), 100 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/03abc47b/net/nimble/host/src/ble_hs_att.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_hs_att.c b/net/nimble/host/src/ble_hs_att.c
index be63df7..4e17551 100644
--- a/net/nimble/host/src/ble_hs_att.c
+++ b/net/nimble/host/src/ble_hs_att.c
@@ -313,7 +313,6 @@ ble_hs_att_tx_error_rsp(struct ble_l2cap_chan *chan, uint8_t req_op,
                         uint16_t handle, uint8_t error_code)
 {
     struct ble_hs_att_error_rsp rsp;
-    uint8_t buf[BLE_HS_ATT_ERROR_RSP_SZ];
     int rc;
 
     rsp.bhaep_op = BLE_HS_ATT_OP_ERROR_RSP;
@@ -321,10 +320,11 @@ ble_hs_att_tx_error_rsp(struct ble_l2cap_chan *chan, uint8_t req_op,
     rsp.bhaep_handle = handle;
     rsp.bhaep_error_code = error_code;
 
-    rc = ble_hs_att_error_rsp_write(buf, sizeof buf, &rsp);
+    rc = ble_hs_att_error_rsp_write(ble_hs_att_tx_buf,
+                                    BLE_HS_ATT_ERROR_RSP_SZ, &rsp);
     assert(rc == 0);
 
-    rc = ble_l2cap_tx(chan, buf, sizeof buf);
+    rc = ble_l2cap_tx(chan, ble_hs_att_tx_buf, BLE_HS_ATT_ERROR_RSP_SZ);
     if (rc != 0) {
         return rc;
     }
@@ -333,11 +333,37 @@ ble_hs_att_tx_error_rsp(struct ble_l2cap_chan *chan, uint8_t req_op,
 }
 
 static int
+ble_hs_att_tx_mtu_cmd(struct ble_l2cap_chan *chan, uint8_t op, uint16_t mtu)
+{
+    struct ble_hs_att_mtu_cmd cmd;
+    int rc;
+
+    assert(!(chan->blc_flags & BLE_L2CAP_CHAN_F_TXED_MTU));
+    assert(op == BLE_HS_ATT_OP_MTU_REQ || op == BLE_HS_ATT_OP_MTU_RSP);
+    assert(mtu >= BLE_HS_ATT_MTU_DFLT);
+
+    cmd.bhamc_op = op;
+    cmd.bhamc_mtu = mtu;
+
+    rc = ble_hs_att_mtu_cmd_write(ble_hs_att_tx_buf, BLE_HS_ATT_MTU_MAX,
+                                  &cmd);
+    assert(rc == 0);
+
+    rc = ble_l2cap_tx(chan, ble_hs_att_tx_buf, BLE_HS_ATT_MTU_CMD_SZ);
+    if (rc != 0) {
+        return rc;
+    }
+
+    chan->blc_flags |= BLE_L2CAP_CHAN_F_TXED_MTU;
+
+    return 0;
+}
+
+static int
 ble_hs_att_rx_mtu_req(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
                       struct os_mbuf *om)
 {
-    struct ble_hs_att_mtu_req req;
-    uint8_t buf[BLE_HS_ATT_MTU_REQ_SZ];
+    struct ble_hs_att_mtu_cmd cmd;
     int rc;
 
     /* We should only receive this command as a server. */
@@ -346,19 +372,23 @@ ble_hs_att_rx_mtu_req(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
         return EINVAL;
     }
 
-    rc = os_mbuf_copydata(om, 0, sizeof buf, buf);
+    rc = os_mbuf_copydata(om, 0, BLE_HS_ATT_MTU_CMD_SZ, ble_hs_att_tx_buf);
     assert(rc == 0);
 
-    rc = ble_hs_att_mtu_req_parse(buf, sizeof buf, &req);
+    rc = ble_hs_att_mtu_cmd_parse(ble_hs_att_tx_buf, BLE_HS_ATT_MTU_CMD_SZ,
+                                  &cmd);
     assert(rc == 0);
 
-    if (req.bhamq_mtu < BLE_HS_ATT_MTU_DFLT) {
-        req.bhamq_mtu = BLE_HS_ATT_MTU_DFLT;
+    if (cmd.bhamc_mtu < BLE_HS_ATT_MTU_DFLT) {
+        cmd.bhamc_mtu = BLE_HS_ATT_MTU_DFLT;
     }
 
-    chan->blc_peer_mtu = req.bhamq_mtu;
+    chan->blc_peer_mtu = cmd.bhamc_mtu;
 
-    /* XXX: Send response. */
+    rc = ble_hs_att_tx_mtu_cmd(chan, BLE_HS_ATT_OP_MTU_RSP, chan->blc_my_mtu);
+    if (rc != 0) {
+        return rc;
+    }
 
     return 0;
 }
@@ -463,16 +493,17 @@ ble_hs_att_rx_find_info_req(struct ble_hs_conn *conn,
 {
     struct ble_hs_att_find_info_req req;
     struct ble_hs_att_find_info_rsp rsp;
-    uint8_t buf[BLE_HS_ATT_FIND_INFO_REQ_SZ];
     int rsp_sz;
     int rc;
 
-    rc = os_mbuf_copydata(om, 0, sizeof buf, buf);
+    rc = os_mbuf_copydata(om, 0, BLE_HS_ATT_FIND_INFO_REQ_SZ,
+                          ble_hs_att_tx_buf);
     if (rc != 0) {
         return rc;
     }
 
-    rc = ble_hs_att_find_info_req_parse(buf, sizeof buf, &req);
+    rc = ble_hs_att_find_info_req_parse(ble_hs_att_tx_buf,
+                                        BLE_HS_ATT_FIND_INFO_REQ_SZ, &req);
     assert(rc == 0);
 
     /* Tx error response if start handle is greater than end handle or is equal
@@ -509,7 +540,8 @@ ble_hs_att_rx_find_info_req(struct ble_hs_conn *conn,
      */
     rsp.bhafp_op = BLE_HS_ATT_OP_FIND_INFO_RSP;
     rc = ble_hs_att_find_info_rsp_write(ble_hs_att_tx_buf,
-                                        BLE_HS_ATT_FIND_INFO_RSP_MIN_SZ, &rsp);
+                                        BLE_HS_ATT_FIND_INFO_RSP_MIN_SZ,
+                                        &rsp);
     assert(rc == 0);
 
     rc = ble_l2cap_tx(chan, ble_hs_att_tx_buf,
@@ -559,15 +591,15 @@ ble_hs_att_rx_read_req(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
     union ble_hs_att_handle_arg arg;
     struct ble_hs_att_read_req req;
     struct ble_hs_att_entry *entry;
-    uint8_t buf[BLE_HS_ATT_READ_REQ_SZ];
     int rc;
 
-    rc = os_mbuf_copydata(om, 0, sizeof buf, buf);
+    rc = os_mbuf_copydata(om, 0, BLE_HS_ATT_READ_REQ_SZ, ble_hs_att_tx_buf);
     if (rc != 0) {
         return rc;
     }
 
-    rc = ble_hs_att_read_req_parse(buf, sizeof buf, &req);
+    rc = ble_hs_att_read_req_parse(ble_hs_att_tx_buf, BLE_HS_ATT_READ_REQ_SZ,
+                                   &req);
     assert(rc == 0);
 
     rc = ble_hs_att_find_by_handle(req.bharq_handle, &entry);
@@ -625,15 +657,16 @@ ble_hs_att_rx_write_req(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
     union ble_hs_att_handle_arg arg;
     struct ble_hs_att_write_req req;
     struct ble_hs_att_entry *entry;
-    uint8_t buf[BLE_HS_ATT_WRITE_REQ_MIN_SZ];
     int rc;
 
-    rc = os_mbuf_copydata(om, 0, sizeof buf, buf);
+    rc = os_mbuf_copydata(om, 0, BLE_HS_ATT_WRITE_REQ_MIN_SZ,
+                          ble_hs_att_tx_buf);
     if (rc != 0) {
         return rc;
     }
 
-    rc = ble_hs_att_write_req_parse(buf, sizeof buf, &req);
+    rc = ble_hs_att_write_req_parse(ble_hs_att_tx_buf,
+                                    BLE_HS_ATT_WRITE_REQ_MIN_SZ, &req);
     assert(rc == 0);
 
     rc = ble_hs_att_find_by_handle(req.bhawq_handle, &entry);
@@ -704,6 +737,7 @@ ble_hs_att_create_chan(void)
     }
 
     chan->blc_cid = BLE_L2CAP_CID_ATT;
+    chan->blc_my_mtu = BLE_HS_ATT_MTU_DFLT;
     chan->blc_default_mtu = BLE_HS_ATT_MTU_DFLT;
     chan->blc_rx_fn = ble_hs_att_rx;
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/03abc47b/net/nimble/host/src/ble_hs_att_cmd.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_hs_att_cmd.c b/net/nimble/host/src/ble_hs_att_cmd.c
index 0369cfd..d547f3d 100644
--- a/net/nimble/host/src/ble_hs_att_cmd.c
+++ b/net/nimble/host/src/ble_hs_att_cmd.c
@@ -66,21 +66,23 @@ ble_hs_att_error_rsp_write(void *payload, int len,
 }
 
 int
-ble_hs_att_mtu_req_parse(void *payload, int len,
-                         struct ble_hs_att_mtu_req *req)
+ble_hs_att_mtu_cmd_parse(void *payload, int len,
+                         struct ble_hs_att_mtu_cmd *cmd)
 {
     uint8_t *u8ptr;
 
-    if (len < BLE_HS_ATT_MTU_REQ_SZ) {
+    if (len < BLE_HS_ATT_MTU_CMD_SZ) {
         return EMSGSIZE;
     }
 
     u8ptr = payload;
 
-    req->bhamq_op = u8ptr[0];
-    req->bhamq_mtu = le16toh(u8ptr + 1);
+    cmd->bhamc_op = u8ptr[0];
+    cmd->bhamc_mtu = le16toh(u8ptr + 1);
+
+    if (cmd->bhamc_op != BLE_HS_ATT_OP_MTU_REQ &&
+        cmd->bhamc_op != BLE_HS_ATT_OP_MTU_RSP) {
 
-    if (req->bhamq_op != BLE_HS_ATT_OP_MTU_REQ) {
         return EINVAL;
     }
 
@@ -88,6 +90,24 @@ ble_hs_att_mtu_req_parse(void *payload, int len,
 }
 
 int
+ble_hs_att_mtu_cmd_write(void *payload, int len,
+                         struct ble_hs_att_mtu_cmd *cmd)
+{
+    uint8_t *u8ptr;
+
+    if (len < BLE_HS_ATT_MTU_CMD_SZ) {
+        return EMSGSIZE;
+    }
+
+    u8ptr = payload;
+
+    u8ptr[0] = cmd->bhamc_op;
+    htole16(u8ptr + 1, cmd->bhamc_mtu);
+
+    return 0;
+}
+
+int
 ble_hs_att_find_info_req_parse(void *payload, int len,
                                struct ble_hs_att_find_info_req *req)
 {
@@ -170,28 +190,6 @@ ble_hs_att_find_info_rsp_write(void *payload, int len,
 }
 
 int
-ble_hs_att_mtu_rsp_parse(void *payload, int len,
-                         struct ble_hs_att_mtu_rsp *rsp)
-{
-    uint8_t *u8ptr;
-
-    if (len < BLE_HS_ATT_MTU_RSP_SZ) {
-        return EMSGSIZE;
-    }
-
-    u8ptr = payload;
-
-    rsp->bhamp_op = u8ptr[0];
-    rsp->bhamp_mtu = le16toh(u8ptr + 1);
-
-    if (rsp->bhamp_op != BLE_HS_ATT_OP_MTU_RSP) {
-        return EINVAL;
-    }
-
-    return 0;
-}
-
-int
 ble_hs_att_read_req_parse(void *payload, int len,
                           struct ble_hs_att_read_req *req)
 {

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/03abc47b/net/nimble/host/src/ble_hs_att_cmd.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_hs_att_cmd.h b/net/nimble/host/src/ble_hs_att_cmd.h
index a9caaf8..5694057 100644
--- a/net/nimble/host/src/ble_hs_att_cmd.h
+++ b/net/nimble/host/src/ble_hs_att_cmd.h
@@ -47,24 +47,12 @@ struct ble_hs_att_error_rsp {
  * | Parameter                          | Size (octets)     |
  * +------------------------------------+-------------------+
  * | Attribute Opcode                   | 1                 |
- * | Client Rx MTU                      | 2                 |
- */
-#define BLE_HS_ATT_MTU_REQ_SZ               3
-struct ble_hs_att_mtu_req {
-    uint8_t bhamq_op;
-    uint16_t bhamq_mtu;
-};
-
-/**
- * | Parameter                          | Size (octets)     |
- * +------------------------------------+-------------------+
- * | Attribute Opcode                   | 1                 |
  * | Server Rx MTU                      | 2                 |
  */
-#define BLE_HS_ATT_MTU_RSP_SZ               3
-struct ble_hs_att_mtu_rsp {
-    uint8_t bhamp_op;
-    uint16_t bhamp_mtu;
+#define BLE_HS_ATT_MTU_CMD_SZ               3
+struct ble_hs_att_mtu_cmd {
+    uint8_t bhamc_op;
+    uint16_t bhamc_mtu;
 };
 
 /**
@@ -137,10 +125,10 @@ int ble_hs_att_error_rsp_parse(void *payload, int len,
                                struct ble_hs_att_error_rsp *rsp);
 int ble_hs_att_error_rsp_write(void *payload, int len,
                                struct ble_hs_att_error_rsp *rsp);
-int ble_hs_att_mtu_req_parse(void *payload, int len,
-                             struct ble_hs_att_mtu_req *req);
-int ble_hs_att_mtu_rsp_parse(void *payload, int len,
-                             struct ble_hs_att_mtu_rsp *rsp);
+int ble_hs_att_mtu_cmd_parse(void *payload, int len,
+                             struct ble_hs_att_mtu_cmd *cmd);
+int ble_hs_att_mtu_cmd_write(void *payload, int len,
+                             struct ble_hs_att_mtu_cmd *cmd);
 int ble_hs_att_find_info_req_parse(void *payload, int len,
                                    struct ble_hs_att_find_info_req *req);
 int ble_hs_att_find_info_req_write(void *payload, int len,

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/03abc47b/net/nimble/host/src/ble_l2cap.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_l2cap.c b/net/nimble/host/src/ble_l2cap.c
index 9accbb8..07d0bef 100644
--- a/net/nimble/host/src/ble_l2cap.c
+++ b/net/nimble/host/src/ble_l2cap.c
@@ -75,12 +75,16 @@ ble_l2cap_chan_mtu(struct ble_l2cap_chan *chan)
     /* If either side has not exchanged MTU size, use the default.  Otherwise,
      * use the lesser of the two exchanged values.
      */
-    if (chan->blc_my_mtu == 0 || chan->blc_peer_mtu == 0) {
+    if (!(chan->blc_flags & BLE_L2CAP_CHAN_F_TXED_MTU) ||
+        chan->blc_peer_mtu == 0) {
+
         mtu = chan->blc_default_mtu;
     } else {
         mtu = min(chan->blc_my_mtu, chan->blc_peer_mtu);
     }
 
+    assert(mtu >= chan->blc_default_mtu);
+
     return mtu;
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/03abc47b/net/nimble/host/src/ble_l2cap.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_l2cap.h b/net/nimble/host/src/ble_l2cap.h
index c2d0f08..f6cd5cc 100644
--- a/net/nimble/host/src/ble_l2cap.h
+++ b/net/nimble/host/src/ble_l2cap.h
@@ -43,13 +43,17 @@ typedef int ble_l2cap_rx_fn(struct ble_hs_conn *conn,
 typedef int ble_l2cap_tx_fn(struct ble_hs_conn *conn,
                             struct ble_l2cap_chan *chan);
 
+typedef uint8_t ble_l2cap_chan_flags;
+#define BLE_L2CAP_CHAN_F_TXED_MTU       0x01    /* We have sent our MTU. */
+
 struct ble_l2cap_chan
 {
     SLIST_ENTRY(ble_l2cap_chan) blc_next;
     uint16_t blc_cid;
-    uint16_t blc_my_mtu;        /* 0 if not exchanged. */
+    uint16_t blc_my_mtu;
     uint16_t blc_peer_mtu;      /* 0 if not exchanged. */
     uint16_t blc_default_mtu;
+    ble_l2cap_chan_flags blc_flags;
 
     struct os_mbuf *blc_rx_buf;
     struct os_mbuf *blc_tx_buf;

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/03abc47b/net/nimble/host/src/test/ble_hs_att_test.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_hs_att_test.c b/net/nimble/host/src/test/ble_hs_att_test.c
index 6b3c493..82fab92 100644
--- a/net/nimble/host/src/test/ble_hs_att_test.c
+++ b/net/nimble/host/src/test/ble_hs_att_test.c
@@ -33,6 +33,23 @@ static int ble_hs_att_test_attr_1_len;
 static uint8_t ble_hs_att_test_attr_2[1024];
 static int ble_hs_att_test_attr_2_len;
 
+static void
+ble_hs_att_test_misc_init(struct ble_hs_conn **conn,
+                          struct ble_l2cap_chan **att_chan)
+{
+    int rc;
+
+    rc = ble_hs_init(10);
+    TEST_ASSERT_FATAL(rc == 0);
+
+    ble_hs_test_util_create_conn(2, ((uint8_t[]){2,3,4,5,6,7,8,9}));
+    *conn = ble_hs_conn_find(2);
+    TEST_ASSERT_FATAL(*conn != NULL);
+
+    *att_chan = ble_hs_conn_chan_find(*conn, BLE_L2CAP_CID_ATT);
+    TEST_ASSERT_FATAL(*att_chan != NULL);
+}
+
 static int
 ble_hs_att_test_misc_attr_fn_1(struct ble_hs_att_entry *entry,
                                uint8_t op, union ble_hs_att_handle_arg *arg)
@@ -136,6 +153,27 @@ ble_hs_att_test_misc_verify_tx_write_rsp(struct ble_l2cap_chan *chan)
                 BLE_HS_ATT_WRITE_RSP_SZ);
 }
 
+static void
+ble_hs_att_test_misc_verify_tx_mtu_rsp(struct ble_l2cap_chan *chan)
+{
+    struct ble_hs_att_mtu_cmd rsp;
+    uint8_t buf[BLE_HS_ATT_MTU_CMD_SZ];
+    int rc;
+
+    rc = os_mbuf_copydata(chan->blc_tx_buf, 0, sizeof buf, buf);
+    TEST_ASSERT(rc == 0);
+
+    rc = ble_hs_att_mtu_cmd_parse(buf, sizeof buf, &rsp);
+    TEST_ASSERT(rc == 0);
+
+    TEST_ASSERT(rsp.bhamc_op == BLE_HS_ATT_OP_MTU_RSP);
+    TEST_ASSERT(rsp.bhamc_mtu == chan->blc_my_mtu);
+
+    /* Remove the write response from the buffer. */
+    os_mbuf_adj(&ble_l2cap_mbuf_pool, chan->blc_tx_buf,
+                BLE_HS_ATT_MTU_CMD_SZ);
+}
+
 struct ble_hs_att_test_info_entry {
     uint16_t handle;        /* 0 on last entry */
     uint16_t uuid16;        /* 0 if not present. */
@@ -198,6 +236,52 @@ ble_hs_att_test_misc_verify_tx_find_info_rsp(
     os_mbuf_adj(&ble_l2cap_mbuf_pool, chan->blc_tx_buf, off);
 }
 
+static void
+ble_hs_att_test_misc_mtu_exchange(uint16_t my_mtu, uint16_t peer_sent,
+                                  uint16_t peer_actual, uint16_t chan_mtu)
+{
+    struct ble_hs_att_mtu_cmd req;
+    struct ble_l2cap_chan *chan;
+    struct ble_hs_conn *conn;
+    uint8_t buf[BLE_HS_ATT_MTU_CMD_SZ];
+    int rc;
+
+    ble_hs_att_test_misc_init(&conn, &chan);
+
+    chan->blc_my_mtu = my_mtu;
+
+    req.bhamc_op = BLE_HS_ATT_OP_MTU_REQ;
+    req.bhamc_mtu = peer_sent;
+    rc = ble_hs_att_mtu_cmd_write(buf, sizeof buf, &req);
+    TEST_ASSERT(rc == 0);
+
+    rc = ble_l2cap_rx_payload(conn, chan, buf, sizeof buf);
+    TEST_ASSERT(rc == 0);
+
+    TEST_ASSERT(chan->blc_peer_mtu == peer_actual);
+
+    ble_hs_att_test_misc_verify_tx_mtu_rsp(chan);
+
+    TEST_ASSERT(ble_l2cap_chan_mtu(chan) == chan_mtu);
+}
+
+TEST_CASE(ble_hs_att_test_mtu)
+{
+    /*** MTU too low; should pretend peer sent default value instead. */
+    ble_hs_att_test_misc_mtu_exchange(BLE_HS_ATT_MTU_DFLT, 5,
+                                      BLE_HS_ATT_MTU_DFLT,
+                                      BLE_HS_ATT_MTU_DFLT);
+
+    /*** MTUs equal. */
+    ble_hs_att_test_misc_mtu_exchange(50, 50, 50, 50);
+
+    /*** Peer's higher than mine. */
+    ble_hs_att_test_misc_mtu_exchange(50, 100, 100, 50);
+
+    /*** Mine higher than peer's. */
+    ble_hs_att_test_misc_mtu_exchange(100, 50, 50, 50);
+}
+
 TEST_CASE(ble_hs_att_test_read)
 {
     struct ble_hs_att_read_req req;
@@ -207,15 +291,7 @@ TEST_CASE(ble_hs_att_test_read)
     uint8_t uuid[16] = {0};
     int rc;
 
-    rc = ble_hs_init(10);
-    TEST_ASSERT_FATAL(rc == 0);
-
-    ble_hs_test_util_create_conn(2, ((uint8_t[]){2,3,4,5,6,7,8,9}));
-    conn = ble_hs_conn_find(2);
-    TEST_ASSERT_FATAL(conn != NULL);
-
-    chan = ble_hs_conn_chan_find(conn, BLE_L2CAP_CID_ATT);
-    TEST_ASSERT_FATAL(chan != NULL);
+    ble_hs_att_test_misc_init(&conn, &chan);
 
     /*** Nonexistent attribute. */
     req.bharq_op = BLE_HS_ATT_OP_READ_REQ;
@@ -270,15 +346,7 @@ TEST_CASE(ble_hs_att_test_write)
     uint8_t uuid[16] = {0};
     int rc;
 
-    rc = ble_hs_init(10);
-    TEST_ASSERT_FATAL(rc == 0);
-
-    ble_hs_test_util_create_conn(2, ((uint8_t[]){2,3,4,5,6,7,8,9}));
-    conn = ble_hs_conn_find(2);
-    TEST_ASSERT_FATAL(conn != NULL);
-
-    chan = ble_hs_conn_chan_find(conn, BLE_L2CAP_CID_ATT);
-    TEST_ASSERT_FATAL(chan != NULL);
+    ble_hs_att_test_misc_init(&conn, &chan);
 
     /*** Nonexistent attribute. */
     req.bhawq_op = BLE_HS_ATT_OP_WRITE_REQ;
@@ -325,19 +393,12 @@ TEST_CASE(ble_hs_att_test_find_info)
     };
     int rc;
 
-    rc = ble_hs_init(10);
-    TEST_ASSERT_FATAL(rc == 0);
-
-    ble_hs_test_util_create_conn(2, ((uint8_t[]){2,3,4,5,6,7,8,9}));
-    conn = ble_hs_conn_find(2);
-    TEST_ASSERT_FATAL(conn != NULL);
-
-    chan = ble_hs_conn_chan_find(conn, BLE_L2CAP_CID_ATT);
-    TEST_ASSERT_FATAL(chan != NULL);
+    ble_hs_att_test_misc_init(&conn, &chan);
 
     /* Increase the MTU to 128 bytes to allow testing of long responses. */
     chan->blc_my_mtu = 128;
     chan->blc_peer_mtu = 128;
+    chan->blc_flags |= BLE_L2CAP_CHAN_F_TXED_MTU;
 
     /*** Start handle of 0. */
     req.bhafq_op = BLE_HS_ATT_OP_FIND_INFO_REQ;
@@ -485,6 +546,7 @@ TEST_CASE(ble_hs_att_test_find_info)
 
 TEST_SUITE(att_suite)
 {
+    ble_hs_att_test_mtu();
     ble_hs_att_test_read();
     ble_hs_att_test_write();
     ble_hs_att_test_find_info();

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/03abc47b/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 8b709d4..d458e14 100644
--- a/net/nimble/host/src/test/ble_hs_conn_test.c
+++ b/net/nimble/host/src/test/ble_hs_conn_test.c
@@ -70,7 +70,7 @@ TEST_CASE(ble_hs_conn_test_master_direct_success)
 
     chan = ble_hs_conn_chan_find(conn, BLE_L2CAP_CID_ATT);
     TEST_ASSERT_FATAL(chan != NULL);
-    TEST_ASSERT(chan->blc_my_mtu == 0);
+    TEST_ASSERT(chan->blc_my_mtu == BLE_HS_ATT_MTU_DFLT);
     TEST_ASSERT(chan->blc_peer_mtu == 0);
     TEST_ASSERT(chan->blc_default_mtu == BLE_HS_ATT_MTU_DFLT);
 }
@@ -165,7 +165,7 @@ TEST_CASE(ble_hs_conn_test_slave_direct_success)
 
     chan = ble_hs_conn_chan_find(conn, BLE_L2CAP_CID_ATT);
     TEST_ASSERT_FATAL(chan != NULL);
-    TEST_ASSERT(chan->blc_my_mtu == 0);
+    TEST_ASSERT(chan->blc_my_mtu == BLE_HS_ATT_MTU_DFLT);
     TEST_ASSERT(chan->blc_peer_mtu == 0);
     TEST_ASSERT(chan->blc_default_mtu == BLE_HS_ATT_MTU_DFLT);
 }