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/01/09 03:48:50 UTC

[1/2] incubator-mynewt-larva git commit: Client-side ATT command: Read Multiple.

Repository: incubator-mynewt-larva
Updated Branches:
  refs/heads/master 9a869c056 -> 5b6d4bb03


Client-side ATT command: Read Multiple.


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

Branch: refs/heads/master
Commit: ce6bf1365c23706cb910f528ab017010f9f6b825
Parents: 9a869c0
Author: Christopher Collins <cc...@gmail.com>
Authored: Fri Jan 8 18:25:33 2016 -0800
Committer: Christopher Collins <cc...@gmail.com>
Committed: Fri Jan 8 18:48:20 2016 -0800

----------------------------------------------------------------------
 net/nimble/host/include/host/ble_att.h |  2 +
 net/nimble/host/src/ble_att_clt.c      | 81 +++++++++++++++++++++++++++++
 net/nimble/host/src/ble_att_cmd.c      | 64 +++++++++++++++++++++++
 net/nimble/host/src/ble_att_cmd.h      | 36 ++++++++++---
 net/nimble/host/src/ble_att_priv.h     |  5 ++
 5 files changed, 180 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/ce6bf136/net/nimble/host/include/host/ble_att.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/include/host/ble_att.h b/net/nimble/host/include/host/ble_att.h
index ee177b3..949c963 100644
--- a/net/nimble/host/include/host/ble_att.h
+++ b/net/nimble/host/include/host/ble_att.h
@@ -51,6 +51,8 @@
 #define BLE_ATT_OP_READ_RSP                 0x0b
 #define BLE_ATT_OP_READ_BLOB_REQ            0x0c
 #define BLE_ATT_OP_READ_BLOB_RSP            0x0d
+#define BLE_ATT_OP_READ_MULT_REQ            0x0e
+#define BLE_ATT_OP_READ_MULT_RSP            0x0f
 #define BLE_ATT_OP_READ_GROUP_TYPE_REQ      0x10
 #define BLE_ATT_OP_READ_GROUP_TYPE_RSP      0x11
 #define BLE_ATT_OP_WRITE_REQ                0x12

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/ce6bf136/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 cd37ac8..a1c13a8 100644
--- a/net/nimble/host/src/ble_att_clt.c
+++ b/net/nimble/host/src/ble_att_clt.c
@@ -651,6 +651,87 @@ done:
 }
 
 /*****************************************************************************
+ * $read multiple                                                            *
+ *****************************************************************************/
+
+int
+ble_att_clt_tx_read_mult(struct ble_hs_conn *conn,
+                         uint16_t *handles, int num_handles)
+{
+    struct ble_l2cap_chan *chan;
+    struct os_mbuf *txom;
+    void *buf;
+    int rc;
+    int i;
+
+    txom = NULL;
+
+    rc = ble_att_clt_prep_req(conn, &chan, &txom,
+                              BLE_ATT_READ_MULT_REQ_BASE_SZ);
+    if (rc != 0) {
+        goto err;
+    }
+
+    rc = ble_att_read_mult_req_write(txom->om_data, txom->om_len);
+    assert(rc == 0);
+
+    for (i = 0; i < num_handles; i++) {
+        buf = os_mbuf_extend(txom, 2);
+        if (buf == NULL) {
+            rc = BLE_HS_ENOMEM;
+            goto err;
+        }
+
+        htole16(buf, handles[i]);
+    }
+
+    rc = ble_l2cap_tx(conn, chan, txom);
+    txom = NULL;
+    if (rc != 0) {
+        goto err;
+    }
+
+    return 0;
+
+err:
+    os_mbuf_free_chain(txom);
+    return rc;
+}
+
+int
+ble_att_clt_rx_read_mult(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
+                         struct os_mbuf **rxom)
+{
+    //void *value;
+    //int value_len;
+    int rc;
+
+    //value = NULL;
+    //value_len = 0;
+
+    /* Reponse consists of a one-byte opcode (already verified) and a variable
+     * length Attribute Value field.  Strip the opcode from the response.
+     */
+    os_mbuf_adj(*rxom, BLE_ATT_READ_MULT_RSP_BASE_SZ);
+
+    *rxom = os_mbuf_pullup(*rxom, OS_MBUF_PKTLEN(*rxom));
+    if (*rxom == NULL) {
+        rc = BLE_HS_EBADDATA;
+        goto done;
+    }
+
+    //value_len = (*rxom)->om_len;
+    //value = (*rxom)->om_data;
+
+    rc = 0;
+
+done:
+    /* Pass the Attribute Value field to GATT. */
+    //ble_gattc_rx_read_mult_rsp(conn, rc, value, value_len);
+    return rc;
+}
+
+/*****************************************************************************
  * $read by group type                                                       *
  *****************************************************************************/
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/ce6bf136/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 219fd44..6f358fb 100644
--- a/net/nimble/host/src/ble_att_cmd.c
+++ b/net/nimble/host/src/ble_att_cmd.c
@@ -400,6 +400,70 @@ ble_att_read_blob_req_write(void *payload, int len,
 }
 
 int
