You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by na...@apache.org on 2021/05/27 08:20:32 UTC

[mynewt-nimble] 05/31: Revert "mesh: Sync lpn.c with Zephyr"

This is an automated email from the ASF dual-hosted git repository.

naraj pushed a commit to branch revert-958-mesh_sync_march21
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git

commit 5b28681369c20395304b9792be52801bc92cc908
Author: MichaƂ Narajowski <mi...@codecoup.pl>
AuthorDate: Thu May 27 10:20:19 2021 +0200

    Revert "mesh: Sync lpn.c with Zephyr"
    
    This reverts commit 8fe37356da9ab934dcf55c7759cb26e595ffefe6.
---
 nimble/host/mesh/src/lpn.c | 76 +++++++++++++++++++++++++---------------------
 1 file changed, 42 insertions(+), 34 deletions(-)

diff --git a/nimble/host/mesh/src/lpn.c b/nimble/host/mesh/src/lpn.c
index 45c9004..bd48c08 100644
--- a/nimble/host/mesh/src/lpn.c
+++ b/nimble/host/mesh/src/lpn.c
@@ -148,24 +148,6 @@ static inline void group_clear(atomic_t *target, atomic_t *source)
 
 static void clear_friendship(bool force, bool disable);
 
-static int32_t poll_timeout(struct bt_mesh_lpn *lpn)
-{
-	/* If we're waiting for segment acks keep polling at high freq */
-	if (bt_mesh_tx_in_progress()) {
-		return min(POLL_TIMEOUT_MAX(lpn), K_SECONDS(1));
-	}
-
-	if (lpn->poll_timeout < POLL_TIMEOUT_MAX(lpn)) {
-		lpn->poll_timeout *= 2;
-		lpn->poll_timeout = min(lpn->poll_timeout,
-					POLL_TIMEOUT_MAX(lpn));
-	}
-
-	BT_DBG("Poll Timeout is %ums", (unsigned) lpn->poll_timeout);
-
-	return lpn->poll_timeout;
-}
-
 static void friend_clear_sent(int err, void *user_data)
 {
 	struct bt_mesh_lpn *lpn = &bt_mesh.lpn;
@@ -229,7 +211,6 @@ static void clear_friendship(bool force, bool disable)
 
 	bt_mesh_rx_reset();
 
-	lpn_set_state(BT_MESH_LPN_DISABLED);
 	k_delayed_work_cancel(&lpn->timer);
 
 	if (lpn->clear_success) {
@@ -248,7 +229,7 @@ static void clear_friendship(bool force, bool disable)
 	lpn->recv_win = 0;
 	lpn->queue_size = 0;
 	lpn->disable = 0;
-	lpn->sent_req = 0U;
+	lpn->sent_req = 0;
 	lpn->established = 0;
 	lpn->clear_success = 0;
 	lpn->sub = NULL;
@@ -265,12 +246,13 @@ static void clear_friendship(bool force, bool disable)
 
 	bt_mesh_hb_feature_changed(BT_MESH_FEAT_LOW_POWER);
 
-	if (!disable) {
+	if (disable) {
 		lpn_set_state(BT_MESH_LPN_DISABLED);
-		k_delayed_work_submit(&lpn->timer, FRIEND_REQ_RETRY_TIMEOUT);
 		return;
 	}
 
+	lpn_set_state(BT_MESH_LPN_ENABLED);
+	k_delayed_work_submit(&lpn->timer, FRIEND_REQ_RETRY_TIMEOUT);
 }
 
 static void friend_req_sent(uint16_t duration, int err, void *user_data)
@@ -349,7 +331,7 @@ static void req_sent(uint16_t duration, int err, void *user_data)
 
 	if (err) {
 		BT_ERR("Sending request failed (err %d)", err);
-		lpn->sent_req = 0U;
+		lpn->sent_req = 0;
 		group_zero(lpn->pending);
 		return;
 	}
@@ -477,14 +459,11 @@ static void friend_response_received(struct bt_mesh_lpn *lpn)
 		lpn->fsn++;
 	}
 
+	k_delayed_work_cancel(&lpn->timer);
 	bt_mesh_scan_disable();
 	lpn_set_state(BT_MESH_LPN_ESTABLISHED);
 	lpn->req_attempts = 0;
-	lpn->sent_req = 0U;
-
-	int32_t timeout = poll_timeout(lpn);
-
-	k_delayed_work_submit(&lpn->timer, K_MSEC(timeout));
+	lpn->sent_req = 0;
 }
 
 void bt_mesh_lpn_msg_received(struct bt_mesh_net_rx *rx)
