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/12/05 03:09:13 UTC

[2/5] incubator-mynewt-larva git commit: ATT Read By Type client-side.

ATT Read By Type client-side.


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

Branch: refs/heads/master
Commit: 380c4b435eee199db3c2b46fbbbd60ce1048fd58
Parents: 300c33c
Author: Christopher Collins <cc...@gmail.com>
Authored: Fri Dec 4 15:44:26 2015 -0800
Committer: Christopher Collins <cc...@gmail.com>
Committed: Fri Dec 4 18:08:24 2015 -0800

----------------------------------------------------------------------
 net/nimble/host/src/ble_att.c     |   3 +-
 net/nimble/host/src/ble_att.h     |  13 +++-
 net/nimble/host/src/ble_att_clt.c | 117 +++++++++++++++++++++++++++++++--
 net/nimble/host/src/ble_att_cmd.c |   8 +--
 net/nimble/host/src/ble_att_cmd.h |  12 ++--
 net/nimble/host/src/ble_att_svr.c |   7 +-
 6 files changed, 138 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/380c4b43/net/nimble/host/src/ble_att.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_att.c b/net/nimble/host/src/ble_att.c
index afef850..bc7000a 100644
--- a/net/nimble/host/src/ble_att.c
+++ b/net/nimble/host/src/ble_att.c
@@ -38,8 +38,9 @@ static struct ble_att_rx_dispatch_entry ble_att_rx_dispatch[] = {
     { BLE_ATT_OP_FIND_TYPE_VALUE_REQ,  ble_att_svr_rx_find_type_value },
     { BLE_ATT_OP_FIND_TYPE_VALUE_RSP,  ble_att_clt_rx_find_type_value },
     { BLE_ATT_OP_READ_TYPE_REQ,        ble_att_svr_rx_read_type },
+    { BLE_ATT_OP_READ_TYPE_RSP,        ble_att_clt_rx_read_type },
     { BLE_ATT_OP_READ_REQ,             ble_att_svr_rx_read },
-    { BLE_ATT_OP_READ_GROUP_TYPE_RSP,  ble_att_clt_rx_read_group_type_rsp },
+    { BLE_ATT_OP_READ_GROUP_TYPE_RSP,  ble_att_clt_rx_read_group_type },
     { BLE_ATT_OP_WRITE_REQ,            ble_att_svr_rx_write },
 };
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/380c4b43/net/nimble/host/src/ble_att.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_att.h b/net/nimble/host/src/ble_att.h
index b1c2ad6..0ee0724 100644
--- a/net/nimble/host/src/ble_att.h
+++ b/net/nimble/host/src/ble_att.h
@@ -26,6 +26,7 @@ struct ble_att_find_info_req;
 struct ble_att_error_rsp;
 struct ble_att_mtu_cmd;
 struct ble_att_read_req;
+struct ble_att_read_type_req;
 struct ble_att_read_group_type_req;
 struct ble_att_read_group_type_rsp;
 struct ble_att_find_type_value_req;
@@ -148,12 +149,18 @@ int ble_att_clt_rx_mtu(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
                        struct os_mbuf **om);
 int ble_att_clt_tx_read(struct ble_hs_conn *conn,
                         struct ble_att_read_req *req);
+int ble_att_clt_tx_read_type(struct ble_hs_conn *conn,
+                             struct ble_att_read_type_req *req,
+                             void *uuid128);
+int ble_att_clt_rx_read_type(struct ble_hs_conn *conn,
+                             struct ble_l2cap_chan *chan,
+                             struct os_mbuf **om);
 int ble_att_clt_tx_read_group_type(struct ble_hs_conn *conn,
                                    struct ble_att_read_group_type_req *req,
                                    void *uuid128);
-int ble_att_clt_rx_read_group_type_rsp(struct ble_hs_conn *conn,
-                                       struct ble_l2cap_chan *chan,
-                                       struct os_mbuf **om);
+int ble_att_clt_rx_read_group_type(struct ble_hs_conn *conn,
+                                   struct ble_l2cap_chan *chan,
+                                   struct os_mbuf **om);
 int ble_att_clt_tx_find_info(struct ble_hs_conn *conn,
                              struct ble_att_find_info_req *req);
 int ble_att_clt_rx_find_info(struct ble_hs_conn *conn,

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/380c4b43/net/nimble/host/src/ble_att_clt.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_att_clt.c b/net/nimble/host/src/ble_att_clt.c
index c2eb6bc..0a14db9 100644
--- a/net/nimble/host/src/ble_att_clt.c
+++ b/net/nimble/host/src/ble_att_clt.c
@@ -295,6 +295,112 @@ err:
 }
 
 int
