Messages
[Core Netlink API]

Netlink Message Construction/Parsing Interface. More...

Data Structures

struct  nlmsghdr
 Netlink message header. More...
struct  nlmsgerr
 Netlink error message. More...

Modules

 Attributes
 

Netlink Attributes Construction/Parsing Interface.


Defines

#define NL_AUTO_PID   0
 Will cause the netlink pid to be set to the pid assigned to the netlink handle (socket) just before sending the message off.
#define NL_AUTO_SEQ   0
 May be used to refer to a sequence number which should be automatically set just before sending the message off.

Netlink Message Type Translations



char * nl_nlmsgtype2str (int type, char *buf, size_t size)
int nl_str2nlmsgtype (const char *name)

Size Calculations



int nlmsg_msg_size (int payload)
 length of netlink message not including padding
int nlmsg_total_size (int payload)
 length of netlink message including padding
int nlmsg_padlen (int payload)
 length of padding at the message's tail

Payload Access



void * nlmsg_data (const struct nlmsghdr *nlh)
 head of message payload
void * nlmsg_tail (const struct nlmsghdr *nlh)
int nlmsg_len (const struct nlmsghdr *nlh)
 length of message payload

Attribute Access



struct nlattr * nlmsg_attrdata (const struct nlmsghdr *nlh, int hdrlen)
 head of attributes data
int nlmsg_attrlen (const struct nlmsghdr *nlh, int hdrlen)
 length of attributes data

Message Parsing



int nlmsg_valid_hdr (const struct nlmsghdr *nlh, int hdrlen)
int nlmsg_ok (const struct nlmsghdr *nlh, int remaining)
 check if the netlink message fits into the remaining bytes
struct nlmsghdrnlmsg_next (struct nlmsghdr *nlh, int *remaining)
 next netlink message in message stream
int nlmsg_parse (struct nlmsghdr *nlh, int hdrlen, struct nlattr *tb[], int maxtype, struct nla_policy *policy)
 parse attributes of a netlink message
struct nlattr * nlmsg_find_attr (struct nlmsghdr *nlh, int hdrlen, int attrtype)
 nlmsg_find_attr - find a specific attribute in a netlink message
int nlmsg_validate (struct nlmsghdr *nlh, int hdrlen, int maxtype, struct nla_policy *policy)
 nlmsg_validate - validate a netlink message including attributes

Message Building/Access



struct nl_msg * nlmsg_alloc (void)
 Allocate a new netlink message with the default maximum payload size.
struct nl_msg * nlmsg_alloc_size (size_t max)
 Allocate a new netlink message with maximum payload size specified.
struct nl_msg * nlmsg_inherit (struct nlmsghdr *hdr)
 Allocate a new netlink message and inherit netlink message header.
struct nl_msg * nlmsg_alloc_simple (int nlmsgtype, int flags)
 Allocate a new netlink message.
void nlmsg_set_default_size (size_t max)
 Set the default maximum message payload size for allocated messages.
struct nl_msg * nlmsg_convert (struct nlmsghdr *hdr)
 Convert a netlink message received from a netlink socket to a nl_msg.
void * nlmsg_reserve (struct nl_msg *n, size_t len, int pad)
 Reserve room for additional data in a netlink message.
int nlmsg_append (struct nl_msg *n, void *data, size_t len, int pad)
 Append data to tail of a netlink message.
int nlmsg_expand (struct nl_msg *n, size_t newlen)
 Expand maximum payload size of a netlink message.
struct nlmsghdrnlmsg_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.
struct nlmsghdrnlmsg_hdr (struct nl_msg *n)
 Return actual netlink message.
void nlmsg_free (struct nl_msg *n)
 Free a netlink message.

Attributes



