Mesh: Add HAL interface for Mesh messages 10/240010/1
authorAbhay Agarwal <ay.agarwal@samsung.com>
Thu, 30 Jul 2020 16:56:28 +0000 (22:26 +0530)
committerAbhay Agarwal <ay.agarwal@samsung.com>
Fri, 31 Jul 2020 10:36:11 +0000 (16:06 +0530)
This patch introduces HAL interface which can be used
to send and receive mesh messages which needs to be
encrypted/decrypted using application key.

Change-Id: I19f603781eecb159c6eb2bd834fadbc08b65bd46
Signed-off-by: Abhay Agarwal <ay.agarwal@samsung.com>
bt-oal/bluez_hal/inc/bt-hal-msg.h
bt-oal/bluez_hal/src/bt-hal-mesh-dbus-handler.c
bt-oal/bluez_hal/src/bt-hal-mesh-dbus-handler.h
bt-oal/bluez_hal/src/bt-hal-mesh.c
bt-oal/hardware/bt_mesh.h

index 846a74f..ec39475 100644 (file)
@@ -935,4 +935,15 @@ struct hal_ev_mesh_devkey_message_event {
        int data_len;
        uint8_t data[0];
 } __attribute__((packed));
+
+#define HAL_EV_MESH_MESSAGE_EVENT      0xDD
+struct hal_ev_mesh_message_event {
+       uint8_t net_uuid[16];
+       uint16_t source_addr;
+       uint16_t dest_addr;
+       uint16_t key_idx;
+       int data_len;
+       uint8_t data[0];
+} __attribute__((packed));
+
 #endif //_BT_HAL_MSG_H_
index ab136a7..482e0f3 100644 (file)
@@ -51,6 +51,7 @@
 #define BT_HAL_MESH_ERROR_INTERFACE "org.bluez.mesh.Error"
 
 #define BT_HAL_MESH_MAX_DEVKEY_BUF_SIZE 2048
+#define BT_HAL_MESH_MAX_MSG_BUF_SIZE 2048
 
 static const char *dbus_err_args = "org.freedesktop.DBus.Error.InvalidArgs";
 static const char *dbus_err_fail = "org.freedesktop.DBus.Error.Failed";
@@ -844,6 +845,59 @@ static struct l_dbus_message *__mesh_device_message_received(struct l_dbus *dbus
        return l_dbus_message_new_method_return(msg);
 }
 
+static struct l_dbus_message *__mesh_message_received(struct l_dbus *dbus,
+               struct l_dbus_message *msg, void *user_data)
+{
+       struct l_dbus_message_iter iter;
+       uint16_t src, idx, dst;
+       uint8_t *data;
+       uint32_t n;
+       const char *dbus_path;
+       uint16_t size;
+       uint8_t *net_uuid;
+       dbus_path =  l_dbus_message_get_path(msg);
+       net_uuid = __mesh_get_net_uuid_from_path(dbus_path, true,  MESH_ELEMENT_IFACE);
+       uint8_t buf[BT_HAL_MESH_MAX_MSG_BUF_SIZE];
+       struct hal_ev_mesh_message_event *ev = (void *)buf;
+
+       INFO("Mesh: app path [%s]", dbus_path);
+
+       memset(buf, 0, sizeof(buf));
+       size = (uint16_t) sizeof(*ev);
+       memcpy(ev->net_uuid, net_uuid, 16);
+       g_free(net_uuid);
+
+       if (!l_dbus_message_get_arguments(msg, "qqvay", &src, &idx, &dst,
+                               &iter)) {
+               ERR("Mesh: Cannot parse received message");
+               return l_dbus_message_new_error(msg, dbus_err_args, NULL);
+       }
+
+       if (!l_dbus_message_iter_get_fixed_array(&iter, &data, &n)) {
+               ERR("Mesh: Cannot parse received message: data");
+               return l_dbus_message_new_error(msg, dbus_err_args, NULL);
+       }
+
+       INFO("Mesh: Received mesh message (len %u):", n);
+       ev->source_addr = src;
+       ev->dest_addr = dst;
+       ev->key_idx = idx;
+       ev->data_len = n;
+       memcpy(ev->data, data, n);
+       size += n;
+
+       INFO("Mesh: Src [0x%2.2x]", src);
+       INFO("Mesh: Dst [0x%2.2x]", dst);
+       INFO("Mesh: NetKey Idx [0x%2.2x]", idx);
+       /* Send Message Received event */
+       if (mesh_event_cb) {
+               INFO("Mesh: Send message event");
+               /* TO-DO */
+               mesh_event_cb(HAL_EV_MESH_MESSAGE_EVENT, (void*)buf, size);
+       }
+       return l_dbus_message_new_method_return(msg);
+}
+
 static void __bt_hal_mesh_setup_ele_iface(struct l_dbus_interface *iface)
 {
        INFO("Mesh: Setup element interface properties & methods");
@@ -858,6 +912,9 @@ static void __bt_hal_mesh_setup_ele_iface(struct l_dbus_interface *iface)
        l_dbus_interface_method(iface, "DevKeyMessageReceived", 0,
                        __mesh_device_message_received, "", "qbqay", "source",
                        "remote", "net_index", "data");
+       l_dbus_interface_method(iface, "MessageReceived", 0,
+                       __mesh_message_received, "", "qqvay", "source",
+                       "key_index", "destination", "data");
        /* TODO: Other methods */
 }
 
