@@ -520,7 +520,8 @@ uint32_t mesh_net_next_seq_num(struct mesh_net *net)
{
uint32_t seq = net->seq_num++;
- /* Cap out-of-range seq_num max value to +1. Out of range
+ /*
+ * Cap out-of-range seq_num max value to +1. Out of range
* seq_nums will not be sent as they would violate spec.
* This condition signals a runaway seq_num condition, and
* the node must wait for a completed IV Index update procedure
@@ -539,9 +540,7 @@ static struct mesh_sar *mesh_sar_new(size_t len)
struct mesh_sar *sar;
sar = l_malloc(size);
-
memset(sar, 0, size);
-
return sar;
}
@@ -1372,20 +1371,18 @@ enqueue:
void *old = l_queue_remove_if(frnd->pkt_cache,
match_ack, rx);
- if (old) {
- if (old_head == old) {
- /*
- * If we are discarding head for any
- * reason, reset FRND SEQ
- */
- frnd->u.active.last =
- frnd->u.active.seq;
- }
-
- l_free(old);
- } else
+ if (!old)
break;
+ if (old_head == old)
+ /*
+ * If we are discarding head for any
+ * reason, reset FRND SEQ
+ */
+ frnd->u.active.last = frnd->u.active.seq;
+
+ l_free(old);
+
} while (true);
}
@@ -1465,6 +1462,7 @@ static bool friend_packet_queue(struct mesh_net *net,
data += 12;
hdr += (1 << SEGO_HDR_SHIFT);
}
+
frnd_msg->u.s12[seg_max].seq = seq;
frnd_msg->cnt_in = seg_max;
frnd_msg->last_len = size % 12;
@@ -1488,6 +1486,7 @@ static bool friend_packet_queue(struct mesh_net *net,
memcpy(frnd_msg->u.one[0].data, data, size);
frnd_msg->last_len = size;
}
+
frnd_msg->u.one[0].hdr = hdr;
frnd_msg->u.one[0].seq = seq;
}
@@ -1640,7 +1639,6 @@ static void inmsg_to(struct l_timeout *msg_timeout, void *user_data)
return;
sar->msg_timeout = NULL;
-
mesh_sar_free(sar);
}
@@ -2034,10 +2032,8 @@ static bool seg_rxed(struct mesh_net *net, bool frnd, uint32_t iv_index,
send_net_ack(net, sar_in, expected);
msg_rxed(net, frnd, iv_index, ttl, seq, net_idx,
- sar_in->remote, dst,
- key_aid, true, szmic,
- sar_in->seqZero,
- sar_in->buf, sar_in->len);
+ sar_in->remote, dst, key_aid, true, szmic,
+ sar_in->seqZero, sar_in->buf, sar_in->len);
/* Kill Inter-Seg timeout */
l_timeout_remove(sar_in->seg_timeout);
@@ -2080,12 +2076,8 @@ static bool ctl_received(struct mesh_net *net, uint16_t key_id,
uint32_t hdr = opcode << OPCODE_HDR_SHIFT;
uint8_t frnd_ttl = ttl - 1;
- if (friend_packet_queue(net, iv_index,
- true, frnd_ttl,
- seq,
- src, dst,
- hdr,
- pkt, len))
+ if (friend_packet_queue(net, iv_index, true, frnd_ttl, seq,
+ src, dst, hdr, pkt, len))
return true;
}
@@ -2103,10 +2095,8 @@ static bool ctl_received(struct mesh_net *net, uint16_t key_id,
return false;
print_packet("Rx-NET_OP_FRND_POLL", pkt, len);
- friend_poll(net, src, !!(pkt[0]),
- l_queue_find(net->friends,
- match_by_friend,
- L_UINT_TO_PTR(src)));
+ friend_poll(net, src, !!(pkt[0]), l_queue_find(net->friends,
+ match_by_friend, L_UINT_TO_PTR(src)));
break;
case NET_OP_FRND_REQUEST:
@@ -2142,8 +2132,7 @@ static bool ctl_received(struct mesh_net *net, uint16_t key_id,
print_packet("Rx-NET_OP_FRND_CLEAR", pkt, len);
friend_clear(net, src, l_get_be16(pkt), l_get_be16(pkt + 2),
- l_queue_find(net->friends,
- match_by_friend,
+ l_queue_find(net->friends, match_by_friend,
L_UINT_TO_PTR(l_get_be16(pkt))));
l_debug("Remaining Friends: %d", l_queue_length(net->friends));
break;
@@ -2163,9 +2152,8 @@ static bool ctl_received(struct mesh_net *net, uint16_t key_id,
return false;
print_packet("Rx-NET_OP_PROXY_SUB_REMOVE", pkt, len);
- friend_sub_del(net, l_queue_find(net->friends,
- match_by_friend, L_UINT_TO_PTR(src)),
- pkt, len);
+ friend_sub_del(net, l_queue_find(net->friends, match_by_friend,
+ L_UINT_TO_PTR(src)), pkt, len);
break;
case NET_OP_PROXY_SUB_CONFIRM:
@@ -2199,12 +2187,10 @@ static bool ctl_received(struct mesh_net *net, uint16_t key_id,
break;
}
- if (n) {
- mesh_net_transport_send(net, 0, 0,
- mesh_net_get_iv_index(net), rsp_ttl,
- 0, dst & 0x8000 ? 0 : dst, src,
- msg, n);
- }
+ if (n)
+ mesh_net_transport_send(net, 0, 0, mesh_net_get_iv_index(net),
+ rsp_ttl, 0, dst & 0x8000 ? 0 : dst,
+ src, msg, n);
return true;
}
@@ -2335,17 +2321,12 @@ static enum _relay_advice packet_received(void *user_data,
print_packet("RX: Network [clr] :", packet + 2, size);
- if (!mesh_crypto_packet_parse(packet + 2, size,
- &net_ctl, &net_ttl,
- &net_seq,
- &net_src, &net_dst,
- &cache_cookie,
- &net_opcode,
- &net_segmented,
- &net_key_id,
- &net_szmic, &net_relay, &net_seqZero,
- &net_segO, &net_segN,
- &msg, &app_msg_len)) {
+ if (!mesh_crypto_packet_parse(packet + 2, size, &net_ctl, &net_ttl,
+ &net_seq, &net_src, &net_dst,
+ &cache_cookie, &net_opcode,
+ &net_segmented, &net_key_id, &net_szmic,
+ &net_relay, &net_seqZero, &net_segO,
+ &net_segN, &msg, &app_msg_len)) {
l_error("Failed to parse packet content");
return RELAY_NONE;
}
@@ -2360,8 +2341,10 @@ static enum _relay_advice packet_received(void *user_data,
if (is_us(net, net_src, true))
return RELAY_NONE;
- /* As a Relay, suppress repeats of last N packets that pass through */
- /* The "cache_cookie" should be unique part of App message */
+ /*
+ * As a Relay, suppress repeats of last N packets that pass through
+ * The "cache_cookie" should be unique part of App message.
+ */
if (msg_in_cache(net, net_src, net_seq, cache_cookie))
return RELAY_NONE;
@@ -2388,57 +2371,48 @@ static enum _relay_advice packet_received(void *user_data,
/* If this is an ACK to our friend queue-only */
if (is_lpn_friend(net, net_dst))
friend_ack_rxed(net, iv_index, net_seq,
- net_src, net_dst,
- msg);
+ net_src, net_dst, msg);
else
ack_received(net, false,
net_src, net_dst,
net_seqZero,
l_get_be32(msg + 3));
} else {
- ctl_received(net, key_id,
- iv_index,
- net_ttl, net_seq, net_src,
- net_dst, net_opcode, rssi,
- msg, app_msg_len);
+ ctl_received(net, key_id, iv_index, net_ttl,
+ net_seq, net_src, net_dst,
+ net_opcode, rssi, msg,
+ app_msg_len);
}
} else if (net_segmented) {
- /* If we accept SAR packets to non-Unicast, then
+ /*
+ * If we accept SAR packets to non-Unicast, then
* Friend Sar at least needs to be Unicast Only
*/
if (is_lpn_friend(net, net_dst) &&
!(net_dst & 0x8000)) {
- /* Check TTL >= 2 before accepting segments
+ /*
+ * Check TTL >= 2 before accepting segments
* for Friends
*/
if (net_ttl >= 2) {
- friend_seg_rxed(net, iv_index,
- net_ttl, net_seq,
- net_src, net_dst,
+ friend_seg_rxed(net, iv_index, net_ttl,
+ net_seq, net_src, net_dst,
l_get_be32(packet + 2 + 9),
msg, app_msg_len);
}
} else {
seg_rxed(net, NULL, iv_index, net_ttl,
- net_seq, net_idx,
- net_src, net_dst,
- net_key_id,
- net_szmic, net_seqZero,
- net_segO, net_segN,
+ net_seq, net_idx, net_src,
+ net_dst, net_key_id, net_szmic,
+ net_seqZero, net_segO, net_segN,
msg, app_msg_len);
}
} else {
- msg_rxed(net, NULL,
- iv_index,
- net_ttl,
- net_seq,
- net_idx,
- net_src, net_dst,
- net_key_id,
- false, false,
- net_seq & SEQ_ZERO_MASK,
- msg, app_msg_len);
+ msg_rxed(net, NULL, iv_index, net_ttl, net_seq, net_idx,
+ net_src, net_dst, net_key_id, false,
+ false, net_seq & SEQ_ZERO_MASK, msg,
+ app_msg_len);
}
/* If this is one of our Unicast addresses, disallow relay */
@@ -2495,8 +2469,8 @@ static void net_rx(void *net_ptr, void *user_data)
rssi = data->info->rssi;
}
- relay_advice = packet_received(net, key_id, iv_index,
- out, out_size, rssi);
+ relay_advice = packet_received(net, key_id, iv_index, out, out_size,
+ rssi);
if (relay_advice > data->relay_advice) {
data->iv_index = iv_index;
data->relay_advice = relay_advice;
@@ -2560,6 +2534,7 @@ static void iv_upd_to(struct l_timeout *upd_timeout, void *user_data)
l_debug("iv_upd_state = IV_UPD_NORMAL_HOLD");
net->iv_upd_state = IV_UPD_NORMAL_HOLD;
l_timeout_modify(net->iv_update_timeout, IV_IDX_UPD_MIN);
+
if (net->iv_update)
mesh_net_set_seq_num(net, 0);
@@ -2578,10 +2553,12 @@ static void iv_upd_to(struct l_timeout *upd_timeout, void *user_data)
net->iv_update_timeout = NULL;
l_debug("iv_upd_state = IV_UPD_NORMAL");
net->iv_upd_state = IV_UPD_NORMAL;
+
if (net->iv_update)
mesh_net_set_seq_num(net, 0);
net->iv_update = false;
+
if (net->seq_num > IV_UPDATE_SEQ_TRIGGER)
mesh_net_iv_index_update(net);
break;
@@ -2605,7 +2582,8 @@ static int key_refresh_phase_two(struct mesh_net *net, uint16_t idx)
l_debug("Key refresh procedure phase 2: start using new net TX keys");
subnet->key_refresh = 1;
subnet->net_key_tx = subnet->net_key_upd;
- /* TODO: Provisioner may need to stay in phase three until
+ /*
+ * TODO: Provisioner may need to stay in phase three until
* it hears beacons from all the nodes
*/
subnet->kr_phase = KEY_REFRESH_PHASE_TWO;
@@ -2686,7 +2664,8 @@ static void update_iv_ivu_state(struct mesh_net *net, uint32_t iv_index,
if (iv_index == net->iv_index && !net->iv_update)
return;
- /* Other devices will be accepting old or new iv_index,
+ /*
+ * Other devices will be accepting old or new iv_index,
* but we don't know how far through update they are.
* Starting permissive state will allow us maximum
* (96 hours) to resync
@@ -2694,7 +2673,7 @@ static void update_iv_ivu_state(struct mesh_net *net, uint32_t iv_index,
l_debug("iv_upd_state = IV_UPD_UPDATING");
net->iv_upd_state = IV_UPD_UPDATING;
net->iv_update_timeout = l_timeout_create(
- IV_IDX_UPD_MIN, iv_upd_to, net, NULL);
+ IV_IDX_UPD_MIN, iv_upd_to, net, NULL);
} else {
l_debug("iv_upd_state = IV_UPD_NORMAL");
net->iv_upd_state = IV_UPD_NORMAL;
@@ -2771,8 +2750,8 @@ static void process_beacon(void *net_ptr, void *user_data)
* Ignore the beacon if it doesn't change anything, unless we're
* doing IV Recovery
*/
- if (net->iv_upd_state == IV_UPD_INIT ||
- ivi != net->iv_index || ivu != net->iv_update)
+ if (net->iv_upd_state == IV_UPD_INIT || ivi != net->iv_index ||
+ ivu != net->iv_update)
update_iv_ivu_state(net, ivi, ivu);
if (kr != local_kr)
@@ -2879,6 +2858,7 @@ bool mesh_net_set_key(struct mesh_net *net, uint16_t idx, const uint8_t *key,
if (phase == KEY_REFRESH_PHASE_TWO) {
subnet->key_refresh = 1;
subnet->net_key_tx = subnet->net_key_upd;
+
if (net->beacon_enable) {
/* Switch beaconing key */
net_key_beacon_disable(subnet->net_key_cur);
@@ -2958,6 +2938,7 @@ bool mesh_net_iv_index_update(struct mesh_net *net)
l_debug("iv_upd_state = IV_UPD_UPDATING");
mesh_net_flush_msg_queues(net);
+
if (!mesh_config_write_iv_index(node_config_get(net->node),
net->iv_index + 1, true))
return false;
@@ -3077,7 +3058,7 @@ static bool send_seg(struct mesh_net *net, struct mesh_sar *msg, uint8_t segO)
return false;
if (!net_key_encrypt(subnet->net_key_tx, msg->iv_index, packet + 1,
- packet_len)) {
+ packet_len)) {
l_error("Failed to encode packet");
return false;
}
@@ -3090,12 +3071,9 @@ static bool send_seg(struct mesh_net *net, struct mesh_sar *msg, uint8_t segO)
}
void mesh_net_send_seg(struct mesh_net *net, uint32_t net_key_id,
- uint32_t iv_index,
- uint8_t ttl,
- uint32_t seq,
- uint16_t src, uint16_t dst,
- uint32_t hdr,
- const void *seg, uint16_t seg_len)
+ uint32_t iv_index, uint8_t ttl, uint32_t seq,
+ uint16_t src, uint16_t dst, uint32_t hdr,
+ const void *seg, uint16_t seg_len)
{
uint8_t packet[30];
uint8_t packet_len;
@@ -3112,15 +3090,10 @@ void mesh_net_send_seg(struct mesh_net *net, uint32_t net_key_id,
l_debug("SEQ0: %6.6x", seq);
l_debug("segO: %d", segO);
- if (!mesh_crypto_packet_build(false, ttl,
- seq,
- src, dst,
- 0,
- segmented, app_key_id,
- szmic, false, seqZero,
- segO, segN,
- seg, seg_len,
- packet + 1, &packet_len)) {
+ if (!mesh_crypto_packet_build(false, ttl, seq, src, dst, 0,
+ segmented, app_key_id, szmic, false,
+ seqZero, segO, segN, seg, seg_len,
+ packet + 1, &packet_len)) {
l_error("Failed to build packet");
return;
}
@@ -3166,12 +3139,8 @@ bool mesh_net_app_send(struct mesh_net *net, bool frnd_cred, uint16_t src,
segmented |= !!(seg_max);
/* First enqueue to any Friends and internal models */
- result = msg_rxed(net, false, iv_index, ttl,
- seq,
- net_idx,
- src, dst,
- key_aid, segmented,
- szmic, seq & SEQ_ZERO_MASK,
+ result = msg_rxed(net, false, iv_index, ttl, seq, net_idx, src, dst,
+ key_aid, segmented, szmic, seq & SEQ_ZERO_MASK,
msg, msg_len);
/*
@@ -3203,7 +3172,7 @@ bool mesh_net_app_send(struct mesh_net *net, bool frnd_cred, uint16_t src,
payload->id = ++net->sar_id_next;
/* Single thread SAR messages to same Unicast DST */
- if (NULL != l_queue_find(net->sar_out, match_sar_remote,
+ if (l_queue_find(net->sar_out, match_sar_remote,
L_UINT_TO_PTR(dst))) {
/* Delay sending Outbound SAR unless prior
* SAR to same DST has completed */
@@ -3242,13 +3211,9 @@ bool mesh_net_app_send(struct mesh_net *net, bool frnd_cred, uint16_t src,
return result;
}
-void mesh_net_ack_send(struct mesh_net *net, uint32_t key_id,
- uint32_t iv_index,
- uint8_t ttl,
- uint32_t seq,
- uint16_t src, uint16_t dst,
- bool rly, uint16_t seqZero,
- uint32_t ack_flags)
+void mesh_net_ack_send(struct mesh_net *net, uint32_t key_id, uint32_t iv_index,
+ uint8_t ttl, uint32_t seq, uint16_t src, uint16_t dst,
+ bool rly, uint16_t seqZero, uint32_t ack_flags)
{
uint32_t hdr;
uint8_t data[7];
@@ -3260,18 +3225,13 @@ void mesh_net_ack_send(struct mesh_net *net, uint32_t key_id,
hdr |= (seqZero & SEQ_ZERO_MASK) << SEQ_ZERO_HDR_SHIFT;
l_put_be32(hdr, data);
l_put_be32(ack_flags, data + 3);
- if (!mesh_crypto_packet_build(true, ttl,
- seq,
- src, dst,
- NET_OP_SEG_ACKNOWLEDGE,
- false, /* Not Segmented */
- 0, /* No Key ID associated */
- false, rly, seqZero,
- 0, 0, /* no segO or segN */
- data + 1, 6,
- pkt + 1, &pkt_len)) {
+
+ /* Not Segmented, no Key ID associated, no segO or segN */
+ if (!mesh_crypto_packet_build(true, ttl, seq, src, dst,
+ NET_OP_SEG_ACKNOWLEDGE, false, 0, false,
+ rly, seqZero, 0, 0, data + 1, 6,
+ pkt + 1, &pkt_len))
return;
- }
if (!key_id) {
struct mesh_subnet *subnet = get_primary_subnet(net);
@@ -3323,24 +3283,17 @@ void mesh_net_transport_send(struct mesh_net *net, uint32_t key_id,
uint32_t hdr = msg[0] << OPCODE_HDR_SHIFT;
uint8_t frnd_ttl = ttl;
- if (friend_packet_queue(net, iv_index,
- true, frnd_ttl,
- mesh_net_next_seq_num(net),
- src, dst,
- hdr,
- msg + 1, msg_len - 1)) {
+ if (friend_packet_queue(net, iv_index, true, frnd_ttl,
+ mesh_net_next_seq_num(net), src, dst,
+ hdr, msg + 1, msg_len - 1))
return;
- }
}
/* Deliver to Local entities if applicable */
- if (!(dst & 0x8000) && src >= net->src_addr && src <= net->last_addr) {
- result = ctl_received(net, key_id,
- iv_index, ttl,
- mesh_net_next_seq_num(net),
- src, dst,
+ if (!(dst & 0x8000) && src >= net->src_addr && src <= net->last_addr)
+ result = ctl_received(net, key_id, iv_index, ttl,
+ mesh_net_next_seq_num(net), src, dst,
msg[0], 0, msg + 1, msg_len - 1);
- }
if (!key_id) {
struct mesh_subnet *subnet = l_queue_find(net->subnets,
@@ -3355,15 +3308,9 @@ void mesh_net_transport_send(struct mesh_net *net, uint32_t key_id,
return;
}
- if (!mesh_crypto_packet_build(true, ttl,
- use_seq,
- src, dst,
- msg[0],
- false, 0,
- false, false, 0,
- 0, 0,
- msg + 1, msg_len - 1,
- pkt + 1, &pkt_len))
+ if (!mesh_crypto_packet_build(true, ttl, use_seq, src, dst, msg[0],
+ false, 0, false, false, 0, 0, 0, msg + 1,
+ msg_len - 1, pkt + 1, &pkt_len))
return;
if (!net_key_encrypt(key_id, iv_index, pkt + 1, pkt_len)) {
@@ -3517,7 +3464,7 @@ void mesh_net_heartbeat_send(struct mesh_net *net)
n += 2;
mesh_net_transport_send(net, 0, 0, mesh_net_get_iv_index(net),
- hb->pub_ttl, 0, 0, hb->pub_dst, msg, n);
+ hb->pub_ttl, 0, 0, hb->pub_dst, msg, n);
}
void mesh_net_heartbeat_init(struct mesh_net *net)
@@ -3575,7 +3522,7 @@ uint16_t mesh_net_get_primary_idx(struct mesh_net *net)
uint32_t mesh_net_friend_timeout(struct mesh_net *net, uint16_t addr)
{
struct mesh_friend *frnd = l_queue_find(net->friends, match_by_friend,
- L_UINT_TO_PTR(addr));
+ L_UINT_TO_PTR(addr));
if (!frnd)
return 0;