mesh: Add skeleton for org.bluez.mesh.Management1 interface
authorInga Stotland <inga.stotland@intel.com>
Tue, 14 May 2019 22:54:07 +0000 (15:54 -0700)
committerAnupam Roy <anupam.r@samsung.com>
Tue, 17 Dec 2019 14:27:13 +0000 (19:57 +0530)
This adds bare-bones imlementation of methods on org.bluez.mesh.Management1
interface.

Change-Id: If6a00b26a5f5732e005f3ba2ca6f1fb2015dee10
Signed-off-by: Anupam Roy <anupam.r@samsung.com>
Makefile.mesh
mesh/dbus.c
mesh/error.h
mesh/manager.c [new file with mode: 0644]
mesh/manager.h [new file with mode: 0644]
mesh/mesh.h

index eaaff20..8713ed6 100644 (file)
@@ -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
index 3b2e2aa..083a7f7 100644 (file)
@@ -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
 #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;
index a6aaa2f..1669c07 100644 (file)
@@ -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 (file)
index 0000000..d990cee
--- /dev/null
@@ -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 (file)
index 0000000..f27ca41
--- /dev/null
@@ -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);
index 9b63500..320a108 100644 (file)
@@ -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"