[NETLINK]: Fix typos in comments in netlink.h
[safe/jmp/linux-2.6] / include / net / netlink.h
index 7b510a9..1afd3e8 100644 (file)
@@ -84,7 +84,7 @@
  *   nla_next(nla)-----------------------------'
  *
  * Data Structures:
- *   struct nlattr                     netlink attribtue header
+ *   struct nlattr                     netlink attribute header
  *
  * Attribute Construction:
  *   nla_reserve(skb, type, len)       reserve room for an attribute
  * Nested Attributes Construction:
  *   nla_nest_start(skb, type)         start a nested attribute
  *   nla_nest_end(skb, nla)            finalize a nested attribute
+ *   nla_nest_compat_start(skb, type,  start a nested compat attribute
+ *                        len, data)
+ *   nla_nest_compat_end(skb, type)    finalize a nested compat attribute
  *   nla_nest_cancel(skb, nla)         cancel nested attribute construction
  *
  * Attribute Length Calculations:
  *   nla_find_nested()                 find attribute in nested attributes
  *   nla_parse()                       parse and validate stream of attrs
  *   nla_parse_nested()                        parse nested attribuets
+ *   nla_parse_nested_compat()         parse nested compat attributes
  *   nla_for_each_attr()               loop over all attributes
  *   nla_for_each_nested()             loop over the nested attributes
  *=========================================================================
@@ -170,6 +174,7 @@ enum {
        NLA_FLAG,
        NLA_MSECS,
        NLA_NESTED,
+       NLA_NESTED_COMPAT,
        NLA_NUL_STRING,
        NLA_BINARY,
        __NLA_TYPE_MAX,
@@ -190,6 +195,7 @@ enum {
  *    NLA_NUL_STRING       Maximum length of string (excluding NUL)
  *    NLA_FLAG             Unused
  *    NLA_BINARY           Maximum length of attribute payload
+ *    NLA_NESTED_COMPAT    Exact length of structure payload
  *    All other            Exact length of attribute payload
  *
  * Example:
@@ -214,7 +220,7 @@ struct nl_info {
        u32                     pid;
 };
 
-extern void            netlink_run_queue(struct sock *sk, unsigned int *qlen,
+extern unsigned int    netlink_run_queue(struct sock *sk, unsigned int qlen,
                                          int (*cb)(struct sk_buff *,
                                                    struct nlmsghdr *));
 extern int             nlmsg_notify(struct sock *sk, struct sk_buff *skb,
@@ -661,6 +667,15 @@ static inline int nla_padlen(int payload)
 }
 
 /**
+ * nla_type - attribute type
+ * @nla: netlink attribute
+ */
+static inline int nla_type(const struct nlattr *nla)
+{
+       return nla->nla_type & NLA_TYPE_MASK;
+}
+
+/**
  * nla_data - head of payload
  * @nla: netlink attribute
  */
@@ -691,7 +706,7 @@ static inline int nla_ok(const struct nlattr *nla, int remaining)
 }
 
 /**
- * nla_next - next netlink attribte in attribute stream
+ * nla_next - next netlink attribute in attribute stream
  * @nla: netlink attribute
  * @remaining: number of bytes remaining in attribute stream
  *
@@ -733,8 +748,41 @@ static inline int nla_parse_nested(struct nlattr *tb[], int maxtype,
 {
        return nla_parse(tb, maxtype, nla_data(nla), nla_len(nla), policy);
 }
+
 /**
- * nla_put_u8 - Add a u16 netlink attribute to a socket buffer
+ * nla_parse_nested_compat - parse nested compat attributes
+ * @tb: destination array with maxtype+1 elements
+ * @maxtype: maximum attribute type to be expected
+ * @nla: attribute containing the nested attributes
+ * @data: pointer to point to contained structure
+ * @len: length of contained structure
+ * @policy: validation policy
+ *
+ * Parse a nested compat attribute. The compat attribute contains a structure
+ * and optionally a set of nested attributes. On success the data pointer
+ * points to the nested data and tb contains the parsed attributes
+ * (see nla_parse).
+ */
+static inline int __nla_parse_nested_compat(struct nlattr *tb[], int maxtype,
+                                           struct nlattr *nla,
+                                           const struct nla_policy *policy,
+                                           int len)
+{
+       if (nla_len(nla) < len)
+               return -1;
+       if (nla_len(nla) >= NLA_ALIGN(len) + sizeof(struct nlattr))
+               return nla_parse_nested(tb, maxtype,
+                                       nla_data(nla) + NLA_ALIGN(len),
+                                       policy);
+       memset(tb, 0, sizeof(struct nlattr *) * (maxtype + 1));
+       return 0;
+}
+
+#define nla_parse_nested_compat(tb, maxtype, nla, policy, data, len) \
+({     data = nla_len(nla) >= len ? nla_data(nla) : NULL; \
+       __nla_parse_nested_compat(tb, maxtype, nla, policy, len); })
+/**
+ * nla_put_u8 - Add a u8 netlink attribute to a socket buffer
  * @skb: socket buffer to add attribute to
  * @attrtype: attribute type
  * @value: numeric value
@@ -950,7 +998,7 @@ static inline struct nlattr *nla_nest_start(struct sk_buff *skb, int attrtype)
 
 /**
  * nla_nest_end - Finalize nesting of attributes
- * @skb: socket buffer the attribtues are stored in
+ * @skb: socket buffer the attributes are stored in
  * @start: container attribute
  *
  * Corrects the container attribute header to include the all
@@ -965,6 +1013,51 @@ static inline int nla_nest_end(struct sk_buff *skb, struct nlattr *start)
 }
 
 /**
+ * nla_nest_compat_start - Start a new level of nested compat attributes
+ * @skb: socket buffer to add attributes to
+ * @attrtype: attribute type of container
+ * @attrlen: length of structure
+ * @data: pointer to structure
+ *
+ * Start a nested compat attribute that contains both a structure and
+ * a set of nested attributes.
+ *
+ * Returns the container attribute
+ */
+static inline struct nlattr *nla_nest_compat_start(struct sk_buff *skb,
+                                                  int attrtype, int attrlen,
+                                                  const void *data)
+{
+       struct nlattr *start = (struct nlattr *)skb_tail_pointer(skb);
+
+       if (nla_put(skb, attrtype, attrlen, data) < 0)
+               return NULL;
+       if (nla_nest_start(skb, attrtype) == NULL) {
+               nlmsg_trim(skb, start);
+               return NULL;
+       }
+       return start;
+}
+
+/**
+ * nla_nest_compat_end - Finalize nesting of compat attributes
+ * @skb: socket buffer the attributes are stored in
+ * @start: container attribute
+ *
+ * Corrects the container attribute header to include the all
+ * appeneded attributes.
+ *
+ * Returns the total data length of the skb.
+ */
+static inline int nla_nest_compat_end(struct sk_buff *skb, struct nlattr *start)
+{
+       struct nlattr *nest = (void *)start + NLMSG_ALIGN(start->nla_len);
+
+       start->nla_len = skb_tail_pointer(skb) - (unsigned char *)start;
+       return nla_nest_end(skb, nest);
+}
+
+/**
  * nla_nest_cancel - Cancel nesting of attributes
  * @skb: socket buffer the message is stored in
  * @start: container attribute