1 /*
2  * Copyright (c) 2018-2021 mcumgr authors
3  * Copyright (c) 2022 Laird Connectivity
4  * Copyright (c) 2023 Nordic Semiconductor ASA
5  *
6  * SPDX-License-Identifier: Apache-2.0
7  */
8 
9 #ifndef H_OS_MGMT_
10 #define H_OS_MGMT_
11 
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15 
16 /**
17  * Command IDs for OS management group.
18  */
19 #define OS_MGMT_ID_ECHO			0
20 #define OS_MGMT_ID_CONS_ECHO_CTRL	1
21 #define OS_MGMT_ID_TASKSTAT		2
22 #define OS_MGMT_ID_MPSTAT		3
23 #define OS_MGMT_ID_DATETIME_STR		4
24 #define OS_MGMT_ID_RESET		5
25 #define OS_MGMT_ID_MCUMGR_PARAMS	6
26 #define OS_MGMT_ID_INFO			7
27 #define OS_MGMT_ID_BOOTLOADER_INFO	8
28 
29 /**
30  * Command result codes for OS management group.
31  */
32 enum os_mgmt_err_code_t {
33 	/** No error, this is implied if there is no ret value in the response */
34 	OS_MGMT_ERR_OK = 0,
35 
36 	/** Unknown error occurred. */
37 	OS_MGMT_ERR_UNKNOWN,
38 
39 	/** The provided format value is not valid. */
40 	OS_MGMT_ERR_INVALID_FORMAT,
41 
42 	/** Query was not recognized. */
43 	OS_MGMT_ERR_QUERY_YIELDS_NO_ANSWER,
44 
45 	/** RTC is not set */
46 	OS_MGMT_ERR_RTC_NOT_SET,
47 
48 	/** RTC command failed */
49 	OS_MGMT_ERR_RTC_COMMAND_FAILED,
50 
51 	/** Query was recognized but there is no valid value for the response. */
52 	OS_MGMT_ERR_QUERY_RESPONSE_VALUE_NOT_VALID,
53 };
54 
55 /* Bitmask values used by the os info command handler. Note that the width of this variable is
56  * 32-bits, allowing 32 flags, custom user-level implementations should start at
57  * OS_MGMT_INFO_FORMAT_USER_CUSTOM_START and reference that directly as additional format
58  * specifiers might be added to this list in the future.
59  */
60 enum os_mgmt_info_formats {
61 	OS_MGMT_INFO_FORMAT_KERNEL_NAME = BIT(0),
62 	OS_MGMT_INFO_FORMAT_NODE_NAME = BIT(1),
63 	OS_MGMT_INFO_FORMAT_KERNEL_RELEASE = BIT(2),
64 	OS_MGMT_INFO_FORMAT_KERNEL_VERSION = BIT(3),
65 	OS_MGMT_INFO_FORMAT_BUILD_DATE_TIME = BIT(4),
66 	OS_MGMT_INFO_FORMAT_MACHINE = BIT(5),
67 	OS_MGMT_INFO_FORMAT_PROCESSOR = BIT(6),
68 	OS_MGMT_INFO_FORMAT_HARDWARE_PLATFORM = BIT(7),
69 	OS_MGMT_INFO_FORMAT_OPERATING_SYSTEM = BIT(8),
70 
71 	OS_MGMT_INFO_FORMAT_USER_CUSTOM_START = BIT(9),
72 };
73 
74 /* Structure provided in the MGMT_EVT_OP_OS_MGMT_INFO_CHECK notification callback */
75 struct os_mgmt_info_check {
76 	/* Input format string from the mcumgr client */
77 	struct zcbor_string *format;
78 	/* Bitmask of values specifying which outputs should be present */
79 	uint32_t *format_bitmask;
80 	/* Number of valid format characters parsed, must be incremented by 1 for each valid
81 	 * character
82 	 */
83 	uint16_t *valid_formats;
84 	/* Needs to be set to true if the OS name is being provided by external code */
85 	bool *custom_os_name;
86 };
87 
88 /* Structure provided in the MGMT_EVT_OP_OS_MGMT_INFO_APPEND notification callback */
89 struct os_mgmt_info_append {
90 	/* The format bitmask from the processed commands, the bits should be cleared once
91 	 * processed, note that if all_format_specified is specified, the corresponding bits here
92 	 * will not be set
93 	 */
94 	uint32_t *format_bitmask;
95 	/* Will be true if the all 'a' specifier was provided */
96 	bool all_format_specified;
97 	/* The output buffer which the responses should be appended to. If prior_output is true, a
98 	 * space must be added prior to the output response
99 	 */
100 	uint8_t *output;
101 	/* The current size of the output response in the output buffer, must be updated to be the
102 	 * size of the output response after appending data
103 	 */
104 	uint16_t *output_length;
105 	/* The size of the output buffer, including null terminator character, if the output
106 	 * response would exceed this size, the function must abort and return false to return a
107 	 * memory error to the client
108 	 */
109 	uint16_t buffer_size;
110 	/* If there has been prior output, must be set to true if a response has been output */
111 	bool *prior_output;
112 };
113 
114 #ifdef __cplusplus
115 }
116 #endif
117 
118 #endif /* H_OS_MGMT_ */
119