netlink: New macros NL_NESTED_FOR_EACH, NL_NESTED_FOR_EACH_UNSAFE.
authorBen Pfaff <blp@nicira.com>
Wed, 5 Oct 2011 16:36:11 +0000 (09:36 -0700)
committerBen Pfaff <blp@nicira.com>
Tue, 11 Oct 2011 17:37:25 +0000 (10:37 -0700)
Upcoming commits will introduce more users.

lib/netlink-socket.c
lib/netlink.h

index 0f4e3e77d848aa66cb8af1121bd640b925f9973f..160edd238b75ad15e0aeb0d50f6c177aa67850af 100644 (file)
@@ -790,9 +790,8 @@ nl_lookup_genl_mcgroup(const char *family_name, const char *group_name,
                        unsigned int *multicast_group, unsigned int fallback)
 {
     struct nlattr *family_attrs[ARRAY_SIZE(family_policy)];
-    struct ofpbuf all_mcs;
+    const struct nlattr *mc;
     struct ofpbuf *reply;
-    struct nlattr *mc;
     unsigned int left;
     int error;
 
@@ -810,8 +809,7 @@ nl_lookup_genl_mcgroup(const char *family_name, const char *group_name,
         goto exit;
     }
 
-    nl_attr_get_nested(family_attrs[CTRL_ATTR_MCAST_GROUPS], &all_mcs);
-    NL_ATTR_FOR_EACH (mc, left, all_mcs.data, all_mcs.size) {
+    NL_NESTED_FOR_EACH (mc, left, family_attrs[CTRL_ATTR_MCAST_GROUPS]) {
         static const struct nl_policy mc_policy[] = {
             [CTRL_ATTR_MCAST_GRP_ID] = {.type = NL_A_U32},
             [CTRL_ATTR_MCAST_GRP_NAME] = {.type = NL_A_STRING},
index 2206339cbb46e496d4f7ed55ad278f0c5937f424..2d3457167a819f10b5111b7769069c90cd5ab1f7 100644 (file)
@@ -124,6 +124,12 @@ nl_attr_is_valid(const struct nlattr *nla, size_t maxlen)
          (LEFT) > 0;                                                    \
          (LEFT) -= NLA_ALIGN((ITER)->nla_len), (ITER) = nl_attr_next(ITER))
 
+/* These variants are convenient for iterating nested attributes. */
+#define NL_NESTED_FOR_EACH(ITER, LEFT, A)                               \
+    NL_ATTR_FOR_EACH(ITER, LEFT, nl_attr_get(A), nl_attr_get_size(A))
+#define NL_NESTED_FOR_EACH_UNSAFE(ITER, LEFT, A)                        \
+    NL_ATTR_FOR_EACH_UNSAFE(ITER, LEFT, nl_attr_get(A), nl_attr_get_size(A))
+
 /* Netlink attribute parsing. */
 int nl_attr_type(const struct nlattr *);
 const void *nl_attr_get(const struct nlattr *);