libnl  1.1.4
Modules
Generic Netlink

Modules

 Generic Netlink Family
 
 Management
 

Socket Creating

int genl_connect (struct nl_handle *handle)
 

Sending

int genl_send_simple (struct nl_handle *handle, int family, int cmd, int version, int flags)
 Send trivial generic netlink message. More...
 

Message Parsing

int genlmsg_valid_hdr (struct nlmsghdr *nlh, int hdrlen)
 
int genlmsg_validate (struct nlmsghdr *nlh, int hdrlen, int maxtype, struct nla_policy *policy)
 
int genlmsg_parse (struct nlmsghdr *nlh, int hdrlen, struct nlattr *tb[], int maxtype, struct nla_policy *policy)
 
void * genlmsg_data (const struct genlmsghdr *gnlh)
 Get head of message payload. More...
 
int genlmsg_len (const struct genlmsghdr *gnlh)
 Get lenght of message payload. More...
 
struct nlattr * genlmsg_attrdata (const struct genlmsghdr *gnlh, int hdrlen)
 Get head of attribute data. More...
 
int genlmsg_attrlen (const struct genlmsghdr *gnlh, int hdrlen)
 Get length of attribute data. More...
 

Message Building

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)
 Add generic netlink header to netlink message. More...
 

Detailed Description

Message Format
<------- 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)-------------------------
Example
#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();
CMD_FOO_GET, FOO_VERSION);
nla_put_u32(msg, ATTR_FOO, 123);
// Send message over netlink socket
// Free message
// Prepare socket to receive the answer by specifying the callback
// function to be called for valid messages.
// Wait for the answer and receive it
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;
}

Function Documentation

◆ genl_send_simple()

int genl_send_simple ( struct nl_handle *  handle,
int  family,
int  cmd,
int  version,
int  flags 
)
Parameters
handleNetlink handle.
familyGeneric netlink family
cmdCommand
versionVersion
flagsAdditional netlink message flags.

Fills out a routing netlink request message and sends it out using nl_send_simple().

Returns
0 on success or a negative error code.

Definition at line 128 of file genl.c.

References nl_send_simple().

130 {
131  struct genlmsghdr hdr = {
132  .cmd = cmd,
133  .version = version,
134  };
135 
136  return nl_send_simple(handle, family, flags, &hdr, sizeof(hdr));
137 }
int nl_send_simple(struct nl_handle *handle, int type, int flags, void *buf, size_t size)
Send simple netlink message using nl_send_auto_complete()
Definition: nl.c:410

◆ genlmsg_data()

void* genlmsg_data ( const struct genlmsghdr *  gnlh)
Parameters
gnlhgenetlink messsage header

Definition at line 191 of file genl.c.

Referenced by genlmsg_attrdata().

192 {
193  return ((unsigned char *) gnlh + GENL_HDRLEN);
194 }

◆ genlmsg_len()

int genlmsg_len ( const struct genlmsghdr *  gnlh)
Parameters
gnlhgenetlink message header

Definition at line 200 of file genl.c.

References nlmsghdr::nlmsg_len.

Referenced by genlmsg_attrlen().

201 {
202  struct nlmsghdr *nlh = (struct nlmsghdr *)((unsigned char *)gnlh -
203  NLMSG_HDRLEN);
204  return (nlh->nlmsg_len - GENL_HDRLEN - NLMSG_HDRLEN);
205 }
Netlink message header.
uint32_t nlmsg_len
Length of message including header.

◆ genlmsg_attrdata()

struct nlattr* genlmsg_attrdata ( const struct genlmsghdr *  gnlh,
int  hdrlen 
)
Parameters
gnlhgeneric netlink message header
hdrlenlength of family specific header

Definition at line 212 of file genl.c.

References genlmsg_data().

213 {
214  return genlmsg_data(gnlh) + NLMSG_ALIGN(hdrlen);
215 }
void * genlmsg_data(const struct genlmsghdr *gnlh)
Get head of message payload.
Definition: genl.c:191

◆ genlmsg_attrlen()

int genlmsg_attrlen ( const struct genlmsghdr *  gnlh,
int  hdrlen 
)
Parameters
gnlhgeneric netlink message header
hdrlenlength of family specific header

Definition at line 222 of file genl.c.

References genlmsg_len().

223 {
224  return genlmsg_len(gnlh) - NLMSG_ALIGN(hdrlen);
225 }
int genlmsg_len(const struct genlmsghdr *gnlh)
Get lenght of message payload.
Definition: genl.c:200

◆ genlmsg_put()

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 
)
Parameters
msgnetlink message
pidnetlink process id or NL_AUTO_PID
seqsequence number of message or NL_AUTO_SEQ
familygeneric netlink family
hdrlenlength of user specific header
flagsmessage flags
cmdgeneric netlink command
versionprotocol version

Returns pointer to user specific header.

Definition at line 247 of file genl.c.

References nlmsg_data(), and nlmsg_put().

249 {
250  struct nlmsghdr *nlh;
251  struct genlmsghdr hdr = {
252  .cmd = cmd,
253  .version = version,
254  };
255 
256  nlh = nlmsg_put(msg, pid, seq, family, GENL_HDRLEN + hdrlen, flags);
257  if (nlh == NULL)
258  return NULL;
259 
260  memcpy(nlmsg_data(nlh), &hdr, sizeof(hdr));
261  NL_DBG(2, "msg %p: Added generic netlink header cmd=%d version=%d\n",
262  msg, cmd, version);
263 
264  return nlmsg_data(nlh) + GENL_HDRLEN;
265 }
void * nlmsg_data(const struct nlmsghdr *nlh)
head of message payload
Definition: msg.c:218
Netlink message header.
struct nlmsghdr * nlmsg_put(struct nl_msg *n, uint32_t pid, uint32_t seq, int type, int payload, int flags)
Add a netlink message header to a netlink message.
Definition: msg.c:610