netlink: add nla_policy_len()
authorHolger Eitzenberger <holger@eitzenberger.org>
Wed, 25 Mar 2009 17:26:30 +0000 (18:26 +0100)
committerPatrick McHardy <kaber@trash.net>
Wed, 25 Mar 2009 17:26:30 +0000 (18:26 +0100)
It calculates the max. length of a Netlink policy, which is usefull
for allocating Netlink buffers roughly the size of the actual
message.

Signed-off-by: Holger Eitzenberger <holger@eitzenberger.org>
Signed-off-by: Patrick McHardy <kaber@trash.net>
include/net/netlink.h
net/netlink/attr.c

index 8a6150a..eddb502 100644 (file)
@@ -230,6 +230,7 @@ extern int          nla_validate(struct nlattr *head, int len, int maxtype,
 extern int             nla_parse(struct nlattr *tb[], int maxtype,
                                  struct nlattr *head, int len,
                                  const struct nla_policy *policy);
+extern int             nla_policy_len(const struct nla_policy *, int);
 extern struct nlattr * nla_find(struct nlattr *head, int len, int attrtype);
 extern size_t          nla_strlcpy(char *dst, const struct nlattr *nla,
                                    size_t dstsize);
index 56c3ce7..ae32c57 100644 (file)
@@ -133,6 +133,32 @@ errout:
 }
 
 /**
+ * nla_policy_len - Determin the max. length of a policy
+ * @policy: policy to use
+ * @n: number of policies
+ *
+ * Determines the max. length of the policy.  It is currently used
+ * to allocated Netlink buffers roughly the size of the actual
+ * message.
+ *
+ * Returns 0 on success or a negative error code.
+ */
+int
+nla_policy_len(const struct nla_policy *p, int n)
+{
+       int i, len = 0;
+
+       for (i = 0; i < n; i++) {
+               if (p->len)
+                       len += nla_total_size(p->len);
+               else if (nla_attr_minlen[p->type])
+                       len += nla_total_size(nla_attr_minlen[p->type]);
+       }
+
+       return len;
+}
+
+/**
  * nla_parse - Parse a stream of attributes into a tb buffer
  * @tb: destination array with maxtype+1 elements
  * @maxtype: maximum attribute type to be expected
@@ -456,6 +482,7 @@ int nla_append(struct sk_buff *skb, int attrlen, const void *data)
 }
 
 EXPORT_SYMBOL(nla_validate);
+EXPORT_SYMBOL(nla_policy_len);
 EXPORT_SYMBOL(nla_parse);
 EXPORT_SYMBOL(nla_find);
 EXPORT_SYMBOL(nla_strlcpy);