+ble_att_read_mult_req_parse(void *payload, int len)
+{
+    uint8_t *u8ptr;
+
+    if (len < BLE_ATT_READ_MULT_REQ_BASE_SZ) {
+        return BLE_HS_EMSGSIZE;
+    }
+
+    u8ptr = payload;
+    if (u8ptr[0] != BLE_ATT_OP_READ_MULT_REQ) {
+        return BLE_HS_EINVAL;
+    }
+
+    return 0;
+}
+
+int
+ble_att_read_mult_req_write(void *payload, int len)
+{
+    uint8_t *u8ptr;
+
+    if (len < BLE_ATT_READ_MULT_REQ_BASE_SZ) {
+        return BLE_HS_EMSGSIZE;
+    }
+
+    u8ptr = payload;
+    u8ptr[0] = BLE_ATT_OP_READ_MULT_REQ;
+
+    return 0;
+}
+
+int
+ble_att_read_mult_rsp_parse(void *payload, int len)
+{
+    uint8_t *u8ptr;
+
+    if (len < BLE_ATT_READ_MULT_RSP_BASE_SZ) {
+        return BLE_HS_EMSGSIZE;
+    }
+
+    u8ptr = payload;
+    if (u8ptr[0] != BLE_ATT_OP_READ_MULT_RSP) {
+        return BLE_HS_EINVAL;
+    }
+
+    return 0;
+}
+
+int
+ble_att_read_mult_rsp_write(void *payload, int len)
+{
+    uint8_t *u8ptr;
+
+    if (len < BLE_ATT_READ_MULT_RSP_BASE_SZ) {
+        return BLE_HS_EMSGSIZE;
+    }
+
+    u8ptr = payload;
+    u8ptr[0] = BLE_ATT_OP_READ_MULT_RSP;
+
+    return 0;
+}
+
+int
 ble_att_read_group_type_req_parse(void *payload, int len,
                                   struct ble_att_read_group_type_req *req)
 {

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/ce6bf136/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 5f3bab6..9595401 100644
--- a/net/nimble/host/src/ble_att_cmd.h
+++ b/net/nimble/host/src/ble_att_cmd.h
@@ -177,6 +177,22 @@ struct ble_att_read_blob_req {
  * | Parameter                          | Size (octets)     |
  * +------------------------------------+-------------------+
  * | Attribute Opcode                   | 1                 |
+ * | Set Of Handles                     | 4 to (ATT_MTU-1)  |
+ */
+#define BLE_ATT_READ_MULT_REQ_BASE_SZ   1
+
+/**
+ * | Parameter                          | Size (octets)     |
+ * +------------------------------------+-------------------+
+ * | Attribute Opcode                   | 1                 |
+ * | Set Of Values                      | 4 to (ATT_MTU-1)  |
+ */
+#define BLE_ATT_READ_MULT_RSP_BASE_SZ   1
+
+/**
+ * | Parameter                          | Size (octets)     |
+ * +------------------------------------+-------------------+
+ * | Attribute Opcode                   | 1                 |
  * | Starting Handle                    | 2                 |
  * | Ending Handle                      | 2                 |
  * | Attribute Group Type               | 2 or 16           |
@@ -306,14 +322,6 @@ int ble_att_find_type_value_req_parse(void *payload, int len,
                                       struct ble_att_find_type_value_req *req);
 int ble_att_find_type_value_req_write(void *payload, int len,
                                       struct ble_att_find_type_value_req *req);
-int ble_att_read_req_parse(void *payload, int len,
-                           struct ble_att_read_req *req);
-int ble_att_read_req_write(void *payload, int len,
-                           struct ble_att_read_req *req);
-int ble_att_read_blob_req_parse(void *payload, int len,
-                                struct ble_att_read_blob_req *req);
-int ble_att_read_blob_req_write(void *payload, int len,
-                                struct ble_att_read_blob_req *req);
 int ble_att_read_type_req_parse(void *payload, int len,
                                 struct ble_att_read_type_req *req);
 int ble_att_read_type_req_write(void *payload, int len,
@@ -322,6 +330,18 @@ int ble_att_read_type_rsp_parse(void *payload, int len,
                                 struct ble_att_read_type_rsp *rsp);
 int ble_att_read_type_rsp_write(void *payload, int len,
                                 struct ble_att_read_type_rsp *rsp);
+int ble_att_read_req_parse(void *payload, int len,
+                           struct ble_att_read_req *req);
+int ble_att_read_req_write(void *payload, int len,
+                           struct ble_att_read_req *req);
+int ble_att_read_blob_req_parse(void *payload, int len,
+                                struct ble_att_read_blob_req *req);
+int ble_att_read_blob_req_write(void *payload, int len,
+                                struct ble_att_read_blob_req *req);
+int ble_att_read_mult_req_parse(void *payload, int len);
+int ble_att_read_mult_req_write(void *payload, int len);
+int ble_att_read_mult_rsp_parse(void *payload, int len);
+int ble_att_read_mult_rsp_write(void *payload, int len);
 int ble_att_read_group_type_req_parse(void *payload, int len,
                                       struct ble_att_read_group_type_req *req);
 int ble_att_read_group_type_req_write(void *payload, int len,

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/ce6bf136/net/nimble/host/src/ble_att_priv.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_att_priv.h b/net/nimble/host/src/ble_att_priv.h
index 701ee53..c429818 100644
--- a/net/nimble/host/src/ble_att_priv.h
+++ b/net/nimble/host/src/ble_att_priv.h
@@ -181,6 +181,11 @@ int ble_att_clt_tx_read_blob(struct ble_hs_conn *conn,
 int ble_att_clt_rx_read_blob(struct ble_hs_conn *conn,
                              struct ble_l2cap_chan *chan,
                              struct os_mbuf **rxom);
+int ble_att_clt_tx_read_mult(struct ble_hs_conn *conn,
+                             uint16_t *handles, int num_handles);
+int ble_att_clt_rx_read_mult(struct ble_hs_conn *conn,
+                             struct ble_l2cap_chan *chan,
+                             struct os_mbuf **rxom);
 int ble_att_clt_tx_read_type(struct ble_hs_conn *conn,
                              struct ble_att_read_type_req *req,
                              void *uuid128);


[2/2] incubator-mynewt-larva git commit: Server-side ATT command: Read Multiple.

Posted by cc...@apache.org.
Server-side ATT command: Read Multiple.


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

Branch: refs/heads/master
Commit: 5b6d4bb030a94195ebbf3d04045858862d28f068
Parents: ce6bf13
Author: Christopher Collins <cc...@gmail.com>
Authored: Fri Jan 8 18:47:50 2016 -0800
Committer: Christopher Collins <cc...@gmail.com>
Committed: Fri Jan 8 18:48:34 2016 -0800

----------------------------------------------------------------------
 net/nimble/host/src/ble_att.c      |   2 +
 net/nimble/host/src/ble_att_priv.h |   3 +
 net/nimble/host/src/ble_att_svr.c  | 120 ++++++++++++++++++++++++++++++++
 3 files changed, 125 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/5b6d4bb0/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 0680261..ccaf113 100644
--- a/net/nimble/host/src/ble_att.c
+++ b/net/nimble/host/src/ble_att.c
@@ -44,6 +44,8 @@ static struct ble_att_rx_dispatch_entry ble_att_rx_dispatch[] = {
     { BLE_ATT_OP_READ_RSP,             ble_att_clt_rx_read },
     { BLE_ATT_OP_READ_BLOB_REQ,        ble_att_svr_rx_read_blob },
     { BLE_ATT_OP_READ_BLOB_RSP,        ble_att_clt_rx_read_blob },
+    { BLE_ATT_OP_READ_MULT_REQ,        ble_att_svr_rx_read_mult },
+    { BLE_ATT_OP_READ_MULT_RSP,        ble_att_clt_rx_read_mult },
     { BLE_ATT_OP_READ_GROUP_TYPE_REQ,  ble_att_svr_rx_read_group_type },
     { 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/5b6d4bb0/net/nimble/host/src/ble_att_priv.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_att_priv.h b/net/nimble/host/src/ble_att_priv.h
index c429818..b5fc5a3 100644
--- a/net/nimble/host/src/ble_att_priv.h
+++ b/net/nimble/host/src/ble_att_priv.h
@@ -116,6 +116,9 @@ int ble_att_svr_rx_read(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
 int ble_att_svr_rx_read_blob(struct ble_hs_conn *conn,
                              struct ble_l2cap_chan *chan,
                              struct os_mbuf **rxom);
+int ble_att_svr_rx_read_mult(struct ble_hs_conn *conn,
+                             struct ble_l2cap_chan *chan,
+                             struct os_mbuf **rxom);
 int ble_att_svr_rx_write(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
                          struct os_mbuf **rxom);
 int ble_att_svr_rx_prep_write(struct ble_hs_conn *conn,

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/5b6d4bb0/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 91ca278..e1930f4 100644
--- a/net/nimble/host/src/ble_att_svr.c
+++ b/net/nimble/host/src/ble_att_svr.c
@@ -1527,6 +1527,126 @@ err:
 }
 
 static int
+ble_att_svr_tx_read_mult(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
+                         struct os_mbuf **rxom, uint8_t *att_err,
+                         uint16_t *err_handle)
+{
+    struct ble_att_svr_access_ctxt ctxt;
+    struct ble_att_svr_entry *entry;
+    struct os_mbuf *txom;
+    uint16_t chunk_sz;
+    uint16_t tx_space;
+    uint16_t handle;
+    int rc;
+
+    txom = ble_att_get_pkthdr();
+
+    tx_space = ble_l2cap_chan_mtu(chan) - OS_MBUF_PKTLEN(txom);
+
+    /* Iterate through requested handles, reading the corresponding attribute
+     * for each.  Stop when there are no more handles to process, or the
+     * response is full.
+     */
+    while (OS_MBUF_PKTLEN(*rxom) >= 2 && tx_space > 0) {
+        handle = le16toh((*rxom)->om_data);
+        os_mbuf_adj(*rxom, 2);
+
+        entry = NULL;
+        rc = ble_att_svr_find_by_handle(handle, &entry);
+        if (rc != 0) {
+            *att_err = BLE_ATT_ERR_INVALID_HANDLE;
+            *err_handle = handle;
+            rc = BLE_HS_ENOENT;
+            goto err;
+        }
+
+        if (entry->ha_cb == NULL) {
+            *att_err = BLE_ATT_ERR_UNLIKELY;
+            *err_handle = handle;
+            rc = BLE_HS_ENOTSUP;
+            goto err;
+        }
+
+        ctxt.offset = 0;
+        rc = ble_att_svr_read(conn, entry, &ctxt, att_err);
+        if (rc != 0) {
+            *err_handle = handle;
+            rc = BLE_HS_ENOTSUP;
+            goto err;
+        }
+
+        if (ctxt.data_len > tx_space) {
+            chunk_sz = tx_space;
+        } else {
+            chunk_sz = ctxt.data_len;
+        }
+
+        rc = os_mbuf_append(txom, ctxt.attr_data, chunk_sz);
+        if (rc != 0) {
+            *att_err = BLE_ATT_ERR_INSUFFICIENT_RES;
+            *err_handle = handle;
+            rc = BLE_HS_ENOMEM;
+            goto err;
+        }
+
+        tx_space -= chunk_sz;
+    }
+
+    rc = ble_l2cap_tx(conn, chan, txom);
+    if (rc != 0) {
+        *att_err = BLE_ATT_ERR_UNLIKELY;
+        *err_handle = 0;
+        goto err;
+    }
+
+    return 0;
+
+err:
+    os_mbuf_free_chain(txom);
+    return rc;
+}
+
+int
+ble_att_svr_rx_read_mult(struct ble_hs_conn *conn, struct ble_l2cap_chan *chan,
+                         struct os_mbuf **rxom)
+{
+    uint16_t err_handle;
+    uint8_t att_err;
+    int rc;
+
+    *rxom = os_mbuf_pullup(*rxom, OS_MBUF_PKTLEN(*rxom));
+    if (*rxom == NULL) {
+        att_err = BLE_ATT_ERR_INSUFFICIENT_RES;
+        err_handle = 0;
+        rc = BLE_HS_ENOMEM;
+        goto err;
+    }
+
+    rc = ble_att_read_mult_req_parse((*rxom)->om_data, (*rxom)->om_len);
+    if (rc != 0) {
+        att_err = BLE_ATT_ERR_INVALID_PDU;
+        err_handle = 0;
+        rc = BLE_HS_EBADDATA;
+        goto err;
+    }
+
+    /* Strip opcode from request. */
+    os_mbuf_adj(*rxom, BLE_ATT_READ_MULT_REQ_BASE_SZ);
+
+    rc = ble_att_svr_tx_read_mult(conn, chan, rxom, &att_err, &err_handle);
+    if (rc != 0) {
+        goto err;
+    }
+
+    return 0;
+
+err:
+    ble_att_svr_tx_error_rsp(conn, chan, BLE_ATT_OP_READ_MULT_REQ,
+                             err_handle, att_err);
+    return rc;
+}
+
+static int
 ble_att_svr_is_valid_group_type(uint8_t *uuid128)
 {
     uint16_t uuid16;