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/07/14 18:29:33 UTC

[1/5] incubator-mynewt-core git commit: BLE Host - Fix filter-duplicates in GAP discovery.

Repository: incubator-mynewt-core
Updated Branches:
  refs/heads/develop e6602f6c2 -> 78d4bed28


BLE Host - Fix filter-duplicates in GAP discovery.


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/fb3eae7c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/fb3eae7c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/fb3eae7c

Branch: refs/heads/develop
Commit: fb3eae7c221abfa86bb4d43acfd391652bdaaa4a
Parents: e6602f6
Author: Christopher Collins <cc...@apache.org>
Authored: Wed Jul 13 15:40:12 2016 -0700
Committer: Christopher Collins <cc...@apache.org>
Committed: Wed Jul 13 15:40:12 2016 -0700

----------------------------------------------------------------------
 net/nimble/host/src/ble_gap.c | 33 ++++++++++-----------------------
 1 file changed, 10 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/fb3eae7c/net/nimble/host/src/ble_gap.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_gap.c b/net/nimble/host/src/ble_gap.c
index 941c350..6c91956 100644
--- a/net/nimble/host/src/ble_gap.c
+++ b/net/nimble/host/src/ble_gap.c
@@ -140,9 +140,9 @@ static bssnz_t struct {
     unsigned adv_auto_flags:1;
 } ble_gap_slave;
 
-static int ble_gap_disc_disable_tx(void);
 static int ble_gap_adv_enable_tx(int enable);
 static int ble_gap_conn_cancel_tx(void);