void nlmsg_set_proto (struct nl_msg *msg, int protocol)
int nlmsg_get_proto (struct nl_msg *msg)
size_t nlmsg_get_max_size (struct nl_msg *msg)
void nlmsg_set_src (struct nl_msg *msg, struct sockaddr_nl *addr)
struct sockaddr_nlnlmsg_get_src (struct nl_msg *msg)
void nlmsg_set_dst (struct nl_msg *msg, struct sockaddr_nl *addr)
struct sockaddr_nlnlmsg_get_dst (struct nl_msg *msg)
void nlmsg_set_creds (struct nl_msg *msg, struct ucred *creds)
struct ucred * nlmsg_get_creds (struct nl_msg *msg)

Netlink Message Flags Translations



char * nl_nlmsg_flags2str (int flags, char *buf, size_t len)

Direct Parsing



int nl_msg_parse (struct nl_msg *msg, void(*cb)(struct nl_object *, void *), void *arg)

Dumping



void nl_msg_dump (struct nl_msg *msg, FILE *ofd)
 Dump message in human readable format to file descriptor.

Iterators



#define nlmsg_for_each_attr(pos, nlh, hdrlen, rem)
 Iterate over a stream of attributes in a message.
#define nlmsg_for_each_msg(pos, head, len, rem)
 Iterate over a stream of messages.

Standard message flags



#define NLM_F_REQUEST   1
 Must be set on all request messages (typically from user space to kernel space).
#define NLM_F_MULTI   2
 Indicates the message is part of a multipart message terminated by NLMSG_DONE.
#define NLM_F_ACK   4
 Request for an acknowledgment on success.
#define NLM_F_ECHO   8
 Echo this request.

Additional message flags for GET requests



#define NLM_F_ROOT   0x100
 Return the complete table instead of a single entry.
#define NLM_F_MATCH   0x200
 Return all entries matching criteria passed in message content.
#define NLM_F_ATOMIC   0x400
 Return an atomic snapshot of the table being referenced.
#define NLM_F_DUMP   (NLM_F_ROOT|NLM_F_MATCH)
 Dump all entries.

Additional messsage flags for NEW requests



#define NLM_F_REPLACE   0x100
 Replace existing matching config object with this request.
#define NLM_F_EXCL   0x200
 Don't replace the config object if it already exists.
#define NLM_F_CREATE   0x400
 Create config object if it doesn't already exist.
#define NLM_F_APPEND   0x800
 Add to the end of the object list.

Standard Message types



#define NLMSG_NOOP   0x1
 No operation, message must be ignored.
#define NLMSG_ERROR   0x2
 The message signals an error and the payload contains a nlmsgerr structure.
#define NLMSG_DONE   0x3
 Message terminates a multipart message.
#define NLMSG_OVERRUN   0x4
 The message signals that data got lost.
#define NLMSG_MIN_TYPE   0x10
 Lower limit of reserved message types.

Detailed Description

