libnl 1.1
Data Structures | Modules | Defines
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.

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 Type Translations

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

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:
posloop counter, set to current attribute
nlhnetlink message header
hdrlenlength of family header
reminitialized 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:
posloop counter, set to current message
headhead of message stream
lenlength of message stream
reminitialized 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:
payloadlength of message payload

Definition at line 184 of file msg.c.

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

{
        return NLMSG_HDRLEN + payload;
}
int nlmsg_total_size ( int  payload)
Parameters:
payloadlength of message payload

Definition at line 193 of file msg.c.

References nlmsg_msg_size().

Referenced by nlmsg_padlen(), and nlmsg_set_default_size().

{
        return NLMSG_ALIGN(nlmsg_msg_size(payload));
}
int nlmsg_padlen ( int  payload)
Parameters:
payloadlength of message payload

Definition at line 202 of file msg.c.

References nlmsg_msg_size(), and nlmsg_total_size().

{
        return nlmsg_total_size(payload) - nlmsg_msg_size(payload);
}
void* nlmsg_data ( const struct nlmsghdr nlh)
Parameters:
nlhnetlink 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().

{
        return (unsigned char *) nlh + NLMSG_HDRLEN;
}
int nlmsg_len ( const struct nlmsghdr nlh)
Parameters:
nlhnetlink 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().

{
        return nlh->nlmsg_len - NLMSG_HDRLEN;
}
struct nlattr* nlmsg_attrdata ( const struct nlmsghdr nlh,
int  hdrlen 
) [read]
Parameters:
nlhnetlink message header
hdrlenlength 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().

{
        unsigned char *data = nlmsg_data(nlh);
        return (struct nlattr *) (data + NLMSG_ALIGN(hdrlen));
}
int nlmsg_attrlen ( const struct nlmsghdr nlh,
int  hdrlen 
)
Parameters:
nlhnetlink message header
hdrlenlength 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().

{
        return nlmsg_len(nlh) - NLMSG_ALIGN(hdrlen);
}
int nlmsg_ok ( const struct nlmsghdr nlh,
int  remaining 
)
Parameters:
nlhnetlink message header
remainingnumber of bytes remaining in message stream

Definition at line 285 of file msg.c.

References nlmsghdr::nlmsg_len.

{
        return (remaining >= sizeof(struct nlmsghdr) &&
                nlh->nlmsg_len >= sizeof(struct nlmsghdr) &&
                nlh->nlmsg_len <= remaining);
}
struct nlmsghdr* nlmsg_next ( struct nlmsghdr nlh,
int *  remaining 
) [read]
Parameters:
nlhnetlink message header
remainingnumber 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.

{
        int totlen = NLMSG_ALIGN(nlh->nlmsg_len);

        *remaining -= totlen;

        return (struct nlmsghdr *) ((unsigned char *) nlh + totlen);
}
int nlmsg_parse ( struct nlmsghdr nlh,
int  hdrlen,
struct nlattr *  tb[],
int  maxtype,
struct nla_policy policy 
)
Parameters:
nlhnetlink message header
hdrlenlength of family specific header
tbdestination array with maxtype+1 elements
maxtypemaximum attribute type to be expected
policyvalidation policy

See nla_parse()

Definition at line 319 of file msg.c.

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

{
        if (!nlmsg_valid_hdr(nlh, hdrlen))
                return nl_errno(EINVAL);

        return nla_parse(tb, maxtype, nlmsg_attrdata(nlh, hdrlen),
                         nlmsg_attrlen(nlh, hdrlen), policy);
}
struct nlattr* nlmsg_find_attr ( struct nlmsghdr nlh,
int  hdrlen,
int  attrtype 
) [read]
Parameters:
nlhnetlink message header
hdrlenlength of familiy specific header
attrtypetype 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().

{
        return nla_find(nlmsg_attrdata(nlh, hdrlen),
                        nlmsg_attrlen(nlh, hdrlen), attrtype);
}
int nlmsg_validate ( struct nlmsghdr nlh,
int  hdrlen,
int  maxtype,
struct nla_policy policy 
)
Parameters:
nlhnetlinket message header
hdrlenlength of familiy specific header
maxtypemaximum attribute type to be expected
policyvalidation policy

