1/*-
2 * Copyright 2020 Toomas Soome <tsoome@me.com>
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 * SUCH DAMAGE.
24 */
25
26#ifndef _BOOT_NVLIST_H_
27#define	_BOOT_NVLIST_H_
28
29typedef enum {
30	DATA_TYPE_UNKNOWN = 0,
31	DATA_TYPE_BOOLEAN,
32	DATA_TYPE_BYTE,
33	DATA_TYPE_INT16,
34	DATA_TYPE_UINT16,
35	DATA_TYPE_INT32,
36	DATA_TYPE_UINT32,
37	DATA_TYPE_INT64,
38	DATA_TYPE_UINT64,
39	DATA_TYPE_STRING,
40	DATA_TYPE_BYTE_ARRAY,
41	DATA_TYPE_INT16_ARRAY,
42	DATA_TYPE_UINT16_ARRAY,
43	DATA_TYPE_INT32_ARRAY,
44	DATA_TYPE_UINT32_ARRAY,
45	DATA_TYPE_INT64_ARRAY,
46	DATA_TYPE_UINT64_ARRAY,
47	DATA_TYPE_STRING_ARRAY,
48	DATA_TYPE_HRTIME,
49	DATA_TYPE_NVLIST,
50	DATA_TYPE_NVLIST_ARRAY,
51	DATA_TYPE_BOOLEAN_VALUE,
52	DATA_TYPE_INT8,
53	DATA_TYPE_UINT8,
54	DATA_TYPE_BOOLEAN_ARRAY,
55	DATA_TYPE_INT8_ARRAY,
56	DATA_TYPE_UINT8_ARRAY
57} data_type_t;
58
59/* nvp implementation version */
60#define	NV_VERSION		0
61
62/* nvlist pack encoding */
63#define	NV_ENCODE_NATIVE	0
64#define	NV_ENCODE_XDR		1
65
66/* nvlist persistent unique name flags, stored in nvl_nvflags */
67#define	NV_UNIQUE_NAME		0x1
68#define	NV_UNIQUE_NAME_TYPE	0x2
69
70#define	NV_ALIGN4(x)		(((x) + 3) & ~3)
71#define	NV_ALIGN(x)		(((x) + 7) & ~7)
72
73/*
74 * nvlist header.
75 * nvlist has 4 bytes header followed by version and flags, then nvpairs
76 * and the list is terminated by double zero.
77 */
78typedef struct {
79	char nvh_encoding;
80	char nvh_endian;
81	char nvh_reserved1;
82	char nvh_reserved2;
83} nvs_header_t;
84
85typedef struct {
86	nvs_header_t nv_header;
87	size_t nv_asize;
88	size_t nv_size;
89	uint8_t *nv_data;
90	uint8_t *nv_idx;
91} nvlist_t;
92
93/*
94 * nvpair header.
95 * nvpair has encoded and decoded size
96 * name string (size and data)
97 * data type and number of elements
98 * data
99 */
100typedef struct {
101	unsigned encoded_size;
102	unsigned decoded_size;
103} nvp_header_t;
104
105/*
106 * nvlist stream head.
107 */
108typedef struct {
109	unsigned nvl_version;
110	unsigned nvl_nvflag;
111	nvp_header_t nvl_pair;
112} nvs_data_t;
113
114typedef struct {
115	unsigned nv_size;
116	uint8_t nv_data[];	/* NV_ALIGN4(string) */
117} nv_string_t;
118
119typedef struct {
120	unsigned nv_type;	/* data_type_t */
121	unsigned nv_nelem;	/* number of elements */
122	uint8_t nv_data[];	/* data stream */
123} nv_pair_data_t;
124
125nvlist_t *nvlist_create(int);
126void nvlist_destroy(nvlist_t *);
127nvlist_t *nvlist_import(const char *, size_t);
128int nvlist_export(nvlist_t *);
129int nvlist_remove(nvlist_t *, const char *, data_type_t);
130int nvpair_type_from_name(const char *);
131nvp_header_t *nvpair_find(nvlist_t *, const char *);
132void nvpair_print(nvp_header_t *, unsigned int);
133void nvlist_print(const nvlist_t *, unsigned int);
134char *nvstring_get(nv_string_t *);
135int nvlist_find(const nvlist_t *, const char *, data_type_t,
136    int *, void *, int *);
137nvp_header_t *nvlist_next_nvpair(nvlist_t *, nvp_header_t *);
138
139int nvlist_add_boolean_value(nvlist_t *, const char *, int);
140int nvlist_add_byte(nvlist_t *, const char *, uint8_t);
141int nvlist_add_int8(nvlist_t *, const char *, int8_t);
142int nvlist_add_uint8(nvlist_t *, const char *, uint8_t);
143int nvlist_add_int16(nvlist_t *, const char *, int16_t);
144int nvlist_add_uint16(nvlist_t *, const char *, uint16_t);
145int nvlist_add_int32(nvlist_t *, const char *, int32_t);
146int nvlist_add_uint32(nvlist_t *, const char *, uint32_t);
147int nvlist_add_int64(nvlist_t *, const char *, int64_t);
148int nvlist_add_uint64(nvlist_t *, const char *, uint64_t);
149int nvlist_add_string(nvlist_t *, const char *, const char *);
150int nvlist_add_boolean_array(nvlist_t *, const char *, int *, uint32_t);
151int nvlist_add_byte_array(nvlist_t *, const char *, uint8_t *, uint32_t);
152int nvlist_add_int8_array(nvlist_t *, const char *, int8_t *, uint32_t);
153int nvlist_add_uint8_array(nvlist_t *, const char *, uint8_t *, uint32_t);
154int nvlist_add_int16_array(nvlist_t *, const char *, int16_t *, uint32_t);
155int nvlist_add_uint16_array(nvlist_t *, const char *, uint16_t *, uint32_t);
156int nvlist_add_int32_array(nvlist_t *, const char *, int32_t *, uint32_t);
157int nvlist_add_uint32_array(nvlist_t *, const char *, uint32_t *, uint32_t);
158int nvlist_add_int64_array(nvlist_t *, const char *, int64_t *, uint32_t);
159int nvlist_add_uint64_array(nvlist_t *, const char *, uint64_t *, uint32_t);
160int nvlist_add_string_array(nvlist_t *, const char *, char * const *, uint32_t);
161int nvlist_add_nvlist(nvlist_t *, const char *, nvlist_t *);
162int nvlist_add_nvlist_array(nvlist_t *, const char *, nvlist_t **, uint32_t);
163
164#endif /* !_BOOT_NVLIST_H_ */
165