Lines Matching full:link
94 #define XACT_SEG_DATA(_seg) (&link.rx.buf->om_data[20 + ((_seg - 1) * 23)])
95 #define XACT_SEG_RECV(_seg) (link.rx.seg &= ~(1 << (_seg)))
102 LINK_ACTIVE, /* Link has been opened */
133 u32_t id; /* Link ID */
179 static struct prov_link link; variable
190 if (!link.tx.buf[0]) { in buf_sent()
194 k_delayed_work_submit(&link.tx.retransmit, RETRANSMIT_TIMEOUT); in buf_sent()
205 for (i = 0; i < ARRAY_SIZE(link.tx.buf); i++) { in free_segments()
206 struct os_mbuf *buf = link.tx.buf[i]; in free_segments()
212 link.tx.buf[i] = NULL; in free_segments()
223 k_delayed_work_cancel(&link.tx.retransmit); in prov_clear_tx()
230 atomic_clear_bit(link.flags, LINK_ACTIVE); in reset_link()
239 memset(&link, 0, offsetof(struct prov_link, tx.retransmit)); in reset_link()
241 link.rx.prev_id = XACT_NVAL; in reset_link()
244 atomic_set_bit(link.flags, LOCAL_PUB_KEY); in reset_link()
248 link.rx.buf = bt_mesh_proxy_get_buf(); in reset_link()
251 link.rx.buf = rx_buf; in reset_link()
255 if (link.conf_inputs[0]) { in reset_link()
309 net_buf_add_be32(buf, link.id); in gen_prov_ack_send()
321 link.tx.start = k_uptime_get(); in send_reliable()
323 for (i = 0; i < ARRAY_SIZE(link.tx.buf); i++) { in send_reliable()
324 struct os_mbuf *buf = link.tx.buf[i]; in send_reliable()
330 if (i + 1 < ARRAY_SIZE(link.tx.buf) && link.tx.buf[i + 1]) { in send_reliable()
351 net_buf_add_be32(buf, link.id); in bearer_ctl_send()
357 link.tx.buf[0] = buf; in bearer_ctl_send()
376 if (link.tx.id != 0 && link.tx.id != 0xFF) { in next_transaction_id()
377 return ++link.tx.id; in next_transaction_id()
380 link.tx.id = 0x80; in next_transaction_id()
381 return link.tx.id; in next_transaction_id()
400 net_buf_add_be32(start, link.id); in prov_send_adv()
407 link.tx.buf[0] = start; in prov_send_adv()
416 if (seg_id >= ARRAY_SIZE(link.tx.buf)) { in prov_send_adv()
428 link.tx.buf[seg_id] = buf; in prov_send_adv()
435 net_buf_add_be32(buf, link.id); in prov_send_adv()
452 if (!link.conn_handle) { in prov_send_gatt()
457 return bt_mesh_proxy_send(link.conn_handle, BT_MESH_PROXY_PROV, msg); in prov_send_gatt()
464 if (link.conn_handle) { in prov_send()
501 link.conf_inputs[0] = data[0]; in prov_invite()
530 memcpy(&link.conf_inputs[1], &buf->om_data[1], 11); in prov_invite()
538 link.expect = PROV_START; in prov_invite()
611 memset(link.auth, 0, sizeof(link.auth)); in prov_auth()
618 memcpy(link.auth + 16 - prov->static_val_len, in prov_auth()
620 memset(link.auth, 0, sizeof(link.auth) - prov->static_val_len); in prov_auth()
654 memcpy(link.auth, str, size); in prov_auth()
655 memset(link.auth + size, 0, sizeof(link.auth) - size); in prov_auth()
666 sys_put_be32(num, &link.auth[12]); in prov_auth()
667 memset(link.auth, 0, 12); in prov_auth()
687 atomic_set_bit(link.flags, WAIT_STRING); in prov_auth()
689 atomic_set_bit(link.flags, WAIT_NUMBER); in prov_auth()
719 memcpy(&link.conf_inputs[12], data, 5); in prov_start()
721 /* TODO: reset link when auth fails? */ in prov_start()
722 link.expect = PROV_PUB_KEY; in prov_start()
736 BT_DBG("ConfInputs[0] %s", bt_hex(link.conf_inputs, 64)); in send_confirm()
737 BT_DBG("ConfInputs[64] %s", bt_hex(&link.conf_inputs[64], 64)); in send_confirm()
738 BT_DBG("ConfInputs[128] %s", bt_hex(&link.conf_inputs[128], 17)); in send_confirm()
740 if (bt_mesh_prov_conf_salt(link.conf_inputs, link.conf_salt)) { in send_confirm()
746 BT_DBG("ConfirmationSalt: %s", bt_hex(link.conf_salt, 16)); in send_confirm()
748 if (bt_mesh_prov_conf_key(link.dhkey, link.conf_salt, link.conf_key)) { in send_confirm()
754 BT_DBG("ConfirmationKey: %s", bt_hex(link.conf_key, 16)); in send_confirm()
756 if (bt_rand(link.rand, 16)) { in send_confirm()
762 BT_DBG("LocalRandom: %s", bt_hex(link.rand, 16)); in send_confirm()
766 if (bt_mesh_prov_conf(link.conf_key, link.rand, link.auth, in send_confirm()
779 link.expect = PROV_RANDOM; in send_confirm()
799 if (!atomic_test_and_clear_bit(link.flags, WAIT_NUMBER)) { in bt_mesh_input_number()
803 sys_put_be32(num, &link.auth[12]); in bt_mesh_input_number()
807 if (!atomic_test_bit(link.flags, HAVE_DHKEY)) { in bt_mesh_input_number()
811 if (atomic_test_and_clear_bit(link.flags, SEND_CONFIRM)) { in bt_mesh_input_number()
822 if (!atomic_test_and_clear_bit(link.flags, WAIT_STRING)) { in bt_mesh_input_string()
826 strncpy((char *)link.auth, str, prov->input_size); in bt_mesh_input_string()
830 if (!atomic_test_bit(link.flags, HAVE_DHKEY)) { in bt_mesh_input_string()
834 if (atomic_test_and_clear_bit(link.flags, SEND_CONFIRM)) { in bt_mesh_input_string()
851 sys_memcpy_swap(link.dhkey, key, 32); in prov_dh_key_cb()
853 BT_DBG("DHkey: %s", bt_hex(link.dhkey, 32)); in prov_dh_key_cb()
855 atomic_set_bit(link.flags, HAVE_DHKEY); in prov_dh_key_cb()
857 if (atomic_test_bit(link.flags, WAIT_NUMBER) || in prov_dh_key_cb()
858 atomic_test_bit(link.flags, WAIT_STRING)) { in prov_dh_key_cb()
862 if (atomic_test_and_clear_bit(link.flags, SEND_CONFIRM)) { in prov_dh_key_cb()
885 memcpy(&link.conf_inputs[81], &buf->om_data[1], 64); in send_pub_key()
895 sys_memcpy_swap(buf->om_data, &link.conf_inputs[17], 32); in send_pub_key()
896 sys_memcpy_swap(&buf->om_data[32], &link.conf_inputs[49], 32); in send_pub_key()
904 link.expect = PROV_CONFIRM; in send_pub_key()
914 memcpy(&link.conf_inputs[17], data, 64); in prov_pub_key()
916 if (!atomic_test_bit(link.flags, LOCAL_PUB_KEY)) { in prov_pub_key()
921 atomic_set_bit(link.flags, REMOTE_PUB_KEY); in prov_pub_key()
938 atomic_set_bit(link.flags, LOCAL_PUB_KEY); in pub_key_ready()
940 if (atomic_test_and_clear_bit(link.flags, REMOTE_PUB_KEY)) { in pub_key_ready()
954 memcpy(link.conf, data, 16); in prov_confirm()
956 if (!atomic_test_bit(link.flags, HAVE_DHKEY)) { in prov_confirm()
960 atomic_set_bit(link.flags, SEND_CONFIRM); in prov_confirm()
973 if (bt_mesh_prov_conf(link.conf_key, data, link.auth, conf_verify)) { in prov_random()
979 if (memcmp(conf_verify, link.conf, 16)) { in prov_random()
981 BT_DBG("Received: %s", bt_hex(link.conf, 16)); in prov_random()
988 net_buf_simple_add_mem(rnd, link.rand, 16); in prov_random()
996 if (bt_mesh_prov_salt(link.conf_salt, data, link.rand, in prov_random()
997 link.prov_salt)) { in prov_random()
1003 BT_DBG("ProvisioningSalt: %s", bt_hex(link.prov_salt, 16)); in prov_random()
1005 link.expect = PROV_DATA; in prov_random()
1014 return !!link.conn_handle; in is_pb_gatt()
1036 err = bt_mesh_session_key(link.dhkey, link.prov_salt, session_key); in prov_data()
1045 err = bt_mesh_prov_nonce(link.dhkey, link.prov_salt, nonce); in prov_data()
1061 err = bt_mesh_dev_key(link.dhkey, link.prov_salt, dev_key); in prov_data()
1081 /* Ignore any further PDUs on this link */ in prov_data()
1082 link.expect = 0; in prov_data()
1133 if (link.conn_handle) { in close_link()
1134 bt_mesh_pb_gatt_close(link.conn_handle); in close_link()
1144 link.rx.seg = 0; in close_link()
1148 atomic_clear_bit(link.flags, LINK_ACTIVE); in close_link()
1151 if (link.conf_inputs[0]) { in close_link()
1163 if (!atomic_test_bit(link.flags, LINK_ACTIVE)) { in prov_retransmit()
1164 BT_WARN("Link not active"); in prov_retransmit()
1168 if (k_uptime_get() - link.tx.start > TRANSACTION_TIMEOUT) { in prov_retransmit()
1174 for (i = 0; i < ARRAY_SIZE(link.tx.buf); i++) { in prov_retransmit()
1175 struct os_mbuf *buf = link.tx.buf[i]; in prov_retransmit()
1187 if (i + 1 < ARRAY_SIZE(link.tx.buf) && link.tx.buf[i + 1]) { in prov_retransmit()
1198 BT_INFO("link open: len %u", buf->om_len); in link_open()
1205 if (atomic_test_bit(link.flags, LINK_ACTIVE)) { in link_open()
1206 /* Send another link ack if the provisioner missed the last */ in link_open()
1207 if (link.id == rx->link_id && link.expect == PROV_INVITE) { in link_open()
1208 BT_DBG("Resending link ack"); in link_open()
1211 BT_WARN("Ignoring bearer open: link already active"); in link_open()
1226 link.id = rx->link_id; in link_open()
1227 atomic_set_bit(link.flags, LINK_ACTIVE); in link_open()
1228 net_buf_simple_init(link.rx.buf, 0); in link_open()
1232 link.expect = PROV_INVITE; in link_open()
1237 BT_INFO("Link ack: len %u", buf->om_len); in link_ack()
1242 BT_INFO("Link close: len %u", buf->om_len); in link_close()
1256 if (!atomic_test_bit(link.flags, LINK_ACTIVE)) { in gen_prov_ctl()
1263 if (!atomic_test_bit(link.flags, LINK_ACTIVE)) { in gen_prov_ctl()
1282 u8_t type = link.rx.buf->om_data[0]; in prov_msg_recv()
1284 BT_DBG("type 0x%02x len %u", type, link.rx.buf->om_len); in prov_msg_recv()
1286 if (!bt_mesh_fcs_check(link.rx.buf, link.rx.fcs)) { in prov_msg_recv()
1291 gen_prov_ack_send(link.rx.id); in prov_msg_recv()
1292 link.rx.prev_id = link.rx.id; in prov_msg_recv()
1293 link.rx.id = 0; in prov_msg_recv()
1295 if (type != PROV_FAILED && type != link.expect) { in prov_msg_recv()
1296 BT_WARN("Unexpected msg 0x%02x != 0x%02x", type, link.expect); in prov_msg_recv()
1307 if (1 + prov_handlers[type].len != link.rx.buf->om_len) { in prov_msg_recv()
1309 link.rx.buf->om_len, type); in prov_msg_recv()
1314 prov_handlers[type].func(&link.rx.buf->om_data[1]); in prov_msg_recv()
1323 if (!link.rx.seg && link.rx.prev_id == rx->xact_id) { in gen_prov_cont()
1329 if (rx->xact_id != link.rx.id) { in gen_prov_cont()
1331 rx->xact_id, link.rx.id); in gen_prov_cont()
1335 if (seg > link.rx.last_seg) { in gen_prov_cont()
1339 } else if (seg == link.rx.last_seg) { in gen_prov_cont()
1342 expect_len = (link.rx.buf->om_len - 20 - in gen_prov_cont()
1343 (23 * (link.rx.last_seg - 1))); in gen_prov_cont()
1352 if (!(link.rx.seg & BIT(seg))) { in gen_prov_cont()
1360 if (!link.rx.seg) { in gen_prov_cont()
1369 if (!link.tx.buf[0]) { in gen_prov_ack()
1373 if (rx->xact_id == link.tx.id) { in gen_prov_ack()
1382 if (link.rx.seg) { in gen_prov_start()
1387 if (link.rx.prev_id == rx->xact_id) { in gen_prov_start()
1393 trailing_space = OS_MBUF_TRAILINGSPACE(link.rx.buf); in gen_prov_start()
1395 link.rx.buf->om_len = net_buf_simple_pull_be16(buf); in gen_prov_start()
1396 link.rx.id = rx->xact_id; in gen_prov_start()
1397 link.rx.fcs = net_buf_simple_pull_u8(buf); in gen_prov_start()
1400 START_LAST_SEG(rx->gpc), link.rx.buf->om_len, link.rx.fcs); in gen_prov_start()
1402 if (link.rx.buf->om_len < 1) { in gen_prov_start()
1408 if (link.rx.buf->om_len > trailing_space) { in gen_prov_start()
1410 link.rx.buf->om_len); in gen_prov_start()
1415 if (START_LAST_SEG(rx->gpc) > 0 && link.rx.buf->om_len <= 20) { in gen_prov_start()
1421 link.rx.seg = (1 << (START_LAST_SEG(rx->gpc) + 1)) - 1; in gen_prov_start()
1422 link.rx.last_seg = START_LAST_SEG(rx->gpc); in gen_prov_start()
1423 memcpy(link.rx.buf->om_data, buf->om_data, buf->om_len); in gen_prov_start()
1426 if (!link.rx.seg) { in gen_prov_start()
1449 if (!atomic_test_bit(link.flags, LINK_ACTIVE) && in gen_prov_recv()
1451 BT_DBG("Ignoring message that requires active link"); in gen_prov_recv()
1479 if (atomic_test_bit(link.flags, LINK_ACTIVE) && link.id != rx.link_id) { in bt_mesh_pb_adv_recv()
1480 BT_DBG("Ignoring mesh beacon for unknown link"); in bt_mesh_pb_adv_recv()
1495 if (link.conn_handle != conn_handle) { in bt_mesh_pb_gatt_recv()
1506 if (type != PROV_FAILED && type != link.expect) { in bt_mesh_pb_gatt_recv()
1507 BT_WARN("Unexpected msg 0x%02x != 0x%02x", type, link.expect); in bt_mesh_pb_gatt_recv()
1531 if (atomic_test_and_set_bit(link.flags, LINK_ACTIVE)) { in bt_mesh_pb_gatt_open()
1532 BT_ERR("Link already opened?"); in bt_mesh_pb_gatt_open()
1536 link.conn_handle = conn_handle; in bt_mesh_pb_gatt_open()
1537 link.expect = PROV_INVITE; in bt_mesh_pb_gatt_open()
1552 if (link.conn_handle != conn_handle) { in bt_mesh_pb_gatt_close()
1558 if (link.conf_inputs[0]) { in bt_mesh_pb_gatt_close()
1568 pub_key = atomic_test_bit(link.flags, LOCAL_PUB_KEY); in bt_mesh_pb_gatt_close()
1569 memset(&link, 0, sizeof(link)); in bt_mesh_pb_gatt_close()
1572 atomic_set_bit(link.flags, LOCAL_PUB_KEY); in bt_mesh_pb_gatt_close()
1586 return atomic_test_bit(link.flags, LINK_ACTIVE); in bt_prov_active()
1614 k_delayed_work_init(&link.tx.retransmit, prov_retransmit); in bt_mesh_prov_init()
1615 link.rx.prev_id = XACT_NVAL; in bt_mesh_prov_init()
1619 link.rx.buf = rx_buf; in bt_mesh_prov_init()
1629 link.rx.buf = bt_mesh_proxy_get_buf(); in bt_mesh_prov_reset_link()
1632 link.rx.buf = rx_buf; in bt_mesh_prov_reset_link()