This patch set ads a sketleton for org.bluez.mesh.Management1 interface.
Also, adds check for the existence of the provisioning agent for an
attaching node: this information will be further used to validate
number of method calls on Management interface
Inga Stotland (2):
mesh: Add check for org.bluez.mesh.Provisioner1 interface
mesh: Add skeleton for org.bluez.mesh.Management1 interface
Makefile.mesh | 1 +
mesh/dbus.c | 12 ++-
mesh/error.h | 1 +
mesh/manager.c | 266 +++++++++++++++++++++++++++++++++++++++++++++++++
mesh/manager.h | 20 ++++
mesh/mesh.h | 4 +-
mesh/node.c | 5 +-
7 files changed, 303 insertions(+), 6 deletions(-)
create mode 100644 mesh/manager.c
create mode 100644 mesh/manager.h
--
2.21.0
This adds bare-bones imlementation of methods on org.bluez.mesh.Management1
interface.
---
Makefile.mesh | 1 +
mesh/dbus.c | 12 ++-
mesh/error.h | 1 +
mesh/manager.c | 266 +++++++++++++++++++++++++++++++++++++++++++++++++
mesh/manager.h | 20 ++++
mesh/mesh.h | 1 +
6 files changed, 297 insertions(+), 4 deletions(-)
create mode 100644 mesh/manager.c
create mode 100644 mesh/manager.h
diff --git a/Makefile.mesh b/Makefile.mesh
index bccd4d946..d494287ab 100644
--- a/Makefile.mesh
+++ b/Makefile.mesh
@@ -24,6 +24,7 @@ mesh_sources = mesh/mesh.h mesh/mesh.c \
mesh/dbus.h mesh/dbus.c \
mesh/agent.h mesh/agent.c \
mesh/prov-acceptor.c mesh/prov-initiator.c \
+ mesh/manager.h mesh/manager.c \
mesh/pb-adv.h mesh/pb-adv.c \
mesh/keyring.h mesh/keyring.c \
mesh/mesh-defs.h
diff --git a/mesh/dbus.c b/mesh/dbus.c
index 3b2e2aa81..083a7f77e 100644
--- a/mesh/dbus.c
+++ b/mesh/dbus.c
@@ -2,7 +2,7 @@
*
* BlueZ - Bluetooth protocol stack for Linux
*
- * Copyright (C) 2018 Intel Corporation. All rights reserved.
+ * Copyright (C) 2018-2019 Intel Corporation. All rights reserved.
*
*
* This library is free software; you can redistribute it and/or
@@ -33,10 +33,9 @@
#include "mesh/mesh-defs.h"
#include "mesh/mesh-io.h"
#include "mesh/node.h"
+#include "mesh/manager.h"
#include "mesh/net.h"
-#include "mesh/storage.h"
#include "mesh/cfgmod.h"
-#include "mesh/model.h"
#include "mesh/mesh.h"
#include "mesh/error.h"
#include "mesh/dbus.h"
@@ -62,7 +61,8 @@ static struct error_entry const error_table[] =
{ ERROR_INTERFACE ".InProgress", "Already in progress"},
{ ERROR_INTERFACE ".AlreadyExists", "Already exists"},
{ ERROR_INTERFACE ".DoesNotExist", "Does not exist"},
- { ERROR_INTERFACE ".Canceled", "Operation canceled"}
+ { ERROR_INTERFACE ".Canceled", "Operation canceled"},
+ { ERROR_INTERFACE ".NotImplemented", "Not implemented"},
};
struct l_dbus_message *dbus_error(struct l_dbus_message *msg, int err,
@@ -99,6 +99,10 @@ bool dbus_init(struct l_dbus *bus)
if (!node_dbus_init(bus))
return false;
+ /* Management interface */
+ if (!manager_dbus_init(bus))
+ return false;
+
dbus = bus;
return true;
diff --git a/mesh/error.h b/mesh/error.h
index a6aaa2fef..1669c070a 100644
--- a/mesh/error.h
+++ b/mesh/error.h
@@ -31,4 +31,5 @@ enum mesh_error {
MESH_ERROR_ALREADY_EXISTS,
MESH_ERROR_DOES_NOT_EXIST,
MESH_ERROR_CANCELED,
+ MESH_ERROR_NOT_IMPLEMENTED,
};
diff --git a/mesh/manager.c b/mesh/manager.c
new file mode 100644
index 000000000..d990ceec2
--- /dev/null
+++ b/mesh/manager.c
@@ -0,0 +1,266 @@
+/*
+ *
+ * BlueZ - Bluetooth protocol stack for Linux
+ *
+ * Copyright (C) 2019 Intel Corporation. All rights reserved.
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#define _GNU_SOURCE
+#include <ell/ell.h>
+
+#include "mesh/dbus.h"
+#include "mesh/error.h"
+#include "mesh/mesh.h"
+#include "mesh/manager.h"
+
+static struct l_dbus_message *add_node_call(struct l_dbus *dbus,
+ struct l_dbus_message *msg,
+ void *user_data)
+{
+ struct l_dbus_message_iter iter_uuid;
+ uint8_t *uuid;
+ uint32_t n;
+
+ l_debug("Add node request");
+
+ if (!l_dbus_message_get_arguments(msg, "ay", &iter_uuid))
+ return dbus_error(msg, MESH_ERROR_INVALID_ARGS, NULL);
+
+ if (!l_dbus_message_iter_get_fixed_array(&iter_uuid, &uuid, &n)
+ || n != 16)
+ return dbus_error(msg, MESH_ERROR_INVALID_ARGS,
+ "Bad device UUID");
+
+ /* TODO */
+ return dbus_error(msg, MESH_ERROR_NOT_IMPLEMENTED, NULL);
+}
+
+static struct l_dbus_message *delete_node_call(struct l_dbus *dbus,
+ struct l_dbus_message *msg,
+ void *user_data)
+{
+ uint16_t primary;
+ uint8_t num_ele;
+
+ if (!l_dbus_message_get_arguments(msg, "qy", &primary, &num_ele))
+ return dbus_error(msg, MESH_ERROR_INVALID_ARGS, NULL);
+
+ /* TODO */
+ return dbus_error(msg, MESH_ERROR_NOT_IMPLEMENTED, NULL);
+}
+
+static struct l_dbus_message *start_scan_call(struct l_dbus *dbus,
+ struct l_dbus_message *msg,
+ void *user_data)
+{
+ uint16_t duration;
+
+ if (!l_dbus_message_get_arguments(msg, "q", &duration))
+ return dbus_error(msg, MESH_ERROR_INVALID_ARGS, NULL);
+
+ /* TODO */
+ return dbus_error(msg, MESH_ERROR_NOT_IMPLEMENTED, NULL);
+}
+
+static struct l_dbus_message *cancel_scan_call(struct l_dbus *dbus,
+ struct l_dbus_message *msg,
+ void *user_data)
+{
+ /* TODO */
+ return dbus_error(msg, MESH_ERROR_NOT_IMPLEMENTED, NULL);
+}
+
+static struct l_dbus_message *create_subnet_call(struct l_dbus *dbus,
+ struct l_dbus_message *msg,
+ void *user_data)
+{
+ uint16_t net_idx;
+
+ if (!l_dbus_message_get_arguments(msg, "q", &net_idx))
+ return dbus_error(msg, MESH_ERROR_INVALID_ARGS, NULL);
+
+ /* TODO */
+ return dbus_error(msg, MESH_ERROR_NOT_IMPLEMENTED, NULL);
+}
+
+static struct l_dbus_message *update_subnet_call(struct l_dbus *dbus,
+ struct l_dbus_message *msg,
+ void *user_data)
+{
+ uint16_t net_idx;
+
+ if (!l_dbus_message_get_arguments(msg, "q", &net_idx))
+ return dbus_error(msg, MESH_ERROR_INVALID_ARGS, NULL);
+
+ /* TODO */
+ return dbus_error(msg, MESH_ERROR_NOT_IMPLEMENTED, NULL);
+}
+
+static struct l_dbus_message *delete_subnet_call(struct l_dbus *dbus,
+ struct l_dbus_message *msg,
+ void *user_data)
+{
+ uint16_t net_idx;
+
+ if (!l_dbus_message_get_arguments(msg, "q", &net_idx))
+ return dbus_error(msg, MESH_ERROR_INVALID_ARGS, NULL);
+
+ /* TODO */
+ return dbus_error(msg, MESH_ERROR_NOT_IMPLEMENTED, NULL);
+}
+
+static struct l_dbus_message *import_subnet_call(struct l_dbus *dbus,
+ struct l_dbus_message *msg,
+ void *user_data)
+{
+ uint16_t net_idx;
+ struct l_dbus_message_iter iter_key;
+ uint8_t *key;
+ uint32_t n;
+
+ if (!l_dbus_message_get_arguments(msg, "qay", &net_idx, &iter_key))
+ return dbus_error(msg, MESH_ERROR_INVALID_ARGS, NULL);
+
+ if (!l_dbus_message_iter_get_fixed_array(&iter_key, &key, &n)
+ || n != 16)
+ return dbus_error(msg, MESH_ERROR_INVALID_ARGS,
+ "Bad network key");
+
+ /* TODO */
+ return dbus_error(msg, MESH_ERROR_NOT_IMPLEMENTED, NULL);
+}
+
+static struct l_dbus_message *create_appkey_call(struct l_dbus *dbus,
+ struct l_dbus_message *msg,
+ void *user_data)
+{
+ uint16_t net_idx, app_idx;
+
+ if (!l_dbus_message_get_arguments(msg, "qq", &net_idx, &app_idx))
+ return dbus_error(msg, MESH_ERROR_INVALID_ARGS, NULL);
+
+ /* TODO */
+ return dbus_error(msg, MESH_ERROR_NOT_IMPLEMENTED, NULL);
+}
+
+static struct l_dbus_message *update_appkey_call(struct l_dbus *dbus,
+ struct l_dbus_message *msg,
+ void *user_data)
+{
+ uint16_t net_idx, app_idx;
+
+ if (!l_dbus_message_get_arguments(msg, "qq", &net_idx, &app_idx))
+ return dbus_error(msg, MESH_ERROR_INVALID_ARGS, NULL);
+
+ /* TODO */
+ return dbus_error(msg, MESH_ERROR_NOT_IMPLEMENTED, NULL);
+}
+
+static struct l_dbus_message *delete_appkey_call(struct l_dbus *dbus,
+ struct l_dbus_message *msg,
+ void *user_data)
+{
+ uint16_t net_idx, app_idx;
+
+ if (!l_dbus_message_get_arguments(msg, "qq", &net_idx, &app_idx))
+ return dbus_error(msg, MESH_ERROR_INVALID_ARGS, NULL);
+
+ /* TODO */
+ return dbus_error(msg, MESH_ERROR_NOT_IMPLEMENTED, NULL);
+}
+
+static struct l_dbus_message *import_appkey_call(struct l_dbus *dbus,
+ struct l_dbus_message *msg,
+ void *user_data)
+{
+ uint16_t net_idx, app_idx;
+ struct l_dbus_message_iter iter_key;
+ uint8_t *key;
+ uint32_t n;
+
+ if (!l_dbus_message_get_arguments(msg, "qqay", &net_idx, &app_idx,
+ &iter_key))
+ return dbus_error(msg, MESH_ERROR_INVALID_ARGS, NULL);
+
+ if (!l_dbus_message_iter_get_fixed_array(&iter_key, &key, &n)
+ || n != 16)
+ return dbus_error(msg, MESH_ERROR_INVALID_ARGS,
+ "Bad application key");
+
+ /* TODO */
+ return dbus_error(msg, MESH_ERROR_NOT_IMPLEMENTED, NULL);
+}
+
+static struct l_dbus_message *set_key_phase_call(struct l_dbus *dbus,
+ struct l_dbus_message *msg,
+ void *user_data)
+{
+ uint16_t net_idx;
+ uint8_t phase;
+
+ if (!l_dbus_message_get_arguments(msg, "qy", &net_idx, &phase))
+ return dbus_error(msg, MESH_ERROR_INVALID_ARGS, NULL);
+
+ /* TODO */
+ return dbus_error(msg, MESH_ERROR_NOT_IMPLEMENTED, NULL);
+}
+
+static void setup_management_interface(struct l_dbus_interface *iface)
+{
+ l_dbus_interface_method(iface, "AddNode", 0, add_node_call, "", "ay",
+ "", "uuid");
+ l_dbus_interface_method(iface, "DeleteRemodeNode", 0, delete_node_call,
+ "", "qy", "", "primary", "count");
+ l_dbus_interface_method(iface, "UnprovisionedScan", 0, start_scan_call,
+ "", "q", "", "seconds");
+ l_dbus_interface_method(iface, "UnprovisionedScanCancel", 0,
+ cancel_scan_call, "", "");
+ l_dbus_interface_method(iface, "CreateSubnet", 0, create_subnet_call,
+ "", "q", "", "net_index");
+ l_dbus_interface_method(iface, "UpdateSubnet", 0, update_subnet_call,
+ "", "q", "", "net_index");
+ l_dbus_interface_method(iface, "DeleteSubnet", 0, delete_subnet_call,
+ "", "q", "", "net_index");
+ l_dbus_interface_method(iface, "ImportSubnet", 0, import_subnet_call,
+ "", "qay", "", "net_index", "net_key");
+ l_dbus_interface_method(iface, "CreateAppKey", 0, create_appkey_call,
+ "", "qq", "", "net_index", "app_index");
+ l_dbus_interface_method(iface, "UpdateAppKey", 0, update_appkey_call,
+ "", "qq", "", "net_index", "app_index");
+ l_dbus_interface_method(iface, "DeleteAppKey", 0, delete_appkey_call,
+ "", "qq", "", "net_index", "app_index");
+ l_dbus_interface_method(iface, "ImportAppKey", 0, import_appkey_call,
+ "", "qqay", "", "net_index", "app_index",
+ "app_key");
+ l_dbus_interface_method(iface, "SetKeyPhase", 0, set_key_phase_call,
+ "", "qy", "", "net_index", "phase");
+}
+
+bool manager_dbus_init(struct l_dbus *bus)
+{
+ if (!l_dbus_register_interface(bus, MESH_MANAGEMENT_INTERFACE,
+ setup_management_interface,
+ NULL, false)) {
+ l_info("Unable to register %s interface",
+ MESH_MANAGEMENT_INTERFACE);
+ return false;
+ }
+
+ return true;
+}
diff --git a/mesh/manager.h b/mesh/manager.h
new file mode 100644
index 000000000..f27ca4181
--- /dev/null
+++ b/mesh/manager.h
@@ -0,0 +1,20 @@
+/*
+ *
+ * BlueZ - Bluetooth protocol stack for Linux
+ *
+ * Copyright (C) 2019 Intel Corporation. All rights reserved.
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ */
+
+bool manager_dbus_init(struct l_dbus *dbus);
diff --git a/mesh/mesh.h b/mesh/mesh.h
index 9b63500d1..320a108ed 100644
--- a/mesh/mesh.h
+++ b/mesh/mesh.h
@@ -21,6 +21,7 @@
#define MESH_NETWORK_INTERFACE "org.bluez.mesh.Network1"
#define MESH_NODE_INTERFACE "org.bluez.mesh.Node1"
+#define MESH_MANAGEMENT_INTERFACE "org.bluez.mesh.Management1"
#define MESH_ELEMENT_INTERFACE "org.bluez.mesh.Element1"
#define MESH_APPLICATION_INTERFACE "org.bluez.mesh.Application1"
#define MESH_PROVISION_AGENT_INTERFACE "org.bluez.mesh.ProvisionAgent1"
--
2.21.0
This adds check for the presence of org.bluez.mesh.Provisioner1
interface when collecting information about mesh application
that is received in callback of GetManagedObjects() method.
Set "provisioner" flag in the node structure to trueto indicate
that the node may act aa a provisioner.
---
mesh/mesh.h | 3 ++-
mesh/node.c | 5 ++++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/mesh/mesh.h b/mesh/mesh.h
index ff4e04fa1..9b63500d1 100644
--- a/mesh/mesh.h
+++ b/mesh/mesh.h
@@ -2,7 +2,7 @@
*
* BlueZ - Bluetooth protocol stack for Linux
*
- * Copyright (C) 2018 Intel Corporation. All rights reserved.
+ * Copyright (C) 2018-2019 Intel Corporation. All rights reserved.
*
*
* This library is free software; you can redistribute it and/or
@@ -24,6 +24,7 @@
#define MESH_ELEMENT_INTERFACE "org.bluez.mesh.Element1"
#define MESH_APPLICATION_INTERFACE "org.bluez.mesh.Application1"
#define MESH_PROVISION_AGENT_INTERFACE "org.bluez.mesh.ProvisionAgent1"
+#define MESH_PROVISIONER_INTERFACE "org.bluez.mesh.Provisioner1"
#define ERROR_INTERFACE "org.bluez.mesh.Error"
typedef void (*prov_rx_cb_t)(void *user_data, const uint8_t *data,
diff --git a/mesh/node.c b/mesh/node.c
index 3618595b3..21dcfd007 100644
--- a/mesh/node.c
+++ b/mesh/node.c
@@ -2,7 +2,7 @@
*
* BlueZ - Bluetooth protocol stack for Linux
*
- * Copyright (C) 2017-2018 Intel Corporation. All rights reserved.
+ * Copyright (C) 2017-2019 Intel Corporation. All rights reserved.
*
*
* This library is free software; you can redistribute it and/or
@@ -1492,6 +1492,9 @@ static void get_managed_objects_cb(struct l_dbus_message *msg, void *user_data)
&properties);
if (!agent)
goto fail;
+ } else if (!strcmp(MESH_PROVISIONER_INTERFACE,
+ interface)) {
+ node->provisioner = true;
}
}
}
--
2.21.0
Patch-set applied
On Tue, 2019-05-14 at 15:54 -0700, Inga Stotland wrote:
> This patch set ads a sketleton for org.bluez.mesh.Management1 interface.
> Also, adds check for the existence of the provisioning agent for an
> attaching node: this information will be further used to validate
> number of method calls on Management interface
>
> Inga Stotland (2):
> mesh: Add check for org.bluez.mesh.Provisioner1 interface
> mesh: Add skeleton for org.bluez.mesh.Management1 interface
>
> Makefile.mesh | 1 +
> mesh/dbus.c | 12 ++-
> mesh/error.h | 1 +
> mesh/manager.c | 266 +++++++++++++++++++++++++++++++++++++++++++++++++
> mesh/manager.h | 20 ++++
> mesh/mesh.h | 4 +-
> mesh/node.c | 5 +-
> 7 files changed, 303 insertions(+), 6 deletions(-)
> create mode 100644 mesh/manager.c
> create mode 100644 mesh/manager.h
>