+static int ble_gap_disc_enable_tx(int enable, int filter_duplicates);
 
 struct ble_gap_snapshot {
     struct ble_gap_conn_desc *desc;
@@ -223,9 +223,10 @@ static void
 ble_gap_log_disc(uint8_t own_addr_type, int32_t duration_ms,
                  const struct ble_gap_disc_params *disc_params)
 {
-    BLE_HS_LOG(INFO, "own_addr_type=%d filter_policy=%d passive=%d limited=%d",
+    BLE_HS_LOG(INFO, "own_addr_type=%d filter_policy=%d passive=%d limited=%d "
+                     "filter_duplicates=%d ",
                own_addr_type, disc_params->filter_policy, disc_params->passive,
-               disc_params->limited);
+               disc_params->limited, disc_params->filter_duplicates);
     ble_gap_log_duration(duration_ms);
 }
 
@@ -1082,7 +1083,7 @@ ble_gap_master_heartbeat(void)
 
     case BLE_GAP_OP_M_DISC:
         /* When a discovery procedure times out, it is not a failure. */
-        rc = ble_gap_disc_disable_tx();
+        rc = ble_gap_disc_enable_tx(0, 0);
         if (rc != 0) {
             /* Failed to stop discovery; try again in 100 ms. */
             return BLE_GAP_CANCEL_RETRY_RATE;
@@ -1848,27 +1849,13 @@ ble_gap_adv_active(void)
  *****************************************************************************/
 
 static int
-ble_gap_disc_disable_tx(void)
+ble_gap_disc_enable_tx(int enable, int filter_duplicates)
 {
     uint8_t buf[BLE_HCI_CMD_HDR_LEN + BLE_HCI_SET_SCAN_ENABLE_LEN];
     int rc;
 
-    host_hci_cmd_build_le_set_scan_enable(0, 0, buf, sizeof buf);
-    rc = ble_hci_cmd_tx_empty_ack(buf);
-    if (rc != 0) {
-        return rc;
-    }
-
-    return 0;
-}
-
-static int
-ble_gap_disc_tx_enable(void)
-{
-    uint8_t buf[BLE_HCI_CMD_HDR_LEN + BLE_HCI_SET_SCAN_ENABLE_LEN];
-    int rc;
-
-    host_hci_cmd_build_le_set_scan_enable(1, 0, buf, sizeof buf);
+    host_hci_cmd_build_le_set_scan_enable(!!enable, !!filter_duplicates,
+                                          buf, sizeof buf);
     rc = ble_hci_cmd_tx_empty_ack(buf);
     if (rc != 0) {
         return rc;
@@ -1933,7 +1920,7 @@ ble_gap_disc_cancel(void)
         goto done;
     }
 
-    rc = ble_gap_disc_disable_tx();
+    rc = ble_gap_disc_enable_tx(0, 0);
     if (rc != 0) {
         goto done;
     }
@@ -2077,7 +2064,7 @@ ble_gap_disc(uint8_t own_addr_type, int32_t duration_ms,
         goto done;
     }
 
-    rc = ble_gap_disc_tx_enable();
+    rc = ble_gap_disc_enable_tx(1, params.filter_duplicates);
     if (rc != 0) {
         goto done;
     }


[3/5] incubator-mynewt-core git commit: BLE Host - scan: svc data fields had 0 length.

Posted by cc...@apache.org.
BLE Host - scan: svc data fields had 0 length.

When parsing an advertising report, the host code forgot to fill in the
length of each service data field.


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/9420c875
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/9420c875
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/9420c875

Branch: refs/heads/develop
Commit: 9420c875e184a2f5511c21aa609e1011d107d22f
Parents: d38f158
Author: Christopher Collins <cc...@apache.org>
Authored: Wed Jul 13 17:13:46 2016 -0700
Committer: Christopher Collins <cc...@apache.org>
Committed: Wed Jul 13 17:13:46 2016 -0700

----------------------------------------------------------------------
 net/nimble/host/src/ble_hs_adv.c | 3 +++
 1 file changed, 3 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/9420c875/net/nimble/host/src/ble_hs_adv.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_hs_adv.c b/net/nimble/host/src/ble_hs_adv.c
index 8a7ed50..74dd393 100644
--- a/net/nimble/host/src/ble_hs_adv.c
+++ b/net/nimble/host/src/ble_hs_adv.c
@@ -480,6 +480,7 @@ ble_hs_adv_parse_one_field(struct ble_hs_adv_fields *adv_fields,
             return BLE_HS_EBADDATA;
         }
         adv_fields->svc_data_uuid16 = data;
+        adv_fields->svc_data_uuid16_len = data_len;
         break;
 
     case BLE_HS_ADV_TYPE_PUBLIC_TGT_ADDR:
@@ -527,6 +528,7 @@ ble_hs_adv_parse_one_field(struct ble_hs_adv_fields *adv_fields,
             return BLE_HS_EBADDATA;
         }
         adv_fields->svc_data_uuid32 = data;
+        adv_fields->svc_data_uuid32_len = data_len;
         break;
 
     case BLE_HS_ADV_TYPE_SVC_DATA_UUID128:
@@ -534,6 +536,7 @@ ble_hs_adv_parse_one_field(struct ble_hs_adv_fields *adv_fields,
             return BLE_HS_EBADDATA;
         }
         adv_fields->svc_data_uuid128 = data;
+        adv_fields->svc_data_uuid128_len = data_len;
         break;
 
     case BLE_HS_ADV_TYPE_URI:


[5/5] incubator-mynewt-core git commit: BLE Host - Move opcode into gatt register ctxt.

Posted by cc...@apache.org.
BLE Host - Move opcode into gatt register ctxt.


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/78d4bed2
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/78d4bed2
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/78d4bed2

Branch: refs/heads/develop
Commit: 78d4bed28f006931e2a20e921d8b0a8ac61fb2dd
Parents: 147a563
Author: Christopher Collins <cc...@apache.org>
Authored: Thu Jul 14 11:28:53 2016 -0700
Committer: Christopher Collins <cc...@apache.org>
Committed: Thu Jul 14 11:29:06 2016 -0700

----------------------------------------------------------------------
 apps/bleprph/src/gatt_svr.c                     |   4 +-
 apps/bletiny/src/gatt_svr.c                     |   4 +-
 net/nimble/host/include/host/ble_gatt.h         | 131 ++++++++++---------
 net/nimble/host/src/ble_gatts.c                 |  15 ++-
 .../host/src/test/ble_gatts_notify_test.c       |   8 +-
 net/nimble/host/src/test/ble_gatts_read_test.c  |   8 +-
 net/nimble/host/src/test/ble_gatts_reg_test.c   |   7 +-
 7 files changed, 94 insertions(+), 83 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/78d4bed2/apps/bleprph/src/gatt_svr.c
----------------------------------------------------------------------
diff --git a/apps/bleprph/src/gatt_svr.c b/apps/bleprph/src/gatt_svr.c
index c2c40bd..346bb88 100644
--- a/apps/bleprph/src/gatt_svr.c
+++ b/apps/bleprph/src/gatt_svr.c
@@ -424,11 +424,11 @@ gatt_svr_uuid_to_s(const void *uuid128, char *dst)
 }
 
 static void
-gatt_svr_register_cb(uint8_t op, union ble_gatt_register_ctxt *ctxt, void *arg)
+gatt_svr_register_cb(struct ble_gatt_register_ctxt *ctxt, void *arg)
 {
     char buf[40];
 
-    switch (op) {
+    switch (ctxt->op) {
     case BLE_GATT_REGISTER_OP_SVC:
         BLEPRPH_LOG(DEBUG, "registered service %s with handle=%d\n",
                     gatt_svr_uuid_to_s(ctxt->svc.svc_def->uuid128, buf),

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/78d4bed2/apps/bletiny/src/gatt_svr.c
----------------------------------------------------------------------
diff --git a/apps/bletiny/src/gatt_svr.c b/apps/bletiny/src/gatt_svr.c
index ceb4522..a89673e 100644
--- a/apps/bletiny/src/gatt_svr.c
+++ b/apps/bletiny/src/gatt_svr.c
@@ -419,11 +419,11 @@ gatt_svr_uuid_to_s(const void *uuid128, char *dst)
 }
 
 static void
-gatt_svr_register_cb(uint8_t op, union ble_gatt_register_ctxt *ctxt, void *arg)
+gatt_svr_register_cb(struct ble_gatt_register_ctxt *ctxt, void *arg)
 {
     char buf[40];
 
-    switch (op) {
+    switch (ctxt->op) {
     case BLE_GATT_REGISTER_OP_SVC:
         BLETINY_LOG(DEBUG, "registered service %s with handle=%d\n",
                     gatt_svr_uuid_to_s(ctxt->svc.svc_def->uuid128, buf),

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/78d4bed2/net/nimble/host/include/host/ble_gatt.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/include/host/ble_gatt.h b/net/nimble/host/include/host/ble_gatt.h
index c855a9b..5e798e7 100644
--- a/net/nimble/host/include/host/ble_gatt.h
+++ b/net/nimble/host/include/host/ble_gatt.h
@@ -313,63 +313,77 @@ struct ble_gatt_dsc_def {
  * Context passed to the registration callback; represents the GATT service,
  * characteristic, or descriptor being registered.
  */
-union ble_gatt_register_ctxt {
-    /** Service; valid if op == BLE_GATT_REGISTER_OP_SVC. */
-    struct {
-        /** The ATT handle of the service definition attribute. */
-        uint16_t handle;
-
-        /**
-         * The service definition representing the service being
-         * registered.
-         */
-        const struct ble_gatt_svc_def *svc_def;
-    } svc;
-
-    /** Characteristic; valid if op == BLE_GATT_REGISTER_OP_CHR. */
-    struct {
-        /** The ATT handle of the characteristic definition attribute. */
-        uint16_t def_handle;
-
-        /** The ATT handle of the characteristic value attribute. */
-        uint16_t val_handle;
-
-        /**
-         * The characteristic definition representing the characteristic being
-         * registered.
-         */
-        const struct ble_gatt_chr_def *chr_def;
-
-        /**
-         * The service definition corresponding to the characteristic's parent
-         * service.
-         */
-        const struct ble_gatt_svc_def *svc_def;
-    } chr;
-
-    /** Descriptor; valid if op == BLE_GATT_REGISTER_OP_DSC. */
-    struct {
-        /** The ATT handle of the descriptor definition attribute. */
-        uint16_t handle;
-
-        /**
-         * The descriptor definition corresponding to the descriptor being
-         * registered.
-         */
-        const struct ble_gatt_dsc_def *dsc_def;
-
-        /**
-         * The characteristic definition corresponding to the descriptor's
-         * parent characteristic.
-         */
-        const struct ble_gatt_chr_def *chr_def;
+struct ble_gatt_register_ctxt {
+    /**
+     * Indicates the gatt registration operation just performed.  This is
+     * equal to one of the following values:
+     *     o BLE_GATT_REGISTER_OP_SVC
+     *     o BLE_GATT_REGISTER_OP_CHR
+     *     o BLE_GATT_REGISTER_OP_DSC
+     */
+    uint8_t op;
 
-        /**
-         * The service definition corresponding to the descriptor's grandparent
-         * service
-         */
-        const struct ble_gatt_svc_def *svc_def;
-    } dsc;
+    /**
+     * The value of the op field determines which field in this union is valid.
+     */
+    union {
+        /** Service; valid if op == BLE_GATT_REGISTER_OP_SVC. */
+        struct {
+            /** The ATT handle of the service definition attribute. */
+            uint16_t handle;
+
+            /**
+             * The service definition representing the service being
+             * registered.
+             */
+            const struct ble_gatt_svc_def *svc_def;
+        } svc;
+
+        /** Characteristic; valid if op == BLE_GATT_REGISTER_OP_CHR. */
+        struct {
+            /** The ATT handle of the characteristic definition attribute. */
+            uint16_t def_handle;
+
+            /** The ATT handle of the characteristic value attribute. */
+            uint16_t val_handle;
+
+            /**
+             * The characteristic definition representing the characteristic
+             * being registered.
+             */
+            const struct ble_gatt_chr_def *chr_def;
+
+            /**
+             * The service definition corresponding to the characteristic's
+             * parent service.
+             */
+            const struct ble_gatt_svc_def *svc_def;
+        } chr;
+
+        /** Descriptor; valid if op == BLE_GATT_REGISTER_OP_DSC. */
+        struct {
+            /** The ATT handle of the descriptor definition attribute. */
+            uint16_t handle;
+
+            /**
+             * The descriptor definition corresponding to the descriptor being
+             * registered.
+             */
+            const struct ble_gatt_dsc_def *dsc_def;
+
+            /**
+             * The characteristic definition corresponding to the descriptor's
+             * parent characteristic.
+             */
+            const struct ble_gatt_chr_def *chr_def;
+
+            /**
+             * The service definition corresponding to the descriptor's
+             * grandparent service
+             */
+            const struct ble_gatt_svc_def *svc_def;
+        } dsc;
+    };
 };
 
 /**
@@ -400,9 +414,8 @@ struct ble_gatt_resources {
     uint16_t attrs;
 };
 
-union ble_gatt_register_ctxt;
-typedef void ble_gatt_register_fn(uint8_t op,
-                                  union ble_gatt_register_ctxt *ctxt,
+struct ble_gatt_register_ctxt;
+typedef void ble_gatt_register_fn(struct ble_gatt_register_ctxt *ctxt,
                                   void *arg);
 
 int ble_gatts_register_svcs(const struct ble_gatt_svc_def *svcs,

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/78d4bed2/net/nimble/host/src/ble_gatts.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_gatts.c b/net/nimble/host/src/ble_gatts.c
index 0aff98a..b2ead0d 100644
--- a/net/nimble/host/src/ble_gatts.c
+++ b/net/nimble/host/src/ble_gatts.c
@@ -463,7 +463,7 @@ ble_gatts_register_dsc(const struct ble_gatt_svc_def *svc,
                        uint16_t chr_def_handle,
                        ble_gatt_register_fn *register_cb, void *cb_arg)
 {
-    union ble_gatt_register_ctxt register_ctxt;
+    struct ble_gatt_register_ctxt register_ctxt;
     uint16_t dsc_handle;
     int rc;
 
@@ -478,11 +478,12 @@ ble_gatts_register_dsc(const struct ble_gatt_svc_def *svc,
     }
 
     if (register_cb != NULL) {
+        register_ctxt.op = BLE_GATT_REGISTER_OP_DSC;
         register_ctxt.dsc.handle = dsc_handle;
         register_ctxt.dsc.svc_def = svc;
         register_ctxt.dsc.chr_def = chr;
         register_ctxt.dsc.dsc_def = dsc;
-        register_cb(BLE_GATT_REGISTER_OP_DSC, &register_ctxt, cb_arg);
+        register_cb(&register_ctxt, cb_arg);
     }
 
     STATS_INC(ble_gatts_stats, dscs);
@@ -678,7 +679,7 @@ ble_gatts_register_chr(const struct ble_gatt_svc_def *svc,
                        const struct ble_gatt_chr_def *chr,
                        ble_gatt_register_fn *register_cb, void *cb_arg)
 {
-    union ble_gatt_register_ctxt register_ctxt;
+    struct ble_gatt_register_ctxt register_ctxt;
     struct ble_gatt_dsc_def *dsc;
     uint16_t def_handle;
     uint16_t val_handle;
@@ -723,11 +724,12 @@ ble_gatts_register_chr(const struct ble_gatt_svc_def *svc,
     }
 
     if (register_cb != NULL) {
+        register_ctxt.op = BLE_GATT_REGISTER_OP_CHR;
         register_ctxt.chr.def_handle = def_handle;
         register_ctxt.chr.val_handle = val_handle;
         register_ctxt.chr.svc_def = svc;
         register_ctxt.chr.chr_def = chr;
-        register_cb(BLE_GATT_REGISTER_OP_CHR, &register_ctxt, cb_arg);
+        register_cb(&register_ctxt, cb_arg);
     }
 
     if (ble_gatts_chr_clt_cfg_allowed(chr) != 0) {
@@ -793,7 +795,7 @@ ble_gatts_register_svc(const struct ble_gatt_svc_def *svc,
                        ble_gatt_register_fn *register_cb, void *cb_arg)
 {
     const struct ble_gatt_chr_def *chr;
-    union ble_gatt_register_ctxt register_ctxt;
+    struct ble_gatt_register_ctxt register_ctxt;
     uint16_t uuid16;
     int idx;
     int rc;
@@ -823,9 +825,10 @@ ble_gatts_register_svc(const struct ble_gatt_svc_def *svc,
     }
 
     if (register_cb != NULL) {
+        register_ctxt.op = BLE_GATT_REGISTER_OP_SVC;
         register_ctxt.svc.handle = *out_handle;
         register_ctxt.svc.svc_def = svc;
-        register_cb(BLE_GATT_REGISTER_OP_SVC, &register_ctxt, cb_arg);
+        register_cb(&register_ctxt, cb_arg);
     }
 
     /* Register each include. */

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/78d4bed2/net/nimble/host/src/test/ble_gatts_notify_test.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_gatts_notify_test.c b/net/nimble/host/src/test/ble_gatts_notify_test.c
index 5a7b86d..0542121 100644
--- a/net/nimble/host/src/test/ble_gatts_notify_test.c
+++ b/net/nimble/host/src/test/ble_gatts_notify_test.c
@@ -37,8 +37,7 @@ ble_gatts_notify_test_misc_access(uint16_t conn_handle,
                                   struct ble_gatt_access_ctxt *ctxt,
                                   void *arg);
 static void
-ble_gatts_notify_test_misc_reg_cb(uint8_t op,
-                                  union ble_gatt_register_ctxt *ctxt,
+ble_gatts_notify_test_misc_reg_cb(struct ble_gatt_register_ctxt *ctxt,
                                   void *arg);
 
 static const struct ble_gatt_svc_def ble_gatts_notify_test_svcs[] = { {
@@ -207,13 +206,12 @@ ble_gatts_restore_bonding(uint16_t conn_handle)
 }
 
 static void
-ble_gatts_notify_test_misc_reg_cb(uint8_t op,
-                                  union ble_gatt_register_ctxt *ctxt,
+ble_gatts_notify_test_misc_reg_cb(struct ble_gatt_register_ctxt *ctxt,
                                   void *arg)
 {
     uint16_t uuid16;
 
-    if (op == BLE_GATT_REGISTER_OP_CHR) {
+    if (ctxt->op == BLE_GATT_REGISTER_OP_CHR) {
         uuid16 = ble_uuid_128_to_16(ctxt->chr.chr_def->uuid128);
         switch (uuid16) {
         case BLE_GATTS_NOTIFY_TEST_CHR_1_UUID:

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/78d4bed2/net/nimble/host/src/test/ble_gatts_read_test.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_gatts_read_test.c b/net/nimble/host/src/test/ble_gatts_read_test.c
index 71794cd..92c86f4 100644
--- a/net/nimble/host/src/test/ble_gatts_read_test.c
+++ b/net/nimble/host/src/test/ble_gatts_read_test.c
@@ -41,8 +41,7 @@ ble_gatts_read_test_util_access_2(uint16_t conn_handle,
                                   struct ble_gatt_access_ctxt *ctxt,
                                   void *arg);
 static void
-ble_gatts_read_test_misc_reg_cb(uint8_t op,
-                                union ble_gatt_register_ctxt *ctxt,
+ble_gatts_read_test_misc_reg_cb(struct ble_gatt_register_ctxt *ctxt,
                                 void *arg);
 
 static const struct ble_gatt_svc_def ble_gatts_read_test_svcs[] = { {
@@ -98,13 +97,12 @@ ble_gatts_read_test_misc_init(uint16_t *out_conn_handle)
 }
 
 static void
-ble_gatts_read_test_misc_reg_cb(uint8_t op,
-                                union ble_gatt_register_ctxt *ctxt,
+ble_gatts_read_test_misc_reg_cb(struct ble_gatt_register_ctxt *ctxt,
                                 void *arg)
 {
     uint16_t uuid16;
 
-    if (op == BLE_GATT_REGISTER_OP_CHR) {
+    if (ctxt->op == BLE_GATT_REGISTER_OP_CHR) {
         uuid16 = ble_uuid_128_to_16(ctxt->chr.chr_def->uuid128);
         switch (uuid16) {
         case BLE_GATTS_READ_TEST_CHR_1_UUID:

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/78d4bed2/net/nimble/host/src/test/ble_gatts_reg_test.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_gatts_reg_test.c b/net/nimble/host/src/test/ble_gatts_reg_test.c
index 8732b5e..f15dfef 100644
--- a/net/nimble/host/src/test/ble_gatts_reg_test.c
+++ b/net/nimble/host/src/test/ble_gatts_reg_test.c
@@ -51,8 +51,7 @@ ble_gatts_reg_test_init(void)
 }
 
 static void
-ble_gatts_reg_test_misc_reg_cb(uint8_t op, union ble_gatt_register_ctxt *ctxt,
-                               void *arg)
+ble_gatts_reg_test_misc_reg_cb(struct ble_gatt_register_ctxt *ctxt, void *arg)
 {
     struct ble_gatts_reg_test_entry *entry;
 
@@ -62,8 +61,8 @@ ble_gatts_reg_test_misc_reg_cb(uint8_t op, union ble_gatt_register_ctxt *ctxt,
     entry = ble_gatts_reg_test_entries + ble_gatts_reg_test_num_entries++;
     memset(entry, 0, sizeof *entry);
 
-    entry->op = op;
-    switch (op) {
+    entry->op = ctxt->op;
+    switch (ctxt->op) {
     case BLE_GATT_REGISTER_OP_SVC:
         memcpy(entry->uuid128, ctxt->svc.svc_def->uuid128, 16);
         entry->handle = ctxt->svc.handle;


[2/5] incubator-mynewt-core git commit: MYNEWT-350 BLE Host - Fn to calc GATT server rsrcs

Posted by cc...@apache.org.
MYNEWT-350 BLE Host - Fn to calc GATT server rsrcs


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/d38f1583
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/d38f1583
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/d38f1583

Branch: refs/heads/develop
Commit: d38f1583659428a7d1cb4c53b98de877d68da634
Parents: fb3eae7
Author: Christopher Collins <cc...@apache.org>
Authored: Wed Jul 13 16:49:46 2016 -0700
Committer: Christopher Collins <cc...@apache.org>
Committed: Wed Jul 13 16:49:46 2016 -0700

----------------------------------------------------------------------
 net/nimble/host/include/host/ble_gatt.h |  30 ++++++++
 net/nimble/host/src/ble_gatts.c         | 109 +++++++++++++++++++++++++++
 2 files changed, 139 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d38f1583/net/nimble/host/include/host/ble_gatt.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/include/host/ble_gatt.h b/net/nimble/host/include/host/ble_gatt.h
index 2697f71..6a710f8 100644
--- a/net/nimble/host/include/host/ble_gatt.h
+++ b/net/nimble/host/include/host/ble_gatt.h
@@ -363,6 +363,34 @@ union ble_gatt_register_ctxt {
     } dsc;
 };
 
+/**
+ * Contains counts of resources required by the GATT server.  The contents of
+ * this struct are generally used to populate a configuration struct before
+ * the host is initialized.
+ */
+struct ble_gatt_resources {
+    /** Number of services. */
+    uint16_t svcs;
+
+    /** Number of included services. */
+    uint16_t incs;
+
+    /** Number of characteristics. */
+    uint16_t chrs;
+
+    /** Number of descriptors. */
+    uint16_t dscs;
+
+    /**
+     * Number of client characteristic configuration descriptors.  Each of
+     * these also contributes to the total descriptor count.
+     */
+    uint16_t cccds;
+
+    /** Total number of ATT attributes. */
+    uint16_t attrs;
+};
+
 union ble_gatt_register_ctxt;
 typedef void ble_gatt_register_fn(uint8_t op,
                                   union ble_gatt_register_ctxt *ctxt,
@@ -371,6 +399,8 @@ typedef void ble_gatt_register_fn(uint8_t op,
 int ble_gatts_register_svcs(const struct ble_gatt_svc_def *svcs,
                             ble_gatt_register_fn *register_cb,
                             void *cb_arg);
+int ble_gatts_count_resources(const struct ble_gatt_svc_def *svcs,
+                              struct ble_gatt_resources *res);
 
 void ble_gatts_chr_updated(uint16_t chr_def_handle);
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d38f1583/net/nimble/host/src/ble_gatts.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_gatts.c b/net/nimble/host/src/ble_gatts.c
index 3b6b0b6..3219c38 100644
--- a/net/nimble/host/src/ble_gatts.c
+++ b/net/nimble/host/src/ble_gatts.c
@@ -1604,6 +1604,115 @@ ble_gatts_find_dsc(const void *svc_uuid128, const void *chr_uuid128,
     }
 }
 
+/**
+ * Accumulates counts of each resource type required by the specified service
+ * definition array.  This function is generally used to calculate some host
+ * configuration values prior to initialization.  This function adds the counts
+ * to the appropriate fields in the supplied ble_gatt_resources object without
+ * clearing them first, so it can be called repeatedly with different inputs to
+ * calculate totals.  Be sure to zero the resource struct prior to the first
+ * call to this function.
+ *
+ * @param svcs                  The service array containing the resource
+ *                                  definitions to be counted.
+ * @param res                   The resource counts are accumulated in this
+ *                                  struct.
+ *
+ * @return                      0 on success;
+ *                              BLE_HS_EINVAL if the svcs array contains an
+ *                                  invalid resource definition.
+ */
+int
+ble_gatts_count_resources(const struct ble_gatt_svc_def *svcs,
+                          struct ble_gatt_resources *res)
+{
+    const struct ble_gatt_svc_def *svc;
+    const struct ble_gatt_chr_def *chr;
+    int s;
+    int i;
+    int c;
+    int d;
+
+    for (s = 0; svcs[s].type != BLE_GATT_SVC_TYPE_END; s++) {
+        svc = svcs + s;
+
+        if (!ble_gatts_svc_is_sane(svc)) {
+            BLE_HS_DBG_ASSERT(0);
+            return BLE_HS_EINVAL;
+        }
+
+        /* Each service requires:
+         *     o 1 service
+         *     o 1 attribute
+         */
+        res->svcs++;
+        res->attrs++;
+
+        if (svc->includes != NULL) {
+            for (i = 0; svc->includes[i] != NULL; i++) {
+                /* Each include requires:
+                 *     o 1 include
+                 *     o 1 attribute
+                 */
+                res->incs++;
+                res->attrs++;
+            }
+        }
+
+        if (svc->characteristics != NULL) {
+            for (c = 0; svc->characteristics[c].uuid128 != NULL; c++) {
+                chr = svc->characteristics + c;
+
+                if (!ble_gatts_chr_is_sane(chr)) {
+                    BLE_HS_DBG_ASSERT(0);
+                    return BLE_HS_EINVAL;
+                }
+
+                /* Each characteristic requires:
+                 *     o 1 characteristic
+                 *     o 2 attributes
+                 */
+                res->chrs++;
+                res->attrs += 2;
+
+                /* If the characteristic permits notifications or indications,
+                 * it has a CCCD.
+                 */
+                if (chr->flags & BLE_GATT_CHR_F_NOTIFY ||
+                    chr->flags & BLE_GATT_CHR_F_INDICATE) {
+
+                    /* Each CCCD requires:
+                     *     o 1 descriptor
+                     *     o 1 CCCD
+                     *     o 1 attribute
+                     */
+                    res->dscs++;
+                    res->cccds++;
+                    res->attrs++;
+                }
+
+                if (chr->descriptors != NULL) {
+                    for (d = 0; chr->descriptors[d].uuid128 != NULL; d++) {
+                        if (!ble_gatts_dsc_is_sane(chr->descriptors + d)) {
+                            BLE_HS_DBG_ASSERT(0);
+                            return BLE_HS_EINVAL;
+                        }
+
+                        /* Each descriptor requires:
+                         *     o 1 descriptor
+                         *     o 1 attribute
+                         */
+                        res->dscs++;
+                        res->attrs++;
+                    }
+                }
+            }
+        }
+    }
+
+    return 0;
+}
+
 static void
 ble_gatts_free_mem(void)
 {


[4/5] incubator-mynewt-core git commit: BLE Host - Move opcode into gatt access ctxt.

Posted by cc...@apache.org.
BLE Host - Move opcode into gatt access ctxt.


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/147a5632
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/147a5632
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/147a5632

Branch: refs/heads/develop
Commit: 147a56321108440ddb6077415248964b057b0780
Parents: 9420c87
Author: Christopher Collins <cc...@apache.org>
Authored: Thu Jul 14 11:07:33 2016 -0700
Committer: Christopher Collins <cc...@apache.org>
Committed: Thu Jul 14 11:29:06 2016 -0700

----------------------------------------------------------------------
 apps/bleprph/src/gatt_svr.c                     | 58 ++++++++++---------
 apps/bletiny/src/gatt_svr.c                     | 61 ++++++++++----------
 net/nimble/host/include/host/ble_gatt.h         | 13 ++++-
 net/nimble/host/src/ble_gatts.c                 | 18 +++---
 .../host/src/test/ble_gatts_notify_test.c       |  6 +-
 net/nimble/host/src/test/ble_gatts_read_test.c  | 12 ++--
 net/nimble/host/src/test/ble_gatts_reg_test.c   |  2 +-
 7 files changed, 88 insertions(+), 82 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/147a5632/apps/bleprph/src/gatt_svr.c
----------------------------------------------------------------------
diff --git a/apps/bleprph/src/gatt_svr.c b/apps/bleprph/src/gatt_svr.c
index 595a0d9..c2c40bd 100644
--- a/apps/bleprph/src/gatt_svr.c
+++ b/apps/bleprph/src/gatt_svr.c
@@ -55,20 +55,20 @@ const uint8_t gatt_svr_chr_sec_test_static_uuid[16] = {
 static uint8_t gatt_svr_sec_test_static_val;
 
 static int
-gatt_svr_chr_access_gap(uint16_t conn_handle, uint16_t attr_handle, uint8_t op,
+gatt_svr_chr_access_gap(uint16_t conn_handle, uint16_t attr_handle,
                         struct ble_gatt_access_ctxt *ctxt, void *arg);
 static int
-gatt_svr_chr_access_gatt(uint16_t conn_handle, uint16_t attr_handle, uint8_t op,
+gatt_svr_chr_access_gatt(uint16_t conn_handle, uint16_t attr_handle,
                          struct ble_gatt_access_ctxt *ctxt, void *arg);
 static int
 gatt_svr_chr_access_alert(uint16_t conn_handle, uint16_t attr_handle,
-                          uint8_t op, struct ble_gatt_access_ctxt *ctxt,
+                          struct ble_gatt_access_ctxt *ctxt,
                           void *arg);
 
 static int
 gatt_svr_chr_access_sec_test(uint16_t conn_handle, uint16_t attr_handle,
-                                uint8_t op, struct ble_gatt_access_ctxt *ctxt,
-                                void *arg);
+                             struct ble_gatt_access_ctxt *ctxt,
+                             void *arg);
 
 static const struct ble_gatt_svc_def gatt_svr_svcs[] = {
     {
@@ -193,7 +193,7 @@ gatt_svr_chr_write(uint8_t op, struct ble_gatt_access_ctxt *ctxt,
 }
 
 static int
-gatt_svr_chr_access_gap(uint16_t conn_handle, uint16_t attr_handle, uint8_t op,
+gatt_svr_chr_access_gap(uint16_t conn_handle, uint16_t attr_handle,
                         struct ble_gatt_access_ctxt *ctxt, void *arg)
 {
     uint16_t uuid16;
@@ -203,25 +203,25 @@ gatt_svr_chr_access_gap(uint16_t conn_handle, uint16_t attr_handle, uint8_t op,
 
     switch (uuid16) {
     case BLE_GAP_CHR_UUID16_DEVICE_NAME:
-        assert(op == BLE_GATT_ACCESS_OP_READ_CHR);
+        assert(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR);
         ctxt->att->read.data = bleprph_device_name;
         ctxt->att->read.len = strlen(bleprph_device_name);
         break;
 
     case BLE_GAP_CHR_UUID16_APPEARANCE:
-        assert(op == BLE_GATT_ACCESS_OP_READ_CHR);
+        assert(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR);
         ctxt->att->read.data = &bleprph_appearance;
         ctxt->att->read.len = sizeof bleprph_appearance;
         break;
 
     case BLE_GAP_CHR_UUID16_PERIPH_PRIV_FLAG:
-        assert(op == BLE_GATT_ACCESS_OP_READ_CHR);
+        assert(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR);
         ctxt->att->read.data = &bleprph_privacy_flag;
         ctxt->att->read.len = sizeof bleprph_privacy_flag;
         break;
 
     case BLE_GAP_CHR_UUID16_RECONNECT_ADDR:
-        assert(op == BLE_GATT_ACCESS_OP_WRITE_CHR);
+        assert(ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR);
         if (ctxt->att->write.len != sizeof bleprph_reconnect_addr) {
             return BLE_ATT_ERR_INVALID_ATTR_VALUE_LEN;
         }
@@ -230,7 +230,7 @@ gatt_svr_chr_access_gap(uint16_t conn_handle, uint16_t attr_handle, uint8_t op,
         break;
 
     case BLE_GAP_CHR_UUID16_PERIPH_PREF_CONN_PARAMS:
-        assert(op == BLE_GATT_ACCESS_OP_READ_CHR);
+        assert(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR);
         ctxt->att->read.data = &bleprph_pref_conn_params;
         ctxt->att->read.len = sizeof bleprph_pref_conn_params;
         break;
@@ -244,7 +244,7 @@ gatt_svr_chr_access_gap(uint16_t conn_handle, uint16_t attr_handle, uint8_t op,
 }
 
 static int
-gatt_svr_chr_access_gatt(uint16_t conn_handle, uint16_t attr_handle, uint8_t op,
+gatt_svr_chr_access_gatt(uint16_t conn_handle, uint16_t attr_handle,
                          struct ble_gatt_access_ctxt *ctxt, void *arg)
 {
     uint16_t uuid16;
@@ -254,13 +254,13 @@ gatt_svr_chr_access_gatt(uint16_t conn_handle, uint16_t attr_handle, uint8_t op,
 
     switch (uuid16) {
     case BLE_GATT_CHR_SERVICE_CHANGED_UUID16:
-        if (op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
+        if (ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
             if (ctxt->att->write.len != sizeof bleprph_gatt_service_changed) {
                 return BLE_ATT_ERR_INVALID_ATTR_VALUE_LEN;
             }
             memcpy(bleprph_gatt_service_changed, ctxt->att->write.data,
                    sizeof bleprph_gatt_service_changed);
-        } else if (op == BLE_GATT_ACCESS_OP_READ_CHR) {
+        } else if (ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR) {
             ctxt->att->read.data = &bleprph_gatt_service_changed;
             ctxt->att->read.len = sizeof bleprph_gatt_service_changed;
         }
@@ -285,7 +285,7 @@ static uint16_t gatt_svr_alert_not_ctrl_pt;
 
 static int
 gatt_svr_chr_access_alert(uint16_t conn_handle, uint16_t attr_handle,
-                          uint8_t op, struct ble_gatt_access_ctxt *ctxt,
+                          struct ble_gatt_access_ctxt *ctxt,
                           void *arg)
 {
     uint16_t uuid16;
@@ -296,32 +296,34 @@ gatt_svr_chr_access_alert(uint16_t conn_handle, uint16_t attr_handle,
 
     switch (uuid16) {
     case GATT_SVR_CHR_SUP_NEW_ALERT_CAT_UUID:
-        assert(op == BLE_GATT_ACCESS_OP_READ_CHR);
+        assert(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR);
         ctxt->att->read.data = &gatt_svr_new_alert_cat;
         ctxt->att->read.len = sizeof gatt_svr_new_alert_cat;
         return 0;
 
     case GATT_SVR_CHR_NEW_ALERT:
-        if (op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
-            rc = gatt_svr_chr_write(op, ctxt, 0, sizeof gatt_svr_new_alert_val,
+        if (ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
+            rc = gatt_svr_chr_write(ctxt->op, ctxt, 0,
+                                    sizeof gatt_svr_new_alert_val,
                                     gatt_svr_new_alert_val,
                                     &gatt_svr_new_alert_val_len);
             return rc;
-        } else if (op == BLE_GATT_ACCESS_OP_READ_CHR) {
+        } else if (ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR) {
             ctxt->att->read.data = (void *)&gatt_svr_new_alert_val;
             ctxt->att->read.len = sizeof gatt_svr_new_alert_val;
             return 0;
         }
 
     case GATT_SVR_CHR_SUP_UNR_ALERT_CAT_UUID:
-        assert(op == BLE_GATT_ACCESS_OP_READ_CHR);
+        assert(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR);
         ctxt->att->read.data = &gatt_svr_unr_alert_cat;
         ctxt->att->read.len = sizeof gatt_svr_unr_alert_cat;
         return 0;
 
     case GATT_SVR_CHR_UNR_ALERT_STAT_UUID:
-        if (op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
-            rc = gatt_svr_chr_write(op, ctxt, 2, 2, &gatt_svr_unr_alert_stat,
+        if (ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
+            rc = gatt_svr_chr_write(ctxt->op, ctxt, 2, 2,
+                                    &gatt_svr_unr_alert_stat,
                                     NULL);
         } else {
             ctxt->att->read.data = &gatt_svr_unr_alert_stat;
@@ -331,8 +333,8 @@ gatt_svr_chr_access_alert(uint16_t conn_handle, uint16_t attr_handle,
         return rc;
 
     case GATT_SVR_CHR_ALERT_NOT_CTRL_PT:
-        if (op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
-            rc = gatt_svr_chr_write(op, ctxt, 2, 2,
+        if (ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
+            rc = gatt_svr_chr_write(ctxt->op, ctxt, 2, 2,
                                     &gatt_svr_alert_not_ctrl_pt, NULL);
         } else {
             rc = BLE_ATT_ERR_UNLIKELY;
@@ -347,7 +349,7 @@ gatt_svr_chr_access_alert(uint16_t conn_handle, uint16_t attr_handle,
 
 static int
 gatt_svr_chr_access_sec_test(uint16_t conn_handle, uint16_t attr_handle,
-                             uint8_t op, struct ble_gatt_access_ctxt *ctxt,
+                             struct ble_gatt_access_ctxt *ctxt,
                              void *arg)
 {
     const void *uuid128;
@@ -361,7 +363,7 @@ gatt_svr_chr_access_sec_test(uint16_t conn_handle, uint16_t attr_handle,
      */
 
     if (memcmp(uuid128, gatt_svr_chr_sec_test_rand_uuid, 16) == 0) {
-        assert(op == BLE_GATT_ACCESS_OP_READ_CHR);
+        assert(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR);
 
         /* Respond with a 32-bit random number.  Use the stack-provided buffer
          * to hold the response data.
@@ -373,14 +375,14 @@ gatt_svr_chr_access_sec_test(uint16_t conn_handle, uint16_t attr_handle,
     }
 
     if (memcmp(uuid128, gatt_svr_chr_sec_test_static_uuid, 16) == 0) {
-        switch (op) {
+        switch (ctxt->op) {
         case BLE_GATT_ACCESS_OP_READ_CHR:
             ctxt->att->read.data = &gatt_svr_sec_test_static_val;
             ctxt->att->read.len = sizeof gatt_svr_sec_test_static_val;
             return 0;
 
         case BLE_GATT_ACCESS_OP_WRITE_CHR:
-            rc = gatt_svr_chr_write(op, ctxt,
+            rc = gatt_svr_chr_write(ctxt->op, ctxt,
                                     sizeof gatt_svr_sec_test_static_val,
                                     sizeof gatt_svr_sec_test_static_val,
                                     &gatt_svr_sec_test_static_val, NULL);

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/147a5632/apps/bletiny/src/gatt_svr.c
----------------------------------------------------------------------
diff --git a/apps/bletiny/src/gatt_svr.c b/apps/bletiny/src/gatt_svr.c
index 0b20f8e..ceb4522 100644
--- a/apps/bletiny/src/gatt_svr.c
+++ b/apps/bletiny/src/gatt_svr.c
@@ -55,20 +55,17 @@ const uint8_t gatt_svr_chr_sec_test_static_uuid[16] = {
 static uint8_t gatt_svr_sec_test_static_val;
 
 static int
-gatt_svr_chr_access_gap(uint16_t conn_handle, uint16_t attr_handle, uint8_t op,
+gatt_svr_chr_access_gap(uint16_t conn_handle, uint16_t attr_handle,
                         struct ble_gatt_access_ctxt *ctxt, void *arg);
 static int
-gatt_svr_chr_access_gatt(uint16_t conn_handle, uint16_t attr_handle, uint8_t op,
+gatt_svr_chr_access_gatt(uint16_t conn_handle, uint16_t attr_handle,
                          struct ble_gatt_access_ctxt *ctxt, void *arg);
 static int
 gatt_svr_chr_access_alert(uint16_t conn_handle, uint16_t attr_handle,
-                          uint8_t op, struct ble_gatt_access_ctxt *ctxt,
-                          void *arg);
-
+                          struct ble_gatt_access_ctxt *ctxt, void *arg);
 static int
 gatt_svr_chr_access_sec_test(uint16_t conn_handle, uint16_t attr_handle,
-                                uint8_t op, struct ble_gatt_access_ctxt *ctxt,
-                                void *arg);
+                             struct ble_gatt_access_ctxt *ctxt, void *arg);
 
 static const struct ble_gatt_svc_def gatt_svr_svcs[] = {
     {
@@ -193,7 +190,7 @@ gatt_svr_chr_write(uint8_t op, struct ble_gatt_access_ctxt *ctxt,
 }
 
 static int
-gatt_svr_chr_access_gap(uint16_t conn_handle, uint16_t attr_handle, uint8_t op,
+gatt_svr_chr_access_gap(uint16_t conn_handle, uint16_t attr_handle,
                         struct ble_gatt_access_ctxt *ctxt, void *arg)
 {
     uint16_t uuid16;
@@ -203,25 +200,25 @@ gatt_svr_chr_access_gap(uint16_t conn_handle, uint16_t attr_handle, uint8_t op,
 
     switch (uuid16) {
     case BLE_GAP_CHR_UUID16_DEVICE_NAME:
-        assert(op == BLE_GATT_ACCESS_OP_READ_CHR);
+        assert(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR);
         ctxt->att->read.data = bletiny_device_name;
         ctxt->att->read.len = strlen(bletiny_device_name);
         break;
 
     case BLE_GAP_CHR_UUID16_APPEARANCE:
-        assert(op == BLE_GATT_ACCESS_OP_READ_CHR);
+        assert(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR);
         ctxt->att->read.data = &bletiny_appearance;
         ctxt->att->read.len = sizeof bletiny_appearance;
         break;
 
     case BLE_GAP_CHR_UUID16_PERIPH_PRIV_FLAG:
-        assert(op == BLE_GATT_ACCESS_OP_READ_CHR);
+        assert(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR);
         ctxt->att->read.data = &bletiny_privacy_flag;
         ctxt->att->read.len = sizeof bletiny_privacy_flag;
         break;
 
     case BLE_GAP_CHR_UUID16_RECONNECT_ADDR:
-        assert(op == BLE_GATT_ACCESS_OP_WRITE_CHR);
+        assert(ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR);
         if (ctxt->att->write.len != sizeof bletiny_reconnect_addr) {
             return BLE_ATT_ERR_INVALID_ATTR_VALUE_LEN;
         }
@@ -230,7 +227,7 @@ gatt_svr_chr_access_gap(uint16_t conn_handle, uint16_t attr_handle, uint8_t op,
         break;
 
     case BLE_GAP_CHR_UUID16_PERIPH_PREF_CONN_PARAMS:
-        assert(op == BLE_GATT_ACCESS_OP_READ_CHR);
+        assert(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR);
         ctxt->att->read.data = &bletiny_pref_conn_params;
         ctxt->att->read.len = sizeof bletiny_pref_conn_params;
         break;
@@ -244,7 +241,7 @@ gatt_svr_chr_access_gap(uint16_t conn_handle, uint16_t attr_handle, uint8_t op,
 }
 
 static int
-gatt_svr_chr_access_gatt(uint16_t conn_handle, uint16_t attr_handle, uint8_t op,
+gatt_svr_chr_access_gatt(uint16_t conn_handle, uint16_t attr_handle,
                          struct ble_gatt_access_ctxt *ctxt, void *arg)
 {
     uint16_t uuid16;
@@ -254,13 +251,13 @@ gatt_svr_chr_access_gatt(uint16_t conn_handle, uint16_t attr_handle, uint8_t op,
 
     switch (uuid16) {
     case BLE_GATT_CHR_SERVICE_CHANGED_UUID16:
-        if (op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
+        if (ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
             if (ctxt->att->write.len != sizeof bletiny_gatt_service_changed) {
                 return BLE_ATT_ERR_INVALID_ATTR_VALUE_LEN;
             }
             memcpy(bletiny_gatt_service_changed, ctxt->att->write.data,
                    sizeof bletiny_gatt_service_changed);
-        } else if (op == BLE_GATT_ACCESS_OP_READ_CHR) {
+        } else if (ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR) {
             ctxt->att->read.data = &bletiny_gatt_service_changed;
             ctxt->att->read.len = sizeof bletiny_gatt_service_changed;
         }
@@ -285,8 +282,7 @@ static uint16_t gatt_svr_alert_not_ctrl_pt;
 
 static int
 gatt_svr_chr_access_alert(uint16_t conn_handle, uint16_t attr_handle,
-                          uint8_t op, struct ble_gatt_access_ctxt *ctxt,
-                          void *arg)
+                          struct ble_gatt_access_ctxt *ctxt, void *arg)
 {
     uint16_t uuid16;
     int rc;
@@ -296,32 +292,34 @@ gatt_svr_chr_access_alert(uint16_t conn_handle, uint16_t attr_handle,
 
     switch (uuid16) {
     case GATT_SVR_CHR_SUP_NEW_ALERT_CAT_UUID:
-        assert(op == BLE_GATT_ACCESS_OP_READ_CHR);
+        assert(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR);
         ctxt->att->read.data = &gatt_svr_new_alert_cat;
         ctxt->att->read.len = sizeof gatt_svr_new_alert_cat;
         return 0;
 
     case GATT_SVR_CHR_NEW_ALERT:
-        if (op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
-            rc = gatt_svr_chr_write(op, ctxt, 0, sizeof gatt_svr_new_alert_val,
+        if (ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
+            rc = gatt_svr_chr_write(ctxt->op, ctxt, 0,
+                                    sizeof gatt_svr_new_alert_val,
                                     gatt_svr_new_alert_val,
                                     &gatt_svr_new_alert_val_len);
             return rc;
-        } else if (op == BLE_GATT_ACCESS_OP_READ_CHR) {
+        } else if (ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR) {
             ctxt->att->read.data = (void *)&gatt_svr_new_alert_val;
             ctxt->att->read.len = sizeof gatt_svr_new_alert_val;
             return 0;
         }
 
     case GATT_SVR_CHR_SUP_UNR_ALERT_CAT_UUID:
-        assert(op == BLE_GATT_ACCESS_OP_READ_CHR);
+        assert(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR);
         ctxt->att->read.data = &gatt_svr_unr_alert_cat;
         ctxt->att->read.len = sizeof gatt_svr_unr_alert_cat;
         return 0;
 
     case GATT_SVR_CHR_UNR_ALERT_STAT_UUID:
-        if (op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
-            rc = gatt_svr_chr_write(op, ctxt, 2, 2, &gatt_svr_unr_alert_stat,
+        if (ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
+            rc = gatt_svr_chr_write(ctxt->op, ctxt, 2, 2,
+                                    &gatt_svr_unr_alert_stat,
                                     NULL);
         } else {
             ctxt->att->read.data = &gatt_svr_unr_alert_stat;
@@ -331,8 +329,8 @@ gatt_svr_chr_access_alert(uint16_t conn_handle, uint16_t attr_handle,
         return rc;
 
     case GATT_SVR_CHR_ALERT_NOT_CTRL_PT:
-        if (op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
-            rc = gatt_svr_chr_write(op, ctxt, 2, 2,
+        if (ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
+            rc = gatt_svr_chr_write(ctxt->op, ctxt, 2, 2,
                                     &gatt_svr_alert_not_ctrl_pt, NULL);
         } else {
             rc = BLE_ATT_ERR_UNLIKELY;
@@ -347,8 +345,7 @@ gatt_svr_chr_access_alert(uint16_t conn_handle, uint16_t attr_handle,
 
 static int
 gatt_svr_chr_access_sec_test(uint16_t conn_handle, uint16_t attr_handle,
-                             uint8_t op, struct ble_gatt_access_ctxt *ctxt,
-                             void *arg)
+                             struct ble_gatt_access_ctxt *ctxt, void *arg)
 {
     const void *uuid128;
     int rand_num;
@@ -361,7 +358,7 @@ gatt_svr_chr_access_sec_test(uint16_t conn_handle, uint16_t attr_handle,
      */
 
     if (memcmp(uuid128, gatt_svr_chr_sec_test_rand_uuid, 16) == 0) {
-        assert(op == BLE_GATT_ACCESS_OP_READ_CHR);
+        assert(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR);
 
         /* Respond with a 32-bit random number.  Use the stack-provided buffer
          * to hold the response data.
@@ -373,14 +370,14 @@ gatt_svr_chr_access_sec_test(uint16_t conn_handle, uint16_t attr_handle,
     }
 
     if (memcmp(uuid128, gatt_svr_chr_sec_test_static_uuid, 16) == 0) {
-        switch (op) {
+        switch (ctxt->op) {
         case BLE_GATT_ACCESS_OP_READ_CHR:
             ctxt->att->read.data = &gatt_svr_sec_test_static_val;
             ctxt->att->read.len = sizeof gatt_svr_sec_test_static_val;
             return 0;
 
         case BLE_GATT_ACCESS_OP_WRITE_CHR:
-            rc = gatt_svr_chr_write(op, ctxt,
+            rc = gatt_svr_chr_write(ctxt->op, ctxt,
                                     sizeof gatt_svr_sec_test_static_val,
                                     sizeof gatt_svr_sec_test_static_val,
                                     &gatt_svr_sec_test_static_val, NULL);

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/147a5632/net/nimble/host/include/host/ble_gatt.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/include/host/ble_gatt.h b/net/nimble/host/include/host/ble_gatt.h
index 6a710f8..c855a9b 100644
--- a/net/nimble/host/include/host/ble_gatt.h
+++ b/net/nimble/host/include/host/ble_gatt.h
@@ -183,8 +183,7 @@ int ble_gattc_init(void);
 
 struct ble_gatt_access_ctxt;
 typedef int ble_gatt_access_fn(uint16_t conn_handle, uint16_t attr_handle,
-                               uint8_t op, struct ble_gatt_access_ctxt *ctxt,
-                               void *arg);
+                               struct ble_gatt_access_ctxt *ctxt, void *arg);
 
 typedef uint16_t ble_gatt_chr_flags;
 
@@ -257,6 +256,16 @@ struct ble_gatt_svc_def {
  */
 struct ble_gatt_access_ctxt {
     /**
+     * Indicates the gatt operation being performed.  This is equal to one of
+     * the following values:
+     *     o  BLE_GATT_ACCESS_OP_READ_CHR
+     *     o  BLE_GATT_ACCESS_OP_WRITE_CHR
+     *     o  BLE_GATT_ACCESS_OP_READ_DSC
+     *     o  BLE_GATT_ACCESS_OP_WRITE_DSC
+     */
+    uint8_t op;
+
+    /**
      * The GATT operation being performed dictates which field in this union is
      * valid.  If a characteristic is being accessed, the chr field is valid.
      * Otherwise, a descriptor is being accessed, in which case the dsc field

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/147a5632/net/nimble/host/src/ble_gatts.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_gatts.c b/net/nimble/host/src/ble_gatts.c
index 3219c38..0aff98a 100644
--- a/net/nimble/host/src/ble_gatts.c
+++ b/net/nimble/host/src/ble_gatts.c
@@ -293,24 +293,23 @@ ble_gatts_chr_val_access(uint16_t conn_handle, uint16_t attr_handle,
 {
     const struct ble_gatt_chr_def *chr_def;
     struct ble_gatt_access_ctxt gatt_ctxt;
-    uint8_t gatt_op;
     int rc;
 
     chr_def = arg;
     BLE_HS_DBG_ASSERT(chr_def != NULL && chr_def->access_cb != NULL);
 
-    gatt_op = ble_gatts_chr_op(att_op);
-    ble_gatts_chr_inc_val_stat(gatt_op);
+    gatt_ctxt.op = ble_gatts_chr_op(att_op);
+    ble_gatts_chr_inc_val_stat(gatt_ctxt.op);
 
     gatt_ctxt.chr = chr_def;
     gatt_ctxt.att = att_ctxt;
-    rc = chr_def->access_cb(conn_handle, attr_handle, gatt_op, &gatt_ctxt,
+    rc = chr_def->access_cb(conn_handle, attr_handle, &gatt_ctxt,
                             chr_def->arg);
     if (rc != 0) {
         return rc;
     }
 
-    if (gatt_op == BLE_GATT_ACCESS_OP_WRITE_CHR &&
+    if (gatt_ctxt.op == BLE_GATT_ACCESS_OP_WRITE_CHR &&
         ble_gatts_chr_clt_cfg_allowed(chr_def)) {
 
         ble_gatts_chr_updated(attr_handle - 1);
@@ -412,14 +411,13 @@ ble_gatts_dsc_access(uint16_t conn_handle, uint16_t attr_handle,
 {
     struct ble_gatt_access_ctxt gatt_ctxt;
     const struct ble_gatt_dsc_def *dsc_def;
-    uint8_t gatt_op;
     int rc;
 
     dsc_def = arg;
     BLE_HS_DBG_ASSERT(dsc_def != NULL && dsc_def->access_cb != NULL);
 
-    gatt_op = ble_gatts_dsc_op(att_op);
-    switch (gatt_op) {
+    gatt_ctxt.op = ble_gatts_dsc_op(att_op);
+    switch (gatt_ctxt.op) {
     case BLE_GATT_ACCESS_OP_READ_DSC:
         break;
 
@@ -431,11 +429,11 @@ ble_gatts_dsc_access(uint16_t conn_handle, uint16_t attr_handle,
         return BLE_HS_EUNKNOWN;
     }
 
-    ble_gatts_dsc_inc_stat(gatt_op);
+    ble_gatts_dsc_inc_stat(gatt_ctxt.op);
 
     gatt_ctxt.dsc = dsc_def;
     gatt_ctxt.att = att_ctxt;
-    rc = dsc_def->access_cb(conn_handle, attr_handle, gatt_op, &gatt_ctxt,
+    rc = dsc_def->access_cb(conn_handle, attr_handle, &gatt_ctxt,
                             dsc_def->arg);
     if (rc != 0) {
         return rc;

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/147a5632/net/nimble/host/src/test/ble_gatts_notify_test.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_gatts_notify_test.c b/net/nimble/host/src/test/ble_gatts_notify_test.c
index 28d2120..5a7b86d 100644
--- a/net/nimble/host/src/test/ble_gatts_notify_test.c
+++ b/net/nimble/host/src/test/ble_gatts_notify_test.c
@@ -33,7 +33,7 @@ static uint8_t ble_gatts_notify_test_peer_addr[6] = {2,3,4,5,6,7};
 
 static int
 ble_gatts_notify_test_misc_access(uint16_t conn_handle,
-                                  uint16_t attr_handle, uint8_t op,
+                                  uint16_t attr_handle, 
                                   struct ble_gatt_access_ctxt *ctxt,
                                   void *arg);
 static void
@@ -233,11 +233,11 @@ ble_gatts_notify_test_misc_reg_cb(uint8_t op,
 
 static int
 ble_gatts_notify_test_misc_access(uint16_t conn_handle,
-                                  uint16_t attr_handle, uint8_t op,
+                                  uint16_t attr_handle,
                                   struct ble_gatt_access_ctxt *ctxt,
                                   void *arg)
 {
-    TEST_ASSERT_FATAL(op == BLE_GATT_ACCESS_OP_READ_CHR);
+    TEST_ASSERT_FATAL(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR);
     TEST_ASSERT(conn_handle == 0xffff);
 
     if (attr_handle == ble_gatts_notify_test_chr_1_def_handle + 1) {

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/147a5632/net/nimble/host/src/test/ble_gatts_read_test.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_gatts_read_test.c b/net/nimble/host/src/test/ble_gatts_read_test.c
index 401ddd8..71794cd 100644
--- a/net/nimble/host/src/test/ble_gatts_read_test.c
+++ b/net/nimble/host/src/test/ble_gatts_read_test.c
@@ -31,13 +31,13 @@ static uint8_t ble_gatts_read_test_peer_addr[6] = {2,3,4,5,6,7};
 
 static int
 ble_gatts_read_test_util_access_1(uint16_t conn_handle,
-                                  uint16_t attr_handle, uint8_t op,
+                                  uint16_t attr_handle,
                                   struct ble_gatt_access_ctxt *ctxt,
                                   void *arg);
 
 static int
 ble_gatts_read_test_util_access_2(uint16_t conn_handle,
-                                  uint16_t attr_handle, uint8_t op,
+                                  uint16_t attr_handle,
                                   struct ble_gatt_access_ctxt *ctxt,
                                   void *arg);
 static void
@@ -126,11 +126,11 @@ ble_gatts_read_test_misc_reg_cb(uint8_t op,
 
 static int
 ble_gatts_read_test_util_access_1(uint16_t conn_handle,
-                                  uint16_t attr_handle, uint8_t op,
+                                  uint16_t attr_handle,
                                   struct ble_gatt_access_ctxt *ctxt,
                                   void *arg)
 {
-    TEST_ASSERT_FATAL(op == BLE_GATT_ACCESS_OP_READ_CHR);
+    TEST_ASSERT_FATAL(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR);
     TEST_ASSERT_FATAL(attr_handle == ble_gatts_read_test_chr_1_val_handle);
 
     TEST_ASSERT(ctxt->chr ==
@@ -143,11 +143,11 @@ ble_gatts_read_test_util_access_1(uint16_t conn_handle,
 
 static int
 ble_gatts_read_test_util_access_2(uint16_t conn_handle,
-                                  uint16_t attr_handle, uint8_t op,
+                                  uint16_t attr_handle,
                                   struct ble_gatt_access_ctxt *ctxt,
                                   void *arg)
 {
-    TEST_ASSERT_FATAL(op == BLE_GATT_ACCESS_OP_READ_CHR);
+    TEST_ASSERT_FATAL(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR);
     TEST_ASSERT_FATAL(attr_handle == ble_gatts_read_test_chr_2_def_handle + 1);
 
     TEST_ASSERT(ctxt->chr ==

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/147a5632/net/nimble/host/src/test/ble_gatts_reg_test.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_gatts_reg_test.c b/net/nimble/host/src/test/ble_gatts_reg_test.c
index ff96f74..8732b5e 100644
--- a/net/nimble/host/src/test/ble_gatts_reg_test.c
+++ b/net/nimble/host/src/test/ble_gatts_reg_test.c
@@ -291,7 +291,7 @@ ble_gatts_reg_test_misc_verify_entry(uint8_t op, const uint8_t *uuid128)
 
 static int
 ble_gatts_reg_test_misc_dummy_access(uint16_t conn_handle,
-                                     uint16_t attr_handle, uint8_t op,
+                                     uint16_t attr_handle,
                                      struct ble_gatt_access_ctxt *ctxt,
                                      void *arg)
 {