<!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: Traffic Control</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <link href="doxygen.css" rel="stylesheet" type="text/css"/> </head> <body> <!-- Generated by Doxygen 1.7.3 --> <div id="top"> <div id="titlearea"> <table cellspacing="0" cellpadding="0"> <tbody> <tr style="height: 56px;"> <td style="padding-left: 0.5em;"> <div id="projectname">libnl <span id="projectnumber">1.1</span></div> </td> </tr> </tbody> </table> </div> <div id="navrow1" class="tabs"> <ul class="tablist"> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="modules.html"><span>Modules</span></a></li> <li><a href="annotated.html"><span>Data Structures</span></a></li> <li><a href="files.html"><span>Files</span></a></li> </ul> </div> </div> <div class="header"> <div class="summary"> <a href="#groups">Modules</a> | <a href="#define-members">Defines</a> | <a href="#enum-members">Enumerations</a> </div> <div class="headertitle"> <h1>Traffic Control</h1> </div> <div class="ingroups"><a class="el" href="group__rtnl.html">Routing Netlink</a></div></div> <div class="contents"> <table class="memberdecls"> <tr><td colspan="2"><h2><a name="groups"></a> Modules</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__class.html">Queueing Classes</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__cls.html">Classifiers</a></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__qdisc.html">Queueing Disciplines</a></td></tr> <tr><td colspan="2"><h2><a name="define-members"></a> Defines</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga9a0796847debb07d96fe745d9088a6b5"></a><!-- doxytag: member="tc::RTNL_TC_RTABLE_SIZE" ref="ga9a0796847debb07d96fe745d9088a6b5" args="" --> #define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__tc.html#ga9a0796847debb07d96fe745d9088a6b5">RTNL_TC_RTABLE_SIZE</a>   256</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Number of entries in a transmission time lookup table. <br/></td></tr> <tr><td colspan="2"><h2><a name="enum-members"></a> Enumerations</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__tc.html#ga7f00b06ddcf7c64d3f159214d0d976c0">rtnl_tc_stats_id</a> { <br/>   <a class="el" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0a45892528a489491962b1115d2a797ea6">RTNL_TC_PACKETS</a>, <a class="el" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0a48a501c10b68cfcad6a1d5578050591b">RTNL_TC_BYTES</a>, <a class="el" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0af5161062248e8d8b713b920df98fc63f">RTNL_TC_RATE_BPS</a>, <a class="el" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0ad592a1229cd73ced877fc88715bc5ba9">RTNL_TC_RATE_PPS</a>, <br/>   <a class="el" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0aa22bbf425d78526690cb0b4aa824e9d5">RTNL_TC_QLEN</a>, <a class="el" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0ae44313687d6e8084549c9834a4a9e8a1">RTNL_TC_BACKLOG</a>, <a class="el" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0acc8892488b10b39081a3186ab8b01d99">RTNL_TC_DROPS</a>, <a class="el" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0adc557ea50891d76d451349421457f7ad">RTNL_TC_REQUEUES</a>, <br/>   <a class="el" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0ac3f814dae6f46241986f236ad867bb17">RTNL_TC_OVERLIMITS</a>, <b>__RTNL_TC_STATS_MAX</b> <br/> }</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight"><p>TC statistics identifiers. </p> <a href="group__tc.html#ga7f00b06ddcf7c64d3f159214d0d976c0">More...</a><br/></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Utilities</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__tc.html#gaf3dc48257284437d340d8493b33b9b98">rtnl_tc_calc_txtime</a> (int bufsize, int rate)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Calculate time required to transmit buffer at a specific rate. <a href="#gaf3dc48257284437d340d8493b33b9b98"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__tc.html#ga460b3c9b69f0bffd46347b1e2d4497e5">rtnl_tc_calc_bufsize</a> (int txtime, int rate)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Calculate buffer size able to transmit in a specific time and rate. <a href="#ga460b3c9b69f0bffd46347b1e2d4497e5"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__tc.html#ga149f2e05e2ab75842c99166cae7b3630">rtnl_tc_calc_cell_log</a> (int cell_size)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Calculate the binary logarithm for a specific cell size. <a href="#ga149f2e05e2ab75842c99166cae7b3630"></a><br/></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Rate Tables</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__tc.html#gaf0985ec685f9def7fcaba8cb831c4f2c">rtnl_tc_build_rate_table</a> (uint32_t *dst, uint8_t mpu, uint8_t overhead, int cell, int rate)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Compute a transmission time lookup table. <a href="#gaf0985ec685f9def7fcaba8cb831c4f2c"></a><br/></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Traffic Control Handle Translations</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">char * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__tc.html#ga27fad2a239d4d8d932da0ce1bdbf1f9f">rtnl_tc_handle2str</a> (uint32_t handle, char *buf, size_t len)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Convert a traffic control handle to a character string (Reentrant). <a href="#ga27fad2a239d4d8d932da0ce1bdbf1f9f"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__tc.html#gab2197ef937705965b0c6f0c32e5409e6">rtnl_tc_str2handle</a> (const char *name, uint32_t *res)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Convert a charactering strint to a traffic control handle. <a href="#gab2197ef937705965b0c6f0c32e5409e6"></a><br/></td></tr> </table> <hr/><h2>Enumeration Type Documentation</h2> <a class="anchor" id="ga7f00b06ddcf7c64d3f159214d0d976c0"></a><!-- doxytag: member="tc.h::rtnl_tc_stats_id" ref="ga7f00b06ddcf7c64d3f159214d0d976c0" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">enum <a class="el" href="group__tc.html#ga7f00b06ddcf7c64d3f159214d0d976c0">rtnl_tc_stats_id</a></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"><em><a class="anchor" id="gga7f00b06ddcf7c64d3f159214d0d976c0a45892528a489491962b1115d2a797ea6"></a><!-- doxytag: member="RTNL_TC_PACKETS" ref="gga7f00b06ddcf7c64d3f159214d0d976c0a45892528a489491962b1115d2a797ea6" args="" -->RTNL_TC_PACKETS</em> </td><td> <p>Packets seen. </p> </td></tr> <tr><td valign="top"><em><a class="anchor" id="gga7f00b06ddcf7c64d3f159214d0d976c0a48a501c10b68cfcad6a1d5578050591b"></a><!-- doxytag: member="RTNL_TC_BYTES" ref="gga7f00b06ddcf7c64d3f159214d0d976c0a48a501c10b68cfcad6a1d5578050591b" args="" -->RTNL_TC_BYTES</em> </td><td> <p>Bytes seen. </p> </td></tr> <tr><td valign="top"><em><a class="anchor" id="gga7f00b06ddcf7c64d3f159214d0d976c0af5161062248e8d8b713b920df98fc63f"></a><!-- doxytag: member="RTNL_TC_RATE_BPS" ref="gga7f00b06ddcf7c64d3f159214d0d976c0af5161062248e8d8b713b920df98fc63f" args="" -->RTNL_TC_RATE_BPS</em> </td><td> <p>Current bits/s (rate estimator) </p> </td></tr> <tr><td valign="top"><em><a class="anchor" id="gga7f00b06ddcf7c64d3f159214d0d976c0ad592a1229cd73ced877fc88715bc5ba9"></a><!-- doxytag: member="RTNL_TC_RATE_PPS" ref="gga7f00b06ddcf7c64d3f159214d0d976c0ad592a1229cd73ced877fc88715bc5ba9" args="" -->RTNL_TC_RATE_PPS</em> </td><td> <p>Current packet/s (rate estimator) </p> </td></tr> <tr><td valign="top"><em><a class="anchor" id="gga7f00b06ddcf7c64d3f159214d0d976c0aa22bbf425d78526690cb0b4aa824e9d5"></a><!-- doxytag: member="RTNL_TC_QLEN" ref="gga7f00b06ddcf7c64d3f159214d0d976c0aa22bbf425d78526690cb0b4aa824e9d5" args="" -->RTNL_TC_QLEN</em> </td><td> <p>Queue length. </p> </td></tr> <tr><td valign="top"><em><a class="anchor" id="gga7f00b06ddcf7c64d3f159214d0d976c0ae44313687d6e8084549c9834a4a9e8a1"></a><!-- doxytag: member="RTNL_TC_BACKLOG" ref="gga7f00b06ddcf7c64d3f159214d0d976c0ae44313687d6e8084549c9834a4a9e8a1" args="" -->RTNL_TC_BACKLOG</em> </td><td> <p>Backlog length. </p> </td></tr> <tr><td valign="top"><em><a class="anchor" id="gga7f00b06ddcf7c64d3f159214d0d976c0acc8892488b10b39081a3186ab8b01d99"></a><!-- doxytag: member="RTNL_TC_DROPS" ref="gga7f00b06ddcf7c64d3f159214d0d976c0acc8892488b10b39081a3186ab8b01d99" args="" -->RTNL_TC_DROPS</em> </td><td> <p>Packets dropped. </p> </td></tr> <tr><td valign="top"><em><a class="anchor" id="gga7f00b06ddcf7c64d3f159214d0d976c0adc557ea50891d76d451349421457f7ad"></a><!-- doxytag: member="RTNL_TC_REQUEUES" ref="gga7f00b06ddcf7c64d3f159214d0d976c0adc557ea50891d76d451349421457f7ad" args="" -->RTNL_TC_REQUEUES</em> </td><td> <p>Number of requeues. </p> </td></tr> <tr><td valign="top"><em><a class="anchor" id="gga7f00b06ddcf7c64d3f159214d0d976c0ac3f814dae6f46241986f236ad867bb17"></a><!-- doxytag: member="RTNL_TC_OVERLIMITS" ref="gga7f00b06ddcf7c64d3f159214d0d976c0ac3f814dae6f46241986f236ad867bb17" args="" -->RTNL_TC_OVERLIMITS</em> </td><td> <p>Number of overlimits. </p> </td></tr> </table> </dd> </dl> <p>Definition at line <a class="el" href="tc_8h_source.html#l00027">27</a> of file <a class="el" href="tc_8h_source.html">tc.h</a>.</p> <div class="fragment"><pre class="fragment"> { <a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0a45892528a489491962b1115d2a797ea6" title="Packets seen.">RTNL_TC_PACKETS</a>, <span class="comment">/**< Packets seen */</span> <a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0a48a501c10b68cfcad6a1d5578050591b" title="Bytes seen.">RTNL_TC_BYTES</a>, <span class="comment">/**< Bytes seen */</span> <a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0af5161062248e8d8b713b920df98fc63f" title="Current bits/s (rate estimator)">RTNL_TC_RATE_BPS</a>, <span class="comment">/**< Current bits/s (rate estimator) */</span> <a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0ad592a1229cd73ced877fc88715bc5ba9" title="Current packet/s (rate estimator)">RTNL_TC_RATE_PPS</a>, <span class="comment">/**< Current packet/s (rate estimator) */</span> <a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0aa22bbf425d78526690cb0b4aa824e9d5" title="Queue length.">RTNL_TC_QLEN</a>, <span class="comment">/**< Queue length */</span> <a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0ae44313687d6e8084549c9834a4a9e8a1" title="Backlog length.">RTNL_TC_BACKLOG</a>, <span class="comment">/**< Backlog length */</span> <a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0acc8892488b10b39081a3186ab8b01d99" title="Packets dropped.">RTNL_TC_DROPS</a>, <span class="comment">/**< Packets dropped */</span> <a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0adc557ea50891d76d451349421457f7ad" title="Number of requeues.">RTNL_TC_REQUEUES</a>, <span class="comment">/**< Number of requeues */</span> <a class="code" href="group__tc.html#gga7f00b06ddcf7c64d3f159214d0d976c0ac3f814dae6f46241986f236ad867bb17" title="Number of overlimits.">RTNL_TC_OVERLIMITS</a>, <span class="comment">/**< Number of overlimits */</span> __RTNL_TC_STATS_MAX, }; </pre></div> </div> </div> <hr/><h2>Function Documentation</h2> <a class="anchor" id="gaf3dc48257284437d340d8493b33b9b98"></a><!-- doxytag: member="tc.c::rtnl_tc_calc_txtime" ref="gaf3dc48257284437d340d8493b33b9b98" args="(int bufsize, int rate)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int rtnl_tc_calc_txtime </td> <td>(</td> <td class="paramtype">int </td> <td class="paramname"><em>bufsize</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>rate</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">bufsize</td><td>Size of buffer to be transmited in bytes. </td></tr> <tr><td class="paramname">rate</td><td>Transmit rate in bytes per second.</td></tr> </table> </dd> </dl> <p>Calculates the number of micro seconds required to transmit a specific buffer at a specific transmit rate.</p> <p class="formulaDsp"> <img class="formulaDsp" alt="\[ txtime=\frac{bufsize}{rate}10^6 \]" src="form_2.png"/> </p> <dl class="return"><dt><b>Returns:</b></dt><dd>Required transmit time in micro seconds. </dd></dl> <p>Definition at line <a class="el" href="tc_8c_source.html#l00383">383</a> of file <a class="el" href="tc_8c_source.html">tc.c</a>.</p> <p>Referenced by <a class="el" href="tbf_8c_source.html#l00448">rtnl_qdisc_tbf_set_peakrate()</a>, <a class="el" href="tbf_8c_source.html#l00369">rtnl_qdisc_tbf_set_rate()</a>, and <a class="el" href="tc_8c_source.html#l00454">rtnl_tc_build_rate_table()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordtype">double</span> tx_time_secs; tx_time_secs = (double) bufsize / (<span class="keywordtype">double</span>) rate; <span class="keywordflow">return</span> tx_time_secs * 1000000.; } </pre></div> </div> </div> <a class="anchor" id="ga460b3c9b69f0bffd46347b1e2d4497e5"></a><!-- doxytag: member="tc.c::rtnl_tc_calc_bufsize" ref="ga460b3c9b69f0bffd46347b1e2d4497e5" args="(int txtime, int rate)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int rtnl_tc_calc_bufsize </td> <td>(</td> <td class="paramtype">int </td> <td class="paramname"><em>txtime</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>rate</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">txtime</td><td>Available transmit time in micro seconds. </td></tr> <tr><td class="paramname">rate</td><td>Transmit rate in bytes per second.</td></tr> </table> </dd> </dl> <p>Calculates the size of the buffer that can be transmitted in a specific time period at a specific transmit rate.</p> <p class="formulaDsp"> <img class="formulaDsp" alt="\[ bufsize=\frac{{txtime} \times {rate}}{10^6} \]" src="form_3.png"/> </p> <dl class="return"><dt><b>Returns:</b></dt><dd>Size of buffer in bytes. </dd></dl> <p>Definition at line <a class="el" href="tc_8c_source.html#l00406">406</a> of file <a class="el" href="tc_8c_source.html">tc.c</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordtype">double</span> bufsize; bufsize = (double) txtime * (<span class="keywordtype">double</span>) rate; <span class="keywordflow">return</span> bufsize / 1000000.; } </pre></div> </div> </div> <a class="anchor" id="ga149f2e05e2ab75842c99166cae7b3630"></a><!-- doxytag: member="tc.c::rtnl_tc_calc_cell_log" ref="ga149f2e05e2ab75842c99166cae7b3630" args="(int cell_size)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int rtnl_tc_calc_cell_log </td> <td>(</td> <td class="paramtype">int </td> <td class="paramname"><em>cell_size</em></td><td>)</td> <td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">cell_size</td><td>Size of cell, must be a power of two. </td></tr> </table> </dd> </dl> <dl class="return"><dt><b>Returns:</b></dt><dd>Binary logirhtm of cell size or a negative error code. </dd></dl> <p>Definition at line <a class="el" href="tc_8c_source.html#l00420">420</a> of file <a class="el" href="tc_8c_source.html">tc.c</a>.</p> <p>Referenced by <a class="el" href="tc_8c_source.html#l00454">rtnl_tc_build_rate_table()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordtype">int</span> i; <span class="keywordflow">for</span> (i = 0; i < 32; i++) <span class="keywordflow">if</span> ((1 << i) == cell_size) <span class="keywordflow">return</span> i; <span class="keywordflow">return</span> nl_errno(EINVAL); } </pre></div> </div> </div> <a class="anchor" id="gaf0985ec685f9def7fcaba8cb831c4f2c"></a><!-- doxytag: member="tc.c::rtnl_tc_build_rate_table" ref="gaf0985ec685f9def7fcaba8cb831c4f2c" args="(uint32_t *dst, uint8_t mpu, uint8_t overhead, int cell, int rate)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int rtnl_tc_build_rate_table </td> <td>(</td> <td class="paramtype">uint32_t * </td> <td class="paramname"><em>dst</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">uint8_t </td> <td class="paramname"><em>mpu</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">uint8_t </td> <td class="paramname"><em>overhead</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>cell</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>rate</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">dst</td><td>Destination buffer of RTNL_TC_RTABLE_SIZE uint32_t[]. </td></tr> <tr><td class="paramname">mpu</td><td>Minimal size of a packet at all times. </td></tr> <tr><td class="paramname">overhead</td><td>Overhead to be added to each packet. </td></tr> <tr><td class="paramname">cell</td><td>Size of cell, i.e. size of step between entries in bytes. </td></tr> <tr><td class="paramname">rate</td><td>Rate in bytes per second.</td></tr> </table> </dd> </dl> <p>Computes a table of RTNL_TC_RTABLE_SIZE entries specyfing the transmission times for various packet sizes, e.g. the transmission time for a packet of size <code>pktsize</code> could be looked up: </p> <div class="fragment"><pre class="fragment"> txtime = table[pktsize >> log2(cell)]; </pre></div> <p>Definition at line <a class="el" href="tc_8c_source.html#l00454">454</a> of file <a class="el" href="tc_8c_source.html">tc.c</a>.</p> <p>References <a class="el" href="tc_8c_source.html#l00420">rtnl_tc_calc_cell_log()</a>, <a class="el" href="tc_8c_source.html#l00383">rtnl_tc_calc_txtime()</a>, and <a class="el" href="tc_8h_source.html#l00050">RTNL_TC_RTABLE_SIZE</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordtype">int</span> i, size, cell_log; 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); <span class="keywordflow">if</span> (cell_log < 0) <span class="keywordflow">return</span> cell_log; <span class="keywordflow">for</span> (i = 0; i < <a class="code" href="group__tc.html#ga9a0796847debb07d96fe745d9088a6b5" title="Number of entries in a transmission time lookup table.">RTNL_TC_RTABLE_SIZE</a>; i++) { size = (i << cell_log) + overhead; <span class="keywordflow">if</span> (size < mpu) size = mpu; 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); } <span class="keywordflow">return</span> 0; } </pre></div> </div> </div> <a class="anchor" id="ga27fad2a239d4d8d932da0ce1bdbf1f9f"></a><!-- doxytag: member="tc.c::rtnl_tc_handle2str" ref="ga27fad2a239d4d8d932da0ce1bdbf1f9f" args="(uint32_t handle, char *buf, size_t len)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">char* rtnl_tc_handle2str </td> <td>(</td> <td class="paramtype">uint32_t </td> <td class="paramname"><em>handle</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">char * </td> <td class="paramname"><em>buf</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">size_t </td> <td class="paramname"><em>len</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">handle</td><td>traffic control handle </td></tr> <tr><td class="paramname">buf</td><td>destination buffer </td></tr> <tr><td class="paramname">len</td><td>buffer length</td></tr> </table> </dd> </dl> <p>Converts a tarffic control handle to a character string in the form of <code>MAJ:MIN</code> and stores it in the specified destination buffer.</p> <dl class="return"><dt><b>Returns:</b></dt><dd>The destination buffer or the type encoded in hexidecimal form if no match was found. </dd></dl> <p>Definition at line <a class="el" href="tc_8c_source.html#l00493">493</a> of file <a class="el" href="tc_8c_source.html">tc.c</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordflow">if</span> (TC_H_ROOT == handle) snprintf(buf, len, <span class="stringliteral">"root"</span>); <span class="keywordflow">else</span> <span class="keywordflow">if</span> (TC_H_UNSPEC == handle) snprintf(buf, len, <span class="stringliteral">"none"</span>); <span class="keywordflow">else</span> <span class="keywordflow">if</span> (0 == TC_H_MAJ(handle)) snprintf(buf, len, <span class="stringliteral">":%02x"</span>, TC_H_MIN(handle)); <span class="keywordflow">else</span> <span class="keywordflow">if</span> (0 == TC_H_MIN(handle)) snprintf(buf, len, <span class="stringliteral">"%02x:"</span>, TC_H_MAJ(handle) >> 16); <span class="keywordflow">else</span> snprintf(buf, len, <span class="stringliteral">"%02x:%02x"</span>, TC_H_MAJ(handle) >> 16, TC_H_MIN(handle)); <span class="keywordflow">return</span> buf; } </pre></div> </div> </div> <a class="anchor" id="gab2197ef937705965b0c6f0c32e5409e6"></a><!-- doxytag: member="tc.c::rtnl_tc_str2handle" ref="gab2197ef937705965b0c6f0c32e5409e6" args="(const char *name, uint32_t *res)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int rtnl_tc_str2handle </td> <td>(</td> <td class="paramtype">const char * </td> <td class="paramname"><em>name</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">uint32_t * </td> <td class="paramname"><em>res</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">name</td><td>traffic control handle as character string </td></tr> <tr><td class="paramname">res</td><td>destination buffer</td></tr> </table> </dd> </dl> <p>Converts the provided character string specifying a traffic control handle to the corresponding numeric value.</p> <p>The handle must be provided in one of the following formats:</p> <ul> <li>root</li> <li>none</li> <li>XXXX:</li> <li>:YYYY</li> <li>XXXX:YYYY</li> <li>XXXXYYYY</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="tc_8c_source.html#l00528">528</a> of file <a class="el" href="tc_8c_source.html">tc.c</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordtype">char</span> *colon, *end; uint32_t h; <span class="keywordflow">if</span> (!strcasecmp(name, <span class="stringliteral">"root"</span>)) { *res = TC_H_ROOT; <span class="keywordflow">return</span> 0; } <span class="keywordflow">if</span> (!strcasecmp(name, <span class="stringliteral">"none"</span>)) { *res = TC_H_UNSPEC; <span class="keywordflow">return</span> 0; } h = strtoul(name, &colon, 16); <span class="keywordflow">if</span> (colon == name) { <span class="comment">/* :YYYY */</span> h = 0; <span class="keywordflow">if</span> (<span class="charliteral">':'</span> != *colon) <span class="keywordflow">return</span> -EINVAL; } <span class="keywordflow">if</span> (<span class="charliteral">':'</span> == *colon) { <span class="comment">/* check if we would lose bits */</span> <span class="keywordflow">if</span> (TC_H_MAJ(h)) <span class="keywordflow">return</span> -ERANGE; h <<= 16; <span class="keywordflow">if</span> (<span class="charliteral">'\0'</span> == colon[1]) { <span class="comment">/* XXXX: */</span> *res = h; } <span class="keywordflow">else</span> { <span class="comment">/* XXXX:YYYY */</span> uint32_t l = strtoul(colon+1, &end, 16); <span class="comment">/* check if we overlap with major part */</span> <span class="keywordflow">if</span> (TC_H_MAJ(l)) <span class="keywordflow">return</span> -ERANGE; <span class="keywordflow">if</span> (<span class="charliteral">'\0'</span> != *end) <span class="keywordflow">return</span> -EINVAL; *res = (h | l); } } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="charliteral">'\0'</span> == *colon) { <span class="comment">/* XXXXYYYY */</span> *res = h; } <span class="keywordflow">else</span> <span class="keywordflow">return</span> -EINVAL; <span class="keywordflow">return</span> 0; } </pre></div> </div> </div> </div> <hr class="footer"/><address class="footer"><small>Generated on Mon Mar 21 2011 for libnl by  <a href="http://www.doxygen.org/index.html"> <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.3 </small></address> </body> </html>