summaryrefslogtreecommitdiff
path: root/mesh/cfgmod-server.c
diff options
context:
space:
mode:
authorInga Stotland <inga.stotland@intel.com>2020-08-19 22:41:32 -0700
committerBrian Gix <brian.gix@intel.com>2020-08-22 07:20:26 -0700
commit4de3420d3352e0773dd6e4a8ef665247a0da8bc2 (patch)
treecafe18ecb8022c3838b5f82447160fedaccfae75 /mesh/cfgmod-server.c
parent291dbf2c94ed956c2269097d1ed859488b08c2bd (diff)
downloadbluez-4de3420d3352e0773dd6e4a8ef665247a0da8bc2.tar.gz
mesh: Use correct retransmit parameters for publications
This adds previously missing retransmit count and interval values specific to model publications. The values are configured by Config CLient and may be different to each model.
Diffstat (limited to 'mesh/cfgmod-server.c')
-rw-r--r--mesh/cfgmod-server.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/mesh/cfgmod-server.c b/mesh/cfgmod-server.c
index 90ebdf046..239ea889d 100644
--- a/mesh/cfgmod-server.c
+++ b/mesh/cfgmod-server.c
@@ -48,7 +48,7 @@ static uint8_t msg[MAX_MSG_LEN];
static uint16_t set_pub_status(uint8_t status, uint16_t ele_addr, uint32_t id,
uint16_t pub_addr, uint16_t idx, bool cred_flag,
- uint8_t ttl, uint8_t period, uint8_t retransmit)
+ uint8_t ttl, uint8_t period, uint8_t rtx)
{
size_t n;
@@ -61,7 +61,7 @@ static uint16_t set_pub_status(uint8_t status, uint16_t ele_addr, uint32_t id,
n += 6;
msg[n++] = ttl;
msg[n++] = period;
- msg[n++] = retransmit;
+ msg[n++] = rtx;
if (!IS_VENDOR(id)) {
l_put_le16(MODEL_ID(id), msg + n);
@@ -80,6 +80,7 @@ static uint16_t config_pub_get(struct mesh_node *node, const uint8_t *pkt,
{
uint32_t id;
uint16_t ele_addr;
+ uint8_t rtx;
struct mesh_model_pub *pub;
int status;
@@ -88,10 +89,12 @@ static uint16_t config_pub_get(struct mesh_node *node, const uint8_t *pkt,
pub = mesh_model_pub_get(node, ele_addr, id, &status);
+ rtx = pub->rtx.cnt + (((pub->rtx.interval / 50) - 1) << 3);
+
if (pub && status == MESH_STATUS_SUCCESS)
return set_pub_status(status, ele_addr, id, pub->addr, pub->idx,
pub->credential, pub->ttl, pub->period,
- pub->retransmit);
+ rtx);
else
return set_pub_status(status, ele_addr, id, 0, 0, 0, 0, 0, 0);
}
@@ -102,7 +105,7 @@ static uint16_t config_pub_set(struct mesh_node *node, const uint8_t *pkt,
uint32_t id;
uint16_t ele_addr, idx, pub_dst;
const uint8_t *pub_addr;
- uint8_t ttl, period, retransmit;
+ uint8_t ttl, period, rtx, cnt, interval;
int status;
bool cred_flag;
@@ -124,12 +127,15 @@ static uint16_t config_pub_set(struct mesh_node *node, const uint8_t *pkt,
idx &= APP_IDX_MASK;
ttl = pkt[6];
period = pkt[7];
- retransmit = pkt[8];
+ rtx = pkt[8];
id = CFG_GET_ID(vendor, pkt + 9);
+ cnt = rtx & 0x7;
+ interval = ((rtx >> 3) + 1) * 50;
+
status = mesh_model_pub_set(node, ele_addr, id, pub_addr, idx,
- cred_flag, ttl, period, retransmit,
- virt, &pub_dst);
+ cred_flag, ttl, period, cnt,
+ interval, virt, &pub_dst);
l_debug("pub_set: status %d, ea %4.4x, ota: %4.4x, id: %x, idx: %3.3x",
status, ele_addr, pub_dst, id, idx);
@@ -153,8 +159,8 @@ static uint16_t config_pub_set(struct mesh_node *node, const uint8_t *pkt,
.ttl = ttl,
.credential = cred_flag,
.period = period,
- .count = retransmit & 0x7,
- .interval = ((retransmit >> 3) + 1) * 50
+ .cnt = cnt,
+ .interval = interval
};
if (virt)
@@ -168,7 +174,7 @@ static uint16_t config_pub_set(struct mesh_node *node, const uint8_t *pkt,
}
return set_pub_status(status, ele_addr, id, pub_dst, idx, cred_flag,
- ttl, period, retransmit);
+ ttl, period, rtx);
}
static uint16_t cfg_sub_get_msg(struct mesh_node *node, const uint8_t *pkt,