All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH BlueZ] Mesh: Add basic sensor model
@ 2018-08-08 21:26 Andri Yngvason
  2018-08-10  1:50 ` Stotland, Inga
  0 siblings, 1 reply; 2+ messages in thread
From: Andri Yngvason @ 2018-08-08 21:26 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Andri Yngvason

This is an incomplete implementation of the sensor model. Only "get" and
"status" are supported.
---
 Makefile.tools            |   3 +-
 tools/mesh/sensor-model.c | 252 ++++++++++++++++++++++++++++++++++++++
 tools/mesh/sensor-model.h |  37 ++++++
 tools/meshctl.c           |   4 +
 4 files changed, 295 insertions(+), 1 deletion(-)
 create mode 100644 tools/mesh/sensor-model.c
 create mode 100644 tools/mesh/sensor-model.h

diff --git a/Makefile.tools b/Makefile.tools
index f81fd0a4c..76e37fc0d 100644
--- a/Makefile.tools
+++ b/Makefile.tools
@@ -308,7 +308,8 @@ tools_meshctl_SOURCES = tools/meshctl.c \
 				tools/mesh/prov-db.h tools/mesh/prov-db.c \
 				tools/mesh/config-model.h tools/mesh/config-client.c \
 				tools/mesh/config-server.c \
-				tools/mesh/onoff-model.h tools/mesh/onoff-model.c
+				tools/mesh/onoff-model.h tools/mesh/onoff-model.c \
+				tools/mesh/sensor-model.h tools/mesh/sensor-model.c
 tools_meshctl_LDADD = gdbus/libgdbus-internal.la src/libshared-glib.la \
 				lib/libbluetooth-internal.la \
 				@GLIB_LIBS@ @DBUS_LIBS@ -ljson-c -lreadline
diff --git a/tools/mesh/sensor-model.c b/tools/mesh/sensor-model.c
new file mode 100644
index 000000000..cbc6c7806
--- /dev/null
+++ b/tools/mesh/sensor-model.c
@@ -0,0 +1,252 @@
+/*
+ *
+ *  BlueZ - Bluetooth protocol stack for Linux
+ *
+ *  Copyright (C) 2017  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2018  Andri Yngvason <andri@yngvason.is>
+ *
+ *
+ *  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.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this library; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <inttypes.h>
+#include <glib.h>
+
+#include "src/shared/shell.h"
+#include "src/shared/util.h"
+#include "tools/mesh/mesh-net.h"
+#include "tools/mesh/node.h"
+#include "tools/mesh/net.h"
+#include "tools/mesh/util.h"
+#include "tools/mesh/sensor-model.h"
+
+static uint16_t sensor_app_idx = APP_IDX_INVALID;
+
+static int client_bind(uint16_t app_idx, int action)
+{
+	if (action == ACTION_ADD) {
+		if (sensor_app_idx != APP_IDX_INVALID)
+			return MESH_STATUS_INSUFF_RESOURCES;
+
+		sensor_app_idx = app_idx;
+		bt_shell_printf("Sensor client model: new binding %4.4x\n",
+				app_idx);
+	} else {
+		if (sensor_app_idx == app_idx)
+			sensor_app_idx = APP_IDX_INVALID;
+	}
+
+	return MESH_STATUS_SUCCESS;
+}
+
+static ssize_t decode_tlv_head(uint16_t *property_id, size_t *value_index,
+			       const void *data, size_t max_size)
+{
+	ssize_t len;
+
+	if (max_size == 0)
+		return -1;
+
+	const uint8_t *b = data;
+
+	if (b[0] & 1) {
+		if (max_size < 3)
+			return -1;
+
+		len = b[0] >> 1;
+		*property_id = b[1] | b[2] << 8;
+		*value_index = 3;
+
+	} else {
+		if (max_size < 2)
+			return -1;
+
+		len = (b[0] >> 1) & 7;
+		*property_id = b[0] >> 4 | b[1];
+		*value_index = 2;
+	}
+
+	return len;
+}
+
+/* TODO: The sensor value size, signedness and multiplier should be based on the
+ * propery id.
+ */
+static int32_t convert_sensor_value(const void *data, size_t len)
+{
+	const uint8_t *b = data;
+
+	switch (len) {
+	case 1: return (int8_t)b[0];
+	case 2: return (int16_t)(b[0] | b[1] << 8);
+	case 4: return (int32_t)(b[0] | b[1] << 8 | b[2] << 16 | b[3] << 24);
+	}
+
+	return 0;
+}
+
+static void interpret_sensor_status(const void *data, size_t size)
+{
+	ssize_t len;
+	size_t i;
+	size_t value_index = 0;
+
+	const uint8_t *b = data;
+
+	for (i = 0; i < size; i += len + value_index) {
+		uint16_t property_id = 0;
+
+		len = decode_tlv_head(&property_id, &value_index, &b[i],
+				      size - i);
+		if (len < 0)
+			return;
+
+		const char *property_name = bt_uuid16_to_str(property_id);
+		int32_t value = convert_sensor_value(&b[i + value_index], len);
+
+		if (property_name)
+			bt_shell_printf("%s: %" PRIi32 "\n", property_name,
+					value);
+		else
+			bt_shell_printf("%x: %" PRIi32 "\n", property_id,
+					value);
+	}
+}
+
+static bool client_msg_received(uint16_t src, uint8_t *data, uint16_t len,
+				void *userdata)
+{
+	uint32_t opcode;
+	int n;
+
+	if (!mesh_opcode_get(data, len, &opcode, &n))
+		return false;
+
+	len -= n;
+	data += n;
+
+	bt_shell_printf("Sensor Model Message received (%d) opcode %x\n",
+			len, opcode);
+
+	print_byte_array("\t", data, len);
+
+	switch (opcode & ~OP_UNRELIABLE) {
+	default:
+		return false;
+
+	case OP_SENSOR_STATUS:
+		bt_shell_printf("Node %4.4x:\n", src);
+		interpret_sensor_status(data, len);
+		break;
+	}
+
+	return true;
+}
+
+static uint32_t target;
+
+static bool send_cmd(uint8_t *buf, uint16_t len)
+{
+	struct mesh_node *node = node_get_local_node();
+	uint8_t ttl;
+
+	if (!node)
+		return false;
+
+	ttl = node_get_default_ttl(node);
+
+	return net_access_layer_send(ttl, node_get_primary(node),
+				     target, sensor_app_idx, buf, len);
+}
+
+static void cmd_set_node(int argc, char *argv[])
+{
+	uint32_t dst;
+	char *end;
+
+	dst = strtol(argv[1], &end, 16);
+	if (end != (argv[1] + 4)) {
+		bt_shell_printf("Bad unicast address %s: expected format 4 digit hex\n",
+				argv[1]);
+		target = UNASSIGNED_ADDRESS;
+		return bt_shell_noninteractive_quit(EXIT_FAILURE);
+	} else {
+		bt_shell_printf("Controlling sensor for node %4.4x\n", dst);
+		target = dst;
+		set_menu_prompt("sensor", argv[1]);
+		return bt_shell_noninteractive_quit(EXIT_SUCCESS);
+	}
+}
+
+/* TODO: Requesting a specific profile id is not supported.
+ */
+static void cmd_get(int argc, char *argv[])
+{
+	uint16_t n;
+	uint8_t msg[32];
+	struct mesh_node *node;
+
+	if (IS_UNASSIGNED(target)) {
+		bt_shell_printf("Destination not set\n");
+		return bt_shell_noninteractive_quit(EXIT_FAILURE);
+	}
+
+	node = node_find_by_addr(target);
+
+	if (!node)
+		return;
+
+	n = mesh_opcode_set(OP_SENSOR_GET, msg);
+
+	if (!send_cmd(msg, n)) {
+		bt_shell_printf("Failed to send \"SENSOR GET\"\n");
+		return bt_shell_noninteractive_quit(EXIT_FAILURE);
+	}
+
+	return bt_shell_noninteractive_quit(EXIT_SUCCESS);
+}
+
+static const struct bt_shell_menu sensor_menu = {
+	.name = "sensor",
+	.desc = "Sensor Model Submenu",
+	.entries = {
+		{ "target", "<unicast>", cmd_set_node, "Set node to configure" },
+		{ "get", NULL, cmd_get, "Get sensor status" },
+		{ }
+	},
+};
+
+static struct mesh_model_ops client_cbs = {
+	client_msg_received,
+	client_bind,
+	NULL,
+	NULL,
+};
+
+bool sensor_client_init(uint8_t element)
+{
+	if (!node_local_model_register(element, SENSOR_CLIENT_MODEL_ID,
+				       &client_cbs, NULL))
+		return false;
+
+	bt_shell_add_submenu(&sensor_menu);
+
+	return true;
+}
diff --git a/tools/mesh/sensor-model.h b/tools/mesh/sensor-model.h
new file mode 100644
index 000000000..984dcdc43
--- /dev/null
+++ b/tools/mesh/sensor-model.h
@@ -0,0 +1,37 @@
+/*
+ *
+ *  BlueZ - Bluetooth protocol stack for Linux
+ *
+ *  Copyright (C) 2018  Andri Yngvason <andri@yngvason.is>
+ *
+ *
+ *  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.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this library; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#define SENSOR_SERVER_MODEL_ID 0x1100
+#define SENSOR_CLIENT_MODEL_ID 0x1102
+
+#define OP_SENSOR_DESCRIPTOR_GET 0x8230
+#define OP_SENSOR_DESCRIPTOR_STATUS 0x51
+#define OP_SENSOR_GET 0x8231
+#define OP_SENSOR_STATUS 0x52
+#define OP_SENSOR_COLUMN_GET 0x8232
+#define OP_SENSOR_COLUMN_STATUS 0x53
+#define OP_SENSOR_SERIES_GET 0x8233
+#define OP_SENSOR_SERIES_STATUS 0x54
+
+void sensor_set_node(const char *args);
+bool sensor_client_init(uint8_t element);
diff --git a/tools/meshctl.c b/tools/meshctl.c
index 3e1484f61..08bba9a13 100644
--- a/tools/meshctl.c
+++ b/tools/meshctl.c
@@ -58,6 +58,7 @@
 #include "mesh/prov-db.h"
 #include "mesh/config-model.h"
 #include "mesh/onoff-model.h"
+#include "mesh/sensor-model.h"
 
 /* String display constants */
 #define COLORED_NEW	COLOR_GREEN "NEW" COLOR_OFF
@@ -1990,6 +1991,9 @@ int main(int argc, char *argv[])
 	if (!onoff_client_init(PRIMARY_ELEMENT_IDX))
 		g_printerr("Failed to initialize mesh generic On/Off client\n");
 
+	if (!sensor_client_init(PRIMARY_ELEMENT_IDX))
+		g_printerr("Failed to initialize mesh sensor client\n");
+
 	status = bt_shell_run();
 
 	g_dbus_client_unref(client);
-- 
2.18.0


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH BlueZ] Mesh: Add basic sensor model
  2018-08-08 21:26 [PATCH BlueZ] Mesh: Add basic sensor model Andri Yngvason
@ 2018-08-10  1:50 ` Stotland, Inga
  0 siblings, 0 replies; 2+ messages in thread