The following information is partly extracted from RFC3549 (ftp://ftp.rfc-editor.org/in-notes/rfc3549.txt)

Message Format
Netlink messages consist of a byte stream with one or multiple Netlink headers and an associated payload. If the payload is too big to fit into a single message it, can be split over multiple Netlink messages, collectively called a multipart message. For multipart messages, the first and all following headers have the NLM_F_MULTI Netlink header flag set, except for the last header which has the Netlink header type NLMSG_DONE.
The Netlink message header (struct nlmsghdr) is shown below.
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                          Length                             |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |            Type              |           Flags              |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                      Sequence Number                        |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                      Process ID (PID)                       |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
The netlink message header and payload must be aligned properly:
  <------- NLMSG_ALIGN(hlen) ------> <---- NLMSG_ALIGN(len) --->
 +----------------------------+- - -+- - - - - - - - - - -+- - -+
 |           Header           | Pad |       Payload       | Pad |
 |      struct nlmsghdr       |     |                     |     |
 +----------------------------+- - -+- - - - - - - - - - -+- - -+
Message Format:
    <--- nlmsg_total_size(payload)  --->
    <-- nlmsg_msg_size(payload) ->
   +----------+- - -+-------------+- - -+-------- - -
   | nlmsghdr | Pad |   Payload   | Pad | nlmsghdr
   +----------+- - -+-------------+- - -+-------- - -
   nlmsg_data(nlh)---^                   ^
   nlmsg_next(nlh)-----------------------+
The payload may consist of arbitary data but may have strict alignment and formatting rules depening on the specific netlink families.
    <---------------------- nlmsg_len(nlh) --------------------->
    <------ hdrlen ------>       <- nlmsg_attrlen(nlh, hdrlen) ->
   +----------------------+- - -+--------------------------------+
   |     Family Header    | Pad |           Attributes           |
   +----------------------+- - -+--------------------------------+
   nlmsg_attrdata(nlh, hdrlen)---^
The ACK Netlink Message
This message is actually used to denote both an ACK and a NACK. Typically, the direction is from FEC to CPC (in response to an ACK request message). However, the CPC should be able to send ACKs back to FEC when requested.
  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                       Netlink message header                  |
 |                       type = NLMSG_ERROR                      |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                          Error code                           |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                       OLD Netlink message header              |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Example
 // Various methods exist to create/allocate a new netlink
 // message. 
 //
 // nlmsg_alloc() will allocate an empty netlink message with
 // a maximum payload size which defaults to the page size of
 // the system. This default size can be modified using the
 // function nlmsg_set_default_size().
 struct nl_msg *msg = nlmsg_alloc();

 // Very often, the message type and message flags are known
 // at allocation time while the other fields are auto generated:
 struct nl_msg *msg = nlmsg_alloc_simple(MY_TYPE, MY_FLAGS);

 // Alternatively an existing netlink message header can be used
 // to inherit the header values:
 struct nlmsghdr hdr = {
        .nlmsg_type = MY_TYPE,
        .nlmsg_flags = MY_FLAGS,
 };
 struct nl_msg *msg = nlmsg_inherit(&hdr);

 // Last but not least, netlink messages received from netlink sockets
 // can be converted into nl_msg objects using nlmsg_convert(). This
 // will create a message with a maximum payload size which equals the
 // length of the existing netlink message, therefore no more data can
 // be appened without calling nlmsg_expand() first.
 struct nl_msg *msg = nlmsg_convert(nlh_from_nl_sock);

 // Payload may be added to the message via nlmsg_append(). The fourth
 // parameter specifies the number of alignment bytes the data should
 // be padding with at the end. Common values are 0 to disable it or
 // NLMSG_ALIGNTO to ensure proper netlink message padding.
 nlmsg_append(msg, &mydata, sizeof(mydata), 0);

 // Sometimes it may be necessary to reserve room for data but defer
 // the actual copying to a later point, nlmsg_reserve() can be used
 // for this purpose:
 void *data = nlmsg_reserve(msg, sizeof(mydata), NLMSG_ALIGNTO);

 // Attributes may be added using the attributes interface.

 // After successful use of the message, the memory must be freed
 // using nlmsg_free()
 nlmsg_free(msg);
4) Parsing messages
 int n;
 unsigned char *buf;
 struct nlmsghdr *hdr;

 n = nl_recv(handle, NULL, &buf);
 
 hdr = (struct nlmsghdr *) buf;
 while (nlmsg_ok(hdr, n)) {
        // Process message here...
        hdr = nlmsg_next(hdr, &n);
 }

Define Documentation

#define NL_AUTO_PID   0
Note:
Requires the use of nl_send_auto_complete()!

Definition at line 32 of file msg.h.

#define NL_AUTO_SEQ   0
Note:
Requires the use of nl_send_auto_complete()!

Definition at line 41 of file msg.h.

#define nlmsg_for_each_attr ( pos,
nlh,
hdrlen,
rem   ) 
Value:
nla_for_each_attr(pos, nlmsg_attrdata(nlh, hdrlen), \
                          nlmsg_attrlen(nlh, hdrlen), rem)
Parameters:
pos loop counter, set to current attribute
nlh netlink message header
hdrlen length of family header
rem initialized to len, holds bytes currently remaining in stream

Definition at line 126 of file msg.h.

#define nlmsg_for_each_msg ( pos,
head,
len,
rem   ) 
Value:
for (pos = head, rem = len; \
             nlmsg_ok(pos, rem); \
             pos = nlmsg_next(pos, &(rem)))
