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().