<!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: FIB Lookup</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <link href="doxygen.css" rel="stylesheet" type="text/css"/> </head> <body> <!-- Generated by Doxygen 1.7.3 --> <div id="top"> <div id="titlearea"> <table cellspacing="0" cellpadding="0"> <tbody> <tr style="height: 56px;"> <td style="padding-left: 0.5em;"> <div id="projectname">libnl <span id="projectnumber">1.1</span></div> </td> </tr> </tbody> </table> </div> <div id="navrow1" class="tabs"> <ul class="tablist"> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="modules.html"><span>Modules</span></a></li> <li><a href="annotated.html"><span>Data Structures</span></a></li> <li><a href="files.html"><span>Files</span></a></li> </ul> </div> </div> <div class="header"> <div class="summary"> <a href="#groups">Modules</a> </div> <div class="headertitle"> <h1>FIB Lookup</h1> </div> <div class="ingroups"><a class="el" href="group__nlfam.html">Netlink Families</a></div></div> <div class="contents"> <table class="memberdecls"> <tr><td colspan="2"><h2><a name="groups"></a> Modules</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__flreq.html">Request</a></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Allocation/Freeing</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga84dc2337289669fdefde3994fbe113dd"></a><!-- doxytag: member="fib_lookup::flnl_result_alloc" ref="ga84dc2337289669fdefde3994fbe113dd" args="(void)" --> struct flnl_result * </td><td class="memItemRight" valign="bottom"><b>flnl_result_alloc</b> (void)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga799fe8cddf4f63fb5b0dd3a0c78b22a7"></a><!-- doxytag: member="fib_lookup::flnl_result_put" ref="ga799fe8cddf4f63fb5b0dd3a0c78b22a7" args="(struct flnl_result *res)" --> void </td><td class="memItemRight" valign="bottom"><b>flnl_result_put</b> (struct flnl_result *res)</td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Cache Management</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct nl_cache * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__fib__lookup.html#ga5ab311aae5e0e2497167f34d326bfc8b">flnl_result_alloc_cache</a> (void)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate lookup result cache. <a href="#ga5ab311aae5e0e2497167f34d326bfc8b"></a><br/></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Lookup</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct nl_msg * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__fib__lookup.html#ga82fd5afaecd398c3a5245daa1423c46e">flnl_lookup_build_request</a> (struct flnl_request *req, int flags)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Builds a netlink request message to do a lookup. <a href="#ga82fd5afaecd398c3a5245daa1423c46e"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__fib__lookup.html#ga3d4a00b94f50e5d6d1cea6c756a43b5a">flnl_lookup</a> (struct nl_handle *handle, struct flnl_request *req, struct nl_cache *cache)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Perform FIB Lookup. <a href="#ga3d4a00b94f50e5d6d1cea6c756a43b5a"></a><br/></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Attribute Access</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga30a94b6e9bd4ff5212da2888bcaf1492"></a><!-- doxytag: member="fib_lookup::flnl_result_get_table_id" ref="ga30a94b6e9bd4ff5212da2888bcaf1492" args="(struct flnl_result *res)" --> int </td><td class="memItemRight" valign="bottom"><b>flnl_result_get_table_id</b> (struct flnl_result *res)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga11ac8969736c3fb0aa4c5ee3fbe84f82"></a><!-- doxytag: member="fib_lookup::flnl_result_get_prefixlen" ref="ga11ac8969736c3fb0aa4c5ee3fbe84f82" args="(struct flnl_result *res)" --> int </td><td class="memItemRight" valign="bottom"><b>flnl_result_get_prefixlen</b> (struct flnl_result *res)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gab3a8f473e51d19f5146de1343c780257"></a><!-- doxytag: member="fib_lookup::flnl_result_get_nexthop_sel" ref="gab3a8f473e51d19f5146de1343c780257" args="(struct flnl_result *res)" --> int </td><td class="memItemRight" valign="bottom"><b>flnl_result_get_nexthop_sel</b> (struct flnl_result *res)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga927d72015f74dbcd2a713845ca63e448"></a><!-- doxytag: member="fib_lookup::flnl_result_get_type" ref="ga927d72015f74dbcd2a713845ca63e448" args="(struct flnl_result *res)" --> int </td><td class="memItemRight" valign="bottom"><b>flnl_result_get_type</b> (struct flnl_result *res)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga73c6fedf89f721c638c4fd9f34ef2efd"></a><!-- doxytag: member="fib_lookup::flnl_result_get_scope" ref="ga73c6fedf89f721c638c4fd9f34ef2efd" args="(struct flnl_result *res)" --> int </td><td class="memItemRight" valign="bottom"><b>flnl_result_get_scope</b> (struct flnl_result *res)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga7883928deb4f8f23b2d92dedd902628b"></a><!-- doxytag: member="fib_lookup::flnl_result_get_error" ref="ga7883928deb4f8f23b2d92dedd902628b" args="(struct flnl_result *res)" --> int </td><td class="memItemRight" valign="bottom"><b>flnl_result_get_error</b> (struct flnl_result *res)</td></tr> </table> <hr/><h2>Function Documentation</h2> <a class="anchor" id="ga5ab311aae5e0e2497167f34d326bfc8b"></a><!-- doxytag: member="lookup.c::flnl_result_alloc_cache" ref="ga5ab311aae5e0e2497167f34d326bfc8b" args="(void)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">struct nl_cache* flnl_result_alloc_cache </td> <td>(</td> <td class="paramtype">void </td> <td class="paramname"></td><td>)</td> <td><code> [read]</code></td> </tr> </table> </div> <div class="memdoc"> <p>Allocates a new lookup result cache and initializes it properly.</p> <dl class="note"><dt><b>Note:</b></dt><dd>Free the memory after usage using nl_cache_destroy_and_free(). </dd></dl> <dl class="return"><dt><b>Returns:</b></dt><dd>Newly allocated cache or NULL if an error occured. </dd></dl> <p>Definition at line <a class="el" href="lookup_8c_source.html#l00183">183</a> of file <a class="el" href="lookup_8c_source.html">lookup.c</a>.</p> <p>References <a class="el" href="cache_8c_source.html#l00173">nl_cache_alloc()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordflow">return</span> <a class="code" href="group__cache.html#ga9520ae0f2158db3c081f34c851d92252" title="Allocate an empty cache.">nl_cache_alloc</a>(&fib_lookup_ops); } </pre></div> </div> </div> <a class="anchor" id="ga82fd5afaecd398c3a5245daa1423c46e"></a><!-- doxytag: member="lookup.c::flnl_lookup_build_request" ref="ga82fd5afaecd398c3a5245daa1423c46e" args="(struct flnl_request *req, int flags)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">struct nl_msg* flnl_lookup_build_request </td> <td>(</td> <td class="paramtype">struct flnl_request * </td> <td class="paramname"><em>req</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>flags</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td><code> [read]</code></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">req</td><td>Requested match. </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 a change of link attributes. The netlink message header isn't fully equipped with all relevant fields and must be sent out via <a class="el" href="group__nl.html#ga01a2aad82350f867e704d5c696438b60" title="Send netlink message and check & extend header values as needed.">nl_send_auto_complete()</a> or supplemented as needed. <em>old</em> must point to a link currently configured in the kernel and <em>tmpl</em> must contain the attributes to be changed set via <code>rtnl_link_set_*</code> functions.</p> <dl class="return"><dt><b>Returns:</b></dt><dd>New netlink message </dd></dl> <dl class="note"><dt><b>Note:</b></dt><dd>Not all attributes can be changed, see <a class="el" href="group__link.html#link_changeable">Changeable Attributes</a> for more details. </dd></dl> <p>Definition at line <a class="el" href="lookup_8c_source.html#l00212">212</a> of file <a class="el" href="lookup_8c_source.html">lookup.c</a>.</p> <p>References <a class="el" href="addr_8c_source.html#l00756">nl_addr_get_binary_addr()</a>, <a class="el" href="msg_8c_source.html#l00448">nlmsg_alloc_simple()</a>, <a class="el" href="msg_8c_source.html#l00549">nlmsg_append()</a>, and <a class="el" href="msg_8c_source.html#l00656">nlmsg_free()</a>.</p> <p>Referenced by <a class="el" href="lookup_8c_source.html#l00263">flnl_lookup()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keyword">struct </span>nl_msg *msg; <span class="keyword">struct </span>nl_addr *addr; uint64_t fwmark; <span class="keywordtype">int</span> tos, scope, table; <span class="keyword">struct </span>fib_result_nl fr = {0}; fwmark = flnl_request_get_fwmark(req); tos = flnl_request_get_tos(req); scope = flnl_request_get_scope(req); table = flnl_request_get_table(req); fr.fl_fwmark = fwmark != UINT_LEAST64_MAX ? fwmark : 0; fr.fl_tos = tos >= 0 ? tos : 0; fr.fl_scope = scope >= 0 ? scope : RT_SCOPE_UNIVERSE; fr.tb_id_in = table >= 0 ? table : RT_TABLE_UNSPEC; addr = flnl_request_get_addr(req); <span class="keywordflow">if</span> (!addr) { nl_error(EINVAL, <span class="stringliteral">"Request must specify the address"</span>); <span class="keywordflow">return</span> NULL; } fr.fl_addr = *(uint32_t *) <a class="code" href="group__addr.html#ga7721da4e82e80e8b29960405539ca72d" title="Get binary address of abstract address object.">nl_addr_get_binary_addr</a>(addr); msg = <a class="code" href="group__msg.html#ga580d8697d19050c55060bc10ab4eae9f" title="Allocate a new netlink message.">nlmsg_alloc_simple</a>(0, flags); <span class="keywordflow">if</span> (!msg) <span class="keywordflow">goto</span> errout; <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, &fr, <span class="keyword">sizeof</span>(fr), NLMSG_ALIGNTO) < 0) <span class="keywordflow">goto</span> errout; <span class="keywordflow">return</span> msg; errout: <a class="code" href="group__msg.html#ga138ba9bee70553f9fbe7143deacad48c" title="Free a netlink message.">nlmsg_free</a>(msg); <span class="keywordflow">return</span> NULL; } </pre></div> </div> </div> <a class="anchor" id="ga3d4a00b94f50e5d6d1cea6c756a43b5a"></a><!-- doxytag: member="lookup.c::flnl_lookup" ref="ga3d4a00b94f50e5d6d1cea6c756a43b5a" args="(struct nl_handle *handle, struct flnl_request *req, struct nl_cache *cache)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int flnl_lookup </td> <td>(</td> <td class="paramtype">struct nl_handle * </td> <td class="paramname"><em>handle</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">struct flnl_request * </td> <td class="paramname"><em>req</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">struct nl_cache * </td> <td class="paramname"><em>cache</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">handle</td><td>Netlink handle. </td></tr> <tr><td class="paramname">req</td><td>Lookup request object. </td></tr> <tr><td class="paramname">cache</td><td>Cache for result.</td></tr> </table> </dd> </dl> <p>Builds a netlink message to request a FIB lookup, waits for the reply and adds the result to the specified cache.</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="lookup_8c_source.html#l00263">263</a> of file <a class="el" href="lookup_8c_source.html">lookup.c</a>.</p> <p>References <a class="el" href="lookup_8c_source.html#l00212">flnl_lookup_build_request()</a>, <a class="el" href="cache_8c_source.html#l00487">nl_cache_pickup()</a>, <a class="el" href="nl_8c_source.html#l00373">nl_send_auto_complete()</a>, and <a class="el" href="msg_8c_source.html#l00656">nlmsg_free()</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__fib__lookup.html#ga82fd5afaecd398c3a5245daa1423c46e" title="Builds a netlink request message to do a lookup.">flnl_lookup_build_request</a>(req, 0); <span class="keywordflow">if</span> (!msg) <span class="keywordflow">return</span> nl_errno(ENOMEM); err = <a class="code" href="group__nl.html#ga01a2aad82350f867e704d5c696438b60" title="Send netlink message and check &amp; extend header values as needed.">nl_send_auto_complete</a>(handle, msg); <a class="code" href="group__msg.html#ga138ba9bee70553f9fbe7143deacad48c" title="Free a netlink message.">nlmsg_free</a>(msg); <span class="keywordflow">if</span> (err < 0) <span class="keywordflow">return</span> err; <span class="keywordflow">return</span> <a class="code" href="group__cache.html#gae9ee72b56b5d3e215403105c858b9479" title="Pickup a netlink dump response and put it into a cache.">nl_cache_pickup</a>(handle, cache); } </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>