<!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: Generic Netlink</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <link href="doxygen.css" rel="stylesheet" type="text/css"/> </head> <body> <!-- Generated by Doxygen 1.7.3 --> <div id="top"> <div id="titlearea"> <table cellspacing="0" cellpadding="0"> <tbody> <tr style="height: 56px;"> <td style="padding-left: 0.5em;"> <div id="projectname">libnl <span id="projectnumber">1.1</span></div> </td> </tr> </tbody> </table> </div> <div id="navrow1" class="tabs"> <ul class="tablist"> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="modules.html"><span>Modules</span></a></li> <li><a href="annotated.html"><span>Data Structures</span></a></li> <li><a href="files.html"><span>Files</span></a></li> </ul> </div> </div> <div class="header"> <div class="summary"> <a href="#groups">Modules</a> </div> <div class="headertitle"> <h1>Generic Netlink</h1> </div> <div class="ingroups"><a class="el" href="group__nlfam.html">Netlink Families</a></div></div> <div class="contents"> <table class="memberdecls"> <tr><td colspan="2"><h2><a name="groups"></a> Modules</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__genl__family.html">Generic Netlink Family</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__genl__mngt.html">Management</a></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Socket Creating</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga3e8ae476efb5dc964c7c0fa43f1a9f9f"></a><!-- doxytag: member="genl::genl_connect" ref="ga3e8ae476efb5dc964c7c0fa43f1a9f9f" args="(struct nl_handle *handle)" --> int </td><td class="memItemRight" valign="bottom"><b>genl_connect</b> (struct nl_handle *handle)</td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Sending</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__genl.html#ga3454e19240e23a023ea469f780d9899d">genl_send_simple</a> (struct nl_handle *handle, int family, int cmd, int version, int flags)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Send trivial generic netlink message. <a href="#ga3454e19240e23a023ea469f780d9899d"></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="gae330b8a624af9b5dcafc5556ff88a63c"></a><!-- doxytag: member="genl::genlmsg_valid_hdr" ref="gae330b8a624af9b5dcafc5556ff88a63c" args="(struct nlmsghdr *nlh, int hdrlen)" --> int </td><td class="memItemRight" valign="bottom"><b>genlmsg_valid_hdr</b> (struct <a class="el" href="structnlmsghdr.html">nlmsghdr</a> *nlh, int hdrlen)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga4ea6fec9864049f435025842eb9f0ec5"></a><!-- doxytag: member="genl::genlmsg_validate" ref="ga4ea6fec9864049f435025842eb9f0ec5" args="(struct nlmsghdr *nlh, int hdrlen, int maxtype, struct nla_policy *policy)" --> int </td><td class="memItemRight" valign="bottom"><b>genlmsg_validate</b> (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="memItemLeft" align="right" valign="top"><a class="anchor" id="ga8f9f8bdb0f94c14fd1490364ba7b6b56"></a><!-- doxytag: member="genl::genlmsg_parse" ref="ga8f9f8bdb0f94c14fd1490364ba7b6b56" args="(struct nlmsghdr *nlh, int hdrlen, struct nlattr *tb[], int maxtype, struct nla_policy *policy)" --> int </td><td class="memItemRight" valign="bottom"><b>genlmsg_parse</b> (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="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__genl.html#ga8924deee081eaae1011d5b5ecc497478">genlmsg_data</a> (const struct genlmsghdr *gnlh)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Get head of message payload. <a href="#ga8924deee081eaae1011d5b5ecc497478"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__genl.html#ga33ac98a8facab52d3cfd3382ef5b1289">genlmsg_len</a> (const struct genlmsghdr *gnlh)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Get lenght of message payload. <a href="#ga33ac98a8facab52d3cfd3382ef5b1289"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct nlattr * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__genl.html#ga800671a530b4c7a6fca7b5b43c8ca5aa">genlmsg_attrdata</a> (const struct genlmsghdr *gnlh, int hdrlen)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Get head of attribute data. <a href="#ga800671a530b4c7a6fca7b5b43c8ca5aa"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__genl.html#gabdae2ebb53a8c98adb2446d33c74e1e5">genlmsg_attrlen</a> (const struct genlmsghdr *gnlh, int hdrlen)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Get length of attribute data. <a href="#gabdae2ebb53a8c98adb2446d33c74e1e5"></a><br/></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Message Building</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__genl.html#ga59cab79b0fb5c86a041b0220461d78dd">genlmsg_put</a> (struct nl_msg *msg, uint32_t pid, uint32_t seq, int family, int hdrlen, int flags, uint8_t cmd, uint8_t version)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Add generic netlink header to netlink message. <a href="#ga59cab79b0fb5c86a041b0220461d78dd"></a><br/></td></tr> </table> <hr/><a name="_details"></a><h2>Detailed Description</h2> <dl class="user"><dt><b>Message Format</b></dt><dd><div class="fragment"><pre class="fragment"> <------- NLMSG_ALIGN(hlen) ------> <---- NLMSG_ALIGN(len) ---> +----------------------------+- - -+- - - - - - - - - - -+- - -+ | Header | Pad | Payload | Pad | | <span class="keyword">struct </span><a class="code" href="structnlmsghdr.html" title="Netlink message header.">nlmsghdr</a> | | | | +----------------------------+- - -+- - - - - - - - - - -+- - -+ </pre></div> <div class="fragment"><pre class="fragment"> <-------- GENL_HDRLEN -------> <--- hdrlen --> <------- <a class="code" href="group__genl.html#ga33ac98a8facab52d3cfd3382ef5b1289" title="Get lenght of message payload.">genlmsg_len</a>(ghdr) ------> +------------------------+- - -+---------------+- - -+------------+ | Generic Netlink Header | Pad | Family Header | Pad | Attributes | | <span class="keyword">struct </span>genlmsghdr | | | | | +------------------------+- - -+---------------+- - -+------------+ <a class="code" href="group__genl.html#ga8924deee081eaae1011d5b5ecc497478" title="Get head of message payload.">genlmsg_data</a>(ghdr)--------------^ ^ <a class="code" href="group__genl.html#ga800671a530b4c7a6fca7b5b43c8ca5aa" title="Get head of attribute data.">genlmsg_attrdata</a>(ghdr, hdrlen)------------------------- </pre></div></dd></dl> <dl class="user"><dt><b>Example</b></dt><dd><div class="fragment"><pre class="fragment"><span class="preprocessor"> #include <netlink/netlink.h></span> <span class="preprocessor"> #include <netlink/genl/genl.h></span> <span class="preprocessor"> #include <netlink/genl/ctrl.h></span> <span class="keyword">struct </span>nl_handle *sock; <span class="keyword">struct </span>nl_msg *msg; <span class="keywordtype">int</span> family; <span class="comment">// Allocate a new netlink socket</span> sock = <a class="code" href="group__socket.html#gaf903c9ea089735b1ba8e40dae801c47d" title="Allocate new netlink socket handle.">nl_handle_alloc</a>(); <span class="comment">// Connect to generic netlink socket on kernel side</span> genl_connect(sock); <span class="comment">// Ask kernel to resolve family name to family id</span> family = <a class="code" href="group__ctrl.html#ga765fbbec4a11e318a286f743da89ff47" title="Resolve generic netlink family name to its identifier.">genl_ctrl_resolve</a>(sock, <span class="stringliteral">"generic_netlink_family_name"</span>); <span class="comment">// Construct a generic netlink by allocating a new message, fill in</span> <span class="comment">// the header and append a simple integer attribute.</span> msg = <a class="code" href="group__msg.html#ga89c936bdf5e73455bb1640a0eb8a020d" title="Allocate a new netlink message with the default maximum payload size.">nlmsg_alloc</a>(); <a class="code" href="group__genl.html#ga59cab79b0fb5c86a041b0220461d78dd" title="Add generic netlink header to netlink message.">genlmsg_put</a>(msg, <a class="code" href="group__msg.html#gaf1a05ed4b58b0d3a0409f2a749e0c91c" title="Will cause the netlink pid to be set to the pid assigned to the netlink handle (socket) just before s...">NL_AUTO_PID</a>, <a class="code" href="group__msg.html#gaca80a9f4084020b28afdb663b670dc4b" title="May be used to refer to a sequence number which should be automatically set just before sending the m...">NL_AUTO_SEQ</a>, family, 0, <a class="code" href="group__msg.html#gac39e15f4f5ba3d381bceae0f0476d001" title="Echo this request.">NLM_F_ECHO</a>, CMD_FOO_GET, FOO_VERSION); <a class="code" href="group__attr.html#ga9891f766dcebe6bdb2ce86f021c6f6e6" title="Add a u32 netlink attribute to a netlink message.">nla_put_u32</a>(msg, ATTR_FOO, 123); <span class="comment">// Send message over netlink socket</span> <a class="code" href="group__nl.html#ga01a2aad82350f867e704d5c696438b60" title="Send netlink message and check &amp; extend header values as needed.">nl_send_auto_complete</a>(sock, msg); <span class="comment">// Free message</span> <a class="code" href="group__msg.html#ga138ba9bee70553f9fbe7143deacad48c" title="Free a netlink message.">nlmsg_free</a>(msg); <span class="comment">// Prepare socket to receive the answer by specifying the callback</span> <span class="comment">// function to be called for valid messages.</span> <a class="code" href="group__socket.html#ga6ae4e46ad6ea991e92dd0cc2653ff371" title="Modify the callback handler associated to the socket.">nl_socket_modify_cb</a>(sock, <a class="code" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a6e1f371d16186a460f25ea9bb1306c47" title="Message is valid.">NL_CB_VALID</a>, <a class="code" href="group__cb.html#ggaba3fabad0c62db483941101e1a18d14da22448271a402b4c4a55733ef4884c038" title="Customized handler specified by the user.">NL_CB_CUSTOM</a>, parse_cb, NULL); <span class="comment">// Wait for the answer and receive it</span> <a class="code" href="group__nl.html#gab287fc77c46d80c4e22bc87494cbf853" title="Receive a set of message from a netlink socket using handlers in nl_handle.">nl_recvmsgs_default</a>(sock); <span class="keyword">static</span> <span class="keywordtype">int</span> parse_cb(<span class="keyword">struct</span> nl_msg *msg, <span class="keywordtype">void</span> *arg) { <span class="keyword">struct </span><a class="code" href="structnlmsghdr.html" title="Netlink message header.">nlmsghdr</a> *nlh = <a class="code" href="group__msg.html#gaa5f29579d86d2bdab26c312b44b56de7" title="Return actual netlink message.">nlmsg_hdr</a>(msg); <span class="keyword">struct </span>nlattr *attrs[ATTR_MAX+1]; <span class="comment">// Validate message and parse attributes</span> genlmsg_parse(nlh, 0, attrs, ATTR_MAX, policy); <span class="keywordflow">if</span> (attrs[ATTR_FOO]) { uint32_t value = <a class="code" href="group__attr.html#gabda0290a8b26cc577c2c5cefa814aeac" title="Return payload of u32 attribute.">nla_get_u32</a>(attrs[ATTR_FOO]); ... } <span class="keywordflow">return</span> 0; } </pre></div> </dd></dl> <hr/><h2>Function Documentation</h2> <a class="anchor" id="ga3454e19240e23a023ea469f780d9899d"></a><!-- doxytag: member="genl.c::genl_send_simple" ref="ga3454e19240e23a023ea469f780d9899d" args="(struct nl_handle *handle, int family, int cmd, int version, int flags)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int genl_send_simple </td> <td>(</td> <td class="paramtype">struct nl_handle * </td> <td class="paramname"><em>handle</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>family</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>cmd</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>version</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>flags</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">handle</td><td>Netlink handle. </td></tr> <tr><td class="paramname">family</td><td>Generic netlink family </td></tr> <tr><td class="paramname">cmd</td><td>Command </td></tr> <tr><td class="paramname">version</td><td>Version </td></tr> <tr><td class="paramname">flags</td><td>Additional netlink message flags.</td></tr> </table> </dd> </dl> <p>Fills out a routing netlink request message and sends it out using <a class="el" href="group__nl.html#ga73ed88a505f2d67bcf328183fe1e692a" title="Send simple netlink message using nl_send_auto_complete()">nl_send_simple()</a>.</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="genl_8c_source.html#l00128">128</a> of file <a class="el" href="genl_8c_source.html">genl.c</a>.</p> <p>References <a class="el" href="nl_8c_source.html#l00410">nl_send_simple()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keyword">struct </span>genlmsghdr hdr = { .cmd = cmd, .version = version, }; <span class="keywordflow">return</span> <a class="code" href="group__nl.html#ga73ed88a505f2d67bcf328183fe1e692a" title="Send simple netlink message using nl_send_auto_complete()">nl_send_simple</a>(handle, family, flags, &hdr, <span class="keyword">sizeof</span>(hdr)); } </pre></div> </div> </div> <a class="anchor" id="ga8924deee081eaae1011d5b5ecc497478"></a><!-- doxytag: member="genl.c::genlmsg_data" ref="ga8924deee081eaae1011d5b5ecc497478" args="(const struct genlmsghdr *gnlh)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">void* genlmsg_data </td> <td>(</td> <td class="paramtype">const struct genlmsghdr * </td> <td class="paramname"><em>gnlh</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">gnlh</td><td>genetlink messsage header </td></tr> </table> </dd> </dl> <p>Definition at line <a class="el" href="genl_8c_source.html#l00191">191</a> of file <a class="el" href="genl_8c_source.html">genl.c</a>.</p> <p>Referenced by <a class="el" href="genl_8c_source.html#l00212">genlmsg_attrdata()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordflow">return</span> ((<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) gnlh + GENL_HDRLEN); } </pre></div> </div> </div> <a class="anchor" id="ga33ac98a8facab52d3cfd3382ef5b1289"></a><!-- doxytag: member="genl.c::genlmsg_len" ref="ga33ac98a8facab52d3cfd3382ef5b1289" args="(const struct genlmsghdr *gnlh)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int genlmsg_len </td> <td>(</td> <td class="paramtype">const struct genlmsghdr * </td> <td class="paramname"><em>gnlh</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">gnlh</td><td>genetlink message header </td></tr> </table> </dd> </dl> <p>Definition at line <a class="el" href="genl_8c_source.html#l00200">200</a> of file <a class="el" href="genl_8c_source.html">genl.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="genl_8c_source.html#l00222">genlmsg_attrlen()</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="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> *)gnlh - NLMSG_HDRLEN); <span class="keywordflow">return</span> (nlh-><a class="code" href="structnlmsghdr.html#a5a3fdb3436743ec73e75471c899fd4bc" title="Length of message including header.">nlmsg_len</a> - GENL_HDRLEN - NLMSG_HDRLEN); } </pre></div> </div> </div> <a class="anchor" id="ga800671a530b4c7a6fca7b5b43c8ca5aa"></a><!-- doxytag: member="genl.c::genlmsg_attrdata" ref="ga800671a530b4c7a6fca7b5b43c8ca5aa" args="(const struct genlmsghdr *gnlh, int hdrlen)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">struct nlattr* genlmsg_attrdata </td> <td>(</td> <td class="paramtype">const struct genlmsghdr * </td> <td class="paramname"><em>gnlh</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>hdrlen</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td><code> [read]</code></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">gnlh</td><td>generic 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="genl_8c_source.html#l00212">212</a> of file <a class="el" href="genl_8c_source.html">genl.c</a>.</p> <p>References <a class="el" href="genl_8c_source.html#l00191">genlmsg_data()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordflow">return</span> <a class="code" href="group__genl.html#ga8924deee081eaae1011d5b5ecc497478" title="Get head of message payload.">genlmsg_data</a>(gnlh) + NLMSG_ALIGN(hdrlen); } </pre></div> </div> </div> <a class="anchor" id="gabdae2ebb53a8c98adb2446d33c74e1e5"></a><!-- doxytag: member="genl.c::genlmsg_attrlen" ref="gabdae2ebb53a8c98adb2446d33c74e1e5" args="(const struct genlmsghdr *gnlh, int hdrlen)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int genlmsg_attrlen </td> <td>(</td> <td class="paramtype">const struct genlmsghdr * </td> <td class="paramname"><em>gnlh</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>hdrlen</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">gnlh</td><td>generic 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="genl_8c_source.html#l00222">222</a> of file <a class="el" href="genl_8c_source.html">genl.c</a>.</p> <p>References <a class="el" href="genl_8c_source.html#l00200">genlmsg_len()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordflow">return</span> <a class="code" href="group__genl.html#ga33ac98a8facab52d3cfd3382ef5b1289" title="Get lenght of message payload.">genlmsg_len</a>(gnlh) - NLMSG_ALIGN(hdrlen); } </pre></div> </div> </div> <a class="anchor" id="ga59cab79b0fb5c86a041b0220461d78dd"></a><!-- doxytag: member="genl.c::genlmsg_put" ref="ga59cab79b0fb5c86a041b0220461d78dd" args="(struct nl_msg *msg, uint32_t pid, uint32_t seq, int family, int hdrlen, int flags, uint8_t cmd, uint8_t version)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">void* genlmsg_put </td> <td>(</td> <td class="paramtype">struct nl_msg * </td> <td class="paramname"><em>msg</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">uint32_t </td> <td class="paramname"><em>pid</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">uint32_t </td> <td class="paramname"><em>seq</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>family</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>hdrlen</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>flags</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">uint8_t </td> <td class="paramname"><em>cmd</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">uint8_t </td> <td class="paramname"><em>version</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">msg</td><td>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">family</td><td>generic netlink family </td></tr> <tr><td class="paramname">hdrlen</td><td>length of user specific header </td></tr> <tr><td class="paramname">flags</td><td>message flags </td></tr> <tr><td class="paramname">cmd</td><td>generic netlink command </td></tr> <tr><td class="paramname">version</td><td>protocol version</td></tr> </table> </dd> </dl> <p>Returns pointer to user specific header. </p> <p>Definition at line <a class="el" href="genl_8c_source.html#l00247">247</a> of file <a class="el" href="genl_8c_source.html">genl.c</a>.</p> <p>References <a class="el" href="msg_8c_source.html#l00218">nlmsg_data()</a>, and <a class="el" href="msg_8c_source.html#l00610">nlmsg_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="keyword">struct </span>genlmsghdr hdr = { .cmd = cmd, .version = version, }; nlh = <a class="code" href="group__msg.html#ga16919a9a8579f8b538b0376781c1839d" title="Add a netlink message header to a netlink message.">nlmsg_put</a>(msg, pid, seq, family, GENL_HDRLEN + hdrlen, flags); <span class="keywordflow">if</span> (nlh == NULL) <span class="keywordflow">return</span> NULL; memcpy(<a class="code" href="group__msg.html#gae44a904bb40c8b5f5ff31539c21cfa5a" title="head of message payload">nlmsg_data</a>(nlh), &hdr, <span class="keyword">sizeof</span>(hdr)); NL_DBG(2, <span class="stringliteral">"msg %p: Added generic netlink header cmd=%d version=%d\n"</span>, msg, cmd, version); <span class="keywordflow">return</span> <a class="code" href="group__msg.html#gae44a904bb40c8b5f5ff31539c21cfa5a" title="head of message payload">nlmsg_data</a>(nlh) + GENL_HDRLEN; } </pre></div> </div> </div> </div> <hr class="footer"/><address class="footer"><small>Generated on Mon Mar 21 2011 for libnl by  <a href="http://www.doxygen.org/index.html"> <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.3 </small></address> </body> </html>