| <!-- |
| 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 — 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> && !<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 < 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 > 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 > 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 > 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 > 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>© Copyright 2023, The Apache Software Foundation.</p> |
| </div> |
| |
| |
| |
| </footer> |
| </div> |
| </div> |
| </section> |
| </div> |
| <script> |
| jQuery(function () { |
| SphinxRtdTheme.Navigation.enable(true); |
| }); |
| </script> |
| |
| </body> |
| </html> |