All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH BlueZ 0/4] Mesh: Fix heartbeat publication/subscription
@ 2022-09-26 13:01 Isak Westin
  2022-09-26 13:01 ` [PATCH BlueZ 1/4] mesh: Correct u32 to u8 log transformation Isak Westin
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Isak Westin @ 2022-09-26 13:01 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Isak Westin

Hi,

These patches include some fixes to the heartbeat publication and subscription procedures.
Found during following PTS tests:
- MESH/NODE/CFG/HBS/*
- MESH/NODE/CFG/HBP/*

Best regards,
Isak

Isak Westin (4):
  mesh: Correct u32 to u8 log transformation
  mesh: Reply to HB pub set with same fields
  mesh: Correct HB sub state updates
  mesh: Clear HB sub status field if disabled

 mesh/cfgmod-server.c | 48 ++++++++++++++++++++++++++++++++++++--------
 mesh/net.c           | 20 ++++--------------
 2 files changed, 44 insertions(+), 24 deletions(-)

-- 
2.20.1






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

* [PATCH BlueZ 1/4] mesh: Correct u32 to u8 log transformation
  2022-09-26 13:01 [PATCH BlueZ 0/4] Mesh: Fix heartbeat publication/subscription Isak Westin
@ 2022-09-26 13:01 ` Isak Westin
  2022-09-26 15:54   ` Mesh: Fix heartbeat publication/subscription bluez.test.bot
  2022-09-26 13:01 ` [PATCH BlueZ 2/4] mesh: Reply to HB pub set with same fields Isak Westin
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 7+ messages in thread
From: Isak Westin @ 2022-09-26 13:01 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Isak Westin

Fixed the log transformation to correctly follow the value mapping
defined in the mesh profile (section 4.1.2).
---
 mesh/cfgmod-server.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/mesh/cfgmod-server.c b/mesh/cfgmod-server.c