+ble_att_clt_tx_read_type(struct ble_hs_conn *conn,
+                         struct ble_att_read_type_req *req,
+                         void *uuid128)
+{
+    struct ble_l2cap_chan *chan;
+    struct os_mbuf *txom;
+    int rc;
+
+    txom = NULL;
+
+    if (req->batq_start_handle == 0 ||
+        req->batq_start_handle > req->batq_end_handle) {
+
+        rc = EINVAL;
+        goto err;
+    }
+
+    rc = ble_att_clt_prep_req(conn, &chan, &txom,
+                              BLE_ATT_READ_TYPE_REQ_BASE_SZ);
+    if (rc != 0) {
+        goto err;
+    }
+
+    rc = ble_att_read_type_req_write(txom->om_data, txom->om_len, req);
+    if (rc != 0) {
+        goto err;
+    }
+
+    rc = ble_hs_uuid_append(txom, uuid128);
+    if (rc != 0) {
+        goto err;
+    }
+
+    rc = ble_l2cap_tx(chan, txom);
+    txom = NULL;
+    if (rc != 0) {
+        goto err;
+    }
+
+    return 0;
+
+err:
+    os_mbuf_free_chain(txom);
+    return rc;
+}
+
+static int
+ble_att_clt_parse_type_attribute_data(struct os_mbuf **om, int data_len,
+                                      struct ble_att_clt_adata *adata)
+{
+    *om = os_mbuf_pullup(*om, data_len);
+    if (*om == NULL) {
+        return ENOMEM;
+    }
+
+    adata->att_handle = le16toh((*om)->om_data + 0);
+    adata->end_group_handle = 0;
+    adata->value_len = data_len - BLE_ATT_READ_TYPE_ADATA_BASE_SZ;
+    adata->value = (*om)->om_data + BLE_ATT_READ_TYPE_ADATA_BASE_SZ;
+
+    return 0;
+}
+
+int
+ble_att_clt_rx_read_type(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
+                         struct os_mbuf **rxom)
+{
+    struct ble_att_read_type_rsp rsp;
+    struct ble_att_clt_adata adata;
+    int rc;
+
+    *rxom = os_mbuf_pullup(*rxom, BLE_ATT_READ_TYPE_RSP_BASE_SZ);
+    if (*rxom == NULL) {
+        rc = ENOMEM;
+        goto done;
+    }
+
+    rc = ble_att_read_type_rsp_parse((*rxom)->om_data, (*rxom)->om_len, &rsp);
+    if (rc != 0) {
+        goto done;
+    }
+
+    /* Strip the base from the front of the response. */
+    os_mbuf_adj(*rxom, BLE_ATT_READ_TYPE_RSP_BASE_SZ);
+
+    /* Parse the Attribute Data List field, passing each entry to the GATT. */
+    while (OS_MBUF_PKTLEN(*rxom) > 0) {
+        rc = ble_att_clt_parse_type_attribute_data(rxom, rsp.batp_length,
+                                                   &adata);
+        if (rc != 0) {
+            goto done;
+        }
+
+        //ble_gatt_rx_read_type_adata(conn, &adata);
+        os_mbuf_adj(*rxom, rsp.batp_length);
+    }
+
+done:
+    /* Notify GATT that the response is done being parsed. */
+    //ble_gatt_rx_read_type_complete(conn, rc);
+
+    return 0;
+
+}
+
+int
 ble_att_clt_tx_read_group_type(struct ble_hs_conn *conn,
                                struct ble_att_read_group_type_req *req,
                                void *uuid128)
@@ -343,7 +449,7 @@ err:
 }
 
 static int
