Lines Matching refs:srv

54 static void dfd_phase_set(struct bt_mesh_dfd_srv *srv,  in dfd_phase_set()  argument
57 srv->phase = new_phase; in dfd_phase_set()
59 if (srv->cb && srv->cb->phase) { in dfd_phase_set()
60 srv->cb->phase(srv, srv->phase); in dfd_phase_set()
64 static struct bt_mesh_dfu_target *target_get(struct bt_mesh_dfd_srv *srv, in target_get() argument
67 for (int i = 0; i < srv->target_cnt; ++i) { in target_get()
68 if (addr == srv->targets[i].blob.addr) { in target_get()
69 return &srv->targets[i]; in target_get()
76 static bool is_busy(const struct bt_mesh_dfd_srv *srv) in is_busy() argument
78 return srv->phase == BT_MESH_DFD_PHASE_TRANSFER_ACTIVE || in is_busy()
79 srv->phase == BT_MESH_DFD_PHASE_TRANSFER_SUCCESS || in is_busy()
80 srv->phase == BT_MESH_DFD_PHASE_APPLYING_UPDATE; in is_busy()
83 static bool upload_is_busy(const struct bt_mesh_dfd_srv *srv) in upload_is_busy() argument
85 return bt_mesh_blob_srv_is_busy(&srv->upload.blob) || in upload_is_busy()
86 srv->upload.phase == BT_MESH_DFD_UPLOAD_PHASE_TRANSFER_ACTIVE; in upload_is_busy()
89 static int slot_del(struct bt_mesh_dfd_srv *srv, const struct bt_mesh_dfu_slot *slot) in slot_del() argument
91 if (srv->cb && srv->cb->del) { in slot_del()
92 srv->cb->del(srv, slot); in slot_del()
98 static void receivers_status_rsp(struct bt_mesh_dfd_srv *srv, in receivers_status_rsp() argument
106 net_buf_simple_add_le16(&buf, srv->target_cnt); in receivers_status_rsp()
108 bt_mesh_model_send(srv->mod, ctx, &buf, NULL, NULL); in receivers_status_rsp()
115 struct bt_mesh_dfd_srv *srv = mod->rt->user_data; in handle_receivers_add() local
121 if (bt_mesh_dfu_cli_is_busy(&srv->dfu)) { in handle_receivers_add()
122 receivers_status_rsp(srv, ctx, in handle_receivers_add()
134 status = bt_mesh_dfd_srv_receiver_add(srv, addr, img_idx); in handle_receivers_add()
137 receivers_status_rsp(srv, ctx, status); in handle_receivers_add()
145 struct bt_mesh_dfd_srv *srv = mod->rt->user_data; in handle_receivers_delete_all() local
147 receivers_status_rsp(srv, ctx, bt_mesh_dfd_srv_receivers_delete_all(srv)); in handle_receivers_delete_all()
155 struct bt_mesh_dfd_srv *srv = mod->rt->user_data; in handle_receivers_get() local
172 net_buf_simple_add_le16(&rsp, srv->target_cnt); in handle_receivers_get()
175 cnt = MIN(cnt, srv->target_cnt - first); in handle_receivers_get()
176 progress = bt_mesh_dfu_cli_progress(&srv->dfu) / 2; in handle_receivers_get()
179 const struct bt_mesh_dfu_target *t = &srv->targets[i + first]; in handle_receivers_get()
190 bt_mesh_model_send(srv->mod, ctx, &rsp, NULL, NULL); in handle_receivers_get()
225 struct bt_mesh_dfd_srv *srv = mod->rt->user_data; in handle_capabilities_get() local
227 if (srv->oob_schemes.count > 0) { in handle_capabilities_get()
229 net_buf_simple_add_mem(&rsp, srv->oob_schemes.schemes, in handle_capabilities_get()
230 srv->oob_schemes.count); in handle_capabilities_get()
242 static void status_rsp(struct bt_mesh_dfd_srv *srv, struct bt_mesh_msg_ctx *ctx, in status_rsp() argument
249 net_buf_simple_add_u8(&rsp, srv->phase); in status_rsp()
251 if (srv->phase == BT_MESH_DFD_PHASE_IDLE || !srv->dfu.xfer.slot) { in status_rsp()
252 bt_mesh_model_send(srv->mod, ctx, &rsp, NULL, NULL); in status_rsp()
256 net_buf_simple_add_le16(&rsp, srv->inputs.group); in status_rsp()
257 net_buf_simple_add_le16(&rsp, srv->inputs.app_idx); in status_rsp()
258 net_buf_simple_add_u8(&rsp, srv->inputs.ttl); in status_rsp()
259 net_buf_simple_add_le16(&rsp, srv->inputs.timeout_base); in status_rsp()
260 net_buf_simple_add_u8(&rsp, ((srv->dfu.xfer.blob.mode & BIT_MASK(2)) | in status_rsp()
261 ((srv->apply & BIT_MASK(1)) << 2))); in status_rsp()
262 net_buf_simple_add_le16(&rsp, srv->slot_idx); in status_rsp()
264 bt_mesh_model_send(srv->mod, ctx, &rsp, NULL, NULL); in status_rsp()
270 struct bt_mesh_dfd_srv *srv = mod->rt->user_data; in handle_get() local
272 status_rsp(srv, ctx, BT_MESH_DFD_SUCCESS); in handle_get()
280 struct bt_mesh_dfd_srv *srv = mod->rt->user_data; in handle_start() local
294 status_rsp(srv, ctx, BT_MESH_DFD_ERR_INTERNAL); in handle_start()
304 status_rsp(srv, ctx, bt_mesh_dfd_srv_start(srv, &params)); in handle_start()
313 struct bt_mesh_dfd_srv *srv = mod->rt->user_data; in handle_suspend() local
315 status_rsp(srv, ctx, bt_mesh_dfd_srv_suspend(srv)); in handle_suspend()
323 struct bt_mesh_dfd_srv *srv = mod->rt->user_data; in handle_cancel() local
325 bt_mesh_dfd_srv_cancel(srv, ctx); in handle_cancel()
333 struct bt_mesh_dfd_srv *srv = mod->rt->user_data; in handle_apply() local
335 status_rsp(srv, ctx, bt_mesh_dfd_srv_apply(srv)); in handle_apply()
340 static void upload_status_rsp_with_progress(struct bt_mesh_dfd_srv *srv, in upload_status_rsp_with_progress() argument
350 net_buf_simple_add_u8(&rsp, srv->upload.phase); in upload_status_rsp_with_progress()
352 if (srv->upload.phase == BT_MESH_DFD_UPLOAD_PHASE_IDLE || in upload_status_rsp_with_progress()
353 !srv->upload.slot) { in upload_status_rsp_with_progress()
354 bt_mesh_model_send(srv->mod, ctx, &rsp, NULL, NULL); in upload_status_rsp_with_progress()
359 if (srv->upload.is_oob) { in upload_status_rsp_with_progress()
361 net_buf_simple_add_mem(&rsp, srv->upload.oob.current_fwid, in upload_status_rsp_with_progress()
362 srv->upload.oob.current_fwid_len); in upload_status_rsp_with_progress()
367 net_buf_simple_add_mem(&rsp, srv->upload.slot->fwid, in upload_status_rsp_with_progress()
368 srv->upload.slot->fwid_len); in upload_status_rsp_with_progress()
371 bt_mesh_model_send(srv->mod, ctx, &rsp, NULL, NULL); in upload_status_rsp_with_progress()
374 static void upload_status_rsp(struct bt_mesh_dfd_srv *srv, in upload_status_rsp() argument
381 if (srv->upload.is_oob) { in upload_status_rsp()
382 progress = srv->cb->oob_progress_get(srv, srv->upload.slot); in upload_status_rsp()
386 progress = bt_mesh_blob_srv_progress(&srv->upload.blob); in upload_status_rsp()
389 upload_status_rsp_with_progress(srv, ctx, status, progress); in upload_status_rsp()
395 struct bt_mesh_dfd_srv *srv = mod->rt->user_data; in handle_upload_get() local
397 upload_status_rsp(srv, ctx, BT_MESH_DFD_SUCCESS); in handle_upload_get()
402 static inline int set_upload_fwid(struct bt_mesh_dfd_srv *srv, struct bt_mesh_msg_ctx *ctx, in set_upload_fwid() argument
405 int err = bt_mesh_dfu_slot_fwid_set(srv->upload.slot, fwid, fwid_len); in set_upload_fwid()
410 bt_mesh_dfu_slot_release(srv->upload.slot); in set_upload_fwid()
411 srv->upload.slot = NULL; in set_upload_fwid()
412 upload_status_rsp(srv, ctx, BT_MESH_DFD_ERR_INTERNAL); in set_upload_fwid()
415 srv->upload.phase = BT_MESH_DFD_UPLOAD_PHASE_TRANSFER_SUCCESS; in set_upload_fwid()
416 bt_mesh_dfu_slot_release(srv->upload.slot); in set_upload_fwid()
418 err = bt_mesh_dfu_slot_get(fwid, fwid_len, &srv->upload.slot); in set_upload_fwid()
420 upload_status_rsp_with_progress(srv, ctx, BT_MESH_DFD_SUCCESS, 100); in set_upload_fwid()
422 srv->upload.slot = NULL; in set_upload_fwid()
423 upload_status_rsp(srv, ctx, BT_MESH_DFD_ERR_INTERNAL); in set_upload_fwid()
427 srv->upload.phase = BT_MESH_DFD_UPLOAD_PHASE_TRANSFER_ACTIVE; in set_upload_fwid()
440 struct bt_mesh_dfd_srv *srv = mod->rt->user_data; in handle_upload_start() local
465 upload_status_rsp(srv, ctx, in handle_upload_start()
470 if (upload_is_busy(srv)) { in handle_upload_start()
471 if (!srv->upload.slot) { in handle_upload_start()
473 upload_status_rsp(srv, ctx, BT_MESH_DFD_ERR_INTERNAL); in handle_upload_start()
477 if (srv->upload.slot->fwid_len == fwid_len && in handle_upload_start()
478 !memcmp(srv->upload.slot->fwid, fwid, fwid_len) && in handle_upload_start()
479 srv->upload.slot->metadata_len == meta_len && in handle_upload_start()
480 !memcmp(srv->upload.slot->metadata, meta, meta_len) && in handle_upload_start()
481 srv->upload.blob.state.xfer.id == blob_id && in handle_upload_start()
482 srv->upload.blob.state.ttl == ttl && in handle_upload_start()
483 srv->upload.blob.state.timeout_base == timeout_base in handle_upload_start()
485 && !srv->upload.is_oob in handle_upload_start()
489 upload_status_rsp(srv, ctx, BT_MESH_DFD_SUCCESS); in handle_upload_start()
494 upload_status_rsp(srv, ctx, BT_MESH_DFD_ERR_BUSY_WITH_UPLOAD); in handle_upload_start()
501 if (srv->upload.slot) { in handle_upload_start()
502 bt_mesh_dfu_slot_release(srv->upload.slot); in handle_upload_start()
506 srv->upload.is_oob = false; in handle_upload_start()
508 srv->upload.slot = bt_mesh_dfu_slot_reserve(); in handle_upload_start()
510 if (!srv->upload.slot) { in handle_upload_start()
512 upload_status_rsp(srv, ctx, in handle_upload_start()
517 err = set_upload_fwid(srv, ctx, fwid, fwid_len); in handle_upload_start()
522 err = bt_mesh_dfu_slot_info_set(srv->upload.slot, size, meta, meta_len); in handle_upload_start()
525 upload_status_rsp(srv, ctx, BT_MESH_DFD_ERR_INTERNAL); in handle_upload_start()
533 srv->io = NULL; in handle_upload_start()
534 err = srv->cb->recv(srv, srv->upload.slot, &srv->io); in handle_upload_start()
535 if (err || !srv->io) { in handle_upload_start()
536 LOG_ERR("App rejected upload. err: %d io: %p", err, srv->io); in handle_upload_start()
537 bt_mesh_dfu_slot_release(srv->upload.slot); in handle_upload_start()
538 upload_status_rsp(srv, ctx, BT_MESH_DFD_ERR_INTERNAL); in handle_upload_start()
542 err = bt_mesh_blob_srv_recv(&srv->upload.blob, blob_id, srv->io, ttl, in handle_upload_start()
546 bt_mesh_dfu_slot_release(srv->upload.slot); in handle_upload_start()
547 upload_status_rsp(srv, ctx, BT_MESH_DFD_ERR_INTERNAL); in handle_upload_start()
553 srv->upload.phase = BT_MESH_DFD_UPLOAD_PHASE_TRANSFER_ACTIVE; in handle_upload_start()
554 upload_status_rsp(srv, ctx, BT_MESH_DFD_SUCCESS); in handle_upload_start()
562 struct bt_mesh_dfd_srv *srv = mod->rt->user_data; in handle_upload_start_oob() local
582 if (upload_is_busy(srv)) { in handle_upload_start_oob()
584 if (srv->upload.is_oob && in handle_upload_start_oob()
585 uri_len == srv->upload.oob.uri_len && in handle_upload_start_oob()
586 fwid_len == srv->upload.oob.current_fwid_len && in handle_upload_start_oob()
587 !memcmp(uri, srv->upload.oob.uri, uri_len) && in handle_upload_start_oob()
588 !memcmp(fwid, srv->upload.oob.current_fwid, fwid_len)) { in handle_upload_start_oob()
590 upload_status_rsp(srv, ctx, BT_MESH_DFD_SUCCESS); in handle_upload_start_oob()
594 upload_status_rsp(srv, ctx, BT_MESH_DFD_ERR_BUSY_WITH_UPLOAD); in handle_upload_start_oob()
597 } else if (srv->upload.is_oob && srv->upload.is_pending_oob_check) { in handle_upload_start_oob()
606 upload_status_rsp(srv, ctx, BT_MESH_DFD_ERR_INTERNAL); in handle_upload_start_oob()
613 upload_status_rsp(srv, ctx, BT_MESH_DFD_ERR_INSUFFICIENT_RESOURCES); in handle_upload_start_oob()
620 if (srv->upload.slot) { in handle_upload_start_oob()
621 bt_mesh_dfu_slot_release(srv->upload.slot); in handle_upload_start_oob()
624 srv->upload.is_oob = true; in handle_upload_start_oob()
625 srv->upload.slot = slot; in handle_upload_start_oob()
626 memcpy(srv->upload.oob.uri, uri, uri_len); in handle_upload_start_oob()
627 srv->upload.oob.uri_len = uri_len; in handle_upload_start_oob()
628 memcpy(srv->upload.oob.current_fwid, fwid, fwid_len); in handle_upload_start_oob()
629 srv->upload.oob.current_fwid_len = fwid_len; in handle_upload_start_oob()
630 memcpy(&srv->upload.oob.ctx, ctx, sizeof(struct bt_mesh_msg_ctx)); in handle_upload_start_oob()
632 int status = srv->cb->start_oob_upload(srv, srv->upload.slot, srv->upload.oob.uri, in handle_upload_start_oob()
633 srv->upload.oob.uri_len, in handle_upload_start_oob()
634 srv->upload.oob.current_fwid, in handle_upload_start_oob()
635 srv->upload.oob.current_fwid_len); in handle_upload_start_oob()
638 upload_status_rsp(srv, ctx, status); in handle_upload_start_oob()
639 bt_mesh_dfu_slot_release(srv->upload.slot); in handle_upload_start_oob()
641 srv->upload.is_pending_oob_check = true; in handle_upload_start_oob()
644 upload_status_rsp(srv, ctx, BT_MESH_DFD_ERR_URI_NOT_SUPPORTED); in handle_upload_start_oob()
653 struct bt_mesh_dfd_srv *srv = mod->rt->user_data; in handle_upload_cancel() local
655 srv->upload.phase = BT_MESH_DFD_UPLOAD_PHASE_IDLE; in handle_upload_cancel()
657 if (srv->upload.is_oob) { in handle_upload_cancel()
658 srv->cb->cancel_oob_upload(srv, srv->upload.slot); in handle_upload_cancel()
662 (void)bt_mesh_blob_srv_cancel(&srv->upload.blob); in handle_upload_cancel()
664 upload_status_rsp(srv, ctx, BT_MESH_DFD_SUCCESS); in handle_upload_cancel()
669 static void fw_status_rsp(struct bt_mesh_dfd_srv *srv, in fw_status_rsp() argument
686 bt_mesh_model_send(srv->mod, ctx, &rsp, NULL, NULL); in fw_status_rsp()
692 struct bt_mesh_dfd_srv *srv = mod->rt->user_data; in handle_fw_get() local
703 fw_status_rsp(srv, ctx, BT_MESH_DFD_SUCCESS, idx, fwid, in handle_fw_get()
706 fw_status_rsp(srv, ctx, BT_MESH_DFD_ERR_FW_NOT_FOUND, 0xffff, in handle_fw_get()
716 struct bt_mesh_dfd_srv *srv = mod->rt->user_data; in handle_fw_get_by_index() local
724 fw_status_rsp(srv, ctx, BT_MESH_DFD_SUCCESS, idx, slot->fwid, in handle_fw_get_by_index()
727 fw_status_rsp(srv, ctx, BT_MESH_DFD_ERR_FW_NOT_FOUND, idx, in handle_fw_get_by_index()
737 struct bt_mesh_dfd_srv *srv = mod->rt->user_data; in handle_fw_delete() local
744 enum bt_mesh_dfd_status status = bt_mesh_dfd_srv_fw_delete(srv, &fwid_len, &fwid); in handle_fw_delete()
746 fw_status_rsp(srv, ctx, status, 0xffff, fwid, fwid_len); in handle_fw_delete()
754 struct bt_mesh_dfd_srv *srv = user_data; in slot_del_cb() local
756 if (srv->cb && srv->cb->del) { in slot_del_cb()
757 srv->cb->del(srv, slot); in slot_del_cb()
766 struct bt_mesh_dfd_srv *srv = mod->rt->user_data; in handle_fw_delete_all() local
768 fw_status_rsp(srv, ctx, bt_mesh_dfd_srv_fw_delete_all(srv), 0xffff, NULL, 0); in handle_fw_delete_all()
797 struct bt_mesh_dfd_srv *srv = in dfu_suspended() local
800 dfd_phase_set(srv, BT_MESH_DFD_PHASE_TRANSFER_SUSPENDED); in dfu_suspended()
806 struct bt_mesh_dfd_srv *srv = in dfu_ended() local
810 LOG_DBG("reason: %u, phase: %u, apply: %u", reason, srv->phase, srv->apply); in dfu_ended()
812 if (srv->phase == BT_MESH_DFD_PHASE_IDLE) { in dfu_ended()
816 if (srv->phase == BT_MESH_DFD_PHASE_CANCELING_UPDATE) { in dfu_ended()
817 dfd_phase_set(srv, BT_MESH_DFD_PHASE_IDLE); in dfu_ended()
822 dfd_phase_set(srv, BT_MESH_DFD_PHASE_FAILED); in dfu_ended()
826 if (!srv->apply) { in dfu_ended()
827 dfd_phase_set(srv, BT_MESH_DFD_PHASE_TRANSFER_SUCCESS); in dfu_ended()
831 dfd_phase_set(srv, BT_MESH_DFD_PHASE_APPLYING_UPDATE); in dfu_ended()
836 dfd_phase_set(srv, BT_MESH_DFD_PHASE_FAILED); in dfu_ended()
842 struct bt_mesh_dfd_srv *srv = in dfu_applied() local
846 if (srv->phase == BT_MESH_DFD_PHASE_CANCELING_UPDATE) { in dfu_applied()
847 dfd_phase_set(srv, BT_MESH_DFD_PHASE_FAILED); in dfu_applied()
851 if (srv->phase != BT_MESH_DFD_PHASE_APPLYING_UPDATE) { in dfu_applied()
858 dfd_phase_set(srv, BT_MESH_DFD_PHASE_FAILED); in dfu_applied()
864 struct bt_mesh_dfd_srv *srv = in dfu_confirmed() local
867 if (srv->phase != BT_MESH_DFD_PHASE_APPLYING_UPDATE && in dfu_confirmed()
868 srv->phase != BT_MESH_DFD_PHASE_CANCELING_UPDATE) { in dfu_confirmed()
872 dfd_phase_set(srv, BT_MESH_DFD_PHASE_COMPLETED); in dfu_confirmed()
891 struct bt_mesh_dfd_srv *srv = in upload_end() local
894 if (srv->upload.phase != BT_MESH_DFD_UPLOAD_PHASE_TRANSFER_ACTIVE) { in upload_end()
900 if (success && (bt_mesh_dfu_slot_commit(srv->upload.slot) == 0)) { in upload_end()
901 srv->upload.phase = BT_MESH_DFD_UPLOAD_PHASE_TRANSFER_SUCCESS; in upload_end()
906 srv->upload.phase = BT_MESH_DFD_UPLOAD_PHASE_TRANSFER_ERROR; in upload_end()
925 struct bt_mesh_dfd_srv *srv = mod->rt->user_data; in dfd_srv_init() local
927 srv->mod = mod; in dfd_srv_init()
948 err = bt_mesh_model_extend(mod, srv->upload.blob.mod); in dfd_srv_init()
959 struct bt_mesh_dfd_srv *srv = mod->rt->user_data; in dfd_srv_reset() local
961 dfd_phase_set(srv, BT_MESH_DFD_PHASE_IDLE); in dfd_srv_reset()
962 srv->upload.phase = BT_MESH_DFD_UPLOAD_PHASE_IDLE; in dfd_srv_reset()
964 sys_slist_init(&srv->inputs.targets); in dfd_srv_reset()
965 srv->target_cnt = 0; in dfd_srv_reset()
967 bt_mesh_dfu_slot_foreach(slot_del_cb, srv); in dfd_srv_reset()
976 enum bt_mesh_dfd_status bt_mesh_dfd_srv_receiver_add(struct bt_mesh_dfd_srv *srv, uint16_t addr, in bt_mesh_dfd_srv_receiver_add() argument
986 t = target_get(srv, addr); in bt_mesh_dfd_srv_receiver_add()
994 if (srv->target_cnt == ARRAY_SIZE(srv->targets)) { in bt_mesh_dfd_srv_receiver_add()
998 t = &srv->targets[srv->target_cnt]; in bt_mesh_dfd_srv_receiver_add()
999 p = &srv->pull_ctxs[srv->target_cnt]; in bt_mesh_dfd_srv_receiver_add()
1000 srv->target_cnt++; in bt_mesh_dfd_srv_receiver_add()
1014 enum bt_mesh_dfd_status bt_mesh_dfd_srv_receivers_delete_all(struct bt_mesh_dfd_srv *srv) in bt_mesh_dfd_srv_receivers_delete_all() argument
1016 if (bt_mesh_dfu_cli_is_busy(&srv->dfu)) { in bt_mesh_dfd_srv_receivers_delete_all()
1020 sys_slist_init(&srv->inputs.targets); in bt_mesh_dfd_srv_receivers_delete_all()
1021 srv->target_cnt = 0; in bt_mesh_dfd_srv_receivers_delete_all()
1026 enum bt_mesh_dfd_status bt_mesh_dfd_srv_start(struct bt_mesh_dfd_srv *srv, in bt_mesh_dfd_srv_start() argument
1032 if (!srv->target_cnt) { in bt_mesh_dfd_srv_start()
1046 if (srv->inputs.app_idx == params->app_idx && in bt_mesh_dfd_srv_start()
1047 srv->inputs.timeout_base == params->timeout_base && in bt_mesh_dfd_srv_start()
1048 srv->inputs.group == params->group && srv->inputs.ttl == params->ttl && in bt_mesh_dfd_srv_start()
1049 srv->dfu.xfer.blob.mode == xfer.mode && srv->apply == params->apply && in bt_mesh_dfd_srv_start()
1050 srv->slot_idx == params->slot_idx) { in bt_mesh_dfd_srv_start()
1051 if (is_busy(srv) || in bt_mesh_dfd_srv_start()
1052 srv->phase == BT_MESH_DFD_PHASE_COMPLETED) { in bt_mesh_dfd_srv_start()
1055 } else if (srv->phase == BT_MESH_DFD_PHASE_TRANSFER_SUSPENDED) { in bt_mesh_dfd_srv_start()
1056 bt_mesh_dfu_cli_resume(&srv->dfu); in bt_mesh_dfd_srv_start()
1057 dfd_phase_set(srv, BT_MESH_DFD_PHASE_TRANSFER_ACTIVE); in bt_mesh_dfd_srv_start()
1060 } else if (is_busy(srv) || in bt_mesh_dfd_srv_start()
1061 srv->phase == BT_MESH_DFD_PHASE_TRANSFER_SUSPENDED) { in bt_mesh_dfd_srv_start()
1066 if (srv->phase == BT_MESH_DFD_PHASE_CANCELING_UPDATE) { in bt_mesh_dfd_srv_start()
1071 srv->io = NULL; in bt_mesh_dfd_srv_start()
1072 err = srv->cb->send(srv, xfer.slot, &srv->io); in bt_mesh_dfd_srv_start()
1073 if (err || !srv->io) { in bt_mesh_dfd_srv_start()
1077 sys_slist_init(&srv->inputs.targets); in bt_mesh_dfd_srv_start()
1078 for (i = 0; i < srv->target_cnt; i++) { in bt_mesh_dfd_srv_start()
1079 uint16_t addr = srv->targets[i].blob.addr; in bt_mesh_dfd_srv_start()
1081 memset(&srv->targets[i].blob, 0, sizeof(struct bt_mesh_blob_target)); in bt_mesh_dfd_srv_start()
1082 memset(&srv->pull_ctxs[i], 0, sizeof(struct bt_mesh_blob_target_pull)); in bt_mesh_dfd_srv_start()
1083 srv->targets[i].blob.addr = addr; in bt_mesh_dfd_srv_start()
1084 srv->targets[i].blob.pull = &srv->pull_ctxs[i]; in bt_mesh_dfd_srv_start()
1086 sys_slist_append(&srv->inputs.targets, &srv->targets[i].blob.n); in bt_mesh_dfd_srv_start()
1089 srv->slot_idx = params->slot_idx; in bt_mesh_dfd_srv_start()
1090 srv->inputs.app_idx = params->app_idx; in bt_mesh_dfd_srv_start()
1091 srv->inputs.timeout_base = params->timeout_base; in bt_mesh_dfd_srv_start()
1092 srv->inputs.group = params->group; in bt_mesh_dfd_srv_start()
1093 srv->inputs.ttl = params->ttl; in bt_mesh_dfd_srv_start()
1094 srv->apply = params->apply; in bt_mesh_dfd_srv_start()
1103 dfd_phase_set(srv, BT_MESH_DFD_PHASE_TRANSFER_ACTIVE); in bt_mesh_dfd_srv_start()
1104 err = bt_mesh_dfu_cli_send(&srv->dfu, &srv->inputs, srv->io, &xfer); in bt_mesh_dfd_srv_start()
1106 dfd_phase_set(srv, BT_MESH_DFD_PHASE_IDLE); in bt_mesh_dfd_srv_start()
1113 enum bt_mesh_dfd_status bt_mesh_dfd_srv_suspend(struct bt_mesh_dfd_srv *srv) in bt_mesh_dfd_srv_suspend() argument
1117 if (srv->phase == BT_MESH_DFD_PHASE_TRANSFER_SUSPENDED) { in bt_mesh_dfd_srv_suspend()
1121 if (srv->phase != BT_MESH_DFD_PHASE_TRANSFER_ACTIVE) { in bt_mesh_dfd_srv_suspend()
1125 err = bt_mesh_dfu_cli_suspend(&srv->dfu); in bt_mesh_dfd_srv_suspend()
1130 srv->phase = BT_MESH_DFD_PHASE_TRANSFER_SUSPENDED; in bt_mesh_dfd_srv_suspend()
1134 enum bt_mesh_dfd_status bt_mesh_dfd_srv_cancel(struct bt_mesh_dfd_srv *srv, in bt_mesh_dfd_srv_cancel() argument
1140 if (srv->phase == BT_MESH_DFD_PHASE_CANCELING_UPDATE || in bt_mesh_dfd_srv_cancel()
1141 srv->phase == BT_MESH_DFD_PHASE_IDLE) { in bt_mesh_dfd_srv_cancel()
1143 status_rsp(srv, ctx, BT_MESH_DFD_SUCCESS); in bt_mesh_dfd_srv_cancel()
1148 if (srv->phase == BT_MESH_DFD_PHASE_COMPLETED || in bt_mesh_dfd_srv_cancel()
1149 srv->phase == BT_MESH_DFD_PHASE_FAILED) { in bt_mesh_dfd_srv_cancel()
1150 dfd_phase_set(srv, BT_MESH_DFD_PHASE_IDLE); in bt_mesh_dfd_srv_cancel()
1152 status_rsp(srv, ctx, BT_MESH_DFD_SUCCESS); in bt_mesh_dfd_srv_cancel()
1159 prev_phase = srv->phase; in bt_mesh_dfd_srv_cancel()
1160 dfd_phase_set(srv, BT_MESH_DFD_PHASE_CANCELING_UPDATE); in bt_mesh_dfd_srv_cancel()
1161 err = bt_mesh_dfu_cli_cancel(&srv->dfu, NULL); in bt_mesh_dfd_srv_cancel()
1164 status_rsp(srv, ctx, BT_MESH_DFD_ERR_INTERNAL); in bt_mesh_dfd_srv_cancel()
1178 status_rsp(srv, ctx, BT_MESH_DFD_SUCCESS); in bt_mesh_dfd_srv_cancel()
1182 dfd_phase_set(srv, BT_MESH_DFD_PHASE_IDLE); in bt_mesh_dfd_srv_cancel()
1184 status_rsp(srv, ctx, BT_MESH_DFD_SUCCESS); in bt_mesh_dfd_srv_cancel()
1191 enum bt_mesh_dfd_status bt_mesh_dfd_srv_apply(struct bt_mesh_dfd_srv *srv) in bt_mesh_dfd_srv_apply() argument
1195 if (srv->phase == BT_MESH_DFD_PHASE_IDLE || in bt_mesh_dfd_srv_apply()
1196 srv->phase == BT_MESH_DFD_PHASE_CANCELING_UPDATE || in bt_mesh_dfd_srv_apply()
1197 srv->phase == BT_MESH_DFD_PHASE_TRANSFER_ACTIVE || in bt_mesh_dfd_srv_apply()
1198 srv->phase == BT_MESH_DFD_PHASE_TRANSFER_SUSPENDED || in bt_mesh_dfd_srv_apply()
1199 srv->phase == BT_MESH_DFD_PHASE_FAILED) { in bt_mesh_dfd_srv_apply()
1203 if (srv->phase == BT_MESH_DFD_PHASE_APPLYING_UPDATE || in bt_mesh_dfd_srv_apply()
1204 srv->phase == BT_MESH_DFD_PHASE_COMPLETED) { in bt_mesh_dfd_srv_apply()
1208 err = bt_mesh_dfu_cli_apply(&srv->dfu); in bt_mesh_dfd_srv_apply()
1213 dfd_phase_set(srv, BT_MESH_DFD_PHASE_APPLYING_UPDATE); in bt_mesh_dfd_srv_apply()
1217 enum bt_mesh_dfd_status bt_mesh_dfd_srv_fw_delete(struct bt_mesh_dfd_srv *srv, size_t *fwid_len, in bt_mesh_dfd_srv_fw_delete() argument
1223 if (srv->phase != BT_MESH_DFD_PHASE_IDLE) { in bt_mesh_dfd_srv_fw_delete()
1234 err = slot_del(srv, slot); in bt_mesh_dfd_srv_fw_delete()
1244 enum bt_mesh_dfd_status bt_mesh_dfd_srv_fw_delete_all(struct bt_mesh_dfd_srv *srv) in bt_mesh_dfd_srv_fw_delete_all() argument
1246 if (srv->phase != BT_MESH_DFD_PHASE_IDLE) { in bt_mesh_dfd_srv_fw_delete_all()
1250 bt_mesh_dfu_slot_foreach(slot_del_cb, srv); in bt_mesh_dfd_srv_fw_delete_all()
1258 int bt_mesh_dfd_srv_oob_check_complete(struct bt_mesh_dfd_srv *srv, in bt_mesh_dfd_srv_oob_check_complete() argument
1264 if (slot != srv->upload.slot || !srv->upload.is_oob || in bt_mesh_dfd_srv_oob_check_complete()
1265 srv->upload.phase == BT_MESH_DFD_UPLOAD_PHASE_TRANSFER_ACTIVE || in bt_mesh_dfd_srv_oob_check_complete()
1266 !srv->upload.is_pending_oob_check) { in bt_mesh_dfd_srv_oob_check_complete()
1273 srv->upload.is_pending_oob_check = false; in bt_mesh_dfd_srv_oob_check_complete()
1276 bt_mesh_dfu_slot_release(srv->upload.slot); in bt_mesh_dfd_srv_oob_check_complete()
1277 upload_status_rsp(srv, &srv->upload.oob.ctx, status); in bt_mesh_dfd_srv_oob_check_complete()
1281 err = set_upload_fwid(srv, &srv->upload.oob.ctx, fwid, fwid_len); in bt_mesh_dfd_srv_oob_check_complete()
1287 upload_status_rsp(srv, &srv->upload.oob.ctx, BT_MESH_DFD_SUCCESS); in bt_mesh_dfd_srv_oob_check_complete()
1291 int bt_mesh_dfd_srv_oob_store_complete(struct bt_mesh_dfd_srv *srv, in bt_mesh_dfd_srv_oob_store_complete() argument
1297 if (srv->upload.phase != BT_MESH_DFD_UPLOAD_PHASE_TRANSFER_ACTIVE || in bt_mesh_dfd_srv_oob_store_complete()
1298 srv->upload.slot != slot || !srv->upload.is_oob) { in bt_mesh_dfd_srv_oob_store_complete()
1306 err = bt_mesh_dfu_slot_info_set(srv->upload.slot, size, metadata, metadata_len); in bt_mesh_dfd_srv_oob_store_complete()
1311 err = bt_mesh_dfu_slot_commit(srv->upload.slot); in bt_mesh_dfd_srv_oob_store_complete()
1316 srv->upload.phase = BT_MESH_DFD_UPLOAD_PHASE_TRANSFER_SUCCESS; in bt_mesh_dfd_srv_oob_store_complete()
1320 srv->upload.phase = BT_MESH_DFD_UPLOAD_PHASE_TRANSFER_ERROR; in bt_mesh_dfd_srv_oob_store_complete()
1321 bt_mesh_dfu_slot_release(srv->upload.slot); in bt_mesh_dfd_srv_oob_store_complete()