1
2
3
9
10
17
18
28
29
34
35
36
37
38
39
40
49
50
51
52
55
56
57
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
85
86
87
90
91
92
93
94
115
116
132
133
/* ... */
#include <string.h>
#include <errno.h>
#include "mesh/config.h"
#include "mesh/trace.h"
#include "mesh.h"
#include "settings.h"6 includes
void bt_mesh_update_rpl(struct bt_mesh_rpl *rpl, struct bt_mesh_net_rx *rx)
{
rpl->src = rx->ctx.addr;
rpl->seq = rx->seq;
rpl->old_iv = rx->old_iv;
if (IS_ENABLED(CONFIG_BLE_MESH_SETTINGS)) {
bt_mesh_store_rpl(rpl);
}{...}
}{ ... }
/* ... */
static bool rpl_check_and_store(struct bt_mesh_net_rx *rx, struct bt_mesh_rpl **match)
{
for (size_t i = 0; i < ARRAY_SIZE(bt_mesh.rpl); i++) {
struct bt_mesh_rpl *rpl = &bt_mesh.rpl[i];
if (rpl->src == BLE_MESH_ADDR_UNASSIGNED) {
if (match) {
*match = rpl;
}{...} else {
bt_mesh_update_rpl(rpl, rx);
}{...}
return false;
}{...}
if (rpl->src == rx->ctx.addr) {
if (rx->old_iv && !rpl->old_iv) {
return true;
}{...}
if ((!rx->old_iv && rpl->old_iv) ||
rpl->seq < rx->seq) {
if (match) {
*match = rpl;
}{...} else {
bt_mesh_update_rpl(rpl, rx);
}{...}
return false;
}{...}
#if CONFIG_BLE_MESH_NOT_RELAY_REPLAY_MSG
rx->replay_msg = 1;
#endif
return true;
}{...}
}{...}
BT_ERR("RPL is full!");
return true;
}{ ... }
bool bt_mesh_rpl_check(struct bt_mesh_net_rx *rx, struct bt_mesh_rpl **match)
{
if (rx->net_if == BLE_MESH_NET_IF_LOCAL) {
return false;
}{...}
if (!rx->local_match) {
return false;
}{...}
return rpl_check_and_store(rx, match);
}{ ... }
void bt_mesh_rpl_update(void)
{
/* ... */
for (size_t i = 0; i < ARRAY_SIZE(bt_mesh.rpl); i++) {
struct bt_mesh_rpl *rpl = &bt_mesh.rpl[i];
if (rpl->src) {
if (rpl->old_iv) {
(void)memset(rpl, 0, sizeof(*rpl));
}{...} else {
rpl->old_iv = true;
}{...}
if (IS_ENABLED(CONFIG_BLE_MESH_SETTINGS)) {
bt_mesh_store_rpl(rpl);
}{...}
}{...}
}{...}
}{ ... }
void bt_mesh_rpl_reset_single(uint16_t src, bool erase)
{
if (!BLE_MESH_ADDR_IS_UNICAST(src)) {
return;
}{...}
for (size_t i = 0; i < ARRAY_SIZE(bt_mesh.rpl); i++) {
if (src == bt_mesh.rpl[i].src) {
memset(&bt_mesh.rpl[i], 0, sizeof(struct bt_mesh_rpl));
if (IS_ENABLED(CONFIG_BLE_MESH_SETTINGS) && erase) {
bt_mesh_clear_rpl_single(src);
}{...}
}{...}
}{...}
}{ ... }
void bt_mesh_rpl_reset(bool erase)
{
(void)memset(bt_mesh.rpl, 0, sizeof(bt_mesh.rpl));
if (IS_ENABLED(CONFIG_BLE_MESH_SETTINGS) && erase) {
bt_mesh_clear_rpl();
}{...}
}{ ... }