[PATCH BlueZ 2/2] mesh: Add skeleton for org.bluez.mesh.Management1 interface

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux