History

netlink: add infrastructure to expose policies to userspace

Add, and use in generic netlink, helpers to dump out a netlink policy to userspace, including all the range validation data, nested policies etc. This lets userspace discover what the kernel understands. For families/commands other than generic netlink, the helpers need to be used directly in an appropriate command, or we can add some infrastructure (a new netlink family) that those can register their policies with for introspection. I'm not that familiar with non-generic netlink, so that's left out for now. The data exposed to userspace also includes min and max length for binary/string data, I've done that instead of letting the userspace tools figure out whether min/max is intended based on the type so that we can extend this later in the kernel, we might want to just use the range data for example. Because of this, I opted to not directly expose the NLA_* values, even if some of them are already exposed via BPF, as with min/max length we don't need to have different types here for NLA_BINARY/NLA_MIN_LEN/NLA_EXACT_LEN, we just make them all NL_ATTR_TYPE_BINARY with min/max length optionally set. Similarly, we don't really need NLA_MSECS, and perhaps can remove it in the future - but not if we encode it into the userspace API now. It gets mapped to NL_ATTR_TYPE_U64 here. Note that the exposing here corresponds to the strict policy interpretation, and NLA_UNSPEC items are omitted entirely. To get those, change them to NLA_MIN_LEN which behaves in exactly the same way, but is exposed.

Johannes Berg committed 6 years ago

Commit d07dcf91 parent 2c28ae46 files · +498 −1Browse files

Showing the changes to include/uapi/linux (2 of 6 files). Show all

Unified · Split

2 files
  1. include/uapi/linux/genetlink.h +2 −0
  2. include/uapi/linux/netlink.h +103 −0
