+static struct nlattr *
+generate_all_wildcard_mask(struct ofpbuf *ofp, const struct nlattr *key)
+{
+ const struct nlattr *a;
+ unsigned int left;
+ int type = nl_attr_type(key);
+ int size = nl_attr_get_size(key);
+
+ if (odp_flow_key_attr_len(type) >=0) {
+ memset(nl_msg_put_unspec_uninit(ofp, type, size), 0, size);
+ } else {
+ size_t nested_mask;
+
+ nested_mask = nl_msg_start_nested(ofp, type);
+ NL_ATTR_FOR_EACH(a, left, key, nl_attr_get_size(key)) {
+ generate_all_wildcard_mask(ofp, nl_attr_get(a));
+ }
+ nl_msg_end_nested(ofp, nested_mask);
+ }
+
+ return ofp->base;
+}
+