Lines Matching full:tx

61 #define SEG_RETRANSMIT_TIMEOUT(tx) (K_MSEC(400) + 50 * (tx)->ttl)  argument
106 static int send_unseg(struct bt_mesh_net_tx *tx, struct os_mbuf *sdu, in send_unseg() argument
112 tx->src, tx->ctx->addr, tx->ctx->app_idx, sdu->om_len); in send_unseg()
114 buf = bt_mesh_adv_create(BT_MESH_ADV_DATA, tx->xmit, BUF_TIMEOUT); in send_unseg()
122 if (tx->ctx->app_idx == BT_MESH_KEY_DEV) { in send_unseg()
125 net_buf_add_u8(buf, UNSEG_HDR(1, tx->aid)); in send_unseg()
131 if (bt_mesh_friend_enqueue_tx(tx, BT_MESH_FRIEND_PDU_SINGLE, in send_unseg()
133 BT_MESH_ADDR_IS_UNICAST(tx->ctx->addr)) { in send_unseg()
142 return bt_mesh_net_send(tx, buf, cb, cb_data); in send_unseg()
158 static void seg_tx_reset(struct seg_tx *tx) in seg_tx_reset() argument
162 k_delayed_work_cancel(&tx->retransmit); in seg_tx_reset()
164 tx->cb = NULL; in seg_tx_reset()
165 tx->cb_data = NULL; in seg_tx_reset()
166 tx->seq_auth = 0; in seg_tx_reset()
167 tx->sub = NULL; in seg_tx_reset()
168 tx->dst = BT_MESH_ADDR_UNASSIGNED; in seg_tx_reset()
170 if (!tx->nack_count) { in seg_tx_reset()
174 for (i = 0; i <= tx->seg_n; i++) { in seg_tx_reset()
175 if (!tx->seg[i]) { in seg_tx_reset()
179 net_buf_unref(tx->seg[i]); in seg_tx_reset()
180 tx->seg[i] = NULL; in seg_tx_reset()
183 tx->nack_count = 0; in seg_tx_reset()
197 static inline void seg_tx_complete(struct seg_tx *tx, int err) in seg_tx_complete() argument
199 if (tx->cb && tx->cb->end) { in seg_tx_complete()
200 tx->cb->end(err, tx->cb_data); in seg_tx_complete()
203 seg_tx_reset(tx); in seg_tx_complete()
208 struct seg_tx *tx = user_data; in seg_first_send_start() local
210 if (tx->cb && tx->cb->start) { in seg_first_send_start()
211 tx->cb->start(duration, err, tx->cb_data); in seg_first_send_start()
217 struct seg_tx *tx = user_data; in seg_send_start() local
224 k_delayed_work_submit(&tx->retransmit, in seg_send_start()
225 SEG_RETRANSMIT_TIMEOUT(tx)); in seg_send_start()
231 struct seg_tx *tx = user_data; in seg_sent() local
233 k_delayed_work_submit(&tx->retransmit, in seg_sent()
234 SEG_RETRANSMIT_TIMEOUT(tx)); in seg_sent()
247 static void seg_tx_send_unacked(struct seg_tx *tx) in seg_tx_send_unacked() argument
251 for (i = 0; i <= tx->seg_n; i++) { in seg_tx_send_unacked()
252 struct os_mbuf *seg = tx->seg[i]; in seg_tx_send_unacked()
265 seg_tx_complete(tx, -ETIMEDOUT); in seg_tx_send_unacked()
269 BT_DBG("resending %u/%u", i, tx->seg_n); in seg_tx_send_unacked()
271 err = bt_mesh_net_resend(tx->sub, seg, tx->new_key, in seg_tx_send_unacked()
272 &seg_sent_cb, tx); in seg_tx_send_unacked()
275 seg_tx_complete(tx, -EIO); in seg_tx_send_unacked()
283 struct seg_tx *tx = ble_npl_event_get_arg(work); in seg_retransmit() local
284 seg_tx_send_unacked(tx); in seg_retransmit()
292 struct seg_tx *tx; in send_seg() local
309 for (tx = NULL, i = 0; i < ARRAY_SIZE(seg_tx); i++) { in send_seg()
311 tx = &seg_tx[i]; in send_seg()
316 if (!tx) { in send_seg()
328 tx->dst = net_tx->ctx->addr; in send_seg()
329 tx->seg_n = (sdu->om_len - 1) / 12; in send_seg()
330 tx->nack_count = tx->seg_n + 1; in send_seg()
331 tx->seq_auth = SEQ_AUTH(BT_MESH_NET_IVI_TX, bt_mesh.seq); in send_seg()
332 tx->sub = net_tx->sub; in send_seg()
333 tx->new_key = net_tx->sub->kr_flag; in send_seg()
334 tx->cb = cb; in send_seg()
335 tx->cb_data = cb_data; in send_seg()
338 tx->ttl = bt_mesh_default_ttl_get(); in send_seg()
340 tx->ttl = net_tx->ctx->send_ttl; in send_seg()
343 seq_zero = tx->seq_auth & 0x1fff; in send_seg()
356 seg_tx_reset(tx); in send_seg()
368 net_buf_add_u8(seg, ((seg_o & 0x07) << 5) | tx->seg_n); in send_seg()
374 tx->seg[seg_o] = net_buf_ref(seg); in send_seg()
379 if (seg_o == tx->seg_n) { in send_seg()
386 &tx->seq_auth, in send_seg()
397 BT_DBG("Sending %u/%u", seg_o, tx->seg_n); in send_seg()
401 tx); in send_seg()
404 seg_tx_reset(tx); in send_seg()
433 int bt_mesh_trans_send(struct bt_mesh_net_tx *tx, struct os_mbuf *msg, in bt_mesh_trans_send() argument
446 tx->ctx->send_rel = 1; in bt_mesh_trans_send()
449 BT_DBG("net_idx 0x%04x app_idx 0x%04x dst 0x%04x", tx->sub->net_idx, in bt_mesh_trans_send()
450 tx->ctx->app_idx, tx->ctx->addr); in bt_mesh_trans_send()
453 if (tx->ctx->app_idx == BT_MESH_KEY_DEV) { in bt_mesh_trans_send()
455 tx->aid = 0; in bt_mesh_trans_send()
459 app_key = bt_mesh_app_key_find(tx->ctx->app_idx); in bt_mesh_trans_send()
464 if (tx->sub->kr_phase == BT_MESH_KR_PHASE_2 && in bt_mesh_trans_send()
467 tx->aid = app_key->keys[1].id; in bt_mesh_trans_send()
470 tx->aid = app_key->keys[0].id; in bt_mesh_trans_send()
474 if (!tx->ctx->send_rel || net_buf_simple_tailroom(msg) < 8) { in bt_mesh_trans_send()
475 tx->aszmic = 0; in bt_mesh_trans_send()
477 tx->aszmic = 1; in bt_mesh_trans_send()
480 if (BT_MESH_ADDR_IS_VIRTUAL(tx->ctx->addr)) { in bt_mesh_trans_send()
481 ad = bt_mesh_label_uuid_get(tx->ctx->addr); in bt_mesh_trans_send()
486 err = bt_mesh_app_encrypt(key, tx->ctx->app_idx == BT_MESH_KEY_DEV, in bt_mesh_trans_send()
487 tx->aszmic, msg, ad, tx->src, in bt_mesh_trans_send()
488 tx->ctx->addr, bt_mesh.seq, in bt_mesh_trans_send()
494 if (tx->ctx->send_rel) { in bt_mesh_trans_send()
495 err = send_seg(tx, msg, cb, cb_data); in bt_mesh_trans_send()
497 err = send_unseg(tx, msg, cb, cb_data); in bt_mesh_trans_send()
503 int bt_mesh_trans_resend(struct bt_mesh_net_tx *tx, struct os_mbuf *msg, in bt_mesh_trans_resend() argument
511 if (tx->ctx->send_rel || msg->om_len > 15) { in bt_mesh_trans_resend()
512 err = send_seg(tx, msg, cb, cb_data); in bt_mesh_trans_resend()
514 err = send_unseg(tx, msg, cb, cb_data); in bt_mesh_trans_resend()
672 struct seg_tx *tx; in seg_tx_lookup() local
676 tx = &seg_tx[i]; in seg_tx_lookup()
678 if ((tx->seq_auth & 0x1fff) != seq_zero) { in seg_tx_lookup()
682 if (tx->dst == addr) { in seg_tx_lookup()
683 return tx; in seg_tx_lookup()
691 if (obo && tx->nack_count == tx->seg_n + 1) { in seg_tx_lookup()
692 tx->dst = addr; in seg_tx_lookup()
693 return tx; in seg_tx_lookup()
703 struct seg_tx *tx; in trans_ack() local
729 tx = seg_tx_lookup(seq_zero, obo, rx->ctx.addr); in trans_ack()
730 if (!tx) { in trans_ack()
731 BT_WARN("No matching TX context for ack"); in trans_ack()
735 *seq_auth = tx->seq_auth; in trans_ack()
739 seg_tx_complete(tx, -ECANCELED); in trans_ack()
743 if (find_msb_set(ack) - 1 > tx->seg_n) { in trans_ack()
748 k_delayed_work_cancel(&tx->retransmit); in trans_ack()
751 if (tx->seg[bit - 1]) { in trans_ack()
752 BT_DBG("seg %u/%u acked", bit - 1, tx->seg_n); in trans_ack()
753 net_buf_unref(tx->seg[bit - 1]); in trans_ack()
754 tx->seg[bit - 1] = NULL; in trans_ack()
755 tx->nack_count--; in trans_ack()
761 if (tx->nack_count) { in trans_ack()
762 seg_tx_send_unacked(tx); in trans_ack()
764 BT_DBG("SDU TX complete"); in trans_ack()
765 seg_tx_complete(tx, 0); in trans_ack()
923 int bt_mesh_ctl_send(struct bt_mesh_net_tx *tx, u8_t ctl_op, void *data, in bt_mesh_ctl_send() argument
929 BT_DBG("src 0x%04x dst 0x%04x ttl 0x%02x ctl 0x%02x", tx->src, in bt_mesh_ctl_send()
930 tx->ctx->addr, tx->ctx->send_ttl, ctl_op); in bt_mesh_ctl_send()
933 buf = bt_mesh_adv_create(BT_MESH_ADV_DATA, tx->xmit, BUF_TIMEOUT); in bt_mesh_ctl_send()
946 if (bt_mesh_friend_enqueue_tx(tx, BT_MESH_FRIEND_PDU_SINGLE, in bt_mesh_ctl_send()
948 BT_MESH_ADDR_IS_UNICAST(tx->ctx->addr)) { in bt_mesh_ctl_send()
957 return bt_mesh_net_send(tx, buf, cb, cb_data); in bt_mesh_ctl_send()
969 struct bt_mesh_net_tx tx = { in send_ack() local
996 return bt_mesh_ctl_send(&tx, TRANS_CTL_OP_ACK, buf, sizeof(buf), in send_ack()