blob: b25bc5b34bae9ce6e19ad4fe990c7e1fcfba7875 [file] [log] [blame]
<!--
Documentation/_templates/layout.html
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership. The
ASF licenses this file to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance with the
License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
-->
<!DOCTYPE html>
<html class="writer-html5" lang="en" >
<head>
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.18.1: http://docutils.sourceforge.net/" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Network Devices &mdash; NuttX latest documentation</title>
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/copybutton.css" type="text/css" />
<link rel="stylesheet" href="../../_static/tabs.css" type="text/css" />
<link rel="stylesheet" href="../../_static/custom.css" type="text/css" />
<link rel="shortcut icon" href="../../_static/favicon.ico"/>
<!--[if lt IE 9]>
<script src="../../_static/js/html5shiv.min.js"></script>
<![endif]-->
<script src="../../_static/jquery.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/sphinx_highlight.js"></script>
<script src="../../_static/clipboard.min.js"></script>
<script src="../../_static/copybutton.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<link rel="next" title="FAQ" href="../../faq/index.html" />
<link rel="prev" title="Work Queues" href="wqueue.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> NuttX
</a>
<!-- this version selector is quite ugly, should be probably replaced by something
more modern -->
<div class="version-selector">
<select onchange="javascript:location.href = this.value;">
<option value="../../../latest" selected="selected">latest</option>
<option value="../../../10.0.0" >10.0.0</option>
<option value="../../../10.0.1" >10.0.1</option>
<option value="../../../10.1.0" >10.1.0</option>
<option value="../../../10.2.0" >10.2.0</option>
<option value="../../../10.3.0" >10.3.0</option>
<option value="../../../11.0.0" >11.0.0</option>
<option value="../../../12.0.0" >12.0.0</option>
<option value="../../../12.1.0" >12.1.0</option>
<option value="../../../12.2.0" >12.2.0</option>
<option value="../../../12.2.1" >12.2.1</option>
<option value="../../../12.3.0" >12.3.0</option>
<option value="../../../12.4.0" >12.4.0</option>
<option value="../../../12.5.0" >12.5.0</option>
<option value="../../../12.5.1" >12.5.1</option>
</select>
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../index.html">Home</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../introduction/index.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../quickstart/index.html">Getting Started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../contributing/index.html">Contributing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../introduction/inviolables.html">The Inviolable Principles of NuttX</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../platforms/index.html">Supported Platforms</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../components/index.html">OS Components</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../applications/index.html">Applications</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../implementation/index.html">Implementation Details</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../index.html">API Reference</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../user/index.html">Userspace API</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="index.html">Architecture APIs</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="addrenv.html">Address Environments</a></li>
<li class="toctree-l3"><a class="reference internal" href="app_vs_os.html">Application OS vs. Internal OS Interfaces</a></li>
<li class="toctree-l3"><a class="reference internal" href="arch.html">APIs Exported by Architecture-Specific Logic to NuttX</a></li>
<li class="toctree-l3"><a class="reference internal" href="board.html">APIs Exported by Board-Specific Logic to NuttX</a></li>
<li class="toctree-l3"><a class="reference internal" href="conventions.html">Naming and Header File Conventions</a></li>
<li class="toctree-l3"><a class="reference internal" href="iob.html">I/O Buffer Management</a></li>
<li class="toctree-l3"><a class="reference internal" href="led.html">LED Support</a></li>
<li class="toctree-l3"><a class="reference internal" href="mutex.html">Mutual Exclusion lock</a></li>
<li class="toctree-l3"><a class="reference internal" href="nat.html">Network Address Translation (NAT)</a></li>
<li class="toctree-l3"><a class="reference internal" href="newreno.html">Congestion Control NewReno</a></li>
<li class="toctree-l3"><a class="reference internal" href="notifier.html">Notifier Chain</a></li>
<li class="toctree-l3"><a class="reference internal" href="nuttx.html">APIs Exported by NuttX to Architecture-Specific Logic</a></li>
<li class="toctree-l3"><a class="reference internal" href="paging.html">On-Demand Paging</a></li>
<li class="toctree-l3"><a class="reference internal" href="shm.html">Shared Memory</a></li>
<li class="toctree-l3"><a class="reference internal" href="smp.html">Symmetric Multiprocessing (SMP) Application</a></li>
<li class="toctree-l3"><a class="reference internal" href="time_clock.html">System Time and Clock</a></li>
<li class="toctree-l3"><a class="reference internal" href="wqueue.html">Work Queues</a></li>
<li class="toctree-l3 current"><a class="current reference internal" href="#">Network Devices</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#ip-addresses">IP Addresses</a><ul>
<li class="toctree-l5"><a class="reference internal" href="#configuration-options">Configuration Options</a></li>
<li class="toctree-l5"><a class="reference internal" href="#ipv4-interfaces">IPv4 Interfaces</a></li>
<li class="toctree-l5"><a class="reference internal" href="#ipv6-interfaces">IPv6 Interfaces</a></li>
<li class="toctree-l5"><a class="reference internal" href="#ioctls-for-ip-addresses">Ioctls for IP Addresses</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../faq/index.html">FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/index.html">Guides</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../glossary.html">Glossary</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">NuttX</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="../index.html">API Reference</a></li>
<li class="breadcrumb-item"><a href="index.html">Architecture APIs</a></li>
<li class="breadcrumb-item active">Network Devices</li>
<li class="wy-breadcrumbs-aside">
<a href="../../_sources/reference/os/netdev.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="network-devices">
<h1>Network Devices<a class="headerlink" href="#network-devices" title="Permalink to this heading"></a></h1>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">include/nuttx/net/netdev.h</span></code>. All structures and APIs
needed to work with network drivers are provided in this
header file. The structure <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">net_driver_s</span></code> defines the
interface and is passed to the network via
<code class="docutils literal notranslate"><span class="pre">netdev_register()</span></code>.</p></li>
</ul>
<section id="ip-addresses">
<h2>IP Addresses<a class="headerlink" href="#ip-addresses" title="Permalink to this heading"></a></h2>
<p>The structure <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">net_driver_s</span></code> now supports one IPv4 address and
multiple IPv6 addresses. Multiple IPv6 addresses is common in modern
network devices. For example, a network device may have a link-local
address and a global address. The link-local address is used for
neighbor discovery protocol and the global address is used for
communication with the Internet.</p>
<section id="configuration-options">
<h3>Configuration Options<a class="headerlink" href="#configuration-options" title="Permalink to this heading"></a></h3>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">CONFIG_NETDEV_MULTIPLE_IPv6</span></code></dt><dd><p>Enable support for multiple IPv6 addresses per network device.
Depends on <code class="docutils literal notranslate"><span class="pre">CONFIG_NET_IPv6</span></code>.</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">CONFIG_NETDEV_MAX_IPv6_ADDR</span></code></dt><dd><p>Maximum number of IPv6 addresses that can be assigned to a single
network device. Normally a link-local address and a global address
are needed.</p>
</dd>
</dl>
</section>
<section id="ipv4-interfaces">
<h3>IPv4 Interfaces<a class="headerlink" href="#ipv4-interfaces" title="Permalink to this heading"></a></h3>
<p>Now we only support one IPv4 address per network device, and directly
use the <code class="xref c c-member docutils literal notranslate"><span class="pre">d_ipaddr</span></code>, <code class="xref c c-member docutils literal notranslate"><span class="pre">d_draddr</span></code> and <code class="xref c c-member docutils literal notranslate"><span class="pre">d_netmask</span></code>
in <a class="reference internal" href="#c.net_driver_s" title="net_driver_s"><code class="xref c c-struct docutils literal notranslate"><span class="pre">net_driver_s</span></code></a>.</p>
<dl class="c struct">
<dt class="sig sig-object c" id="c.net_driver_s">
<span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">net_driver_s</span></span></span><a class="headerlink" href="#c.net_driver_s" title="Permalink to this definition"></a><br /></dt>
<dd><div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">struct</span><span class="w"> </span><span class="nc">net_driver_s</span>
<span class="p">{</span>
<span class="cp">#ifdef CONFIG_NET_IPv4</span>
<span class="w"> </span><span class="n">in_addr_t</span><span class="w"> </span><span class="n">d_ipaddr</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Host IPv4 address assigned to the network interface */</span>
<span class="w"> </span><span class="n">in_addr_t</span><span class="w"> </span><span class="n">d_draddr</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Default router IP address */</span>
<span class="w"> </span><span class="n">in_addr_t</span><span class="w"> </span><span class="n">d_netmask</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Network subnet mask */</span>
<span class="cp">#endif</span>
<span class="p">};</span>
</pre></div>
</div>
</dd></dl>
</section>
<section id="ipv6-interfaces">
<h3>IPv6 Interfaces<a class="headerlink" href="#ipv6-interfaces" title="Permalink to this heading"></a></h3>
<p>Now we support multiple IPv6 addresses per network device, and use
the <code class="xref c c-member docutils literal notranslate"><span class="pre">d_ipv6</span></code> in <a class="reference internal" href="#c.net_driver_s" title="net_driver_s"><code class="xref c c-struct docutils literal notranslate"><span class="pre">net_driver_s</span></code></a> to store the IPv6
addresses. For historical reason, we keep the old name <code class="xref c c-member docutils literal notranslate"><span class="pre">d_ipv6addr</span></code>
and <code class="xref c c-member docutils literal notranslate"><span class="pre">d_ipv6netmask</span></code> for backward compatibility. Please use
<code class="xref c c-member docutils literal notranslate"><span class="pre">d_ipv6</span></code> for new drivers.</p>
<dl class="c struct">
<dt class="sig sig-object c">
<span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">net_driver_s</span></span></span><br /></dt>
<dd><div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">struct</span><span class="w"> </span><span class="nc">net_driver_s</span>
<span class="p">{</span>
<span class="cp">#ifdef CONFIG_NET_IPv6</span>
<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">netdev_ifaddr6_s</span><span class="w"> </span><span class="n">d_ipv6</span><span class="p">[</span><span class="n">CONFIG_NETDEV_MAX_IPv6_ADDR</span><span class="p">];</span>
<span class="cp">#endif</span>
<span class="p">};</span>
</pre></div>
</div>
</dd></dl>
<p>Managing the IPv6 addresses by provided APIs would be more flexible:</p>
<blockquote>
<div><ul class="simple">
<li><p><a class="reference internal" href="#c.netdev_ipv6_add" title="netdev_ipv6_add"><code class="xref c c-func docutils literal notranslate"><span class="pre">netdev_ipv6_add()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.netdev_ipv6_del" title="netdev_ipv6_del"><code class="xref c c-func docutils literal notranslate"><span class="pre">netdev_ipv6_del()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.netdev_ipv6_srcaddr" title="netdev_ipv6_srcaddr"><code class="xref c c-func docutils literal notranslate"><span class="pre">netdev_ipv6_srcaddr()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.netdev_ipv6_lladdr" title="netdev_ipv6_lladdr"><code class="xref c c-func docutils literal notranslate"><span class="pre">netdev_ipv6_lladdr()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.netdev_ipv6_lookup" title="netdev_ipv6_lookup"><code class="xref c c-func docutils literal notranslate"><span class="pre">netdev_ipv6_lookup()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.netdev_ipv6_foreach" title="netdev_ipv6_foreach"><code class="xref c c-func docutils literal notranslate"><span class="pre">netdev_ipv6_foreach()</span></code></a></p></li>
</ul>
</div></blockquote>
<dl class="c function">
<dt class="sig sig-object c" id="c.netdev_ipv6_add">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">netdev_ipv6_add</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.net_driver_s" title="net_driver_s"><span class="n"><span class="pre">net_driver_s</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">dev</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">net_ipv6addr_t</span></span><span class="w"> </span><span class="n"><span class="pre">addr</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">preflen</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.netdev_ipv6_add" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.netdev_ipv6_del">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">netdev_ipv6_del</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.net_driver_s" title="net_driver_s"><span class="n"><span class="pre">net_driver_s</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">dev</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">net_ipv6addr_t</span></span><span class="w"> </span><span class="n"><span class="pre">addr</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">preflen</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.netdev_ipv6_del" title="Permalink to this definition"></a><br /></dt>
<dd><p>Add or delete an IPv6 address on the network device</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>Zero is returned if the operation is successfully applied on
the device; A negated errno value is returned if failed.</p>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.netdev_ipv6_srcaddr">
<span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">uint16_t</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">netdev_ipv6_srcaddr</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.net_driver_s" title="net_driver_s"><span class="n"><span class="pre">net_driver_s</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">dev</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">net_ipv6addr_t</span></span><span class="w"> </span><span class="n"><span class="pre">dst</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.netdev_ipv6_srcaddr" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the source IPv6 address (RFC6724).</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>A pointer to the IPv6 address is returned on success. It will never be
NULL, but can be an address containing g_ipv6_unspecaddr.</p>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.netdev_ipv6_lladdr">
<span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">uint16_t</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">netdev_ipv6_lladdr</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.net_driver_s" title="net_driver_s"><span class="n"><span class="pre">net_driver_s</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">dev</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.netdev_ipv6_lladdr" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get the link-local address of the network device.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>A pointer to the link-local address is returned on success.
NULL is returned if the address is not found on the device.</p>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.netdev_ipv6_lookup">
<span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">netdev_ifaddr6_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">netdev_ipv6_lookup</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.net_driver_s" title="net_driver_s"><span class="n"><span class="pre">net_driver_s</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">dev</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">net_ipv6addr_t</span></span><span class="w"> </span><span class="n"><span class="pre">addr</span></span>, <span class="kt"><span class="pre">bool</span></span><span class="w"> </span><span class="n"><span class="pre">maskcmp</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.netdev_ipv6_lookup" title="Permalink to this definition"></a><br /></dt>
<dd><p>Look up an IPv6 address in the network device’s IPv6 addresses</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>A pointer to the matching IPv6 address entry is returned on success.
NULL is returned if the IPv6 address is not found in the device.</p>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.netdev_ipv6_foreach">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">netdev_ipv6_foreach</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="#c.net_driver_s" title="net_driver_s"><span class="n"><span class="pre">net_driver_s</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">dev</span></span>, <span class="n"><span class="pre">devif_ipv6_callback_t</span></span><span class="w"> </span><span class="n"><span class="pre">callback</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">arg</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.netdev_ipv6_foreach" title="Permalink to this definition"></a><br /></dt>
<dd><p>Enumerate each IPv6 address on a network device. This function will
terminate when either (1) all addresses have been enumerated or (2) when
a callback returns any non-zero value.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>Zero is returned if the enumeration is successfully completed;
Non-zero value is returned if enumeration is terminated early by callback.</p>
</dd>
</dl>
</dd></dl>
</section>
<section id="ioctls-for-ip-addresses">
<h3>Ioctls for IP Addresses<a class="headerlink" href="#ioctls-for-ip-addresses" title="Permalink to this heading"></a></h3>
<blockquote>
<div><ul class="simple">
<li><p><a class="reference internal" href="#c.SIOCGIFADDR" title="SIOCGIFADDR"><code class="xref c c-macro docutils literal notranslate"><span class="pre">SIOCGIFADDR</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.SIOCSIFADDR" title="SIOCSIFADDR"><code class="xref c c-macro docutils literal notranslate"><span class="pre">SIOCSIFADDR</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.SIOCDIFADDR" title="SIOCDIFADDR"><code class="xref c c-macro docutils literal notranslate"><span class="pre">SIOCDIFADDR</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.SIOCGLIFADDR" title="SIOCGLIFADDR"><code class="xref c c-macro docutils literal notranslate"><span class="pre">SIOCGLIFADDR</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.SIOCSLIFADDR" title="SIOCSLIFADDR"><code class="xref c c-macro docutils literal notranslate"><span class="pre">SIOCSLIFADDR</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.SIOCGIFNETMASK" title="SIOCGIFNETMASK"><code class="xref c c-macro docutils literal notranslate"><span class="pre">SIOCGIFNETMASK</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.SIOCSIFNETMASK" title="SIOCSIFNETMASK"><code class="xref c c-macro docutils literal notranslate"><span class="pre">SIOCSIFNETMASK</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.SIOCGLIFNETMASK" title="SIOCGLIFNETMASK"><code class="xref c c-macro docutils literal notranslate"><span class="pre">SIOCGLIFNETMASK</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.SIOCSLIFNETMASK" title="SIOCSLIFNETMASK"><code class="xref c c-macro docutils literal notranslate"><span class="pre">SIOCSLIFNETMASK</span></code></a></p></li>
</ul>
</div></blockquote>
<dl class="c macro">
<dt class="sig sig-object c" id="c.SIOCGIFADDR">
<span class="sig-name descname"><span class="n"><span class="pre">SIOCGIFADDR</span></span></span><a class="headerlink" href="#c.SIOCGIFADDR" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt class="sig sig-object c" id="c.SIOCSIFADDR">
<span class="sig-name descname"><span class="n"><span class="pre">SIOCSIFADDR</span></span></span><a class="headerlink" href="#c.SIOCSIFADDR" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt class="sig sig-object c" id="c.SIOCDIFADDR">
<span class="sig-name descname"><span class="n"><span class="pre">SIOCDIFADDR</span></span></span><a class="headerlink" href="#c.SIOCDIFADDR" title="Permalink to this definition"></a><br /></dt>
<dd><p>We just follow the Linux convention[1]:</p>
<blockquote>
<div><p>Get, set, or delete the address of the device using <code class="xref c c-member docutils literal notranslate"><span class="pre">ifr_addr</span></code>,
or <code class="xref c c-member docutils literal notranslate"><span class="pre">ifr6_addr</span></code> with <code class="xref c c-member docutils literal notranslate"><span class="pre">ifr6_prefixlen</span></code>.
For compatibility, <a class="reference internal" href="#c.SIOCGIFADDR" title="SIOCGIFADDR"><code class="xref c c-macro docutils literal notranslate"><span class="pre">SIOCGIFADDR</span></code></a> returns only <code class="xref c c-macro docutils literal notranslate"><span class="pre">AF_INET</span></code>
addresses, <a class="reference internal" href="#c.SIOCSIFADDR" title="SIOCSIFADDR"><code class="xref c c-macro docutils literal notranslate"><span class="pre">SIOCSIFADDR</span></code></a> accepts <code class="xref c c-macro docutils literal notranslate"><span class="pre">AF_INET</span></code> and
<code class="xref c c-macro docutils literal notranslate"><span class="pre">AF_INET6</span></code> addresses, and <a class="reference internal" href="#c.SIOCDIFADDR" title="SIOCDIFADDR"><code class="xref c c-macro docutils literal notranslate"><span class="pre">SIOCDIFADDR</span></code></a> deletes
only <code class="xref c c-macro docutils literal notranslate"><span class="pre">AF_INET6</span></code> addresses. A <code class="xref c c-macro docutils literal notranslate"><span class="pre">AF_INET</span></code> address
can be deleted by setting it to zero via <a class="reference internal" href="#c.SIOCSIFADDR" title="SIOCSIFADDR"><code class="xref c c-macro docutils literal notranslate"><span class="pre">SIOCSIFADDR</span></code></a>.</p>
</div></blockquote>
<p>Note: Unlike Linux, the maximum number of IPv6 addresses is limited on
NuttX. If you add more IPv6 addresses when we have already reached the
limit, the new addresses will replace addresses with same scope.</p>
<p>[1]: <a class="reference external" href="https://man7.org/linux/man-pages/man7/netdevice.7.html">https://man7.org/linux/man-pages/man7/netdevice.7.html</a></p>
</dd></dl>
<dl class="c macro">
<dt class="sig sig-object c" id="c.SIOCGLIFADDR">
<span class="sig-name descname"><span class="n"><span class="pre">SIOCGLIFADDR</span></span></span><a class="headerlink" href="#c.SIOCGLIFADDR" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt class="sig sig-object c" id="c.SIOCSLIFADDR">
<span class="sig-name descname"><span class="n"><span class="pre">SIOCSLIFADDR</span></span></span><a class="headerlink" href="#c.SIOCSLIFADDR" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get or set the IPv6 address of the device using <code class="xref c c-member docutils literal notranslate"><span class="pre">lifr_addr</span></code>.</p>
<p>We follow the Linux convention[1] to allow interface name to be
&lt;eth&gt;:&lt;num&gt;[2], to keep working with multiple IPv6 addresses.</p>
<p>Note: Recommend to use <a class="reference internal" href="#c.SIOCSIFADDR" title="SIOCSIFADDR"><code class="xref c c-macro docutils literal notranslate"><span class="pre">SIOCSIFADDR</span></code></a> and <a class="reference internal" href="#c.SIOCDIFADDR" title="SIOCDIFADDR"><code class="xref c c-macro docutils literal notranslate"><span class="pre">SIOCDIFADDR</span></code></a>
to manage IPv6 addresses, by which you don’t need to care about the
slot it stored.</p>
<p>[1]: <a class="reference external" href="https://man7.org/linux/man-pages/man7/netdevice.7.html">https://man7.org/linux/man-pages/man7/netdevice.7.html</a>
[2]: e.g. ‘eth0:0’ stands for the secondary address on eth0</p>
</dd></dl>
<dl class="c macro">
<dt class="sig sig-object c" id="c.SIOCGIFNETMASK">
<span class="sig-name descname"><span class="n"><span class="pre">SIOCGIFNETMASK</span></span></span><a class="headerlink" href="#c.SIOCGIFNETMASK" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt class="sig sig-object c" id="c.SIOCSIFNETMASK">
<span class="sig-name descname"><span class="n"><span class="pre">SIOCSIFNETMASK</span></span></span><a class="headerlink" href="#c.SIOCSIFNETMASK" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get or set the IPv4 network mask for a device using <code class="xref c c-member docutils literal notranslate"><span class="pre">ifr_netmask</span></code>.</p>
</dd></dl>
<dl class="c macro">
<dt class="sig sig-object c" id="c.SIOCGLIFNETMASK">
<span class="sig-name descname"><span class="n"><span class="pre">SIOCGLIFNETMASK</span></span></span><a class="headerlink" href="#c.SIOCGLIFNETMASK" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt class="sig sig-object c" id="c.SIOCSLIFNETMASK">
<span class="sig-name descname"><span class="n"><span class="pre">SIOCSLIFNETMASK</span></span></span><a class="headerlink" href="#c.SIOCSLIFNETMASK" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get or set the IPv6 network mask for a device using <code class="xref c c-member docutils literal notranslate"><span class="pre">lifr_netmask</span></code>.</p>
<p>We follow the Linux convention to allow interface name to be &lt;eth&gt;:&lt;num&gt;,
to keep working with multiple IPv6 addresses.</p>
<p>Note: Recommend to use <a class="reference internal" href="#c.SIOCSIFADDR" title="SIOCSIFADDR"><code class="xref c c-macro docutils literal notranslate"><span class="pre">SIOCSIFADDR</span></code></a> and <a class="reference internal" href="#c.SIOCDIFADDR" title="SIOCDIFADDR"><code class="xref c c-macro docutils literal notranslate"><span class="pre">SIOCDIFADDR</span></code></a>
to manage IPv6 addresses, by which you don’t need to care about the
slot it stored.</p>
</dd></dl>
</section>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="wqueue.html" class="btn btn-neutral float-left" title="Work Queues" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="../../faq/index.html" class="btn btn-neutral float-right" title="FAQ" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Copyright 2023, The Apache Software Foundation.</p>
</div>
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>