blob: 1412514f9ba77362e17d021dd417ef72ec929e7a [file] [log] [blame]
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once
#include "macro.h"
#include "netlink-types.h"
/* C.f. see 'struct nla_policy' at include/net/netlink.h. */
struct NLAPolicy {
NLAType type;
size_t size;
union {
const NLAPolicySet *policy_set;
const NLAPolicySetUnion *policy_set_union;
};
};
struct NLAPolicySet {
uint16_t count;
const NLAPolicy *policies;
};
typedef struct NLAPolicySetUnionElement {
union {
int family; /* used by NETLINK_TYPE_NESTED_UNION_BY_FAMILY */
const char *string; /* used by NETLINK_TYPE_NESTED_UNION_BY_STRING */
};
NLAPolicySet policy_set;
} NLAPolicySetUnionElement;
struct NLAPolicySetUnion {
size_t count;
const NLAPolicySetUnionElement *elements;
uint16_t match_attribute; /* used by NETLINK_TYPE_NESTED_UNION_BY_STRING */
};
#define BUILD_POLICY_WITH_SIZE(t, n) \
{ .type = NETLINK_TYPE_##t, .size = n }
#define BUILD_POLICY(t) \
BUILD_POLICY_WITH_SIZE(t, 0)
#define BUILD_POLICY_NESTED_WITH_SIZE(name, n) \
{ .type = NETLINK_TYPE_NESTED, .size = n, .policy_set = &name##_policy_set }
#define BUILD_POLICY_NESTED(name) \
BUILD_POLICY_NESTED_WITH_SIZE(name, 0)
#define _BUILD_POLICY_NESTED_UNION(name, by) \
{ .type = NETLINK_TYPE_NESTED_UNION_BY_##by, .policy_set_union = &name##_policy_set_union }
#define BUILD_POLICY_NESTED_UNION_BY_STRING(name) \
_BUILD_POLICY_NESTED_UNION(name, STRING)
#define BUILD_POLICY_NESTED_UNION_BY_FAMILY(name) \
_BUILD_POLICY_NESTED_UNION(name, FAMILY)
#define _BUILD_POLICY_SET(name) \
{ .count = ELEMENTSOF(name##_policies), .policies = name##_policies }
#define DEFINE_POLICY_SET(name) \
static const NLAPolicySet name##_policy_set = _BUILD_POLICY_SET(name)
# define BUILD_UNION_ELEMENT_BY_STRING(s, name) \
{ .string = s, .policy_set = _BUILD_POLICY_SET(name) }
# define BUILD_UNION_ELEMENT_BY_FAMILY(f, name) \
{ .family = f, .policy_set = _BUILD_POLICY_SET(name) }
#define DEFINE_POLICY_SET_UNION(name, attr) \
static const NLAPolicySetUnion name##_policy_set_union = { \
.count = ELEMENTSOF(name##_policy_set_union_elements), \
.elements = name##_policy_set_union_elements, \
.match_attribute = attr, \
}