-ble_att_clt_parse_attribute_data(struct os_mbuf **om, int data_len,
+ble_att_clt_parse_group_attribute_data(struct os_mbuf **om, int data_len,
                                  struct ble_att_clt_adata *adata)
 {
     *om = os_mbuf_pullup(*om, data_len);
@@ -360,9 +466,9 @@ ble_att_clt_parse_attribute_data(struct os_mbuf **om, int data_len,
 }
 
 int
-ble_att_clt_rx_read_group_type_rsp(struct ble_hs_conn *conn,
-                                   struct ble_l2cap_chan *chan,
-                                   struct os_mbuf **rxom)
+ble_att_clt_rx_read_group_type(struct ble_hs_conn *conn,
+                               struct ble_l2cap_chan *chan,
+                               struct os_mbuf **rxom)
 {
     struct ble_att_read_group_type_rsp rsp;
     struct ble_att_clt_adata adata;
@@ -385,7 +491,8 @@ ble_att_clt_rx_read_group_type_rsp(struct ble_hs_conn *conn,
 
     /* Parse the Attribute Data List field, passing each entry to the GATT. */
     while (OS_MBUF_PKTLEN(*rxom) > 0) {
-        rc = ble_att_clt_parse_attribute_data(rxom, rsp.bagp_length, &adata);
+        rc = ble_att_clt_parse_group_attribute_data(rxom, rsp.bagp_length,
+                                                    &adata);
         if (rc != 0) {
             goto done;
         }

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/380c4b43/net/nimble/host/src/ble_att_cmd.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_att_cmd.c b/net/nimble/host/src/ble_att_cmd.c
index 1fad7c7..c0624cc 100644
--- a/net/nimble/host/src/ble_att_cmd.c
+++ b/net/nimble/host/src/ble_att_cmd.c
@@ -290,13 +290,13 @@ ble_att_read_type_rsp_parse(void *payload, int len,
 {
     uint8_t *u8ptr;
 
-    if (len < BLE_ATT_READ_TYPE_RSP_MIN_SZ) {
+    if (len < BLE_ATT_READ_TYPE_RSP_BASE_SZ) {
         return EMSGSIZE;
     }
 
     u8ptr = payload;
 
-    rsp->batp_len = u8ptr[1];
+    rsp->batp_length = u8ptr[1];
 
     return 0;
 }
@@ -307,14 +307,14 @@ ble_att_read_type_rsp_write(void *payload, int len,
 {
     uint8_t *u8ptr;
 
-    if (len < BLE_ATT_READ_TYPE_RSP_MIN_SZ) {
+    if (len < BLE_ATT_READ_TYPE_RSP_BASE_SZ) {
         return EMSGSIZE;
     }
 
     u8ptr = payload;
 
     u8ptr[0] = BLE_ATT_OP_READ_TYPE_RSP;
-    u8ptr[1] = rsp->batp_len;
+    u8ptr[1] = rsp->batp_length;
 
     return 0;
 }

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/380c4b43/net/nimble/host/src/ble_att_cmd.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_att_cmd.h b/net/nimble/host/src/ble_att_cmd.h
index 1253e9e..b68713a 100644
--- a/net/nimble/host/src/ble_att_cmd.h
+++ b/net/nimble/host/src/ble_att_cmd.h
@@ -121,9 +121,9 @@ struct ble_att_find_type_value_req {
  * | Ending Handle                      | 2                 |
  * | Attribute Type                     | 2 or 16           |
  */
-#define BLE_ATT_READ_TYPE_REQ_BASE_SZ    5
-#define BLE_ATT_READ_TYPE_REQ_SZ_16      7
-#define BLE_ATT_READ_TYPE_REQ_SZ_128     21
+#define BLE_ATT_READ_TYPE_REQ_BASE_SZ   5
+#define BLE_ATT_READ_TYPE_REQ_SZ_16     7
+#define BLE_ATT_READ_TYPE_REQ_SZ_128    21
 struct ble_att_read_type_req {
     uint16_t batq_start_handle;
     uint16_t batq_end_handle;
@@ -136,11 +136,13 @@ struct ble_att_read_type_req {
  * | Length                             | 1                 |
  * | Attribute Data List                | 2 to (ATT_MTU-2)  |
  */
-#define BLE_ATT_READ_TYPE_RSP_MIN_SZ     2
+#define BLE_ATT_READ_TYPE_RSP_BASE_SZ       2
 struct ble_att_read_type_rsp {
-    uint8_t batp_len;
+    uint8_t batp_length;
 };
 
+#define BLE_ATT_READ_TYPE_ADATA_BASE_SZ     4
+
 /**
  * | Parameter                          | Size (octets)     |
  * +------------------------------------+-------------------+

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/380c4b43/net/nimble/host/src/ble_att_svr.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_att_svr.c b/net/nimble/host/src/ble_att_svr.c
index aab3906..100ec3b 100644
--- a/net/nimble/host/src/ble_att_svr.c
+++ b/net/nimble/host/src/ble_att_svr.c
@@ -875,8 +875,7 @@ ble_att_svr_tx_read_type_rsp(struct ble_hs_conn *conn,
     /* Allocate space for the respose base, but don't fill in the fields.  They
      * get filled in at the end, when we know the value of the length field.
      */
-    dptr = os_mbuf_extend(txom,
-                          BLE_ATT_READ_TYPE_RSP_MIN_SZ);
+    dptr = os_mbuf_extend(txom, BLE_ATT_READ_TYPE_RSP_BASE_SZ);
     if (dptr == NULL) {
         rc = BLE_ATT_ERR_INSUFFICIENT_RES;
         goto err;
@@ -942,7 +941,7 @@ ble_att_svr_tx_read_type_rsp(struct ble_hs_conn *conn,
     }
 
     /* Fill the response base. */
-    rsp.batp_len = prev_attr_len;
+    rsp.batp_length = prev_attr_len;
     rc = ble_att_read_type_rsp_write(txom->om_data, txom->om_len, &rsp);
     assert(rc == 0);
 
@@ -959,7 +958,7 @@ ble_att_svr_tx_read_type_rsp(struct ble_hs_conn *conn,
 err:
     os_mbuf_free_chain(txom);
     ble_att_svr_tx_error_rsp(chan, BLE_ATT_OP_READ_TYPE_REQ,
-                                req->batq_start_handle, rc);
+                             req->batq_start_handle, rc);
     return rc;
 }