summaryrefslogtreecommitdiffstats
path: root/src/libsystemd/sd-netlink/netlink-types-internal.h
blob: 1412514f9ba77362e17d021dd417ef72ec929e7a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/* 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,                                \
        }