n += 2;
seq = mesh_net_next_seq_num(neg->net);
print_packet("Tx-NET_OP_FRND_OFFER", msg, n);
- mesh_net_transport_send(neg->net, key_id,
+ mesh_net_transport_send(neg->net, key_id, 0,
mesh_net_get_iv_index(neg->net), 0,
seq, 0, neg->lp_addr,
msg, n);
l_put_be16(lpn, msg + 1);
l_put_be16(lpnCounter, msg + 3);
- mesh_net_transport_send(net, 0,
+ mesh_net_transport_send(net, 0, 0,
mesh_net_get_iv_index(net), DEFAULT_TTL,
0, 0, src,
msg, sizeof(msg));
l_put_be16(neg->lp_addr, msg + 1);
l_put_be16(neg->lp_cnt, msg + 3);
- mesh_net_transport_send(neg->net, 0,
+ mesh_net_transport_send(neg->net, 0, 0,
mesh_net_get_iv_index(neg->net), DEFAULT_TTL,
0, 0, neg->old_friend,
msg, sizeof(msg));
pkt->u.one[0].data, pkt->last_len);
pkt->u.one[0].sent = true;
- mesh_net_transport_send(net, frnd->net_key_cur,
+ mesh_net_transport_send(net, frnd->net_key_cur, 0,
pkt->iv_index, pkt->ttl,
pkt->u.one[0].seq, pkt->src, pkt->dst,
pkt->u.one[0].data, pkt->last_len);
l_put_be32(iv_index, upd + 2);
upd[6] = false; /* Queue is Empty */
print_packet("Update", upd, sizeof(upd));
- mesh_net_transport_send(net, frnd->net_key_cur,
+ mesh_net_transport_send(net, frnd->net_key_cur, 0,
mesh_net_get_iv_index(net), 0,
net_seq, 0, frnd->lp_addr,
upd, sizeof(upd));
neg->u.negotiate.clearing = true;
l_put_be16(neg->lp_addr, msg + 1);
l_put_be16(neg->lp_cnt, msg + 3);
- mesh_net_transport_send(net, 0,
+ mesh_net_transport_send(net, 0, 0,
mesh_net_get_iv_index(net), DEFAULT_TTL,
0, 0, neg->old_friend,
msg, sizeof(msg));
print_packet("Tx-NET_OP_PROXY_SUB_CONFIRM", msg, sizeof(msg));
net_seq = mesh_net_get_seq_num(net);
- mesh_net_transport_send(net, frnd->net_key_cur,
+ mesh_net_transport_send(net, frnd->net_key_cur, 0,
mesh_net_get_iv_index(net), 0,
net_seq, 0, frnd->lp_addr,
msg, sizeof(msg));
print_packet("Tx-NET_OP_PROXY_SUB_CONFIRM", msg, sizeof(msg));
net_seq = mesh_net_get_seq_num(net);
- mesh_net_transport_send(net, frnd->net_key_cur,
+ mesh_net_transport_send(net, frnd->net_key_cur, 0,
mesh_net_get_iv_index(net), 0,
net_seq, 0, frnd->lp_addr,
msg, sizeof(msg));
uint32_t seqAuth;
uint16_t seqZero;
uint16_t app_idx;
+ uint16_t net_idx;
uint16_t src;
uint16_t remote;
uint16_t len;
friend_ack_rxed(net, mesh_net_get_iv_index(net),
mesh_net_next_seq_num(net), 0, dst, msg);
} else {
- mesh_net_transport_send(net, 0,
+ mesh_net_transport_send(net, 0, 0,
mesh_net_get_iv_index(net), DEFAULT_TTL,
0, 0, dst, msg, sizeof(msg));
}
return;
}
- mesh_net_transport_send(net, 0,
+ mesh_net_transport_send(net, 0, sar->net_idx,
mesh_net_get_iv_index(net), DEFAULT_TTL,
- 0, src, dst, msg, sizeof(msg));
+ 0, src, dst, msg,
+ sizeof(msg));
}
static void inseg_to(struct l_timeout *seg_timeout, void *user_data)
sar_in->key_aid = key_aid;
sar_in->len = len;
sar_in->last_seg = 0xff;
+ sar_in->net_idx = net_idx;
sar_in->msg_timeout = l_timeout_create(MSG_TO,
inmsg_to, net, NULL);
}
if (n) {
- mesh_net_transport_send(net, 0,
+ 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;
}
-/* TODO: add net key index */
static bool send_seg(struct mesh_net *net, struct mesh_sar *msg, uint8_t segO)
{
struct mesh_subnet *subnet;
uint8_t packet_len;
uint8_t segN = SEG_MAX(msg->segmented, msg->len);
uint16_t seg_off = SEG_OFF(segO);
- uint32_t key_id = 0;
uint32_t seq_num;
if (msg->segmented) {
}
print_packet("Clr-Net Tx", packet + 1, packet_len);
- subnet = get_primary_subnet(net);
- key_id = subnet->net_key_tx;
+ subnet = l_queue_find(net->subnets, match_key_index,
+ L_UINT_TO_PTR(msg->net_idx));
+ if (!subnet)
+ return false;
- if (!net_key_encrypt(key_id, msg->iv_index, packet + 1, packet_len)) {
+ if (!net_key_encrypt(subnet->net_key_tx, msg->iv_index, packet + 1,
+ packet_len)) {
l_error("Failed to encode packet");
return false;
}
payload->szmic = szmic;
payload->frnd_cred = frnd_cred;
payload->key_aid = key_aid;
+ payload->net_idx = net_idx;
payload->iv_index = mesh_net_get_iv_index(net);
payload->seqAuth = seq;
payload->segmented = segmented;
l_free(str);
}
-/* TODO: add net key index */
void mesh_net_transport_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,
- const uint8_t *msg, uint16_t msg_len)
+ uint16_t net_idx, uint32_t iv_index,
+ uint8_t ttl, uint32_t seq, uint16_t src,
+ uint16_t dst, const uint8_t *msg,
+ uint16_t msg_len)
{
uint32_t use_seq = seq;
uint8_t pkt_len;
}
if (!key_id) {
- struct mesh_subnet *subnet = get_primary_subnet(net);
+ struct mesh_subnet *subnet = l_queue_find(net->subnets,
+ match_key_index, L_UINT_TO_PTR(net_idx));
+ if (!subnet)
+ return;
key_id = subnet->net_key_tx;
use_seq = mesh_net_next_seq_num(net);
l_put_be16(hb->features, msg + n);
n += 2;
- mesh_net_transport_send(net, 0, mesh_net_get_iv_index(net),
+ mesh_net_transport_send(net, 0, 0, mesh_net_get_iv_index(net),
hb->pub_ttl, 0, 0, hb->pub_dst, msg, n);
}
bool mesh_net_flush(struct mesh_net *net);
void mesh_net_transport_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,
- const uint8_t *msg, uint16_t msg_len);
+ uint16_t net_idx, uint32_t iv_index,
+ uint8_t ttl, uint32_t seq, uint16_t src,
+ uint16_t dst, const uint8_t *msg,
+ uint16_t msg_len);
bool mesh_net_app_send(struct mesh_net *net, bool frnd_cred, uint16_t src,
uint16_t dst, uint8_t key_id, uint16_t net_idx,