From 5af54d2c79add5dfb38931525f911865c8c19789 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Micha=C5=82=20Lowas-Rzechonek?= Date: Tue, 26 Nov 2019 15:54:00 +0100 Subject: [PATCH] mesh: Provide destination address in MessageReceived API Change-Id: I90cd462038491612e12a4684871cc305683834f6 Signed-off-by: Abhay Agarwal --- doc/mesh-api.txt | 17 ++++++++++++----- mesh/model.c | 20 ++++++++++++++++---- test/test-join | 8 ++++---- test/test-mesh | 8 ++++---- 4 files changed, 36 insertions(+), 17 deletions(-) diff --git a/doc/mesh-api.txt b/doc/mesh-api.txt index 5edd47c..32890e8 100644 --- a/doc/mesh-api.txt +++ b/doc/mesh-api.txt @@ -784,7 +784,7 @@ Object path Methods: void MessageReceived(uint16 source, uint16 key_index, - boolean subscription, array{byte} data) + variant destination, array{byte} data) This method is called by bluetooth-meshd daemon when a message arrives addressed to the application. @@ -797,10 +797,17 @@ Methods: be used by the application when sending a response to this message (in case a response is expected). - The subscription parameter is a boolean that is set to true if - the message is received as a part of the subscription (i.e., the - destination is either a well known group address or a virtual - label. + The destination parameter contains the destination address of + received message. Underlying variant types are: + + uint16 + + Destination is an unicast address, or a well known + group address + + array{byte} + + Destination is a virtual address label The data parameter is the incoming message. diff --git a/mesh/model.c b/mesh/model.c index f1e1a21..d899f13 100644 --- a/mesh/model.c +++ b/mesh/model.c @@ -823,8 +823,10 @@ static void send_dev_key_msg_rcvd(struct mesh_node *node, uint8_t ele_idx, l_dbus_send(dbus, msg); } -static void send_msg_rcvd(struct mesh_node *node, uint8_t ele_idx, bool is_sub, - uint16_t src, uint16_t app_idx, +static void send_msg_rcvd(struct mesh_node *node, uint8_t ele_idx, + uint16_t src, uint16_t dst, + const struct mesh_virtual *virt, + uint16_t app_idx, uint16_t size, const uint8_t *data) { struct l_dbus *dbus = dbus_get_bus(); @@ -847,7 +849,17 @@ static void send_msg_rcvd(struct mesh_node *node, uint8_t ele_idx, bool is_sub, l_dbus_message_builder_append_basic(builder, 'q', &src); l_dbus_message_builder_append_basic(builder, 'q', &app_idx); - l_dbus_message_builder_append_basic(builder, 'b', &is_sub); + + if (virt) { + l_dbus_message_builder_enter_variant(builder, "ay"); + dbus_append_byte_array(builder, virt->label, + sizeof(virt->label)); + l_dbus_message_builder_leave_variant(builder); + } else { + l_dbus_message_builder_enter_variant(builder, "q"); + l_dbus_message_builder_append_basic(builder, 'q', &dst); + l_dbus_message_builder_leave_variant(builder); + } dbus_append_byte_array(builder, data, size); @@ -986,7 +998,7 @@ bool mesh_model_rx(struct mesh_node *node, bool szmict, uint32_t seq0, */ if (forward.has_dst && !forward.done) { if ((decrypt_idx & APP_IDX_MASK) == decrypt_idx) - send_msg_rcvd(node, i, is_subscription, src, + send_msg_rcvd(node, i, src, dst, decrypt_virt, forward.app_idx, forward.size, forward.data); else if (decrypt_idx == APP_IDX_DEV_REMOTE || diff --git a/test/test-join b/test/test-join index 079f711..fb7b0d6 100644 --- a/test/test-join +++ b/test/test-join @@ -268,10 +268,10 @@ class Element(dbus.service.Object): self.UpdateModelConfiguration(mod_id, config[1]) @dbus.service.method(MESH_ELEMENT_IFACE, - in_signature="qqbay", out_signature="") - def MessageReceived(self, source, key, is_sub, data): - print('Message Received on Element ', end='') - print(self.index) + in_signature="qqvay", out_signature="") + def MessageReceived(self, source, key, destination, data): + print('Message Received on Element %d, src=%04x, dst=%s' % + self.index, source, destination) for model in self.models: model.process_message(source, key, data) diff --git a/test/test-mesh b/test/test-mesh index 3c5ded7..c67bb65 100755 --- a/test/test-mesh +++ b/test/test-mesh @@ -556,10 +556,10 @@ class Element(dbus.service.Object): self.UpdateModelConfiguration(mod_id, config[1]) @dbus.service.method(MESH_ELEMENT_IFACE, - in_signature="qqbay", out_signature="") - def MessageReceived(self, source, key, is_sub, data): - print('Message Received on Element ', end='') - print(self.index) + in_signature="qqvay", out_signature="") + def MessageReceived(self, source, key, destination, data): + print('Message Received on Element %d, src=%04x, dst=%s' % + self.index, source, destination) for model in self.models: model.process_message(source, key, data) -- 2.7.4