Sophie

Sophie

distrib > Fedora > 14 > x86_64 > by-pkgid > 87b89b73c41f4440bb86afd421c7548f > files > 157

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: 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&#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>  </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 &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structrtnl__qdisc__ops.html">rtnl_qdisc_ops</a></td></tr>
<tr><td class="mdescLeft">&#160;</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">&#160;</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">&#160;</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 *&#160;</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">&#160;</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&#160;</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">&#160;</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 *&#160;</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">&#160;</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&#160;</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">&#160;</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 *&#160;</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">&#160;</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&#160;</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">&#160;</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 *&#160;</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">&#160;</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 *&#160;</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">&#160;</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 *&#160;</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">&#160;</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">&quot;pfifo&quot;</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">&quot;pfifo&quot;</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 *&#160;</td>
          <td class="paramname"><em>qdisc</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">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 &amp; 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&amp;#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 *&#160;</td>
          <td class="paramname"><em>handle</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">struct rtnl_qdisc *&#160;</td>
          <td class="paramname"><em>qdisc</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></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;amp; extend header values as needed.">nl_send_auto_complete</a>(handle, msg);
        <span class="keywordflow">if</span> (err &lt; 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 *&#160;</td>
          <td class="paramname"><em>qdisc</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">struct rtnl_qdisc *&#160;</td>
          <td class="paramname"><em>new</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">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 &amp; 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 *&#160;</td>
          <td class="paramname"><em>handle</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">struct rtnl_qdisc *&#160;</td>
          <td class="paramname"><em>qdisc</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">struct rtnl_qdisc *&#160;</td>
          <td class="paramname"><em>new</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">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;amp; extend header values as needed.">nl_send_auto_complete</a>(handle, msg);
        <span class="keywordflow">if</span> (err &lt; 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 *&#160;</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 &amp; 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-&gt;ce_mask &amp; 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-&gt;q_handle,
        tchdr.tcm_parent = qdisc-&gt;q_parent,
        tchdr.tcm_ifindex = qdisc-&gt;q_ifindex,
        <a class="code" href="group__msg.html#gacc5e5ade5675d041f86c7c8693f7088d" title="Append data to tail of a netlink message.">nlmsg_append</a>(msg, &amp;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 *&#160;</td>
          <td class="paramname"><em>handle</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">struct rtnl_qdisc *&#160;</td>
          <td class="paramname"><em>qdisc</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">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;amp; extend header values as needed.">nl_send_auto_complete</a>(handle, msg);
        <span class="keywordflow">if</span> (err &lt; 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 *&#160;</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>(&amp;<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 &amp;&amp; <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) &lt; 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 *&#160;</td>
          <td class="paramname"><em>cache</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>ifindex</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">uint32_t&#160;</td>
          <td class="paramname"><em>parent</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">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-&gt;c_ops != &amp;<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, &amp;cache-&gt;c_items, ce_list) {
                <span class="keywordflow">if</span> (q-&gt;q_parent == parent &amp;&amp; q-&gt;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 *&#160;</td>
          <td class="paramname"><em>cache</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>ifindex</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">uint32_t&#160;</td>
          <td class="paramname"><em>handle</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">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-&gt;c_ops != &amp;<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, &amp;cache-&gt;c_items, ce_list) {
                <span class="keywordflow">if</span> (q-&gt;q_handle == handle &amp;&amp; q-&gt;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&#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>