@@ -2281,6 +2338,22 @@ static void __bt_hal_mesh_key_config_send(
        l_dbus_message_builder_destroy(builder);
 }
 
+static void __bt_hal_mesh_model_execute_message(
+               struct l_dbus_message *msg, void *user_data)
+{
+       struct configuration_request *req = user_data;
+       struct l_dbus_message_builder *builder;
+
+       builder = l_dbus_message_builder_new(msg);
+
+       l_dbus_message_builder_append_basic(builder, 'o', req->ele_path);
+       l_dbus_message_builder_append_basic(builder, 'q', &req->dst);
+       l_dbus_message_builder_append_basic(builder, 'q', &req->idx);
+       __mesh_append_byte_array(builder, req->data, req->len);
+       l_dbus_message_builder_finalize(builder);
+       l_dbus_message_builder_destroy(builder);
+}
+
 bt_status_t _bt_hal_mesh_send_key_config_message(
                bt_uuid_t *network, uint16_t dest,
                        bool is_netkey, bool is_update,
@@ -2372,3 +2445,49 @@ bt_status_t _bt_hal_mesh_send_configuration_message(
        }
        return BT_STATUS_SUCCESS;
 }
+
+bt_status_t _bt_hal_mesh_model_execute_message(
+       bt_uuid_t *network, uint16_t dest,
+       uint16_t appkey_idx, uint8_t *buf, int len)
+{
+       GSList *l;
+       GSList *l1;
+       struct configuration_request *req;
+       meshcfg_app *app;
+       meshcfg_el *elem;
+       int src_elem_idx = 0;
+       l = g_slist_find_custom(mesh_apps, network->uu,
+                       __mesh_compare_network_uuid);
+       if (l) {
+               app = l->data;
+               if (!__bt_mesh_proxy_check(app)) {
+                       ERR("Mesh: Proxy check failed!!");
+                       return BT_STATUS_FAIL;
+               }
+               l1 = g_slist_find_custom(app->elements,
+                               GUINT_TO_POINTER(src_elem_idx),
+                               __compare_element_index);
+               if (!l1)
+                       return BT_STATUS_FAIL;
+               elem = l1->data;
+
+               req = l_new(struct configuration_request, 1);
+               req->ele_path = elem->path;
+               req->dst = dest;
+               req->idx = appkey_idx;
+               req->data = buf;
+               req->len = len;
+               req->rmt = false;
+               req->is_dev_key = false;
+
+               if (!l_dbus_proxy_method_call(app->proxy, "Send",
+                                       __bt_hal_mesh_model_execute_message,
+                                       NULL, (void*)req, l_free))
+                       return BT_STATUS_FAIL;
+       } else {
+               ERR("Mesh: app not found!!");
+               return BT_STATUS_PARM_INVALID;
+
+       }
+       return BT_STATUS_SUCCESS;
+}
index 7e53ac1..bf21e15 100644 (file)
@@ -74,6 +74,9 @@ bt_status_t _bt_hal_mesh_send_configuration_message(bt_uuid_t *network, uint16_t
                bool is_dev_key, uint16_t netkey_idx,
                        uint8_t *buf, int len);
 