include/uapi/linux/genetlink.h+2−0
@@ -48,6 +48,7 @@ enum { · 47 unmodified lines
4848 CTRL_CMD_NEWMCAST_GRP,
4949 CTRL_CMD_DELMCAST_GRP,
5050 CTRL_CMD_GETMCAST_GRP, /* unused */
51+ CTRL_CMD_GETPOLICY,
5152 __CTRL_CMD_MAX,
5253 };
5354
@@ -62,6 +63,7 @@ enum { · 8 unmodified lines
6263 CTRL_ATTR_MAXATTR,
6364 CTRL_ATTR_OPS,
6465 CTRL_ATTR_MCAST_GROUPS,
66+ CTRL_ATTR_POLICY,
6567 __CTRL_ATTR_MAX,
6668 };
6769
include/uapi/linux/netlink.h+103−0
@@ -249,4 +249,107 @@ struct nla_bitfield32 { · 248 unmodified lines
249249 __u32 selector;
250250 };
251251
252+/*
253+ * policy descriptions - it's specific to each family how this is used
254+ * Normally, it should be retrieved via a dump inside another attribute
255+ * specifying where it applies.
256+ */
257+
258+/**
259+ * enum netlink_attribute_type - type of an attribute
260+ * @NL_ATTR_TYPE_INVALID: unused
261+ * @NL_ATTR_TYPE_FLAG: flag attribute (present/not present)
262+ * @NL_ATTR_TYPE_U8: 8-bit unsigned attribute
263+ * @NL_ATTR_TYPE_U16: 16-bit unsigned attribute
264+ * @NL_ATTR_TYPE_U32: 32-bit unsigned attribute
265+ * @NL_ATTR_TYPE_U64: 64-bit unsigned attribute
266+ * @NL_ATTR_TYPE_S8: 8-bit signed attribute
267+ * @NL_ATTR_TYPE_S16: 16-bit signed attribute
268+ * @NL_ATTR_TYPE_S32: 32-bit signed attribute
269+ * @NL_ATTR_TYPE_S64: 64-bit signed attribute
270+ * @NL_ATTR_TYPE_BINARY: binary data, min/max length may be specified
271+ * @NL_ATTR_TYPE_STRING: string, min/max length may be specified
272+ * @NL_ATTR_TYPE_NUL_STRING: NUL-terminated string,
273+ * min/max length may be specified
274+ * @NL_ATTR_TYPE_NESTED: nested, i.e. the content of this attribute
275+ * consists of sub-attributes. The nested policy and maxtype
276+ * inside may be specified.
277+ * @NL_ATTR_TYPE_NESTED_ARRAY: nested array, i.e. the content of this
278+ * attribute contains sub-attributes whose type is irrelevant
279+ * (just used to separate the array entries) and each such array
280+ * entry has attributes again, the policy for those inner ones
281+ * and the corresponding maxtype may be specified.
282+ * @NL_ATTR_TYPE_BITFIELD32: &struct nla_bitfield32 attribute
283+ */
284+enum netlink_attribute_type {
285+ NL_ATTR_TYPE_INVALID,
286+
287+ NL_ATTR_TYPE_FLAG,
288+
289+ NL_ATTR_TYPE_U8,
290+ NL_ATTR_TYPE_U16,
291+ NL_ATTR_TYPE_U32,
292+ NL_ATTR_TYPE_U64,
293+
294+ NL_ATTR_TYPE_S8,
295+ NL_ATTR_TYPE_S16,
296+ NL_ATTR_TYPE_S32,
297+ NL_ATTR_TYPE_S64,
298+
299+ NL_ATTR_TYPE_BINARY,
300+ NL_ATTR_TYPE_STRING,
301+ NL_ATTR_TYPE_NUL_STRING,
302+
303+ NL_ATTR_TYPE_NESTED,
304+ NL_ATTR_TYPE_NESTED_ARRAY,
305+
306+ NL_ATTR_TYPE_BITFIELD32,
307+};
308+
309+/**
310+ * enum netlink_policy_type_attr - policy type attributes
311+ * @NL_POLICY_TYPE_ATTR_UNSPEC: unused
312+ * @NL_POLICY_TYPE_ATTR_TYPE: type of the attribute,
313+ * &enum netlink_attribute_type (U32)
314+ * @NL_POLICY_TYPE_ATTR_MIN_VALUE_S: minimum value for signed
315+ * integers (S64)
316+ * @NL_POLICY_TYPE_ATTR_MAX_VALUE_S: maximum value for signed
317+ * integers (S64)
318+ * @NL_POLICY_TYPE_ATTR_MIN_VALUE_U: minimum value for unsigned
319+ * integers (U64)
320+ * @NL_POLICY_TYPE_ATTR_MAX_VALUE_U: maximum value for unsigned
321+ * integers (U64)
322+ * @NL_POLICY_TYPE_ATTR_MIN_LENGTH: minimum length for binary
323+ * attributes, no minimum if not given (U32)
324+ * @NL_POLICY_TYPE_ATTR_MAX_LENGTH: maximum length for binary
325+ * attributes, no maximum if not given (U32)
326+ * @NL_POLICY_TYPE_ATTR_POLICY_IDX: sub policy for nested and
327+ * nested array types (U32)
328+ * @NL_POLICY_TYPE_ATTR_POLICY_MAXTYPE: maximum sub policy
329+ * attribute for nested and nested array types, this can
330+ * in theory be < the size of the policy pointed to by
331+ * the index, if limited inside the nesting (U32)
332+ * @NL_POLICY_TYPE_ATTR_BITFIELD32_MASK: valid mask for the
333+ * bitfield32 type (U32)
334+ * @NL_POLICY_TYPE_ATTR_PAD: pad attribute for 64-bit alignment
335+ */
336+enum netlink_policy_type_attr {
337+ NL_POLICY_TYPE_ATTR_UNSPEC,
338+ NL_POLICY_TYPE_ATTR_TYPE,
339+ NL_POLICY_TYPE_ATTR_MIN_VALUE_S,
340+ NL_POLICY_TYPE_ATTR_MAX_VALUE_S,
341+ NL_POLICY_TYPE_ATTR_MIN_VALUE_U,
342+ NL_POLICY_TYPE_ATTR_MAX_VALUE_U,
343+ NL_POLICY_TYPE_ATTR_MIN_LENGTH,
344+ NL_POLICY_TYPE_ATTR_MAX_LENGTH,
345+ NL_POLICY_TYPE_ATTR_POLICY_IDX,
346+ NL_POLICY_TYPE_ATTR_POLICY_MAXTYPE,
347+ NL_POLICY_TYPE_ATTR_BITFIELD32_MASK,
348+ NL_POLICY_TYPE_ATTR_PAD,
349+
350+ /* keep last */
351+ __NL_POLICY_TYPE_ATTR_MAX,
352+ NL_POLICY_TYPE_ATTR_MAX = __NL_POLICY_TYPE_ATTR_MAX - 1
353+};
354+
252355 #endif /* _UAPI__LINUX_NETLINK_H */