2 * NETLINK Netlink attributes
4 * Authors: Thomas Graf <tgraf@suug.ch>
5 * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
8 #include <linux/module.h>
9 #include <linux/kernel.h>
10 #include <linux/errno.h>
11 #include <linux/jiffies.h>
12 #include <linux/netdevice.h>
13 #include <linux/skbuff.h>
14 #include <linux/string.h>
15 #include <linux/types.h>
16 #include <net/netlink.h>
18 static const u16 nla_attr_minlen
[NLA_TYPE_MAX
+1] = {
19 [NLA_U8
] = sizeof(u8
),
20 [NLA_U16
] = sizeof(u16
),
21 [NLA_U32
] = sizeof(u32
),
22 [NLA_U64
] = sizeof(u64
),
23 [NLA_MSECS
] = sizeof(u64
),
24 [NLA_NESTED
] = NLA_HDRLEN
,
27 static int validate_nla(const struct nlattr
*nla
, int maxtype
,
28 const struct nla_policy
*policy
)
30 const struct nla_policy
*pt
;
31 int minlen
= 0, attrlen
= nla_len(nla
), type
= nla_type(nla
);
33 if (type
<= 0 || type
> maxtype
)
38 BUG_ON(pt
->type
> NLA_TYPE_MAX
);
48 minlen
= min_t(int, attrlen
, pt
->len
+ 1);
52 if (!minlen
|| memchr(nla_data(nla
), '\0', minlen
) == NULL
)
61 char *buf
= nla_data(nla
);
63 if (buf
[attrlen
- 1] == '\0')
66 if (attrlen
> pt
->len
)
72 if (pt
->len
&& attrlen
> pt
->len
)
76 case NLA_NESTED_COMPAT
:
77 if (attrlen
< pt
->len
)
79 if (attrlen
< NLA_ALIGN(pt
->len
))
81 if (attrlen
< NLA_ALIGN(pt
->len
) + NLA_HDRLEN
)
83 nla
= nla_data(nla
) + NLA_ALIGN(pt
->len
);
84 if (attrlen
< NLA_ALIGN(pt
->len
) + NLA_HDRLEN
+ nla_len(nla
))
88 /* a nested attributes is allowed to be empty; if its not,
89 * it must have a size of at least NLA_HDRLEN.
96 else if (pt
->type
!= NLA_UNSPEC
)
97 minlen
= nla_attr_minlen
[pt
->type
];
107 * nla_validate - Validate a stream of attributes
108 * @head: head of attribute stream
109 * @len: length of attribute stream
110 * @maxtype: maximum attribute type to be expected
111 * @policy: validation policy
113 * Validates all attributes in the specified attribute stream against the
114 * specified policy. Attributes with a type exceeding maxtype will be
115 * ignored. See documenation of struct nla_policy for more details.
117 * Returns 0 on success or a negative error code.
119 int nla_validate(const struct nlattr
*head
, int len
, int maxtype
,
120 const struct nla_policy
*policy
)
122 const struct nlattr
*nla
;
125 nla_for_each_attr(nla
, head
, len
, rem
) {
126 err
= validate_nla(nla
, maxtype
, policy
);
137 * nla_policy_len - Determin the max. length of a policy
138 * @policy: policy to use
139 * @n: number of policies
141 * Determines the max. length of the policy. It is currently used
142 * to allocated Netlink buffers roughly the size of the actual
145 * Returns 0 on success or a negative error code.
148 nla_policy_len(const struct nla_policy
*p
, int n
)
152 for (i
= 0; i
< n
; i
++, p
++) {
154 len
+= nla_total_size(p
->len
);
155 else if (nla_attr_minlen
[p
->type
])
156 len
+= nla_total_size(nla_attr_minlen
[p
->type
]);
163 * nla_parse - Parse a stream of attributes into a tb buffer
164 * @tb: destination array with maxtype+1 elements
165 * @maxtype: maximum attribute type to be expected
166 * @head: head of attribute stream
167 * @len: length of attribute stream
168 * @policy: validation policy
170 * Parses a stream of attributes and stores a pointer to each attribute in
171 * the tb array accessible via the attribute type. Attributes with a type
172 * exceeding maxtype will be silently ignored for backwards compatibility
173 * reasons. policy may be set to NULL if no validation is required.
175 * Returns 0 on success or a negative error code.
177 int nla_parse(struct nlattr
**tb
, int maxtype
, const struct nlattr
*head
,
178 int len
, const struct nla_policy
*policy
)
180 const struct nlattr
*nla
;
183 memset(tb
, 0, sizeof(struct nlattr
*) * (maxtype
+ 1));
185 nla_for_each_attr(nla
, head
, len
, rem
) {
186 u16 type
= nla_type(nla
);
188 if (type
> 0 && type
<= maxtype
) {
190 err
= validate_nla(nla
, maxtype
, policy
);
195 tb
[type
] = (struct nlattr
*)nla
;
199 if (unlikely(rem
> 0))
200 printk(KERN_WARNING
"netlink: %d bytes leftover after parsing "
201 "attributes.\n", rem
);
209 * nla_find - Find a specific attribute in a stream of attributes
210 * @head: head of attribute stream
211 * @len: length of attribute stream
212 * @attrtype: type of attribute to look for
214 * Returns the first attribute in the stream matching the specified type.
216 struct nlattr
*nla_find(const struct nlattr
*head
, int len
, int attrtype
)
218 const struct nlattr
*nla
;
221 nla_for_each_attr(nla
, head
, len
, rem
)
222 if (nla_type(nla
) == attrtype
)
223 return (struct nlattr
*)nla
;
229 * nla_strlcpy - Copy string attribute payload into a sized buffer
230 * @dst: where to copy the string to
231 * @nla: attribute to copy the string from
232 * @dstsize: size of destination buffer
234 * Copies at most dstsize - 1 bytes into the destination buffer.
235 * The result is always a valid NUL-terminated string. Unlike
236 * strlcpy the destination buffer is always padded out.
238 * Returns the length of the source buffer.
240 size_t nla_strlcpy(char *dst
, const struct nlattr
*nla
, size_t dstsize
)
242 size_t srclen
= nla_len(nla
);
243 char *src
= nla_data(nla
);
245 if (srclen
> 0 && src
[srclen
- 1] == '\0')
249 size_t len
= (srclen
>= dstsize
) ? dstsize
- 1 : srclen
;
251 memset(dst
, 0, dstsize
);
252 memcpy(dst
, src
, len
);
259 * nla_memcpy - Copy a netlink attribute into another memory area
260 * @dest: where to copy to memcpy
261 * @src: netlink attribute to copy from
262 * @count: size of the destination area
264 * Note: The number of bytes copied is limited by the length of
265 * attribute's payload. memcpy
267 * Returns the number of bytes copied.
269 int nla_memcpy(void *dest
, const struct nlattr
*src
, int count
)
271 int minlen
= min_t(int, count
, nla_len(src
));
273 memcpy(dest
, nla_data(src
), minlen
);
279 * nla_memcmp - Compare an attribute with sized memory area
280 * @nla: netlink attribute
282 * @size: size of memory area
284 int nla_memcmp(const struct nlattr
*nla
, const void *data
,
287 int d
= nla_len(nla
) - size
;
290 d
= memcmp(nla_data(nla
), data
, size
);
296 * nla_strcmp - Compare a string attribute against a string
297 * @nla: netlink string attribute
298 * @str: another string
300 int nla_strcmp(const struct nlattr
*nla
, const char *str
)
302 int len
= strlen(str
) + 1;
303 int d
= nla_len(nla
) - len
;
306 d
= memcmp(nla_data(nla
), str
, len
);
313 * __nla_reserve - reserve room for attribute on the skb
314 * @skb: socket buffer to reserve room on
315 * @attrtype: attribute type
316 * @attrlen: length of attribute payload
318 * Adds a netlink attribute header to a socket buffer and reserves
319 * room for the payload but does not copy it.
321 * The caller is responsible to ensure that the skb provides enough
322 * tailroom for the attribute header and payload.
324 struct nlattr
*__nla_reserve(struct sk_buff
*skb
, int attrtype
, int attrlen
)
328 nla
= (struct nlattr
*) skb_put(skb
, nla_total_size(attrlen
));
329 nla
->nla_type
= attrtype
;
330 nla
->nla_len
= nla_attr_size(attrlen
);
332 memset((unsigned char *) nla
+ nla
->nla_len
, 0, nla_padlen(attrlen
));
336 EXPORT_SYMBOL(__nla_reserve
);
339 * __nla_reserve_nohdr - reserve room for attribute without header
340 * @skb: socket buffer to reserve room on
341 * @attrlen: length of attribute payload
343 * Reserves room for attribute payload without a header.
345 * The caller is responsible to ensure that the skb provides enough
346 * tailroom for the payload.
348 void *__nla_reserve_nohdr(struct sk_buff
*skb
, int attrlen
)
352 start
= skb_put(skb
, NLA_ALIGN(attrlen
));
353 memset(start
, 0, NLA_ALIGN(attrlen
));
357 EXPORT_SYMBOL(__nla_reserve_nohdr
);
360 * nla_reserve - reserve room for attribute on the skb
361 * @skb: socket buffer to reserve room on
362 * @attrtype: attribute type
363 * @attrlen: length of attribute payload
365 * Adds a netlink attribute header to a socket buffer and reserves
366 * room for the payload but does not copy it.
368 * Returns NULL if the tailroom of the skb is insufficient to store
369 * the attribute header and payload.
371 struct nlattr
*nla_reserve(struct sk_buff
*skb
, int attrtype
, int attrlen
)
373 if (unlikely(skb_tailroom(skb
) < nla_total_size(attrlen
)))
376 return __nla_reserve(skb
, attrtype
, attrlen
);
378 EXPORT_SYMBOL(nla_reserve
);
381 * nla_reserve_nohdr - reserve room for attribute without header
382 * @skb: socket buffer to reserve room on
383 * @attrlen: length of attribute payload
385 * Reserves room for attribute payload without a header.
387 * Returns NULL if the tailroom of the skb is insufficient to store
388 * the attribute payload.
390 void *nla_reserve_nohdr(struct sk_buff
*skb
, int attrlen
)
392 if (unlikely(skb_tailroom(skb
) < NLA_ALIGN(attrlen
)))
395 return __nla_reserve_nohdr(skb
, attrlen
);
397 EXPORT_SYMBOL(nla_reserve_nohdr
);
400 * __nla_put - Add a netlink attribute to a socket buffer
401 * @skb: socket buffer to add attribute to
402 * @attrtype: attribute type
403 * @attrlen: length of attribute payload
404 * @data: head of attribute payload
406 * The caller is responsible to ensure that the skb provides enough
407 * tailroom for the attribute header and payload.
409 void __nla_put(struct sk_buff
*skb
, int attrtype
, int attrlen
,
414 nla
= __nla_reserve(skb
, attrtype
, attrlen
);
415 memcpy(nla_data(nla
), data
, attrlen
);
417 EXPORT_SYMBOL(__nla_put
);
420 * __nla_put_nohdr - Add a netlink attribute without header
421 * @skb: socket buffer to add attribute to
422 * @attrlen: length of attribute payload
423 * @data: head of attribute payload
425 * The caller is responsible to ensure that the skb provides enough
426 * tailroom for the attribute payload.
428 void __nla_put_nohdr(struct sk_buff
*skb
, int attrlen
, const void *data
)
432 start
= __nla_reserve_nohdr(skb
, attrlen
);
433 memcpy(start
, data
, attrlen
);
435 EXPORT_SYMBOL(__nla_put_nohdr
);
438 * nla_put - Add a netlink attribute to a socket buffer
439 * @skb: socket buffer to add attribute to
440 * @attrtype: attribute type
441 * @attrlen: length of attribute payload
442 * @data: head of attribute payload
444 * Returns -EMSGSIZE if the tailroom of the skb is insufficient to store
445 * the attribute header and payload.
447 int nla_put(struct sk_buff
*skb
, int attrtype
, int attrlen
, const void *data
)
449 if (unlikely(skb_tailroom(skb
) < nla_total_size(attrlen
)))
452 __nla_put(skb
, attrtype
, attrlen
, data
);
455 EXPORT_SYMBOL(nla_put
);
458 * nla_put_nohdr - Add a netlink attribute without header
459 * @skb: socket buffer to add attribute to
460 * @attrlen: length of attribute payload
461 * @data: head of attribute payload
463 * Returns -EMSGSIZE if the tailroom of the skb is insufficient to store
464 * the attribute payload.
466 int nla_put_nohdr(struct sk_buff
*skb
, int attrlen
, const void *data
)
468 if (unlikely(skb_tailroom(skb
) < NLA_ALIGN(attrlen
)))
471 __nla_put_nohdr(skb
, attrlen
, data
);
474 EXPORT_SYMBOL(nla_put_nohdr
);
477 * nla_append - Add a netlink attribute without header or padding
478 * @skb: socket buffer to add attribute to
479 * @attrlen: length of attribute payload
480 * @data: head of attribute payload
482 * Returns -EMSGSIZE if the tailroom of the skb is insufficient to store
483 * the attribute payload.
485 int nla_append(struct sk_buff
*skb
, int attrlen
, const void *data
)
487 if (unlikely(skb_tailroom(skb
) < NLA_ALIGN(attrlen
)))
490 memcpy(skb_put(skb
, attrlen
), data
, attrlen
);
493 EXPORT_SYMBOL(nla_append
);
496 EXPORT_SYMBOL(nla_validate
);
497 EXPORT_SYMBOL(nla_policy_len
);
498 EXPORT_SYMBOL(nla_parse
);
499 EXPORT_SYMBOL(nla_find
);
500 EXPORT_SYMBOL(nla_strlcpy
);
501 EXPORT_SYMBOL(nla_memcpy
);
502 EXPORT_SYMBOL(nla_memcmp
);
503 EXPORT_SYMBOL(nla_strcmp
);