blob: fb41bb1841bab33eb0b8a986ba9a061cc23a8428 [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.19: https://docutils.sourceforge.io/" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>I/O Buffer Management &mdash; NuttX latest documentation</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../../_static/css/theme.css" />
<link rel="stylesheet" type="text/css" href="../../_static/copybutton.css" />
<link rel="stylesheet" type="text/css" href="../../_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css" />
<link rel="shortcut icon" href="../../_static/favicon.ico"/>
<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/design-tabs.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="LED Support" href="led.html" />
<link rel="prev" title="Naming and Header File Conventions" href="conventions.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>
<option value="../../../12.6.0" >12.6.0</option>
<option value="../../../12.7.0" >12.7.0</option>
<option value="../../../12.8.0" >12.8.0</option>
<option value="../../../12.9.0" >12.9.0</option>
<option value="../../../12.10.0" >12.10.0</option>
<option value="../../../12.11.0" >12.11.0</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 current"><a class="current reference internal" href="#">I/O Buffer Management</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#configuration-options">Configuration Options</a></li>
<li class="toctree-l4"><a class="reference internal" href="#throttling">Throttling</a></li>
<li class="toctree-l4"><a class="reference internal" href="#public-types">Public Types</a></li>
<li class="toctree-l4"><a class="reference internal" href="#public-function-prototypes">Public Function Prototypes</a></li>
</ul>
</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="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"><a class="reference internal" href="events.html">Events</a></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="../../debugging/index.html">Debugging</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>
<li class="toctree-l1"><a class="reference internal" href="../../logos/index.html">NuttX Logos</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../_tags/tagsindex.html">Tags</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">I/O Buffer Management</li>
<li class="wy-breadcrumbs-aside">
<a href="https://github.com/apache/nuttx/blob/master/Documentation/reference/os/iob.rst" class="fa fa-github"> Edit on GitHub</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="i-o-buffer-management">
<h1>I/O Buffer Management<a class="headerlink" href="#i-o-buffer-management" title="Permalink to this heading"></a></h1>
<p>NuttX supports generic I/O buffer management (IOB) logic. This
logic was originally added to support network I/O buffering, but
has been generalized to meet buffering requirements by all device
drivers. At the time of this writing, IOBs are currently used not
only be networking but also by logic in <code class="docutils literal notranslate"><span class="pre">drivers/syslog</span></code> and
<code class="docutils literal notranslate"><span class="pre">drivers/wireless</span></code>. NOTE that some of the wording in this
section still reflects those legacy roots as a part of the
networking subsystem. This objectives of this feature are:</p>
<blockquote>
<div><ol class="arabic simple">
<li><p>Provide common I/O buffer management logic for all drivers,</p></li>
<li><p>Support I/O buffer allocation from both the tasking and
interrupt level contexts.</p></li>
<li><p>Use a fixed amount of pre-allocated memory.</p></li>
<li><p>No costly, non-deterministic dynamic memory allocation.</p></li>
<li><p>When the fixed number of pre-allocated I/O buffers is
exhausted, further attempts to allocate memory from tasking
logic will cause the task to block and wait until a an I/O
buffer to be freed.</p></li>
<li><p>Each I/O buffer should be small, but can be chained together to
support buffering of larger thinks such as full size network
packets.</p></li>
<li><p>Support <em>throttling</em> logic to prevent lower priority tasks from
hogging all available I/O buffering.</p></li>
</ol>
</div></blockquote>
<section id="configuration-options">
<h2>Configuration Options<a class="headerlink" href="#configuration-options" title="Permalink to this heading"></a></h2>
<dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">CONFIG_MM_IOB</span></code></dt><dd><p>Enables generic I/O buffer support. This setting will build the
common I/O buffer (IOB) support library.</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">CONFIG_IOB_NBUFFERS</span></code></dt><dd><p>Number of pre-allocated I/O buffers. Each packet is represented
by a series of small I/O buffers in a chain. This setting
determines the number of preallocated I/O buffers available for
packet data. The default value is setup for network support.
The default is 8 buffers if neither TCP/UDP or write buffering
is enabled (neither <code class="docutils literal notranslate"><span class="pre">CONFIG_NET_TCP_WRITE_BUFFERS</span></code> nor
<code class="docutils literal notranslate"><span class="pre">CONFIG_NET_TCP</span></code>), 24 if only TCP/UDP is enabled, and 36 if
both TCP/UDP and write buffering are enabled.</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">CONFIG_IOB_BUFSIZE</span></code></dt><dd><p>Payload size of one I/O buffer. Each packet is represented by a
series of small I/O buffers in a chain. This setting determines
the data payload each preallocated I/O buffer. The default
value is 196 bytes.</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">CONFIG_IOB_NCHAINS</span></code></dt><dd><p>Number of pre-allocated I/O buffer chain heads. These tiny
nodes are used as <em>containers</em> to support queueing of I/O
buffer chains. This will limit the number of I/O transactions
that can be <em>in-flight</em> at any give time. The default value of
zero disables this features.
These generic I/O buffer chain containers are not currently
used by any logic in NuttX. That is because their other other
specialized I/O buffer chain containers that also carry a
payload of usage specific information. The default value is
zero if nether TCP nor UDP is enabled (i.e., neither
<code class="docutils literal notranslate"><span class="pre">CONFIG_NET_TCP</span></code> &amp;&amp; !<code class="docutils literal notranslate"><span class="pre">CONFIG_NET_UDP</span></code> or eight if either
is enabled.</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">CONFIG_IOB_THROTTLE</span></code></dt><dd><p>I/O buffer throttle value. TCP write buffering and read-ahead
buffer use the same pool of free I/O buffers. In order to
prevent uncontrolled incoming TCP packets from hogging all of
the available, pre-allocated I/O buffers, a throttling value is
required. This throttle value assures that I/O buffers will be
denied to the read-ahead logic before TCP writes are halted.
The default 0 if neither TCP write buffering nor TCP read-ahead
buffering is enabled. Otherwise, the default is 8.</p>
</dd>
<dt><code class="docutils literal notranslate"><span class="pre">CONFIG_IOB_DEBUG</span></code></dt><dd><p>Force I/O buffer debug. This option will force debug output
from I/O buffer logic. This is not normally something that
would want to do but is convenient if you are debugging the I/O
buffer logic and do not want to get overloaded with other
un-related debug output. NOTE that this selection is not
available if DEBUG features are not enabled
(<code class="docutils literal notranslate"><span class="pre">CONFIG_DEBUG_FEATURES</span></code>) with IOBs are being used to syslog
buffering logic (<code class="docutils literal notranslate"><span class="pre">CONFIG_SYSLOG_BUFFER</span></code>).</p>
</dd>
</dl>
</section>
<section id="throttling">
<h2>Throttling<a class="headerlink" href="#throttling" title="Permalink to this heading"></a></h2>
<p>An allocation throttle was added. I/O buffer allocation logic
supports a throttle value originally for read-ahead buffering to
prevent the read-ahead logic from consuming all available I/O
buffers and blocking the write buffering logic. This throttle
logic is only needed for networking only if both write buffering
and read-ahead buffering are used. Of use of I/O buffering might
have other motivations for throttling.</p>
</section>
<section id="public-types">
<h2>Public Types<a class="headerlink" href="#public-types" title="Permalink to this heading"></a></h2>
<p>This structure represents one I/O buffer. A packet is contained by
one or more I/O buffers in a chain. The <code class="docutils literal notranslate"><span class="pre">io_pktlen</span></code> is only
valid for the I/O buffer at the head of the chain.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">struct</span><span class="w"> </span><span class="nc">iob_s</span>
<span class="p">{</span>
<span class="w"> </span><span class="cm">/* Singly-link list support */</span>
<span class="w"> </span><span class="n">FAR</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">iob_s</span><span class="w"> </span><span class="o">*</span><span class="n">io_flink</span><span class="p">;</span>
<span class="w"> </span><span class="cm">/* Payload */</span>
<span class="cp">#if CONFIG_IOB_BUFSIZE &lt; 256</span>
<span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">io_len</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Length of the data in the entry */</span>
<span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">io_offset</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Data begins at this offset */</span>
<span class="cp">#else</span>
<span class="w"> </span><span class="kt">uint16_t</span><span class="w"> </span><span class="n">io_len</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Length of the data in the entry */</span>
<span class="w"> </span><span class="kt">uint16_t</span><span class="w"> </span><span class="n">io_offset</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Data begins at this offset */</span>
<span class="cp">#endif</span>
<span class="w"> </span><span class="kt">uint16_t</span><span class="w"> </span><span class="n">io_pktlen</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Total length of the packet */</span>
<span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">io_data</span><span class="p">[</span><span class="n">CONFIG_IOB_BUFSIZE</span><span class="p">];</span>
<span class="p">};</span>
</pre></div>
</div>
<p>This container structure supports queuing of I/O buffer chains.
This structure is intended only for internal use by the IOB
module.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#if CONFIG_IOB_NCHAINS &gt; 0</span>
<span class="k">struct</span><span class="w"> </span><span class="nc">iob_qentry_s</span>
<span class="p">{</span>
<span class="w"> </span><span class="cm">/* Singly-link list support */</span>
<span class="w"> </span><span class="n">FAR</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">iob_qentry_s</span><span class="w"> </span><span class="o">*</span><span class="n">qe_flink</span><span class="p">;</span>
<span class="w"> </span><span class="cm">/* Payload -- Head of the I/O buffer chain */</span>
<span class="w"> </span><span class="n">FAR</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">iob_s</span><span class="w"> </span><span class="o">*</span><span class="n">qe_head</span><span class="p">;</span>
<span class="p">};</span>
<span class="cp">#endif </span><span class="cm">/* CONFIG_IOB_NCHAINS &gt; 0 */</span>
</pre></div>
</div>
<p>The I/O buffer queue head structure.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#if CONFIG_IOB_NCHAINS &gt; 0</span>
<span class="k">struct</span><span class="w"> </span><span class="nc">iob_queue_s</span>
<span class="p">{</span>
<span class="w"> </span><span class="cm">/* Head of the I/O buffer chain list */</span>
<span class="w"> </span><span class="n">FAR</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">iob_qentry_s</span><span class="w"> </span><span class="o">*</span><span class="n">qh_head</span><span class="p">;</span>
<span class="w"> </span><span class="n">FAR</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">iob_qentry_s</span><span class="w"> </span><span class="o">*</span><span class="n">qh_tail</span><span class="p">;</span>
<span class="p">};</span>
<span class="cp">#endif </span><span class="cm">/* CONFIG_IOB_NCHAINS &gt; 0 */</span>
</pre></div>
</div>
</section>
<section id="public-function-prototypes">
<h2>Public Function Prototypes<a class="headerlink" href="#public-function-prototypes" title="Permalink to this heading"></a></h2>
<blockquote>
<div><ul class="simple">
<li><p><a class="reference internal" href="#c.iob_initialize" title="iob_initialize"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_initialize()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_alloc" title="iob_alloc"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_alloc()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_tryalloc" title="iob_tryalloc"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_tryalloc()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_free" title="iob_free"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_free()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_free_chain" title="iob_free_chain"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_free_chain()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_add_queue" title="iob_add_queue"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_add_queue()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_tryadd_queue" title="iob_tryadd_queue"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_tryadd_queue()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_remove_queue" title="iob_remove_queue"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_remove_queue()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_peek_queue" title="iob_peek_queue"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_peek_queue()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_free_queue" title="iob_free_queue"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_free_queue()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_free_queue_qentry" title="iob_free_queue_qentry"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_free_queue_qentry()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_get_queue_size" title="iob_get_queue_size"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_get_queue_size()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_copyin" title="iob_copyin"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_copyin()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_trycopyin" title="iob_trycopyin"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_trycopyin()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_copyout" title="iob_copyout"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_copyout()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_clone" title="iob_clone"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_clone()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_clone_partial" title="iob_clone_partial"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_clone_partial()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_concat" title="iob_concat"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_concat()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_trimhead" title="iob_trimhead"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_trimhead()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_trimhead_queue" title="iob_trimhead_queue"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_trimhead_queue()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_trimtail" title="iob_trimtail"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_trimtail()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_pack" title="iob_pack"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_pack()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_contig" title="iob_contig"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_contig()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_count" title="iob_count"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_count()</span></code></a></p></li>
<li><p><a class="reference internal" href="#c.iob_dump" title="iob_dump"><code class="xref c c-func docutils literal notranslate"><span class="pre">iob_dump()</span></code></a></p></li>
</ul>
</div></blockquote>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_initialize">
<span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">iob_initialize</span></span></span><span class="sig-paren">(</span><span class="kt"><span class="pre">void</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.iob_initialize" title="Permalink to this definition"></a><br /></dt>
<dd><p>Set up the I/O buffers for normal operations.</p>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_alloc">
<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">iob_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">iob_alloc</span></span></span><span class="sig-paren">(</span><span class="kt"><span class="pre">bool</span></span><span class="w"> </span><span class="n"><span class="pre">throttled</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.iob_alloc" title="Permalink to this definition"></a><br /></dt>
<dd><p>Allocate an I/O buffer by taking the buffer at
the head of the free list.</p>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_tryalloc">
<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">iob_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">iob_tryalloc</span></span></span><span class="sig-paren">(</span><span class="kt"><span class="pre">bool</span></span><span class="w"> </span><span class="n"><span class="pre">throttled</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.iob_tryalloc" title="Permalink to this definition"></a><br /></dt>
<dd><p>Try to allocate an I/O buffer by taking the
buffer at the head of the free list without waiting for a buffer
to become free.</p>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_free">
<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">iob_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">iob_free</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><span class="n"><span class="pre">iob_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iob</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.iob_free" title="Permalink to this definition"></a><br /></dt>
<dd><p>Free the I/O buffer at the head of a buffer chain
returning it to the free list. The link to the next I/O buffer in
the chain is return.</p>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_free_chain">
<span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">iob_free_chain</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><span class="n"><span class="pre">iob_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iob</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.iob_free_chain" title="Permalink to this definition"></a><br /></dt>
<dd><p>Free an entire buffer chain, starting at the
beginning of the I/O buffer chain</p>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_add_queue">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">iob_add_queue</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><span class="n"><span class="pre">iob_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iob</span></span>, <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">iob_queue_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iobq</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.iob_add_queue" title="Permalink to this definition"></a><br /></dt>
<dd><p>Add one I/O buffer chain to the end of a queue.
May fail due to lack of resources.</p>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_tryadd_queue">
<span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">iob_tryadd_queue</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><span class="n"><span class="pre">iob_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iob</span></span>, <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">iob_queue_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iobq</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.iob_tryadd_queue" title="Permalink to this definition"></a><br /></dt>
<dd><p>Add one I/O buffer chain to the end of a queue
without waiting for resources to become free.</p>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_remove_queue">
<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">iob_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">iob_remove_queue</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><span class="n"><span class="pre">iob_queue_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iobq</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.iob_remove_queue" title="Permalink to this definition"></a><br /></dt>
<dd><p>Remove and return one I/O buffer chain from the
head of a queue.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>Returns a reference to the I/O buffer chain at
the head of the queue.</p>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_peek_queue">
<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">iob_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">iob_peek_queue</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><span class="n"><span class="pre">iob_queue_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iobq</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.iob_peek_queue" title="Permalink to this definition"></a><br /></dt>
<dd><p>Return a reference to the I/O buffer chain at the
head of a queue. This is similar to iob_remove_queue except that
the I/O buffer chain is in place at the head of the queue. The I/O
buffer chain may safely be modified by the caller but must be
removed from the queue before it can be freed.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>Returns a reference to the I/O buffer chain at
the head of the queue.</p>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_free_queue">
<span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">iob_free_queue</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><span class="n"><span class="pre">iob_queue_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">qhead</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.iob_free_queue" title="Permalink to this definition"></a><br /></dt>
<dd><p>Free an entire queue of I/O buffer chains.</p>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_free_queue_qentry">
<span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">iob_free_queue_qentry</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><span class="n"><span class="pre">iob_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iob</span></span>, <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">iob_queue_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iobq</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.iob_free_queue_qentry" title="Permalink to this definition"></a><br /></dt>
<dd><p>Queue helper for get the iob queue buffer size.</p>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_get_queue_size">
<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="sig-name descname"><span class="n"><span class="pre">iob_get_queue_size</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><span class="n"><span class="pre">iob_queue_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">queue</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.iob_get_queue_size" title="Permalink to this definition"></a><br /></dt>
<dd><p>Free an iob entire queue of I/O buffer chains.</p>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_copyin">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">iob_copyin</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><span class="n"><span class="pre">iob_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iob</span></span>, <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">uint8_t</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">src</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">len</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">offset</span></span>, <span class="kt"><span class="pre">bool</span></span><span class="w"> </span><span class="n"><span class="pre">throttled</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.iob_copyin" title="Permalink to this definition"></a><br /></dt>
<dd><p>Copy data <code class="docutils literal notranslate"><span class="pre">len</span></code> bytes from a user buffer into
the I/O buffer chain, starting at <code class="docutils literal notranslate"><span class="pre">offset</span></code>, extending the chain
as necessary.</p>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_trycopyin">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">iob_trycopyin</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><span class="n"><span class="pre">iob_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iob</span></span>, <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">uint8_t</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">src</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">len</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">offset</span></span>, <span class="kt"><span class="pre">bool</span></span><span class="w"> </span><span class="n"><span class="pre">throttled</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.iob_trycopyin" title="Permalink to this definition"></a><br /></dt>
<dd><p>Copy data <code class="docutils literal notranslate"><span class="pre">len</span></code> bytes from a user buffer into
the I/O buffer chain, starting at <code class="docutils literal notranslate"><span class="pre">offset</span></code>, extending the chain
as necessary BUT without waiting if buffers are not available.</p>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_copyout">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">iob_copyout</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="n"><span class="pre">uint8_t</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">dest</span></span>, <span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="n"><span class="pre">iob_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iob</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">len</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">offset</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.iob_copyout" title="Permalink to this definition"></a><br /></dt>
<dd><p>Copy data <code class="docutils literal notranslate"><span class="pre">len</span></code> bytes of data into the user
buffer starting at <code class="docutils literal notranslate"><span class="pre">offset</span></code> in the I/O buffer, returning that
actual number of bytes copied out.</p>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_clone">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">iob_clone</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><span class="n"><span class="pre">iob_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iob1</span></span>, <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">iob_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iob2</span></span>, <span class="kt"><span class="pre">bool</span></span><span class="w"> </span><span class="n"><span class="pre">throttled</span></span>, <span class="kt"><span class="pre">bool</span></span><span class="w"> </span><span class="n"><span class="pre">block</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.iob_clone" title="Permalink to this definition"></a><br /></dt>
<dd><p>Duplicate (and pack) the data in <code class="docutils literal notranslate"><span class="pre">iob1</span></code> in
<code class="docutils literal notranslate"><span class="pre">iob2</span></code>. <code class="docutils literal notranslate"><span class="pre">iob2</span></code> must be empty.</p>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_clone_partial">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">iob_clone_partial</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><span class="n"><span class="pre">iob_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iob1</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">len</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">offset1</span></span>, <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">iob_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iob2</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">offset2</span></span>, <span class="kt"><span class="pre">bool</span></span><span class="w"> </span><span class="n"><span class="pre">throttled</span></span>, <span class="kt"><span class="pre">bool</span></span><span class="w"> </span><span class="n"><span class="pre">block</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.iob_clone_partial" title="Permalink to this definition"></a><br /></dt>
<dd><p>Duplicate the data from partial bytes of <code class="docutils literal notranslate"><span class="pre">iob1</span></code> to <code class="docutils literal notranslate"><span class="pre">iob2</span></code></p>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_concat">
<span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">iob_concat</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><span class="n"><span class="pre">iob_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iob1</span></span>, <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">iob_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iob2</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.iob_concat" title="Permalink to this definition"></a><br /></dt>
<dd><p>Concatenate iob_s chain iob2 to iob1.</p>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_trimhead">
<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">iob_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">iob_trimhead</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><span class="n"><span class="pre">iob_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iob</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">trimlen</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.iob_trimhead" title="Permalink to this definition"></a><br /></dt>
<dd><p>Remove bytes from the beginning of an I/O chain.
Emptied I/O buffers are freed and, hence, the beginning of the
chain may change.</p>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_trimhead_queue">
<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">iob_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">iob_trimhead_queue</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><span class="n"><span class="pre">iob_queue_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">qhead</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">trimlen</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.iob_trimhead_queue" title="Permalink to this definition"></a><br /></dt>
<dd><p>Remove bytes from the beginning of an I/O chain
at the head of the queue. Emptied I/O buffers are freed and,
hence, the head of the queue may change.</p>
<p>This function is just a wrapper around iob_trimhead() that assures
that the iob at the head of queue is modified with the trimming
operations.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p>The new iob at the head of the queue is
returned.</p>
</dd>
</dl>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_trimtail">
<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">iob_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">iob_trimtail</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><span class="n"><span class="pre">iob_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iob</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">trimlen</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.iob_trimtail" title="Permalink to this definition"></a><br /></dt>
<dd><p>Remove bytes from the end of an I/O chain.
Emptied I/O buffers are freed NULL will be returned in the special
case where the entry I/O buffer chain is freed.</p>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_pack">
<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">iob_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">iob_pack</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><span class="n"><span class="pre">iob_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iob</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.iob_pack" title="Permalink to this definition"></a><br /></dt>
<dd><p>Pack all data in the I/O buffer chain so that the
data offset is zero and all but the final buffer in the chain are
filled. Any emptied buffers at the end of the chain are freed.</p>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_contig">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">iob_contig</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><span class="n"><span class="pre">iob_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iob</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">len</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.iob_contig" title="Permalink to this definition"></a><br /></dt>
<dd><p>Ensure that there is <code class="docutils literal notranslate"><span class="pre">len</span></code> bytes of contiguous
space at the beginning of the I/O buffer chain starting at
<code class="docutils literal notranslate"><span class="pre">iob</span></code>.</p>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_count">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">iob_count</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><span class="n"><span class="pre">iob_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iob</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.iob_count" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get <code class="docutils literal notranslate"><span class="pre">iob</span></code> entries count in chain.</p>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.iob_dump">
<span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">iob_dump</span></span></span><span class="sig-paren">(</span><span class="pre">FAR</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">msg</span></span>, <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">iob_s</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">iob</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">len</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">offset</span></span><span class="sig-paren">)</span><span class="p"><span class="pre">;</span></span><a class="headerlink" href="#c.iob_dump" title="Permalink to this definition"></a><br /></dt>
<dd><p>Dump the contents of a I/O buffer chain</p>
</dd></dl>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="conventions.html" class="btn btn-neutral float-left" title="Naming and Header File Conventions" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="led.html" class="btn btn-neutral float-right" title="LED Support" 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>