From 3b4d58aa4bb05a7b30bb720132bbfa35ea90be7d Mon Sep 17 00:00:00 2001 From: Lingao Meng Date: Tue, 31 Mar 2020 01:53:44 -0700 Subject: [PATCH] Bluetooth: Mesh: optimize performance for lpn node Fixed overflow risk when `poll_timeout` is 1s, although it is not recommended to use it like this, when it is used like this, `POLL_TIMEOUT_MAX` will overflow. When the poll timeout set like above, the default `6` req_attemps for first pull request lost, may cause this procedure bigger than poll_timeout, Well, stop scanning when lpn terminated friendship, this will save lots of energy, when lpn mode enable, the scanning will be start after `FRIEND_REQ_RETRY_TIMEOUT` Signed-off-by: Lingao Meng --- subsys/bluetooth/mesh/lpn.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/subsys/bluetooth/mesh/lpn.c b/subsys/bluetooth/mesh/lpn.c index d50a79bb75d..bfa127dc0ac 100644 --- a/subsys/bluetooth/mesh/lpn.c +++ b/subsys/bluetooth/mesh/lpn.c @@ -46,16 +46,19 @@ #define POLL_RETRY_TIMEOUT K_MSEC(100) -#define REQ_RETRY_DURATION(lpn) (4 * (LPN_RECV_DELAY + (lpn)->adv_duration + \ - (lpn)->recv_win + POLL_RETRY_TIMEOUT)) +#define REQ_RETRY_DURATION(lpn) (LPN_RECV_DELAY + (lpn)->adv_duration + \ + (lpn)->recv_win + POLL_RETRY_TIMEOUT) -#define POLL_TIMEOUT_INIT (CONFIG_BT_MESH_LPN_INIT_POLL_TIMEOUT * 100) -#define POLL_TIMEOUT_MAX(lpn) ((CONFIG_BT_MESH_LPN_POLL_TIMEOUT * 100) - \ - REQ_RETRY_DURATION(lpn)) +#define POLL_TIMEOUT_INIT (CONFIG_BT_MESH_LPN_INIT_POLL_TIMEOUT * 100) -#define REQ_ATTEMPTS(lpn) (POLL_TIMEOUT_MAX(lpn) < K_SECONDS(3) ? 2 : 4) +#define REQ_ATTEMPTS_MAX 6 +#define REQ_ATTEMPTS(lpn) MIN(REQ_ATTEMPTS_MAX, \ + POLL_TIMEOUT_INIT / REQ_RETRY_DURATION(lpn)) -#define CLEAR_ATTEMPTS 2 +#define POLL_TIMEOUT_MAX(lpn) (POLL_TIMEOUT_INIT - \ + (REQ_ATTEMPTS(lpn) * REQ_RETRY_DURATION(lpn))) + +#define CLEAR_ATTEMPTS 3 #define LPN_CRITERIA ((CONFIG_BT_MESH_LPN_MIN_QUEUE_SIZE) | \ (CONFIG_BT_MESH_LPN_RSSI_FACTOR << 3) | \ @@ -150,10 +153,7 @@ static void friend_clear_sent(int err, void *user_data) { struct bt_mesh_lpn *lpn = &bt_mesh.lpn; - /* We're switching away from Low Power behavior, so permanently - * enable scanning. - */ - bt_mesh_scan_enable(); + /* Scanning will enable if lpn state still enabled */ lpn->req_attempts++; @@ -716,7 +716,7 @@ static void update_timeout(struct bt_mesh_lpn *lpn) bt_mesh_scan_disable(); } - if (lpn->req_attempts < 6) { + if (lpn->req_attempts < REQ_ATTEMPTS(lpn)) { BT_WARN("Retrying first Friend Poll"); lpn->sent_req = 0U; if (send_friend_poll() == 0) {