mesh: Clean up style in net.c

This commit is contained in:
Inga Stotland 2020-05-30 21:41:27 -07:00 committed by Brian Gix
parent c0013ccdb1
commit 962a759e9d

View File

@ -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;