From: Stotland, Inga @ 2018-08-10  1:50 UTC (permalink / raw)
  To: andri, linux-bluetooth

SGkgQW5kcmksDQoNCk9uIFdlZCwgMjAxOC0wOC0wOCBhdCAyMToyNiArMDAwMCwgQW5kcmkgWW5n
dmFzb24gd3JvdGU6DQo+IFRoaXMgaXMgYW4gaW5jb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0
aGUgc2Vuc29yIG1vZGVsLiBPbmx5ICJnZXQiIGFuZA0KPiAic3RhdHVzIiBhcmUgc3VwcG9ydGVk
Lg0KPiAtLS0NCj4gIE1ha2VmaWxlLnRvb2xzICAgICAgICAgICAgfCAgIDMgKy0NCj4gIHRvb2xz
L21lc2gvc2Vuc29yLW1vZGVsLmMgfCAyNTIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr
KysrKysrKysNCj4gIHRvb2xzL21lc2gvc2Vuc29yLW1vZGVsLmggfCAgMzcgKysrKysrDQo+ICB0
b29scy9tZXNoY3RsLmMgICAgICAgICAgIHwgICA0ICsNCj4gIDQgZmlsZXMgY2hhbmdlZCwgMjk1
IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkNCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCB0b29s
cy9tZXNoL3NlbnNvci1tb2RlbC5jDQo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgdG9vbHMvbWVzaC9z
ZW5zb3ItbW9kZWwuaA0KPiANCj4gZGlmZiAtLWdpdCBhL01ha2VmaWxlLnRvb2xzIGIvTWFrZWZp
bGUudG9vbHMNCj4gaW5kZXggZjgxZmQwYTRjLi43NmUzN2ZjMGQgMTAwNjQ0DQo+IC0tLSBhL01h
a2VmaWxlLnRvb2xzDQo+ICsrKyBiL01ha2VmaWxlLnRvb2xzDQo+IEBAIC0zMDgsNyArMzA4LDgg
QEAgdG9vbHNfbWVzaGN0bF9TT1VSQ0VTID0gdG9vbHMvbWVzaGN0bC5jIFwNCj4gIAkJCQl0b29s
cy9tZXNoL3Byb3YtZGIuaCB0b29scy9tZXNoL3Byb3YtZGIuYyBcDQo+ICAJCQkJdG9vbHMvbWVz
aC9jb25maWctbW9kZWwuaCB0b29scy9tZXNoL2NvbmZpZy1jbGllbnQuYyBcDQo+ICAJCQkJdG9v
bHMvbWVzaC9jb25maWctc2VydmVyLmMgXA0KPiAtCQkJCXRvb2xzL21lc2gvb25vZmYtbW9kZWwu
aCB0b29scy9tZXNoL29ub2ZmLW1vZGVsLmMNCj4gKwkJCQl0b29scy9tZXNoL29ub2ZmLW1vZGVs
LmggdG9vbHMvbWVzaC9vbm9mZi1tb2RlbC5jIFwNCj4gKwkJCQl0b29scy9tZXNoL3NlbnNvci1t
b2RlbC5oIHRvb2xzL21lc2gvc2Vuc29yLW1vZGVsLmMNCj4gIHRvb2xzX21lc2hjdGxfTERBREQg
PSBnZGJ1cy9saWJnZGJ1cy1pbnRlcm5hbC5sYSBzcmMvbGlic2hhcmVkLWdsaWIubGEgXA0KPiAg
CQkJCWxpYi9saWJibHVldG9vdGgtaW50ZXJuYWwubGEgXA0KPiAgCQkJCUBHTElCX0xJQlNAIEBE
QlVTX0xJQlNAIC1sanNvbi1jIC1scmVhZGxpbmUNCj4gZGlmZiAtLWdpdCBhL3Rvb2xzL21lc2gv
c2Vuc29yLW1vZGVsLmMgYi90b29scy9tZXNoL3NlbnNvci1tb2RlbC5jDQo+IG5ldyBmaWxlIG1v
ZGUgMTAwNjQ0DQo+IGluZGV4IDAwMDAwMDAwMC4uY2JjNmM3ODA2DQo+IC0tLSAvZGV2L251bGwN
Cj4gKysrIGIvdG9vbHMvbWVzaC9zZW5zb3ItbW9kZWwuYw0KPiBAQCAtMCwwICsxLDI1MiBAQA0K
PiArLyoNCj4gKyAqDQo+ICsgKiAgQmx1ZVogLSBCbHVldG9vdGggcHJvdG9jb2wgc3RhY2sgZm9y
IExpbnV4DQo+ICsgKg0KPiArICogIENvcHlyaWdodCAoQykgMjAxNyAgSW50ZWwgQ29ycG9yYXRp
b24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQo+ICsgKiAgQ29weXJpZ2h0IChDKSAyMDE4ICBBbmRy
aSBZbmd2YXNvbiA8YW5kcmlAeW5ndmFzb24uaXM+DQo+ICsgKg0KPiArICoNCj4gKyAqICBUaGlz
IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y
DQo+ICsgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5l
cmFsIFB1YmxpYw0KPiArICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcg0KPiArICogIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KPiArICoNCj4gKyAqICBU
aGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz
ZWZ1bCwNCj4gKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZg0KPiArICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQo+ICsgKiAgTGVzc2VyIEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCj4gKyAqDQo+ICsgKiAgWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1Ymxp
Yw0KPiArICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUg
dG8gdGhlIEZyZWUgU29mdHdhcmUNCj4gKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xp
biBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQ0KPiArICoNCj4g
KyAqLw0KPiArDQo+ICsjaW5jbHVkZSA8c3RkaW8uaD4NCj4gKyNpbmNsdWRlIDx1bmlzdGQuaD4N
Cj4gKyNpbmNsdWRlIDxzdGRib29sLmg+DQo+ICsjaW5jbHVkZSA8c3RkaW50Lmg+DQo+ICsjaW5j
bHVkZSA8aW50dHlwZXMuaD4NCj4gKyNpbmNsdWRlIDxnbGliLmg+DQo+ICsNCj4gKyNpbmNsdWRl
ICJzcmMvc2hhcmVkL3NoZWxsLmgiDQo+ICsjaW5jbHVkZSAic3JjL3NoYXJlZC91dGlsLmgiDQo+
ICsjaW5jbHVkZSAidG9vbHMvbWVzaC9tZXNoLW5ldC5oIg0KPiArI2luY2x1ZGUgInRvb2xzL21l
c2gvbm9kZS5oIg0KPiArI2luY2x1ZGUgInRvb2xzL21lc2gvbmV0LmgiDQo+ICsjaW5jbHVkZSAi
dG9vbHMvbWVzaC91dGlsLmgiDQo+ICsjaW5jbHVkZSAidG9vbHMvbWVzaC9zZW5zb3ItbW9kZWwu
aCINCj4gKw0KPiArc3RhdGljIHVpbnQxNl90IHNlbnNvcl9hcHBfaWR4ID0gQVBQX0lEWF9JTlZB
TElEOw0KPiArDQo+ICtzdGF0aWMgaW50IGNsaWVudF9iaW5kKHVpbnQxNl90IGFwcF9pZHgsIGlu
dCBhY3Rpb24pDQo+ICt7DQo+ICsJaWYgKGFjdGlvbiA9PSBBQ1RJT05fQUREKSB7DQo+ICsJCWlm
IChzZW5zb3JfYXBwX2lkeCAhPSBBUFBfSURYX0lOVkFMSUQpDQo+ICsJCQlyZXR1cm4gTUVTSF9T
VEFUVVNfSU5TVUZGX1JFU09VUkNFUzsNCj4gKw0KPiArCQlzZW5zb3JfYXBwX2lkeCA9IGFwcF9p
ZHg7DQo+ICsJCWJ0X3NoZWxsX3ByaW50ZigiU2Vuc29yIGNsaWVudCBtb2RlbDogbmV3IGJpbmRp
bmcgJTQuNHhcbiIsDQo+ICsJCQkJYXBwX2lkeCk7DQo+ICsJfSBlbHNlIHsNCj4gKwkJaWYgKHNl
bnNvcl9hcHBfaWR4ID09IGFwcF9pZHgpDQo+ICsJCQlzZW5zb3JfYXBwX2lkeCA9IEFQUF9JRFhf
SU5WQUxJRDsNCj4gKwl9DQo+ICsNCj4gKwlyZXR1cm4gTUVTSF9TVEFUVVNfU1VDQ0VTUzsNCj4g
K30NCj4gKw0KPiArc3RhdGljIHNzaXplX3QgZGVjb2RlX3Rsdl9oZWFkKHVpbnQxNl90ICpwcm9w
ZXJ0eV9pZCwgc2l6ZV90ICp2YWx1ZV9pbmRleCwNCj4gKwkJCSAgICAgICBjb25zdCB2b2lkICpk
YXRhLCBzaXplX3QgbWF4X3NpemUpDQoNCndoaXRlc3BhY2VzLT50YWJzDQoNCj4gK3sNCj4gKwlz
c2l6ZV90IGxlbjsNCj4gKw0KPiArCWlmIChtYXhfc2l6ZSA9PSAwKQ0KPiArCQlyZXR1cm4gLTE7
DQo+ICsNCj4gKwljb25zdCB1aW50OF90ICpiID0gZGF0YTsNCg0KUGxlYXNlIG1vdmUgdGhpcyB0
byB0aGUgYmVnaW5ubmcgb2YgdGhlIGZ1Y3Rpb24sIGluIHRvIHRoZSBkZWNsYXJhdGlvbnMNCnNw
YWNlLiANCmdjYyAodiA3LjMuMSkgZ2l2ZXMgdGhpcyBlcnJvcjogIklTTyBDOTAgZm9yYmlkcyBt
aXhlZCBkZWNsYXJhdGlvbnMgYW5kDQpjb2RlIg0KUGxlYXNlIG1ha2Ugc3VyZSB5b3UgY29tcGls
ZSB3aXRoIHJlbGF0aXZlbHkgcmVjZW50IGNvbXBpbGVyIHRvIGdldCByaWQNCm9mIGVycm9ycyBh
bmQgd2FybmluZ3MuDQoNCj4gKw0KPiArCWlmIChiWzBdICYgMSkgew0KDQpQbGVhc2UgaW5zZXJ0
IGEgbGluZSBicmVhaw0KDQo+ICsJCWlmIChtYXhfc2l6ZSA8IDMpDQo+ICsJCQlyZXR1cm4gLTE7
DQo+ICsNCj4gKwkJbGVuID0gYlswXSA+PiAxOw0KPiArCQkqcHJvcGVydHlfaWQgPSBiWzFdIHwg
YlsyXSA8PCA4Ow0KPiArCQkqdmFsdWVfaW5kZXggPSAzOw0KPiArDQo+ICsJfSBlbHNlIHsNCg0K
cGxlYXNlIGluc2VydCBhbiBlbXB0eSBsaW5lDQoNCj4gKwkJaWYgKG1heF9zaXplIDwgMikNCj4g
KwkJCXJldHVybiAtMTsNCj4gKw0KPiArCQlsZW4gPSAoYlswXSA+PiAxKSAmIDc7DQo+ICsJCSpw
cm9wZXJ0eV9pZCA9IGJbMF0gPj4gNCB8IGJbMV07DQo+ICsJCSp2YWx1ZV9pbmRleCA9IDI7DQo+
ICsJfQ0KPiArDQo+ICsJcmV0dXJuIGxlbjsNCj4gK30NCj4gKw0KPiArLyogVE9ETzogVGhlIHNl
bnNvciB2YWx1ZSBzaXplLCBzaWduZWRuZXNzIGFuZCBtdWx0aXBsaWVyIHNob3VsZCBiZSBiYXNl
ZCBvbiB0aGUNCg0KRnJvbSBibHVlei9kb2MvY29kaW5nLXN0eWxlLnR4dDogIklmIHlvdXIgY29t
bWVudCBoYXMgbW9yZSB0aGFuIG9uZQ0KbGluZSwgcGxlYXNlIHN0YXJ0IGl0IGZyb20gdGhlIHNl
Y29uZCBsaW5lLiINCg0KPiArICogcHJvcGVyeSBpZC4NCg0KcHJvcGVyeS0+cHJvcGVydHkNCg0K
PiArICovDQo+ICtzdGF0aWMgaW50MzJfdCBjb252ZXJ0X3NlbnNvcl92YWx1ZShjb25zdCB2b2lk
ICpkYXRhLCBzaXplX3QgbGVuKQ0KPiArew0KPiArCWNvbnN0IHVpbnQ4X3QgKmIgPSBkYXRhOw0K
PiArDQo+ICsJc3dpdGNoIChsZW4pIHsNCj4gKwljYXNlIDE6IHJldHVybiAoaW50OF90KWJbMF07
DQo+ICsJY2FzZSAyOiByZXR1cm4gKGludDE2X3QpKGJbMF0gfCBiWzFdIDw8IDgpOw0KPiArCWNh
c2UgNDogcmV0dXJuIChpbnQzMl90KShiWzBdIHwgYlsxXSA8PCA4IHwgYlsyXSA8PCAxNiB8IGJb
M10gPDwgMjQpOw0KDQpUaGlzIHR5cGVjYXN0aW5nIGxvb2tzIHVubmVjZXNzYXJ5DQoNCj4gKwl9
DQo+ICsNCj4gKwlyZXR1cm4gMDsNCj4gK30NCj4gKw0KPiArc3RhdGljIHZvaWQgaW50ZXJwcmV0
X3NlbnNvcl9zdGF0dXMoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpDQo+ICt7DQo+ICsJ
c3NpemVfdCBsZW47DQo+ICsJc2l6ZV90IGk7DQo+ICsJc2l6ZV90IHZhbHVlX2luZGV4ID0gMDsN
Cj4gKw0KDQpQbGVhc2UgcmVtb3ZlIGFuIGV4dHJhIGVtcHR5IGxpbmUNCg0KPiArCWNvbnN0IHVp
bnQ4X3QgKmIgPSBkYXRhOw0KPiArDQo+ICsJZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gbGVu
ICsgdmFsdWVfaW5kZXgpIHsNCj4gKwkJdWludDE2X3QgcHJvcGVydHlfaWQgPSAwOw0KPiArDQo+
ICsJCWxlbiA9IGRlY29kZV90bHZfaGVhZCgmcHJvcGVydHlfaWQsICZ2YWx1ZV9pbmRleCwgJmJb
aV0sDQo+ICsJCQkJICAgICAgc2l6ZSAtIGkpOw0KPiArCQlpZiAobGVuIDwgMCkNCj4gKwkJCXJl
dHVybjsNCj4gKw0KDQpZb3UnZCBhbHNvIHdhbnQgdG8gY2hlY2sgaWYgdGhlIGRhdGEgYnVmZmVy
IGlzIGxvbmcgZW5vdWdoIHRvDQphY2NvbW9kYXRlICJsZW4iIGJ5dGVzDQoNCj4gKwkJY29uc3Qg
Y2hhciAqcHJvcGVydHlfbmFtZSA9IGJ0X3V1aWQxNl90b19zdHIocHJvcGVydHlfaWQpOw0KPiAr
CQlpbnQzMl90IHZhbHVlID0gY29udmVydF9zZW5zb3JfdmFsdWUoJmJbaSArIHZhbHVlX2luZGV4
XSwgbGVuKTsNCg0KUGxlYXNlIG1vdmUgZGVjbGFyYXRpb25zIHRvIHRoZSBzdGFydCBvZiAiZm9y
IiBsb29wLiBJbml0aWFsaXNlIGxhdGVyLg0KDQo+ICsNCj4gKwkJaWYgKHByb3BlcnR5X25hbWUp
DQo+ICsJCQlidF9zaGVsbF9wcmludGYoIiVzOiAlIiBQUklpMzIgIlxuIiwgcHJvcGVydHlfbmFt
ZSwNCj4gKwkJCQkJdmFsdWUpOw0KPiArCQllbHNlDQo+ICsJCQlidF9zaGVsbF9wcmludGYoIiV4
OiAlIiBQUklpMzIgIlxuIiwgcHJvcGVydHlfaWQsDQo+ICsJCQkJCXZhbHVlKTsNCj4gKwl9DQo+
ICt9DQo+ICsNCj4gK3N0YXRpYyBib29sIGNsaWVudF9tc2dfcmVjZWl2ZWQodWludDE2X3Qgc3Jj
LCB1aW50OF90ICpkYXRhLCB1aW50MTZfdCBsZW4sDQo+ICsJCQkJdm9pZCAqdXNlcmRhdGEpDQo+
ICt7DQo+ICsJdWludDMyX3Qgb3Bjb2RlOw0KPiArCWludCBuOw0KPiArDQo+ICsJaWYgKCFtZXNo
X29wY29kZV9nZXQoZGF0YSwgbGVuLCAmb3Bjb2RlLCAmbikpDQo+ICsJCXJldHVybiBmYWxzZTsN
Cj4gKw0KPiArCWxlbiAtPSBuOw0KPiArCWRhdGEgKz0gbjsNCj4gKw0KPiArCWJ0X3NoZWxsX3By
aW50ZigiU2Vuc29yIE1vZGVsIE1lc3NhZ2UgcmVjZWl2ZWQgKCVkKSBvcGNvZGUgJXhcbiIsDQo+
ICsJCQlsZW4sIG9wY29kZSk7DQo+ICsNCj4gKwlwcmludF9ieXRlX2FycmF5KCJcdCIsIGRhdGEs
IGxlbik7DQo+ICsNCj4gKwlzd2l0Y2ggKG9wY29kZSAmIH5PUF9VTlJFTElBQkxFKSB7DQo+ICsJ
ZGVmYXVsdDoNCj4gKwkJcmV0dXJuIGZhbHNlOw0KPiArDQo+ICsJY2FzZSBPUF9TRU5TT1JfU1RB
VFVTOg0KPiArCQlidF9zaGVsbF9wcmludGYoIk5vZGUgJTQuNHg6XG4iLCBzcmMpOw0KPiArCQlp
bnRlcnByZXRfc2Vuc29yX3N0YXR1cyhkYXRhLCBsZW4pOw0KPiArCQlicmVhazsNCj4gKwl9DQo+
ICsNCj4gKwlyZXR1cm4gdHJ1ZTsNCj4gK30NCj4gKw0KPiArc3RhdGljIHVpbnQzMl90IHRhcmdl
dDsNCj4gKw0KPiArc3RhdGljIGJvb2wgc2VuZF9jbWQodWludDhfdCAqYnVmLCB1aW50MTZfdCBs
ZW4pDQo+ICt7DQo+ICsJc3RydWN0IG1lc2hfbm9kZSAqbm9kZSA9IG5vZGVfZ2V0X2xvY2FsX25v
ZGUoKTsNCj4gKwl1aW50OF90IHR0bDsNCj4gKw0KPiArCWlmICghbm9kZSkNCj4gKwkJcmV0dXJu
IGZhbHNlOw0KPiArDQo+ICsJdHRsID0gbm9kZV9nZXRfZGVmYXVsdF90dGwobm9kZSk7DQo+ICsN
Cj4gKwlyZXR1cm4gbmV0X2FjY2Vzc19sYXllcl9zZW5kKHR0bCwgbm9kZV9nZXRfcHJpbWFyeShu
b2RlKSwNCj4gKwkJCQkgICAgIHRhcmdldCwgc2Vuc29yX2FwcF9pZHgsIGJ1ZiwgbGVuKTsNCg0K
d2hpdGVzcGFjZXMtPnRhYnMNCg0KPiArfQ0KPiArDQo+ICtzdGF0aWMgdm9pZCBjbWRfc2V0X25v
ZGUoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkNCj4gK3sNCj4gKwl1aW50MzJfdCBkc3Q7DQo+ICsJ
Y2hhciAqZW5kOw0KPiArDQo+ICsJZHN0ID0gc3RydG9sKGFyZ3ZbMV0sICZlbmQsIDE2KTsNCg0K
SW5zZXJ0IGVtcHR5IGxpbmUNCg0KPiArCWlmIChlbmQgIT0gKGFyZ3ZbMV0gKyA0KSkgew0KPiAr
CQlidF9zaGVsbF9wcmludGYoIkJhZCB1bmljYXN0IGFkZHJlc3MgJXM6IGV4cGVjdGVkIGZvcm1h
dCA0IGRpZ2l0IGhleFxuIiwNCg0KTGluZSBvdmVyIDgwIGNoYXJhY3RlcnMNCg0KPiArCQkJCWFy
Z3ZbMV0pOw0KPiArCQl0YXJnZXQgPSBVTkFTU0lHTkVEX0FERFJFU1M7DQo+ICsJCXJldHVybiBi
dF9zaGVsbF9ub25pbnRlcmFjdGl2ZV9xdWl0KEVYSVRfRkFJTFVSRSk7DQo+ICsJfSBlbHNlIHsN
Cg0KRWxzZSBpcyBub3QgbmVlZGVkIGFmdGVyIHJldHVybiBpbiAiaWYiIGNsYXVzZSBhYm92ZQ0K
DQo+ICsJCWJ0X3NoZWxsX3ByaW50ZigiQ29udHJvbGxpbmcgc2Vuc29yIGZvciBub2RlICU0LjR4
XG4iLCBkc3QpOw0KPiArCQl0YXJnZXQgPSBkc3Q7DQo+ICsJCXNldF9tZW51X3Byb21wdCgic2Vu
c29yIiwgYXJndlsxXSk7DQo+ICsJCXJldHVybiBidF9zaGVsbF9ub25pbnRlcmFjdGl2ZV9xdWl0
KEVYSVRfU1VDQ0VTUyk7DQo+ICsJfQ0KPiArfQ0KPiArDQo+ICsvKiBUT0RPOiBSZXF1ZXN0aW5n
IGEgc3BlY2lmaWMgcHJvZmlsZSBpZCBpcyBub3Qgc3VwcG9ydGVkLg0KPiArICovDQoNClBsZWFz
ZSBtYWtlIHRoaXMgYSBvbmUtbGluZSBjb21tZW50DQoNCj4gK3N0YXRpYyB2b2lkIGNtZF9nZXQo
aW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkNCj4gK3sNCj4gKwl1aW50MTZfdCBuOw0KPiArCXVpbnQ4
X3QgbXNnWzMyXTsNCj4gKwlzdHJ1Y3QgbWVzaF9ub2RlICpub2RlOw0KPiArDQo+ICsJaWYgKElT
X1VOQVNTSUdORUQodGFyZ2V0KSkgew0KPiArCQlidF9zaGVsbF9wcmludGYoIkRlc3RpbmF0aW9u
IG5vdCBzZXRcbiIpOw0KPiArCQlyZXR1cm4gYnRfc2hlbGxfbm9uaW50ZXJhY3RpdmVfcXVpdChF
WElUX0ZBSUxVUkUpOw0KPiArCX0NCj4gKw0KPiArCW5vZGUgPSBub2RlX2ZpbmRfYnlfYWRkcih0
YXJnZXQpOw0KPiArDQo+ICsJaWYgKCFub2RlKQ0KPiArCQlyZXR1cm47DQo+ICsNCj4gKwluID0g
bWVzaF9vcGNvZGVfc2V0KE9QX1NFTlNPUl9HRVQsIG1zZyk7DQo+ICsNCj4gKwlpZiAoIXNlbmRf
Y21kKG1zZywgbikpIHsNCj4gKwkJYnRfc2hlbGxfcHJpbnRmKCJGYWlsZWQgdG8gc2VuZCBcIlNF
TlNPUiBHRVRcIlxuIik7DQo+ICsJCXJldHVybiBidF9zaGVsbF9ub25pbnRlcmFjdGl2ZV9xdWl0
KEVYSVRfRkFJTFVSRSk7DQo+ICsJfQ0KPiArDQo+ICsJcmV0dXJuIGJ0X3NoZWxsX25vbmludGVy
YWN0aXZlX3F1aXQoRVhJVF9TVUNDRVNTKTsNCj4gK30NCj4gKw0KPiArc3RhdGljIGNvbnN0IHN0
cnVjdCBidF9zaGVsbF9tZW51IHNlbnNvcl9tZW51ID0gew0KPiArCS5uYW1lID0gInNlbnNvciIs
DQo+ICsJLmRlc2MgPSAiU2Vuc29yIE1vZGVsIFN1Ym1lbnUiLA0KPiArCS5lbnRyaWVzID0gew0K
PiArCQl7ICJ0YXJnZXQiLCAiPHVuaWNhc3Q+IiwgY21kX3NldF9ub2RlLCAiU2V0IG5vZGUgdG8g
Y29uZmlndXJlIiB9LA0KDQpMaW5lIG92ZXIgODAgY2hhcmFjdGVycw0KDQo+ICsJCXsgImdldCIs
IE5VTEwsIGNtZF9nZXQsICJHZXQgc2Vuc29yIHN0YXR1cyIgfSwNCj4gKwkJeyB9DQo+ICsJfSwN
Cj4gK307DQo+ICsNCj4gK3N0YXRpYyBzdHJ1Y3QgbWVzaF9tb2RlbF9vcHMgY2xpZW50X2NicyA9
IHsNCj4gKwljbGllbnRfbXNnX3JlY2VpdmVkLA0KPiArCWNsaWVudF9iaW5kLA0KPiArCU5VTEws
DQo+ICsJTlVMTCwNCj4gK307DQo+ICsNCj4gK2Jvb2wgc2Vuc29yX2NsaWVudF9pbml0KHVpbnQ4
X3QgZWxlbWVudCkNCj4gK3sNCj4gKwlpZiAoIW5vZGVfbG9jYWxfbW9kZWxfcmVnaXN0ZXIoZWxl
bWVudCwgU0VOU09SX0NMSUVOVF9NT0RFTF9JRCwNCj4gKwkJCQkgICAgICAgJmNsaWVudF9jYnMs
IE5VTEwpKQ0KPiArCQlyZXR1cm4gZmFsc2U7DQo+ICsNCj4gKwlidF9zaGVsbF9hZGRfc3VibWVu
dSgmc2Vuc29yX21lbnUpOw0KPiArDQo+ICsJcmV0dXJuIHRydWU7DQo+ICt9DQo+IGRpZmYgLS1n
aXQgYS90b29scy9tZXNoL3NlbnNvci1tb2RlbC5oIGIvdG9vbHMvbWVzaC9zZW5zb3ItbW9kZWwu
aA0KPiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiBpbmRleCAwMDAwMDAwMDAuLjk4NGRjZGM0Mw0K
PiAtLS0gL2Rldi9udWxsDQo+ICsrKyBiL3Rvb2xzL21lc2gvc2Vuc29yLW1vZGVsLmgNCj4gQEAg
LTAsMCArMSwzNyBAQA0KPiArLyoNCj4gKyAqDQo+ICsgKiAgQmx1ZVogLSBCbHVldG9vdGggcHJv
dG9jb2wgc3RhY2sgZm9yIExpbnV4DQo+ICsgKg0KPiArICogIENvcHlyaWdodCAoQykgMjAxOCAg
QW5kcmkgWW5ndmFzb24gPGFuZHJpQHluZ3Zhc29uLmlzPg0KPiArICoNCj4gKyAqDQo+ICsgKiAg
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcg0KPiArICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIg
R2VuZXJhbCBQdWJsaWMNCj4gKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCj4gKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCj4gKyAqDQo+ICsg
KiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi
ZSB1c2VmdWwsDQo+ICsgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g
dGhlIGltcGxpZWQgd2FycmFudHkgb2YNCj4gKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQ0KPiArICogIExlc3NlciBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQo+ICsgKg0KPiArICogIFlv
dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQ
dWJsaWMNCj4gKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdy
aXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQo+ICsgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0ENCj4gKyAq
DQo+ICsgKi8NCj4gKw0KPiArI2RlZmluZSBTRU5TT1JfU0VSVkVSX01PREVMX0lEIDB4MTEwMA0K
PiArI2RlZmluZSBTRU5TT1JfQ0xJRU5UX01PREVMX0lEIDB4MTEwMg0KPiArDQo+ICsjZGVmaW5l
IE9QX1NFTlNPUl9ERVNDUklQVE9SX0dFVCAweDgyMzANCj4gKyNkZWZpbmUgT1BfU0VOU09SX0RF
U0NSSVBUT1JfU1RBVFVTIDB4NTENCj4gKyNkZWZpbmUgT1BfU0VOU09SX0dFVCAweDgyMzENCj4g
KyNkZWZpbmUgT1BfU0VOU09SX1NUQVRVUyAweDUyDQo+ICsjZGVmaW5lIE9QX1NFTlNPUl9DT0xV
TU5fR0VUIDB4ODIzMg0KPiArI2RlZmluZSBPUF9TRU5TT1JfQ09MVU1OX1NUQVRVUyAweDUzDQo+
ICsjZGVmaW5lIE9QX1NFTlNPUl9TRVJJRVNfR0VUIDB4ODIzMw0KPiArI2RlZmluZSBPUF9TRU5T
T1JfU0VSSUVTX1NUQVRVUyAweDU0DQo+ICsNCj4gK3ZvaWQgc2Vuc29yX3NldF9ub2RlKGNvbnN0
IGNoYXIgKmFyZ3MpOw0KPiArYm9vbCBzZW5zb3JfY2xpZW50X2luaXQodWludDhfdCBlbGVtZW50
KTsNCj4gZGlmZiAtLWdpdCBhL3Rvb2xzL21lc2hjdGwuYyBiL3Rvb2xzL21lc2hjdGwuYw0KPiBp
bmRleCAzZTE0ODRmNjEuLjA4YmJhOWExMyAxMDA2NDQNCj4gLS0tIGEvdG9vbHMvbWVzaGN0bC5j
DQo+ICsrKyBiL3Rvb2xzL21lc2hjdGwuYw0KPiBAQCAtNTgsNiArNTgsNyBAQA0KPiAgI2luY2x1
ZGUgIm1lc2gvcHJvdi1kYi5oIg0KPiAgI2luY2x1ZGUgIm1lc2gvY29uZmlnLW1vZGVsLmgiDQo+
ICAjaW5jbHVkZSAibWVzaC9vbm9mZi1tb2RlbC5oIg0KPiArI2luY2x1ZGUgIm1lc2gvc2Vuc29y
LW1vZGVsLmgiDQo+ICANCj4gIC8qIFN0cmluZyBkaXNwbGF5IGNvbnN0YW50cyAqLw0KPiAgI2Rl
ZmluZSBDT0xPUkVEX05FVwlDT0xPUl9HUkVFTiAiTkVXIiBDT0xPUl9PRkYNCj4gQEAgLTE5OTAs
NiArMTk5MSw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pDQo+ICAJaWYgKCFv
bm9mZl9jbGllbnRfaW5pdChQUklNQVJZX0VMRU1FTlRfSURYKSkNCj4gIAkJZ19wcmludGVycigi
RmFpbGVkIHRvIGluaXRpYWxpemUgbWVzaCBnZW5lcmljIE9uL09mZiBjbGllbnRcbiIpOw0KPiAg
DQo+ICsJaWYgKCFzZW5zb3JfY2xpZW50X2luaXQoUFJJTUFSWV9FTEVNRU5UX0lEWCkpDQo+ICsJ
CWdfcHJpbnRlcnIoIkZhaWxlZCB0byBpbml0aWFsaXplIG1lc2ggc2Vuc29yIGNsaWVudFxuIik7
DQo+ICsNCj4gIAlzdGF0dXMgPSBidF9zaGVsbF9ydW4oKTsNCj4gIA0KPiAgCWdfZGJ1c19jbGll
bnRfdW5yZWYoY2xpZW50KTsNCg0KQWxzbywgY291bGQgeW91IHBsZWFzZSBjaGFuZ2UgIk1lc2gi
IHRvICJ0b29scy9tZXNoIiBpbiB0aGUgY29tbWl0DQptZXNzYWdlLg0KDQpSZWdhcmRzLA0KDQpJ
bmdh

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2018-08-10  1:50 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-08-08 21:26 [PATCH BlueZ] Mesh: Add basic sensor model Andri Yngvason
2018-08-10  1:50 ` Stotland, Inga

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.