Sophie

Sophie

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

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: lib/route/tc.c Source File</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 class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
    </ul>
  </div>
<div class="header">
  <div class="headertitle">
<h1>lib/route/tc.c</h1>  </div>
</div>
<div class="contents">
<div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> * lib/route/tc.c               Traffic Control</span>
<a name="l00003"></a>00003 <span class="comment"> *</span>
<a name="l00004"></a>00004 <span class="comment"> *      This library is free software; you can redistribute it and/or</span>
<a name="l00005"></a>00005 <span class="comment"> *      modify it under the terms of the GNU Lesser General Public</span>
<a name="l00006"></a>00006 <span class="comment"> *      License as published by the Free Software Foundation version 2.1</span>
<a name="l00007"></a>00007 <span class="comment"> *      of the License.</span>
<a name="l00008"></a>00008 <span class="comment"> *</span>
<a name="l00009"></a>00009 <span class="comment"> * Copyright (c) 2003-2006 Thomas Graf &lt;tgraf@suug.ch&gt;</span>
<a name="l00010"></a>00010 <span class="comment"> */</span>
<a name="l00011"></a>00011 <span class="comment"></span>
<a name="l00012"></a>00012 <span class="comment">/**</span>
<a name="l00013"></a>00013 <span class="comment"> * @ingroup rtnl</span>
<a name="l00014"></a>00014 <span class="comment"> * @defgroup tc Traffic Control</span>
<a name="l00015"></a>00015 <span class="comment"> * @brief</span>
<a name="l00016"></a>00016 <span class="comment"> * @{</span>
<a name="l00017"></a>00017 <span class="comment"> */</span>
<a name="l00018"></a>00018 
<a name="l00019"></a>00019 <span class="preprocessor">#include &lt;netlink-local.h&gt;</span>
<a name="l00020"></a>00020 <span class="preprocessor">#include &lt;netlink-tc.h&gt;</span>
<a name="l00021"></a>00021 <span class="preprocessor">#include &lt;netlink/netlink.h&gt;</span>
<a name="l00022"></a>00022 <span class="preprocessor">#include &lt;netlink/utils.h&gt;</span>
<a name="l00023"></a>00023 <span class="preprocessor">#include &lt;netlink/route/rtnl.h&gt;</span>
<a name="l00024"></a>00024 <span class="preprocessor">#include &lt;netlink/route/link.h&gt;</span>
<a name="l00025"></a>00025 <span class="preprocessor">#include &lt;netlink/route/tc.h&gt;</span>
<a name="l00026"></a>00026 <span class="comment"></span>
<a name="l00027"></a>00027 <span class="comment">/** @cond SKIP */</span>
<a name="l00028"></a>00028 
<a name="l00029"></a>00029 <span class="keyword">static</span> <span class="keyword">struct </span><a class="code" href="structnla__policy.html" title="attribute validation policy">nla_policy</a> tc_policy[TCA_MAX+1] = {
<a name="l00030"></a>00030         [TCA_KIND]      = { .<a class="code" href="structnla__policy.html#aaa36c9d1e298fc9e4ee16a8fb553b32a" title="Type of attribute or NLA_UNSPEC.">type</a> = <a class="code" href="group__attr.html#gga06fc87d81c62e9abb8790b6e5713c55ba284d1eafd6d5d99cedaff3cd5f5a8378" title="character string">NLA_STRING</a>,
<a name="l00031"></a>00031                             .maxlen = TCKINDSIZ },
<a name="l00032"></a>00032         [TCA_STATS]     = { .minlen = <span class="keyword">sizeof</span>(<span class="keyword">struct </span>tc_stats) },
<a name="l00033"></a>00033         [TCA_STATS2]    = { .type = <a class="code" href="group__attr.html#gga06fc87d81c62e9abb8790b6e5713c55ba925c06a260a9ffaef80ee4aa13738e19" title="nested attributes">NLA_NESTED</a> },
<a name="l00034"></a>00034 };
<a name="l00035"></a>00035 
<a name="l00036"></a>00036 <span class="keywordtype">int</span> tca_parse(<span class="keyword">struct</span> nlattr **tb, <span class="keywordtype">int</span> maxattr, <span class="keyword">struct</span> rtnl_tca *g,
<a name="l00037"></a>00037               <span class="keyword">struct</span> <a class="code" href="structnla__policy.html" title="attribute validation policy">nla_policy</a> *policy)
<a name="l00038"></a>00038 {
<a name="l00039"></a>00039         
<a name="l00040"></a>00040         <span class="keywordflow">if</span> (g-&gt;ce_mask &amp; TCA_ATTR_OPTS)
<a name="l00041"></a>00041                 <span class="keywordflow">return</span> <a class="code" href="group__attr.html#gaa7ad544b5a93034602a442eb26cda92c" title="Parse a stream of attributes into a tb buffer.">nla_parse</a>(tb, maxattr,
<a name="l00042"></a>00042                                  (<span class="keyword">struct</span> nlattr *) g-&gt;tc_opts-&gt;d_data,
<a name="l00043"></a>00043                                  g-&gt;tc_opts-&gt;d_size, policy);
<a name="l00044"></a>00044         <span class="keywordflow">else</span> {
<a name="l00045"></a>00045                 <span class="comment">/* Ugly but tb[] must be in a defined state even if no</span>
<a name="l00046"></a>00046 <span class="comment">                 * attributes can be found. */</span>
<a name="l00047"></a>00047                 memset(tb, 0, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> nlattr *) * (maxattr + 1));
<a name="l00048"></a>00048                 <span class="keywordflow">return</span> 0;
<a name="l00049"></a>00049         }
<a name="l00050"></a>00050 }
<a name="l00051"></a>00051 
<a name="l00052"></a>00052 <span class="keyword">static</span> <span class="keyword">struct </span><a class="code" href="structnla__policy.html" title="attribute validation policy">nla_policy</a> tc_stats2_policy[TCA_STATS_MAX+1] = {
<a name="l00053"></a>00053         [TCA_STATS_BASIC]    = { .<a class="code" href="structnla__policy.html#a70310d3332cb82c390754bd70b1cb7dd" title="Minimal length of payload required to be available.">minlen</a> = <span class="keyword">sizeof</span>(<span class="keyword">struct </span>gnet_stats_basic) },
<a name="l00054"></a>00054         [TCA_STATS_RATE_EST] = { .minlen = <span class="keyword">sizeof</span>(<span class="keyword">struct </span>gnet_stats_rate_est) },
<a name="l00055"></a>00055         [TCA_STATS_QUEUE]    = { .minlen = <span class="keyword">sizeof</span>(<span class="keyword">struct </span>gnet_stats_queue) },
<a name="l00056"></a>00056 };
<a name="l00057"></a>00057 
<a name="l00058"></a>00058 <span class="keywordtype">int</span> tca_msg_parser(<span class="keyword">struct</span> <a class="code" href="structnlmsghdr.html" title="Netlink message header.">nlmsghdr</a> *n, <span class="keyword">struct</span> rtnl_tca *g)
<a name="l00059"></a>00059 {
<a name="l00060"></a>00060         <span class="keyword">struct </span>nlattr *tb[TCA_MAX + 1];
<a name="l00061"></a>00061         <span class="keyword">struct </span>tcmsg *tm;
<a name="l00062"></a>00062         <span class="keywordtype">int</span> err;
<a name="l00063"></a>00063 
<a name="l00064"></a>00064         err = <a class="code" href="group__msg.html#ga2671eefe95c3e44dec8ddab51ae57593" title="parse attributes of a netlink message">nlmsg_parse</a>(n, <span class="keyword">sizeof</span>(*tm), tb, TCA_MAX, tc_policy);
<a name="l00065"></a>00065         <span class="keywordflow">if</span> (err &lt; 0)
<a name="l00066"></a>00066                 <span class="keywordflow">return</span> err;
<a name="l00067"></a>00067 
<a name="l00068"></a>00068         <span class="keywordflow">if</span> (tb[TCA_KIND] == NULL)
<a name="l00069"></a>00069                 <span class="keywordflow">return</span> nl_error(EINVAL, <span class="stringliteral">&quot;Missing tca kind TLV&quot;</span>);
<a name="l00070"></a>00070 
<a name="l00071"></a>00071         <a class="code" href="group__attr.html#gaabddc8018334423d84088d241b4b7830" title="Copy string attribute payload into a sized buffer.">nla_strlcpy</a>(g-&gt;tc_kind, tb[TCA_KIND], TCKINDSIZ);
<a name="l00072"></a>00072 
<a name="l00073"></a>00073         tm = <a class="code" href="group__msg.html#gae44a904bb40c8b5f5ff31539c21cfa5a" title="head of message payload">nlmsg_data</a>(n);
<a name="l00074"></a>00074         g-&gt;tc_family  = tm-&gt;tcm_family;
<a name="l00075"></a>00075         g-&gt;tc_ifindex = tm-&gt;tcm_ifindex;
<a name="l00076"></a>00076         g-&gt;tc_handle  = tm-&gt;tcm_handle;
<a name="l00077"></a>00077         g-&gt;tc_parent  = tm-&gt;tcm_parent;
<a name="l00078"></a>00078         g-&gt;tc_info    = tm-&gt;tcm_info;
<a name="l00079"></a>00079 
<a name="l00080"></a>00080         g-&gt;ce_mask = (TCA_ATTR_FAMILY | TCA_ATTR_IFINDEX | TCA_ATTR_HANDLE |
<a name="l00081"></a>00081                       TCA_ATTR_PARENT | TCA_ATTR_INFO | TCA_ATTR_KIND);
<a name="l00082"></a>00082 
<a name="l00083"></a>00083         <span class="keywordflow">if</span> (tb[TCA_OPTIONS]) {
<a name="l00084"></a>00084                 g-&gt;tc_opts = <a class="code" href="group__attr.html#ga33a5aef23c5d26c8247632ed1f167068" title="Return payload of abstract data attribute.">nla_get_data</a>(tb[TCA_OPTIONS]);
<a name="l00085"></a>00085                 <span class="keywordflow">if</span> (!g-&gt;tc_opts)
<a name="l00086"></a>00086                         <span class="keywordflow">return</span> nl_errno(ENOMEM);
<a name="l00087"></a>00087                 g-&gt;ce_mask |= TCA_ATTR_OPTS;
<a name="l00088"></a>00088         }
<a name="l00089"></a>00089         
<a name="l00090"></a>00090 
<a name="l00091"></a>00091         <span class="keywordflow">if</span> (tb[TCA_STATS2]) {
<a name="l00092"></a>00092                 <span class="keyword">struct </span>nlattr *tbs[TCA_STATS_MAX + 1];
<a name="l00093"></a>00093 
<a name="l00094"></a>00094                 err = <a class="code" href="group__attr.html#ga974ec0720b2d863a5c65da868bcb7a6e" title="parse nested attributes">nla_parse_nested</a>(tbs, TCA_STATS_MAX, tb[TCA_STATS2],
<a name="l00095"></a>00095                                        tc_stats2_policy);
<a name="l00096"></a>00096                 <span class="keywordflow">if</span> (err &lt; 0)
<a name="l00097"></a>00097                         <span class="keywordflow">return</span> err;
<a name="l00098"></a>00098 
<a name="l00099"></a>00099                 <span class="keywordflow">if</span> (tbs[TCA_STATS_BASIC]) {
<a name="l00100"></a>00100                         <span class="keyword">struct </span>gnet_stats_basic *bs;
<a name="l00101"></a>00101                         
<a name="l00102"></a>00102                         bs = <a class="code" href="group__attr.html#gaf39d6bbd2be1fc2de30b6b7d079a5fce" title="head of payload">nla_data</a>(tbs[TCA_STATS_BASIC]);
<a name="l00103"></a>00103                         g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0a48a501c10b68cfcad6a1d5578050591b" title="Bytes seen.">RTNL_TC_BYTES</a>]      = bs-&gt;bytes;
<a name="l00104"></a>00104                         g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0a45892528a489491962b1115d2a797ea6" title="Packets seen.">RTNL_TC_PACKETS</a>]    = bs-&gt;packets;
<a name="l00105"></a>00105                 }
<a name="l00106"></a>00106 
<a name="l00107"></a>00107                 <span class="keywordflow">if</span> (tbs[TCA_STATS_RATE_EST]) {
<a name="l00108"></a>00108                         <span class="keyword">struct </span>gnet_stats_rate_est *re;
<a name="l00109"></a>00109 
<a name="l00110"></a>00110                         re = <a class="code" href="group__attr.html#gaf39d6bbd2be1fc2de30b6b7d079a5fce" title="head of payload">nla_data</a>(tbs[TCA_STATS_RATE_EST]);
<a name="l00111"></a>00111                         g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0af5161062248e8d8b713b920df98fc63f" title="Current bits/s (rate estimator)">RTNL_TC_RATE_BPS</a>]   = re-&gt;bps;
<a name="l00112"></a>00112                         g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0ad592a1229cd73ced877fc88715bc5ba9" title="Current packet/s (rate estimator)">RTNL_TC_RATE_PPS</a>]   = re-&gt;pps;
<a name="l00113"></a>00113                 }
<a name="l00114"></a>00114                 
<a name="l00115"></a>00115                 <span class="keywordflow">if</span> (tbs[TCA_STATS_QUEUE]) {
<a name="l00116"></a>00116                         <span class="keyword">struct </span>gnet_stats_queue *q;
<a name="l00117"></a>00117 
<a name="l00118"></a>00118                         q = <a class="code" href="group__attr.html#gaf39d6bbd2be1fc2de30b6b7d079a5fce" title="head of payload">nla_data</a>(tbs[TCA_STATS_QUEUE]);
<a name="l00119"></a>00119                         g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0aa22bbf425d78526690cb0b4aa824e9d5" title="Queue length.">RTNL_TC_QLEN</a>]       = q-&gt;qlen;
<a name="l00120"></a>00120                         g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0ae44313687d6e8084549c9834a4a9e8a1" title="Backlog length.">RTNL_TC_BACKLOG</a>]    = q-&gt;backlog;
<a name="l00121"></a>00121                         g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0acc8892488b10b39081a3186ab8b01d99" title="Packets dropped.">RTNL_TC_DROPS</a>]      = q-&gt;drops;
<a name="l00122"></a>00122                         g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0adc557ea50891d76d451349421457f7ad" title="Number of requeues.">RTNL_TC_REQUEUES</a>]   = q-&gt;requeues;
<a name="l00123"></a>00123                         g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0ac3f814dae6f46241986f236ad867bb17" title="Number of overlimits.">RTNL_TC_OVERLIMITS</a>] = q-&gt;overlimits;
<a name="l00124"></a>00124                 }
<a name="l00125"></a>00125 
<a name="l00126"></a>00126                 g-&gt;ce_mask |= TCA_ATTR_STATS;
<a name="l00127"></a>00127                 
<a name="l00128"></a>00128                 <span class="keywordflow">if</span> (tbs[TCA_STATS_APP]) {
<a name="l00129"></a>00129                         g-&gt;tc_xstats = <a class="code" href="group__attr.html#ga33a5aef23c5d26c8247632ed1f167068" title="Return payload of abstract data attribute.">nla_get_data</a>(tbs[TCA_STATS_APP]);
<a name="l00130"></a>00130                         <span class="keywordflow">if</span> (g-&gt;tc_xstats == NULL)
<a name="l00131"></a>00131                                 <span class="keywordflow">return</span> -ENOMEM;
<a name="l00132"></a>00132                 } <span class="keywordflow">else</span>
<a name="l00133"></a>00133                         <span class="keywordflow">goto</span> compat_xstats;
<a name="l00134"></a>00134         } <span class="keywordflow">else</span> {
<a name="l00135"></a>00135                 <span class="keywordflow">if</span> (tb[TCA_STATS]) {
<a name="l00136"></a>00136                         <span class="keyword">struct </span>tc_stats *st = <a class="code" href="group__attr.html#gaf39d6bbd2be1fc2de30b6b7d079a5fce" title="head of payload">nla_data</a>(tb[TCA_STATS]);
<a name="l00137"></a>00137 
<a name="l00138"></a>00138                         g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0a48a501c10b68cfcad6a1d5578050591b" title="Bytes seen.">RTNL_TC_BYTES</a>]      = st-&gt;bytes;
<a name="l00139"></a>00139                         g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0a45892528a489491962b1115d2a797ea6" title="Packets seen.">RTNL_TC_PACKETS</a>]    = st-&gt;packets;
<a name="l00140"></a>00140                         g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0af5161062248e8d8b713b920df98fc63f" title="Current bits/s (rate estimator)">RTNL_TC_RATE_BPS</a>]   = st-&gt;bps;
<a name="l00141"></a>00141                         g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0ad592a1229cd73ced877fc88715bc5ba9" title="Current packet/s (rate estimator)">RTNL_TC_RATE_PPS</a>]   = st-&gt;pps;
<a name="l00142"></a>00142                         g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0aa22bbf425d78526690cb0b4aa824e9d5" title="Queue length.">RTNL_TC_QLEN</a>]       = st-&gt;qlen;
<a name="l00143"></a>00143                         g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0ae44313687d6e8084549c9834a4a9e8a1" title="Backlog length.">RTNL_TC_BACKLOG</a>]    = st-&gt;backlog;
<a name="l00144"></a>00144                         g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0acc8892488b10b39081a3186ab8b01d99" title="Packets dropped.">RTNL_TC_DROPS</a>]      = st-&gt;drops;
<a name="l00145"></a>00145                         g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0ac3f814dae6f46241986f236ad867bb17" title="Number of overlimits.">RTNL_TC_OVERLIMITS</a>] = st-&gt;overlimits;
<a name="l00146"></a>00146 
<a name="l00147"></a>00147                         g-&gt;ce_mask |= TCA_ATTR_STATS;
<a name="l00148"></a>00148                 }
<a name="l00149"></a>00149 
<a name="l00150"></a>00150 compat_xstats:
<a name="l00151"></a>00151                 <span class="keywordflow">if</span> (tb[TCA_XSTATS]) {
<a name="l00152"></a>00152                         g-&gt;tc_xstats = <a class="code" href="group__attr.html#ga33a5aef23c5d26c8247632ed1f167068" title="Return payload of abstract data attribute.">nla_get_data</a>(tb[TCA_XSTATS]);
<a name="l00153"></a>00153                         <span class="keywordflow">if</span> (g-&gt;tc_xstats == NULL)
<a name="l00154"></a>00154                                 <span class="keywordflow">return</span> -ENOMEM;
<a name="l00155"></a>00155                         g-&gt;ce_mask |= TCA_ATTR_XSTATS;
<a name="l00156"></a>00156                 }
<a name="l00157"></a>00157         }
<a name="l00158"></a>00158 
<a name="l00159"></a>00159 
<a name="l00160"></a>00160         <span class="keywordflow">return</span> 0;
<a name="l00161"></a>00161 }
<a name="l00162"></a>00162 
<a name="l00163"></a>00163 <span class="keywordtype">void</span> tca_free_data(<span class="keyword">struct</span> rtnl_tca *tca)
<a name="l00164"></a>00164 {
<a name="l00165"></a>00165         <a class="code" href="group__data.html#ga35cbd02038e7abf0be6da4cb2a34189e" title="Free an abstract data object.">nl_data_free</a>(tca-&gt;tc_opts);
<a name="l00166"></a>00166         <a class="code" href="group__data.html#ga35cbd02038e7abf0be6da4cb2a34189e" title="Free an abstract data object.">nl_data_free</a>(tca-&gt;tc_xstats);
<a name="l00167"></a>00167 }
<a name="l00168"></a>00168 
<a name="l00169"></a>00169 <span class="keywordtype">int</span> tca_clone(<span class="keyword">struct</span> rtnl_tca *dst, <span class="keyword">struct</span> rtnl_tca *src)
<a name="l00170"></a>00170 {
<a name="l00171"></a>00171         <span class="keywordflow">if</span> (src-&gt;tc_opts) {
<a name="l00172"></a>00172                 dst-&gt;tc_opts = <a class="code" href="group__data.html#ga64967fcb4916f66a2bd1a82292350e74" title="Clone an abstract data object.">nl_data_clone</a>(src-&gt;tc_opts);
<a name="l00173"></a>00173                 <span class="keywordflow">if</span> (!dst-&gt;tc_opts)
<a name="l00174"></a>00174                         <span class="keywordflow">goto</span> errout;
<a name="l00175"></a>00175         }
<a name="l00176"></a>00176         
<a name="l00177"></a>00177         <span class="keywordflow">if</span> (src-&gt;tc_xstats) {
<a name="l00178"></a>00178                 dst-&gt;tc_xstats = <a class="code" href="group__data.html#ga64967fcb4916f66a2bd1a82292350e74" title="Clone an abstract data object.">nl_data_clone</a>(src-&gt;tc_xstats);
<a name="l00179"></a>00179                 <span class="keywordflow">if</span> (!dst-&gt;tc_xstats)
<a name="l00180"></a>00180                         <span class="keywordflow">goto</span> errout;
<a name="l00181"></a>00181         }
<a name="l00182"></a>00182 
<a name="l00183"></a>00183         <span class="keywordflow">return</span> 0;
<a name="l00184"></a>00184 errout:
<a name="l00185"></a>00185         <span class="keywordflow">return</span> nl_get_errno();
<a name="l00186"></a>00186 }
<a name="l00187"></a>00187 
<a name="l00188"></a>00188 <span class="keywordtype">int</span> tca_dump_brief(<span class="keyword">struct</span> rtnl_tca *g, <span class="keyword">const</span> <span class="keywordtype">char</span> *type,
<a name="l00189"></a>00189                    <span class="keyword">struct</span> <a class="code" href="structnl__dump__params.html" title="Dumping parameters.">nl_dump_params</a> *p, <span class="keywordtype">int</span> line)
<a name="l00190"></a>00190 {
<a name="l00191"></a>00191         <span class="keywordtype">char</span> handle[32], parent[32];
<a name="l00192"></a>00192         <span class="keyword">struct </span>nl_cache *link_cache;
<a name="l00193"></a>00193         
<a name="l00194"></a>00194         link_cache = <a class="code" href="group__cache__mngt.html#gad06c0755c030845c3c90ed490108ea5d" title="Demand the use of a global cache.">nl_cache_mngt_require</a>(<span class="stringliteral">&quot;route/link&quot;</span>);
<a name="l00195"></a>00195 
<a name="l00196"></a>00196         dp_dump(p, <span class="stringliteral">&quot;%s %s &quot;</span>, g-&gt;tc_kind, type);
<a name="l00197"></a>00197 
<a name="l00198"></a>00198         <span class="keywordflow">if</span> (link_cache) {
<a name="l00199"></a>00199                 <span class="keywordtype">char</span> buf[32];
<a name="l00200"></a>00200                 dp_dump(p, <span class="stringliteral">&quot;dev %s &quot;</span>,
<a name="l00201"></a>00201                         <a class="code" href="group__link.html#ga66328cb096fb4d21499775e75089109d" title="Translate an interface index to the corresponding link name.">rtnl_link_i2name</a>(link_cache, g-&gt;tc_ifindex,
<a name="l00202"></a>00202                                          buf, <span class="keyword">sizeof</span>(buf)));
<a name="l00203"></a>00203         } <span class="keywordflow">else</span>
<a name="l00204"></a>00204                 dp_dump(p, <span class="stringliteral">&quot;dev %u &quot;</span>, g-&gt;tc_ifindex);
<a name="l00205"></a>00205         
<a name="l00206"></a>00206         dp_dump(p, <span class="stringliteral">&quot;handle %s parent %s&quot;</span>,
<a name="l00207"></a>00207                 <a class="code" href="group__tc.html#ga27fad2a239d4d8d932da0ce1bdbf1f9f" title="Convert a traffic control handle to a character string (Reentrant).">rtnl_tc_handle2str</a>(g-&gt;tc_handle, handle, <span class="keyword">sizeof</span>(handle)),
<a name="l00208"></a>00208                 <a class="code" href="group__tc.html#ga27fad2a239d4d8d932da0ce1bdbf1f9f" title="Convert a traffic control handle to a character string (Reentrant).">rtnl_tc_handle2str</a>(g-&gt;tc_parent, parent, <span class="keyword">sizeof</span>(parent)));
<a name="l00209"></a>00209 
<a name="l00210"></a>00210         <span class="keywordflow">return</span> 1;
<a name="l00211"></a>00211 }
<a name="l00212"></a>00212 
<a name="l00213"></a>00213 <span class="keywordtype">int</span> tca_dump_full(<span class="keyword">struct</span> rtnl_tca *g, <span class="keyword">struct</span> <a class="code" href="structnl__dump__params.html" title="Dumping parameters.">nl_dump_params</a> *p, <span class="keywordtype">int</span> line)
<a name="l00214"></a>00214 {
<a name="l00215"></a>00215         dp_dump_line(p, line++, <span class="stringliteral">&quot;  &quot;</span>);
<a name="l00216"></a>00216         <span class="keywordflow">return</span> line;
<a name="l00217"></a>00217 }
<a name="l00218"></a>00218 
<a name="l00219"></a>00219 <span class="keywordtype">int</span> tca_dump_stats(<span class="keyword">struct</span> rtnl_tca *g, <span class="keyword">struct</span> <a class="code" href="structnl__dump__params.html" title="Dumping parameters.">nl_dump_params</a> *p, <span class="keywordtype">int</span> line)
<a name="l00220"></a>00220 {
<a name="l00221"></a>00221         <span class="keywordtype">char</span> *unit, fmt[64];
<a name="l00222"></a>00222         <span class="keywordtype">float</span> res;
<a name="l00223"></a>00223         strcpy(fmt, <span class="stringliteral">&quot;        %7.2f %s %10u %10u %10u %10u %10u\n&quot;</span>);
<a name="l00224"></a>00224 
<a name="l00225"></a>00225         dp_dump_line(p, line++,
<a name="l00226"></a>00226                 <span class="stringliteral">&quot;    Stats:    bytes    packets      drops overlimits&quot;</span> \
<a name="l00227"></a>00227                 <span class="stringliteral">&quot;       qlen    backlog\n&quot;</span>);
<a name="l00228"></a>00228 
<a name="l00229"></a>00229         res = <a class="code" href="group__utils.html#ga5a280448ae9e17ff5dc7e822b9f47b11" title="Cancel down a byte counter.">nl_cancel_down_bytes</a>(g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0a48a501c10b68cfcad6a1d5578050591b" title="Bytes seen.">RTNL_TC_BYTES</a>], &amp;unit);
<a name="l00230"></a>00230         <span class="keywordflow">if</span> (*unit == <span class="charliteral">&#39;B&#39;</span>)
<a name="l00231"></a>00231                 fmt[11] = <span class="charliteral">&#39;9&#39;</span>;
<a name="l00232"></a>00232 
<a name="l00233"></a>00233         dp_dump_line(p, line++, fmt, res, unit,
<a name="l00234"></a>00234                 g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0a45892528a489491962b1115d2a797ea6" title="Packets seen.">RTNL_TC_PACKETS</a>],
<a name="l00235"></a>00235                 g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0acc8892488b10b39081a3186ab8b01d99" title="Packets dropped.">RTNL_TC_DROPS</a>],
<a name="l00236"></a>00236                 g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0ac3f814dae6f46241986f236ad867bb17" title="Number of overlimits.">RTNL_TC_OVERLIMITS</a>],
<a name="l00237"></a>00237                 g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0aa22bbf425d78526690cb0b4aa824e9d5" title="Queue length.">RTNL_TC_QLEN</a>],
<a name="l00238"></a>00238                 g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0ae44313687d6e8084549c9834a4a9e8a1" title="Backlog length.">RTNL_TC_BACKLOG</a>]);
<a name="l00239"></a>00239 
<a name="l00240"></a>00240         res = <a class="code" href="group__utils.html#ga5a280448ae9e17ff5dc7e822b9f47b11" title="Cancel down a byte counter.">nl_cancel_down_bytes</a>(g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0af5161062248e8d8b713b920df98fc63f" title="Current bits/s (rate estimator)">RTNL_TC_RATE_BPS</a>], &amp;unit);
<a name="l00241"></a>00241 
<a name="l00242"></a>00242         strcpy(fmt, <span class="stringliteral">&quot;        %7.2f %s/s%9u pps&quot;</span>);
<a name="l00243"></a>00243 
<a name="l00244"></a>00244         <span class="keywordflow">if</span> (*unit == <span class="charliteral">&#39;B&#39;</span>)
<a name="l00245"></a>00245                 fmt[11] = <span class="charliteral">&#39;9&#39;</span>;
<a name="l00246"></a>00246 
<a name="l00247"></a>00247         dp_dump_line(p, line++, fmt, res, unit, g-&gt;tc_stats[<a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0ad592a1229cd73ced877fc88715bc5ba9" title="Current packet/s (rate estimator)">RTNL_TC_RATE_PPS</a>]);
<a name="l00248"></a>00248 
<a name="l00249"></a>00249         <span class="keywordflow">return</span> line;
<a name="l00250"></a>00250 }
<a name="l00251"></a>00251 
<a name="l00252"></a>00252 <span class="keywordtype">int</span> tca_compare(<span class="keyword">struct</span> nl_object *_a, <span class="keyword">struct</span> nl_object *_b,
<a name="l00253"></a>00253                 uint32_t attrs, <span class="keywordtype">int</span> flags)
<a name="l00254"></a>00254 {
<a name="l00255"></a>00255         <span class="keyword">struct </span>rtnl_tca *a = (<span class="keyword">struct </span>rtnl_tca *) _a;
<a name="l00256"></a>00256         <span class="keyword">struct </span>rtnl_tca *b = (<span class="keyword">struct </span>rtnl_tca *) _b;
<a name="l00257"></a>00257         <span class="keywordtype">int</span> diff = 0;
<a name="l00258"></a>00258 
<a name="l00259"></a>00259 <span class="preprocessor">#define TC_DIFF(ATTR, EXPR) ATTR_DIFF(attrs, TCA_ATTR_##ATTR, a, b, EXPR)</span>
<a name="l00260"></a>00260 <span class="preprocessor"></span>
<a name="l00261"></a>00261         diff |= TC_DIFF(HANDLE,         a-&gt;tc_handle != b-&gt;tc_handle);
<a name="l00262"></a>00262         diff |= TC_DIFF(PARENT,         a-&gt;tc_parent != b-&gt;tc_parent);
<a name="l00263"></a>00263         diff |= TC_DIFF(IFINDEX,        a-&gt;tc_ifindex != b-&gt;tc_ifindex);
<a name="l00264"></a>00264         diff |= TC_DIFF(KIND,           strcmp(a-&gt;tc_kind, b-&gt;tc_kind));
<a name="l00265"></a>00265 
<a name="l00266"></a>00266 <span class="preprocessor">#undef TC_DIFF</span>
<a name="l00267"></a>00267 <span class="preprocessor"></span>
<a name="l00268"></a>00268         <span class="keywordflow">return</span> diff;
<a name="l00269"></a>00269 }
<a name="l00270"></a>00270 
<a name="l00271"></a>00271 <span class="keywordtype">void</span> tca_set_ifindex(<span class="keyword">struct</span> rtnl_tca *t, <span class="keywordtype">int</span> ifindex)
<a name="l00272"></a>00272 {
<a name="l00273"></a>00273         t-&gt;tc_ifindex = ifindex;
<a name="l00274"></a>00274         t-&gt;ce_mask |= TCA_ATTR_IFINDEX;
<a name="l00275"></a>00275 }
<a name="l00276"></a>00276 
<a name="l00277"></a>00277 <span class="keywordtype">int</span> tca_get_ifindex(<span class="keyword">struct</span> rtnl_tca *t)
<a name="l00278"></a>00278 {
<a name="l00279"></a>00279         <span class="keywordflow">if</span> (t-&gt;ce_mask &amp; TCA_ATTR_IFINDEX)
<a name="l00280"></a>00280                 <span class="keywordflow">return</span> t-&gt;tc_ifindex;
<a name="l00281"></a>00281         <span class="keywordflow">else</span>
<a name="l00282"></a>00282                 <span class="keywordflow">return</span> <a class="code" href="group__link.html#ga774720bec7d14a6e314238c42122ec78" title="Special interface index stating the link was not found.">RTNL_LINK_NOT_FOUND</a>;
<a name="l00283"></a>00283 }
<a name="l00284"></a>00284 
<a name="l00285"></a>00285 <span class="keywordtype">void</span> tca_set_handle(<span class="keyword">struct</span> rtnl_tca *t, uint32_t handle)
<a name="l00286"></a>00286 {
<a name="l00287"></a>00287         t-&gt;tc_handle = handle;
<a name="l00288"></a>00288         t-&gt;ce_mask |= TCA_ATTR_HANDLE;
<a name="l00289"></a>00289 }
<a name="l00290"></a>00290 
<a name="l00291"></a>00291 uint32_t tca_get_handle(<span class="keyword">struct</span> rtnl_tca *t)
<a name="l00292"></a>00292 {
<a name="l00293"></a>00293         <span class="keywordflow">if</span> (t-&gt;ce_mask &amp; TCA_ATTR_HANDLE)
<a name="l00294"></a>00294                 <span class="keywordflow">return</span> t-&gt;tc_handle;
<a name="l00295"></a>00295         <span class="keywordflow">else</span>
<a name="l00296"></a>00296                 <span class="keywordflow">return</span> 0;
<a name="l00297"></a>00297 }
<a name="l00298"></a>00298 
<a name="l00299"></a>00299 <span class="keywordtype">void</span> tca_set_parent(<span class="keyword">struct</span> rtnl_tca *t, uint32_t parent)
<a name="l00300"></a>00300 {
<a name="l00301"></a>00301         t-&gt;tc_parent = parent;
<a name="l00302"></a>00302         t-&gt;ce_mask |= TCA_ATTR_PARENT;
<a name="l00303"></a>00303 }
<a name="l00304"></a>00304 
<a name="l00305"></a>00305 uint32_t tca_get_parent(<span class="keyword">struct</span> rtnl_tca *t)
<a name="l00306"></a>00306 {
<a name="l00307"></a>00307         <span class="keywordflow">if</span> (t-&gt;ce_mask &amp; TCA_ATTR_PARENT)
<a name="l00308"></a>00308                 <span class="keywordflow">return</span> t-&gt;tc_parent;
<a name="l00309"></a>00309         <span class="keywordflow">else</span>
<a name="l00310"></a>00310                 <span class="keywordflow">return</span> 0;
<a name="l00311"></a>00311 }
<a name="l00312"></a>00312 
<a name="l00313"></a>00313 <span class="keywordtype">void</span> tca_set_kind(<span class="keyword">struct</span> rtnl_tca *t, <span class="keyword">const</span> <span class="keywordtype">char</span> *kind)
<a name="l00314"></a>00314 {
<a name="l00315"></a>00315         strncpy(t-&gt;tc_kind, kind, <span class="keyword">sizeof</span>(t-&gt;tc_kind) - 1);
<a name="l00316"></a>00316         t-&gt;ce_mask |= TCA_ATTR_KIND;
<a name="l00317"></a>00317 }
<a name="l00318"></a>00318 
<a name="l00319"></a>00319 <span class="keywordtype">char</span> *tca_get_kind(<span class="keyword">struct</span> rtnl_tca *t)
<a name="l00320"></a>00320 {
<a name="l00321"></a>00321         <span class="keywordflow">if</span> (t-&gt;ce_mask &amp; TCA_ATTR_KIND)
<a name="l00322"></a>00322                 <span class="keywordflow">return</span> t-&gt;tc_kind;
<a name="l00323"></a>00323         <span class="keywordflow">else</span>
<a name="l00324"></a>00324                 <span class="keywordflow">return</span> NULL;
<a name="l00325"></a>00325 }
<a name="l00326"></a>00326 
<a name="l00327"></a>00327 uint64_t tca_get_stat(<span class="keyword">struct</span> rtnl_tca *t, <span class="keywordtype">int</span> <span class="keywordtype">id</span>)
<a name="l00328"></a>00328 {
<a name="l00329"></a>00329         <span class="keywordflow">if</span> (id &lt; 0 || id &gt; RTNL_TC_STATS_MAX)
<a name="l00330"></a>00330                 <span class="keywordflow">return</span> 0;
<a name="l00331"></a>00331 
<a name="l00332"></a>00332         <span class="keywordflow">return</span> t-&gt;tc_stats[id];
<a name="l00333"></a>00333 }
<a name="l00334"></a>00334 
<a name="l00335"></a>00335 <span class="keyword">struct </span>nl_msg *tca_build_msg(<span class="keyword">struct</span> rtnl_tca *tca, <span class="keywordtype">int</span> type, <span class="keywordtype">int</span> flags)
<a name="l00336"></a>00336 {
<a name="l00337"></a>00337         <span class="keyword">struct </span>nl_msg *msg;
<a name="l00338"></a>00338         <span class="keyword">struct </span>tcmsg tchdr = {
<a name="l00339"></a>00339                 .tcm_family = AF_UNSPEC,
<a name="l00340"></a>00340                 .tcm_ifindex = tca-&gt;tc_ifindex,
<a name="l00341"></a>00341                 .tcm_handle = tca-&gt;tc_handle,
<a name="l00342"></a>00342                 .tcm_parent = tca-&gt;tc_parent,
<a name="l00343"></a>00343         };
<a name="l00344"></a>00344 
<a name="l00345"></a>00345         msg = <a class="code" href="group__msg.html#ga580d8697d19050c55060bc10ab4eae9f" title="Allocate a new netlink message.">nlmsg_alloc_simple</a>(type, flags);
<a name="l00346"></a>00346         <span class="keywordflow">if</span> (!msg)
<a name="l00347"></a>00347                 <span class="keywordflow">goto</span> nla_put_failure;
<a name="l00348"></a>00348 
<a name="l00349"></a>00349         <span class="keywordflow">if</span> (<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) &lt; 0)
<a name="l00350"></a>00350                 <span class="keywordflow">goto</span> nla_put_failure;
<a name="l00351"></a>00351 
<a name="l00352"></a>00352         <span class="keywordflow">if</span> (tca-&gt;ce_mask &amp; TCA_ATTR_KIND)
<a name="l00353"></a>00353             <a class="code" href="group__attr.html#ga7f2397f226e4561d195611572021b714" title="Add a character string netlink attribute to a netlink message.">NLA_PUT_STRING</a>(msg, TCA_KIND, tca-&gt;tc_kind);
<a name="l00354"></a>00354 
<a name="l00355"></a>00355         <span class="keywordflow">return</span> msg;
<a name="l00356"></a>00356 
<a name="l00357"></a>00357 nla_put_failure:
<a name="l00358"></a>00358         <a class="code" href="group__msg.html#ga138ba9bee70553f9fbe7143deacad48c" title="Free a netlink message.">nlmsg_free</a>(msg);
<a name="l00359"></a>00359         <span class="keywordflow">return</span> NULL;
<a name="l00360"></a>00360 }
<a name="l00361"></a>00361 <span class="comment"></span>
<a name="l00362"></a>00362 <span class="comment">/** @endcond */</span>
<a name="l00363"></a>00363 <span class="comment"></span>
<a name="l00364"></a>00364 <span class="comment">/**</span>
<a name="l00365"></a>00365 <span class="comment"> * @name Utilities</span>
<a name="l00366"></a>00366 <span class="comment"> * @{</span>
<a name="l00367"></a>00367 <span class="comment"> */</span>
<a name="l00368"></a>00368 <span class="comment"></span>
<a name="l00369"></a>00369 <span class="comment">/**</span>
<a name="l00370"></a>00370 <span class="comment"> * Calculate time required to transmit buffer at a specific rate</span>
<a name="l00371"></a>00371 <span class="comment"> * @arg bufsize         Size of buffer to be transmited in bytes.</span>
<a name="l00372"></a>00372 <span class="comment"> * @arg rate            Transmit rate in bytes per second.</span>
<a name="l00373"></a>00373 <span class="comment"> *</span>
<a name="l00374"></a>00374 <span class="comment"> * Calculates the number of micro seconds required to transmit a</span>
<a name="l00375"></a>00375 <span class="comment"> * specific buffer at a specific transmit rate.</span>
<a name="l00376"></a>00376 <span class="comment"> *</span>
<a name="l00377"></a>00377 <span class="comment"> * @f[</span>
<a name="l00378"></a>00378 <span class="comment"> *   txtime=\frac{bufsize}{rate}10^6</span>
<a name="l00379"></a>00379 <span class="comment"> * @f]</span>
<a name="l00380"></a>00380 <span class="comment"> * </span>
<a name="l00381"></a>00381 <span class="comment"> * @return Required transmit time in micro seconds.</span>
<a name="l00382"></a>00382 <span class="comment"> */</span>
<a name="l00383"></a><a class="code" href="group__tc.html#gaf3dc48257284437d340d8493b33b9b98">00383</a> <span class="keywordtype">int</span> <a class="code" href="group__tc.html#gaf3dc48257284437d340d8493b33b9b98" title="Calculate time required to transmit buffer at a specific rate.">rtnl_tc_calc_txtime</a>(<span class="keywordtype">int</span> bufsize, <span class="keywordtype">int</span> rate)
<a name="l00384"></a>00384 {
<a name="l00385"></a>00385         <span class="keywordtype">double</span> tx_time_secs;
<a name="l00386"></a>00386         
<a name="l00387"></a>00387         tx_time_secs = (double) bufsize / (<span class="keywordtype">double</span>) rate;
<a name="l00388"></a>00388 
<a name="l00389"></a>00389         <span class="keywordflow">return</span> tx_time_secs * 1000000.;
<a name="l00390"></a>00390 }
<a name="l00391"></a>00391 <span class="comment"></span>
<a name="l00392"></a>00392 <span class="comment">/**</span>
<a name="l00393"></a>00393 <span class="comment"> * Calculate buffer size able to transmit in a specific time and rate.</span>
<a name="l00394"></a>00394 <span class="comment"> * @arg txtime          Available transmit time in micro seconds.</span>
<a name="l00395"></a>00395 <span class="comment"> * @arg rate            Transmit rate in bytes per second.</span>
<a name="l00396"></a>00396 <span class="comment"> *</span>
<a name="l00397"></a>00397 <span class="comment"> * Calculates the size of the buffer that can be transmitted in a</span>
<a name="l00398"></a>00398 <span class="comment"> * specific time period at a specific transmit rate.</span>
<a name="l00399"></a>00399 <span class="comment"> *</span>
<a name="l00400"></a>00400 <span class="comment"> * @f[</span>
<a name="l00401"></a>00401 <span class="comment"> *   bufsize=\frac{{txtime} \times {rate}}{10^6}</span>
<a name="l00402"></a>00402 <span class="comment"> * @f]</span>
<a name="l00403"></a>00403 <span class="comment"> *</span>
<a name="l00404"></a>00404 <span class="comment"> * @return Size of buffer in bytes.</span>
<a name="l00405"></a>00405 <span class="comment"> */</span>
<a name="l00406"></a><a class="code" href="group__tc.html#ga460b3c9b69f0bffd46347b1e2d4497e5">00406</a> <span class="keywordtype">int</span> <a class="code" href="group__tc.html#ga460b3c9b69f0bffd46347b1e2d4497e5" title="Calculate buffer size able to transmit in a specific time and rate.">rtnl_tc_calc_bufsize</a>(<span class="keywordtype">int</span> txtime, <span class="keywordtype">int</span> rate)
<a name="l00407"></a>00407 {
<a name="l00408"></a>00408         <span class="keywordtype">double</span> bufsize;
<a name="l00409"></a>00409 
<a name="l00410"></a>00410         bufsize = (double) txtime * (<span class="keywordtype">double</span>) rate;
<a name="l00411"></a>00411 
<a name="l00412"></a>00412         <span class="keywordflow">return</span> bufsize / 1000000.;
<a name="l00413"></a>00413 }
<a name="l00414"></a>00414 <span class="comment"></span>
<a name="l00415"></a>00415 <span class="comment">/**</span>
<a name="l00416"></a>00416 <span class="comment"> * Calculate the binary logarithm for a specific cell size</span>
<a name="l00417"></a>00417 <span class="comment"> * @arg cell_size       Size of cell, must be a power of two.</span>
<a name="l00418"></a>00418 <span class="comment"> * @return Binary logirhtm of cell size or a negative error code.</span>
<a name="l00419"></a>00419 <span class="comment"> */</span>
<a name="l00420"></a><a class="code" href="group__tc.html#ga149f2e05e2ab75842c99166cae7b3630">00420</a> <span class="keywordtype">int</span> <a class="code" href="group__tc.html#ga149f2e05e2ab75842c99166cae7b3630" title="Calculate the binary logarithm for a specific cell size.">rtnl_tc_calc_cell_log</a>(<span class="keywordtype">int</span> cell_size)
<a name="l00421"></a>00421 {
<a name="l00422"></a>00422         <span class="keywordtype">int</span> i;
<a name="l00423"></a>00423 
<a name="l00424"></a>00424         <span class="keywordflow">for</span> (i = 0; i &lt; 32; i++)
<a name="l00425"></a>00425                 <span class="keywordflow">if</span> ((1 &lt;&lt; i) == cell_size)
<a name="l00426"></a>00426                         <span class="keywordflow">return</span> i;
<a name="l00427"></a>00427 
<a name="l00428"></a>00428         <span class="keywordflow">return</span> nl_errno(EINVAL);
<a name="l00429"></a>00429 }
<a name="l00430"></a>00430 
<a name="l00431"></a>00431 <span class="comment"></span>
<a name="l00432"></a>00432 <span class="comment">/** @} */</span>
<a name="l00433"></a>00433 <span class="comment"></span>
<a name="l00434"></a>00434 <span class="comment">/**</span>
<a name="l00435"></a>00435 <span class="comment"> * @name Rate Tables</span>
<a name="l00436"></a>00436 <span class="comment"> * @{</span>
<a name="l00437"></a>00437 <span class="comment"> */</span>
<a name="l00438"></a>00438 <span class="comment"></span>
<a name="l00439"></a>00439 <span class="comment">/**</span>
<a name="l00440"></a>00440 <span class="comment"> * Compute a transmission time lookup table</span>
<a name="l00441"></a>00441 <span class="comment"> * @arg dst      Destination buffer of RTNL_TC_RTABLE_SIZE uint32_t[].</span>
<a name="l00442"></a>00442 <span class="comment"> * @arg mpu      Minimal size of a packet at all times.</span>
<a name="l00443"></a>00443 <span class="comment"> * @arg overhead Overhead to be added to each packet.</span>
<a name="l00444"></a>00444 <span class="comment"> * @arg cell     Size of cell, i.e. size of step between entries in bytes.</span>
<a name="l00445"></a>00445 <span class="comment"> * @arg rate     Rate in bytes per second.</span>
<a name="l00446"></a>00446 <span class="comment"> *</span>
<a name="l00447"></a>00447 <span class="comment"> * Computes a table of RTNL_TC_RTABLE_SIZE entries specyfing the</span>
<a name="l00448"></a>00448 <span class="comment"> * transmission times for various packet sizes, e.g. the transmission</span>
<a name="l00449"></a>00449 <span class="comment"> * time for a packet of size \c pktsize could be looked up:</span>
<a name="l00450"></a>00450 <span class="comment"> * @code</span>
<a name="l00451"></a>00451 <span class="comment"> * txtime = table[pktsize &gt;&gt; log2(cell)];</span>
<a name="l00452"></a>00452 <span class="comment"> * @endcode</span>
<a name="l00453"></a>00453 <span class="comment"> */</span>
<a name="l00454"></a><a class="code" href="group__tc.html#gaf0985ec685f9def7fcaba8cb831c4f2c">00454</a> <span class="keywordtype">int</span> <a class="code" href="group__tc.html#gaf0985ec685f9def7fcaba8cb831c4f2c" title="Compute a transmission time lookup table.">rtnl_tc_build_rate_table</a>(uint32_t *dst, uint8_t mpu, uint8_t overhead,
<a name="l00455"></a>00455                              <span class="keywordtype">int</span> cell, <span class="keywordtype">int</span> rate)
<a name="l00456"></a>00456 {
<a name="l00457"></a>00457         <span class="keywordtype">int</span> i, size, cell_log;
<a name="l00458"></a>00458 
<a name="l00459"></a>00459         cell_log = <a class="code" href="group__tc.html#ga149f2e05e2ab75842c99166cae7b3630" title="Calculate the binary logarithm for a specific cell size.">rtnl_tc_calc_cell_log</a>(cell);
<a name="l00460"></a>00460         <span class="keywordflow">if</span> (cell_log &lt; 0)
<a name="l00461"></a>00461                 <span class="keywordflow">return</span> cell_log;
<a name="l00462"></a>00462 
<a name="l00463"></a>00463         <span class="keywordflow">for</span> (i = 0; i &lt; <a class="code" href="group__tc.html#ga9a0796847debb07d96fe745d9088a6b5" title="Number of entries in a transmission time lookup table.">RTNL_TC_RTABLE_SIZE</a>; i++) {
<a name="l00464"></a>00464                 size = (i &lt;&lt; cell_log) + overhead;
<a name="l00465"></a>00465                 <span class="keywordflow">if</span> (size &lt; mpu)
<a name="l00466"></a>00466                         size = mpu;
<a name="l00467"></a>00467 
<a name="l00468"></a>00468                 dst[i] = <a class="code" href="group__tc.html#gaf3dc48257284437d340d8493b33b9b98" title="Calculate time required to transmit buffer at a specific rate.">rtnl_tc_calc_txtime</a>(size, rate);
<a name="l00469"></a>00469         }
<a name="l00470"></a>00470 
<a name="l00471"></a>00471         <span class="keywordflow">return</span> 0;
<a name="l00472"></a>00472 }
<a name="l00473"></a>00473 <span class="comment"></span>
<a name="l00474"></a>00474 <span class="comment">/** @} */</span>
<a name="l00475"></a>00475 <span class="comment"></span>
<a name="l00476"></a>00476 <span class="comment">/**</span>
<a name="l00477"></a>00477 <span class="comment"> * @name Traffic Control Handle Translations</span>
<a name="l00478"></a>00478 <span class="comment"> * @{</span>
<a name="l00479"></a>00479 <span class="comment"> */</span>
<a name="l00480"></a>00480 <span class="comment"></span>
<a name="l00481"></a>00481 <span class="comment">/**</span>
<a name="l00482"></a>00482 <span class="comment"> * Convert a traffic control handle to a character string (Reentrant).</span>
<a name="l00483"></a>00483 <span class="comment"> * @arg handle          traffic control handle</span>
<a name="l00484"></a>00484 <span class="comment"> * @arg buf             destination buffer</span>
<a name="l00485"></a>00485 <span class="comment"> * @arg len             buffer length</span>
<a name="l00486"></a>00486 <span class="comment"> *</span>
<a name="l00487"></a>00487 <span class="comment"> * Converts a tarffic control handle to a character string in the</span>
<a name="l00488"></a>00488 <span class="comment"> * form of \c MAJ:MIN and stores it in the specified destination buffer.</span>
<a name="l00489"></a>00489 <span class="comment"> *</span>
<a name="l00490"></a>00490 <span class="comment"> * @return The destination buffer or the type encoded in hexidecimal</span>
<a name="l00491"></a>00491 <span class="comment"> *         form if no match was found.</span>
<a name="l00492"></a>00492 <span class="comment"> */</span>
<a name="l00493"></a><a class="code" href="group__tc.html#ga27fad2a239d4d8d932da0ce1bdbf1f9f">00493</a> <span class="keywordtype">char</span> * <a class="code" href="group__tc.html#ga27fad2a239d4d8d932da0ce1bdbf1f9f" title="Convert a traffic control handle to a character string (Reentrant).">rtnl_tc_handle2str</a>(uint32_t handle, <span class="keywordtype">char</span> *buf, <span class="keywordtype">size_t</span> len)
<a name="l00494"></a>00494 {
<a name="l00495"></a>00495         <span class="keywordflow">if</span> (TC_H_ROOT == handle)
<a name="l00496"></a>00496                 snprintf(buf, len, <span class="stringliteral">&quot;root&quot;</span>);
<a name="l00497"></a>00497         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (TC_H_UNSPEC == handle)
<a name="l00498"></a>00498                 snprintf(buf, len, <span class="stringliteral">&quot;none&quot;</span>);
<a name="l00499"></a>00499         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (0 == TC_H_MAJ(handle))
<a name="l00500"></a>00500                 snprintf(buf, len, <span class="stringliteral">&quot;:%02x&quot;</span>, TC_H_MIN(handle));
<a name="l00501"></a>00501         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (0 == TC_H_MIN(handle))
<a name="l00502"></a>00502                 snprintf(buf, len, <span class="stringliteral">&quot;%02x:&quot;</span>, TC_H_MAJ(handle) &gt;&gt; 16);
<a name="l00503"></a>00503         <span class="keywordflow">else</span>
<a name="l00504"></a>00504                 snprintf(buf, len, <span class="stringliteral">&quot;%02x:%02x&quot;</span>,
<a name="l00505"></a>00505                         TC_H_MAJ(handle) &gt;&gt; 16, TC_H_MIN(handle));
<a name="l00506"></a>00506 
<a name="l00507"></a>00507         <span class="keywordflow">return</span> buf;
<a name="l00508"></a>00508 }
<a name="l00509"></a>00509 <span class="comment"></span>
<a name="l00510"></a>00510 <span class="comment">/**</span>
<a name="l00511"></a>00511 <span class="comment"> * Convert a charactering strint to a traffic control handle</span>
<a name="l00512"></a>00512 <span class="comment"> * @arg name            traffic control handle as character string</span>
<a name="l00513"></a>00513 <span class="comment"> * @arg res             destination buffer</span>
<a name="l00514"></a>00514 <span class="comment"> *</span>
<a name="l00515"></a>00515 <span class="comment"> * Converts the provided character string specifying a traffic</span>
<a name="l00516"></a>00516 <span class="comment"> * control handle to the corresponding numeric value.</span>
<a name="l00517"></a>00517 <span class="comment"> *</span>
<a name="l00518"></a>00518 <span class="comment"> * The handle must be provided in one of the following formats:</span>
<a name="l00519"></a>00519 <span class="comment"> *  - root</span>
<a name="l00520"></a>00520 <span class="comment"> *  - none</span>
<a name="l00521"></a>00521 <span class="comment"> *  - XXXX:</span>
<a name="l00522"></a>00522 <span class="comment"> *  - :YYYY</span>
<a name="l00523"></a>00523 <span class="comment"> *  - XXXX:YYYY</span>
<a name="l00524"></a>00524 <span class="comment"> *  - XXXXYYYY</span>
<a name="l00525"></a>00525 <span class="comment"> *</span>
<a name="l00526"></a>00526 <span class="comment"> * @return 0 on success or a negative error code</span>
<a name="l00527"></a>00527 <span class="comment"> */</span>
<a name="l00528"></a><a class="code" href="group__tc.html#gab2197ef937705965b0c6f0c32e5409e6">00528</a> <span class="keywordtype">int</span> <a class="code" href="group__tc.html#gab2197ef937705965b0c6f0c32e5409e6" title="Convert a charactering strint to a traffic control handle.">rtnl_tc_str2handle</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, uint32_t *res)
<a name="l00529"></a>00529 {
<a name="l00530"></a>00530         <span class="keywordtype">char</span> *colon, *end;
<a name="l00531"></a>00531         uint32_t h;
<a name="l00532"></a>00532 
<a name="l00533"></a>00533         <span class="keywordflow">if</span> (!strcasecmp(name, <span class="stringliteral">&quot;root&quot;</span>)) {
<a name="l00534"></a>00534                 *res = TC_H_ROOT;
<a name="l00535"></a>00535                 <span class="keywordflow">return</span> 0;
<a name="l00536"></a>00536         }
<a name="l00537"></a>00537 
<a name="l00538"></a>00538         <span class="keywordflow">if</span> (!strcasecmp(name, <span class="stringliteral">&quot;none&quot;</span>)) {
<a name="l00539"></a>00539                 *res = TC_H_UNSPEC;
<a name="l00540"></a>00540                 <span class="keywordflow">return</span> 0;
<a name="l00541"></a>00541         }
<a name="l00542"></a>00542 
<a name="l00543"></a>00543         h = strtoul(name, &amp;colon, 16);
<a name="l00544"></a>00544 
<a name="l00545"></a>00545         <span class="keywordflow">if</span> (colon == name) {
<a name="l00546"></a>00546                 <span class="comment">/* :YYYY */</span>
<a name="l00547"></a>00547                 h = 0;
<a name="l00548"></a>00548                 <span class="keywordflow">if</span> (<span class="charliteral">&#39;:&#39;</span> != *colon)
<a name="l00549"></a>00549                         <span class="keywordflow">return</span> -EINVAL;
<a name="l00550"></a>00550         }
<a name="l00551"></a>00551 
<a name="l00552"></a>00552         <span class="keywordflow">if</span> (<span class="charliteral">&#39;:&#39;</span> == *colon) {
<a name="l00553"></a>00553                 <span class="comment">/* check if we would lose bits */</span>
<a name="l00554"></a>00554                 <span class="keywordflow">if</span> (TC_H_MAJ(h))
<a name="l00555"></a>00555                         <span class="keywordflow">return</span> -ERANGE;
<a name="l00556"></a>00556                 h &lt;&lt;= 16;
<a name="l00557"></a>00557 
<a name="l00558"></a>00558                 <span class="keywordflow">if</span> (<span class="charliteral">&#39;\0&#39;</span> == colon[1]) {
<a name="l00559"></a>00559                         <span class="comment">/* XXXX: */</span>
<a name="l00560"></a>00560                         *res = h;
<a name="l00561"></a>00561                 } <span class="keywordflow">else</span> {
<a name="l00562"></a>00562                         <span class="comment">/* XXXX:YYYY */</span>
<a name="l00563"></a>00563                         uint32_t l = strtoul(colon+1, &amp;end, 16);
<a name="l00564"></a>00564 
<a name="l00565"></a>00565                         <span class="comment">/* check if we overlap with major part */</span>
<a name="l00566"></a>00566                         <span class="keywordflow">if</span> (TC_H_MAJ(l))
<a name="l00567"></a>00567                                 <span class="keywordflow">return</span> -ERANGE;
<a name="l00568"></a>00568 
<a name="l00569"></a>00569                         <span class="keywordflow">if</span> (<span class="charliteral">&#39;\0&#39;</span> != *end)
<a name="l00570"></a>00570                                 <span class="keywordflow">return</span> -EINVAL;
<a name="l00571"></a>00571 
<a name="l00572"></a>00572                         *res = (h | l);
<a name="l00573"></a>00573                 }
<a name="l00574"></a>00574         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="charliteral">&#39;\0&#39;</span> == *colon) {
<a name="l00575"></a>00575                 <span class="comment">/* XXXXYYYY */</span>
<a name="l00576"></a>00576                 *res = h;
<a name="l00577"></a>00577         } <span class="keywordflow">else</span>
<a name="l00578"></a>00578                 <span class="keywordflow">return</span> -EINVAL;
<a name="l00579"></a>00579 
<a name="l00580"></a>00580         <span class="keywordflow">return</span> 0;
<a name="l00581"></a>00581 }
<a name="l00582"></a>00582 <span class="comment"></span>
<a name="l00583"></a>00583 <span class="comment">/** @} */</span>
<a name="l00584"></a>00584 <span class="comment"></span>
<a name="l00585"></a>00585 <span class="comment">/** @} */</span>
</pre></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>