Skip to content

Commit adb4d33

Browse files
koalatuxrlubos
authored andcommitted
[nrf fromtree] net: lib: coap: make ACK random factor runtime configurable
Extend the `coap_transmission_parameters` struct with the field `ack_random_percent`. This was the last remaining CoAP transmission parameter that was not configurable at runtime. Signed-off-by: Adrian Friedli <[email protected]> (cherry picked from commit 98289e5)
1 parent 6983b3c commit adb4d33

File tree

3 files changed

+20
-3
lines changed

3 files changed

+20
-3
lines changed

include/zephyr/net/coap.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,8 +355,15 @@ typedef int (*coap_reply_t)(const struct coap_packet *response,
355355
* @brief CoAP transmission parameters.
356356
*/
357357
struct coap_transmission_parameters {
358-
/** Initial ACK timeout. Value is used as a base value to retry pending CoAP packets. */
358+
/** Initial ACK timeout. Value is used as a base value to retry pending CoAP packets. */
359359
uint32_t ack_timeout;
360+
#if defined(CONFIG_COAP_RANDOMIZE_ACK_TIMEOUT) || defined(__DOXYGEN__)
361+
/**
362+
* Set CoAP ack random factor. A value of 150 means a factor of 1.5. A value of 0 defaults
363+
* to @kconfig{CONFIG_COAP_ACK_RANDOM_PERCENT}. The value must be >= 100.
364+
*/
365+
uint16_t ack_random_percent;
366+
#endif /* defined(CONFIG_COAP_RANDOMIZE_ACK_TIMEOUT) */
360367
/** Set CoAP retry backoff factor. A value of 200 means a factor of 2.0. */
361368
uint16_t coap_backoff_percent;
362369
/** Maximum number of retransmissions. */

subsys/net/lib/coap/coap.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ static uint16_t message_id;
5959
static struct coap_transmission_parameters coap_transmission_params = {
6060
.max_retransmission = CONFIG_COAP_MAX_RETRANSMIT,
6161
.ack_timeout = CONFIG_COAP_INIT_ACK_TIMEOUT_MS,
62+
#if defined(CONFIG_COAP_RANDOMIZE_ACK_TIMEOUT)
63+
.ack_random_percent = CONFIG_COAP_ACK_RANDOM_PERCENT,
64+
#endif /* defined(CONFIG_COAP_RANDOMIZE_ACK_TIMEOUT) */
6265
.coap_backoff_percent = CONFIG_COAP_BACKOFF_PERCENT
6366
};
6467

@@ -1706,8 +1709,9 @@ struct coap_pending *coap_pending_next_to_expire(
17061709
static uint32_t init_ack_timeout(const struct coap_transmission_parameters *params)
17071710
{
17081711
#if defined(CONFIG_COAP_RANDOMIZE_ACK_TIMEOUT)
1709-
const uint32_t max_ack = params->ack_timeout *
1710-
CONFIG_COAP_ACK_RANDOM_PERCENT / 100;
1712+
const uint16_t random_percent = params->ack_random_percent ? params->ack_random_percent
1713+
: CONFIG_COAP_ACK_RANDOM_PERCENT;
1714+
const uint32_t max_ack = params->ack_timeout * random_percent / 100U;
17111715
const uint32_t min_ack = params->ack_timeout;
17121716

17131717
/* Randomly generated initial ACK timeout

tests/net/lib/coap/src/main.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1750,12 +1750,15 @@ ZTEST(coap, test_transmission_parameters)
17501750

17511751
params = coap_get_transmission_parameters();
17521752
zassert_equal(params.ack_timeout, CONFIG_COAP_INIT_ACK_TIMEOUT_MS, "Wrong ACK timeout");
1753+
zassert_equal(params.ack_random_percent, CONFIG_COAP_ACK_RANDOM_PERCENT,
1754+
"Wrong ACK random percent");
17531755
zassert_equal(params.coap_backoff_percent, CONFIG_COAP_BACKOFF_PERCENT,
17541756
"Wrong backoff percent");
17551757
zassert_equal(params.max_retransmission, CONFIG_COAP_MAX_RETRANSMIT,
17561758
"Wrong max retransmission value");
17571759

17581760
params.ack_timeout = 1000;
1761+
params.ack_random_percent = 110;
17591762
params.coap_backoff_percent = 150;
17601763
params.max_retransmission = 2;
17611764

@@ -1772,6 +1775,7 @@ ZTEST(coap, test_transmission_parameters)
17721775
zassert_not_null(pending, "No free pending");
17731776

17741777
params.ack_timeout = 3000;
1778+
params.ack_random_percent = 130;
17751779
params.coap_backoff_percent = 250;
17761780
params.max_retransmission = 3;
17771781

@@ -1780,6 +1784,7 @@ ZTEST(coap, test_transmission_parameters)
17801784
zassert_equal(r, 0, "Could not initialize packet");
17811785

17821786
zassert_equal(pending->params.ack_timeout, 3000, "Wrong ACK timeout");
1787+
zassert_equal(pending->params.ack_random_percent, 130, "Wrong ACK random percent");
17831788
zassert_equal(pending->params.coap_backoff_percent, 250, "Wrong backoff percent");
17841789
zassert_equal(pending->params.max_retransmission, 3, "Wrong max retransmission value");
17851790

@@ -1788,6 +1793,7 @@ ZTEST(coap, test_transmission_parameters)
17881793
zassert_equal(r, 0, "Could not initialize packet");
17891794

17901795
zassert_equal(pending->params.ack_timeout, 1000, "Wrong ACK timeout");
1796+
zassert_equal(pending->params.ack_random_percent, 110, "Wrong ACK random percent");
17911797
zassert_equal(pending->params.coap_backoff_percent, 150, "Wrong backoff percent");
17921798
zassert_equal(pending->params.max_retransmission, 2, "Wrong max retransmission value");
17931799
}

0 commit comments

Comments
 (0)