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/24 19:02:49 UTC

[3/3] incubator-mynewt-core git commit: bletiny - Allow setting of local random address.

bletiny - Allow setting of local random address.


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

Branch: refs/heads/develop
Commit: 195c7d62e6bba1c9e17bd87c6c924e0867475fed
Parents: bbd43f1
Author: Christopher Collins <cc...@apache.org>
Authored: Sun Jul 24 11:51:37 2016 -0700
Committer: Christopher Collins <cc...@apache.org>
Committed: Sun Jul 24 12:02:05 2016 -0700

----------------------------------------------------------------------
 apps/bletiny/src/bletiny.h |  3 +-
 apps/bletiny/src/cmd.c     | 73 +++++++++++++++++++++++++++++++++--------
 apps/bletiny/src/parse.c   | 24 +++++++++++---
 3 files changed, 81 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/195c7d62/apps/bletiny/src/bletiny.h
----------------------------------------------------------------------
diff --git a/apps/bletiny/src/bletiny.h b/apps/bletiny/src/bletiny.h
index 44831be..b8e4864 100644
--- a/apps/bletiny/src/bletiny.h
+++ b/apps/bletiny/src/bletiny.h
@@ -88,7 +88,8 @@ extern struct log bletiny_log;
 const struct cmd_entry *parse_cmd_find(const struct cmd_entry *cmds,
                                        char *name);
 struct kv_pair *parse_kv_find(struct kv_pair *kvs, char *name);
-char *parse_arg_find(char *key);
+int parse_arg_find_idx(const char *key);
+char *parse_arg_extract(const char *key);
 long parse_arg_long_bounds(char *name, long min, long max, int *out_status);
 long parse_arg_long_bounds_default(char *name, long min, long max,
                                    long dflt, int *out_status);

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/195c7d62/apps/bletiny/src/cmd.c
----------------------------------------------------------------------
diff --git a/apps/bletiny/src/cmd.c b/apps/bletiny/src/cmd.c
index 4733076..7671253 100644
--- a/apps/bletiny/src/cmd.c
+++ b/apps/bletiny/src/cmd.c
@@ -1341,7 +1341,7 @@ cmd_set_adv_data(void)
         return rc;
     }
 
-    adv_fields.name = (uint8_t *)parse_arg_find("name");
+    adv_fields.name = (uint8_t *)parse_arg_extract("name");
     if (adv_fields.name != NULL) {
         adv_fields.name_len = strlen((char *)adv_fields.name);
     }
@@ -1470,7 +1470,7 @@ cmd_set_adv_data(void)
         return rc;
     }
 