+bt_status_t _bt_hal_mesh_model_execute_message(bt_uuid_t *network, uint16_t dest,
+               uint16_t appkey_idx, uint8_t *buf, int len);
+
 bt_status_t _bt_hal_mesh_send_key_config_message(bt_uuid_t *network, uint16_t dest,
                bool is_netkey, bool is_update, uint16_t key_idx, uint16_t netkey_idx);
 
index 3c1bd13..b434dd9 100644 (file)
@@ -149,6 +149,17 @@ static void __bt_hal_handle_devkey_message_received_event(void *buf, uint16_t le
                                        ev->data_len, ev->data);
 }
 
+static void __bt_hal_handle_message_received_event(void *buf, uint16_t len)
+{
+       struct hal_ev_mesh_message_event *ev = buf;
+
+       if (bt_hal_mesh_cbacks->msg_cb)
+               bt_hal_mesh_cbacks->msg_cb((bt_uuid_t*)&ev->net_uuid,
+                       ev->source_addr,
+                               ev->dest_addr, ev->key_idx,
+                                       ev->data_len, ev->data);
+}
+
 static void __bt_hal_handle_mesh_events(int message, void *buf, uint16_t len)
 {
        DBG("+");
@@ -197,6 +208,10 @@ static void __bt_hal_handle_mesh_events(int message, void *buf, uint16_t len)
                DBG("Mesh Event: HAL_EV_MESH_DEVKEY_MESSAGE_EVENT");
                __bt_hal_handle_devkey_message_received_event(buf, len);
                break;
+       case HAL_EV_MESH_MESSAGE_EVENT:
+               DBG("Mesh Event: HAL_EV_MESH_MESSAGE_EVENT");
+               __bt_hal_handle_message_received_event(buf, len);
+               break;
        default:
                DBG("Mesh Event Currently not handled!!");
                break;
@@ -291,6 +306,15 @@ static bt_status_t mesh_key_configuration_message(bt_uuid_t *network,
                        key_idx, netkey_idx);
 }
 
+static bt_status_t mesh_model_execute_message(bt_uuid_t *network,
+               uint16_t dest, uint16_t appkey_idx, uint8_t *buf,
+               int len)
+{
+       DBG("");
+       return _bt_hal_mesh_model_execute_message(network, dest,
+                       appkey_idx, buf, len);
+}
+
 static bt_status_t init(btmesh_callbacks_t *callbacks)
 {
        DBG("");
@@ -337,6 +361,7 @@ static btmesh_interface_t mesh_if = {
        .appkey_execute = mesh_network_appkey_operation,
        .config_send = mesh_send_configuration_message,
        .key_send = mesh_key_configuration_message,
+       .msg_execute = mesh_model_execute_message,
        .cleanup = cleanup
 };
 
index d9e77bc..6c68e1f 100644 (file)
@@ -167,6 +167,10 @@ typedef void (*btmesh_devkey_message_received_callback)(bt_uuid_t *net_uuid,
                uint16_t source_addr, bool is_devkey_remote, uint16_t netkey_idx,
                        uint16_t data_len, uint8_t *data);
 
+typedef void (*btmesh_message_received_callback)(bt_uuid_t *net_uuid,
+               uint16_t source_addr, uint16_t dest_addr, uint16_t key_idx,
+                       uint16_t data_len, uint8_t *data);
+
 /** BT-Mesh callback structure. */
 typedef struct {
        /** set to sizeof(btmesh_callbacks_t) */
@@ -181,6 +185,7 @@ typedef struct {
        btmesh_network_netkey_execute_callback  netkey_execute_cb;
        btmesh_network_appkey_execute_callback  appkey_execute_cb;
        btmesh_devkey_message_received_callback  devkey_msg_cb;
+       btmesh_message_received_callback  msg_cb;
 } btmesh_callbacks_t;
 
 /** Represents the standard BT-MESH interface. */
@@ -212,6 +217,8 @@ typedef struct {
                bool is_dev_key, uint16_t netkey_idx, uint8_t *buf, int len);
        bt_status_t (*key_send)(bt_uuid_t *network, uint16_t dest,
                bool is_netkey, bool is_update, uint16_t key_idx, uint16_t netkey_idx);
+       bt_status_t (*msg_execute)(bt_uuid_t *network, uint16_t dest,
+               uint16_t appkey_idx, uint8_t *buf, int len);
        bt_status_t (*attach)(void);
        /** Closes the interface. */
        void (*cleanup)(void);