aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/netlink.h3
-rw-r--r--net/netlink/attr.c19
2 files changed, 22 insertions, 0 deletions
diff --git a/include/net/netlink.h b/include/net/netlink.h
index a5e6d0ef51dd..a5506c42f03c 100644
--- a/include/net/netlink.h
+++ b/include/net/netlink.h
@@ -91,6 +91,7 @@
91 * nla_reserve_nohdr(skb, len) reserve room for an attribute w/o hdr 91 * nla_reserve_nohdr(skb, len) reserve room for an attribute w/o hdr
92 * nla_put(skb, type, len, data) add attribute to skb 92 * nla_put(skb, type, len, data) add attribute to skb
93 * nla_put_nohdr(skb, len, data) add attribute w/o hdr 93 * nla_put_nohdr(skb, len, data) add attribute w/o hdr
94 * nla_append(skb, len, data) append data to skb
94 * 95 *
95 * Attribute Construction for Basic Types: 96 * Attribute Construction for Basic Types:
96 * nla_put_u8(skb, type, value) add u8 attribute to skb 97 * nla_put_u8(skb, type, value) add u8 attribute to skb
@@ -254,6 +255,8 @@ extern int nla_put(struct sk_buff *skb, int attrtype,
254 int attrlen, const void *data); 255 int attrlen, const void *data);
255extern int nla_put_nohdr(struct sk_buff *skb, int attrlen, 256extern int nla_put_nohdr(struct sk_buff *skb, int attrlen,
256 const void *data); 257 const void *data);
258extern int nla_append(struct sk_buff *skb, int attrlen,
259 const void *data);
257 260
258/************************************************************************** 261/**************************************************************************
259 * Netlink Messages 262 * Netlink Messages
diff --git a/net/netlink/attr.c b/net/netlink/attr.c
index ec39d12c2423..feb326f4a752 100644
--- a/net/netlink/attr.c
+++ b/net/netlink/attr.c
@@ -430,6 +430,24 @@ int nla_put_nohdr(struct sk_buff *skb, int attrlen, const void *data)
430 return 0; 430 return 0;
431} 431}
432 432
433/**
434 * nla_append - Add a netlink attribute without header or padding
435 * @skb: socket buffer to add attribute to
436 * @attrlen: length of attribute payload
437 * @data: head of attribute payload
438 *
439 * Returns -1 if the tailroom of the skb is insufficient to store
440 * the attribute payload.
441 */
442int nla_append(struct sk_buff *skb, int attrlen, const void *data)
443{
444 if (unlikely(skb_tailroom(skb) < NLA_ALIGN(attrlen)))
445 return -1;
446
447 memcpy(skb_put(skb, attrlen), data, attrlen);
448 return 0;
449}
450
433EXPORT_SYMBOL(nla_validate); 451EXPORT_SYMBOL(nla_validate);
434EXPORT_SYMBOL(nla_parse); 452EXPORT_SYMBOL(nla_parse);
435EXPORT_SYMBOL(nla_find); 453EXPORT_SYMBOL(nla_find);
@@ -445,3 +463,4 @@ EXPORT_SYMBOL(nla_put_nohdr);
445EXPORT_SYMBOL(nla_memcpy); 463EXPORT_SYMBOL(nla_memcpy);
446EXPORT_SYMBOL(nla_memcmp); 464EXPORT_SYMBOL(nla_memcmp);
447EXPORT_SYMBOL(nla_strcmp); 465EXPORT_SYMBOL(nla_strcmp);
466EXPORT_SYMBOL(nla_append);