Parameters:
pos loop counter, set to current message
head head of message stream
len length of message stream
rem initialized to len, holds bytes currently remaining in stream

Definition at line 137 of file msg.h.

#define NLM_F_ATOMIC   0x400

This may require special privileges because it has the potential to interrupt service in the FE for a longer time.

Definition at line 106 of file netlink-kernel.h.

#define NLMSG_ERROR   0x2

This can be looked at as a NACK and typically it is from FEC to CPC.

Definition at line 159 of file netlink-kernel.h.


Function Documentation

int nlmsg_msg_size ( int  payload  ) 
Parameters:
payload length of message payload

Definition at line 184 of file msg.c.

Referenced by nl_msg_dump(), nlmsg_padlen(), and nlmsg_total_size().

00185 {
00186         return NLMSG_HDRLEN + payload;
00187 }

int nlmsg_total_size ( int  payload  ) 
Parameters:
payload length of message payload

Definition at line 193 of file msg.c.

References nlmsg_msg_size().

Referenced by nlmsg_padlen(), and nlmsg_set_default_size().

00194 {
00195         return NLMSG_ALIGN(nlmsg_msg_size(payload));
00196 }

int nlmsg_padlen ( int  payload  ) 
Parameters:
payload length of message payload

Definition at line 202 of file msg.c.

References nlmsg_msg_size(), and nlmsg_total_size().

00203 {
00204         return nlmsg_total_size(payload) - nlmsg_msg_size(payload);
00205 }

void* nlmsg_data ( const struct nlmsghdr nlh  ) 
Parameters:
nlh netlink messsage header

Definition at line 218 of file msg.c.

Referenced by genlmsg_put(), nfnlmsg_family(), nfnlmsg_res_id(), nl_msg_dump(), nla_put(), nla_put_nested(), nla_reserve(), and nlmsg_attrdata().

00219 {
00220         return (unsigned char *) nlh + NLMSG_HDRLEN;
00221 }

int nlmsg_len ( const struct nlmsghdr nlh  ) 
Parameters:
nlh netlink message header

Definition at line 232 of file msg.c.

References nlmsghdr::nlmsg_len.

Referenced by nl_msg_dump(), nla_put_nested(), nlmsg_attrlen(), and nlmsg_reserve().

00233 {
00234         return nlh->nlmsg_len - NLMSG_HDRLEN;
00235 }

struct nlattr* nlmsg_attrdata ( const struct nlmsghdr nlh,
int  hdrlen 
) [read]
Parameters:
nlh netlink message header
hdrlen length of family specific header

Definition at line 249 of file msg.c.

References nlmsg_data().

Referenced by nl_msg_dump(), nlmsg_find_attr(), nlmsg_parse(), and nlmsg_validate().

00250 {
00251         unsigned char *data = nlmsg_data(nlh);
00252         return (struct nlattr *) (data + NLMSG_ALIGN(hdrlen));
00253 }

int nlmsg_attrlen ( const struct nlmsghdr nlh,
int  hdrlen 
)
Parameters:
nlh netlink message header
hdrlen length of family specific header

Definition at line 260 of file msg.c.

References nlmsg_len().

Referenced by nl_msg_dump(), nlmsg_find_attr(), nlmsg_parse(), and nlmsg_validate().

00261 {
00262         return nlmsg_len(nlh) - NLMSG_ALIGN(hdrlen);
00263 }

int nlmsg_ok ( const struct nlmsghdr nlh,
int  remaining 
)
Parameters:
nlh netlink message header
remaining number of bytes remaining in message stream

Definition at line 285 of file msg.c.

References nlmsghdr::nlmsg_len.

00286 {
00287         return (remaining >= sizeof(struct nlmsghdr) &&
00288                 nlh->nlmsg_len >= sizeof(struct nlmsghdr) &&
00289                 nlh->nlmsg_len <= remaining);
00290 }

struct nlmsghdr* nlmsg_next ( struct nlmsghdr nlh,
int *  remaining 
) [read]
Parameters:
nlh netlink message header
remaining number of bytes remaining in message stream
Returns:
the next netlink message in the message stream and decrements remaining by the size of the current message.

