#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";
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");
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 */
}
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,
}
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;
+}
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("+");
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;
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("");
.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
};
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) */
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. */
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);