nlmsg_append(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’… nlmsg_append β€” from the Kernel API Manual, bestie πŸ’…

okay so you found nlmsg_append(9) and you're probably like "what even is this" β€” don't worry, it's actually so simple. It lives in the netlink corner of the kernel, section 9 of the manual, and it's one of those tiny helper functions that just does one little thing. lowkey iconic for that tbh πŸŽ€


✨ NAME ✨

nlmsg_append β€” add more data to a nlmsg in a skb πŸ¦‹

✨ SYNOPSIS ✨

void * nlmsg_append (struct sk_buff *skb , u32 size );

✨ ARGUMENTS ✨

  • skb β€” the socket buffer you're storing the message in πŸ’–
  • size β€” the length of the message payload, like, how much stuff you're adding in 🌸

✨ DESCRIPTION ✨

So what it does: it appends data to an existing nlmsg. That's the whole vibe. You use it when you're constructing a message that has multiple fixed-format headers β€” which, and I cannot stress this enough, is rare πŸ™ˆ. Like, genuinely rare. The manpage says so. Not me being dramatic, it's documented.

Basically: nlmsg already exists, you want more bytes on the end of it, this is the little helper that makes that happen. That's it. That's the function. periodt πŸ’…

✨ RETURN ✨

It returns NULL if the tailroom of the skb is insufficient to store the extra payload 😭 β€” so like, if there's not enough room left in the buffer, you get NULL back. That's the one documented failure case, so please actually check for it, bestie, I'm begging 🫢

✨ SEE ALSO ✨

okay this is the part where I need you to focus because the list is long β€” like, the whole netlink header's worth of friends 🧚. Grab a snack, here we go:

Kernel file ./include/net/netlink.h, struct nla_policy(9), struct nl_info(9), enum netlink_validation(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_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. a lot of friends. but they're all valid, iykyk πŸ’€βœ¨


and that's the whole page, bestie, you ate it up πŸ“ this one came from ./include/net and it's dated October 2026 β€” so if you're reading this in the future, hiii, hope the tailroom was sufficient πŸ’œπŸ‘‘

πŸ“¦ where this page comes from