Definition at line 300 of file msg.c.

References nlmsghdr::nlmsg_len.

00301 {
00302         int totlen = NLMSG_ALIGN(nlh->nlmsg_len);
00303 
00304         *remaining -= totlen;
00305 
00306         return (struct nlmsghdr *) ((unsigned char *) nlh + totlen);
00307 }

int nlmsg_parse ( struct nlmsghdr nlh,
int  hdrlen,
struct nlattr *  tb[],
int  maxtype,
struct nla_policy policy 
)
Parameters:
nlh netlink message header
hdrlen length of family specific header
tb destination array with maxtype+1 elements
maxtype maximum attribute type to be expected
policy validation policy

See nla_parse()

Definition at line 319 of file msg.c.

References nla_parse(), nlmsg_attrdata(), and nlmsg_attrlen().

00321 {
00322         if (!nlmsg_valid_hdr(nlh, hdrlen))
00323                 return nl_errno(EINVAL);
00324 
00325         return nla_parse(tb, maxtype, nlmsg_attrdata(nlh, hdrlen),
00326                          nlmsg_attrlen(nlh, hdrlen), policy);
00327 }

struct nlattr* nlmsg_find_attr ( struct nlmsghdr nlh,
int  hdrlen,
int  attrtype 
) [read]
Parameters:
nlh netlink message header
hdrlen length of familiy specific header
attrtype type of attribute to look for

Returns the first attribute which matches the specified type.

Definition at line 337 of file msg.c.

References nla_find(), nlmsg_attrdata(), and nlmsg_attrlen().

00338 {
00339         return nla_find(nlmsg_attrdata(nlh, hdrlen),
00340                         nlmsg_attrlen(nlh, hdrlen), attrtype);
00341 }

int nlmsg_validate ( struct nlmsghdr nlh,
int  hdrlen,
int  maxtype,
struct nla_policy policy 
)
Parameters:
nlh netlinket message header
hdrlen length of familiy specific header
maxtype maximum attribute type to be expected
policy validation policy

Definition at line 350 of file msg.c.

References nla_validate(), nlmsg_attrdata(), and nlmsg_attrlen().

00352 {
00353         if (!nlmsg_valid_hdr(nlh, hdrlen))
00354                 return nl_errno(EINVAL);
00355 
00356         return nla_validate(nlmsg_attrdata(nlh, hdrlen),
00357                             nlmsg_attrlen(nlh, hdrlen), maxtype, policy);
00358 }

struct nl_msg* nlmsg_alloc ( void   )  [read]

Allocates a new netlink message without any further payload. The maximum payload size defaults to PAGESIZE or as otherwise specified with nlmsg_set_default_size().

Returns:
Newly allocated netlink message or NULL.

Definition at line 401 of file msg.c.

Referenced by nlmsg_inherit(), and rtnl_neightbl_build_change_request().

00402 {
00403         return __nlmsg_alloc(default_msg_size);
00404 }

struct nl_msg* nlmsg_inherit ( struct nlmsghdr hdr  )  [read]
Parameters:
hdr Netlink message header template

Allocates a new netlink message and inherits the original message header. If hdr is not NULL it will be used as a template for the netlink message header, otherwise the header is left blank.

Returns:
Newly allocated netlink message or NULL

Definition at line 424 of file msg.c.

References nlmsg_alloc(), nlmsghdr::nlmsg_flags, nlmsghdr::nlmsg_pid, nlmsghdr::nlmsg_seq, and nlmsghdr::nlmsg_type.

Referenced by nl_msg_dump(), and nlmsg_alloc_simple().

00425 {
00426         struct nl_msg *nm;
00427 
00428         nm = nlmsg_alloc();
00429         if (nm && hdr) {
00430                 struct nlmsghdr *new = nm->nm_nlh;
00431 
00432                 new->nlmsg_type = hdr->nlmsg_type;
00433                 new->nlmsg_flags = hdr->nlmsg_flags;
00434                 new->nlmsg_seq = hdr->nlmsg_seq;
00435                 new->nlmsg_pid = hdr->nlmsg_pid;
00436         }
00437 
00438         return nm;
00439 }

