Modules | |
| Generic Netlink Family | |
| Management | |
<------- NLMSG_ALIGN(hlen) ------> <---- NLMSG_ALIGN(len) ---> +----------------------------+- - -+- - - - - - - - - - -+- - -+ | Header | Pad | Payload | Pad | | struct nlmsghdr | | | | +----------------------------+- - -+- - - - - - - - - - -+- - -+
<-------- GENL_HDRLEN -------> <--- hdrlen -->
<------- genlmsg_len(ghdr) ------>
+------------------------+- - -+---------------+- - -+------------+
| Generic Netlink Header | Pad | Family Header | Pad | Attributes |
| struct genlmsghdr | | | | |
+------------------------+- - -+---------------+- - -+------------+
genlmsg_data(ghdr)--------------^ ^
genlmsg_attrdata(ghdr, hdrlen)-------------------------
#include <netlink/netlink.h> #include <netlink/genl/genl.h> #include <netlink/genl/ctrl.h> struct nl_handle *sock; struct nl_msg *msg; int family; // Allocate a new netlink socket sock = nl_handle_alloc(); // Connect to generic netlink socket on kernel side genl_connect(sock); // Ask kernel to resolve family name to family id family = genl_ctrl_resolve(sock, "generic_netlink_family_name"); // Construct a generic netlink by allocating a new message, fill in // the header and append a simple integer attribute. msg = nlmsg_alloc(); genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, family, 0, NLM_F_ECHO, CMD_FOO_GET, FOO_VERSION); nla_put_u32(msg, ATTR_FOO, 123); // Send message over netlink socket nl_send_auto_complete(sock, msg); // Free message nlmsg_free(msg); // Prepare socket to receive the answer by specifying the callback // function to be called for valid messages. nl_socket_modify_cb(sock, NL_CB_VALID, NL_CB_CUSTOM, parse_cb, NULL); // Wait for the answer and receive it nl_recvmsgs_default(sock); static int parse_cb(struct nl_msg *msg, void *arg) { struct nlmsghdr *nlh = nlmsg_hdr(msg); struct nlattr *attrs[ATTR_MAX+1]; // Validate message and parse attributes genlmsg_parse(nlh, 0, attrs, ATTR_MAX, policy); if (attrs[ATTR_FOO]) { uint32_t value = nla_get_u32(attrs[ATTR_FOO]); ... } return 0; }
| int genl_send_simple | ( | struct nl_handle * | handle, | |
| int | family, | |||
| int | cmd, | |||
| int | version, | |||
| int | flags | |||
| ) |
| handle | Netlink handle. | |
| family | Generic netlink family | |
| cmd | Command | |
| version | Version | |
| flags | Additional netlink message flags. |
Definition at line 128 of file genl.c.
References nl_send_simple().
| void* genlmsg_data | ( | const struct genlmsghdr * | gnlh | ) |
| gnlh | genetlink messsage header |
Definition at line 191 of file genl.c.
Referenced by genlmsg_attrdata().
| int genlmsg_len | ( | const struct genlmsghdr * | gnlh | ) |
| gnlh | genetlink message header |
Definition at line 200 of file genl.c.
References nlmsghdr::nlmsg_len.
Referenced by genlmsg_attrlen().
| struct nlattr* genlmsg_attrdata | ( | const struct genlmsghdr * | gnlh, | |
| int | hdrlen | |||
| ) | [read] |
| gnlh | generic netlink message header | |
| hdrlen | length of family specific header |
Definition at line 212 of file genl.c.
References genlmsg_data().
| int genlmsg_attrlen | ( | const struct genlmsghdr * | gnlh, | |
| int | hdrlen | |||
| ) |
| gnlh | generic netlink message header | |
| hdrlen | length of family specific header |
Definition at line 222 of file genl.c.
References genlmsg_len().
| void* genlmsg_put | ( | struct nl_msg * | msg, | |
| uint32_t | pid, | |||
| uint32_t | seq, | |||
| int | family, | |||
| int | hdrlen, | |||
| int | flags, | |||
| uint8_t | cmd, | |||
| uint8_t | version | |||
| ) |
| msg | netlink message | |
| pid | netlink process id or NL_AUTO_PID | |
| seq | sequence number of message or NL_AUTO_SEQ | |
| family | generic netlink family | |
| hdrlen | length of user specific header | |
| flags | message flags | |
| cmd | generic netlink command | |
| version | protocol version |
Definition at line 247 of file genl.c.
References nlmsg_data(), and nlmsg_put().
1.5.7.1