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 nlmsghdr * | nlmsg_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 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. | |
struct nlmsghdr * | nlmsg_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_nl * | nlmsg_get_src (struct nl_msg *msg) |
void | nlmsg_set_dst (struct nl_msg *msg, struct sockaddr_nl *addr) |
struct sockaddr_nl * | nlmsg_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. |
The following information is partly extracted from RFC3549 (ftp://ftp.rfc-editor.org/in-notes/rfc3549.txt)
NLM_F_MULTI
Netlink header flag set, except for the last header which has the Netlink header type NLMSG_DONE
.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) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
<------- NLMSG_ALIGN(hlen) ------> <---- NLMSG_ALIGN(len) ---> +----------------------------+- - -+- - - - - - - - - - -+- - -+ | Header | Pad | Payload | Pad | | struct nlmsghdr | | | | +----------------------------+- - -+- - - - - - - - - - -+- - -+
<--- nlmsg_total_size(payload) ---> <-- nlmsg_msg_size(payload) -> +----------+- - -+-------------+- - -+-------- - - | nlmsghdr | Pad | Payload | Pad | nlmsghdr +----------+- - -+-------------+- - -+-------- - - nlmsg_data(nlh)---^ ^ nlmsg_next(nlh)-----------------------+
<---------------------- nlmsg_len(nlh) ---------------------> <------ hdrlen ------> <- nlmsg_attrlen(nlh, hdrlen) -> +----------------------+- - -+--------------------------------+ | Family Header | Pad | Attributes | +----------------------+- - -+--------------------------------+ nlmsg_attrdata(nlh, hdrlen)---^
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 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// 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);
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 NL_AUTO_PID 0 |
#define NL_AUTO_SEQ 0 |
#define nlmsg_for_each_attr | ( | pos, | |||
nlh, | |||||
hdrlen, | |||||
rem | ) |
nla_for_each_attr(pos, nlmsg_attrdata(nlh, hdrlen), \ nlmsg_attrlen(nlh, hdrlen), rem)
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 |
#define nlmsg_for_each_msg | ( | pos, | |||
head, | |||||
len, | |||||
rem | ) |
for (pos = head, rem = len; \ nlmsg_ok(pos, rem); \ pos = nlmsg_next(pos, &(rem)))
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 |
#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.
int nlmsg_msg_size | ( | int | payload | ) |
payload | length of message payload |
Definition at line 184 of file msg.c.
Referenced by nl_msg_dump(), nlmsg_padlen(), and nlmsg_total_size().
int nlmsg_total_size | ( | int | payload | ) |
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 | ) |
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 | ) |
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().
int nlmsg_len | ( | const struct nlmsghdr * | nlh | ) |
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] |
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 | |||
) |
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 | |||
) |
nlh | netlink message header | |
remaining | number of bytes remaining in message stream |
Definition at line 285 of file msg.c.
References nlmsghdr::nlmsg_len.
nlh | netlink message header | |
remaining | number of bytes remaining in message stream |
Definition at line 300 of file msg.c.
References nlmsghdr::nlmsg_len.
int nlmsg_parse | ( | struct nlmsghdr * | nlh, | |
int | hdrlen, | |||
struct nlattr * | tb[], | |||
int | maxtype, | |||
struct nla_policy * | policy | |||
) |
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] |
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 | |||
) |
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().
Definition at line 401 of file msg.c.
Referenced by nlmsg_inherit(), and rtnl_neightbl_build_change_request().
struct nl_msg* nlmsg_inherit | ( | struct nlmsghdr * | hdr | ) | [read] |
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.
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] |
nlmsgtype | Netlink message type | |
flags | Message flags. |
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 | ) |
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] |
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.
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 | |||
) |
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.
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 | |||
) |
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.
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 | |||
) |
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.
struct nlmsghdr* nlmsg_put | ( | struct nl_msg * | n, | |
uint32_t | pid, | |||
uint32_t | seq, | |||
int | type, | |||
int | payload, | |||
int | flags | |||
) | [read] |
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().
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] |
n | netlink message |
Returns the actual netlink message casted to the type of the netlink message header.
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().
void nlmsg_free | ( | struct nl_msg * | n | ) |
n | netlink message |
Destroys a netlink message and frees up all used memory.
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().
void nl_msg_dump | ( | struct nl_msg * | msg, | |
FILE * | ofd | |||
) |
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 }