struct nl_msg* nlmsg_alloc_simple ( int  nlmsgtype,
int  flags 
) [read]
Parameters:
nlmsgtype Netlink message type
flags Message flags.
Returns:
Newly allocated netlink message or NULL.

Definition at line 448 of file msg.c.

References nlmsg_inherit(), and nlmsghdr::nlmsg_type.

Referenced by flnl_lookup_build_request(), nfnlmsg_alloc_simple(), nl_send_simple(), rtnl_link_build_change_request(), rtnl_neightbl_build_change_request(), and rtnl_qdisc_build_delete_request().

00449 {
00450         struct nl_msg *msg;
00451         struct nlmsghdr nlh = {
00452                 .nlmsg_type = nlmsgtype,
00453                 .nlmsg_flags = flags,
00454         };
00455 
00456         msg = nlmsg_inherit(&nlh);
00457         if (msg)
00458                 NL_DBG(2, "msg %p: Allocated new simple message\n", msg);
00459 
00460         return msg;
00461 }

void nlmsg_set_default_size ( size_t  max  ) 
Parameters:
max Size of payload in bytes.

Definition at line 467 of file msg.c.

References nlmsg_total_size().

00468 {
00469         if (max < nlmsg_total_size(0))
00470                 max = nlmsg_total_size(0);
00471 
00472         default_msg_size = max;
00473 }

struct nl_msg* nlmsg_convert ( struct nlmsghdr hdr  )  [read]
Parameters:
hdr Netlink message received from netlink socket.

Allocates a new netlink message and copies all of the data pointed to by hdr into the new message object.

Returns:
Newly allocated netlink message or NULL.

Definition at line 484 of file msg.c.

References nlmsg_free(), and nlmsghdr::nlmsg_len.

00485 {
00486         struct nl_msg *nm;
00487 
00488         nm = __nlmsg_alloc(NLMSG_ALIGN(hdr->nlmsg_len));
00489         if (!nm)
00490                 goto errout;
00491 
00492         memcpy(nm->nm_nlh, hdr, hdr->nlmsg_len);
00493 
00494         return nm;
00495 errout:
00496         nlmsg_free(nm);
00497         return NULL;
00498 }

void* nlmsg_reserve ( struct nl_msg *  n,
size_t  len,
int  pad 
)
Parameters:
n netlink message
len length of additional data to reserve room for
pad number of bytes to align data to

Reserves room for additional data at the tail of the an existing netlink message. Eventual padding required will be zeroed out.

Returns:
Pointer to start of additional data tailroom or NULL.

Definition at line 512 of file msg.c.

References nlmsg_len().

Referenced by nlmsg_append(), and nlmsg_put().

00513 {
00514         void *buf = n->nm_nlh;
00515         size_t nlmsg_len = n->nm_nlh->nlmsg_len;
00516         size_t tlen;
00517 
00518         tlen = pad ? ((len + (pad - 1)) & ~(pad - 1)) : len;
00519 
00520         if ((tlen + nlmsg_len) > n->nm_size) {
00521                 nl_errno(ENOBUFS);
00522                 return NULL;
00523         }
00524 
00525         buf += nlmsg_len;
00526         n->nm_nlh->nlmsg_len += tlen;
00527 
00528         if (tlen > len)
00529                 memset(buf + len, 0, tlen - len);
00530 
00531         NL_DBG(2, "msg %p: Reserved %zu bytes, pad=%d, nlmsg_len=%d\n",
00532                   n, len, pad, n->nm_nlh->nlmsg_len);
00533 
00534         return buf;
00535 }

int nlmsg_append ( struct nl_msg *  n,
void *  data,
size_t  len,
int  pad 
)
Parameters:
n netlink message
data data to add
len length of data
pad Number of bytes to align data to.

Extends the netlink message as needed and appends the data of given length to the message.

Returns:
0 on success or a negative error code

