nlmsg_put(9)
π 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 netlinkPORTIDof 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
- 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