Definition at line 350 of file msg.c.

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

{
        if (!nlmsg_valid_hdr(nlh, hdrlen))
                return nl_errno(EINVAL);

        return nla_validate(nlmsg_attrdata(nlh, hdrlen),
                            nlmsg_attrlen(nlh, hdrlen), maxtype, policy);
}
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().

{
        return __nlmsg_alloc(default_msg_size);
}
struct nl_msg* nlmsg_inherit ( struct nlmsghdr hdr) [read]
Parameters:
hdrNetlink 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().

{
        struct nl_msg *nm;

        nm = nlmsg_alloc();
        if (nm && hdr) {
                struct nlmsghdr *new = nm->nm_nlh;

                new->nlmsg_type = hdr->nlmsg_type;
                new->nlmsg_flags = hdr->nlmsg_flags;
                new->nlmsg_seq = hdr->nlmsg_seq;
                new->nlmsg_pid = hdr->nlmsg_pid;
        }

        return nm;
}
struct nl_msg* nlmsg_alloc_simple ( int  nlmsgtype,
int  flags 
) [read]
Parameters:
nlmsgtypeNetlink message type
flagsMessage 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().

{
        struct nl_msg *msg;
        struct nlmsghdr nlh = {
                .nlmsg_type = nlmsgtype,
                .nlmsg_flags = flags,
        };

        msg = nlmsg_inherit(&nlh);
        if (msg)
                NL_DBG(2, "msg %p: Allocated new simple message\n", msg);

        return msg;
}
void nlmsg_set_default_size ( size_t  max)
Parameters:
maxSize of payload in bytes.

Definition at line 467 of file msg.c.

References nlmsg_total_size().

{
        if (max < nlmsg_total_size(0))
                max = nlmsg_total_size(0);

        default_msg_size = max;
}
struct nl_msg* nlmsg_convert ( struct nlmsghdr hdr) [read]
Parameters:
hdrNetlink 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.

{
        struct nl_msg *nm;

        nm = __nlmsg_alloc(NLMSG_ALIGN(hdr->nlmsg_len));
        if (!nm)
                goto errout;

        memcpy(nm->nm_nlh, hdr, hdr->nlmsg_len);

        return nm;
errout:
        nlmsg_free(nm);
        return NULL;
}
void* nlmsg_reserve ( struct nl_msg *  n,
size_t  len,
int  pad 
)
Parameters:
nnetlink message
lenlength of additional data to reserve room for
padnumber 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().

{
        void *buf = n->nm_nlh;
        size_t nlmsg_len = n->nm_nlh->nlmsg_len;
        size_t tlen;

        tlen = pad ? ((len + (pad - 1)) & ~(pad - 1)) : len;

        if ((tlen + nlmsg_len) > n->nm_size) {
                nl_errno(ENOBUFS);
                return NULL;
        }

        buf += nlmsg_len;
        n->nm_nlh->nlmsg_len += tlen;

        if (tlen > len)
                memset(buf + len, 0, tlen - len);

        NL_DBG(2, "msg %p: Reserved %zu bytes, pad=%d, nlmsg_len=%d\n",
                  n, len, pad, n->nm_nlh->nlmsg_len);

        return buf;
}
int nlmsg_append ( struct nl_msg *  n,
void *  data,
size_t  len,
int  pad 
)
Parameters:
nnetlink message
datadata to add
lenlength of data
padNumber 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().

{
        void *tmp;

        tmp = nlmsg_reserve(n, len, pad);
        if (tmp == NULL)
                return nl_errno(ENOMEM);

        memcpy(tmp, data, len);
        NL_DBG(2, "msg %p: Appended %zu bytes with padding %d\n", n, len, pad);

        return 0;
}
int nlmsg_expand ( struct nl_msg *  n,
size_t  newlen 
)
Parameters:
nNetlink message.
newlenNew 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.

