Sophie

Sophie

distrib > Fedora > 14 > x86_64 > media > updates > by-pkgid > 87b89b73c41f4440bb86afd421c7548f > files > 146

libnl-devel-1.1-14.fc14.x86_64.rpm

<!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&#160;<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&#160;Page</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="annotated.html"><span>Data&#160;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> &#124;
<a href="#groups">Modules</a> &#124;
<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 &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnlmsghdr.html">nlmsghdr</a></td></tr>
<tr><td class="mdescLeft">&#160;</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 &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structnlmsgerr.html">nlmsgerr</a></td></tr>
<tr><td class="mdescLeft">&#160;</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">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__attr.html">Attributes</a></td></tr>

<p><tr><td class="mdescLeft">&#160;</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&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#gaf1a05ed4b58b0d3a0409f2a749e0c91c">NL_AUTO_PID</a>&#160;&#160;&#160;0</td></tr>
<tr><td class="mdescLeft">&#160;</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&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#gaca80a9f4084020b28afdb663b670dc4b">NL_AUTO_SEQ</a>&#160;&#160;&#160;0</td></tr>
<tr><td class="mdescLeft">&#160;</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&#160;</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">&#160;</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&#160;</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">&#160;</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&#160;</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">&#160;</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 *&#160;</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">&#160;</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 *&#160;</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&#160;</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">&#160;</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 *&#160;</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">&#160;</td><td class="mdescRight">head of attributes data  <a href="#ga203fdf0a4637e05df44de94c60d8e909"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</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">&#160;</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&#160;</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&#160;</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">&#160;</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> *&#160;</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">&#160;</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&#160;</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">&#160;</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 *&#160;</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">&#160;</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&#160;</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">&#160;</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 *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga89c936bdf5e73455bb1640a0eb8a020d">nlmsg_alloc</a> (void)</td></tr>
<tr><td class="mdescLeft">&#160;</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 *&#160;</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">&#160;</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 *&#160;</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">&#160;</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 *&#160;</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">&#160;</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&#160;</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">&#160;</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 *&#160;</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">&#160;</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 *&#160;</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">&#160;</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&#160;</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">&#160;</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&#160;</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">&#160;</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> *&#160;</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">&#160;</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> *&#160;</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">&#160;</td><td class="mdescRight">Return actual netlink message.  <a href="#gaa5f29579d86d2bdab26c312b44b56de7"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</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">&#160;</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&#160;</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&#160;</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&#160;</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&#160;</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> *&#160;</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&#160;</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> *&#160;</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&#160;</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 *&#160;</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 *&#160;</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&#160;</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 *&#160;</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&#160;</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&#160;</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">&#160;</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&#160;</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">&#160;</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&#160;</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">&#160;</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&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga456954d27b8adedd78136a9511f13160">NLM_F_REQUEST</a>&#160;&#160;&#160;1</td></tr>
<tr><td class="mdescLeft">&#160;</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&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga245e7fde2fbbdeb3860899f50213ff35">NLM_F_MULTI</a>&#160;&#160;&#160;2</td></tr>
<tr><td class="mdescLeft">&#160;</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&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga67d5b6ba8714b97d74df72d119351bee">NLM_F_ACK</a>&#160;&#160;&#160;4</td></tr>
<tr><td class="mdescLeft">&#160;</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&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#gac39e15f4f5ba3d381bceae0f0476d001">NLM_F_ECHO</a>&#160;&#160;&#160;8</td></tr>
<tr><td class="mdescLeft">&#160;</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&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga9b2c023dd75018e29e84c0ac8df20720">NLM_F_ROOT</a>&#160;&#160;&#160;0x100</td></tr>
<tr><td class="mdescLeft">&#160;</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&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga49bcfe3ce8471f372dcd17f6f989cd88">NLM_F_MATCH</a>&#160;&#160;&#160;0x200</td></tr>
<tr><td class="mdescLeft">&#160;</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&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#gaa5a74825940c1ee06bbe5bb808815873">NLM_F_ATOMIC</a>&#160;&#160;&#160;0x400</td></tr>
<tr><td class="mdescLeft">&#160;</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&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga8d4fb2458c013decb6673f41c52c07b1">NLM_F_DUMP</a>&#160;&#160;&#160;(NLM_F_ROOT|NLM_F_MATCH)</td></tr>
<tr><td class="mdescLeft">&#160;</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&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga508feb1b826c0b8f6b2487c682ddb734">NLM_F_REPLACE</a>&#160;&#160;&#160;0x100</td></tr>
<tr><td class="mdescLeft">&#160;</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&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga0b0f8c9581ee93747c7d9e94ca0e0596">NLM_F_EXCL</a>&#160;&#160;&#160;0x200</td></tr>
<tr><td class="mdescLeft">&#160;</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&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga20a00ae52e4c150f54649d7346d23a7a">NLM_F_CREATE</a>&#160;&#160;&#160;0x400</td></tr>
<tr><td class="mdescLeft">&#160;</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&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga2113407e49ea146733a76f4c71294016">NLM_F_APPEND</a>&#160;&#160;&#160;0x800</td></tr>
<tr><td class="mdescLeft">&#160;</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&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga3033de03e6242ba7d7ffd2f2f4d3fb38">NLMSG_NOOP</a>&#160;&#160;&#160;0x1</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">No operation, message must be ignored. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga2d6d3c937fdda1d64201c5abfd5a2b83">NLMSG_ERROR</a>&#160;&#160;&#160;0x2</td></tr>
<tr><td class="mdescLeft">&#160;</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&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga151b98bf01f462dbc5d3c69e6396e064">NLMSG_DONE</a>&#160;&#160;&#160;0x3</td></tr>
<tr><td class="mdescLeft">&#160;</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&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#ga369a70cf77edb2766b2196dfc70e9147">NLMSG_OVERRUN</a>&#160;&#160;&#160;0x4</td></tr>
<tr><td class="mdescLeft">&#160;</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&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__msg.html#gaacc5e594f0d9c96f7fc07eb2805dd646">NLMSG_MIN_TYPE</a>&#160;&#160;&#160;0x10</td></tr>
<tr><td class="mdescLeft">&#160;</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">  &lt;------- NLMSG_ALIGN(hlen) ------&gt; &lt;---- NLMSG_ALIGN(len) ---&gt;
 +----------------------------+- - -+- - - - - - - - - - -+- - -+
 |           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">    &lt;--- <a class="code" href="group__msg.html#ga0734c5b291e451c26051ad3b6ef083bd" title="length of netlink message including padding">nlmsg_total_size</a>(payload)  ---&gt;
    &lt;-- <a class="code" href="group__msg.html#ga3790ddfe9268d3b63f3cd1ceb9bb2f83" title="length of netlink message not including padding">nlmsg_msg_size</a>(payload) -&gt;
   +----------+- - -+-------------+- - -+-------- - -
   | <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">    &lt;---------------------- <a class="code" href="group__msg.html#gafa0898e9ec7d59a8faa1e4f0ed3168bf" title="length of message payload">nlmsg_len</a>(nlh) ---------------------&gt;
    &lt;------ hdrlen ------&gt;       &lt;- <a class="code" href="group__msg.html#gac9a4689d22aaa2f630476a7826f25fec" title="length of attributes data">nlmsg_attrlen</a>(nlh, hdrlen) -&gt;
   +----------------------+- - -+--------------------------------+
   |     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>(&amp;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, &amp;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, &amp;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, &amp;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&#160;&#160;&#160;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 &amp; 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&#160;&#160;&#160;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 &amp; 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">&#160;</td>
          <td class="paramname">pos, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">nlh, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">hdrlen, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">rem&#160;</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">&#160;</td>
          <td class="paramname">pos, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">head, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">len, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">rem&#160;</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, &amp;(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&#45;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&#160;&#160;&#160;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&#45;kernel.h::NLMSG_ERROR" ref="ga2d6d3c937fdda1d64201c5abfd5a2b83" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define NLMSG_ERROR&#160;&#160;&#160;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&#160;</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&#160;</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&#160;</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> *&#160;</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> *&#160;</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-&gt;<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> *&#160;</td>
          <td class="paramname"><em>nlh</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>hdrlen</em>&#160;</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> *&#160;</td>
          <td class="paramname"><em>nlh</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>hdrlen</em>&#160;</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> *&#160;</td>
          <td class="paramname"><em>nlh</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>remaining</em>&#160;</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 &gt;= <span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structnlmsghdr.html" title="Netlink message header.">nlmsghdr</a>) &amp;&amp;
                nlh-&gt;<a class="code" href="structnlmsghdr.html#a5a3fdb3436743ec73e75471c899fd4bc" title="Length of message including header.">nlmsg_len</a> &gt;= <span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structnlmsghdr.html" title="Netlink message header.">nlmsghdr</a>) &amp;&amp;
                nlh-&gt;<a class="code" href="structnlmsghdr.html#a5a3fdb3436743ec73e75471c899fd4bc" title="Length of message including header.">nlmsg_len</a> &lt;= 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> *&#160;</td>
          <td class="paramname"><em>nlh</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int *&#160;</td>
          <td class="paramname"><em>remaining</em>&#160;</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-&gt;<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> *&#160;</td>
          <td class="paramname"><em>nlh</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>hdrlen</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">struct nlattr *&#160;</td>
          <td class="paramname"><em>tb</em>[], </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</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> *&#160;</td>
          <td class="paramname"><em>policy</em>&#160;</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> *&#160;</td>
          <td class="paramname"><em>nlh</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>hdrlen</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>attrtype</em>&#160;</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> *&#160;</td>
          <td class="paramname"><em>nlh</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>hdrlen</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</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> *&#160;</td>
          <td class="paramname"><em>policy</em>&#160;</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&#160;</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> *&#160;</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 &amp;&amp; hdr) {
                <span class="keyword">struct </span><a class="code" href="structnlmsghdr.html" title="Netlink message header.">nlmsghdr</a> *<span class="keyword">new</span> = nm-&gt;nm_nlh;

                <span class="keyword">new</span>-&gt;<a class="code" href="structnlmsghdr.html#a7232c4e6cb513010e64887b7eebf8823" title="Message type (content type)">nlmsg_type</a> = hdr-&gt;<a class="code" href="structnlmsghdr.html#a7232c4e6cb513010e64887b7eebf8823" title="Message type (content type)">nlmsg_type</a>;
                <span class="keyword">new</span>-&gt;nlmsg_flags = hdr-&gt;<a class="code" href="structnlmsghdr.html#abcf664d354ea35ebb9b3d8a50088fec6" title="Message flags.">nlmsg_flags</a>;
                <span class="keyword">new</span>-&gt;nlmsg_seq = hdr-&gt;<a class="code" href="structnlmsghdr.html#ad6c6a7aa9de65bb2da498c84148be7e6" title="Sequence number.">nlmsg_seq</a>;
                <span class="keyword">new</span>-&gt;nlmsg_pid = hdr-&gt;<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&#160;</td>
          <td class="paramname"><em>nlmsgtype</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>flags</em>&#160;</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>(&amp;nlh);
        <span class="keywordflow">if</span> (msg)
                NL_DBG(2, <span class="stringliteral">&quot;msg %p: Allocated new simple message\n&quot;</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&#160;</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 &lt; <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> *&#160;</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-&gt;<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-&gt;nm_nlh, hdr, hdr-&gt;<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 *&#160;</td>
          <td class="paramname"><em>n</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">size_t&#160;</td>
          <td class="paramname"><em>len</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>pad</em>&#160;</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-&gt;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-&gt;nm_nlh-&gt;nlmsg_len;
        <span class="keywordtype">size_t</span> tlen;

        tlen = pad ? ((len + (pad - 1)) &amp; ~(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>) &gt; n-&gt;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-&gt;nm_nlh-&gt;nlmsg_len += tlen;

        <span class="keywordflow">if</span> (tlen &gt; len)
                memset(buf + len, 0, tlen - len);

        NL_DBG(2, <span class="stringliteral">&quot;msg %p: Reserved %zu bytes, pad=%d, nlmsg_len=%d\n&quot;</span>,
                  n, len, pad, n-&gt;nm_nlh-&gt;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 *&#160;</td>
          <td class="paramname"><em>n</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">void *&#160;</td>
          <td class="paramname"><em>data</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">size_t&#160;</td>
          <td class="paramname"><em>len</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>pad</em>&#160;</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">&quot;msg %p: Appended %zu bytes with padding %d\n&quot;</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 *&#160;</td>
          <td class="paramname"><em>n</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">size_t&#160;</td>
          <td class="paramname"><em>newlen</em>&#160;</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 &lt;= n-&gt;nm_size)
                <span class="keywordflow">return</span> nl_errno(EINVAL);

        tmp = realloc(n-&gt;nm_nlh, newlen);
        <span class="keywordflow">if</span> (tmp == NULL)
                <span class="keywordflow">return</span> nl_errno(ENOMEM);

        n-&gt;nm_nlh = tmp;
        n-&gt;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 *&#160;</td>
          <td class="paramname"><em>n</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">uint32_t&#160;</td>
          <td class="paramname"><em>pid</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">uint32_t&#160;</td>
          <td class="paramname"><em>seq</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>type</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>payload</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>flags</em>&#160;</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-&gt;nm_nlh-&gt;nlmsg_len &lt; NLMSG_HDRLEN)
                BUG();

        nlh = (<span class="keyword">struct </span><a class="code" href="structnlmsghdr.html" title="Netlink message header.">nlmsghdr</a> *) n-&gt;nm_nlh;
        nlh-&gt;<a class="code" href="structnlmsghdr.html#a7232c4e6cb513010e64887b7eebf8823" title="Message type (content type)">nlmsg_type</a> = type;
        nlh-&gt;<a class="code" href="structnlmsghdr.html#abcf664d354ea35ebb9b3d8a50088fec6" title="Message flags.">nlmsg_flags</a> = flags;
        nlh-&gt;<a class="code" href="structnlmsghdr.html#a071903f5e2400298bca69ac70500421f" title="Netlink PID of the proccess sending the message.">nlmsg_pid</a> = pid;
        nlh-&gt;<a class="code" href="structnlmsghdr.html#ad6c6a7aa9de65bb2da498c84148be7e6" title="Sequence number.">nlmsg_seq</a> = seq;

        NL_DBG(2, <span class="stringliteral">&quot;msg %p: Added netlink header type=%d, flags=%d, pid=%d, &quot;</span>
                  <span class="stringliteral">&quot;seq=%d\n&quot;</span>, n, type, flags, pid, seq);

        <span class="keywordflow">if</span> (payload &gt; 0 &amp;&amp;
            <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 *&#160;</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-&gt;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 *&#160;</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-&gt;nm_nlh);
        free(n);
        NL_DBG(2, <span class="stringliteral">&quot;msg %p: Freed\n&quot;</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 *&#160;</td>
          <td class="paramname"><em>msg</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">FILE *&#160;</td>
          <td class="paramname"><em>ofd</em>&#160;</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">&quot;--------------------------   BEGIN NETLINK MESSAGE &quot;</span>
        <span class="stringliteral">&quot;---------------------------\n&quot;</span>);

        fprintf(ofd, <span class="stringliteral">&quot;  [HEADER] %Zu octets\n&quot;</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-&gt;<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> &amp;&amp;
            hdr-&gt;<a class="code" href="structnlmsghdr.html#a5a3fdb3436743ec73e75471c899fd4bc" title="Length of message including header.">nlmsg_len</a> &gt;= <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">&quot;  [ERRORMSG] %Zu octets\n&quot;</span>, <span class="keyword">sizeof</span>(*err));
                fprintf(ofd, <span class="stringliteral">&quot;    .error = %d \&quot;%s\&quot;\n&quot;</span>, err-&gt;<a class="code" href="structnlmsgerr.html#ad74e54e113a2aefba0d2a3e0bb8a768d" title="Error code (errno number)">error</a>,
                        strerror(-err-&gt;<a class="code" href="structnlmsgerr.html#ad74e54e113a2aefba0d2a3e0bb8a768d" title="Error code (errno number)">error</a>));
                fprintf(ofd, <span class="stringliteral">&quot;  [ORIGINAL MESSAGE] %Zu octets\n&quot;</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>(&amp;err-&gt;<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) &gt; 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-&gt;<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-&gt;co_hdrsize);
                        payloadlen -= attrlen;
                }

                fprintf(ofd, <span class="stringliteral">&quot;  [PAYLOAD] %d octets\n&quot;</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-&gt;co_hdrsize);
                        attrlen = <a class="code" href="group__msg.html#gac9a4689d22aaa2f630476a7826f25fec" title="length of attributes data">nlmsg_attrlen</a>(hdr, ops-&gt;co_hdrsize);
                        dump_attrs(ofd, attrs, attrlen, 0);
                }
        }

        fprintf(ofd, 
        <span class="stringliteral">&quot;---------------------------  END NETLINK MESSAGE   &quot;</span>
        <span class="stringliteral">&quot;---------------------------\n&quot;</span>);
}
</pre></div>
</div>
</div>
</div>
<hr class="footer"/><address class="footer"><small>Generated on Mon Mar 21 2011 for libnl by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.3 </small></address>
</body>
</html>