summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.mesh1
-rw-r--r--mesh/dbus.c12
-rw-r--r--mesh/error.h1
-rw-r--r--mesh/manager.c266
-rw-r--r--mesh/manager.h20
-rw-r--r--mesh/mesh.h1
6 files changed, 297 insertions, 4 deletions
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"