{
        void *tmp;

        if (newlen <= n->nm_size)
                return nl_errno(EINVAL);

        tmp = realloc(n->nm_nlh, newlen);
        if (tmp == NULL)
                return nl_errno(ENOMEM);

        n->nm_nlh = tmp;
        n->nm_size = newlen;

        return 0;
}
struct nlmsghdr* nlmsg_put ( struct nl_msg *  n,
uint32_t  pid,
uint32_t  seq,
int  type,
int  payload,
int  flags 
) [read]
Parameters:
nnetlink message
pidnetlink process id or NL_AUTO_PID
seqsequence number of message or NL_AUTO_SEQ
typemessage type
payloadlength of message payload
flagsmessage 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().

{
        struct nlmsghdr *nlh;

        if (n->nm_nlh->nlmsg_len < NLMSG_HDRLEN)
                BUG();

        nlh = (struct nlmsghdr *) n->nm_nlh;
        nlh->nlmsg_type = type;
        nlh->nlmsg_flags = flags;
        nlh->nlmsg_pid = pid;
        nlh->nlmsg_seq = seq;

        NL_DBG(2, "msg %p: Added netlink header type=%d, flags=%d, pid=%d, "
                  "seq=%d\n", n, type, flags, pid, seq);

        if (payload > 0 &&
            nlmsg_reserve(n, payload, NLMSG_ALIGNTO) == NULL)
                return NULL;

        return nlh;
}
struct nlmsghdr* nlmsg_hdr ( struct nl_msg *  n) [read]
Parameters:
nnetlink 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().

{
        return n->nm_nlh;
}
void nlmsg_free ( struct nl_msg *  n)
void nl_msg_dump ( struct nl_msg *  msg,
FILE *  ofd 
)
Parameters:
msgMessage to print
ofdFile 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.

{
        struct nlmsghdr *hdr = nlmsg_hdr(msg);
        
        fprintf(ofd, 
        "--------------------------   BEGIN NETLINK MESSAGE "
        "---------------------------\n");

        fprintf(ofd, "  [HEADER] %Zu octets\n", sizeof(struct nlmsghdr));
        print_hdr(ofd, msg);

        if (hdr->nlmsg_type == NLMSG_ERROR &&
            hdr->nlmsg_len >= nlmsg_msg_size(sizeof(struct nlmsgerr))) {
                struct nl_msg *errmsg;
                struct nlmsgerr *err = nlmsg_data(hdr);

                fprintf(ofd, "  [ERRORMSG] %Zu octets\n", sizeof(*err));
                fprintf(ofd, "    .error = %d \"%s\"\n", err->error,
                        strerror(-err->error));
                fprintf(ofd, "  [ORIGINAL MESSAGE] %Zu octets\n", sizeof(*hdr));

                errmsg = nlmsg_inherit(&err->msg);
                print_hdr(ofd, errmsg);
                nlmsg_free(errmsg);
        } else if (nlmsg_len(hdr) > 0) {
                struct nl_cache_ops *ops;
                int payloadlen = nlmsg_len(hdr);
                int attrlen = 0;

                ops = nl_cache_ops_associate(nlmsg_get_proto(msg),
                                             hdr->nlmsg_type);
                if (ops) {
                        attrlen = nlmsg_attrlen(hdr, ops->co_hdrsize);
                        payloadlen -= attrlen;
                }

                fprintf(ofd, "  [PAYLOAD] %d octets\n", payloadlen);
                dump_hex(ofd, nlmsg_data(hdr), payloadlen, 0);

                if (attrlen) {
                        struct nlattr *attrs;
                        int attrlen;
                        
                        attrs = nlmsg_attrdata(hdr, ops->co_hdrsize);
                        attrlen = nlmsg_attrlen(hdr, ops->co_hdrsize);
                        dump_attrs(ofd, attrs, attrlen, 0);
                }
        }

        fprintf(ofd, 
        "---------------------------  END NETLINK MESSAGE   "
        "---------------------------\n");
}