ble_mesh: Friend SeqAuth cleanup [Zephyr]
The Friend queue uses the message SeqAuth to determine whether the message is already in the queue. To facilitate this, the SeqAuth is passed around as a pointer throughout the transport modules. In the bt_mesh_ctl_send functions, this parameter is also exposed in the API, but the internal usage is inconsistent and buggy. Also, no one actually uses this parameter. - Removes seq_auth param from bt_mesh_ctl_send, instead passing NULL directly to the friend module, to enforce its addition to the queue. - Makes the seq_auth pointer const throughout the friend module.
This commit is contained in:
parent
489d32663b
commit
e2186b1d3a
5 changed files with 35 additions and 35 deletions
|
@ -285,7 +285,7 @@ int bt_mesh_friend_clear(struct bt_mesh_net_rx *rx, struct net_buf_simple *buf)
|
||||||
cfm.lpn_counter = msg->lpn_counter;
|
cfm.lpn_counter = msg->lpn_counter;
|
||||||
|
|
||||||
bt_mesh_ctl_send(&tx, TRANS_CTL_OP_FRIEND_CLEAR_CFM, &cfm,
|
bt_mesh_ctl_send(&tx, TRANS_CTL_OP_FRIEND_CLEAR_CFM, &cfm,
|
||||||
sizeof(cfm), NULL, NULL, NULL);
|
sizeof(cfm), NULL, NULL);
|
||||||
|
|
||||||
friend_clear(frnd, BLE_MESH_FRIENDSHIP_TERMINATE_RECV_FRND_CLEAR);
|
friend_clear(frnd, BLE_MESH_FRIENDSHIP_TERMINATE_RECV_FRND_CLEAR);
|
||||||
|
|
||||||
|
@ -813,7 +813,7 @@ static void send_friend_clear(struct bt_mesh_friend *frnd)
|
||||||
}
|
}
|
||||||
|
|
||||||
bt_mesh_ctl_send(&tx, TRANS_CTL_OP_FRIEND_CLEAR, &req,
|
bt_mesh_ctl_send(&tx, TRANS_CTL_OP_FRIEND_CLEAR, &req,
|
||||||
sizeof(req), NULL, &clear_sent_cb, frnd);
|
sizeof(req), &clear_sent_cb, frnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clear_timeout(struct k_work *work)
|
static void clear_timeout(struct k_work *work)
|
||||||
|
@ -1283,7 +1283,7 @@ int bt_mesh_friend_deinit(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool is_segack(struct net_buf *buf, u64_t *seqauth, u16_t src)
|
static bool is_segack(struct net_buf *buf, const u64_t *seqauth, u16_t src)
|
||||||
{
|
{
|
||||||
struct net_buf_simple_state state = {0};
|
struct net_buf_simple_state state = {0};
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
@ -1319,8 +1319,8 @@ end:
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void friend_purge_old_ack(struct bt_mesh_friend *frnd, u64_t *seq_auth,
|
static void friend_purge_old_ack(struct bt_mesh_friend *frnd,
|
||||||
u16_t src)
|
const u64_t *seq_auth, u16_t src)
|
||||||
{
|
{
|
||||||
sys_snode_t *cur = NULL, *prev = NULL;
|
sys_snode_t *cur = NULL, *prev = NULL;
|
||||||
|
|
||||||
|
@ -1347,7 +1347,7 @@ static void friend_purge_old_ack(struct bt_mesh_friend *frnd, u64_t *seq_auth,
|
||||||
static void friend_lpn_enqueue_rx(struct bt_mesh_friend *frnd,
|
static void friend_lpn_enqueue_rx(struct bt_mesh_friend *frnd,
|
||||||
struct bt_mesh_net_rx *rx,
|
struct bt_mesh_net_rx *rx,
|
||||||
enum bt_mesh_friend_pdu_type type,
|
enum bt_mesh_friend_pdu_type type,
|
||||||
u64_t *seq_auth, u8_t seg_count,
|
const u64_t *seq_auth, u8_t seg_count,
|
||||||
struct net_buf_simple *sbuf)
|
struct net_buf_simple *sbuf)
|
||||||
{
|
{
|
||||||
struct friend_pdu_info info = {0};
|
struct friend_pdu_info info = {0};
|
||||||
|
@ -1397,7 +1397,7 @@ static void friend_lpn_enqueue_rx(struct bt_mesh_friend *frnd,
|
||||||
static void friend_lpn_enqueue_tx(struct bt_mesh_friend *frnd,
|
static void friend_lpn_enqueue_tx(struct bt_mesh_friend *frnd,
|
||||||
struct bt_mesh_net_tx *tx,
|
struct bt_mesh_net_tx *tx,
|
||||||
enum bt_mesh_friend_pdu_type type,
|
enum bt_mesh_friend_pdu_type type,
|
||||||
u64_t *seq_auth, u8_t seg_count,
|
const u64_t *seq_auth, u8_t seg_count,
|
||||||
struct net_buf_simple *sbuf)
|
struct net_buf_simple *sbuf)
|
||||||
{
|
{
|
||||||
struct friend_pdu_info info = {0};
|
struct friend_pdu_info info = {0};
|
||||||
|
@ -1484,7 +1484,7 @@ bool bt_mesh_friend_match(u16_t net_idx, u16_t addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool friend_queue_has_space(struct bt_mesh_friend *frnd, u16_t addr,
|
static bool friend_queue_has_space(struct bt_mesh_friend *frnd, u16_t addr,
|
||||||
u64_t *seq_auth, u8_t seg_count)
|
const u64_t *seq_auth, u8_t seg_count)
|
||||||
{
|
{
|
||||||
u32_t total = 0U;
|
u32_t total = 0U;
|
||||||
int i;
|
int i;
|
||||||
|
@ -1515,7 +1515,7 @@ static bool friend_queue_has_space(struct bt_mesh_friend *frnd, u16_t addr,
|
||||||
}
|
}
|
||||||
|
|
||||||
bool bt_mesh_friend_queue_has_space(u16_t net_idx, u16_t src, u16_t dst,
|
bool bt_mesh_friend_queue_has_space(u16_t net_idx, u16_t src, u16_t dst,
|
||||||
u64_t *seq_auth, u8_t seg_count)
|
const u64_t *seq_auth, u8_t seg_count)
|
||||||
{
|
{
|
||||||
bool someone_has_space = false, friend_match = false;
|
bool someone_has_space = false, friend_match = false;
|
||||||
int i;
|
int i;
|
||||||
|
@ -1550,7 +1550,7 @@ bool bt_mesh_friend_queue_has_space(u16_t net_idx, u16_t src, u16_t dst,
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool friend_queue_prepare_space(struct bt_mesh_friend *frnd, u16_t addr,
|
static bool friend_queue_prepare_space(struct bt_mesh_friend *frnd, u16_t addr,
|
||||||
u64_t *seq_auth, u8_t seg_count)
|
const u64_t *seq_auth, u8_t seg_count)
|
||||||
{
|
{
|
||||||
bool pending_segments = false;
|
bool pending_segments = false;
|
||||||
u8_t avail_space = 0U;
|
u8_t avail_space = 0U;
|
||||||
|
@ -1587,7 +1587,7 @@ static bool friend_queue_prepare_space(struct bt_mesh_friend *frnd, u16_t addr,
|
||||||
|
|
||||||
void bt_mesh_friend_enqueue_rx(struct bt_mesh_net_rx *rx,
|
void bt_mesh_friend_enqueue_rx(struct bt_mesh_net_rx *rx,
|
||||||
enum bt_mesh_friend_pdu_type type,
|
enum bt_mesh_friend_pdu_type type,
|
||||||
u64_t *seq_auth, u8_t seg_count,
|
const u64_t *seq_auth, u8_t seg_count,
|
||||||
struct net_buf_simple *sbuf)
|
struct net_buf_simple *sbuf)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -1622,7 +1622,7 @@ void bt_mesh_friend_enqueue_rx(struct bt_mesh_net_rx *rx,
|
||||||
|
|
||||||
bool bt_mesh_friend_enqueue_tx(struct bt_mesh_net_tx *tx,
|
bool bt_mesh_friend_enqueue_tx(struct bt_mesh_net_tx *tx,
|
||||||
enum bt_mesh_friend_pdu_type type,
|
enum bt_mesh_friend_pdu_type type,
|
||||||
u64_t *seq_auth, u8_t seg_count,
|
const u64_t *seq_auth, u8_t seg_count,
|
||||||
struct net_buf_simple *sbuf)
|
struct net_buf_simple *sbuf)
|
||||||
{
|
{
|
||||||
bool matched = false;
|
bool matched = false;
|
||||||
|
@ -1658,7 +1658,7 @@ bool bt_mesh_friend_enqueue_tx(struct bt_mesh_net_tx *tx,
|
||||||
}
|
}
|
||||||
|
|
||||||
void bt_mesh_friend_clear_incomplete(struct bt_mesh_subnet *sub, u16_t src,
|
void bt_mesh_friend_clear_incomplete(struct bt_mesh_subnet *sub, u16_t src,
|
||||||
u16_t dst, u64_t *seq_auth)
|
u16_t dst, const u64_t *seq_auth)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
|
|
@ -27,19 +27,19 @@ struct bt_mesh_friend *bt_mesh_friend_find(u16_t net_idx, u16_t lpn_addr,
|
||||||
bool valid, bool established);
|
bool valid, bool established);
|
||||||
|
|
||||||
bool bt_mesh_friend_queue_has_space(u16_t net_idx, u16_t src, u16_t dst,
|
bool bt_mesh_friend_queue_has_space(u16_t net_idx, u16_t src, u16_t dst,
|
||||||
u64_t *seq_auth, u8_t seg_count);
|
const u64_t *seq_auth, u8_t seg_count);
|
||||||
|
|
||||||
void bt_mesh_friend_enqueue_rx(struct bt_mesh_net_rx *rx,
|
void bt_mesh_friend_enqueue_rx(struct bt_mesh_net_rx *rx,
|
||||||
enum bt_mesh_friend_pdu_type type,
|
enum bt_mesh_friend_pdu_type type,
|
||||||
u64_t *seq_auth, u8_t seg_count,
|
const u64_t *seq_auth, u8_t seg_count,
|
||||||
struct net_buf_simple *sbuf);
|
struct net_buf_simple *sbuf);
|
||||||
bool bt_mesh_friend_enqueue_tx(struct bt_mesh_net_tx *tx,
|
bool bt_mesh_friend_enqueue_tx(struct bt_mesh_net_tx *tx,
|
||||||
enum bt_mesh_friend_pdu_type type,
|
enum bt_mesh_friend_pdu_type type,
|
||||||
u64_t *seq_auth, u8_t seg_count,
|
const u64_t *seq_auth, u8_t seg_count,
|
||||||
struct net_buf_simple *sbuf);
|
struct net_buf_simple *sbuf);
|
||||||
|
|
||||||
void bt_mesh_friend_clear_incomplete(struct bt_mesh_subnet *sub, u16_t src,
|
void bt_mesh_friend_clear_incomplete(struct bt_mesh_subnet *sub, u16_t src,
|
||||||
u16_t dst, u64_t *seq_auth);
|
u16_t dst, const u64_t *seq_auth);
|
||||||
|
|
||||||
void bt_mesh_friend_sec_update(u16_t net_idx);
|
void bt_mesh_friend_sec_update(u16_t net_idx);
|
||||||
|
|
||||||
|
|
|
@ -201,7 +201,7 @@ static int send_friend_clear(void)
|
||||||
BT_DBG("%s", __func__);
|
BT_DBG("%s", __func__);
|
||||||
|
|
||||||
return bt_mesh_ctl_send(&tx, TRANS_CTL_OP_FRIEND_CLEAR, &req,
|
return bt_mesh_ctl_send(&tx, TRANS_CTL_OP_FRIEND_CLEAR, &req,
|
||||||
sizeof(req), NULL, &clear_sent_cb, NULL);
|
sizeof(req), &clear_sent_cb, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clear_friendship(bool force, bool disable)
|
static void clear_friendship(bool force, bool disable)
|
||||||
|
@ -328,7 +328,7 @@ static int send_friend_req(struct bt_mesh_lpn *lpn)
|
||||||
BT_DBG("%s", __func__);
|
BT_DBG("%s", __func__);
|
||||||
|
|
||||||
return bt_mesh_ctl_send(&tx, TRANS_CTL_OP_FRIEND_REQ, &req,
|
return bt_mesh_ctl_send(&tx, TRANS_CTL_OP_FRIEND_REQ, &req,
|
||||||
sizeof(req), NULL, &friend_req_sent_cb, NULL);
|
sizeof(req), &friend_req_sent_cb, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void req_sent(u16_t duration, int err, void *user_data)
|
static void req_sent(u16_t duration, int err, void *user_data)
|
||||||
|
@ -403,7 +403,7 @@ static int send_friend_poll(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = bt_mesh_ctl_send(&tx, TRANS_CTL_OP_FRIEND_POLL, &fsn, 1,
|
err = bt_mesh_ctl_send(&tx, TRANS_CTL_OP_FRIEND_POLL, &fsn, 1,
|
||||||
NULL, &req_sent_cb, NULL);
|
&req_sent_cb, NULL);
|
||||||
if (err == 0) {
|
if (err == 0) {
|
||||||
lpn->pending_poll = 0U;
|
lpn->pending_poll = 0U;
|
||||||
lpn->sent_req = TRANS_CTL_OP_FRIEND_POLL;
|
lpn->sent_req = TRANS_CTL_OP_FRIEND_POLL;
|
||||||
|
@ -718,7 +718,7 @@ static bool sub_update(u8_t op)
|
||||||
|
|
||||||
req.xact = lpn->xact_next++;
|
req.xact = lpn->xact_next++;
|
||||||
|
|
||||||
if (bt_mesh_ctl_send(&tx, op, &req, 1 + g * 2, NULL,
|
if (bt_mesh_ctl_send(&tx, op, &req, 1 + g * 2,
|
||||||
&req_sent_cb, NULL) < 0) {
|
&req_sent_cb, NULL) < 0) {
|
||||||
group_zero(lpn->pending);
|
group_zero(lpn->pending);
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -1079,8 +1079,8 @@ static inline s32_t ack_timeout(struct seg_rx *rx)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ctl_send_unseg(struct bt_mesh_net_tx *tx, u8_t ctl_op, void *data,
|
static int ctl_send_unseg(struct bt_mesh_net_tx *tx, u8_t ctl_op, void *data,
|
||||||
size_t data_len, u64_t *seq_auth,
|
size_t data_len, const struct bt_mesh_send_cb *cb,
|
||||||
const struct bt_mesh_send_cb *cb, void *cb_data)
|
void *cb_data)
|
||||||
{
|
{
|
||||||
struct net_buf *buf = NULL;
|
struct net_buf *buf = NULL;
|
||||||
|
|
||||||
|
@ -1098,7 +1098,7 @@ static int ctl_send_unseg(struct bt_mesh_net_tx *tx, u8_t ctl_op, void *data,
|
||||||
|
|
||||||
if (IS_ENABLED(CONFIG_BLE_MESH_FRIEND)) {
|
if (IS_ENABLED(CONFIG_BLE_MESH_FRIEND)) {
|
||||||
if (bt_mesh_friend_enqueue_tx(tx, BLE_MESH_FRIEND_PDU_SINGLE,
|
if (bt_mesh_friend_enqueue_tx(tx, BLE_MESH_FRIEND_PDU_SINGLE,
|
||||||
seq_auth, 1, &buf->b) &&
|
NULL, 1, &buf->b) &&
|
||||||
BLE_MESH_ADDR_IS_UNICAST(tx->ctx->addr)) {
|
BLE_MESH_ADDR_IS_UNICAST(tx->ctx->addr)) {
|
||||||
/* PDUs for a specific Friend should only go
|
/* PDUs for a specific Friend should only go
|
||||||
* out through the Friend Queue.
|
* out through the Friend Queue.
|
||||||
|
@ -1111,9 +1111,9 @@ static int ctl_send_unseg(struct bt_mesh_net_tx *tx, u8_t ctl_op, void *data,
|
||||||
return bt_mesh_net_send(tx, buf, cb, cb_data);
|
return bt_mesh_net_send(tx, buf, cb, cb_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ctl_send_seg(struct bt_mesh_net_tx *tx, u8_t ctl_op,
|
static int ctl_send_seg(struct bt_mesh_net_tx *tx, u8_t ctl_op, void *data,
|
||||||
void *data, size_t data_len, u64_t *seq_auth,
|
size_t data_len, const struct bt_mesh_send_cb *cb,
|
||||||
const struct bt_mesh_send_cb *cb, void *cb_data)
|
void *cb_data)
|
||||||
{
|
{
|
||||||
struct seg_tx *tx_seg = NULL;
|
struct seg_tx *tx_seg = NULL;
|
||||||
u16_t unsent = data_len;
|
u16_t unsent = data_len;
|
||||||
|
@ -1197,18 +1197,18 @@ static int ctl_send_seg(struct bt_mesh_net_tx *tx, u8_t ctl_op,
|
||||||
}
|
}
|
||||||
|
|
||||||
int bt_mesh_ctl_send(struct bt_mesh_net_tx *tx, u8_t ctl_op, void *data,
|
int bt_mesh_ctl_send(struct bt_mesh_net_tx *tx, u8_t ctl_op, void *data,
|
||||||
size_t data_len, u64_t *seq_auth,
|
size_t data_len, const struct bt_mesh_send_cb *cb,
|
||||||
const struct bt_mesh_send_cb *cb, void *cb_data)
|
void *cb_data)
|
||||||
{
|
{
|
||||||
BT_DBG("src 0x%04x dst 0x%04x ttl 0x%02x ctl 0x%02x", tx->src,
|
BT_DBG("src 0x%04x dst 0x%04x ttl 0x%02x ctl 0x%02x", tx->src,
|
||||||
tx->ctx->addr, tx->ctx->send_ttl, ctl_op);
|
tx->ctx->addr, tx->ctx->send_ttl, ctl_op);
|
||||||
BT_DBG("len %zu: %s", data_len, bt_hex(data, data_len));
|
BT_DBG("len %zu: %s", data_len, bt_hex(data, data_len));
|
||||||
|
|
||||||
if (data_len <= 11) {
|
if (data_len <= 11) {
|
||||||
return ctl_send_unseg(tx, ctl_op, data, data_len, seq_auth,
|
return ctl_send_unseg(tx, ctl_op, data, data_len,
|
||||||
cb, cb_data);
|
cb, cb_data);
|
||||||
} else {
|
} else {
|
||||||
return ctl_send_seg(tx, ctl_op, data, data_len, seq_auth,
|
return ctl_send_seg(tx, ctl_op, data, data_len,
|
||||||
cb, cb_data);
|
cb, cb_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1250,7 +1250,7 @@ static int send_ack(struct bt_mesh_subnet *sub, u16_t src, u16_t dst,
|
||||||
sys_put_be32(block, &buf[2]);
|
sys_put_be32(block, &buf[2]);
|
||||||
|
|
||||||
return bt_mesh_ctl_send(&tx, TRANS_CTL_OP_ACK, buf, sizeof(buf),
|
return bt_mesh_ctl_send(&tx, TRANS_CTL_OP_ACK, buf, sizeof(buf),
|
||||||
NULL, NULL, NULL);
|
NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void seg_rx_reset(struct seg_rx *rx, bool full_reset)
|
static void seg_rx_reset(struct seg_rx *rx, bool full_reset)
|
||||||
|
@ -1898,7 +1898,7 @@ void bt_mesh_heartbeat_send(void)
|
||||||
BT_INFO("InitTTL %u feat 0x%04x", cfg->hb_pub.ttl, feat);
|
BT_INFO("InitTTL %u feat 0x%04x", cfg->hb_pub.ttl, feat);
|
||||||
|
|
||||||
bt_mesh_ctl_send(&tx, TRANS_CTL_OP_HEARTBEAT, &hb, sizeof(hb),
|
bt_mesh_ctl_send(&tx, TRANS_CTL_OP_HEARTBEAT, &hb, sizeof(hb),
|
||||||
NULL, NULL, NULL);
|
NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
int bt_mesh_app_key_get(const struct bt_mesh_subnet *subnet, u16_t app_idx,
|
int bt_mesh_app_key_get(const struct bt_mesh_subnet *subnet, u16_t app_idx,
|
||||||
|
|
|
@ -100,8 +100,8 @@ void bt_mesh_rx_reset_single(u16_t src);
|
||||||
void bt_mesh_tx_reset_single(u16_t dst);
|
void bt_mesh_tx_reset_single(u16_t dst);
|
||||||
|
|
||||||
int bt_mesh_ctl_send(struct bt_mesh_net_tx *tx, u8_t ctl_op, void *data,
|
int bt_mesh_ctl_send(struct bt_mesh_net_tx *tx, u8_t ctl_op, void *data,
|
||||||
size_t data_len, u64_t *seq_auth,
|
size_t data_len, const struct bt_mesh_send_cb *cb,
|
||||||
const struct bt_mesh_send_cb *cb, void *cb_data);
|
void *cb_data);
|
||||||
|
|
||||||
int bt_mesh_trans_send(struct bt_mesh_net_tx *tx, struct net_buf_simple *msg,
|
int bt_mesh_trans_send(struct bt_mesh_net_tx *tx, struct net_buf_simple *msg,
|
||||||
const struct bt_mesh_send_cb *cb, void *cb_data);
|
const struct bt_mesh_send_cb *cb, void *cb_data);
|
||||||
|
|
Loading…
Reference in a new issue