Definition at line 549 of file msg.c.

References nlmsg_reserve().

Referenced by flnl_lookup_build_request(), nl_send_simple(), rtnl_link_build_change_request(), rtnl_neightbl_build_change_request(), and rtnl_qdisc_build_delete_request().

00550 {
00551         void *tmp;
00552 
00553         tmp = nlmsg_reserve(n, len, pad);
00554         if (tmp == NULL)
00555                 return nl_errno(ENOMEM);
00556 
00557         memcpy(tmp, data, len);
00558         NL_DBG(2, "msg %p: Appended %zu bytes with padding %d\n", n, len, pad);
00559 
00560         return 0;
00561 }

int nlmsg_expand ( struct nl_msg *  n,
size_t  newlen 
)
Parameters:
n Netlink message.
newlen New maximum payload size.

Reallocates the payload section of a netlink message and increases the maximum payload size of the message.

Note:
Any pointers pointing to old payload block will be stale and need to be refetched. Therfore, do not expand while constructing nested attributes or while reserved data blocks are held.
Returns:
0 on success or a negative error code.

Definition at line 577 of file msg.c.

00578 {
00579         void *tmp;
00580 
00581         if (newlen <= n->nm_size)
00582                 return nl_errno(EINVAL);
00583 
00584         tmp = realloc(n->nm_nlh, newlen);
00585         if (tmp == NULL)
00586                 return nl_errno(ENOMEM);
00587 
00588         n->nm_nlh = tmp;
00589         n->nm_size = newlen;
00590 
00591         return 0;
00592 }

struct nlmsghdr* nlmsg_put ( struct nl_msg *  n,
uint32_t  pid,
uint32_t  seq,
int  type,
int  payload,
int  flags 
) [read]
Parameters:
n netlink message
pid netlink process id or NL_AUTO_PID
seq sequence number of message or NL_AUTO_SEQ
type message type
payload length of message payload
flags message flags

Adds or overwrites the netlink message header in an existing message object. If payload is greater-than zero additional room will be reserved, f.e. for family specific headers. It can be accesed via nlmsg_data().

Returns:
A pointer to the netlink message header or NULL.

Definition at line 610 of file msg.c.

References nlmsghdr::nlmsg_flags, nlmsghdr::nlmsg_pid, nlmsg_reserve(), nlmsghdr::nlmsg_seq, and nlmsghdr::nlmsg_type.

Referenced by genlmsg_put(), and nfnlmsg_put().

00612 {
00613         struct nlmsghdr *nlh;
00614 
00615         if (n->nm_nlh->nlmsg_len < NLMSG_HDRLEN)
00616                 BUG();
00617 
00618         nlh = (struct nlmsghdr *) n->nm_nlh;
00619         nlh->nlmsg_type = type;
00620         nlh->nlmsg_flags = flags;
00621         nlh->nlmsg_pid = pid;
00622         nlh->nlmsg_seq = seq;
00623 
00624         NL_DBG(2, "msg %p: Added netlink header type=%d, flags=%d, pid=%d, "
00625                   "seq=%d\n", n, type, flags, pid, seq);
00626 
00627         if (payload > 0 &&
00628             nlmsg_reserve(n, payload, NLMSG_ALIGNTO) == NULL)
00629                 return NULL;
00630 
00631         return nlh;
00632 }

struct nlmsghdr* nlmsg_hdr ( struct nl_msg *  n  )  [read]
Parameters:
n netlink message

Returns the actual netlink message casted to the type of the netlink message header.

Returns:
A pointer to the netlink message.

Definition at line 643 of file msg.c.

Referenced by nl_cache_parse_and_add(), nl_msg_dump(), nl_send_auto_complete(), and nl_sendmsg().

00644 {
00645         return n->nm_nlh;
00646 }

void nlmsg_free ( struct nl_msg *  n  ) 
Parameters:
n netlink message

Destroys a netlink message and frees up all used memory.

Precondition:
The message must be unused.

Definition at line 656 of file msg.c.

