<!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: Addresses</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="headertitle"> <h1>Addresses</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="member-group"></a> Allocation/Freeing</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga234e9919665614ce3193847c8f43c2b0"></a><!-- doxytag: member="rtaddr::rtnl_addr_alloc" ref="ga234e9919665614ce3193847c8f43c2b0" args="(void)" --> struct rtnl_addr * </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_alloc</b> (void)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga05b1f67ed4a145706c3acf178e498652"></a><!-- doxytag: member="rtaddr::rtnl_addr_put" ref="ga05b1f67ed4a145706c3acf178e498652" args="(struct rtnl_addr *addr)" --> void </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_put</b> (struct rtnl_addr *addr)</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"><a class="anchor" id="ga49a90471fbc4d83f4127cbbd4f971c40"></a><!-- doxytag: member="rtaddr::rtnl_addr_alloc_cache" ref="ga49a90471fbc4d83f4127cbbd4f971c40" args="(struct nl_handle *handle)" --> struct nl_cache * </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_alloc_cache</b> (struct nl_handle *handle)</td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Addition</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct nl_msg * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__rtaddr.html#ga85d2aead6c32082fb4e8e7680be968b9">rtnl_addr_build_add_request</a> (struct rtnl_addr *addr, int flags)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Build netlink request message to request addition of new address. <a href="#ga85d2aead6c32082fb4e8e7680be968b9"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__rtaddr.html#gaca17d1f36aba895483069b53c0a237b1">rtnl_addr_add</a> (struct nl_handle *handle, struct rtnl_addr *addr, int flags)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Request addition of new address. <a href="#gaca17d1f36aba895483069b53c0a237b1"></a><br/></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Deletion</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top">struct nl_msg * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__rtaddr.html#ga187197659007dbb5deb4282cf546d18a">rtnl_addr_build_delete_request</a> (struct rtnl_addr *addr, int flags)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Build a netlink request message to request deletion of an address. <a href="#ga187197659007dbb5deb4282cf546d18a"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__rtaddr.html#ga525b1c90bb5a26c0c945a93d37973c8a">rtnl_addr_delete</a> (struct nl_handle *handle, struct rtnl_addr *addr, int flags)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Request deletion of an address. <a href="#ga525b1c90bb5a26c0c945a93d37973c8a"></a><br/></td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Attributes</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gadc7831a2bf0d291e7512f325127f8676"></a><!-- doxytag: member="rtaddr::rtnl_addr_set_label" ref="gadc7831a2bf0d291e7512f325127f8676" args="(struct rtnl_addr *addr, const char *label)" --> void </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_set_label</b> (struct rtnl_addr *addr, const char *label)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga231d94f0a7b1cfb0968c45dadb6434e8"></a><!-- doxytag: member="rtaddr::rtnl_addr_get_label" ref="ga231d94f0a7b1cfb0968c45dadb6434e8" args="(struct rtnl_addr *addr)" --> char * </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_get_label</b> (struct rtnl_addr *addr)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga2a3d7dfa3a9ddfac3c20386f9dc73920"></a><!-- doxytag: member="rtaddr::rtnl_addr_set_ifindex" ref="ga2a3d7dfa3a9ddfac3c20386f9dc73920" args="(struct rtnl_addr *addr, int ifindex)" --> void </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_set_ifindex</b> (struct rtnl_addr *addr, int ifindex)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gae664128e6fcf99e40ff52accbffaa0c2"></a><!-- doxytag: member="rtaddr::rtnl_addr_get_ifindex" ref="gae664128e6fcf99e40ff52accbffaa0c2" args="(struct rtnl_addr *addr)" --> int </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_get_ifindex</b> (struct rtnl_addr *addr)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gaaab07f1a14ab7be5c54ce350f87d0727"></a><!-- doxytag: member="rtaddr::rtnl_addr_set_family" ref="gaaab07f1a14ab7be5c54ce350f87d0727" args="(struct rtnl_addr *addr, int family)" --> void </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_set_family</b> (struct rtnl_addr *addr, int family)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gac2faf870212741c1980f20a4cd6b8d78"></a><!-- doxytag: member="rtaddr::rtnl_addr_get_family" ref="gac2faf870212741c1980f20a4cd6b8d78" args="(struct rtnl_addr *addr)" --> int </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_get_family</b> (struct rtnl_addr *addr)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gadf25e4b270e5cd4cd4293645adb83e5b"></a><!-- doxytag: member="rtaddr::rtnl_addr_set_prefixlen" ref="gadf25e4b270e5cd4cd4293645adb83e5b" args="(struct rtnl_addr *addr, int prefix)" --> void </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_set_prefixlen</b> (struct rtnl_addr *addr, int prefix)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga855ea7ecbd5d0f7e7dadbb3f389d15e3"></a><!-- doxytag: member="rtaddr::rtnl_addr_get_prefixlen" ref="ga855ea7ecbd5d0f7e7dadbb3f389d15e3" args="(struct rtnl_addr *addr)" --> int </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_get_prefixlen</b> (struct rtnl_addr *addr)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga50b8468584e9ce9091c14bd967ac5439"></a><!-- doxytag: member="rtaddr::rtnl_addr_set_scope" ref="ga50b8468584e9ce9091c14bd967ac5439" args="(struct rtnl_addr *addr, int scope)" --> void </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_set_scope</b> (struct rtnl_addr *addr, int scope)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gad165a49ebb2d18be22cce5d2639461c9"></a><!-- doxytag: member="rtaddr::rtnl_addr_get_scope" ref="gad165a49ebb2d18be22cce5d2639461c9" args="(struct rtnl_addr *addr)" --> int </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_get_scope</b> (struct rtnl_addr *addr)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga9ca84385567aabaaa46aa979a310d955"></a><!-- doxytag: member="rtaddr::rtnl_addr_set_flags" ref="ga9ca84385567aabaaa46aa979a310d955" args="(struct rtnl_addr *addr, unsigned int flags)" --> void </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_set_flags</b> (struct rtnl_addr *addr, unsigned int flags)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga03f37130a7288d5f918f9ac60dd48fae"></a><!-- doxytag: member="rtaddr::rtnl_addr_unset_flags" ref="ga03f37130a7288d5f918f9ac60dd48fae" args="(struct rtnl_addr *addr, unsigned int flags)" --> void </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_unset_flags</b> (struct rtnl_addr *addr, unsigned int flags)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga4b63fb4fcaa0b6c3d7b2b0dc5e081382"></a><!-- doxytag: member="rtaddr::rtnl_addr_get_flags" ref="ga4b63fb4fcaa0b6c3d7b2b0dc5e081382" args="(struct rtnl_addr *addr)" --> unsigned int </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_get_flags</b> (struct rtnl_addr *addr)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga60ce2ba4259d84480eb81483850d70f7"></a><!-- doxytag: member="rtaddr::rtnl_addr_set_local" ref="ga60ce2ba4259d84480eb81483850d70f7" args="(struct rtnl_addr *addr, struct nl_addr *local)" --> int </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_set_local</b> (struct rtnl_addr *addr, struct nl_addr *local)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga77d81f83af21d47f454aaa16bdb74cf5"></a><!-- doxytag: member="rtaddr::rtnl_addr_get_local" ref="ga77d81f83af21d47f454aaa16bdb74cf5" args="(struct rtnl_addr *addr)" --> struct nl_addr * </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_get_local</b> (struct rtnl_addr *addr)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga4e35b5d706a9d0df3cbb9c257ea26564"></a><!-- doxytag: member="rtaddr::rtnl_addr_set_peer" ref="ga4e35b5d706a9d0df3cbb9c257ea26564" args="(struct rtnl_addr *addr, struct nl_addr *peer)" --> int </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_set_peer</b> (struct rtnl_addr *addr, struct nl_addr *peer)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gab63af1dc2f67712534791c680b38a103"></a><!-- doxytag: member="rtaddr::rtnl_addr_get_peer" ref="gab63af1dc2f67712534791c680b38a103" args="(struct rtnl_addr *addr)" --> struct nl_addr * </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_get_peer</b> (struct rtnl_addr *addr)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gaec6cb9e29ba6deb696cef3892c070846"></a><!-- doxytag: member="rtaddr::rtnl_addr_set_broadcast" ref="gaec6cb9e29ba6deb696cef3892c070846" args="(struct rtnl_addr *addr, struct nl_addr *bcast)" --> int </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_set_broadcast</b> (struct rtnl_addr *addr, struct nl_addr *bcast)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga1f17f041e7632ccc98f17614943f8f3a"></a><!-- doxytag: member="rtaddr::rtnl_addr_get_broadcast" ref="ga1f17f041e7632ccc98f17614943f8f3a" args="(struct rtnl_addr *addr)" --> struct nl_addr * </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_get_broadcast</b> (struct rtnl_addr *addr)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga08797df4c303a1e1412baaee01c2c38e"></a><!-- doxytag: member="rtaddr::rtnl_addr_set_anycast" ref="ga08797df4c303a1e1412baaee01c2c38e" args="(struct rtnl_addr *addr, struct nl_addr *anycast)" --> int </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_set_anycast</b> (struct rtnl_addr *addr, struct nl_addr *anycast)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga74f4c2ed3a87f4b74def69a518014827"></a><!-- doxytag: member="rtaddr::rtnl_addr_get_anycast" ref="ga74f4c2ed3a87f4b74def69a518014827" args="(struct rtnl_addr *addr)" --> struct nl_addr * </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_get_anycast</b> (struct rtnl_addr *addr)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gabc3fefcf122f096ef54c2f8e2ffa8058"></a><!-- doxytag: member="rtaddr::rtnl_addr_set_multicast" ref="gabc3fefcf122f096ef54c2f8e2ffa8058" args="(struct rtnl_addr *addr, struct nl_addr *multicast)" --> int </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_set_multicast</b> (struct rtnl_addr *addr, struct nl_addr *multicast)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga0eb0ff51182467f7a6b8da7a78a758f1"></a><!-- doxytag: member="rtaddr::rtnl_addr_get_multicast" ref="ga0eb0ff51182467f7a6b8da7a78a758f1" args="(struct rtnl_addr *addr)" --> struct nl_addr * </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_get_multicast</b> (struct rtnl_addr *addr)</td></tr> <tr><td colspan="2"><h2><a name="member-group"></a> Flags Translations</h2></td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gab2759acd7f9e544e0a1added549582cd"></a><!-- doxytag: member="rtaddr::rtnl_addr_flags2str" ref="gab2759acd7f9e544e0a1added549582cd" args="(int flags, char *buf, size_t size)" --> char * </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_flags2str</b> (int flags, char *buf, size_t size)</td></tr> <tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga422a2ef5611591fee6de337985390b96"></a><!-- doxytag: member="rtaddr::rtnl_addr_str2flags" ref="ga422a2ef5611591fee6de337985390b96" args="(const char *name)" --> int </td><td class="memItemRight" valign="bottom"><b>rtnl_addr_str2flags</b> (const char *name)</td></tr> </table> <hr/><a name="_details"></a><h2>Detailed Description</h2> <dl class="note"><dt><b>Note:</b></dt><dd>The maximum size of an address label is IFNAMSIZ.</dd> <dd> The address may not contain a prefix length if the peer address has been specified already.</dd></dl> <dl class="user"><dt><b>1) Address Addition</b></dt><dd><div class="fragment"><pre class="fragment"> <span class="comment">// Allocate an empty address object to be filled out with the attributes</span> <span class="comment">// of the new address.</span> <span class="keyword">struct </span>rtnl_addr *addr = rtnl_addr_alloc(); <span class="comment">// Fill out the mandatory attributes of the new address. Setting the</span> <span class="comment">// local address will automatically set the address family and the</span> <span class="comment">// prefix length to the correct values.</span> rtnl_addr_set_ifindex(addr, ifindex); rtnl_addr_set_local(addr, local_addr); <span class="comment">// The label of the address can be specified, currently only supported</span> <span class="comment">// by IPv4 and DECnet.</span> rtnl_addr_set_label(addr, <span class="stringliteral">"mylabel"</span>); <span class="comment">// The peer address can be specified if necessary, in either case a peer</span> <span class="comment">// address will be sent to the kernel in order to fullfil the interface</span> <span class="comment">// requirements. If none is set, it will equal the local address.</span> <span class="comment">// Note: Real peer addresses are only supported by IPv4 for now.</span> rtnl_addr_set_peer(addr, peer_addr); <span class="comment">// In case you want to have the address have a scope other than global</span> <span class="comment">// it may be overwritten using rtnl_addr_set_scope(). The scope currently</span> <span class="comment">// cannot be set for IPv6 addresses.</span> rtnl_addr_set_scope(addr, rtnl_str2scope(<span class="stringliteral">"site"</span>)); <span class="comment">// Broadcast and anycast address may be specified using the relevant</span> <span class="comment">// functions, the address family will be verified if one of the other</span> <span class="comment">// addresses has been set already. Currently only works for IPv4.</span> rtnl_addr_set_broadcast(addr, broadcast_addr); rtnl_addr_set_anycast(addr, anycast_addr); <span class="comment">// Build the netlink message and send it to the kernel, the operation will</span> <span class="comment">// block until the operation has been completed. Alternatively the required</span> <span class="comment">// netlink message can be built using rtnl_addr_build_add_request() to be</span> <span class="comment">// sent out using nl_send_auto_complete().</span> <a class="code" href="group__rtaddr.html#gaca17d1f36aba895483069b53c0a237b1" title="Request addition of new address.">rtnl_addr_add</a>(handle, addr, 0); <span class="comment">// Free the memory</span> rtnl_addr_put(addr); </pre></div></dd></dl> <dl class="user"><dt><b>2) Address Deletion</b></dt><dd><div class="fragment"><pre class="fragment"> <span class="comment">// Allocate an empty address object to be filled out with the attributes</span> <span class="comment">// matching the address to be deleted. Alternatively a fully equipped</span> <span class="comment">// address object out of a cache can be used instead.</span> <span class="keyword">struct </span>rtnl_addr *addr = rtnl_addr_alloc(); <span class="comment">// The only mandatory parameter besides the address family is the interface</span> <span class="comment">// index the address is on, i.e. leaving out all other parameters will</span> <span class="comment">// result in all addresses of the specified address family interface tuple</span> <span class="comment">// to be deleted.</span> rtnl_addr_set_ifindex(addr, ifindex); <span class="comment">// Specyfing the address family manually is only required if neither the</span> <span class="comment">// local nor peer address have been specified.</span> rtnl_addr_set_family(addr, AF_INET); <span class="comment">// Specyfing the local address is optional but the best choice to delete</span> <span class="comment">// specific addresses.</span> rtnl_addr_set_local(addr, local_addr); <span class="comment">// The label of the address can be specified, currently only supported</span> <span class="comment">// by IPv4 and DECnet.</span> rtnl_addr_set_label(addr, <span class="stringliteral">"mylabel"</span>); <span class="comment">// The peer address can be specified if necessary, in either case a peer</span> <span class="comment">// address will be sent to the kernel in order to fullfil the interface</span> <span class="comment">// requirements. If none is set, it will equal the local address.</span> <span class="comment">// Note: Real peer addresses are only supported by IPv4 for now.</span> rtnl_addr_set_peer(addr, peer_addr); <span class="comment">// Build the netlink message and send it to the kernel, the operation will</span> <span class="comment">// block until the operation has been completed. Alternatively the required</span> <span class="comment">// netlink message can be built using rtnl_addr_build_delete_request()</span> <span class="comment">// to be sent out using nl_send_auto_complete().</span> <a class="code" href="group__rtaddr.html#ga525b1c90bb5a26c0c945a93d37973c8a" title="Request deletion of an address.">rtnl_addr_delete</a>(handle, addr, 0); <span class="comment">// Free the memory</span> rtnl_addr_put(addr); </pre></div> </dd></dl> <hr/><h2>Function Documentation</h2> <a class="anchor" id="ga85d2aead6c32082fb4e8e7680be968b9"></a><!-- doxytag: member="addr.c::rtnl_addr_build_add_request" ref="ga85d2aead6c32082fb4e8e7680be968b9" args="(struct rtnl_addr *addr, int flags)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">struct nl_msg* rtnl_addr_build_add_request </td> <td>(</td> <td class="paramtype">struct rtnl_addr * </td> <td class="paramname"><em>addr</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">addr</td><td>Address object representing the new address. </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 the addition of a new address. The netlink message header isn't fully equipped with all relevant fields and must thus be sent out via <a class="el" href="group__nl.html#ga01a2aad82350f867e704d5c696438b60" title="Send netlink message and check & extend header values as needed.">nl_send_auto_complete()</a> or supplemented as needed.</p> <p>Minimal required attributes:</p> <ul> <li>interface index (rtnl_addr_set_ifindex())</li> <li>local address (rtnl_addr_set_local())</li> </ul> <p>The scope will default to universe except for loopback addresses in which case a host scope is used if not specified otherwise.</p> <dl class="note"><dt><b>Note:</b></dt><dd>Free the memory after usage using <a class="el" href="group__msg.html#ga138ba9bee70553f9fbe7143deacad48c" title="Free a netlink message.">nlmsg_free()</a>. </dd></dl> <dl class="return"><dt><b>Returns:</b></dt><dd>Newly allocated netlink message or NULL if an error occured. </dd></dl> <p>Definition at line <a class="el" href="route_2addr_8c_source.html#l00737">737</a> of file <a class="el" href="route_2addr_8c_source.html">addr.c</a>.</p> <p>References <a class="el" href="netlink-kernel_8h_source.html#l00134">NLM_F_CREATE</a>.</p> <p>Referenced by <a class="el" href="route_2addr_8c_source.html#l00765">rtnl_addr_add()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordtype">int</span> required = ADDR_ATTR_IFINDEX | ADDR_ATTR_FAMILY | ADDR_ATTR_PREFIXLEN | ADDR_ATTR_LOCAL; <span class="keywordflow">if</span> ((addr->ce_mask & required) != required) { nl_error(EINVAL, <span class="stringliteral">"Missing mandatory attributes, required are: "</span> <span class="stringliteral">"ifindex, family, prefixlen, local address."</span>); <span class="keywordflow">return</span> NULL; } <span class="keywordflow">return</span> build_addr_msg(addr, RTM_NEWADDR, <a class="code" href="group__msg.html#ga20a00ae52e4c150f54649d7346d23a7a" title="Create config object if it doesn&#39;t already exist.">NLM_F_CREATE</a> | flags); } </pre></div> </div> </div> <a class="anchor" id="gaca17d1f36aba895483069b53c0a237b1"></a><!-- doxytag: member="addr.c::rtnl_addr_add" ref="gaca17d1f36aba895483069b53c0a237b1" args="(struct nl_handle *handle, struct rtnl_addr *addr, int flags)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int rtnl_addr_add </td> <td>(</td> <td class="paramtype">struct nl_handle * </td> <td class="paramname"><em>handle</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">struct rtnl_addr * </td> <td class="paramname"><em>addr</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>flags</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">handle</td><td>Netlink handle. </td></tr> <tr><td class="paramname">addr</td><td>Address object representing the new address. </td></tr> <tr><td class="paramname">flags</td><td>Additional netlink message flags.</td></tr> </table> </dd> </dl> <p>Builds a netlink message by calling <a class="el" href="group__rtaddr.html#ga85d2aead6c32082fb4e8e7680be968b9" title="Build netlink request message to request addition of new address.">rtnl_addr_build_add_request()</a>, sends the request to the kernel and waits for the next ACK to be received and thus blocks until the request has been fullfilled.</p> <dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__rtaddr.html#ga85d2aead6c32082fb4e8e7680be968b9" title="Build netlink request message to request addition of new address.">rtnl_addr_build_add_request()</a></dd></dl> <dl class="return"><dt><b>Returns:</b></dt><dd>0 on sucess or a negative error if an error occured. </dd></dl> <p>Definition at line <a class="el" href="route_2addr_8c_source.html#l00765">765</a> of file <a class="el" href="route_2addr_8c_source.html">addr.c</a>.</p> <p>References <a class="el" href="nl_8c_source.html#l00373">nl_send_auto_complete()</a>, <a class="el" href="nl_8c_source.html#l00800">nl_wait_for_ack()</a>, <a class="el" href="msg_8c_source.html#l00656">nlmsg_free()</a>, and <a class="el" href="route_2addr_8c_source.html#l00737">rtnl_addr_build_add_request()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keyword">struct </span>nl_msg *msg; <span class="keywordtype">int</span> err; msg = <a class="code" href="group__rtaddr.html#ga85d2aead6c32082fb4e8e7680be968b9" title="Build netlink request message to request addition of new address.">rtnl_addr_build_add_request</a>(addr, flags); <span class="keywordflow">if</span> (!msg) <span class="keywordflow">return</span> nl_get_errno(); 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__nl.html#gaa65fec588e0a0a2de1881fb8366ccd79" title="Wait for ACK.">nl_wait_for_ack</a>(handle); } </pre></div> </div> </div> <a class="anchor" id="ga187197659007dbb5deb4282cf546d18a"></a><!-- doxytag: member="addr.c::rtnl_addr_build_delete_request" ref="ga187197659007dbb5deb4282cf546d18a" args="(struct rtnl_addr *addr, int flags)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">struct nl_msg* rtnl_addr_build_delete_request </td> <td>(</td> <td class="paramtype">struct rtnl_addr * </td> <td class="paramname"><em>addr</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">addr</td><td>Address object to be deleteted. </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 deletion of an address. The netlink message header isn't fully equipped with all relevant fields and must thus be sent out via <a class="el" href="group__nl.html#ga01a2aad82350f867e704d5c696438b60" title="Send netlink message and check & extend header values as needed.">nl_send_auto_complete()</a> or supplemented as needed.</p> <p>Minimal required attributes:</p> <ul> <li>interface index (rtnl_addr_set_ifindex())</li> <li>address family (rtnl_addr_set_family())</li> </ul> <p>Optional attributes:</p> <ul> <li>local address (rtnl_addr_set_local())</li> <li>label (rtnl_addr_set_label(), IPv4/DECnet only)</li> <li>peer address (rtnl_addr_set_peer(), IPv4 only)</li> </ul> <dl class="note"><dt><b>Note:</b></dt><dd>Free the memory after usage using <a class="el" href="group__msg.html#ga138ba9bee70553f9fbe7143deacad48c" title="Free a netlink message.">nlmsg_free()</a>. </dd></dl> <dl class="return"><dt><b>Returns:</b></dt><dd>Newly allocated netlink message or NULL if an error occured. </dd></dl> <p>Definition at line <a class="el" href="route_2addr_8c_source.html#l00811">811</a> of file <a class="el" href="route_2addr_8c_source.html">addr.c</a>.</p> <p>Referenced by <a class="el" href="route_2addr_8c_source.html#l00838">rtnl_addr_delete()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keywordtype">int</span> required = ADDR_ATTR_IFINDEX | ADDR_ATTR_FAMILY; <span class="keywordflow">if</span> ((addr->ce_mask & required) != required) { nl_error(EINVAL, <span class="stringliteral">"Missing mandatory attributes, required are: "</span> <span class="stringliteral">"ifindex, family"</span>); <span class="keywordflow">return</span> NULL; } <span class="keywordflow">return</span> build_addr_msg(addr, RTM_DELADDR, flags); } </pre></div> </div> </div> <a class="anchor" id="ga525b1c90bb5a26c0c945a93d37973c8a"></a><!-- doxytag: member="addr.c::rtnl_addr_delete" ref="ga525b1c90bb5a26c0c945a93d37973c8a" args="(struct nl_handle *handle, struct rtnl_addr *addr, int flags)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int rtnl_addr_delete </td> <td>(</td> <td class="paramtype">struct nl_handle * </td> <td class="paramname"><em>handle</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">struct rtnl_addr * </td> <td class="paramname"><em>addr</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>flags</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div> <div class="memdoc"> <dl><dt><b>Parameters:</b></dt><dd> <table class="params"> <tr><td class="paramname">handle</td><td>Netlink handle. </td></tr> <tr><td class="paramname">addr</td><td>Address object to be deleted. </td></tr> <tr><td class="paramname">flags</td><td>Additional netlink message flags.</td></tr> </table> </dd> </dl> <p>Builds a netlink message by calling <a class="el" href="group__rtaddr.html#ga187197659007dbb5deb4282cf546d18a" title="Build a netlink request message to request deletion of an address.">rtnl_addr_build_delete_request()</a>, sends the request to the kernel and waits for the next ACK to be received and thus blocks until the request has been fullfilled.</p> <dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__rtaddr.html#ga187197659007dbb5deb4282cf546d18a" title="Build a netlink request message to request deletion of an address.">rtnl_addr_build_delete_request()</a>;</dd></dl> <dl class="return"><dt><b>Returns:</b></dt><dd>0 on sucess or a negative error if an error occured. </dd></dl> <p>Definition at line <a class="el" href="route_2addr_8c_source.html#l00838">838</a> of file <a class="el" href="route_2addr_8c_source.html">addr.c</a>.</p> <p>References <a class="el" href="nl_8c_source.html#l00373">nl_send_auto_complete()</a>, <a class="el" href="nl_8c_source.html#l00800">nl_wait_for_ack()</a>, <a class="el" href="msg_8c_source.html#l00656">nlmsg_free()</a>, and <a class="el" href="route_2addr_8c_source.html#l00811">rtnl_addr_build_delete_request()</a>.</p> <div class="fragment"><pre class="fragment">{ <span class="keyword">struct </span>nl_msg *msg; <span class="keywordtype">int</span> err; msg = <a class="code" href="group__rtaddr.html#ga187197659007dbb5deb4282cf546d18a" title="Build a netlink request message to request deletion of an address.">rtnl_addr_build_delete_request</a>(addr, flags); <span class="keywordflow">if</span> (!msg) <span class="keywordflow">return</span> nl_get_errno(); 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__nl.html#gaa65fec588e0a0a2de1881fb8366ccd79" title="Wait for ACK.">nl_wait_for_ack</a>(handle); } </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>