1.. _mcumgr_smp_group_8:
2
3File management
4###############
5
6The file management group provides commands that allow to upload and download files
7to/from a device.
8
9File management group defines following commands:
10
11.. table::
12    :align: center
13
14    +-------------------+-----------------------------------------------+
15    | ``Command ID``    | Command description                           |
16    +===================+===============================================+
17    | ``0``             | File download/upload                          |
18    +-------------------+-----------------------------------------------+
19    | ``1``             | File status                                   |
20    +-------------------+-----------------------------------------------+
21    | ``2``             | File hash/checksum                            |
22    +-------------------+-----------------------------------------------+
23    | ``3``             | Supported file hash/checksum types            |
24    +-------------------+-----------------------------------------------+
25    | ``4``             | File close                                    |
26    +-------------------+-----------------------------------------------+
27
28File download
29*************
30
31Command allows to download contents of an existing file from specified path
32of a target device. Client applications must keep track of data they have
33already downloaded and where their position in the file is (MCUmgr will cache
34these also), and issue subsequent requests, with modified offset, to gather
35the entire file.
36Request does not carry size of requested chunk, the size is specified
37by application itself.
38Note that file handles will remain open for consecutive requests (as long as
39an idle timeout has not been reached and another transport does not make use
40of uploading/downloading files using fs_mgmt), but files are not exclusively
41owned by MCUmgr, for the time of download session, and may change between
42requests or even be removed.
43
44.. note::
45
46    By default, all file upload/download requests are unconditionally allowed.
47    However, if the Kconfig option
48    :kconfig:option:`CONFIG_MCUMGR_GRP_FS_FILE_ACCESS_HOOK` is enabled, then an
49    application can register a callback handler for
50    :c:enum:`MGMT_EVT_OP_FS_MGMT_FILE_ACCESS` (see
51    :ref:`MCUmgr callbacks <mcumgr_callbacks>`), which allows for allowing or
52    declining access to reading/writing a particular file, or for rewriting the
53    path supplied by the client.
54
55File download request
56=====================
57
58File download request header:
59
60.. table::
61    :align: center
62
63    +--------+--------------+----------------+
64    | ``OP`` | ``Group ID`` | ``Command ID`` |
65    +========+==============+================+
66    | ``0``  | ``8``        |  ``0``         |
67    +--------+--------------+----------------+
68
69CBOR data of request:
70
71.. code-block:: none
72
73    {
74        (str)"off" :  (uint)
75        (str)"name" : (str)
76    }
77
78where:
79
80.. table::
81    :align: center
82
83    +-----------------------+---------------------------------------------------+
84    | "off"                 | offset to start download at                       |
85    +-----------------------+---------------------------------------------------+
86    | "name"                | absolute path to a file                           |
87    +-----------------------+---------------------------------------------------+
88
89File download response
90======================
91
92File download response header:
93
94.. table::
95    :align: center
96
97    +--------+--------------+----------------+
98    | ``OP`` | ``Group ID`` | ``Command ID`` |
99    +========+==============+================+
100    | ``1``  | ``8``        |  ``0``         |
101    +--------+--------------+----------------+
102
103CBOR data of successful response:
104
105.. code-block:: none
106
107    {
108        (str)"off"      : (uint)
109        (str)"data"     : (byte str)
110        (str,opt)"len"  : (uint)
111    }
112
113In case of error the CBOR data takes the form:
114
115.. tabs::
116
117   .. group-tab:: SMP version 2
118
119      .. code-block:: none
120
121          {
122              (str)"err" : {
123                  (str)"group"    : (uint)
124                  (str)"rc"       : (uint)
125              }
126          }
127
128   .. group-tab:: SMP version 1 (and non-group SMP version 2)
129
130      .. code-block:: none
131
132          {
133              (str)"rc"       : (int)
134          }
135
136where:
137
138.. table::
139    :align: center
140
141    +------------------+-------------------------------------------------------------------------+
142    | "off"            | offset the response is for.                                             |
143    +------------------+-------------------------------------------------------------------------+
144    | "data"           | chunk of data read from file; it is CBOR encoded stream of bytes with   |
145    |                  | embedded size; "data" appears only in responses where "rc" is 0.        |
146    +------------------+-------------------------------------------------------------------------+
147    | "len"            | length of file, this field is only mandatory when "off" is 0.           |
148    +------------------+-------------------------------------------------------------------------+
149    | "err" -> "group" | :c:enum:`mcumgr_group_t` group of the group-based error code. Only      |
150    |                  | appears if an error is returned when using SMP version 2.               |
151    +------------------+-------------------------------------------------------------------------+
152    | "err" -> "rc"    | contains the index of the group-based error code. Only appears if       |
153    |                  | non-zero (error condition) when using SMP version 2.                    |
154    +------------------+-------------------------------------------------------------------------+
155    | "rc"             | :c:enum:`mcumgr_err_t` only appears if non-zero (error condition) when  |
156    |                  | using SMP version 1 or for SMP errors when using SMP version 2.         |
157    +------------------+-------------------------------------------------------------------------+
158
159File upload
160***********
161
162Allows to upload a file to a specified location. Command will automatically overwrite
163existing file or create a new one if it does not exist at specified path.
164The protocol supports stateless upload where each requests carries different chunk
165of a file and it is client side responsibility to track progress of upload.
166
167Note that file handles will remain open for consecutive requests (as long as
168an idle timeout has not been reached, but files are not exclusively owned by
169MCUmgr, for the time of download session, and may change between requests or
170even be removed. Note that file handles will remain open for consecutive
171requests (as long as an idle timeout has not been reached and another transport
172does not make use of uploading/downloading files using fs_mgmt), but files are
173not exclusively owned by MCUmgr, for the time of download session, and may
174change between requests or even be removed.
175
176.. note::
177    Weirdly, the current Zephyr implementation is half-stateless as is able to hold
178    single upload context, holding information on ongoing upload, that consists
179    of bool flag indicating in-progress upload, last successfully uploaded offset
180    and total length only.
181
182.. note::
183
184    By default, all file upload/download requests are unconditionally allowed.
185    However, if the Kconfig option
186    :kconfig:option:`CONFIG_MCUMGR_GRP_FS_FILE_ACCESS_HOOK` is enabled, then an
187    application can register a callback handler for
188    :c:enum:`MGMT_EVT_OP_FS_MGMT_FILE_ACCESS` (see
189    :ref:`MCUmgr callbacks <mcumgr_callbacks>`), which allows for allowing or
190    declining access to reading/writing a particular file, or for rewriting the
191    path supplied by the client.
192
193File upload request
194===================
195
196File upload request header:
197
198.. table::
199    :align: center
200
201    +--------+--------------+----------------+
202    | ``OP`` | ``Group ID`` | ``Command ID`` |
203    +========+==============+================+
204    | ``2``  | ``8``        |  ``0``         |
205    +--------+--------------+----------------+
206
207CBOR data of request:
208
209.. code-block:: none
210
211    {
212        (str)"off"      : (uint)
213        (str)"data"     : (str)
214        (str)"name"     : (str)
215        (str,opt)"len"  : (uint)
216    }
217
218where:
219
220.. table::
221    :align: center
222
223    +-----------------------+---------------------------------------------------+
224    | "off"                 | offset to start/continue upload at.               |
225    +-----------------------+---------------------------------------------------+
226    | "data"                | chunk of data to write to the file;               |
227    |                       | it is CBOR encoded with length embedded.          |
228    +-----------------------+---------------------------------------------------+
229    | "name"                | absolute path to a file.                          |
230    +-----------------------+---------------------------------------------------+
231    | "len"                 | length of file, this field is only mandatory      |
232    |                       | when "off" is 0.                                  |
233    +-----------------------+---------------------------------------------------+
234
235File upload response
236====================
237
238File upload response header:
239
240.. table::
241    :align: center
242
243    +--------+--------------+----------------+
244    | ``OP`` | ``Group ID`` | ``Command ID`` |
245    +========+==============+================+
246    | ``3``  | ``8``        |  ``0``         |
247    +--------+--------------+----------------+
248
249CBOR data of successful response:
250
251.. code-block:: none
252
253    {
254        (str)"off"      : (uint)
255    }
256
257In case of error the CBOR data takes the form:
258
259.. .. tabs::
260
261   .. group-tab:: SMP version 2
262
263      .. code-block:: none
264
265          {
266              (str)"err" : {
267                  (str)"group"    : (uint)
268                  (str)"rc"       : (uint)
269              }
270          }
271
272   .. group-tab:: SMP version 1 (and non-group SMP version 2)
273
274      .. code-block:: none
275
276          {
277              (str)"rc"       : (int)
278          }
279
280where:
281
282.. table::
283    :align: center
284
285    +------------------+-------------------------------------------------------------------------+
286    | "off"            | offset of last successfully written data.                               |
287    +------------------+-------------------------------------------------------------------------+
288    | "err" -> "group" | :c:enum:`mcumgr_group_t` group of the group-based error code. Only      |
289    |                  | appears if an error is returned when using SMP version 2.               |
290    +------------------+-------------------------------------------------------------------------+
291    | "err" -> "rc"    | contains the index of the group-based error code. Only appears if       |
292    |                  | non-zero (error condition) when using SMP version 2.                    |
293    +------------------+-------------------------------------------------------------------------+
294    | "rc"             | :c:enum:`mcumgr_err_t` only appears if non-zero (error condition) when  |
295    |                  | using SMP version 1 or for SMP errors when using SMP version 2.         |
296    +------------------+-------------------------------------------------------------------------+
297
298File status
299***********
300
301Command allows to retrieve status of an existing file from specified path
302of a target device.
303
304File status request
305===================
306
307File status request header:
308
309.. table::
310    :align: center
311
312    +--------+--------------+----------------+
313    | ``OP`` | ``Group ID`` | ``Command ID`` |
314    +========+==============+================+
315    | ``0``  | ``8``        |  ``1``         |
316    +--------+--------------+----------------+
317
318CBOR data of request:
319
320.. code-block:: none
321
322    {
323        (str)"name" : (str)
324    }
325
326where:
327
328.. table::
329    :align: center
330
331    +-----------------------+---------------------------------------------------+
332    | "name"                | absolute path to a file.                          |
333    +-----------------------+---------------------------------------------------+
334
335File status response
336====================
337
338File status response header:
339
340.. table::
341    :align: center
342
343    +--------+--------------+----------------+
344    | ``OP`` | ``Group ID`` | ``Command ID`` |
345    +========+==============+================+
346    | ``1``  | ``8``        |  ``1``         |
347    +--------+--------------+----------------+
348
349CBOR data of successful response:
350
351.. code-block:: none
352
353    {
354        (str)"len"      : (uint)
355    }
356
357In case of error the CBOR data takes form:
358
359.. tabs::
360
361   .. group-tab:: SMP version 2
362
363      .. code-block:: none
364
365          {
366              (str)"err" : {
367                  (str)"group"    : (uint)
368                  (str)"rc"       : (uint)
369              }
370          }
371
372   .. group-tab:: SMP version 1 (and non-group SMP version 2)
373
374      .. code-block:: none
375
376          {
377              (str)"rc"       : (int)
378          }
379
380where:
381
382.. table::
383    :align: center
384
385    +------------------+-------------------------------------------------------------------------+
386    | "len"            | length of file (in bytes).                                              |
387    +------------------+-------------------------------------------------------------------------+
388    | "err" -> "group" | :c:enum:`mcumgr_group_t` group of the group-based error code. Only      |
389    |                  | appears if an error is returned when using SMP version 2.               |
390    +------------------+-------------------------------------------------------------------------+
391    | "err" -> "rc"    | contains the index of the group-based error code. Only appears if       |
392    |                  | non-zero (error condition) when using SMP version 2.                    |
393    +------------------+-------------------------------------------------------------------------+
394    | "rc"             | :c:enum:`mcumgr_err_t` only appears if non-zero (error condition) when  |
395    |                  | using SMP version 1 or for SMP errors when using SMP version 2.         |
396    +------------------+-------------------------------------------------------------------------+
397
398File hash/checksum
399******************
400
401Command allows to generate a hash/checksum of an existing file at a specified
402path on a target device. Note that kernel heap memory is required for buffers to
403be allocated for this to function, and large stack memory buffers are required
404for generation of the output hash/checksum.
405Requires :kconfig:option:`CONFIG_MCUMGR_GRP_FS_CHECKSUM_HASH` to be enabled for
406the base functionality, supported hash/checksum are opt-in with
407:kconfig:option:`CONFIG_MCUMGR_GRP_FS_CHECKSUM_IEEE_CRC32` or
408:kconfig:option:`CONFIG_MCUMGR_GRP_FS_HASH_SHA256`.
409
410File hash/checksum request
411==========================
412
413File hash/checksum request header:
414
415.. table::
416    :align: center
417
418    +--------+--------------+----------------+
419    | ``OP`` | ``Group ID`` | ``Command ID`` |
420    +========+==============+================+
421    | ``0``  | ``8``        |  ``2``         |
422    +--------+--------------+----------------+
423
424CBOR data of request:
425
426.. code-block:: none
427
428    {
429        (str)"name"     : (str)
430        (str,opt)"type" : (str)
431        (str,opt)"off"  : (uint)
432        (str,opt)"len"  : (uint)
433    }
434
435where:
436
437.. table::
438    :align: center
439
440    +-----------------------+---------------------------------------------------+
441    | "name"                | absolute path to a file.                          |
442    +-----------------------+---------------------------------------------------+
443    | "type"                | type of hash/checksum to perform                  |
444    |                       | :ref:`mcumgr_group_8_hash_checksum_types` or omit |
445    |                       | to use default.                                   |
446    +-----------------------+---------------------------------------------------+
447    | "off"                 | offset to start hash/checksum calculation at      |
448    |                       | (optional, 0 if not provided).                    |
449    +-----------------------+---------------------------------------------------+
450    | "len"                 | maximum length of data to read from file to       |
451    |                       | generate hash/checksum with (optional, full file  |
452    |                       | size if not provided).                            |
453    +-----------------------+---------------------------------------------------+
454
455.. _mcumgr_group_8_hash_checksum_types:
456
457Hash/checksum types
458===================
459
460.. table::
461    :align: center
462
463    +-------------+--------------------------------------+-------------+--------------+
464    | String name | Hash/checksum                        | Byte string | Size (bytes) |
465    +=============+======================================+=============+==============+
466    | ``crc32``   | IEEE CRC32 checksum                  | No          | 4            |
467    +-------------+--------------------------------------+-------------+--------------+
468    | ``sha256``  | SHA256 (Secure Hash Algorithm)       | Yes         | 32           |
469    +-------------+--------------------------------------+-------------+--------------+
470
471Note that the default type will be crc32 if it is enabled, or sha256 if crc32 is
472not enabled.
473
474File hash/checksum response
475===========================
476
477File hash/checksum response header:
478
479.. table::
480    :align: center
481
482    +--------+--------------+----------------+
483    | ``OP`` | ``Group ID`` | ``Command ID`` |
484    +========+==============+================+
485    | ``1``  | ``8``        |  ``2``         |
486    +--------+--------------+----------------+
487
488CBOR data of successful response:
489
490.. code-block:: none
491
492    {
493        (str)"type"     : (str)
494        (str,opt)"off"  : (uint)
495        (str)"len"      : (uint)
496        (str)"output"   : (uint or bstr)
497    }
498
499In case of error the CBOR data takes the form:
500
501.. tabs::
502
503   .. group-tab:: SMP version 2
504
505      .. code-block:: none
506
507          {
508              (str)"err" : {
509                  (str)"group"    : (uint)
510                  (str)"rc"       : (uint)
511              }
512          }
513
514   .. group-tab:: SMP version 1 (and non-group SMP version 2)
515
516      .. code-block:: none
517
518          {
519              (str)"rc"       : (int)
520          }
521
522where:
523
524.. table::
525    :align: center
526
527    +------------------+-------------------------------------------------------------------------+
528    | "type"           | type of hash/checksum that was performed                                |
529    |                  | :ref:`mcumgr_group_8_hash_checksum_types`.                              |
530    +------------------+-------------------------------------------------------------------------+
531    | "off"            | offset that hash/checksum calculation started at (only present if not   |
532    |                  | 0).                                                                     |
533    +------------------+-------------------------------------------------------------------------+
534    | "len"            | length of input data used for hash/checksum generation (in bytes).      |
535    +------------------+-------------------------------------------------------------------------+
536    | "output"         | output hash/checksum.                                                   |
537    +------------------+-------------------------------------------------------------------------+
538    | "err" -> "group" | :c:enum:`mcumgr_group_t` group of the group-based error code. Only      |
539    |                  | appears if an error is returned when using SMP version 2.               |
540    +------------------+-------------------------------------------------------------------------+
541    | "err" -> "rc"    | contains the index of the group-based error code. Only appears if       |
542    |                  | non-zero (error condition) when using SMP version 2.                    |
543    +------------------+-------------------------------------------------------------------------+
544    | "rc"             | :c:enum:`mcumgr_err_t` only appears if non-zero (error condition) when  |
545    |                  | using SMP version 1 or for SMP errors when using SMP version 2.         |
546    +------------------+-------------------------------------------------------------------------+
547
548Supported file hash/checksum types
549**********************************
550
551Command allows listing which hash and checksum types are available on a device.
552Requires Kconfig :kconfig:option:`CONFIG_MCUMGR_GRP_FS_CHECKSUM_HASH_SUPPORTED_CMD`
553to be enabled.
554
555Supported file hash/checksum types request
556==========================================
557
558Supported file hash/checksum types request header:
559
560.. table::
561    :align: center
562
563    +--------+--------------+----------------+
564    | ``OP`` | ``Group ID`` | ``Command ID`` |
565    +========+==============+================+
566    | ``0``  | ``8``        |  ``3``         |
567    +--------+--------------+----------------+
568
569The command sends empty CBOR map as data.
570
571Supported file hash/checksum types response
572===========================================
573
574Supported file hash/checksum types response header:
575
576.. table::
577    :align: center
578
579    +--------+--------------+----------------+
580    | ``OP`` | ``Group ID`` | ``Command ID`` |
581    +========+==============+================+
582    | ``1``  | ``8``        |  ``3``         |
583    +--------+--------------+----------------+
584
585CBOR data of successful response:
586
587.. code-block:: none
588
589    {
590        (str)"types" : {
591            (str)<hash_checksum_name> : {
592                (str)"format"       : (uint)
593                (str)"size"         : (uint)
594            }
595            ...
596        }
597    }
598
599In case of error the CBOR data takes form:
600
601.. tabs::
602
603   .. group-tab:: SMP version 2
604
605      .. code-block:: none
606
607          {
608              (str)"err" : {
609                  (str)"group"    : (uint)
610                  (str)"rc"       : (uint)
611              }
612          }
613
614   .. group-tab:: SMP version 1 (and non-group SMP version 2)
615
616      .. code-block:: none
617
618          {
619              (str)"rc"       : (int)
620          }
621
622where:
623
624.. table::
625    :align: center
626
627    +----------------------+-------------------------------------------------------------------------+
628    | <hash_checksum_name> | name of the hash/checksum type                                          |
629    |                      | :ref:`mcumgr_group_8_hash_checksum_types`.                              |
630    +----------------------+-------------------------------------------------------------------------+
631    | "format"             | format that the hash/checksum returns where 0 is for numerical and 1 is |
632    |                      | for byte array.                                                         |
633    +----------------------+-------------------------------------------------------------------------+
634    | "size"               | size (in bytes) of output hash/checksum response.                       |
635    +----------------------+-------------------------------------------------------------------------+
636    | "err" -> "group"     | :c:enum:`mcumgr_group_t` group of the group-based error code. Only      |
637    |                      | appears if an error is returned when using SMP version 2.               |
638    +----------------------+-------------------------------------------------------------------------+
639    | "err" -> "rc"        | contains the index of the group-based error code. Only appears if       |
640    |                      | non-zero (error condition) when using SMP version 2.                    |
641    +----------------------+-------------------------------------------------------------------------+
642    | "rc"                 | :c:enum:`mcumgr_err_t` only appears if non-zero (error condition) when  |
643    |                      | using SMP version 1 or for SMP errors when using SMP version 2.         |
644    +----------------------+-------------------------------------------------------------------------+
645
646File close
647**********
648
649Command allows closing any open file handles held by fs_mgmt upload/download
650requests that might have stalled or be incomplete.
651
652File close request
653==================
654
655File close request header:
656
657.. table::
658    :align: center
659
660    +--------+--------------+----------------+
661    | ``OP`` | ``Group ID`` | ``Command ID`` |
662    +========+==============+================+
663    | ``2``  | ``8``        |  ``4``         |
664    +--------+--------------+----------------+
665
666The command sends empty CBOR map as data.
667
668File close response
669===================
670
671File close response header:
672
673.. table::
674    :align: center
675
676    +--------+--------------+----------------+
677    | ``OP`` | ``Group ID`` | ``Command ID`` |
678    +========+==============+================+
679    | ``3``  | ``8``        |  ``4``         |
680    +--------+--------------+----------------+
681
682The command sends an empty CBOR map as data if successful.
683In case of error the CBOR data takes the form:
684
685.. tabs::
686
687   .. group-tab:: SMP version 2
688
689      .. code-block:: none
690
691          {
692              (str)"err" : {
693                  (str)"group"    : (uint)
694                  (str)"rc"       : (uint)
695              }
696          }
697
698   .. group-tab:: SMP version 1 (and non-group SMP version 2)
699
700      .. code-block:: none
701
702          {
703              (str)"rc"       : (int)
704          }
705
706where:
707
708.. table::
709    :align: center
710
711    +------------------+-------------------------------------------------------------------------+
712    | "err" -> "group" | :c:enum:`mcumgr_group_t` group of the group-based error code. Only      |
713    |                  | appears if an error is returned when using SMP version 2.               |
714    +------------------+-------------------------------------------------------------------------+
715    | "err" -> "rc"    | contains the index of the group-based error code. Only appears if       |
716    |                  | non-zero (error condition) when using SMP version 2.                    |
717    +------------------+-------------------------------------------------------------------------+
718    | "rc"             | :c:enum:`mcumgr_err_t` only appears if non-zero (error condition) when  |
719    |                  | using SMP version 1 or for SMP errors when using SMP version 2.         |
720    +------------------+-------------------------------------------------------------------------+
721