Referenced by flnl_lookup(), flnl_lookup_build_request(), nfnlmsg_alloc_simple(), nl_msg_dump(), nl_send_simple(), nlmsg_convert(), rtnl_addr_add(), rtnl_addr_delete(), rtnl_class_add(), rtnl_cls_add(), rtnl_cls_change(), rtnl_cls_delete(), rtnl_link_build_change_request(), rtnl_link_change(), rtnl_neigh_add(), rtnl_neigh_change(), rtnl_neigh_delete(), rtnl_neightbl_build_change_request(), rtnl_neightbl_change(), rtnl_qdisc_add(), rtnl_qdisc_change(), rtnl_qdisc_delete(), rtnl_rule_add(), and rtnl_rule_delete().

00657 {
00658         if (!n)
00659                 return;
00660 
00661         free(n->nm_nlh);
00662         free(n);
00663         NL_DBG(2, "msg %p: Freed\n", n);
00664 }

void nl_msg_dump ( struct nl_msg *  msg,
FILE *  ofd 
)
Parameters:
msg Message to print
ofd File descriptor.

Definition at line 947 of file msg.c.

References nlmsgerr::error, nlmsgerr::msg, nl_cache_ops_associate(), nlmsg_attrdata(), nlmsg_attrlen(), nlmsg_data(), nlmsg_free(), nlmsg_hdr(), nlmsg_inherit(), nlmsg_len(), nlmsghdr::nlmsg_len, nlmsg_msg_size(), and nlmsghdr::nlmsg_type.

00948 {
00949         struct nlmsghdr *hdr = nlmsg_hdr(msg);
00950         
00951         fprintf(ofd, 
00952         "--------------------------   BEGIN NETLINK MESSAGE "
00953         "---------------------------\n");
00954 
00955         fprintf(ofd, "  [HEADER] %Zu octets\n", sizeof(struct nlmsghdr));
00956         print_hdr(ofd, msg);
00957 
00958         if (hdr->nlmsg_type == NLMSG_ERROR &&
00959             hdr->nlmsg_len >= nlmsg_msg_size(sizeof(struct nlmsgerr))) {
00960                 struct nl_msg *errmsg;
00961                 struct nlmsgerr *err = nlmsg_data(hdr);
00962 
00963                 fprintf(ofd, "  [ERRORMSG] %Zu octets\n", sizeof(*err));
00964                 fprintf(ofd, "    .error = %d \"%s\"\n", err->error,
00965                         strerror(-err->error));
00966                 fprintf(ofd, "  [ORIGINAL MESSAGE] %Zu octets\n", sizeof(*hdr));
00967 
00968                 errmsg = nlmsg_inherit(&err->msg);
00969                 print_hdr(ofd, errmsg);
00970                 nlmsg_free(errmsg);
00971         } else if (nlmsg_len(hdr) > 0) {
00972                 struct nl_cache_ops *ops;
00973                 int payloadlen = nlmsg_len(hdr);
00974                 int attrlen = 0;
00975 
00976                 ops = nl_cache_ops_associate(nlmsg_get_proto(msg),
00977                                              hdr->nlmsg_type);
00978                 if (ops) {
00979                         attrlen = nlmsg_attrlen(hdr, ops->co_hdrsize);
00980                         payloadlen -= attrlen;
00981                 }
00982 
00983                 fprintf(ofd, "  [PAYLOAD] %d octets\n", payloadlen);
00984                 dump_hex(ofd, nlmsg_data(hdr), payloadlen, 0);
00985 
00986                 if (attrlen) {
00987                         struct nlattr *attrs;
00988                         int attrlen;
00989                         
00990                         attrs = nlmsg_attrdata(hdr, ops->co_hdrsize);
00991                         attrlen = nlmsg_attrlen(hdr, ops->co_hdrsize);
00992                         dump_attrs(ofd, attrs, attrlen, 0);
00993                 }
00994         }
00995 
00996         fprintf(ofd, 
00997         "---------------------------  END NETLINK MESSAGE   "
00998         "---------------------------\n");
00999 }


Generated on 30 Oct 2009 for libnl by  doxygen 1.6.1