xref: /aosp_15_r20/external/libnl/include/netlink/attr.h (revision 4dc78e53d49367fa8e61b07018507c90983a077d)
1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker /*
3*4dc78e53SAndroid Build Coastguard Worker  * Copyright (c) 2003-2013 Thomas Graf <[email protected]>
4*4dc78e53SAndroid Build Coastguard Worker  */
5*4dc78e53SAndroid Build Coastguard Worker 
6*4dc78e53SAndroid Build Coastguard Worker #ifndef NETLINK_ATTR_H_
7*4dc78e53SAndroid Build Coastguard Worker #define NETLINK_ATTR_H_
8*4dc78e53SAndroid Build Coastguard Worker 
9*4dc78e53SAndroid Build Coastguard Worker #include <netlink/netlink.h>
10*4dc78e53SAndroid Build Coastguard Worker #include <netlink/object.h>
11*4dc78e53SAndroid Build Coastguard Worker #include <netlink/addr.h>
12*4dc78e53SAndroid Build Coastguard Worker #include <netlink/data.h>
13*4dc78e53SAndroid Build Coastguard Worker 
14*4dc78e53SAndroid Build Coastguard Worker #ifdef __cplusplus
15*4dc78e53SAndroid Build Coastguard Worker extern "C" {
16*4dc78e53SAndroid Build Coastguard Worker #endif
17*4dc78e53SAndroid Build Coastguard Worker 
18*4dc78e53SAndroid Build Coastguard Worker struct nlattr;
19*4dc78e53SAndroid Build Coastguard Worker 
20*4dc78e53SAndroid Build Coastguard Worker struct nl_msg;
21*4dc78e53SAndroid Build Coastguard Worker 
22*4dc78e53SAndroid Build Coastguard Worker /**
23*4dc78e53SAndroid Build Coastguard Worker  * @name Basic Attribute Data Types
24*4dc78e53SAndroid Build Coastguard Worker  * @{
25*4dc78e53SAndroid Build Coastguard Worker  */
26*4dc78e53SAndroid Build Coastguard Worker 
27*4dc78e53SAndroid Build Coastguard Worker /**
28*4dc78e53SAndroid Build Coastguard Worker  * @ingroup attr
29*4dc78e53SAndroid Build Coastguard Worker  * Basic attribute data types
30*4dc78e53SAndroid Build Coastguard Worker  *
31*4dc78e53SAndroid Build Coastguard Worker  * See section @core_doc{core_attr_parse,Attribute Parsing} for more details.
32*4dc78e53SAndroid Build Coastguard Worker  */
33*4dc78e53SAndroid Build Coastguard Worker enum {
34*4dc78e53SAndroid Build Coastguard Worker 	NLA_UNSPEC,	/**< Unspecified type, binary data chunk */
35*4dc78e53SAndroid Build Coastguard Worker 	NLA_U8,		/**< 8 bit integer */
36*4dc78e53SAndroid Build Coastguard Worker 	NLA_U16,	/**< 16 bit integer */
37*4dc78e53SAndroid Build Coastguard Worker 	NLA_U32,	/**< 32 bit integer */
38*4dc78e53SAndroid Build Coastguard Worker 	NLA_U64,	/**< 64 bit integer */
39*4dc78e53SAndroid Build Coastguard Worker 	NLA_STRING,	/**< NUL terminated character string */
40*4dc78e53SAndroid Build Coastguard Worker 	NLA_FLAG,	/**< Flag */
41*4dc78e53SAndroid Build Coastguard Worker 	NLA_MSECS,	/**< Micro seconds (64bit) */
42*4dc78e53SAndroid Build Coastguard Worker 	NLA_NESTED,	/**< Nested attributes */
43*4dc78e53SAndroid Build Coastguard Worker 	NLA_NESTED_COMPAT,
44*4dc78e53SAndroid Build Coastguard Worker 	NLA_NUL_STRING,
45*4dc78e53SAndroid Build Coastguard Worker 	NLA_BINARY,
46*4dc78e53SAndroid Build Coastguard Worker 	NLA_S8,
47*4dc78e53SAndroid Build Coastguard Worker 	NLA_S16,
48*4dc78e53SAndroid Build Coastguard Worker 	NLA_S32,
49*4dc78e53SAndroid Build Coastguard Worker 	NLA_S64,
50*4dc78e53SAndroid Build Coastguard Worker 	__NLA_TYPE_MAX,
51*4dc78e53SAndroid Build Coastguard Worker };
52*4dc78e53SAndroid Build Coastguard Worker 
53*4dc78e53SAndroid Build Coastguard Worker #define NLA_TYPE_MAX (__NLA_TYPE_MAX - 1)
54*4dc78e53SAndroid Build Coastguard Worker 
55*4dc78e53SAndroid Build Coastguard Worker /** @} */
56*4dc78e53SAndroid Build Coastguard Worker 
57*4dc78e53SAndroid Build Coastguard Worker /**
58*4dc78e53SAndroid Build Coastguard Worker  * @ingroup attr
59*4dc78e53SAndroid Build Coastguard Worker  * Attribute validation policy.
60*4dc78e53SAndroid Build Coastguard Worker  *
61*4dc78e53SAndroid Build Coastguard Worker  * See section @core_doc{core_attr_parse,Attribute Parsing} for more details.
62*4dc78e53SAndroid Build Coastguard Worker  */
63*4dc78e53SAndroid Build Coastguard Worker struct nla_policy {
64*4dc78e53SAndroid Build Coastguard Worker 	/** Type of attribute or NLA_UNSPEC */
65*4dc78e53SAndroid Build Coastguard Worker 	uint16_t	type;
66*4dc78e53SAndroid Build Coastguard Worker 
67*4dc78e53SAndroid Build Coastguard Worker 	/** Minimal length of payload required */
68*4dc78e53SAndroid Build Coastguard Worker 	uint16_t	minlen;
69*4dc78e53SAndroid Build Coastguard Worker 
70*4dc78e53SAndroid Build Coastguard Worker 	/** Maximal length of payload allowed */
71*4dc78e53SAndroid Build Coastguard Worker 	uint16_t	maxlen;
72*4dc78e53SAndroid Build Coastguard Worker };
73*4dc78e53SAndroid Build Coastguard Worker 
74*4dc78e53SAndroid Build Coastguard Worker /* Size calculations */
75*4dc78e53SAndroid Build Coastguard Worker extern int		nla_attr_size(int payload);
76*4dc78e53SAndroid Build Coastguard Worker extern int		nla_total_size(int payload);
77*4dc78e53SAndroid Build Coastguard Worker extern int		nla_padlen(int payload);
78*4dc78e53SAndroid Build Coastguard Worker 
79*4dc78e53SAndroid Build Coastguard Worker /* Attribute parsing */
80*4dc78e53SAndroid Build Coastguard Worker extern int		nla_type(const struct nlattr *);
81*4dc78e53SAndroid Build Coastguard Worker extern void *		nla_data(const struct nlattr *);
82*4dc78e53SAndroid Build Coastguard Worker extern int		nla_len(const struct nlattr *);
83*4dc78e53SAndroid Build Coastguard Worker extern int		nla_ok(const struct nlattr *, int);
84*4dc78e53SAndroid Build Coastguard Worker extern struct nlattr *	nla_next(const struct nlattr *, int *);
85*4dc78e53SAndroid Build Coastguard Worker extern int		nla_parse(struct nlattr **, int, struct nlattr *,
86*4dc78e53SAndroid Build Coastguard Worker 				  int, const struct nla_policy *);
87*4dc78e53SAndroid Build Coastguard Worker extern int		nla_validate(const struct nlattr *, int, int,
88*4dc78e53SAndroid Build Coastguard Worker 				     const struct nla_policy *);
89*4dc78e53SAndroid Build Coastguard Worker extern struct nlattr *	nla_find(const struct nlattr *, int, int);
90*4dc78e53SAndroid Build Coastguard Worker 
91*4dc78e53SAndroid Build Coastguard Worker /* Helper Functions */
92*4dc78e53SAndroid Build Coastguard Worker extern int		nla_memcpy(void *, const struct nlattr *, int);
93*4dc78e53SAndroid Build Coastguard Worker extern size_t		nla_strlcpy(char *, const struct nlattr *, size_t);
94*4dc78e53SAndroid Build Coastguard Worker extern int		nla_memcmp(const struct nlattr *, const void *, size_t);
95*4dc78e53SAndroid Build Coastguard Worker extern int		nla_strcmp(const struct nlattr *, const char *);
96*4dc78e53SAndroid Build Coastguard Worker 
97*4dc78e53SAndroid Build Coastguard Worker /* Unspecific attribute */
98*4dc78e53SAndroid Build Coastguard Worker extern struct nlattr *	nla_reserve(struct nl_msg *, int, int);
99*4dc78e53SAndroid Build Coastguard Worker extern int		nla_put(struct nl_msg *, int, int, const void *);
100*4dc78e53SAndroid Build Coastguard Worker extern int		nla_put_data(struct nl_msg *, int,
101*4dc78e53SAndroid Build Coastguard Worker 				     const struct nl_data *);
102*4dc78e53SAndroid Build Coastguard Worker extern int		nla_put_addr(struct nl_msg *, int, struct nl_addr *);
103*4dc78e53SAndroid Build Coastguard Worker 
104*4dc78e53SAndroid Build Coastguard Worker /* Integer attribute */
105*4dc78e53SAndroid Build Coastguard Worker extern int8_t           nla_get_s8(const struct nlattr *);
106*4dc78e53SAndroid Build Coastguard Worker extern int              nla_put_s8(struct nl_msg *, int, int8_t);
107*4dc78e53SAndroid Build Coastguard Worker extern uint8_t		nla_get_u8(const struct nlattr *);
108*4dc78e53SAndroid Build Coastguard Worker extern int		nla_put_u8(struct nl_msg *, int, uint8_t);
109*4dc78e53SAndroid Build Coastguard Worker extern int16_t          nla_get_s16(const struct nlattr *);
110*4dc78e53SAndroid Build Coastguard Worker extern int              nla_put_s16(struct nl_msg *, int, int16_t);
111*4dc78e53SAndroid Build Coastguard Worker extern uint16_t		nla_get_u16(const struct nlattr *);
112*4dc78e53SAndroid Build Coastguard Worker extern int		nla_put_u16(struct nl_msg *, int, uint16_t);
113*4dc78e53SAndroid Build Coastguard Worker extern int32_t          nla_get_s32(const struct nlattr *);
114*4dc78e53SAndroid Build Coastguard Worker extern int              nla_put_s32(struct nl_msg *, int, int32_t);
115*4dc78e53SAndroid Build Coastguard Worker extern uint32_t		nla_get_u32(const struct nlattr *);
116*4dc78e53SAndroid Build Coastguard Worker extern int		nla_put_u32(struct nl_msg *, int, uint32_t);
117*4dc78e53SAndroid Build Coastguard Worker extern int64_t          nla_get_s64(const struct nlattr *);
118*4dc78e53SAndroid Build Coastguard Worker extern int              nla_put_s64(struct nl_msg *, int, int64_t);
119*4dc78e53SAndroid Build Coastguard Worker extern uint64_t		nla_get_u64(const struct nlattr *);
120*4dc78e53SAndroid Build Coastguard Worker extern int		nla_put_u64(struct nl_msg *, int, uint64_t);
121*4dc78e53SAndroid Build Coastguard Worker 
122*4dc78e53SAndroid Build Coastguard Worker /* String attribute */
123*4dc78e53SAndroid Build Coastguard Worker extern char *		nla_get_string(const struct nlattr *);
124*4dc78e53SAndroid Build Coastguard Worker extern char *		nla_strdup(const struct nlattr *);
125*4dc78e53SAndroid Build Coastguard Worker extern int		nla_put_string(struct nl_msg *, int, const char *);
126*4dc78e53SAndroid Build Coastguard Worker 
127*4dc78e53SAndroid Build Coastguard Worker /* Flag attribute */
128*4dc78e53SAndroid Build Coastguard Worker extern int		nla_get_flag(const struct nlattr *);
129*4dc78e53SAndroid Build Coastguard Worker extern int		nla_put_flag(struct nl_msg *, int);
130*4dc78e53SAndroid Build Coastguard Worker 
131*4dc78e53SAndroid Build Coastguard Worker /* Msec attribute */
132*4dc78e53SAndroid Build Coastguard Worker extern unsigned long	nla_get_msecs(const struct nlattr *);
133*4dc78e53SAndroid Build Coastguard Worker extern int		nla_put_msecs(struct nl_msg *, int, unsigned long);
134*4dc78e53SAndroid Build Coastguard Worker 
135*4dc78e53SAndroid Build Coastguard Worker /* Attribute nesting */
136*4dc78e53SAndroid Build Coastguard Worker extern int		nla_put_nested(struct nl_msg *, int,
137*4dc78e53SAndroid Build Coastguard Worker 				       const struct nl_msg *);
138*4dc78e53SAndroid Build Coastguard Worker extern struct nlattr *	nla_nest_start(struct nl_msg *, int);
139*4dc78e53SAndroid Build Coastguard Worker extern int		nla_nest_end(struct nl_msg *, struct nlattr *);
140*4dc78e53SAndroid Build Coastguard Worker extern int		nla_nest_end_keep_empty(struct nl_msg *, struct nlattr *);
141*4dc78e53SAndroid Build Coastguard Worker extern void		nla_nest_cancel(struct nl_msg *, const struct nlattr *);
142*4dc78e53SAndroid Build Coastguard Worker extern int		nla_parse_nested(struct nlattr **, int, struct nlattr *,
143*4dc78e53SAndroid Build Coastguard Worker 					 const struct nla_policy *);
144*4dc78e53SAndroid Build Coastguard Worker extern int		nla_is_nested(const struct nlattr *);
145*4dc78e53SAndroid Build Coastguard Worker 
146*4dc78e53SAndroid Build Coastguard Worker /**
147*4dc78e53SAndroid Build Coastguard Worker  * @name Attribute Construction (Exception Based)
148*4dc78e53SAndroid Build Coastguard Worker  * @{
149*4dc78e53SAndroid Build Coastguard Worker  */
150*4dc78e53SAndroid Build Coastguard Worker 
151*4dc78e53SAndroid Build Coastguard Worker /**
152*4dc78e53SAndroid Build Coastguard Worker  * @ingroup attr
153*4dc78e53SAndroid Build Coastguard Worker  * Add unspecific attribute to netlink message.
154*4dc78e53SAndroid Build Coastguard Worker  * @arg msg		Netlink message.
155*4dc78e53SAndroid Build Coastguard Worker  * @arg attrtype	Attribute type.
156*4dc78e53SAndroid Build Coastguard Worker  * @arg attrlen		Length of attribute payload.
157*4dc78e53SAndroid Build Coastguard Worker  * @arg data		Head of attribute payload.
158*4dc78e53SAndroid Build Coastguard Worker  */
159*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT(msg, attrtype, attrlen, data) \
160*4dc78e53SAndroid Build Coastguard Worker 	do { \
161*4dc78e53SAndroid Build Coastguard Worker 		if (nla_put(msg, attrtype, attrlen, data) < 0) \
162*4dc78e53SAndroid Build Coastguard Worker 			goto nla_put_failure; \
163*4dc78e53SAndroid Build Coastguard Worker 	} while(0)
164*4dc78e53SAndroid Build Coastguard Worker 
165*4dc78e53SAndroid Build Coastguard Worker /**
166*4dc78e53SAndroid Build Coastguard Worker  * @ingroup attr
167*4dc78e53SAndroid Build Coastguard Worker  * Add atomic type attribute to netlink message.
168*4dc78e53SAndroid Build Coastguard Worker  * @arg msg		Netlink message.
169*4dc78e53SAndroid Build Coastguard Worker  * @arg type		Atomic type.
170*4dc78e53SAndroid Build Coastguard Worker  * @arg attrtype	Attribute type.
171*4dc78e53SAndroid Build Coastguard Worker  * @arg value		Head of attribute payload.
172*4dc78e53SAndroid Build Coastguard Worker  */
173*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_TYPE(msg, type, attrtype, value) \
174*4dc78e53SAndroid Build Coastguard Worker 	do { \
175*4dc78e53SAndroid Build Coastguard Worker 		type __tmp = value; \
176*4dc78e53SAndroid Build Coastguard Worker 		NLA_PUT(msg, attrtype, sizeof(type), &__tmp); \
177*4dc78e53SAndroid Build Coastguard Worker 	} while(0)
178*4dc78e53SAndroid Build Coastguard Worker 
179*4dc78e53SAndroid Build Coastguard Worker /**
180*4dc78e53SAndroid Build Coastguard Worker  * Add 8 bit signed integer attribute to netlink message.
181*4dc78e53SAndroid Build Coastguard Worker  * @arg msg		Netlink message.
182*4dc78e53SAndroid Build Coastguard Worker  * @arg attrtype	Attribute type.
183*4dc78e53SAndroid Build Coastguard Worker  * @arg value		Numeric value.
184*4dc78e53SAndroid Build Coastguard Worker  */
185*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_S8(msg, attrtype, value) \
186*4dc78e53SAndroid Build Coastguard Worker 	NLA_PUT_TYPE(msg, int8_t, attrtype, value)
187*4dc78e53SAndroid Build Coastguard Worker 
188*4dc78e53SAndroid Build Coastguard Worker /**
189*4dc78e53SAndroid Build Coastguard Worker  * Add 8 bit integer attribute to netlink message.
190*4dc78e53SAndroid Build Coastguard Worker  * @arg msg		Netlink message.
191*4dc78e53SAndroid Build Coastguard Worker  * @arg attrtype	Attribute type.
192*4dc78e53SAndroid Build Coastguard Worker  * @arg value		Numeric value.
193*4dc78e53SAndroid Build Coastguard Worker  */
194*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_U8(msg, attrtype, value) \
195*4dc78e53SAndroid Build Coastguard Worker 	NLA_PUT_TYPE(msg, uint8_t, attrtype, value)
196*4dc78e53SAndroid Build Coastguard Worker 
197*4dc78e53SAndroid Build Coastguard Worker /**
198*4dc78e53SAndroid Build Coastguard Worker  * Add 16 bit signed integer attribute to netlink message.
199*4dc78e53SAndroid Build Coastguard Worker  * @arg msg		Netlink message.
200*4dc78e53SAndroid Build Coastguard Worker  * @arg attrtype	Attribute type.
201*4dc78e53SAndroid Build Coastguard Worker  * @arg value		Numeric value.
202*4dc78e53SAndroid Build Coastguard Worker  */
203*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_S16(msg, attrtype, value) \
204*4dc78e53SAndroid Build Coastguard Worker 	NLA_PUT_TYPE(msg, int16_t, attrtype, value)
205*4dc78e53SAndroid Build Coastguard Worker 
206*4dc78e53SAndroid Build Coastguard Worker /**
207*4dc78e53SAndroid Build Coastguard Worker  * Add 16 bit integer attribute to netlink message.
208*4dc78e53SAndroid Build Coastguard Worker  * @arg msg		Netlink message.
209*4dc78e53SAndroid Build Coastguard Worker  * @arg attrtype	Attribute type.
210*4dc78e53SAndroid Build Coastguard Worker  * @arg value		Numeric value.
211*4dc78e53SAndroid Build Coastguard Worker  */
212*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_U16(msg, attrtype, value) \
213*4dc78e53SAndroid Build Coastguard Worker 	NLA_PUT_TYPE(msg, uint16_t, attrtype, value)
214*4dc78e53SAndroid Build Coastguard Worker 
215*4dc78e53SAndroid Build Coastguard Worker /**
216*4dc78e53SAndroid Build Coastguard Worker  * Add 32 bit signed integer attribute to netlink message.
217*4dc78e53SAndroid Build Coastguard Worker  * @arg msg		Netlink message.
218*4dc78e53SAndroid Build Coastguard Worker  * @arg attrtype	Attribute type.
219*4dc78e53SAndroid Build Coastguard Worker  * @arg value		Numeric value.
220*4dc78e53SAndroid Build Coastguard Worker  */
221*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_S32(msg, attrtype, value) \
222*4dc78e53SAndroid Build Coastguard Worker 	NLA_PUT_TYPE(msg, int32_t, attrtype, value)
223*4dc78e53SAndroid Build Coastguard Worker 
224*4dc78e53SAndroid Build Coastguard Worker /**
225*4dc78e53SAndroid Build Coastguard Worker  * Add 32 bit integer attribute to netlink message.
226*4dc78e53SAndroid Build Coastguard Worker  * @arg msg		Netlink message.
227*4dc78e53SAndroid Build Coastguard Worker  * @arg attrtype	Attribute type.
228*4dc78e53SAndroid Build Coastguard Worker  * @arg value		Numeric value.
229*4dc78e53SAndroid Build Coastguard Worker  */
230*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_U32(msg, attrtype, value) \
231*4dc78e53SAndroid Build Coastguard Worker 	NLA_PUT_TYPE(msg, uint32_t, attrtype, value)
232*4dc78e53SAndroid Build Coastguard Worker 
233*4dc78e53SAndroid Build Coastguard Worker /**
234*4dc78e53SAndroid Build Coastguard Worker  * Add 64 bit signed integer attribute to netlink message.
235*4dc78e53SAndroid Build Coastguard Worker  * @arg msg		Netlink message.
236*4dc78e53SAndroid Build Coastguard Worker  * @arg attrtype	Attribute type.
237*4dc78e53SAndroid Build Coastguard Worker  * @arg value		Numeric value.
238*4dc78e53SAndroid Build Coastguard Worker  */
239*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_S64(msg, attrtype, value) \
240*4dc78e53SAndroid Build Coastguard Worker 	NLA_PUT_TYPE(msg, int64_t, attrtype, value)
241*4dc78e53SAndroid Build Coastguard Worker 
242*4dc78e53SAndroid Build Coastguard Worker /**
243*4dc78e53SAndroid Build Coastguard Worker  * Add 64 bit integer attribute to netlink message.
244*4dc78e53SAndroid Build Coastguard Worker  * @arg msg		Netlink message.
245*4dc78e53SAndroid Build Coastguard Worker  * @arg attrtype	Attribute type.
246*4dc78e53SAndroid Build Coastguard Worker  * @arg value		Numeric value.
247*4dc78e53SAndroid Build Coastguard Worker  */
248*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_U64(msg, attrtype, value) \
249*4dc78e53SAndroid Build Coastguard Worker 	NLA_PUT_TYPE(msg, uint64_t, attrtype, value)
250*4dc78e53SAndroid Build Coastguard Worker 
251*4dc78e53SAndroid Build Coastguard Worker /**
252*4dc78e53SAndroid Build Coastguard Worker  * Add string attribute to netlink message.
253*4dc78e53SAndroid Build Coastguard Worker  * @arg msg		Netlink message.
254*4dc78e53SAndroid Build Coastguard Worker  * @arg attrtype	Attribute type.
255*4dc78e53SAndroid Build Coastguard Worker  * @arg value		NUL terminated character string.
256*4dc78e53SAndroid Build Coastguard Worker  */
257*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_STRING(msg, attrtype, value) \
258*4dc78e53SAndroid Build Coastguard Worker 	NLA_PUT(msg, attrtype, (int) strlen(value) + 1, value)
259*4dc78e53SAndroid Build Coastguard Worker 
260*4dc78e53SAndroid Build Coastguard Worker /**
261*4dc78e53SAndroid Build Coastguard Worker  * Add flag attribute to netlink message.
262*4dc78e53SAndroid Build Coastguard Worker  * @arg msg		Netlink message.
263*4dc78e53SAndroid Build Coastguard Worker  * @arg attrtype	Attribute type.
264*4dc78e53SAndroid Build Coastguard Worker  */
265*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_FLAG(msg, attrtype) \
266*4dc78e53SAndroid Build Coastguard Worker 	NLA_PUT(msg, attrtype, 0, NULL)
267*4dc78e53SAndroid Build Coastguard Worker 
268*4dc78e53SAndroid Build Coastguard Worker /**
269*4dc78e53SAndroid Build Coastguard Worker  * Add msecs attribute to netlink message.
270*4dc78e53SAndroid Build Coastguard Worker  * @arg msg		Netlink message.
271*4dc78e53SAndroid Build Coastguard Worker  * @arg attrtype	Attribute type.
272*4dc78e53SAndroid Build Coastguard Worker  * @arg msecs		Numeric value in micro seconds.
273*4dc78e53SAndroid Build Coastguard Worker  */
274*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_MSECS(msg, attrtype, msecs) \
275*4dc78e53SAndroid Build Coastguard Worker 	NLA_PUT_U64(msg, attrtype, msecs)
276*4dc78e53SAndroid Build Coastguard Worker 
277*4dc78e53SAndroid Build Coastguard Worker /**
278*4dc78e53SAndroid Build Coastguard Worker  * Add address attribute to netlink message.
279*4dc78e53SAndroid Build Coastguard Worker  * @arg msg		Netlink message.
280*4dc78e53SAndroid Build Coastguard Worker  * @arg attrtype	Attribute type.
281*4dc78e53SAndroid Build Coastguard Worker  * @arg addr		Abstract address object.
282*4dc78e53SAndroid Build Coastguard Worker  */
283*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_ADDR(msg, attrtype, addr) \
284*4dc78e53SAndroid Build Coastguard Worker 	NLA_PUT(msg, attrtype, nl_addr_get_len(addr), \
285*4dc78e53SAndroid Build Coastguard Worker 		nl_addr_get_binary_addr(addr))
286*4dc78e53SAndroid Build Coastguard Worker 
287*4dc78e53SAndroid Build Coastguard Worker /**
288*4dc78e53SAndroid Build Coastguard Worker  * Add abstract data attribute to netlink message.
289*4dc78e53SAndroid Build Coastguard Worker  * @arg msg		Netlink message.
290*4dc78e53SAndroid Build Coastguard Worker  * @arg attrtype	Attribute type.
291*4dc78e53SAndroid Build Coastguard Worker  * @arg data		Abstract data object.
292*4dc78e53SAndroid Build Coastguard Worker  */
293*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_DATA(msg, attrtype, data) \
294*4dc78e53SAndroid Build Coastguard Worker 	NLA_PUT(msg, attrtype, nl_data_get_size(data), \
295*4dc78e53SAndroid Build Coastguard Worker 		nl_data_get(data))
296*4dc78e53SAndroid Build Coastguard Worker 
297*4dc78e53SAndroid Build Coastguard Worker /** @} */
298*4dc78e53SAndroid Build Coastguard Worker 
299*4dc78e53SAndroid Build Coastguard Worker /**
300*4dc78e53SAndroid Build Coastguard Worker  * @name Iterators
301*4dc78e53SAndroid Build Coastguard Worker  * @{
302*4dc78e53SAndroid Build Coastguard Worker  */
303*4dc78e53SAndroid Build Coastguard Worker 
304*4dc78e53SAndroid Build Coastguard Worker /**
305*4dc78e53SAndroid Build Coastguard Worker  * @ingroup attr
306*4dc78e53SAndroid Build Coastguard Worker  * Iterate over a stream of attributes
307*4dc78e53SAndroid Build Coastguard Worker  * @arg pos	loop counter, set to current attribute
308*4dc78e53SAndroid Build Coastguard Worker  * @arg head	head of attribute stream
309*4dc78e53SAndroid Build Coastguard Worker  * @arg len	length of attribute stream
310*4dc78e53SAndroid Build Coastguard Worker  * @arg rem	initialized to len, holds bytes currently remaining in stream
311*4dc78e53SAndroid Build Coastguard Worker  */
312*4dc78e53SAndroid Build Coastguard Worker #define nla_for_each_attr(pos, head, len, rem) \
313*4dc78e53SAndroid Build Coastguard Worker 	for (pos = head, rem = len; \
314*4dc78e53SAndroid Build Coastguard Worker 	     nla_ok(pos, rem); \
315*4dc78e53SAndroid Build Coastguard Worker 	     pos = nla_next(pos, &(rem)))
316*4dc78e53SAndroid Build Coastguard Worker 
317*4dc78e53SAndroid Build Coastguard Worker /**
318*4dc78e53SAndroid Build Coastguard Worker  * @ingroup attr
319*4dc78e53SAndroid Build Coastguard Worker  * Iterate over a stream of nested attributes
320*4dc78e53SAndroid Build Coastguard Worker  * @arg pos	loop counter, set to current attribute
321*4dc78e53SAndroid Build Coastguard Worker  * @arg nla	attribute containing the nested attributes
322*4dc78e53SAndroid Build Coastguard Worker  * @arg rem	initialized to len, holds bytes currently remaining in stream
323*4dc78e53SAndroid Build Coastguard Worker  */
324*4dc78e53SAndroid Build Coastguard Worker #define nla_for_each_nested(pos, nla, rem) \
325*4dc78e53SAndroid Build Coastguard Worker 	for (pos = (struct nlattr *) nla_data(nla), rem = nla_len(nla); \
326*4dc78e53SAndroid Build Coastguard Worker 	     nla_ok(pos, rem); \
327*4dc78e53SAndroid Build Coastguard Worker 	     pos = nla_next(pos, &(rem)))
328*4dc78e53SAndroid Build Coastguard Worker 
329*4dc78e53SAndroid Build Coastguard Worker /** @} */
330*4dc78e53SAndroid Build Coastguard Worker 
331*4dc78e53SAndroid Build Coastguard Worker #ifdef __cplusplus
332*4dc78e53SAndroid Build Coastguard Worker }
333*4dc78e53SAndroid Build Coastguard Worker #endif
334*4dc78e53SAndroid Build Coastguard Worker 
335*4dc78e53SAndroid Build Coastguard Worker #endif
336