<!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: Queueing Disciplines</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <link href="doxygen.css" rel="stylesheet" type="text/css"/> </head> <body> <!-- Generated by Doxygen 1.7.3 --> <div id="top"> <div id="titlearea"> <table cellspacing="0" cellpadding="0"> <tbody> <tr style="height: 56px;"> <td style="padding-left: 0.5em;"> <div id="projectname">libnl <span id="projectnumber">1.1</span></div> </td> </tr> </tbody> </table> </div> <div id="navrow1" class="tabs"> <ul class="tablist"> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="modules.html"><span>Modules</span></a></li> <li><a href="annotated.html"><span>Data Structures</span></a></li> <li><a href="files.html"><span>Files</span></a></li> </ul> </div> </div> <div class="header"> <div class="summary"> <a href="#nested-classes">Data Structures</a> | <a href="#groups">Modules</a> </div> <div class="headertitle"> <h1>Queueing Disciplines</h1> </div> <div class="ingroups"><a class="el" href="group__tc.html">Traffic Control</a></div></div> <div class="contents"> <table class="memberdecls"> <tr><td colspan="2"><h2><a name="nested-classes"></a> Data Structures</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structrtnl__qdisc__ops.html">rtnl_qdisc_ops</a></td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Qdisc Operations. <a href="structrtnl__qdisc__ops.html#_details">More...</a><br/></td></tr> <tr><td colspan="2"><h2><a name="groups"></a> Modules</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__qdisc__api.html">Queueing Discipline Modules</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__qdisc__obj.html">Queueing Discipline Object</a></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> QDisc Addition</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct nl_msg * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__qdisc.html#ga863dae227b2c7cb28475f10b2934e114">rtnl_qdisc_build_add_request</a> (struct rtnl_qdisc *qdisc, int flags)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Build a netlink message to add a new qdisc. <a href="#ga863dae227b2c7cb28475f10b2934e114"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__qdisc.html#ga4d475717e86a26b929fe4cf04e76d1e6">rtnl_qdisc_add</a> (struct nl_handle *handle, struct rtnl_qdisc *qdisc, int flags)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Add a new qdisc. <a href="#ga4d475717e86a26b929fe4cf04e76d1e6"></a><br/></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> QDisc Modification</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct nl_msg * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__qdisc.html#gab34941a68da0c7cc1416c2d619d2b291">rtnl_qdisc_build_change_request</a> (struct rtnl_qdisc *qdisc, struct rtnl_qdisc *new)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Build a netlink message to change attributes of a existing qdisc. <a href="#gab34941a68da0c7cc1416c2d619d2b291"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__qdisc.html#ga8c9da85cd2e50a12491d940136379a6a">rtnl_qdisc_change</a> (struct nl_handle *handle, struct rtnl_qdisc *qdisc, struct rtnl_qdisc *new)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Change attributes of a qdisc. <a href="#ga8c9da85cd2e50a12491d940136379a6a"></a><br/></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> QDisc Deletion</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct nl_msg * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__qdisc.html#ga093a65cd211b1b475469a6568a5ef377">rtnl_qdisc_build_delete_request</a> (struct rtnl_qdisc *qdisc)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Build a netlink request message to delete a qdisc. <a href="#ga093a65cd211b1b475469a6568a5ef377"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__qdisc.html#ga9b930a7488d5e8b88e8f579a6380c85c">rtnl_qdisc_delete</a> (struct nl_handle *handle, struct rtnl_qdisc *qdisc)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Delete a qdisc. <a href="#ga9b930a7488d5e8b88e8f579a6380c85c"></a><br/></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Qdisc Cache Management</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct nl_cache * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__qdisc.html#ga66f21501cb2241b86a504038cdc197d5">rtnl_qdisc_alloc_cache</a> (struct nl_handle *handle)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Build a qdisc cache including all qdiscs currently configured in the kernel. <a href="#ga66f21501cb2241b86a504038cdc197d5"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct rtnl_qdisc * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__qdisc.html#gaa93df0077a2748e7464962e0e9dc968d">rtnl_qdisc_get_by_parent</a> (struct nl_cache *cache, int ifindex, uint32_t parent)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Look up qdisc by its parent in the provided cache. <a href="#gaa93df0077a2748e7464962e0e9dc968d"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct rtnl_qdisc * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__qdisc.html#ga4b2e6e757746a12f752859bef79a17a3">rtnl_qdisc_get</a> (struct nl_cache *cache, int ifindex, uint32_t handle)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Look up qdisc by its handle in the provided cache. <a href="#ga4b2e6e757746a12f752859bef79a17a3"></a><br/></td></tr> </table> <hr/><a name="_details"></a><h2>Detailed Description</h2> <dl class="user"><dt><b>Qdisc Handles</b></dt><dd>In general, qdiscs are identified by the major part of a traffic control handle (the upper 16 bits). A few special values exist though:<ul> <li><code>TC_H_ROOT:</code> root qdisc (directly attached to the device)</li> <li><code>TC_H_INGRESS:</code> ingress qdisc (directly attached to the device)</li> <li><code>TC_H_UNSPEC:</code> unspecified qdisc (no reference)</li> </ul> </dd></dl> <dl class="user"><dt><b>1) Adding a Qdisc</b></dt><dd><div class="fragment"><pre class="fragment"> <span class="comment">// Allocate a new empty qdisc to be filled out</span> <span class="keyword">struct </span>rtnl_qdisc *qdisc = rtnl_qdisc_alloc(); <span class="comment">// ... specify the kind of the Qdisc</span> rtnl_qdisc_set_kind(qdisc, <span class="stringliteral">"pfifo"</span>); <span class="comment">// Specify the device the qdisc should be attached to</span> rtnl_qdisc_set_ifindex(qdisc, ifindex); <span class="comment">// ... specify the parent qdisc</span> rtnl_qdisc_set_parent(qdisc, TC_H_ROOT); <span class="comment">// Specifying the handle is not required but makes reidentifying easier</span> <span class="comment">// and may help to avoid adding a qdisc twice.</span> rtnl_qdisc_set_handle(qdisc, 0x000A0000); <span class="comment">// Now on to specify the qdisc specific options, see the relevant qdisc</span> <span class="comment">// modules for documentation, in this example we set the upper limit of</span> <span class="comment">// the packet fifo qdisc to 64</span> <a class="code" href="group__fifo.html#gac3de03e9d829b5d884b52c668e972c1e" title="Set limit of FIFO qdisc.">rtnl_qdisc_fifo_set_limit</a>(qdisc, 64); <a class="code" href="group__qdisc.html#ga4d475717e86a26b929fe4cf04e76d1e6" title="Add a new qdisc.">rtnl_qdisc_add</a>(handle, qdisc, NLM_R_REPLACE); <span class="comment">// Free up the memory</span> rtnl_qdisc_put(qdisc); </pre></div></dd></dl> <dl class="user"><dt><b>2) Deleting a Qdisc</b></dt><dd><div class="fragment"><pre class="fragment"> <span class="comment">// Allocate a new empty qdisc to be filled out with the parameters</span> <span class="comment">// specifying the qdisc to be deleted. Alternatively a fully equiped</span> <span class="comment">// Qdisc object from a cache can be used.</span> <span class="keyword">struct </span>rtnl_qdisc *qdisc = rtnl_qdisc_alloc(); <span class="comment">// The interface index of the device the qdisc is on and the parent handle</span> <span class="comment">// are the least required fields to be filled out.</span> <span class="comment">// Note: Specify TC_H_ROOT or TC_H_INGRESS as parent handle to delete the</span> <span class="comment">// root respectively root ingress qdisc.</span> rtnl_qdisc_set_ifindex(qdisc, ifindex); rtnl_qdisc_set_parent(qdisc, parent_handle); <span class="comment">// If required for identification, the handle can be specified as well.</span> rtnl_qdisc_set_handle(qdisc, qdisc_handle); <span class="comment">// Not required but maybe helpful as sanity check, the kind of the qdisc</span> <span class="comment">// can be specified to avoid mistakes.</span> rtnl_qdisc_set_kind(qdisc, <span class="stringliteral">"pfifo"</span>); <span class="comment">// Finally delete the qdisc with rtnl_qdisc_delete(), alternatively</span> <span class="comment">// rtnl_qdisc_build_delete_request() can be invoked to generate an</span> <span class="comment">// appropritate netlink message to send out.</span> <a class="code" href="group__qdisc.html#ga9b930a7488d5e8b88e8f579a6380c85c" title="Delete a qdisc.">rtnl_qdisc_delete</a>(handle, qdisc); <span class="comment">// Free up the memory</span> rtnl_qdisc_put(qdisc); </pre></div> </dd></dl> <hr/><h2>Function Documentation</h2> <a class="anchor" id="ga863dae227b2c7cb28475f10b2934e114"></a><!-- doxytag: member="qdisc.c::rtnl_qdisc_build_add_request" ref="ga863dae227b2c7cb28475f10b2934e114" args="(struct rtnl_qdisc *qdisc, int flags)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">struct nl_msg* rtnl_qdisc_build_add_request </td> <td>(</td> <td class="paramtype">struct rtnl_qdisc * </td> <td class="paramname"><em>qdisc</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>flags</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td><code> [read]</code></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">qdisc</td><td>qdisc to add </td></tr> <tr><td class="paramname">flags</td><td>additional netlink message flags</td></tr> </table> </dd> </dl> <p>Builds a new netlink message requesting an addition of a qdisc. The netlink message header isn't fully equipped with all relevant fields and must be sent out via <a class="el" href="group__nl.html#ga01a2aad82350f867e704d5c696438b60" title="Send netlink message and check & extend header values as needed.">nl_send_auto_complete()</a> or supplemented as needed.</p> <p>Common message flags used:</p> <ul> <li>NLM_F_REPLACE - replace a potential existing qdisc</li> </ul> <dl class="return"><dt><b>Returns:</b></dt><dd>New netlink message </dd></dl> <p>Definition at line <a class="el" href="qdisc_8c_source.html#l00197">197</a> of file <a class="el" href="qdisc_8c_source.html">qdisc.c</a>.</p> <p>References <a class="el" href="netlink-kernel_8h_source.html#l00134">NLM_F_CREATE</a>.</p> <p>Referenced by <a class="el" href="qdisc_8c_source.html#l00224">rtnl_qdisc_add()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keyword">struct </span>nl_msg *msg; msg = qdisc_build(qdisc, RTM_NEWQDISC, <a class="code" href="group__msg.html#ga20a00ae52e4c150f54649d7346d23a7a" title="Create config object if it doesn&#39;t already exist.">NLM_F_CREATE</a> | flags); <span class="keywordflow">if</span> (!msg) nl_errno(ENOMEM); <span class="keywordflow">return</span> msg; } </pre></div> </div> </div> <a class="anchor" id="ga4d475717e86a26b929fe4cf04e76d1e6"></a><!-- doxytag: member="qdisc.c::rtnl_qdisc_add" ref="ga4d475717e86a26b929fe4cf04e76d1e6" args="(struct nl_handle *handle, struct rtnl_qdisc *qdisc, int flags)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int rtnl_qdisc_add </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">struct rtnl_qdisc * </td> <td class="paramname"><em>qdisc</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">qdisc</td><td>qdisc to delete </td></tr> <tr><td class="paramname">flags</td><td>additional netlink message flags</td></tr> </table> </dd> </dl> <p>Builds a netlink message by calling <a class="el" href="group__qdisc.html#ga863dae227b2c7cb28475f10b2934e114" title="Build a netlink message to add a new qdisc.">rtnl_qdisc_build_add_request()</a>, sends the request to the kernel and waits for the ACK to be received and thus blocks until the request has been processed.</p> <p>Common message flags used:</p> <ul> <li>NLM_F_REPLACE - replace a potential existing qdisc</li> </ul> <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="qdisc_8c_source.html#l00224">224</a> of file <a class="el" href="qdisc_8c_source.html">qdisc.c</a>.</p> <p>References <a class="el" href="nl_8c_source.html#l00373">nl_send_auto_complete()</a>, <a class="el" href="nl_8c_source.html#l00800">nl_wait_for_ack()</a>, <a class="el" href="msg_8c_source.html#l00656">nlmsg_free()</a>, and <a class="el" href="qdisc_8c_source.html#l00197">rtnl_qdisc_build_add_request()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keyword">struct </span>nl_msg *msg; <span class="keywordtype">int</span> err; msg = <a class="code" href="group__qdisc.html#ga863dae227b2c7cb28475f10b2934e114" title="Build a netlink message to add a new qdisc.">rtnl_qdisc_build_add_request</a>(qdisc, flags); <span class="keywordflow">if</span> (!msg) <span class="keywordflow">return</span> nl_errno(ENOMEM); err = <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>(handle, msg); <span class="keywordflow">if</span> (err < 0) <span class="keywordflow">return</span> err; <a class="code" href="group__msg.html#ga138ba9bee70553f9fbe7143deacad48c" title="Free a netlink message.">nlmsg_free</a>(msg); <span class="keywordflow">return</span> <a class="code" href="group__nl.html#gaa65fec588e0a0a2de1881fb8366ccd79" title="Wait for ACK.">nl_wait_for_ack</a>(handle); } </pre></div> </div> </div> <a class="anchor" id="gab34941a68da0c7cc1416c2d619d2b291"></a><!-- doxytag: member="qdisc.c::rtnl_qdisc_build_change_request" ref="gab34941a68da0c7cc1416c2d619d2b291" args="(struct rtnl_qdisc *qdisc, struct rtnl_qdisc *new)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">struct nl_msg* rtnl_qdisc_build_change_request </td> <td>(</td> <td class="paramtype">struct rtnl_qdisc * </td> <td class="paramname"><em>qdisc</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">struct rtnl_qdisc * </td> <td class="paramname"><em>new</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">qdisc</td><td>qdisc to change </td></tr> <tr><td class="paramname">new</td><td>new qdisc attributes</td></tr> </table> </dd> </dl> <p>Builds a new netlink message requesting an change of qdisc attributes. The netlink message header isn't fully equipped with all relevant fields and must be sent out via <a class="el" href="group__nl.html#ga01a2aad82350f867e704d5c696438b60" title="Send netlink message and check & extend header values as needed.">nl_send_auto_complete()</a> or supplemented as needed.</p> <dl class="return"><dt><b>Returns:</b></dt><dd>New netlink message </dd></dl> <p>Definition at line <a class="el" href="qdisc_8c_source.html#l00261">261</a> of file <a class="el" href="qdisc_8c_source.html">qdisc.c</a>.</p> <p>References <a class="el" href="netlink-kernel_8h_source.html#l00124">NLM_F_REPLACE</a>.</p> <p>Referenced by <a class="el" href="qdisc_8c_source.html#l00279">rtnl_qdisc_change()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordflow">return</span> qdisc_build(qdisc, RTM_NEWQDISC, <a class="code" href="group__msg.html#ga508feb1b826c0b8f6b2487c682ddb734" title="Replace existing matching config object with this request.">NLM_F_REPLACE</a>); } </pre></div> </div> </div> <a class="anchor" id="ga8c9da85cd2e50a12491d940136379a6a"></a><!-- doxytag: member="qdisc.c::rtnl_qdisc_change" ref="ga8c9da85cd2e50a12491d940136379a6a" args="(struct nl_handle *handle, struct rtnl_qdisc *qdisc, struct rtnl_qdisc *new)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int rtnl_qdisc_change </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">struct rtnl_qdisc * </td> <td class="paramname"><em>qdisc</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">struct rtnl_qdisc * </td> <td class="paramname"><em>new</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">qdisc</td><td>qdisc to change </td></tr> <tr><td class="paramname">new</td><td>new qdisc attributes</td></tr> </table> </dd> </dl> <p>Builds a netlink message by calling <a class="el" href="group__qdisc.html#gab34941a68da0c7cc1416c2d619d2b291" title="Build a netlink message to change attributes of a existing qdisc.">rtnl_qdisc_build_change_request()</a>, sends the request to the kernel and waits for the ACK to be received and thus blocks until the request has been processed.</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="qdisc_8c_source.html#l00279">279</a> of file <a class="el" href="qdisc_8c_source.html">qdisc.c</a>.</p> <p>References <a class="el" href="nl_8c_source.html#l00373">nl_send_auto_complete()</a>, <a class="el" href="nl_8c_source.html#l00800">nl_wait_for_ack()</a>, <a class="el" href="msg_8c_source.html#l00656">nlmsg_free()</a>, and <a class="el" href="qdisc_8c_source.html#l00261">rtnl_qdisc_build_change_request()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keyword">struct </span>nl_msg *msg; <span class="keywordtype">int</span> err; msg = <a class="code" href="group__qdisc.html#gab34941a68da0c7cc1416c2d619d2b291" title="Build a netlink message to change attributes of a existing qdisc.">rtnl_qdisc_build_change_request</a>(qdisc, <span class="keyword">new</span>); <span class="keywordflow">if</span> (!msg) <span class="keywordflow">return</span> nl_errno(ENOMEM); err = <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>(handle, msg); <span class="keywordflow">if</span> (err < 0) <span class="keywordflow">return</span> err; <a class="code" href="group__msg.html#ga138ba9bee70553f9fbe7143deacad48c" title="Free a netlink message.">nlmsg_free</a>(msg); <span class="keywordflow">return</span> <a class="code" href="group__nl.html#gaa65fec588e0a0a2de1881fb8366ccd79" title="Wait for ACK.">nl_wait_for_ack</a>(handle); } </pre></div> </div> </div> <a class="anchor" id="ga093a65cd211b1b475469a6568a5ef377"></a><!-- doxytag: member="qdisc.c::rtnl_qdisc_build_delete_request" ref="ga093a65cd211b1b475469a6568a5ef377" args="(struct rtnl_qdisc *qdisc)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">struct nl_msg* rtnl_qdisc_build_delete_request </td> <td>(</td> <td class="paramtype">struct rtnl_qdisc * </td> <td class="paramname"><em>qdisc</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">qdisc</td><td>qdisc to delete</td></tr> </table> </dd> </dl> <p>Builds a new netlink message requesting a deletion of a qdisc. The netlink message header isn't fully equipped with all relevant fields and must thus be sent out via <a class="el" href="group__nl.html#ga01a2aad82350f867e704d5c696438b60" title="Send netlink message and check & extend header values as needed.">nl_send_auto_complete()</a> or supplemented as needed.</p> <dl class="return"><dt><b>Returns:</b></dt><dd>New netlink message </dd></dl> <p>Definition at line <a class="el" href="qdisc_8c_source.html#l00315">315</a> of file <a class="el" href="qdisc_8c_source.html">qdisc.c</a>.</p> <p>References <a class="el" href="msg_8c_source.html#l00448">nlmsg_alloc_simple()</a>, and <a class="el" href="msg_8c_source.html#l00549">nlmsg_append()</a>.</p> <p>Referenced by <a class="el" href="qdisc_8c_source.html#l00348">rtnl_qdisc_delete()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keyword">struct </span>nl_msg *msg; <span class="keyword">struct </span>tcmsg tchdr; <span class="keywordtype">int</span> required = TCA_ATTR_IFINDEX | TCA_ATTR_PARENT; <span class="keywordflow">if</span> ((qdisc->ce_mask & required) != required) BUG(); msg = <a class="code" href="group__msg.html#ga580d8697d19050c55060bc10ab4eae9f" title="Allocate a new netlink message.">nlmsg_alloc_simple</a>(RTM_DELQDISC, 0); <span class="keywordflow">if</span> (!msg) <span class="keywordflow">return</span> NULL; tchdr.tcm_family = AF_UNSPEC, tchdr.tcm_handle = qdisc->q_handle, tchdr.tcm_parent = qdisc->q_parent, tchdr.tcm_ifindex = qdisc->q_ifindex, <a class="code" href="group__msg.html#gacc5e5ade5675d041f86c7c8693f7088d" title="Append data to tail of a netlink message.">nlmsg_append</a>(msg, &tchdr, <span class="keyword">sizeof</span>(tchdr), NLMSG_ALIGNTO); <span class="keywordflow">return</span> msg; } </pre></div> </div> </div> <a class="anchor" id="ga9b930a7488d5e8b88e8f579a6380c85c"></a><!-- doxytag: member="qdisc.c::rtnl_qdisc_delete" ref="ga9b930a7488d5e8b88e8f579a6380c85c" args="(struct nl_handle *handle, struct rtnl_qdisc *qdisc)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int rtnl_qdisc_delete </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">struct rtnl_qdisc * </td> <td class="paramname"><em>qdisc</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">qdisc</td><td>qdisc to delete</td></tr> </table> </dd> </dl> <p>Builds a netlink message by calling <a class="el" href="group__qdisc.html#ga093a65cd211b1b475469a6568a5ef377" title="Build a netlink request message to delete a qdisc.">rtnl_qdisc_build_delete_request()</a>, sends the request to the kernel and waits for the ACK to be received and thus blocks until the request has been processed.</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="qdisc_8c_source.html#l00348">348</a> of file <a class="el" href="qdisc_8c_source.html">qdisc.c</a>.</p> <p>References <a class="el" href="nl_8c_source.html#l00373">nl_send_auto_complete()</a>, <a class="el" href="nl_8c_source.html#l00800">nl_wait_for_ack()</a>, <a class="el" href="msg_8c_source.html#l00656">nlmsg_free()</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="keywordtype">int</span> err; msg = <a class="code" href="group__qdisc.html#ga093a65cd211b1b475469a6568a5ef377" title="Build a netlink request message to delete a qdisc.">rtnl_qdisc_build_delete_request</a>(qdisc); <span class="keywordflow">if</span> (!msg) <span class="keywordflow">return</span> nl_errno(ENOMEM); err = <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>(handle, msg); <span class="keywordflow">if</span> (err < 0) <span class="keywordflow">return</span> err; <a class="code" href="group__msg.html#ga138ba9bee70553f9fbe7143deacad48c" title="Free a netlink message.">nlmsg_free</a>(msg); <span class="keywordflow">return</span> <a class="code" href="group__nl.html#gaa65fec588e0a0a2de1881fb8366ccd79" title="Wait for ACK.">nl_wait_for_ack</a>(handle); } </pre></div> </div> </div> <a class="anchor" id="ga66f21501cb2241b86a504038cdc197d5"></a><!-- doxytag: member="qdisc.c::rtnl_qdisc_alloc_cache" ref="ga66f21501cb2241b86a504038cdc197d5" args="(struct nl_handle *handle)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">struct nl_cache* rtnl_qdisc_alloc_cache </td> <td>(</td> <td class="paramtype">struct nl_handle * </td> <td class="paramname"><em>handle</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">handle</td><td>netlink handle</td></tr> </table> </dd> </dl> <p>Allocates a new cache, initializes it properly and updates it to include all qdiscs currently configured in the kernel.</p> <dl class="note"><dt><b>Note:</b></dt><dd>The caller is responsible for destroying and freeing the cache after using it. </dd></dl> <dl class="return"><dt><b>Returns:</b></dt><dd>The cache or NULL if an error has occured. </dd></dl> <p>Definition at line <a class="el" href="qdisc_8c_source.html#l00384">384</a> of file <a class="el" href="qdisc_8c_source.html">qdisc.c</a>.</p> <p>References <a class="el" href="cache_8c_source.html#l00173">nl_cache_alloc()</a>, <a class="el" href="cache_8c_source.html#l00265">nl_cache_free()</a>, and <a class="el" href="cache_8c_source.html#l00662">nl_cache_refill()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keyword">struct </span>nl_cache * cache; cache = <a class="code" href="group__cache.html#ga9520ae0f2158db3c081f34c851d92252" title="Allocate an empty cache.">nl_cache_alloc</a>(&<a class="code" href="structrtnl__qdisc__ops.html" title="Qdisc Operations.">rtnl_qdisc_ops</a>); <span class="keywordflow">if</span> (cache == NULL) <span class="keywordflow">return</span> NULL; <span class="keywordflow">if</span> (handle && <a class="code" href="group__cache.html#gaf5bd584017847e6ef69ec36739a6aaf0" title="(Re)fill a cache with the contents in the kernel.">nl_cache_refill</a>(handle, cache) < 0) { <a class="code" href="group__cache.html#ga530c896db26d72001d011114b1e6cfaa" title="Free a cache.">nl_cache_free</a>(cache); <span class="keywordflow">return</span> NULL; } <span class="keywordflow">return</span> cache; } </pre></div> </div> </div> <a class="anchor" id="gaa93df0077a2748e7464962e0e9dc968d"></a><!-- doxytag: member="qdisc.c::rtnl_qdisc_get_by_parent" ref="gaa93df0077a2748e7464962e0e9dc968d" args="(struct nl_cache *cache, int ifindex, uint32_t parent)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">struct rtnl_qdisc* rtnl_qdisc_get_by_parent </td> <td>(</td> <td class="paramtype">struct nl_cache * </td> <td class="paramname"><em>cache</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>ifindex</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">uint32_t </td> <td class="paramname"><em>parent</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">cache</td><td>qdisc cache </td></tr> <tr><td class="paramname">ifindex</td><td>interface the qdisc is attached to </td></tr> <tr><td class="paramname">parent</td><td>parent handle </td></tr> </table> </dd> </dl> <dl class="return"><dt><b>Returns:</b></dt><dd>pointer to qdisc inside the cache or NULL if no match was found. </dd></dl> <p>Definition at line <a class="el" href="qdisc_8c_source.html#l00407">407</a> of file <a class="el" href="qdisc_8c_source.html">qdisc.c</a>.</p> <p>References <a class="el" href="object_8c_source.html#l00162">nl_object_get()</a>.</p> <p>Referenced by <a class="el" href="class__obj_8c_source.html#l00145">rtnl_class_leaf_qdisc()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keyword">struct </span>rtnl_qdisc *q; <span class="keywordflow">if</span> (cache->c_ops != &<a class="code" href="structrtnl__qdisc__ops.html" title="Qdisc Operations.">rtnl_qdisc_ops</a>) <span class="keywordflow">return</span> NULL; nl_list_for_each_entry(q, &cache->c_items, ce_list) { <span class="keywordflow">if</span> (q->q_parent == parent && q->q_ifindex == ifindex) { <a class="code" href="group__object.html#gabd5767ac47ec6f09d1ac643f44eb8bfd" title="Acquire a reference on a object.">nl_object_get</a>((<span class="keyword">struct</span> nl_object *) q); <span class="keywordflow">return</span> q; } } <span class="keywordflow">return</span> NULL; } </pre></div> </div> </div> <a class="anchor" id="ga4b2e6e757746a12f752859bef79a17a3"></a><!-- doxytag: member="qdisc.c::rtnl_qdisc_get" ref="ga4b2e6e757746a12f752859bef79a17a3" args="(struct nl_cache *cache, int ifindex, uint32_t handle)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">struct rtnl_qdisc* rtnl_qdisc_get </td> <td>(</td> <td class="paramtype">struct nl_cache * </td> <td class="paramname"><em>cache</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>ifindex</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">uint32_t </td> <td class="paramname"><em>handle</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">cache</td><td>qdisc cache </td></tr> <tr><td class="paramname">ifindex</td><td>interface the qdisc is attached to </td></tr> <tr><td class="paramname">handle</td><td>qdisc handle </td></tr> </table> </dd> </dl> <dl class="return"><dt><b>Returns:</b></dt><dd>pointer to qdisc inside the cache or NULL if no match was found. </dd></dl> <p>Definition at line <a class="el" href="qdisc_8c_source.html#l00432">432</a> of file <a class="el" href="qdisc_8c_source.html">qdisc.c</a>.</p> <p>References <a class="el" href="object_8c_source.html#l00162">nl_object_get()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keyword">struct </span>rtnl_qdisc *q; <span class="keywordflow">if</span> (cache->c_ops != &<a class="code" href="structrtnl__qdisc__ops.html" title="Qdisc Operations.">rtnl_qdisc_ops</a>) <span class="keywordflow">return</span> NULL; nl_list_for_each_entry(q, &cache->c_items, ce_list) { <span class="keywordflow">if</span> (q->q_handle == handle && q->q_ifindex == ifindex) { <a class="code" href="group__object.html#gabd5767ac47ec6f09d1ac643f44eb8bfd" title="Acquire a reference on a object.">nl_object_get</a>((<span class="keyword">struct</span> nl_object *) q); <span class="keywordflow">return</span> q; } } <span class="keywordflow">return</span> NULL; } </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>