ENUM NETLINK_VALIDATION(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

okay so bestie, you found the manual page for enum netlink_validation in the Kernel API Manual, and honestly? it's giving "netlink message/attribute validation levels" and it is lowkey iconic. come sit with me, we're getting through this together πŸ’œ


✨ NAME ✨

enum netlink_validation β€” the validation levels for netlink messages and attributes. yes queen, this is the vibe-check machine for your attributes πŸ”₯


🌸 SYNOPSIS 🌸

enum netlink_validation {
    NL_VALIDATE_LIBERAL ,
    NL_VALIDATE_TRAILING ,
    NL_VALIDATE_MAXTYPE ,
    NL_VALIDATE_UNSPEC ,
    NL_VALIDATE_STRICT_ATTRS ,
    NL_VALIDATE_NESTED

};

that's the whole cast bestie, no ensemble extras, no understudies πŸ’…


πŸŽ€ Constants πŸŽ€

so these are the actual levels, and each one is a different amount of "girl, do you mind?" about your data. let's go one by one 🫢

  • NL_VALIDATE_LIBERAL β€” the old-style "be liberal" validation. it fr fr does not care about extra data hanging out at the end of the message, it does not care about attributes being longer than they should be, and it does not care if unknown attributes are just… there. it's giving "no thoughts, head empty" energy 😭
  • NL_VALIDATE_TRAILING β€” reject junk data encountered after attribute parsing. like, we're done here, why are you still talking πŸ™ˆ
  • NL_VALIDATE_MAXTYPE β€” reject attributes > max type. and together with _TRAILING this is equivalent to the old nla_parse_strict/nlmsg_parse_strict. periodt πŸ‘‘
  • NL_VALIDATE_UNSPEC β€” reject attributes with NLA_UNSPEC in the policy. bestie, this one can safely be set by the kernel once the given policy has no NLA_UNSPEC anymore, and it can thus be used to make sure policy entries are actually enforced going forward. it's the "we said what we said" of validation πŸ’…
  • NL_VALIDATE_STRICT_ATTRS β€” strict attribute policy parsing (e.g. U8, U16, U32 must have exact size, etc.). no rounding, no vibes, exact size or nothing ✨
  • NL_VALIDATE_NESTED β€” checks that NLA_F_NESTED is set for NLA_NESTED(_ARRAY) and unset for other policies. the nesting vibe check is real πŸͺΊ
ngl, getting these mixed up is the classic netlink moment. pick the level that matches how strict you actually mean to be, not the one that makes your code stop yelling πŸ˜…

🌈 SEE ALSO 🌈

okay this list is long and I am not skipping a single one of them, because every single reference deserves her moment. all of these are (9), and first up is the kernel file ./include/net/netlink.h, plus struct nla_policy and friends:

struct nla_policy(9), struct nl_info(9), nlmsg_msg_size(9), nlmsg_total_size(9), nlmsg_padlen(9), nlmsg_data(9), nlmsg_len(9), nlmsg_payload(9), nlmsg_attrdata(9), nlmsg_attrlen(9), nlmsg_ok(9), nlmsg_next(9), nla_parse(9), nla_parse_deprecated(9), nla_parse_deprecated_strict(9), __nlmsg_parse(9), nlmsg_parse(9), nlmsg_parse_deprecated(9), nlmsg_parse_deprecated_strict(9), nlmsg_find_attr(9), nla_validate_deprecated(9), nla_validate(9), nlmsg_validate_deprecated(9), nlmsg_report(9), nlmsg_seq(9), nlmsg_for_each_attr(9), nlmsg_for_each_attr_type(9), nlmsg_put(9), nlmsg_append(9), nlmsg_put_answer(9), nlmsg_new(9), nlmsg_new_large(9), nlmsg_end(9), nlmsg_get_pos(9), nlmsg_trim(9), nlmsg_cancel(9), nlmsg_free(9), nlmsg_consume(9), nlmsg_multicast_filtered(9), nlmsg_multicast(9), nlmsg_unicast(9), nlmsg_for_each_msg(9), nl_dump_check_consistent(9), nla_attr_size(9), nla_total_size(9), nla_padlen(9), nla_type(9), nla_data(9), nla_len(9), nla_ok(9), nla_next(9), nla_find_nested(9), nla_parse_nested(9), nla_parse_nested_deprecated(9), nla_put_u8(9), nla_put_u16(9), nla_put_be16(9), nla_put_net16(9), nla_put_le16(9), nla_put_u32(9), nla_put_uint(9), nla_put_be32(9), nla_put_net32(9), nla_put_le32(9), nla_put_u64_64bit(9), nla_put_be64(9), nla_put_net64(9), nla_put_le64(9), nla_put_s8(9), nla_put_s16(9), nla_put_s32(9), nla_put_s64(9), nla_put_sint(9), nla_put_string(9), nla_put_flag(9), nla_put_msecs(9), nla_put_in_addr(9), nla_put_in6_addr(9), nla_put_bitfield32(9), nla_get_u32(9), nla_get_u32_default(9), nla_get_be32(9), nla_get_be32_default(9), nla_get_le32(9), nla_get_le32_default(9), nla_get_u16(9), nla_get_u16_default(9), nla_get_be16(9), nla_get_be16_default(9), nla_get_le16(9), nla_get_le16_default(9), nla_get_u8(9), nla_get_u8_default(9), nla_get_u64(9), nla_get_u64_default(9), nla_get_uint(9), nla_get_uint_default(9), nla_get_be64(9), nla_get_be64_default(9), nla_get_le64(9), nla_get_le64_default(9), nla_get_s32(9), nla_get_s32_default(9), nla_get_s16(9), nla_get_s16_default(9), nla_get_s8(9), nla_get_s8_default(9), nla_get_s64(9), nla_get_s64_default(9), nla_get_sint(9), nla_get_sint_default(9), nla_get_flag(9), nla_get_msecs(9), nla_get_msecs_default(9), nla_get_in_addr(9), nla_get_in_addr_default(9), nla_get_in6_addr(9), nla_get_bitfield32(9), nla_memdup(9), nla_nest_start_noflag(9), nla_nest_start(9), nla_nest_end(9), nla_nest_end_safe(9), nla_nest_cancel(9), nla_put_empty_nest(9), __nla_validate_nested(9), nla_need_padding_for_64bit(9), nla_align_64bit(9), nla_total_size_64bit(9), nla_for_each_attr(9), nla_for_each_attr_type(9), nla_for_each_nested(9), nla_for_each_nested_type(9), nla_is_last(9)

like I said. every. single. one. and honestly? ate πŸ’…


and that's the page bestie!! πŸŽ€ this little beauty lives in <green>./include/net</green> and it's dated October 2026, straight from the Kernel API Manual β€” go forth and validate those attributes, you absolute main character πŸ¦‹πŸ’–

πŸ“¦ where this page comes from