Lines Matching full:rx
522 static bool is_replay(struct bt_mesh_net_rx *rx) in is_replay() argument
527 if (rx->net_if == BT_MESH_NET_IF_LOCAL) { in is_replay()
536 rpl->src = rx->ctx.addr; in is_replay()
537 rpl->seq = rx->seq; in is_replay()
538 rpl->old_iv = rx->old_iv; in is_replay()
548 if (rpl->src == rx->ctx.addr) { in is_replay()
549 if (rx->old_iv && !rpl->old_iv) { in is_replay()
553 if ((!rx->old_iv && rpl->old_iv) || in is_replay()
554 rpl->seq < rx->seq) { in is_replay()
555 rpl->seq = rx->seq; in is_replay()
556 rpl->old_iv = rx->old_iv; in is_replay()
573 static int sdu_recv(struct bt_mesh_net_rx *rx, u32_t seq, u8_t hdr, in sdu_recv() argument
591 if (IS_ENABLED(CONFIG_BT_MESH_FRIEND) && !rx->local_match) { in sdu_recv()
593 rx->ctx.recv_dst); in sdu_recv()
598 if (BT_MESH_ADDR_IS_VIRTUAL(rx->ctx.recv_dst)) { in sdu_recv()
599 ad = bt_mesh_label_uuid_get(rx->ctx.recv_dst); in sdu_recv()
610 sdu, ad, rx->ctx.addr, in sdu_recv()
611 rx->ctx.recv_dst, seq, in sdu_recv()
612 BT_MESH_NET_IVI_RX(rx)); in sdu_recv()
619 rx->ctx.app_idx = BT_MESH_KEY_DEV; in sdu_recv()
620 bt_mesh_model_recv(rx, sdu); in sdu_recv()
629 if (key->net_idx != rx->sub->net_idx) { in sdu_recv()
633 if (rx->new_key && key->updated) { in sdu_recv()
646 sdu, ad, rx->ctx.addr, in sdu_recv()
647 rx->ctx.recv_dst, seq, in sdu_recv()
648 BT_MESH_NET_IVI_RX(rx)); in sdu_recv()
656 rx->ctx.app_idx = key->app_idx; in sdu_recv()
658 bt_mesh_model_recv(rx, sdu); in sdu_recv()
700 static int trans_ack(struct bt_mesh_net_rx *rx, u8_t hdr, in trans_ack() argument
718 if (IS_ENABLED(CONFIG_BT_MESH_FRIEND) && rx->friend_match) { in trans_ack()
719 BT_DBG("Ack for LPN 0x%04x of this Friend", rx->ctx.recv_dst); in trans_ack()
721 *seq_auth = SEQ_AUTH(BT_MESH_NET_IVI_RX(rx), seq_zero); in trans_ack()
729 tx = seg_tx_lookup(seq_zero, obo, rx->ctx.addr); in trans_ack()
771 static int trans_heartbeat(struct bt_mesh_net_rx *rx, in trans_heartbeat() argument
782 if (rx->ctx.recv_dst != hb_sub_dst) { in trans_heartbeat()
790 hops = (init_ttl - rx->ctx.recv_ttl + 1); in trans_heartbeat()
793 rx->ctx.addr, rx->ctx.recv_ttl, init_ttl, hops, in trans_heartbeat()
796 bt_mesh_heartbeat(rx->ctx.addr, rx->ctx.recv_dst, hops, feat); in trans_heartbeat()
801 static int ctl_recv(struct bt_mesh_net_rx *rx, u8_t hdr, in ctl_recv() argument
810 return trans_ack(rx, hdr, buf, seq_auth); in ctl_recv()
812 return trans_heartbeat(rx, buf); in ctl_recv()
816 if (!rx->local_match) { in ctl_recv()
823 return bt_mesh_friend_poll(rx, buf); in ctl_recv()
825 return bt_mesh_friend_req(rx, buf); in ctl_recv()
827 return bt_mesh_friend_clear(rx, buf); in ctl_recv()
829 return bt_mesh_friend_clear_cfm(rx, buf); in ctl_recv()
831 return bt_mesh_friend_sub_add(rx, buf); in ctl_recv()
833 return bt_mesh_friend_sub_rem(rx, buf); in ctl_recv()
839 return bt_mesh_lpn_friend_offer(rx, buf); in ctl_recv()
842 if (rx->ctx.addr == bt_mesh.lpn.frnd) { in ctl_recv()
844 return bt_mesh_lpn_friend_clear_cfm(rx, buf); in ctl_recv()
847 if (!rx->friend_cred) { in ctl_recv()
854 return bt_mesh_lpn_friend_update(rx, buf); in ctl_recv()
856 return bt_mesh_lpn_friend_sub_cfm(rx, buf); in ctl_recv()
866 static int trans_unseg(struct os_mbuf *buf, struct bt_mesh_net_rx *rx, in trans_unseg() argument
878 if (rx->local_match && is_replay(rx)) { in trans_unseg()
880 rx->ctx.addr, rx->ctx.recv_dst, rx->seq); in trans_unseg()
886 if (rx->ctl) { in trans_unseg()
887 return ctl_recv(rx, hdr, buf, seq_auth); in trans_unseg()
890 if (!rx->local_match && !rx->friend_match) { in trans_unseg()
894 return sdu_recv(rx, rx->seq, hdr, 0, buf); in trans_unseg()
898 static inline s32_t ack_timeout(struct seg_rx *rx) in ack_timeout() argument
903 if (rx->ttl == BT_MESH_TTL_DEFAULT) { in ack_timeout()
906 ttl = rx->ttl; in ack_timeout()
915 to += K_MSEC(((rx->seg_n + 1) - popcount(rx->block)) * 100); in ack_timeout()
1000 static void seg_rx_reset(struct seg_rx *rx, bool full_reset) in seg_rx_reset() argument
1002 BT_DBG("rx %p", rx); in seg_rx_reset()
1004 k_delayed_work_cancel(&rx->ack); in seg_rx_reset()
1006 if (IS_ENABLED(CONFIG_BT_MESH_FRIEND) && rx->obo && in seg_rx_reset()
1007 rx->block != BLOCK_COMPLETE(rx->seg_n)) { in seg_rx_reset()
1009 bt_mesh_friend_clear_incomplete(rx->sub, rx->src, rx->dst, in seg_rx_reset()
1010 &rx->seq_auth); in seg_rx_reset()
1013 rx->in_use = 0; in seg_rx_reset()
1020 rx->seq_auth = 0; in seg_rx_reset()
1021 rx->sub = NULL; in seg_rx_reset()
1022 rx->src = BT_MESH_ADDR_UNASSIGNED; in seg_rx_reset()
1023 rx->dst = BT_MESH_ADDR_UNASSIGNED; in seg_rx_reset()
1029 struct seg_rx *rx = ble_npl_event_get_arg(work); in seg_ack() local
1031 BT_DBG("rx %p", rx); in seg_ack()
1033 if (k_uptime_get_32() - rx->last > K_SECONDS(60)) { in seg_ack()
1035 seg_rx_reset(rx, false); in seg_ack()
1044 send_ack(rx->sub, rx->dst, rx->src, rx->ttl, &rx->seq_auth, in seg_ack()
1045 rx->block, rx->obo); in seg_ack()
1047 k_delayed_work_submit(&rx->ack, ack_timeout(rx)); in seg_ack()
1070 struct seg_rx *rx = &seg_rx[i]; in seg_rx_find() local
1072 if (rx->src != net_rx->ctx.addr || in seg_rx_find()
1073 rx->dst != net_rx->ctx.recv_dst) { in seg_rx_find()
1077 /* Return newer RX context in addition to an exact match, so in seg_rx_find()
1080 if (rx->seq_auth >= *seq_auth) { in seg_rx_find()
1081 return rx; in seg_rx_find()
1084 if (rx->in_use) { in seg_rx_find()
1091 seg_rx_reset(rx, true); in seg_rx_find()
1101 static bool seg_rx_is_valid(struct seg_rx *rx, struct bt_mesh_net_rx *net_rx, in seg_rx_is_valid() argument
1104 if (rx->hdr != *hdr || rx->seg_n != seg_n) { in seg_rx_is_valid()
1109 if (rx->src != net_rx->ctx.addr || rx->dst != net_rx->ctx.recv_dst) { in seg_rx_is_valid()
1114 if (rx->ctl != net_rx->ctl) { in seg_rx_is_valid()
1129 struct seg_rx *rx = &seg_rx[i]; in seg_rx_alloc() local
1131 if (rx->in_use) { in seg_rx_alloc()
1135 rx->in_use = 1; in seg_rx_alloc()
1136 net_buf_simple_init(rx->buf, 0); in seg_rx_alloc()
1137 rx->sub = net_rx->sub; in seg_rx_alloc()
1138 rx->ctl = net_rx->ctl; in seg_rx_alloc()
1139 rx->seq_auth = *seq_auth; in seg_rx_alloc()
1140 rx->seg_n = seg_n; in seg_rx_alloc()
1141 rx->hdr = *hdr; in seg_rx_alloc()
1142 rx->ttl = net_rx->ctx.send_ttl; in seg_rx_alloc()
1143 rx->src = net_rx->ctx.addr; in seg_rx_alloc()
1144 rx->dst = net_rx->ctx.recv_dst; in seg_rx_alloc()
1145 rx->block = 0; in seg_rx_alloc()
1147 BT_DBG("New RX context. Block Complete 0x%08x", in seg_rx_alloc()
1150 return rx; in seg_rx_alloc()
1159 struct seg_rx *rx; in trans_seg() local
1205 /* Look for old RX sessions */ in trans_seg()
1206 rx = seg_rx_find(net_rx, seq_auth); in trans_seg()
1207 if (rx) { in trans_seg()
1209 if (rx->seq_auth > *seq_auth) { in trans_seg()
1214 if (!seg_rx_is_valid(rx, net_rx, hdr, seg_n)) { in trans_seg()
1218 if (rx->in_use) { in trans_seg()
1219 BT_DBG("Existing RX context. Block 0x%08x", rx->block); in trans_seg()
1223 if (rx->block == BLOCK_COMPLETE(rx->seg_n)) { in trans_seg()
1227 seq_auth, rx->block, rx->obo); in trans_seg()
1248 /* Look for free slot for a new RX session */ in trans_seg()
1249 rx = seg_rx_alloc(net_rx, hdr, seq_auth, seg_n); in trans_seg()
1250 if (!rx) { in trans_seg()
1259 rx->obo = net_rx->friend_match; in trans_seg()
1262 if (BIT(seg_o) & rx->block) { in trans_seg()
1273 rx->buf->om_len = seg_n * seg_len(rx->ctl) + buf->om_len; in trans_seg()
1274 BT_DBG("Target len %u * %u + %u = %u", seg_n, seg_len(rx->ctl), in trans_seg()
1275 buf->om_len, rx->buf->om_len); in trans_seg()
1277 if (rx->buf->om_len > MYNEWT_VAL(BLE_MESH_RX_SDU_MAX)) { in trans_seg()
1281 seq_auth, 0, rx->obo); in trans_seg()
1282 seg_rx_reset(rx, true); in trans_seg()
1286 if (buf->om_len != seg_len(rx->ctl)) { in trans_seg()
1293 rx->last = k_uptime_get_32(); in trans_seg()
1295 if (!k_delayed_work_remaining_get(&rx->ack) && in trans_seg()
1297 k_delayed_work_submit(&rx->ack, ack_timeout(rx)); in trans_seg()
1300 /* Location in buffer can be calculated based on seg_o & rx->ctl */ in trans_seg()
1301 memcpy(rx->buf->om_data + (seg_o * seg_len(rx->ctl)), buf->om_data, buf->om_len); in trans_seg()
1306 rx->block |= BIT(seg_o); in trans_seg()
1308 if (rx->block != BLOCK_COMPLETE(seg_n)) { in trans_seg()
1319 rx->block &= ~BIT(seg_o); in trans_seg()
1325 k_delayed_work_cancel(&rx->ack); in trans_seg()
1327 net_rx->ctx.send_ttl, seq_auth, rx->block, rx->obo); in trans_seg()
1330 err = ctl_recv(net_rx, *hdr, rx->buf, seq_auth); in trans_seg()
1332 err = sdu_recv(net_rx, (rx->seq_auth & 0xffffff), *hdr, in trans_seg()
1333 ASZMIC(hdr), rx->buf); in trans_seg()
1336 seg_rx_reset(rx, false); in trans_seg()
1341 int bt_mesh_trans_recv(struct os_mbuf *buf, struct bt_mesh_net_rx *rx) in bt_mesh_trans_recv() argument
1349 rx->friend_match = bt_mesh_friend_match(rx->sub->net_idx, in bt_mesh_trans_recv()
1350 rx->ctx.recv_dst); in bt_mesh_trans_recv()
1352 rx->friend_match = false; in bt_mesh_trans_recv()
1356 rx->ctx.addr, rx->ctx.recv_dst, rx->seq, rx->friend_match); in bt_mesh_trans_recv()
1364 bt_test_mesh_net_recv(rx->ctx.recv_ttl, rx->ctl, rx->ctx.addr, in bt_mesh_trans_recv()
1365 rx->ctx.recv_dst, buf->om_data, buf->om_len); in bt_mesh_trans_recv()
1373 bt_mesh_lpn_established() && rx->net_if == BT_MESH_NET_IF_ADV && in bt_mesh_trans_recv()
1374 (!bt_mesh_lpn_waiting_update() || !rx->friend_cred)) { in bt_mesh_trans_recv()
1388 if (!rx->local_match && !rx->friend_match) { in bt_mesh_trans_recv()
1392 err = trans_seg(buf, rx, &pdu_type, &seq_auth); in bt_mesh_trans_recv()
1394 err = trans_unseg(buf, rx, &seq_auth); in bt_mesh_trans_recv()
1411 bt_mesh_lpn_msg_received(rx); in bt_mesh_trans_recv()
1416 if (IS_ENABLED(CONFIG_BT_MESH_FRIEND) && rx->friend_match && !err) { in bt_mesh_trans_recv()
1418 bt_mesh_friend_enqueue_rx(rx, pdu_type, NULL, buf); in bt_mesh_trans_recv()
1420 bt_mesh_friend_enqueue_rx(rx, pdu_type, &seq_auth, buf); in bt_mesh_trans_recv()