<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <title>libnl: Messages</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <link href="doxygen.css" rel="stylesheet" type="text/css"/> </head> <body> <!-- Generated by Doxygen 1.7.3 --> <div id="top"> <div id="titlearea"> <table cellspacing="0" cellpadding="0"> <tbody> <tr style="height: 56px;"> <td style="padding-left: 0.5em;"> <div id="projectname">libnl <span id="projectnumber">1.1</span></div> </td> </tr> </tbody> </table> </div> <div id="navrow1" class="tabs"> <ul class="tablist"> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="modules.html"><span>Modules</span></a></li> <li><a href="annotated.html"><span>Data Structures</span></a></li> <li><a href="files.html"><span>Files</span></a></li> </ul> </div> </div> <div class="header"> <div class="summary"> <a href="#nested-classes">Data Structures</a> | <a href="#groups">Modules</a> | <a href="#define-members">Defines</a> </div> <div class="headertitle"> <h1>Messages</h1> </div> <div class="ingroups"><a class="el" href="group__nl.html">Core Netlink API</a></div></div> <div class="contents"> <p>Netlink Message Construction/Parsing Interface. <a href="#_details">More...</a></p> <table class="memberdecls"> <tr><td colspan="2"><h2><a name="nested-classes"></a> Data Structures</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structnlmsghdr.html">nlmsghdr</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Netlink message header. <a href="structnlmsghdr.html#_details">More...</a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structnlmsgerr.html">nlmsgerr</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Netlink error message. <a href="structnlmsgerr.html#_details">More...</a><br/></td></tr> <tr><td colspan="2"><h2><a name="groups"></a> Modules</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__attr.html">Attributes</a></td></tr> <p><tr><td class="mdescLeft"> </td><td class="mdescRight"><p>Netlink Attributes Construction/Parsing Interface. </p> <br/></td></tr> </p> <tr><td colspan="2"><h2><a name="define-members"></a> Defines</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#gaf1a05ed4b58b0d3a0409f2a749e0c91c">NL_AUTO_PID</a>   0</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Will cause the netlink pid to be set to the pid assigned to the netlink handle (socket) just before sending the message off. <a href="#gaf1a05ed4b58b0d3a0409f2a749e0c91c"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#gaca80a9f4084020b28afdb663b670dc4b">NL_AUTO_SEQ</a>   0</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">May be used to refer to a sequence number which should be automatically set just before sending the message off. <a href="#gaca80a9f4084020b28afdb663b670dc4b"></a><br/></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Size Calculations</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga3790ddfe9268d3b63f3cd1ceb9bb2f83">nlmsg_msg_size</a> (int payload)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">length of netlink message not including padding <a href="#ga3790ddfe9268d3b63f3cd1ceb9bb2f83"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga0734c5b291e451c26051ad3b6ef083bd">nlmsg_total_size</a> (int payload)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">length of netlink message including padding <a href="#ga0734c5b291e451c26051ad3b6ef083bd"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#gad47e979aa22aca4b8eb1c90234dea678">nlmsg_padlen</a> (int payload)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">length of padding at the message's tail <a href="#gad47e979aa22aca4b8eb1c90234dea678"></a><br/></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Payload Access</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#gae44a904bb40c8b5f5ff31539c21cfa5a">nlmsg_data</a> (const struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> *nlh)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">head of message payload <a href="#gae44a904bb40c8b5f5ff31539c21cfa5a"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga48aaede24d6b8a58d7a5cf786b94e19a"></a><!-- doxytag: member="msg::nlmsg_tail" ref="ga48aaede24d6b8a58d7a5cf786b94e19a" args="(const struct nlmsghdr *nlh)" --> void * </td><td class="memItemRight" valign="bottom"><b>nlmsg_tail</b> (const struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> *nlh)</td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#gafa0898e9ec7d59a8faa1e4f0ed3168bf">nlmsg_len</a> (const struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> *nlh)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">length of message payload <a href="#gafa0898e9ec7d59a8faa1e4f0ed3168bf"></a><br/></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Attribute Access</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct nlattr * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga203fdf0a4637e05df44de94c60d8e909">nlmsg_attrdata</a> (const struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> *nlh, int hdrlen)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">head of attributes data <a href="#ga203fdf0a4637e05df44de94c60d8e909"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#gac9a4689d22aaa2f630476a7826f25fec">nlmsg_attrlen</a> (const struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> *nlh, int hdrlen)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">length of attributes data <a href="#gac9a4689d22aaa2f630476a7826f25fec"></a><br/></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Message Parsing</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gaa57661a26df7a972253d326299ac01bf"></a><!-- doxytag: member="msg::nlmsg_valid_hdr" ref="gaa57661a26df7a972253d326299ac01bf" args="(const struct nlmsghdr *nlh, int hdrlen)" --> int </td><td class="memItemRight" valign="bottom"><b>nlmsg_valid_hdr</b> (const struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> *nlh, int hdrlen)</td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga0107484894e5be506c1e1bb6cb09dbe2">nlmsg_ok</a> (const struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> *nlh, int remaining)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">check if the netlink message fits into the remaining bytes <a href="#ga0107484894e5be506c1e1bb6cb09dbe2"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#gafae8cbad57755ac6d758f6073cb22134">nlmsg_next</a> (struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> *nlh, int *remaining)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">next netlink message in message stream <a href="#gafae8cbad57755ac6d758f6073cb22134"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga2671eefe95c3e44dec8ddab51ae57593">nlmsg_parse</a> (struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> *nlh, int hdrlen, struct nlattr *tb[], int maxtype, struct <a class="el" href="structnla__policy.html">nla_policy</a> *policy)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">parse attributes of a netlink message <a href="#ga2671eefe95c3e44dec8ddab51ae57593"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct nlattr * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#gafd0b61236f262b7cc720b1edd01458b4">nlmsg_find_attr</a> (struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> *nlh, int hdrlen, int attrtype)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">nlmsg_find_attr - find a specific attribute in a netlink message <a href="#gafd0b61236f262b7cc720b1edd01458b4"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#gac488c8e2fcaefe96cadd33ebdc4a922f">nlmsg_validate</a> (struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> *nlh, int hdrlen, int maxtype, struct <a class="el" href="structnla__policy.html">nla_policy</a> *policy)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">nlmsg_validate - validate a netlink message including attributes <a href="#gac488c8e2fcaefe96cadd33ebdc4a922f"></a><br/></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Message Building/Access</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct nl_msg * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga89c936bdf5e73455bb1640a0eb8a020d">nlmsg_alloc</a> (void)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate a new netlink message with the default maximum payload size. <a href="#ga89c936bdf5e73455bb1640a0eb8a020d"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga0d879daa3a3a7d53fbafe0d7d72a3994"></a><!-- doxytag: member="msg::nlmsg_alloc_size" ref="ga0d879daa3a3a7d53fbafe0d7d72a3994" args="(size_t max)" --> struct nl_msg * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga0d879daa3a3a7d53fbafe0d7d72a3994">nlmsg_alloc_size</a> (size_t max)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate a new netlink message with maximum payload size specified. <br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct nl_msg * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#gab89e1b4e969a091fed4ef851f3339756">nlmsg_inherit</a> (struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> *hdr)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate a new netlink message and inherit netlink message header. <a href="#gab89e1b4e969a091fed4ef851f3339756"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct nl_msg * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga580d8697d19050c55060bc10ab4eae9f">nlmsg_alloc_simple</a> (int nlmsgtype, int flags)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate a new netlink message. <a href="#ga580d8697d19050c55060bc10ab4eae9f"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#gaca38cf7b85baa19aad3cf33eff7e7a85">nlmsg_set_default_size</a> (size_t max)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Set the default maximum message payload size for allocated messages. <a href="#gaca38cf7b85baa19aad3cf33eff7e7a85"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct nl_msg * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga2695036495d7127e610bc99fee5c9674">nlmsg_convert</a> (struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> *hdr)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Convert a netlink message received from a netlink socket to a nl_msg. <a href="#ga2695036495d7127e610bc99fee5c9674"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga206eac17e0e75ae8457a513612395554">nlmsg_reserve</a> (struct nl_msg *n, size_t len, int pad)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Reserve room for additional data in a netlink message. <a href="#ga206eac17e0e75ae8457a513612395554"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#gacc5e5ade5675d041f86c7c8693f7088d">nlmsg_append</a> (struct nl_msg *n, void *data, size_t len, int pad)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Append data to tail of a netlink message. <a href="#gacc5e5ade5675d041f86c7c8693f7088d"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga87ebc73ca93e5fa90742021eba448e60">nlmsg_expand</a> (struct nl_msg *n, size_t newlen)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Expand maximum payload size of a netlink message. <a href="#ga87ebc73ca93e5fa90742021eba448e60"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga16919a9a8579f8b538b0376781c1839d">nlmsg_put</a> (struct nl_msg *n, uint32_t pid, uint32_t seq, int type, int payload, int flags)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Add a netlink message header to a netlink message. <a href="#ga16919a9a8579f8b538b0376781c1839d"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#gaa5f29579d86d2bdab26c312b44b56de7">nlmsg_hdr</a> (struct nl_msg *n)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Return actual netlink message. <a href="#gaa5f29579d86d2bdab26c312b44b56de7"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga138ba9bee70553f9fbe7143deacad48c">nlmsg_free</a> (struct nl_msg *n)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Free a netlink message. <a href="#ga138ba9bee70553f9fbe7143deacad48c"></a><br/></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Attributes</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gaa6ca3309992d1757d8c5e147c911598a"></a><!-- doxytag: member="msg::nlmsg_set_proto" ref="gaa6ca3309992d1757d8c5e147c911598a" args="(struct nl_msg *msg, int protocol)" --> void </td><td class="memItemRight" valign="bottom"><b>nlmsg_set_proto</b> (struct nl_msg *msg, int protocol)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga6c1f7c6ebc4e04149b5416ca2a64b728"></a><!-- doxytag: member="msg::nlmsg_get_proto" ref="ga6c1f7c6ebc4e04149b5416ca2a64b728" args="(struct nl_msg *msg)" --> int </td><td class="memItemRight" valign="bottom"><b>nlmsg_get_proto</b> (struct nl_msg *msg)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga095d61171766d9e264982560100a200f"></a><!-- doxytag: member="msg::nlmsg_get_max_size" ref="ga095d61171766d9e264982560100a200f" args="(struct nl_msg *msg)" --> size_t </td><td class="memItemRight" valign="bottom"><b>nlmsg_get_max_size</b> (struct nl_msg *msg)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga331a99c8812b0d6018c608e30c0aba53"></a><!-- doxytag: member="msg::nlmsg_set_src" ref="ga331a99c8812b0d6018c608e30c0aba53" args="(struct nl_msg *msg, struct sockaddr_nl *addr)" --> void </td><td class="memItemRight" valign="bottom"><b>nlmsg_set_src</b> (struct nl_msg *msg, struct <a class="el" href="structsockaddr__nl.html">sockaddr_nl</a> *addr)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga4c723e5e7b6f837b9aab6a4dac878c60"></a><!-- doxytag: member="msg::nlmsg_get_src" ref="ga4c723e5e7b6f837b9aab6a4dac878c60" args="(struct nl_msg *msg)" --> struct <a class="el" href="structsockaddr__nl.html">sockaddr_nl</a> * </td><td class="memItemRight" valign="bottom"><b>nlmsg_get_src</b> (struct nl_msg *msg)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga6f1fc0742d8786ba88406d5f8ecb0a2b"></a><!-- doxytag: member="msg::nlmsg_set_dst" ref="ga6f1fc0742d8786ba88406d5f8ecb0a2b" args="(struct nl_msg *msg, struct sockaddr_nl *addr)" --> void </td><td class="memItemRight" valign="bottom"><b>nlmsg_set_dst</b> (struct nl_msg *msg, struct <a class="el" href="structsockaddr__nl.html">sockaddr_nl</a> *addr)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga56d10ebca785fdfc675ee004e7d40921"></a><!-- doxytag: member="msg::nlmsg_get_dst" ref="ga56d10ebca785fdfc675ee004e7d40921" args="(struct nl_msg *msg)" --> struct <a class="el" href="structsockaddr__nl.html">sockaddr_nl</a> * </td><td class="memItemRight" valign="bottom"><b>nlmsg_get_dst</b> (struct nl_msg *msg)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga40ae47d0844d01979cc429257701ee13"></a><!-- doxytag: member="msg::nlmsg_set_creds" ref="ga40ae47d0844d01979cc429257701ee13" args="(struct nl_msg *msg, struct ucred *creds)" --> void </td><td class="memItemRight" valign="bottom"><b>nlmsg_set_creds</b> (struct nl_msg *msg, struct ucred *creds)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gacd1613cc44ed68b0e7073aa2d723b733"></a><!-- doxytag: member="msg::nlmsg_get_creds" ref="gacd1613cc44ed68b0e7073aa2d723b733" args="(struct nl_msg *msg)" --> struct ucred * </td><td class="memItemRight" valign="bottom"><b>nlmsg_get_creds</b> (struct nl_msg *msg)</td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Netlink Message Type Translations</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gaac4228547552be51c943a402ad16f118"></a><!-- doxytag: member="msg::nl_nlmsgtype2str" ref="gaac4228547552be51c943a402ad16f118" args="(int type, char *buf, size_t size)" --> char * </td><td class="memItemRight" valign="bottom"><b>nl_nlmsgtype2str</b> (int type, char *buf, size_t size)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gad13d8b98cd7db8cb4887cbd037b9e58b"></a><!-- doxytag: member="msg::nl_str2nlmsgtype" ref="gad13d8b98cd7db8cb4887cbd037b9e58b" args="(const char *name)" --> int </td><td class="memItemRight" valign="bottom"><b>nl_str2nlmsgtype</b> (const char *name)</td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Netlink Message Flags Translations</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga469450821ded7c51b67e17a70268acba"></a><!-- doxytag: member="msg::nl_nlmsg_flags2str" ref="ga469450821ded7c51b67e17a70268acba" args="(int flags, char *buf, size_t len)" --> char * </td><td class="memItemRight" valign="bottom"><b>nl_nlmsg_flags2str</b> (int flags, char *buf, size_t len)</td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Direct Parsing</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga3e6a3022304133582c38f04776581c71"></a><!-- doxytag: member="msg::nl_msg_parse" ref="ga3e6a3022304133582c38f04776581c71" args="(struct nl_msg *msg, void(*cb)(struct nl_object *, void *), void *arg)" --> int </td><td class="memItemRight" valign="bottom"><b>nl_msg_parse</b> (struct nl_msg *msg, void(*cb)(struct nl_object *, void *), void *arg)</td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Dumping</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga062de3af7d634b7638c053e4ba67a7eb">nl_msg_dump</a> (struct nl_msg *msg, FILE *ofd)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Dump message in human readable format to file descriptor. <a href="#ga062de3af7d634b7638c053e4ba67a7eb"></a><br/></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Iterators</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga8db9e6499b50ccdc5f7574940c4b1adf">nlmsg_for_each_attr</a>(pos, nlh, hdrlen, rem)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Iterate over a stream of attributes in a message. <a href="#ga8db9e6499b50ccdc5f7574940c4b1adf"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#gab6cf94a06c492911e6be789ff5a3deb4">nlmsg_for_each_msg</a>(pos, head, len, rem)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Iterate over a stream of messages. <a href="#gab6cf94a06c492911e6be789ff5a3deb4"></a><br/></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Standard message flags</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga456954d27b8adedd78136a9511f13160"></a><!-- doxytag: member="msg::NLM_F_REQUEST" ref="ga456954d27b8adedd78136a9511f13160" args="" --> #define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga456954d27b8adedd78136a9511f13160">NLM_F_REQUEST</a>   1</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Must be set on all request messages (typically from user space to kernel space). <br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga245e7fde2fbbdeb3860899f50213ff35"></a><!-- doxytag: member="msg::NLM_F_MULTI" ref="ga245e7fde2fbbdeb3860899f50213ff35" args="" --> #define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga245e7fde2fbbdeb3860899f50213ff35">NLM_F_MULTI</a>   2</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Indicates the message is part of a multipart message terminated by NLMSG_DONE. <br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga67d5b6ba8714b97d74df72d119351bee"></a><!-- doxytag: member="msg::NLM_F_ACK" ref="ga67d5b6ba8714b97d74df72d119351bee" args="" --> #define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga67d5b6ba8714b97d74df72d119351bee">NLM_F_ACK</a>   4</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Request for an acknowledgment on success. <br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gac39e15f4f5ba3d381bceae0f0476d001"></a><!-- doxytag: member="msg::NLM_F_ECHO" ref="gac39e15f4f5ba3d381bceae0f0476d001" args="" --> #define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#gac39e15f4f5ba3d381bceae0f0476d001">NLM_F_ECHO</a>   8</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Echo this request. <br/></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Additional message flags for GET requests</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga9b2c023dd75018e29e84c0ac8df20720"></a><!-- doxytag: member="msg::NLM_F_ROOT" ref="ga9b2c023dd75018e29e84c0ac8df20720" args="" --> #define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga9b2c023dd75018e29e84c0ac8df20720">NLM_F_ROOT</a>   0x100</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Return the complete table instead of a single entry. <br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga49bcfe3ce8471f372dcd17f6f989cd88"></a><!-- doxytag: member="msg::NLM_F_MATCH" ref="ga49bcfe3ce8471f372dcd17f6f989cd88" args="" --> #define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga49bcfe3ce8471f372dcd17f6f989cd88">NLM_F_MATCH</a>   0x200</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Return all entries matching criteria passed in message content. <br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#gaa5a74825940c1ee06bbe5bb808815873">NLM_F_ATOMIC</a>   0x400</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Return an atomic snapshot of the table being referenced. <a href="#gaa5a74825940c1ee06bbe5bb808815873"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga8d4fb2458c013decb6673f41c52c07b1"></a><!-- doxytag: member="msg::NLM_F_DUMP" ref="ga8d4fb2458c013decb6673f41c52c07b1" args="" --> #define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga8d4fb2458c013decb6673f41c52c07b1">NLM_F_DUMP</a>   (NLM_F_ROOT|NLM_F_MATCH)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Dump all entries. <br/></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Additional messsage flags for NEW requests</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga508feb1b826c0b8f6b2487c682ddb734"></a><!-- doxytag: member="msg::NLM_F_REPLACE" ref="ga508feb1b826c0b8f6b2487c682ddb734" args="" --> #define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga508feb1b826c0b8f6b2487c682ddb734">NLM_F_REPLACE</a>   0x100</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Replace existing matching config object with this request. <br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga0b0f8c9581ee93747c7d9e94ca0e0596"></a><!-- doxytag: member="msg::NLM_F_EXCL" ref="ga0b0f8c9581ee93747c7d9e94ca0e0596" args="" --> #define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga0b0f8c9581ee93747c7d9e94ca0e0596">NLM_F_EXCL</a>   0x200</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Don't replace the config object if it already exists. <br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga20a00ae52e4c150f54649d7346d23a7a"></a><!-- doxytag: member="msg::NLM_F_CREATE" ref="ga20a00ae52e4c150f54649d7346d23a7a" args="" --> #define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga20a00ae52e4c150f54649d7346d23a7a">NLM_F_CREATE</a>   0x400</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Create config object if it doesn't already exist. <br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga2113407e49ea146733a76f4c71294016"></a><!-- doxytag: member="msg::NLM_F_APPEND" ref="ga2113407e49ea146733a76f4c71294016" args="" --> #define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga2113407e49ea146733a76f4c71294016">NLM_F_APPEND</a>   0x800</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Add to the end of the object list. <br/></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Standard Message types</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga3033de03e6242ba7d7ffd2f2f4d3fb38"></a><!-- doxytag: member="msg::NLMSG_NOOP" ref="ga3033de03e6242ba7d7ffd2f2f4d3fb38" args="" --> #define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga3033de03e6242ba7d7ffd2f2f4d3fb38">NLMSG_NOOP</a>   0x1</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">No operation, message must be ignored. <br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga2d6d3c937fdda1d64201c5abfd5a2b83">NLMSG_ERROR</a>   0x2</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">The message signals an error and the payload contains a nlmsgerr structure. <a href="#ga2d6d3c937fdda1d64201c5abfd5a2b83"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga151b98bf01f462dbc5d3c69e6396e064"></a><!-- doxytag: member="msg::NLMSG_DONE" ref="ga151b98bf01f462dbc5d3c69e6396e064" args="" --> #define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga151b98bf01f462dbc5d3c69e6396e064">NLMSG_DONE</a>   0x3</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Message terminates a multipart message. <br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga369a70cf77edb2766b2196dfc70e9147"></a><!-- doxytag: member="msg::NLMSG_OVERRUN" ref="ga369a70cf77edb2766b2196dfc70e9147" args="" --> #define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga369a70cf77edb2766b2196dfc70e9147">NLMSG_OVERRUN</a>   0x4</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">The message signals that data got lost. <br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gaacc5e594f0d9c96f7fc07eb2805dd646"></a><!-- doxytag: member="msg::NLMSG_MIN_TYPE" ref="gaacc5e594f0d9c96f7fc07eb2805dd646" args="" --> #define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#gaacc5e594f0d9c96f7fc07eb2805dd646">NLMSG_MIN_TYPE</a>   0x10</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Lower limit of reserved message types. <br/></td></tr> </table> <hr/><a name="_details"></a><h2>Detailed Description</h2> <p>The following information is partly extracted from RFC3549 (<a href="ftp://ftp.rfc-editor.org/in-notes/rfc3549.txt">ftp://ftp.rfc-editor.org/in-notes/rfc3549.txt</a>)</p> <dl class="user"><dt><b>Message Format</b></dt><dd>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 <code>NLM_F_MULTI</code> Netlink header flag set, except for the last header which has the Netlink header type <code>NLMSG_DONE</code>.</dd></dl> <dl class="user"><dt><b></b></dt><dd>The Netlink message header (<a class="el" href="structnlmsghdr.html">struct nlmsghdr</a>) is shown below. <div class="fragment"><pre class="fragment"> 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) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ </pre></div></dd></dl> <dl class="user"><dt><b></b></dt><dd>The netlink message header and payload must be aligned properly: <div class="fragment"><pre class="fragment"> <------- NLMSG_ALIGN(hlen) ------> <---- NLMSG_ALIGN(len) ---> +----------------------------+- - -+- - - - - - - - - - -+- - -+ | Header | Pad | Payload | Pad | | <span class="keyword">struct </span><a class="code" href="structnlmsghdr.html" title="Netlink message header.">nlmsghdr</a> | | | | +----------------------------+- - -+- - - - - - - - - - -+- - -+ </pre></div> </dd></dl> <dl class="user"><dt><b></b></dt><dd>Message Format: <div class="fragment"><pre class="fragment"> <--- <a class="code" href="group__msg.html#ga0734c5b291e451c26051ad3b6ef083bd" title="length of netlink message including padding">nlmsg_total_size</a>(payload) ---> <-- <a class="code" href="group__msg.html#ga3790ddfe9268d3b63f3cd1ceb9bb2f83" title="length of netlink message not including padding">nlmsg_msg_size</a>(payload) -> +----------+- - -+-------------+- - -+-------- - - | <a class="code" href="structnlmsghdr.html" title="Netlink message header.">nlmsghdr</a> | Pad | Payload | Pad | <a class="code" href="structnlmsghdr.html" title="Netlink message header.">nlmsghdr</a> +----------+- - -+-------------+- - -+-------- - - <a class="code" href="group__msg.html#gae44a904bb40c8b5f5ff31539c21cfa5a" title="head of message payload">nlmsg_data</a>(nlh)---^ ^ <a class="code" href="group__msg.html#gafae8cbad57755ac6d758f6073cb22134" title="next netlink message in message stream">nlmsg_next</a>(nlh)-----------------------+ </pre></div> </dd></dl> <dl class="user"><dt><b></b></dt><dd>The payload may consist of arbitary data but may have strict alignment and formatting rules depening on the specific netlink families. </dd></dl> <dl class="user"><dt><b></b></dt><dd><div class="fragment"><pre class="fragment"> <---------------------- <a class="code" href="group__msg.html#gafa0898e9ec7d59a8faa1e4f0ed3168bf" title="length of message payload">nlmsg_len</a>(nlh) ---------------------> <------ hdrlen ------> <- <a class="code" href="group__msg.html#gac9a4689d22aaa2f630476a7826f25fec" title="length of attributes data">nlmsg_attrlen</a>(nlh, hdrlen) -> +----------------------+- - -+--------------------------------+ | Family Header | Pad | Attributes | +----------------------+- - -+--------------------------------+ <a class="code" href="group__msg.html#ga203fdf0a4637e05df44de94c60d8e909" title="head of attributes data">nlmsg_attrdata</a>(nlh, hdrlen)---^ </pre></div> </dd></dl> <dl class="user"><dt><b>The ACK Netlink Message</b></dt><dd>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. <div class="fragment"><pre class="fragment"> 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 = <a class="code" href="group__msg.html#ga2d6d3c937fdda1d64201c5abfd5a2b83" title="The message signals an error and the payload contains a nlmsgerr structure.">NLMSG_ERROR</a> | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Error code | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | OLD Netlink message header | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ </pre></div></dd></dl> <dl class="user"><dt><b>Example</b></dt><dd><div class="fragment"><pre class="fragment"> <span class="comment">// Various methods exist to create/allocate a new netlink</span> <span class="comment">// message. </span> <span class="comment">//</span> <span class="comment">// nlmsg_alloc() will allocate an empty netlink message with</span> <span class="comment">// a maximum payload size which defaults to the page size of</span> <span class="comment">// the system. This default size can be modified using the</span> <span class="comment">// function nlmsg_set_default_size().</span> <span class="keyword">struct </span>nl_msg *msg = <a class="code" href="group__msg.html#ga89c936bdf5e73455bb1640a0eb8a020d" title="Allocate a new netlink message with the default maximum payload size.">nlmsg_alloc</a>(); <span class="comment">// Very often, the message type and message flags are known</span> <span class="comment">// at allocation time while the other fields are auto generated:</span> <span class="keyword">struct </span>nl_msg *msg = <a class="code" href="group__msg.html#ga580d8697d19050c55060bc10ab4eae9f" title="Allocate a new netlink message.">nlmsg_alloc_simple</a>(MY_TYPE, MY_FLAGS); <span class="comment">// Alternatively an existing netlink message header can be used</span> <span class="comment">// to inherit the header values:</span> <span class="keyword">struct </span><a class="code" href="structnlmsghdr.html" title="Netlink message header.">nlmsghdr</a> hdr = { .<a class="code" href="structnlmsghdr.html#a7232c4e6cb513010e64887b7eebf8823" title="Message type (content type)">nlmsg_type</a> = MY_TYPE, .nlmsg_flags = MY_FLAGS, }; <span class="keyword">struct </span>nl_msg *msg = <a class="code" href="group__msg.html#gab89e1b4e969a091fed4ef851f3339756" title="Allocate a new netlink message and inherit netlink message header.">nlmsg_inherit</a>(&hdr); <span class="comment">// Last but not least, netlink messages received from netlink sockets</span> <span class="comment">// can be converted into nl_msg objects using nlmsg_convert(). This</span> <span class="comment">// will create a message with a maximum payload size which equals the</span> <span class="comment">// length of the existing netlink message, therefore no more data can</span> <span class="comment">// be appened without calling nlmsg_expand() first.</span> <span class="keyword">struct </span>nl_msg *msg = <a class="code" href="group__msg.html#ga2695036495d7127e610bc99fee5c9674" title="Convert a netlink message received from a netlink socket to a nl_msg.">nlmsg_convert</a>(nlh_from_nl_sock); <span class="comment">// Payload may be added to the message via nlmsg_append(). The fourth</span> <span class="comment">// parameter specifies the number of alignment bytes the data should</span> <span class="comment">// be padding with at the end. Common values are 0 to disable it or</span> <span class="comment">// NLMSG_ALIGNTO to ensure proper netlink message padding.</span> <a class="code" href="group__msg.html#gacc5e5ade5675d041f86c7c8693f7088d" title="Append data to tail of a netlink message.">nlmsg_append</a>(msg, &mydata, <span class="keyword">sizeof</span>(mydata), 0); <span class="comment">// Sometimes it may be necessary to reserve room for data but defer</span> <span class="comment">// the actual copying to a later point, nlmsg_reserve() can be used</span> <span class="comment">// for this purpose:</span> <span class="keywordtype">void</span> *data = <a class="code" href="group__msg.html#ga206eac17e0e75ae8457a513612395554" title="Reserve room for additional data in a netlink message.">nlmsg_reserve</a>(msg, <span class="keyword">sizeof</span>(mydata), NLMSG_ALIGNTO); <span class="comment">// Attributes may be added using the attributes interface.</span> <span class="comment">// After successful use of the message, the memory must be freed</span> <span class="comment">// using nlmsg_free()</span> <a class="code" href="group__msg.html#ga138ba9bee70553f9fbe7143deacad48c" title="Free a netlink message.">nlmsg_free</a>(msg); </pre></div></dd></dl> <dl class="user"><dt><b>4) Parsing messages</b></dt><dd><div class="fragment"><pre class="fragment"> <span class="keywordtype">int</span> n; <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buf; <span class="keyword">struct </span><a class="code" href="structnlmsghdr.html" title="Netlink message header.">nlmsghdr</a> *hdr; n = <a class="code" href="group__nl.html#ga060acc8371fdb242c5ae3d5b761d28e1" title="Receive data from netlink socket.">nl_recv</a>(handle, NULL, &buf); hdr = (<span class="keyword">struct </span><a class="code" href="structnlmsghdr.html" title="Netlink message header.">nlmsghdr</a> *) buf; <span class="keywordflow">while</span> (<a class="code" href="group__msg.html#ga0107484894e5be506c1e1bb6cb09dbe2" title="check if the netlink message fits into the remaining bytes">nlmsg_ok</a>(hdr, n)) { <span class="comment">// Process message here...</span> hdr = <a class="code" href="group__msg.html#gafae8cbad57755ac6d758f6073cb22134" title="next netlink message in message stream">nlmsg_next</a>(hdr, &n); } </pre></div> </dd></dl> <hr/><h2>Define Documentation</h2> <a class="anchor" id="gaf1a05ed4b58b0d3a0409f2a749e0c91c"></a><!-- doxytag: member="msg.h::NL_AUTO_PID" ref="gaf1a05ed4b58b0d3a0409f2a749e0c91c" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">#define NL_AUTO_PID   0</td> </tr> </table> </div> <div class="memdoc"> <dl class="note"><dt><b>Note:</b></dt><dd>Requires the use of <a class="el" href="group__nl.html#ga01a2aad82350f867e704d5c696438b60" title="Send netlink message and check & extend header values as needed.">nl_send_auto_complete()</a>! </dd></dl> <p>Definition at line <a class="el" href="msg_8h_source.html#l00032">32</a> of file <a class="el" href="msg_8h_source.html">msg.h</a>.</p> </div> </div> <a class="anchor" id="gaca80a9f4084020b28afdb663b670dc4b"></a><!-- doxytag: member="msg.h::NL_AUTO_SEQ" ref="gaca80a9f4084020b28afdb663b670dc4b" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">#define NL_AUTO_SEQ   0</td> </tr> </table> </div> <div class="memdoc"> <dl class="note"><dt><b>Note:</b></dt><dd>Requires the use of <a class="el" href="group__nl.html#ga01a2aad82350f867e704d5c696438b60" title="Send netlink message and check & extend header values as needed.">nl_send_auto_complete()</a>! </dd></dl> <p>Definition at line <a class="el" href="msg_8h_source.html#l00041">41</a> of file <a class="el" href="msg_8h_source.html">msg.h</a>.</p> </div> </div> <a class="anchor" id="ga8db9e6499b50ccdc5f7574940c4b1adf"></a><!-- doxytag: member="msg.h::nlmsg_for_each_attr" ref="ga8db9e6499b50ccdc5f7574940c4b1adf" args="(pos, nlh, hdrlen, rem)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">#define nlmsg_for_each_attr</td> <td>(</td> <td class="paramtype"> </td> <td class="paramname">pos, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype"> </td> <td class="paramname">nlh, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype"> </td> <td class="paramname">hdrlen, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype"> </td> <td class="paramname">rem </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div> <div class="memdoc"> <b>Value:</b><div class="fragment"><pre class="fragment"><a class="code" href="group__attr.html#ga7a262955c3fb8eab3158bd07180fbc2c" title="iterate over a stream of attributes">nla_for_each_attr</a>(pos, <a class="code" href="group__msg.html#ga203fdf0a4637e05df44de94c60d8e909" title="head of attributes data">nlmsg_attrdata</a>(nlh, hdrlen), \ <a class="code" href="group__msg.html#gac9a4689d22aaa2f630476a7826f25fec" title="length of attributes data">nlmsg_attrlen</a>(nlh, hdrlen), rem) </pre></div><dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">pos</td><td>loop counter, set to current attribute </td></tr> <tr><td class="paramname">nlh</td><td>netlink message header </td></tr> <tr><td class="paramname">hdrlen</td><td>length of family header </td></tr> <tr><td class="paramname">rem</td><td>initialized to len, holds bytes currently remaining in stream </td></tr> </table> </dd> </dl> <p>Definition at line <a class="el" href="msg_8h_source.html#l00126">126</a> of file <a class="el" href="msg_8h_source.html">msg.h</a>.</p> </div> </div> <a class="anchor" id="gab6cf94a06c492911e6be789ff5a3deb4"></a><!-- doxytag: member="msg.h::nlmsg_for_each_msg" ref="gab6cf94a06c492911e6be789ff5a3deb4" args="(pos, head, len, rem)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">#define nlmsg_for_each_msg</td> <td>(</td> <td class="paramtype"> </td> <td class="paramname">pos, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype"> </td> <td class="paramname">head, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype"> </td> <td class="paramname">len, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype"> </td> <td class="paramname">rem </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div> <div class="memdoc"> <b>Value:</b><div class="fragment"><pre class="fragment"><span class="keywordflow">for</span> (pos = head, rem = len; \ <a class="code" href="group__msg.html#ga0107484894e5be506c1e1bb6cb09dbe2" title="check if the netlink message fits into the remaining bytes">nlmsg_ok</a>(pos, rem); \ pos = <a class="code" href="group__msg.html#gafae8cbad57755ac6d758f6073cb22134" title="next netlink message in message stream">nlmsg_next</a>(pos, &(rem))) </pre></div><dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">pos</td><td>loop counter, set to current message </td></tr> <tr><td class="paramname">head</td><td>head of message stream </td></tr> <tr><td class="paramname">len</td><td>length of message stream </td></tr> <tr><td class="paramname">rem</td><td>initialized to len, holds bytes currently remaining in stream </td></tr> </table> </dd> </dl> <p>Definition at line <a class="el" href="msg_8h_source.html#l00137">137</a> of file <a class="el" href="msg_8h_source.html">msg.h</a>.</p> </div> </div> <a class="anchor" id="gaa5a74825940c1ee06bbe5bb808815873"></a><!-- doxytag: member="netlink-kernel.h::NLM_F_ATOMIC" ref="gaa5a74825940c1ee06bbe5bb808815873" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">#define NLM_F_ATOMIC   0x400</td> </tr> </table> </div> <div class="memdoc"> <p>This may require special privileges because it has the potential to interrupt service in the FE for a longer time. </p> <p>Definition at line <a class="el" href="netlink-kernel_8h_source.html#l00106">106</a> of file <a class="el" href="netlink-kernel_8h_source.html">netlink-kernel.h</a>.</p> </div> </div> <a class="anchor" id="ga2d6d3c937fdda1d64201c5abfd5a2b83"></a><!-- doxytag: member="netlink-kernel.h::NLMSG_ERROR" ref="ga2d6d3c937fdda1d64201c5abfd5a2b83" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">#define NLMSG_ERROR   0x2</td> </tr> </table> </div> <div class="memdoc"> <p>This can be looked at as a NACK and typically it is from FEC to CPC. </p> <p>Definition at line <a class="el" href="netlink-kernel_8h_source.html#l00159">159</a> of file <a class="el" href="netlink-kernel_8h_source.html">netlink-kernel.h</a>.</p> </div> </div> <hr/><h2>Function Documentation</h2> <a class="anchor" id="ga3790ddfe9268d3b63f3cd1ceb9bb2f83"></a><!-- doxytag: member="msg.c::nlmsg_msg_size" ref="ga3790ddfe9268d3b63f3cd1ceb9bb2f83" args="(int payload)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int nlmsg_msg_size </td> <td>(</td> <td class="paramtype">int </td> <td class="paramname"><em>payload</em></td><td>)</td> <td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">payload</td><td>length of message payload </td></tr> </table> </dd> </dl> <p>Definition at line <a class="el" href="msg_8c_source.html#l00184">184</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>Referenced by <a class="el" href="msg_8c_source.html#l00947">nl_msg_dump()</a>, <a class="el" href="msg_8c_source.html#l00202">nlmsg_padlen()</a>, and <a class="el" href="msg_8c_source.html#l00193">nlmsg_total_size()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordflow">return</span> NLMSG_HDRLEN + payload; } </pre></div> </div> </div> <a class="anchor" id="ga0734c5b291e451c26051ad3b6ef083bd"></a><!-- doxytag: member="msg.c::nlmsg_total_size" ref="ga0734c5b291e451c26051ad3b6ef083bd" args="(int payload)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int nlmsg_total_size </td> <td>(</td> <td class="paramtype">int </td> <td class="paramname"><em>payload</em></td><td>)</td> <td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">payload</td><td>length of message payload </td></tr> </table> </dd> </dl> <p>Definition at line <a class="el" href="msg_8c_source.html#l00193">193</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>References <a class="el" href="msg_8c_source.html#l00184">nlmsg_msg_size()</a>.</p> <p>Referenced by <a class="el" href="msg_8c_source.html#l00202">nlmsg_padlen()</a>, and <a class="el" href="msg_8c_source.html#l00467">nlmsg_set_default_size()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordflow">return</span> NLMSG_ALIGN(<a class="code" href="group__msg.html#ga3790ddfe9268d3b63f3cd1ceb9bb2f83" title="length of netlink message not including padding">nlmsg_msg_size</a>(payload)); } </pre></div> </div> </div> <a class="anchor" id="gad47e979aa22aca4b8eb1c90234dea678"></a><!-- doxytag: member="msg.c::nlmsg_padlen" ref="gad47e979aa22aca4b8eb1c90234dea678" args="(int payload)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int nlmsg_padlen </td> <td>(</td> <td class="paramtype">int </td> <td class="paramname"><em>payload</em></td><td>)</td> <td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">payload</td><td>length of message payload </td></tr> </table> </dd> </dl> <p>Definition at line <a class="el" href="msg_8c_source.html#l00202">202</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>References <a class="el" href="msg_8c_source.html#l00184">nlmsg_msg_size()</a>, and <a class="el" href="msg_8c_source.html#l00193">nlmsg_total_size()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordflow">return</span> <a class="code" href="group__msg.html#ga0734c5b291e451c26051ad3b6ef083bd" title="length of netlink message including padding">nlmsg_total_size</a>(payload) - <a class="code" href="group__msg.html#ga3790ddfe9268d3b63f3cd1ceb9bb2f83" title="length of netlink message not including padding">nlmsg_msg_size</a>(payload); } </pre></div> </div> </div> <a class="anchor" id="gae44a904bb40c8b5f5ff31539c21cfa5a"></a><!-- doxytag: member="msg.c::nlmsg_data" ref="gae44a904bb40c8b5f5ff31539c21cfa5a" args="(const struct nlmsghdr *nlh)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">void* nlmsg_data </td> <td>(</td> <td class="paramtype">const struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> * </td> <td class="paramname"><em>nlh</em></td><td>)</td> <td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">nlh</td><td>netlink messsage header </td></tr> </table> </dd> </dl> <p>Definition at line <a class="el" href="msg_8c_source.html#l00218">218</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>Referenced by <a class="el" href="genl_8c_source.html#l00247">genlmsg_put()</a>, <a class="el" href="nfnl_8c_source.html#l00150">nfnlmsg_family()</a>, <a class="el" href="nfnl_8c_source.html#l00161">nfnlmsg_res_id()</a>, <a class="el" href="msg_8c_source.html#l00947">nl_msg_dump()</a>, <a class="el" href="attr_8c_source.html#l00512">nla_put()</a>, <a class="el" href="attr_8c_source.html#l00536">nla_put_nested()</a>, <a class="el" href="attr_8c_source.html#l00475">nla_reserve()</a>, and <a class="el" href="msg_8c_source.html#l00249">nlmsg_attrdata()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordflow">return</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) nlh + NLMSG_HDRLEN; } </pre></div> </div> </div> <a class="anchor" id="gafa0898e9ec7d59a8faa1e4f0ed3168bf"></a><!-- doxytag: member="msg.c::nlmsg_len" ref="gafa0898e9ec7d59a8faa1e4f0ed3168bf" args="(const struct nlmsghdr *nlh)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int nlmsg_len </td> <td>(</td> <td class="paramtype">const struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> * </td> <td class="paramname"><em>nlh</em></td><td>)</td> <td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">nlh</td><td>netlink message header </td></tr> </table> </dd> </dl> <p>Definition at line <a class="el" href="msg_8c_source.html#l00232">232</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>References <a class="el" href="netlink-kernel_8h_source.html#l00032">nlmsghdr::nlmsg_len</a>.</p> <p>Referenced by <a class="el" href="msg_8c_source.html#l00947">nl_msg_dump()</a>, <a class="el" href="attr_8c_source.html#l00536">nla_put_nested()</a>, <a class="el" href="msg_8c_source.html#l00260">nlmsg_attrlen()</a>, and <a class="el" href="msg_8c_source.html#l00512">nlmsg_reserve()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordflow">return</span> nlh-><a class="code" href="structnlmsghdr.html#a5a3fdb3436743ec73e75471c899fd4bc" title="Length of message including header.">nlmsg_len</a> - NLMSG_HDRLEN; } </pre></div> </div> </div> <a class="anchor" id="ga203fdf0a4637e05df44de94c60d8e909"></a><!-- doxytag: member="msg.c::nlmsg_attrdata" ref="ga203fdf0a4637e05df44de94c60d8e909" args="(const struct nlmsghdr *nlh, int hdrlen)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">struct nlattr* nlmsg_attrdata </td> <td>(</td> <td class="paramtype">const struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> * </td> <td class="paramname"><em>nlh</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>hdrlen</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td><code> [read]</code></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">nlh</td><td>netlink message header </td></tr> <tr><td class="paramname">hdrlen</td><td>length of family specific header </td></tr> </table> </dd> </dl> <p>Definition at line <a class="el" href="msg_8c_source.html#l00249">249</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>References <a class="el" href="msg_8c_source.html#l00218">nlmsg_data()</a>.</p> <p>Referenced by <a class="el" href="msg_8c_source.html#l00947">nl_msg_dump()</a>, <a class="el" href="msg_8c_source.html#l00337">nlmsg_find_attr()</a>, <a class="el" href="msg_8c_source.html#l00319">nlmsg_parse()</a>, and <a class="el" href="msg_8c_source.html#l00350">nlmsg_validate()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *data = <a class="code" href="group__msg.html#gae44a904bb40c8b5f5ff31539c21cfa5a" title="head of message payload">nlmsg_data</a>(nlh); <span class="keywordflow">return</span> (<span class="keyword">struct</span> nlattr *) (data + NLMSG_ALIGN(hdrlen)); } </pre></div> </div> </div> <a class="anchor" id="gac9a4689d22aaa2f630476a7826f25fec"></a><!-- doxytag: member="msg.c::nlmsg_attrlen" ref="gac9a4689d22aaa2f630476a7826f25fec" args="(const struct nlmsghdr *nlh, int hdrlen)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int nlmsg_attrlen </td> <td>(</td> <td class="paramtype">const struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> * </td> <td class="paramname"><em>nlh</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>hdrlen</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">nlh</td><td>netlink message header </td></tr> <tr><td class="paramname">hdrlen</td><td>length of family specific header </td></tr> </table> </dd> </dl> <p>Definition at line <a class="el" href="msg_8c_source.html#l00260">260</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>References <a class="el" href="msg_8c_source.html#l00232">nlmsg_len()</a>.</p> <p>Referenced by <a class="el" href="msg_8c_source.html#l00947">nl_msg_dump()</a>, <a class="el" href="msg_8c_source.html#l00337">nlmsg_find_attr()</a>, <a class="el" href="msg_8c_source.html#l00319">nlmsg_parse()</a>, and <a class="el" href="msg_8c_source.html#l00350">nlmsg_validate()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordflow">return</span> <a class="code" href="group__msg.html#gafa0898e9ec7d59a8faa1e4f0ed3168bf" title="length of message payload">nlmsg_len</a>(nlh) - NLMSG_ALIGN(hdrlen); } </pre></div> </div> </div> <a class="anchor" id="ga0107484894e5be506c1e1bb6cb09dbe2"></a><!-- doxytag: member="msg.c::nlmsg_ok" ref="ga0107484894e5be506c1e1bb6cb09dbe2" args="(const struct nlmsghdr *nlh, int remaining)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int nlmsg_ok </td> <td>(</td> <td class="paramtype">const struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> * </td> <td class="paramname"><em>nlh</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>remaining</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">nlh</td><td>netlink message header </td></tr> <tr><td class="paramname">remaining</td><td>number of bytes remaining in message stream </td></tr> </table> </dd> </dl> <p>Definition at line <a class="el" href="msg_8c_source.html#l00285">285</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>References <a class="el" href="netlink-kernel_8h_source.html#l00032">nlmsghdr::nlmsg_len</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordflow">return</span> (remaining >= <span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structnlmsghdr.html" title="Netlink message header.">nlmsghdr</a>) && nlh-><a class="code" href="structnlmsghdr.html#a5a3fdb3436743ec73e75471c899fd4bc" title="Length of message including header.">nlmsg_len</a> >= <span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structnlmsghdr.html" title="Netlink message header.">nlmsghdr</a>) && nlh-><a class="code" href="structnlmsghdr.html#a5a3fdb3436743ec73e75471c899fd4bc" title="Length of message including header.">nlmsg_len</a> <= remaining); } </pre></div> </div> </div> <a class="anchor" id="gafae8cbad57755ac6d758f6073cb22134"></a><!-- doxytag: member="msg.c::nlmsg_next" ref="gafae8cbad57755ac6d758f6073cb22134" args="(struct nlmsghdr *nlh, int *remaining)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a>* nlmsg_next </td> <td>(</td> <td class="paramtype">struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> * </td> <td class="paramname"><em>nlh</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int * </td> <td class="paramname"><em>remaining</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td><code> [read]</code></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">nlh</td><td>netlink message header </td></tr> <tr><td class="paramname">remaining</td><td>number of bytes remaining in message stream</td></tr> </table> </dd> </dl> <dl class="return"><dt><b>Returns:</b></dt><dd>the next netlink message in the message stream and decrements remaining by the size of the current message. </dd></dl> <p>Definition at line <a class="el" href="msg_8c_source.html#l00300">300</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>References <a class="el" href="netlink-kernel_8h_source.html#l00032">nlmsghdr::nlmsg_len</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordtype">int</span> totlen = NLMSG_ALIGN(nlh-><a class="code" href="structnlmsghdr.html#a5a3fdb3436743ec73e75471c899fd4bc" title="Length of message including header.">nlmsg_len</a>); *remaining -= totlen; <span class="keywordflow">return</span> (<span class="keyword">struct</span> <a class="code" href="structnlmsghdr.html" title="Netlink message header.">nlmsghdr</a> *) ((<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) nlh + totlen); } </pre></div> </div> </div> <a class="anchor" id="ga2671eefe95c3e44dec8ddab51ae57593"></a><!-- doxytag: member="msg.c::nlmsg_parse" ref="ga2671eefe95c3e44dec8ddab51ae57593" args="(struct nlmsghdr *nlh, int hdrlen, struct nlattr *tb[], int maxtype, struct nla_policy *policy)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int nlmsg_parse </td> <td>(</td> <td class="paramtype">struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> * </td> <td class="paramname"><em>nlh</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>hdrlen</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">struct nlattr * </td> <td class="paramname"><em>tb</em>[], </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>maxtype</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">struct <a class="el" href="structnla__policy.html">nla_policy</a> * </td> <td class="paramname"><em>policy</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">nlh</td><td>netlink message header </td></tr> <tr><td class="paramname">hdrlen</td><td>length of family specific header </td></tr> <tr><td class="paramname">tb</td><td>destination array with maxtype+1 elements </td></tr> <tr><td class="paramname">maxtype</td><td>maximum attribute type to be expected </td></tr> <tr><td class="paramname">policy</td><td>validation policy</td></tr> </table> </dd> </dl> <p>See <a class="el" href="group__attr.html#gaa7ad544b5a93034602a442eb26cda92c" title="Parse a stream of attributes into a tb buffer.">nla_parse()</a> </p> <p>Definition at line <a class="el" href="msg_8c_source.html#l00319">319</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>References <a class="el" href="attr_8c_source.html#l00262">nla_parse()</a>, <a class="el" href="msg_8c_source.html#l00249">nlmsg_attrdata()</a>, and <a class="el" href="msg_8c_source.html#l00260">nlmsg_attrlen()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordflow">if</span> (!nlmsg_valid_hdr(nlh, hdrlen)) <span class="keywordflow">return</span> nl_errno(EINVAL); <span class="keywordflow">return</span> <a class="code" href="group__attr.html#gaa7ad544b5a93034602a442eb26cda92c" title="Parse a stream of attributes into a tb buffer.">nla_parse</a>(tb, maxtype, <a class="code" href="group__msg.html#ga203fdf0a4637e05df44de94c60d8e909" title="head of attributes data">nlmsg_attrdata</a>(nlh, hdrlen), <a class="code" href="group__msg.html#gac9a4689d22aaa2f630476a7826f25fec" title="length of attributes data">nlmsg_attrlen</a>(nlh, hdrlen), policy); } </pre></div> </div> </div> <a class="anchor" id="gafd0b61236f262b7cc720b1edd01458b4"></a><!-- doxytag: member="msg.c::nlmsg_find_attr" ref="gafd0b61236f262b7cc720b1edd01458b4" args="(struct nlmsghdr *nlh, int hdrlen, int attrtype)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">struct nlattr* nlmsg_find_attr </td> <td>(</td> <td class="paramtype">struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> * </td> <td class="paramname"><em>nlh</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>hdrlen</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>attrtype</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td><code> [read]</code></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">nlh</td><td>netlink message header </td></tr> <tr><td class="paramname">hdrlen</td><td>length of familiy specific header </td></tr> <tr><td class="paramname">attrtype</td><td>type of attribute to look for</td></tr> </table> </dd> </dl> <p>Returns the first attribute which matches the specified type. </p> <p>Definition at line <a class="el" href="msg_8c_source.html#l00337">337</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>References <a class="el" href="attr_8c_source.html#l00353">nla_find()</a>, <a class="el" href="msg_8c_source.html#l00249">nlmsg_attrdata()</a>, and <a class="el" href="msg_8c_source.html#l00260">nlmsg_attrlen()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordflow">return</span> <a class="code" href="group__attr.html#ga2e98df8c30030aebcfd1eebf11bbb22a" title="Find a specific attribute in a stream of attributes.">nla_find</a>(<a class="code" href="group__msg.html#ga203fdf0a4637e05df44de94c60d8e909" title="head of attributes data">nlmsg_attrdata</a>(nlh, hdrlen), <a class="code" href="group__msg.html#gac9a4689d22aaa2f630476a7826f25fec" title="length of attributes data">nlmsg_attrlen</a>(nlh, hdrlen), attrtype); } </pre></div> </div> </div> <a class="anchor" id="gac488c8e2fcaefe96cadd33ebdc4a922f"></a><!-- doxytag: member="msg.c::nlmsg_validate" ref="gac488c8e2fcaefe96cadd33ebdc4a922f" args="(struct nlmsghdr *nlh, int hdrlen, int maxtype, struct nla_policy *policy)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int nlmsg_validate </td> <td>(</td> <td class="paramtype">struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> * </td> <td class="paramname"><em>nlh</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>hdrlen</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>maxtype</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">struct <a class="el" href="structnla__policy.html">nla_policy</a> * </td> <td class="paramname"><em>policy</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">nlh</td><td>netlinket message header </td></tr> <tr><td class="paramname">hdrlen</td><td>length of familiy specific header </td></tr> <tr><td class="paramname">maxtype</td><td>maximum attribute type to be expected </td></tr> <tr><td class="paramname">policy</td><td>validation policy </td></tr> </table> </dd> </dl> <p>Definition at line <a class="el" href="msg_8c_source.html#l00350">350</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>References <a class="el" href="attr_8c_source.html#l00328">nla_validate()</a>, <a class="el" href="msg_8c_source.html#l00249">nlmsg_attrdata()</a>, and <a class="el" href="msg_8c_source.html#l00260">nlmsg_attrlen()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordflow">if</span> (!nlmsg_valid_hdr(nlh, hdrlen)) <span class="keywordflow">return</span> nl_errno(EINVAL); <span class="keywordflow">return</span> <a class="code" href="group__attr.html#ga5d8d5930b012e61c8d8e4ba6b3038c36" title="Validate a stream of attributes.">nla_validate</a>(<a class="code" href="group__msg.html#ga203fdf0a4637e05df44de94c60d8e909" title="head of attributes data">nlmsg_attrdata</a>(nlh, hdrlen), <a class="code" href="group__msg.html#gac9a4689d22aaa2f630476a7826f25fec" title="length of attributes data">nlmsg_attrlen</a>(nlh, hdrlen), maxtype, policy); } </pre></div> </div> </div> <a class="anchor" id="ga89c936bdf5e73455bb1640a0eb8a020d"></a><!-- doxytag: member="msg.c::nlmsg_alloc" ref="ga89c936bdf5e73455bb1640a0eb8a020d" args="(void)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">struct nl_msg* nlmsg_alloc </td> <td>(</td> <td class="paramtype">void </td> <td class="paramname"></td><td>)</td> <td><code> [read]</code></td> </tr> </table> </div> <div class="memdoc"> <p>Allocates a new netlink message without any further payload. The maximum payload size defaults to PAGESIZE or as otherwise specified with <a class="el" href="group__msg.html#gaca38cf7b85baa19aad3cf33eff7e7a85" title="Set the default maximum message payload size for allocated messages.">nlmsg_set_default_size()</a>.</p> <dl class="return"><dt><b>Returns:</b></dt><dd>Newly allocated netlink message or NULL. </dd></dl> <p>Definition at line <a class="el" href="msg_8c_source.html#l00401">401</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>Referenced by <a class="el" href="msg_8c_source.html#l00424">nlmsg_inherit()</a>, and <a class="el" href="neightbl_8c_source.html#l00478">rtnl_neightbl_build_change_request()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordflow">return</span> __nlmsg_alloc(default_msg_size); } </pre></div> </div> </div> <a class="anchor" id="gab89e1b4e969a091fed4ef851f3339756"></a><!-- doxytag: member="msg.c::nlmsg_inherit" ref="gab89e1b4e969a091fed4ef851f3339756" args="(struct nlmsghdr *hdr)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">struct nl_msg* nlmsg_inherit </td> <td>(</td> <td class="paramtype">struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> * </td> <td class="paramname"><em>hdr</em></td><td>)</td> <td><code> [read]</code></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">hdr</td><td>Netlink message header template</td></tr> </table> </dd> </dl> <p>Allocates a new netlink message and inherits the original message header. If <em>hdr</em> is not NULL it will be used as a template for the netlink message header, otherwise the header is left blank.</p> <dl class="return"><dt><b>Returns:</b></dt><dd>Newly allocated netlink message or NULL </dd></dl> <p>Definition at line <a class="el" href="msg_8c_source.html#l00424">424</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>References <a class="el" href="msg_8c_source.html#l00401">nlmsg_alloc()</a>, <a class="el" href="netlink-kernel_8h_source.html#l00042">nlmsghdr::nlmsg_flags</a>, <a class="el" href="netlink-kernel_8h_source.html#l00052">nlmsghdr::nlmsg_pid</a>, <a class="el" href="netlink-kernel_8h_source.html#l00047">nlmsghdr::nlmsg_seq</a>, and <a class="el" href="netlink-kernel_8h_source.html#l00037">nlmsghdr::nlmsg_type</a>.</p> <p>Referenced by <a class="el" href="msg_8c_source.html#l00947">nl_msg_dump()</a>, and <a class="el" href="msg_8c_source.html#l00448">nlmsg_alloc_simple()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keyword">struct </span>nl_msg *nm; nm = <a class="code" href="group__msg.html#ga89c936bdf5e73455bb1640a0eb8a020d" title="Allocate a new netlink message with the default maximum payload size.">nlmsg_alloc</a>(); <span class="keywordflow">if</span> (nm && hdr) { <span class="keyword">struct </span><a class="code" href="structnlmsghdr.html" title="Netlink message header.">nlmsghdr</a> *<span class="keyword">new</span> = nm->nm_nlh; <span class="keyword">new</span>-><a class="code" href="structnlmsghdr.html#a7232c4e6cb513010e64887b7eebf8823" title="Message type (content type)">nlmsg_type</a> = hdr-><a class="code" href="structnlmsghdr.html#a7232c4e6cb513010e64887b7eebf8823" title="Message type (content type)">nlmsg_type</a>; <span class="keyword">new</span>->nlmsg_flags = hdr-><a class="code" href="structnlmsghdr.html#abcf664d354ea35ebb9b3d8a50088fec6" title="Message flags.">nlmsg_flags</a>; <span class="keyword">new</span>->nlmsg_seq = hdr-><a class="code" href="structnlmsghdr.html#ad6c6a7aa9de65bb2da498c84148be7e6" title="Sequence number.">nlmsg_seq</a>; <span class="keyword">new</span>->nlmsg_pid = hdr-><a class="code" href="structnlmsghdr.html#a071903f5e2400298bca69ac70500421f" title="Netlink PID of the proccess sending the message.">nlmsg_pid</a>; } <span class="keywordflow">return</span> nm; } </pre></div> </div> </div> <a class="anchor" id="ga580d8697d19050c55060bc10ab4eae9f"></a><!-- doxytag: member="msg.c::nlmsg_alloc_simple" ref="ga580d8697d19050c55060bc10ab4eae9f" args="(int nlmsgtype, int flags)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">struct nl_msg* nlmsg_alloc_simple </td> <td>(</td> <td class="paramtype">int </td> <td class="paramname"><em>nlmsgtype</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>flags</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td><code> [read]</code></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">nlmsgtype</td><td>Netlink message type </td></tr> <tr><td class="paramname">flags</td><td>Message flags.</td></tr> </table> </dd> </dl> <dl class="return"><dt><b>Returns:</b></dt><dd>Newly allocated netlink message or NULL. </dd></dl> <p>Definition at line <a class="el" href="msg_8c_source.html#l00448">448</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>References <a class="el" href="msg_8c_source.html#l00424">nlmsg_inherit()</a>, and <a class="el" href="netlink-kernel_8h_source.html#l00037">nlmsghdr::nlmsg_type</a>.</p> <p>Referenced by <a class="el" href="lookup_8c_source.html#l00212">flnl_lookup_build_request()</a>, <a class="el" href="nfnl_8c_source.html#l00201">nfnlmsg_alloc_simple()</a>, <a class="el" href="nl_8c_source.html#l00410">nl_send_simple()</a>, <a class="el" href="link_8c_source.html#l00965">rtnl_link_build_change_request()</a>, <a class="el" href="neightbl_8c_source.html#l00478">rtnl_neightbl_build_change_request()</a>, and <a class="el" href="qdisc_8c_source.html#l00315">rtnl_qdisc_build_delete_request()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keyword">struct </span>nl_msg *msg; <span class="keyword">struct </span><a class="code" href="structnlmsghdr.html" title="Netlink message header.">nlmsghdr</a> nlh = { .<a class="code" href="structnlmsghdr.html#a7232c4e6cb513010e64887b7eebf8823" title="Message type (content type)">nlmsg_type</a> = nlmsgtype, .nlmsg_flags = flags, }; msg = <a class="code" href="group__msg.html#gab89e1b4e969a091fed4ef851f3339756" title="Allocate a new netlink message and inherit netlink message header.">nlmsg_inherit</a>(&nlh); <span class="keywordflow">if</span> (msg) NL_DBG(2, <span class="stringliteral">"msg %p: Allocated new simple message\n"</span>, msg); <span class="keywordflow">return</span> msg; } </pre></div> </div> </div> <a class="anchor" id="gaca38cf7b85baa19aad3cf33eff7e7a85"></a><!-- doxytag: member="msg.c::nlmsg_set_default_size" ref="gaca38cf7b85baa19aad3cf33eff7e7a85" args="(size_t max)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">void nlmsg_set_default_size </td> <td>(</td> <td class="paramtype">size_t </td> <td class="paramname"><em>max</em></td><td>)</td> <td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">max</td><td>Size of payload in bytes. </td></tr> </table> </dd> </dl> <p>Definition at line <a class="el" href="msg_8c_source.html#l00467">467</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>References <a class="el" href="msg_8c_source.html#l00193">nlmsg_total_size()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordflow">if</span> (max < <a class="code" href="group__msg.html#ga0734c5b291e451c26051ad3b6ef083bd" title="length of netlink message including padding">nlmsg_total_size</a>(0)) max = <a class="code" href="group__msg.html#ga0734c5b291e451c26051ad3b6ef083bd" title="length of netlink message including padding">nlmsg_total_size</a>(0); default_msg_size = max; } </pre></div> </div> </div> <a class="anchor" id="ga2695036495d7127e610bc99fee5c9674"></a><!-- doxytag: member="msg.c::nlmsg_convert" ref="ga2695036495d7127e610bc99fee5c9674" args="(struct nlmsghdr *hdr)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">struct nl_msg* nlmsg_convert </td> <td>(</td> <td class="paramtype">struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> * </td> <td class="paramname"><em>hdr</em></td><td>)</td> <td><code> [read]</code></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">hdr</td><td>Netlink message received from netlink socket.</td></tr> </table> </dd> </dl> <p>Allocates a new netlink message and copies all of the data pointed to by <em>hdr</em> into the new message object.</p> <dl class="return"><dt><b>Returns:</b></dt><dd>Newly allocated netlink message or NULL. </dd></dl> <p>Definition at line <a class="el" href="msg_8c_source.html#l00484">484</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>References <a class="el" href="msg_8c_source.html#l00656">nlmsg_free()</a>, and <a class="el" href="netlink-kernel_8h_source.html#l00032">nlmsghdr::nlmsg_len</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keyword">struct </span>nl_msg *nm; nm = __nlmsg_alloc(NLMSG_ALIGN(hdr-><a class="code" href="structnlmsghdr.html#a5a3fdb3436743ec73e75471c899fd4bc" title="Length of message including header.">nlmsg_len</a>)); <span class="keywordflow">if</span> (!nm) <span class="keywordflow">goto</span> errout; memcpy(nm->nm_nlh, hdr, hdr-><a class="code" href="structnlmsghdr.html#a5a3fdb3436743ec73e75471c899fd4bc" title="Length of message including header.">nlmsg_len</a>); <span class="keywordflow">return</span> nm; errout: <a class="code" href="group__msg.html#ga138ba9bee70553f9fbe7143deacad48c" title="Free a netlink message.">nlmsg_free</a>(nm); <span class="keywordflow">return</span> NULL; } </pre></div> </div> </div> <a class="anchor" id="ga206eac17e0e75ae8457a513612395554"></a><!-- doxytag: member="msg.c::nlmsg_reserve" ref="ga206eac17e0e75ae8457a513612395554" args="(struct nl_msg *n, size_t len, int pad)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">void* nlmsg_reserve </td> <td>(</td> <td class="paramtype">struct nl_msg * </td> <td class="paramname"><em>n</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">size_t </td> <td class="paramname"><em>len</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>pad</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">n</td><td>netlink message </td></tr> <tr><td class="paramname">len</td><td>length of additional data to reserve room for </td></tr> <tr><td class="paramname">pad</td><td>number of bytes to align data to</td></tr> </table> </dd> </dl> <p>Reserves room for additional data at the tail of the an existing netlink message. Eventual padding required will be zeroed out.</p> <dl class="return"><dt><b>Returns:</b></dt><dd>Pointer to start of additional data tailroom or NULL. </dd></dl> <p>Definition at line <a class="el" href="msg_8c_source.html#l00512">512</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>References <a class="el" href="msg_8c_source.html#l00232">nlmsg_len()</a>.</p> <p>Referenced by <a class="el" href="msg_8c_source.html#l00549">nlmsg_append()</a>, and <a class="el" href="msg_8c_source.html#l00610">nlmsg_put()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordtype">void</span> *buf = n->nm_nlh; <span class="keywordtype">size_t</span> <a class="code" href="group__msg.html#gafa0898e9ec7d59a8faa1e4f0ed3168bf" title="length of message payload">nlmsg_len</a> = n->nm_nlh->nlmsg_len; <span class="keywordtype">size_t</span> tlen; tlen = pad ? ((len + (pad - 1)) & ~(pad - 1)) : len; <span class="keywordflow">if</span> ((tlen + <a class="code" href="group__msg.html#gafa0898e9ec7d59a8faa1e4f0ed3168bf" title="length of message payload">nlmsg_len</a>) > n->nm_size) { nl_errno(ENOBUFS); <span class="keywordflow">return</span> NULL; } buf += <a class="code" href="group__msg.html#gafa0898e9ec7d59a8faa1e4f0ed3168bf" title="length of message payload">nlmsg_len</a>; n->nm_nlh->nlmsg_len += tlen; <span class="keywordflow">if</span> (tlen > len) memset(buf + len, 0, tlen - len); NL_DBG(2, <span class="stringliteral">"msg %p: Reserved %zu bytes, pad=%d, nlmsg_len=%d\n"</span>, n, len, pad, n->nm_nlh->nlmsg_len); <span class="keywordflow">return</span> buf; } </pre></div> </div> </div> <a class="anchor" id="gacc5e5ade5675d041f86c7c8693f7088d"></a><!-- doxytag: member="msg.c::nlmsg_append" ref="gacc5e5ade5675d041f86c7c8693f7088d" args="(struct nl_msg *n, void *data, size_t len, int pad)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int nlmsg_append </td> <td>(</td> <td class="paramtype">struct nl_msg * </td> <td class="paramname"><em>n</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">void * </td> <td class="paramname"><em>data</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">size_t </td> <td class="paramname"><em>len</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>pad</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">n</td><td>netlink message </td></tr> <tr><td class="paramname">data</td><td>data to add </td></tr> <tr><td class="paramname">len</td><td>length of data </td></tr> <tr><td class="paramname">pad</td><td>Number of bytes to align data to.</td></tr> </table> </dd> </dl> <p>Extends the netlink message as needed and appends the data of given length to the message.</p> <dl class="return"><dt><b>Returns:</b></dt><dd>0 on success or a negative error code </dd></dl> <p>Definition at line <a class="el" href="msg_8c_source.html#l00549">549</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>References <a class="el" href="msg_8c_source.html#l00512">nlmsg_reserve()</a>.</p> <p>Referenced by <a class="el" href="lookup_8c_source.html#l00212">flnl_lookup_build_request()</a>, <a class="el" href="nl_8c_source.html#l00410">nl_send_simple()</a>, <a class="el" href="link_8c_source.html#l00965">rtnl_link_build_change_request()</a>, <a class="el" href="neightbl_8c_source.html#l00478">rtnl_neightbl_build_change_request()</a>, and <a class="el" href="qdisc_8c_source.html#l00315">rtnl_qdisc_build_delete_request()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordtype">void</span> *tmp; tmp = <a class="code" href="group__msg.html#ga206eac17e0e75ae8457a513612395554" title="Reserve room for additional data in a netlink message.">nlmsg_reserve</a>(n, len, pad); <span class="keywordflow">if</span> (tmp == NULL) <span class="keywordflow">return</span> nl_errno(ENOMEM); memcpy(tmp, data, len); NL_DBG(2, <span class="stringliteral">"msg %p: Appended %zu bytes with padding %d\n"</span>, n, len, pad); <span class="keywordflow">return</span> 0; } </pre></div> </div> </div> <a class="anchor" id="ga87ebc73ca93e5fa90742021eba448e60"></a><!-- doxytag: member="msg.c::nlmsg_expand" ref="ga87ebc73ca93e5fa90742021eba448e60" args="(struct nl_msg *n, size_t newlen)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int nlmsg_expand </td> <td>(</td> <td class="paramtype">struct nl_msg * </td> <td class="paramname"><em>n</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">size_t </td> <td class="paramname"><em>newlen</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">n</td><td>Netlink message. </td></tr> <tr><td class="paramname">newlen</td><td>New maximum payload size.</td></tr> </table> </dd> </dl> <p>Reallocates the payload section of a netlink message and increases the maximum payload size of the message.</p> <dl class="note"><dt><b>Note:</b></dt><dd>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.</dd></dl> <dl class="return"><dt><b>Returns:</b></dt><dd>0 on success or a negative error code. </dd></dl> <p>Definition at line <a class="el" href="msg_8c_source.html#l00577">577</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordtype">void</span> *tmp; <span class="keywordflow">if</span> (newlen <= n->nm_size) <span class="keywordflow">return</span> nl_errno(EINVAL); tmp = realloc(n->nm_nlh, newlen); <span class="keywordflow">if</span> (tmp == NULL) <span class="keywordflow">return</span> nl_errno(ENOMEM); n->nm_nlh = tmp; n->nm_size = newlen; <span class="keywordflow">return</span> 0; } </pre></div> </div> </div> <a class="anchor" id="ga16919a9a8579f8b538b0376781c1839d"></a><!-- doxytag: member="msg.c::nlmsg_put" ref="ga16919a9a8579f8b538b0376781c1839d" args="(struct nl_msg *n, uint32_t pid, uint32_t seq, int type, int payload, int flags)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a>* nlmsg_put </td> <td>(</td> <td class="paramtype">struct nl_msg * </td> <td class="paramname"><em>n</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">uint32_t </td> <td class="paramname"><em>pid</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">uint32_t </td> <td class="paramname"><em>seq</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>type</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>payload</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>flags</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td><code> [read]</code></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">n</td><td>netlink message </td></tr> <tr><td class="paramname">pid</td><td>netlink process id or NL_AUTO_PID </td></tr> <tr><td class="paramname">seq</td><td>sequence number of message or NL_AUTO_SEQ </td></tr> <tr><td class="paramname">type</td><td>message type </td></tr> <tr><td class="paramname">payload</td><td>length of message payload </td></tr> <tr><td class="paramname">flags</td><td>message flags</td></tr> </table> </dd> </dl> <p>Adds or overwrites the netlink message header in an existing message object. If <em>payload</em> is greater-than zero additional room will be reserved, f.e. for family specific headers. It can be accesed via <a class="el" href="group__msg.html#gae44a904bb40c8b5f5ff31539c21cfa5a" title="head of message payload">nlmsg_data()</a>.</p> <dl class="return"><dt><b>Returns:</b></dt><dd>A pointer to the netlink message header or NULL. </dd></dl> <p>Definition at line <a class="el" href="msg_8c_source.html#l00610">610</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>References <a class="el" href="netlink-kernel_8h_source.html#l00042">nlmsghdr::nlmsg_flags</a>, <a class="el" href="netlink-kernel_8h_source.html#l00052">nlmsghdr::nlmsg_pid</a>, <a class="el" href="msg_8c_source.html#l00512">nlmsg_reserve()</a>, <a class="el" href="netlink-kernel_8h_source.html#l00047">nlmsghdr::nlmsg_seq</a>, and <a class="el" href="netlink-kernel_8h_source.html#l00037">nlmsghdr::nlmsg_type</a>.</p> <p>Referenced by <a class="el" href="genl_8c_source.html#l00247">genlmsg_put()</a>, and <a class="el" href="nfnl_8c_source.html#l00231">nfnlmsg_put()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keyword">struct </span><a class="code" href="structnlmsghdr.html" title="Netlink message header.">nlmsghdr</a> *nlh; <span class="keywordflow">if</span> (n->nm_nlh->nlmsg_len < NLMSG_HDRLEN) BUG(); nlh = (<span class="keyword">struct </span><a class="code" href="structnlmsghdr.html" title="Netlink message header.">nlmsghdr</a> *) n->nm_nlh; nlh-><a class="code" href="structnlmsghdr.html#a7232c4e6cb513010e64887b7eebf8823" title="Message type (content type)">nlmsg_type</a> = type; nlh-><a class="code" href="structnlmsghdr.html#abcf664d354ea35ebb9b3d8a50088fec6" title="Message flags.">nlmsg_flags</a> = flags; nlh-><a class="code" href="structnlmsghdr.html#a071903f5e2400298bca69ac70500421f" title="Netlink PID of the proccess sending the message.">nlmsg_pid</a> = pid; nlh-><a class="code" href="structnlmsghdr.html#ad6c6a7aa9de65bb2da498c84148be7e6" title="Sequence number.">nlmsg_seq</a> = seq; NL_DBG(2, <span class="stringliteral">"msg %p: Added netlink header type=%d, flags=%d, pid=%d, "</span> <span class="stringliteral">"seq=%d\n"</span>, n, type, flags, pid, seq); <span class="keywordflow">if</span> (payload > 0 && <a class="code" href="group__msg.html#ga206eac17e0e75ae8457a513612395554" title="Reserve room for additional data in a netlink message.">nlmsg_reserve</a>(n, payload, NLMSG_ALIGNTO) == NULL) <span class="keywordflow">return</span> NULL; <span class="keywordflow">return</span> nlh; } </pre></div> </div> </div> <a class="anchor" id="gaa5f29579d86d2bdab26c312b44b56de7"></a><!-- doxytag: member="msg.c::nlmsg_hdr" ref="gaa5f29579d86d2bdab26c312b44b56de7" args="(struct nl_msg *n)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a>* nlmsg_hdr </td> <td>(</td> <td class="paramtype">struct nl_msg * </td> <td class="paramname"><em>n</em></td><td>)</td> <td><code> [read]</code></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">n</td><td>netlink message</td></tr> </table> </dd> </dl> <p>Returns the actual netlink message casted to the type of the netlink message header.</p> <dl class="return"><dt><b>Returns:</b></dt><dd>A pointer to the netlink message. </dd></dl> <p>Definition at line <a class="el" href="msg_8c_source.html#l00643">643</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>Referenced by <a class="el" href="cache_8c_source.html#l00642">nl_cache_parse_and_add()</a>, <a class="el" href="msg_8c_source.html#l00947">nl_msg_dump()</a>, <a class="el" href="nl_8c_source.html#l00373">nl_send_auto_complete()</a>, and <a class="el" href="nl_8c_source.html#l00290">nl_sendmsg()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordflow">return</span> n->nm_nlh; } </pre></div> </div> </div> <a class="anchor" id="ga138ba9bee70553f9fbe7143deacad48c"></a><!-- doxytag: member="msg.c::nlmsg_free" ref="ga138ba9bee70553f9fbe7143deacad48c" args="(struct nl_msg *n)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">void nlmsg_free </td> <td>(</td> <td class="paramtype">struct nl_msg * </td> <td class="paramname"><em>n</em></td><td>)</td> <td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">n</td><td>netlink message</td></tr> </table> </dd> </dl> <p>Destroys a netlink message and frees up all used memory.</p> <dl class="pre"><dt><b>Precondition:</b></dt><dd>The message must be unused. </dd></dl> <p>Definition at line <a class="el" href="msg_8c_source.html#l00656">656</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>Referenced by <a class="el" href="lookup_8c_source.html#l00263">flnl_lookup()</a>, <a class="el" href="lookup_8c_source.html#l00212">flnl_lookup_build_request()</a>, <a class="el" href="nfnl_8c_source.html#l00201">nfnlmsg_alloc_simple()</a>, <a class="el" href="msg_8c_source.html#l00947">nl_msg_dump()</a>, <a class="el" href="nl_8c_source.html#l00410">nl_send_simple()</a>, <a class="el" href="msg_8c_source.html#l00484">nlmsg_convert()</a>, <a class="el" href="route_2addr_8c_source.html#l00765">rtnl_addr_add()</a>, <a class="el" href="route_2addr_8c_source.html#l00838">rtnl_addr_delete()</a>, <a class="el" href="class_8c_source.html#l00148">rtnl_class_add()</a>, <a class="el" href="classifier_8c_source.html#l00162">rtnl_cls_add()</a>, <a class="el" href="classifier_8c_source.html#l00208">rtnl_cls_change()</a>, <a class="el" href="classifier_8c_source.html#l00256">rtnl_cls_delete()</a>, <a class="el" href="link_8c_source.html#l00965">rtnl_link_build_change_request()</a>, <a class="el" href="link_8c_source.html#l01048">rtnl_link_change()</a>, <a class="el" href="neigh_8c_source.html#l00656">rtnl_neigh_add()</a>, <a class="el" href="neigh_8c_source.html#l00770">rtnl_neigh_change()</a>, <a class="el" href="neigh_8c_source.html#l00711">rtnl_neigh_delete()</a>, <a class="el" href="neightbl_8c_source.html#l00478">rtnl_neightbl_build_change_request()</a>, <a class="el" href="neightbl_8c_source.html#l00578">rtnl_neightbl_change()</a>, <a class="el" href="qdisc_8c_source.html#l00224">rtnl_qdisc_add()</a>, <a class="el" href="qdisc_8c_source.html#l00279">rtnl_qdisc_change()</a>, <a class="el" href="qdisc_8c_source.html#l00348">rtnl_qdisc_delete()</a>, <a class="el" href="rule_8c_source.html#l00581">rtnl_rule_add()</a>, and <a class="el" href="rule_8c_source.html#l00635">rtnl_rule_delete()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordflow">if</span> (!n) <span class="keywordflow">return</span>; free(n->nm_nlh); free(n); NL_DBG(2, <span class="stringliteral">"msg %p: Freed\n"</span>, n); } </pre></div> </div> </div> <a class="anchor" id="ga062de3af7d634b7638c053e4ba67a7eb"></a><!-- doxytag: member="msg.c::nl_msg_dump" ref="ga062de3af7d634b7638c053e4ba67a7eb" args="(struct nl_msg *msg, FILE *ofd)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">void nl_msg_dump </td> <td>(</td> <td class="paramtype">struct nl_msg * </td> <td class="paramname"><em>msg</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">FILE * </td> <td class="paramname"><em>ofd</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">msg</td><td>Message to print </td></tr> <tr><td class="paramname">ofd</td><td>File descriptor. </td></tr> </table> </dd> </dl> <p>Definition at line <a class="el" href="msg_8c_source.html#l00947">947</a> of file <a class="el" href="msg_8c_source.html">msg.c</a>.</p> <p>References <a class="el" href="netlink-kernel_8h_source.html#l00185">nlmsgerr::error</a>, <a class="el" href="netlink-kernel_8h_source.html#l00188">nlmsgerr::msg</a>, <a class="el" href="cache__mngt_8c_source.html#l00058">nl_cache_ops_associate()</a>, <a class="el" href="msg_8c_source.html#l00249">nlmsg_attrdata()</a>, <a class="el" href="msg_8c_source.html#l00260">nlmsg_attrlen()</a>, <a class="el" href="msg_8c_source.html#l00218">nlmsg_data()</a>, <a class="el" href="msg_8c_source.html#l00656">nlmsg_free()</a>, <a class="el" href="msg_8c_source.html#l00643">nlmsg_hdr()</a>, <a class="el" href="msg_8c_source.html#l00424">nlmsg_inherit()</a>, <a class="el" href="msg_8c_source.html#l00232">nlmsg_len()</a>, <a class="el" href="netlink-kernel_8h_source.html#l00032">nlmsghdr::nlmsg_len</a>, <a class="el" href="msg_8c_source.html#l00184">nlmsg_msg_size()</a>, and <a class="el" href="netlink-kernel_8h_source.html#l00037">nlmsghdr::nlmsg_type</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keyword">struct </span><a class="code" href="structnlmsghdr.html" title="Netlink message header.">nlmsghdr</a> *hdr = <a class="code" href="group__msg.html#gaa5f29579d86d2bdab26c312b44b56de7" title="Return actual netlink message.">nlmsg_hdr</a>(msg); fprintf(ofd, <span class="stringliteral">"-------------------------- BEGIN NETLINK MESSAGE "</span> <span class="stringliteral">"---------------------------\n"</span>); fprintf(ofd, <span class="stringliteral">" [HEADER] %Zu octets\n"</span>, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structnlmsghdr.html" title="Netlink message header.">nlmsghdr</a>)); print_hdr(ofd, msg); <span class="keywordflow">if</span> (hdr-><a class="code" href="structnlmsghdr.html#a7232c4e6cb513010e64887b7eebf8823" title="Message type (content type)">nlmsg_type</a> == <a class="code" href="group__msg.html#ga2d6d3c937fdda1d64201c5abfd5a2b83" title="The message signals an error and the payload contains a nlmsgerr structure.">NLMSG_ERROR</a> && hdr-><a class="code" href="structnlmsghdr.html#a5a3fdb3436743ec73e75471c899fd4bc" title="Length of message including header.">nlmsg_len</a> >= <a class="code" href="group__msg.html#ga3790ddfe9268d3b63f3cd1ceb9bb2f83" title="length of netlink message not including padding">nlmsg_msg_size</a>(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structnlmsgerr.html" title="Netlink error message.">nlmsgerr</a>))) { <span class="keyword">struct </span>nl_msg *errmsg; <span class="keyword">struct </span><a class="code" href="structnlmsgerr.html" title="Netlink error message.">nlmsgerr</a> *err = <a class="code" href="group__msg.html#gae44a904bb40c8b5f5ff31539c21cfa5a" title="head of message payload">nlmsg_data</a>(hdr); fprintf(ofd, <span class="stringliteral">" [ERRORMSG] %Zu octets\n"</span>, <span class="keyword">sizeof</span>(*err)); fprintf(ofd, <span class="stringliteral">" .error = %d \"%s\"\n"</span>, err-><a class="code" href="structnlmsgerr.html#ad74e54e113a2aefba0d2a3e0bb8a768d" title="Error code (errno number)">error</a>, strerror(-err-><a class="code" href="structnlmsgerr.html#ad74e54e113a2aefba0d2a3e0bb8a768d" title="Error code (errno number)">error</a>)); fprintf(ofd, <span class="stringliteral">" [ORIGINAL MESSAGE] %Zu octets\n"</span>, <span class="keyword">sizeof</span>(*hdr)); errmsg = <a class="code" href="group__msg.html#gab89e1b4e969a091fed4ef851f3339756" title="Allocate a new netlink message and inherit netlink message header.">nlmsg_inherit</a>(&err-><a class="code" href="structnlmsgerr.html#acf3fb4d9ccd3f6a112347684e32dcb5a" title="Original netlink message causing the error.">msg</a>); print_hdr(ofd, errmsg); <a class="code" href="group__msg.html#ga138ba9bee70553f9fbe7143deacad48c" title="Free a netlink message.">nlmsg_free</a>(errmsg); } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="group__msg.html#gafa0898e9ec7d59a8faa1e4f0ed3168bf" title="length of message payload">nlmsg_len</a>(hdr) > 0) { <span class="keyword">struct </span><a class="code" href="structnl__cache__ops.html" title="Cache Operations.">nl_cache_ops</a> *ops; <span class="keywordtype">int</span> payloadlen = <a class="code" href="group__msg.html#gafa0898e9ec7d59a8faa1e4f0ed3168bf" title="length of message payload">nlmsg_len</a>(hdr); <span class="keywordtype">int</span> attrlen = 0; ops = <a class="code" href="group__cache__mngt.html#ga92ddd84e94041733d8def0492b0afc1e" title="Associate a message type to a set of cache operations.">nl_cache_ops_associate</a>(nlmsg_get_proto(msg), hdr-><a class="code" href="structnlmsghdr.html#a7232c4e6cb513010e64887b7eebf8823" title="Message type (content type)">nlmsg_type</a>); <span class="keywordflow">if</span> (ops) { attrlen = <a class="code" href="group__msg.html#gac9a4689d22aaa2f630476a7826f25fec" title="length of attributes data">nlmsg_attrlen</a>(hdr, ops->co_hdrsize); payloadlen -= attrlen; } fprintf(ofd, <span class="stringliteral">" [PAYLOAD] %d octets\n"</span>, payloadlen); dump_hex(ofd, <a class="code" href="group__msg.html#gae44a904bb40c8b5f5ff31539c21cfa5a" title="head of message payload">nlmsg_data</a>(hdr), payloadlen, 0); <span class="keywordflow">if</span> (attrlen) { <span class="keyword">struct </span>nlattr *attrs; <span class="keywordtype">int</span> attrlen; attrs = <a class="code" href="group__msg.html#ga203fdf0a4637e05df44de94c60d8e909" title="head of attributes data">nlmsg_attrdata</a>(hdr, ops->co_hdrsize); attrlen = <a class="code" href="group__msg.html#gac9a4689d22aaa2f630476a7826f25fec" title="length of attributes data">nlmsg_attrlen</a>(hdr, ops->co_hdrsize); dump_attrs(ofd, attrs, attrlen, 0); } } fprintf(ofd, <span class="stringliteral">"--------------------------- END NETLINK MESSAGE "</span> <span class="stringliteral">"---------------------------\n"</span>); } </pre></div> </div> </div> </div> <hr class="footer"/><address class="footer"><small>Generated on Mon Mar 21 2011 for libnl by  <a href="http://www.doxygen.org/index.html"> <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.3 </small></address> </body> </html>