-    eddystone_url_full = parse_arg_find("eddystone_url");
+    eddystone_url_full = parse_arg_extract("eddystone_url");
     if (eddystone_url_full != NULL) {
         rc = cmd_parse_eddystone_url(eddystone_url_full, &eddystone_url_scheme,
                                      eddystone_url_body,
@@ -1568,11 +1568,60 @@ cmd_set_sm_data(void)
     return 0;
 }
 
+static struct kv_pair cmd_set_addr_types[] = {
+    { "public",         BLE_ADDR_TYPE_PUBLIC },
+    { "random",         BLE_ADDR_TYPE_RANDOM },
+    { NULL }
+};
+
+static int
+cmd_set_addr(void)
+{
+    uint8_t addr[6];
+    int addr_type;
+    int rc;
+
+    addr_type = parse_arg_kv_default("addr_type", cmd_set_addr_types,
+                                     BLE_ADDR_TYPE_PUBLIC, &rc);
+    if (rc != 0) {
+        console_printf("invalid 'addr_type' parameter\n");
+        return rc;
+    }
+
+    rc = parse_arg_mac("addr", addr);
+    if (rc != 0) {
+        return rc;
+    }
+
+    switch (addr_type) {
+    case BLE_ADDR_TYPE_PUBLIC:
+        /* We shouldn't be writing to the controller's address (g_dev_addr).
+         * There is no standard way to set the local public address, so this is
+         * our only option at the moment.
+         */
+        memcpy(g_dev_addr, addr, 6);
+        ble_hs_id_set_pub(g_dev_addr);
+        break;
+
+    case BLE_ADDR_TYPE_RANDOM:
+        rc = ble_hs_id_set_rnd(addr);
+        if (rc != 0) {
+            return rc;
+        }
+        break;
+
+    default:
+        assert(0);
+        return BLE_HS_EUNKNOWN;
+    }
+
+    return 0;
+}
+
 static int
 cmd_set(int argc, char **argv)
 {
     uint16_t mtu;
-    uint8_t addr[6];
     uint8_t irk[16];
     int good;
     int rc;
@@ -1589,16 +1638,14 @@ cmd_set(int argc, char **argv)
 
     good = 0;
 
-    rc = parse_arg_mac("addr", addr);
-    if (rc == 0) {
+    rc = parse_arg_find_idx("addr");
+    if (rc != -1) {
+        rc = cmd_set_addr();
+        if (rc != 0) {
+            return rc;
+        }
+
         good = 1;
-        /* XXX: There are a lot of problems with this.  This command probably
-         * needs to be removed.
-         */
-        memcpy(g_dev_addr, addr, 6);
-        ble_hs_id_set_pub(g_dev_addr);
-    } else if (rc != ENOENT) {
-        return rc;
     }
 
     mtu = parse_arg_uint16("mtu", &rc);
@@ -2149,7 +2196,7 @@ cmd_passkey(int argc, char **argv)
             break;
 
         case BLE_SM_IOACT_NUMCMP:
-            yesno = parse_arg_find("yesno");
+            yesno = parse_arg_extract("yesno");
             if (yesno == NULL) {
                 return EINVAL;
             }

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/195c7d62/apps/bletiny/src/parse.c
----------------------------------------------------------------------
diff --git a/apps/bletiny/src/parse.c b/apps/bletiny/src/parse.c
index 77fdace..d951d3d 100644
--- a/apps/bletiny/src/parse.c
+++ b/apps/bletiny/src/parse.c
@@ -72,8 +72,22 @@ parse_kv_find(struct kv_pair *kvs, char *name)
     return NULL;
 }
 
+int
+parse_arg_find_idx(const char *key)
+{
+    int i;
+
+    for (i = 0; i < cmd_num_args; i++) {
+        if (strcmp(cmd_args[i][0], key) == 0) {
+            return i;
+        }
+    }
+
+    return -1;
+}
+
 char *
-parse_arg_find(char *key)
+parse_arg_extract(const char *key)
 {
     int i;
 
@@ -111,7 +125,7 @@ parse_arg_long_bounds(char *name, long min, long max, int *out_status)
     char *sval;
     long lval;
 
-    sval = parse_arg_find(name);
+    sval = parse_arg_extract(name);
     if (sval == NULL) {
         *out_status = ENOENT;
         return 0;
@@ -154,7 +168,7 @@ parse_arg_uint64_bounds(char *name, uint64_t min, uint64_t max, int *out_status)
     char *sval;
     uint64_t lval;
 
-    sval = parse_arg_find(name);
+    sval = parse_arg_extract(name);
     if (sval == NULL) {
         *out_status = ENOENT;
         return 0;
@@ -252,7 +266,7 @@ parse_arg_kv(char *name, struct kv_pair *kvs, int *out_status)
     struct kv_pair *kv;
     char *sval;
 
-    sval = parse_arg_find(name);
+    sval = parse_arg_extract(name);
     if (sval == NULL) {
         *out_status = ENOENT;
         return -1;
@@ -324,7 +338,7 @@ parse_arg_byte_stream(char *name, int max_len, uint8_t *dst, int *out_len)
 {
     char *sval;
 
-    sval = parse_arg_find(name);
+    sval = parse_arg_extract(name);
     if (sval == NULL) {
         return ENOENT;
     }