index 9bc2f1c97..33796d05a 100644
--- a/mesh/cfgmod-server.c
+++ b/mesh/cfgmod-server.c
@@ -455,14 +455,14 @@ done:
 static uint8_t uint32_to_log(uint32_t value)
 {
 	uint32_t val = 1;
-	uint8_t ret = 1;
+	uint8_t ret = 0;
 
 	if (!value)
 		return 0;
 	else if (value > 0x10000)
 		return 0xff;
 
-	while (val < value) {
+	while (val <= value) {
 		val <<= 1;
 		ret++;
 	}
@@ -495,7 +495,7 @@ static uint16_t hb_subscription_get(struct mesh_node *node, int status)
 	l_put_le16(sub->dst, msg + n);
 	n += 2;
 	msg[n++] = uint32_to_log(time_now.tv_sec);
-	msg[n++] = uint32_to_log(sub->count);
+	msg[n++] = sub->count != 0xffff ? uint32_to_log(sub->count) : 0xff;
 	msg[n++] = sub->count ? sub->min_hops : 0;
 	msg[n++] = sub->max_hops;
 
@@ -538,7 +538,7 @@ static uint16_t hb_publication_get(struct mesh_node *node, int status)
 	msg[n++] = status;
 	l_put_le16(pub->dst, msg + n);
 	n += 2;
-	msg[n++] = uint32_to_log(pub->count);
+	msg[n++] = pub->count != 0xffff ? uint32_to_log(pub->count) : 0xff;
 	msg[n++] = uint32_to_log(pub->period);
 	msg[n++] = pub->ttl;
 	l_put_le16(pub->features, msg + n);
-- 
2.20.1






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

* [PATCH BlueZ 2/4] mesh: Reply to HB pub set with same fields
  2022-09-26 13:01 [PATCH BlueZ 0/4] Mesh: Fix heartbeat publication/subscription Isak Westin
  2022-09-26 13:01 ` [PATCH BlueZ 1/4] mesh: Correct u32 to u8 log transformation Isak Westin
@ 2022-09-26 13:01 ` Isak Westin
  2022-09-26 13:01 ` [PATCH BlueZ 3/4] mesh: Correct HB sub state updates Isak Westin
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Isak Westin @ 2022-09-26 13:01 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Isak Westin

If a Config Heartbeat Publication Set message is unsuccessfully
processed, the fields in the status reply should be the same as in the
original message. See MshPRFv1.0.1 section 4.4.1.2.15.
---
 mesh/cfgmod-server.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/mesh/cfgmod-server.c b/mesh/cfgmod-server.c
index 33796d05a..9c5edf551 100644
--- a/mesh/cfgmod-server.c
+++ b/mesh/cfgmod-server.c
@@ -575,7 +575,17 @@ static uint16_t hb_publication_set(struct mesh_node *node, const uint8_t *pkt)
 	status = mesh_net_set_heartbeat_pub(net, dst, features, net_idx, ttl,
 						count_log, period_log);
 
-	return hb_publication_get(node, status);
+	if (status != MESH_STATUS_SUCCESS) {
+		uint16_t n;
+
+		n = mesh_model_opcode_set(OP_CONFIG_HEARTBEAT_PUB_STATUS, msg);
+		msg[n++] = status;
+		memcpy(msg + n, pkt, 9);
+		n += 9;
+
+		return n;
+	} else
+		return hb_publication_get(node, status);
 }
 
 static void node_reset(void *user_data)
-- 
2.20.1






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

* [PATCH BlueZ 3/4] mesh: Correct HB sub state updates
  2022-09-26 13:01 [PATCH BlueZ 0/4] Mesh: Fix heartbeat publication/subscription Isak Westin
  2022-09-26 13:01 ` [PATCH BlueZ 1/4] mesh: Correct u32 to u8 log transformation Isak Westin
  2022-09-26 13:01 ` [PATCH BlueZ 2/4] mesh: Reply to HB pub set with same fields Isak Westin
@ 2022-09-26 13:01 ` Isak Westin
  2022-09-26 13:01 ` [PATCH BlueZ 4/4] mesh: Clear HB sub status field if disabled Isak Westin
  2022-09-26 20:20 ` [PATCH BlueZ 0/4] Mesh: Fix heartbeat publication/subscription patchwork-bot+bluetooth
  4 siblings, 0 replies; 7+ messages in thread
From: Isak Westin @ 2022-09-26 13:01 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Isak Westin

If heartbeat subscription is disabled, all fields should be set to zero
but collected data should be preserved. If HB subscription is enabled,
the collected data should be reset (which includes Min Hops = 0x7f).
HB subscription is disabled by setting any of the following fields to
zero: Source, destination or period log.
HB subscription is enabled by setting all the same fields to valid values.
---
 mesh/cfgmod-server.c |  2 +-
 mesh/net.c           | 20 ++++----------------
 2 files changed, 5 insertions(+), 17 deletions(-)

diff --git a/mesh/cfgmod-server.c b/mesh/cfgmod-server.c
index 9c5edf551..55a2d896b 100644
--- a/mesh/cfgmod-server.c
+++ b/mesh/cfgmod-server.c
@@ -496,7 +496,7 @@ static uint16_t hb_subscription_get(struct mesh_node *node, int status)
 	n += 2;
 	msg[n++] = uint32_to_log(time_now.tv_sec);
 	msg[n++] = sub->count != 0xffff ? uint32_to_log(sub->count) : 0xff;
-	msg[n++] = sub->count ? sub->min_hops : 0;
+	msg[n++] = sub->min_hops;
 	msg[n++] = sub->max_hops;
 
 	return n;
diff --git a/mesh/net.c b/mesh/net.c
index 699469284..7fec98531 100644
--- a/mesh/net.c
+++ b/mesh/net.c
@@ -3608,24 +3608,14 @@ int mesh_net_set_heartbeat_sub(struct mesh_net *net, uint16_t src, uint16_t dst,
 		return MESH_STATUS_UNSPECIFIED_ERROR;
 
 	/* Check if the subscription should be disabled */
-	if (IS_UNASSIGNED(src) || IS_UNASSIGNED(dst)) {
+	if (IS_UNASSIGNED(src) || IS_UNASSIGNED(dst) || !period_log) {
 		if (IS_GROUP(sub->dst))
 			mesh_net_dst_unreg(net, sub->dst);
 
+		/* Preserve collected data, but disable */
 		sub->enabled = false;
 		sub->dst = UNASSIGNED_ADDRESS;
 		sub->src = UNASSIGNED_ADDRESS;
-		sub->count = 0;
-		sub->period = 0;
-		sub->min_hops = 0;
-		sub->max_hops = 0;
-
-	} else if (!period_log && src == sub->src && dst == sub->dst) {
-		if (IS_GROUP(sub->dst))
-			mesh_net_dst_unreg(net, sub->dst);
-
-		/* Preserve collected data, but disable */
-		sub->enabled = false;
 		sub->period = 0;
 
 	} else {
@@ -3637,12 +3627,12 @@ int mesh_net_set_heartbeat_sub(struct mesh_net *net, uint16_t src, uint16_t dst,
 				mesh_net_dst_reg(net, dst);
 		}
 
-		sub->enabled = !!period_log;
+		sub->enabled = true;
 		sub->src = src;
 		sub->dst = dst;
 		sub->count = 0;
 		sub->period = log_to_uint32(period_log);
-		sub->min_hops = 0x00;
+		sub->min_hops = 0x7f;
 		sub->max_hops = 0x00;
 		gettimeofday(&time_now, NULL);
 		sub->start = time_now.tv_sec;
@@ -3656,8 +3646,6 @@ int mesh_net_set_heartbeat_sub(struct mesh_net *net, uint16_t src, uint16_t dst,
 		return MESH_STATUS_SUCCESS;
 	}
 
-	sub->min_hops = 0xff;
-
 	if (!sub->timer)
 		sub->timer = l_timeout_create(sub->period, hb_sub_timeout_func,
 								net, NULL);
-- 
2.20.1






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

* [PATCH BlueZ 4/4] mesh: Clear HB sub status field if disabled
  2022-09-26 13:01 [PATCH BlueZ 0/4] Mesh: Fix heartbeat publication/subscription Isak Westin
                   ` (2 preceding siblings ...)
  2022-09-26 13:01 ` [PATCH BlueZ 3/4] mesh: Correct HB sub state updates Isak Westin
@ 2022-09-26 13:01 ` Isak Westin
  2022-09-26 20:20 ` [PATCH BlueZ 0/4] Mesh: Fix heartbeat publication/subscription patchwork-bot+bluetooth
  4 siblings, 0 replies; 7+ messages in thread
From: Isak Westin @ 2022-09-26 13:01 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Isak Westin

When replying to a HB subscription get message, and the current state of
source or destination fields is zero (which means that HB subscription
is disabled), all fields in the status reply should be zero.
---
 mesh/cfgmod-server.c | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/mesh/cfgmod-server.c b/mesh/cfgmod-server.c
index 55a2d896b..7044b670d 100644
--- a/mesh/cfgmod-server.c
+++ b/mesh/cfgmod-server.c
@@ -470,7 +470,7 @@ static uint8_t uint32_to_log(uint32_t value)
 	return ret;
 }
 
-static uint16_t hb_subscription_get(struct mesh_node *node, int status)
+static uint16_t hb_subscription_status(struct mesh_node *node, int status)
 {
 	struct mesh_net *net = node_get_net(node);
 	struct mesh_net_heartbeat_sub *sub = mesh_net_get_heartbeat_sub(net);
@@ -502,6 +502,28 @@ static uint16_t hb_subscription_get(struct mesh_node *node, int status)
 	return n;
 }
 
+static uint16_t hb_subscription_get(struct mesh_node *node, int status)
+{
+	struct mesh_net *net = node_get_net(node);
+	struct mesh_net_heartbeat_sub *sub = mesh_net_get_heartbeat_sub(net);
+
+	/*
+	 * MshPRFv1.0.1 section 4.4.1.2.16, Heartbeat Subscription state:
+	 * If this is a GET request and the source or destination is unassigned,
+	 * all fields shall be set to zero in the status reply.
+	 */
+	if (IS_UNASSIGNED(sub->src) || IS_UNASSIGNED(sub->dst)) {
+		uint16_t n;
+
+		n = mesh_model_opcode_set(OP_CONFIG_HEARTBEAT_SUB_STATUS, msg);
+		memset(msg + n, 0, 9);
+		n += 9;
+		return n;
+	}
+
+	return hb_subscription_status(node, status);
+}
+
 static uint16_t hb_subscription_set(struct mesh_node *node, const uint8_t *pkt)
 {
 	uint16_t src, dst;
@@ -525,7 +547,7 @@ static uint16_t hb_subscription_set(struct mesh_node *node, const uint8_t *pkt)
 
 	status = mesh_net_set_heartbeat_sub(net, src, dst, period_log);
 
-	return hb_subscription_get(node, status);
+	return hb_subscription_status(node, status);
 }
 
 static uint16_t hb_publication_get(struct mesh_node *node, int status)
-- 
2.20.1






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

* RE: Mesh: Fix heartbeat publication/subscription
  2022-09-26 13:01 ` [PATCH BlueZ 1/4] mesh: Correct u32 to u8 log transformation Isak Westin
@ 2022-09-26 15:54   ` bluez.test.bot
  0 siblings, 0 replies; 7+ messages in thread
From: bluez.test.bot @ 2022-09-26 15:54 UTC (permalink / raw)
  To: linux-bluetooth, isak.westin

[-- Attachment #1: Type: text/plain, Size: 1053 bytes --]

This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=680522

---Test result---

Test Summary:
CheckPatch                    PASS      3.06 seconds
GitLint                       PASS      2.07 seconds
Prep - Setup ELL              PASS      35.30 seconds
Build - Prep                  PASS      0.83 seconds
Build - Configure             PASS      10.94 seconds
Build - Make                  PASS      1231.41 seconds
Make Check                    PASS      13.40 seconds
Make Check w/Valgrind         PASS      380.05 seconds
Make Distcheck                PASS      324.29 seconds
Build w/ext ELL - Configure   PASS      11.27 seconds
Build w/ext ELL - Make        PASS      115.80 seconds
Incremental Build w/ patches  PASS      538.07 seconds
Scan Build                    PASS      738.03 seconds



---
Regards,
Linux Bluetooth


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

* Re: [PATCH BlueZ 0/4] Mesh: Fix heartbeat publication/subscription
  2022-09-26 13:01 [PATCH BlueZ 0/4] Mesh: Fix heartbeat publication/subscription Isak Westin
                   ` (3 preceding siblings ...)
  2022-09-26 13:01 ` [PATCH BlueZ 4/4] mesh: Clear HB sub status field if disabled Isak Westin
@ 2022-09-26 20:20 ` patchwork-bot+bluetooth
  4 siblings, 0 replies; 7+ messages in thread
From: patchwork-bot+bluetooth @ 2022-09-26 20:20 UTC (permalink / raw)
  To: Isak Westin; +Cc: linux-bluetooth

Hello:

This series was applied to bluetooth/bluez.git (master)
by Brian Gix <brian.gix@intel.com>:

On Mon, 26 Sep 2022 15:01:06 +0200 you wrote:
> Hi,
> 
> These patches include some fixes to the heartbeat publication and subscription procedures.
> Found during following PTS tests:
> - MESH/NODE/CFG/HBS/*
> - MESH/NODE/CFG/HBP/*
> 
> [...]

Here is the summary with links:
  - [BlueZ,1/4] mesh: Correct u32 to u8 log transformation
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=5b569e3d14a3
  - [BlueZ,2/4] mesh: Reply to HB pub set with same fields
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=1ef221ca0205
  - [BlueZ,3/4] mesh: Correct HB sub state updates
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=902389f3e7a3
  - [BlueZ,4/4] mesh: Clear HB sub status field if disabled
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=d763bfa4d089

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



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

end of thread, other threads:[~2022-09-26 20:20 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-26 13:01 [PATCH BlueZ 0/4] Mesh: Fix heartbeat publication/subscription Isak Westin
2022-09-26 13:01 ` [PATCH BlueZ 1/4] mesh: Correct u32 to u8 log transformation Isak Westin
2022-09-26 15:54   ` Mesh: Fix heartbeat publication/subscription bluez.test.bot
2022-09-26 13:01 ` [PATCH BlueZ 2/4] mesh: Reply to HB pub set with same fields Isak Westin
2022-09-26 13:01 ` [PATCH BlueZ 3/4] mesh: Correct HB sub state updates Isak Westin
2022-09-26 13:01 ` [PATCH BlueZ 4/4] mesh: Clear HB sub status field if disabled Isak Westin
2022-09-26 20:20 ` [PATCH BlueZ 0/4] Mesh: Fix heartbeat publication/subscription patchwork-bot+bluetooth

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.