ENUM NETLINK_VALIDATION(9)
π¦ enum netlink_validation(9) β the Kernel API Manual page, but make it make sense π¦
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_TRAILINGthis is equivalent to the oldnla_parse_strict/nlmsg_parse_strict. periodt πNL_VALIDATE_UNSPECβ reject attributes withNLA_UNSPECin the policy. bestie, this one can safely be set by the kernel once the given policy has noNLA_UNSPECanymore, 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,U32must have exact size, etc.). no rounding, no vibes, exact size or nothing β¨NL_VALIDATE_NESTEDβ checks thatNLA_F_NESTEDis set forNLA_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
- nixpkgs unstable: linux-manual 7.3.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms