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;
}