nlmsg_put(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’… nlmsg_put β€” the Kernel API Manual moment you've been waiting for ✨

okay so bestie, welcome to nlmsg_put(9). This is a little function from the Linux kernel's netlink corner of the world, and honestly it's giving "helper that quietly carries the whole squad." Let's get into it 🫢


🌸 NAME 🌸

nlmsg_put β€” add a new netlink message to an skb πŸ’Œ


πŸŽ€ SYNOPSIS πŸŽ€

struct nlmsghdr * nlmsg_put (struct sk_buff *skb , u32 portid , u32 seq
, int type , int payload , int flags );

That's the whole signature, no cap. Six arguments, one struct nlmsghdr * coming back at you 🌈


πŸ’– ARGUMENTS πŸ’–

  • skb β€” the socket buffer where the message is gonna live. This is the vessel, the main character container ✨
  • portid β€” the netlink PORTID of the application that's asking for this. Basically the caller's little name tag 🏷️
  • seq β€” the sequence number of the message. Keeping track of who's who πŸ”’
  • type β€” the message type. Like, what kind of message are we even doing here πŸ’«
  • payload β€” the length of the message payload. How many bytes of actual content are riding along πŸ“
  • flags β€” the message flags. Little switches that say stuff about the message 🚩

πŸ¦‹ RETURN πŸ¦‹

NULL if the tailroom of the skb is insufficient to store the message header and payload.

bestie listen, this is the important bit: not enough tailroom = you get NULL. That's the vibe check failing, okay? Plan for it 😭

πŸ‘‘ SEE ALSO πŸ‘‘

Okay this is the part where I hold your hand, because the see-also list is iconic and also enormous β€” like a group chat with everyone from kernel netlink. The kernel file lives at ./include/net/netlink.h, and here's the whole squad, names exactly as they are, do not come for me:

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_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)

That's the whole roster, every single one, no skips πŸ’€


🧚 sign-off 🧚

This little page comes from ./include/net, dated October 2026 β€” that's the source/version and date, bestie, and that's the whole manual page. Slay, go parse some netlink messages πŸ’œπŸŒΈ


πŸ“¦ where this page comes from