@@ -497,10 +476,6 @@ void bt_mesh_lpn_msg_received(struct bt_mesh_net_rx *rx)
 		return;
 	}
 
-	if (lpn->state != BT_MESH_LPN_WAIT_UPDATE) {
-		return;
-	}
-
 	if (lpn->sent_req != TRANS_CTL_OP_FRIEND_POLL) {
 		BT_WARN("Unexpected message withouth a preceding Poll");
 		return;
@@ -570,6 +545,7 @@ int bt_mesh_lpn_friend_offer(struct bt_mesh_net_rx *rx,
 		}
 	}
 	/* TODO: Add offer acceptance criteria check */
+	k_delayed_work_cancel(&lpn->timer);
 
 	lpn->recv_win = msg->recv_win;
 	lpn->queue_size = msg->queue_size;
@@ -762,7 +738,7 @@ static void update_timeout(struct bt_mesh_lpn *lpn)
 
 		if (lpn->req_attempts < REQ_ATTEMPTS(lpn)) {
 			BT_WARN("Retrying first Friend Poll");
-			lpn->sent_req = 0U;
+			lpn->sent_req = 0;
 			if (send_friend_poll() == 0) {
 				return;
 			}
@@ -817,7 +793,7 @@ static void lpn_timeout(struct ble_npl_event *work)
 		if (lpn->req_attempts < REQ_ATTEMPTS(lpn)) {
 			uint8_t req = lpn->sent_req;
 
-			lpn->sent_req = 0U;
+			lpn->sent_req = 0;
 
 			if (!req || req == TRANS_CTL_OP_FRIEND_POLL) {
 				send_friend_poll();
@@ -880,6 +856,24 @@ void bt_mesh_lpn_group_del(uint16_t *groups, size_t group_count)
 	sub_update(TRANS_CTL_OP_FRIEND_SUB_REM);
 }
 
+static int32_t poll_timeout(struct bt_mesh_lpn *lpn)
+{
+	/* If we're waiting for segment acks keep polling at high freq */
+	if (bt_mesh_tx_in_progress()) {
+		return min(POLL_TIMEOUT_MAX(lpn), K_SECONDS(1));
+	}
+
+	if (lpn->poll_timeout < POLL_TIMEOUT_MAX(lpn)) {
+		lpn->poll_timeout *= 2;
+		lpn->poll_timeout = min(lpn->poll_timeout,
+					POLL_TIMEOUT_MAX(lpn));
+	}
+
+	BT_DBG("Poll Timeout is %ums", (unsigned) lpn->poll_timeout);
+
+	return lpn->poll_timeout;
+}
+
 int bt_mesh_lpn_friend_sub_cfm(struct bt_mesh_net_rx *rx,
 			       struct os_mbuf *buf)
 {
@@ -938,6 +932,12 @@ int bt_mesh_lpn_friend_sub_cfm(struct bt_mesh_net_rx *rx,
 		send_friend_poll();
 	}
 
+	if (!lpn->sent_req) {
+		int32_t timeout = poll_timeout(lpn);
+
+		k_delayed_work_submit(&lpn->timer, K_MSEC(timeout));
+	}
+
 	return 0;
 }
 
@@ -1020,6 +1020,12 @@ int bt_mesh_lpn_friend_update(struct bt_mesh_net_rx *rx,
 		send_friend_poll();
 	}
 
+	if (!lpn->sent_req) {
+		int32_t timeout = poll_timeout(lpn);
+
+		k_delayed_work_submit(&lpn->timer, K_MSEC(timeout));
+	}
+
 	return 0;
 }
 
@@ -1067,6 +1073,8 @@ int bt_mesh_lpn_init(void)
 
 	BT_DBG("");
 
+	lpn->groups_changed = 0;
+
 	k_delayed_work_init(&lpn->timer, lpn_timeout);
 
 	if (lpn->state == BT_MESH_LPN_ENABLED) {