blob: 572029c0337d599acaf93579c64bdb3d5bfe466c [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>CONFIG_NET_GUARDSIZE &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/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/js/theme.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<link rel="next" title="Netlink Route support" href="netlink.html" />
<link rel="prev" title="Network Drivers" href="netdriver.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 current"><a class="reference internal" href="../index.html">OS Components</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../binfmt.html">Binary Loader</a></li>
<li class="toctree-l2"><a class="reference internal" href="../drivers/index.html">Device Drivers</a></li>
<li class="toctree-l2"><a class="reference internal" href="../nxflat.html">NXFLAT</a></li>
<li class="toctree-l2"><a class="reference internal" href="../nxgraphics/index.html">NX Graphics Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../paging.html">On-Demand Paging</a></li>
<li class="toctree-l2"><a class="reference internal" href="../audio/index.html">Audio Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../filesystem/index.html">NuttX File System</a></li>
<li class="toctree-l2"><a class="reference internal" href="../libs/index.html">NuttX libraries</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="index.html">Network Support</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="sixlowpan.html">6LoWPAN</a></li>
<li class="toctree-l3"><a class="reference internal" href="socketcan.html">SocketCAN Device Drivers</a></li>
<li class="toctree-l3"><a class="reference internal" href="pkt.html">“Raw” packet socket support</a></li>
<li class="toctree-l3"><a class="reference internal" href="ipfilter.html">IP Packet Filter</a></li>
<li class="toctree-l3"><a class="reference internal" href="nat.html">Network Address Translation (NAT)</a></li>
<li class="toctree-l3"><a class="reference internal" href="netdev.html">Network Devices</a></li>
<li class="toctree-l3"><a class="reference internal" href="netdriver.html">Network Drivers</a></li>
<li class="toctree-l3 current"><a class="current reference internal" href="#">CONFIG_NET_GUARDSIZE</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#global-option-for-all-drivers">Global Option for All Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="#packet-receipt">Packet Receipt</a></li>
<li class="toctree-l4"><a class="reference internal" href="#packet-transmission">Packet Transmission</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="netlink.html">Netlink Route support</a></li>
<li class="toctree-l3"><a class="reference internal" href="slip.html">SLIP</a></li>
<li class="toctree-l3"><a class="reference internal" href="wqueuedeadlocks.html">Work Queue Deadlocks</a></li>
<li class="toctree-l3"><a class="reference internal" href="tcp_network_perf.html">TCP Network Performance</a></li>
<li class="toctree-l3"><a class="reference internal" href="delay_act_and_tcp_perf.html">Delayed ACK and TCP Performance</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../mm/index.html">Memory Management</a></li>
<li class="toctree-l2"><a class="reference internal" href="../syscall.html">Syscall Layer</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tools/index.html"><code class="docutils literal notranslate"><span class="pre">/tools</span></code> Host Tools</a></li>
<li class="toctree-l2"><a class="reference internal" href="../arch/index.html">Architecture-Specific Code</a></li>
<li class="toctree-l2"><a class="reference internal" href="../boards.html">Boards Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../cmake.html">CMake Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../openamp.html">OpenAMP Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../video.html">Video Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../crypto.html">Crypto API Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../wireless.html">Wireless Subsystem</a></li>
</ul>
</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"><a class="reference internal" href="../../reference/index.html">API Reference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../faq/index.html">FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/index.html">Guides</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../glossary.html">Glossary</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../logos/index.html">NuttX Logos</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">OS Components</a></li>
<li class="breadcrumb-item"><a href="index.html">Network Support</a></li>
<li class="breadcrumb-item active">CONFIG_NET_GUARDSIZE</li>
<li class="wy-breadcrumbs-aside">
<a href="../../_sources/components/net/netguardsize.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="config-net-guardsize">
<h1>CONFIG_NET_GUARDSIZE<a class="headerlink" href="#config-net-guardsize" title="Permalink to this heading"></a></h1>
<section id="global-option-for-all-drivers">
<h2>Global Option for All Drivers<a class="headerlink" href="#global-option-for-all-drivers" title="Permalink to this heading"></a></h2>
<p><code class="docutils literal notranslate"><span class="pre">CONFIG_NET_GUARD_SIZE</span></code> is global option. It is added to the allocated size of
each driver packet buffer. Currently it is a very small value, defaulting to only
two bytes. So it is not a memory hog and should be added to the packetsize for
all drivers for commonality. But why?</p>
<p>It should (eventually) be larger and common for all drivers. We need to look at
how it is used today and how it might be used tomorrow. There is a probably a lot
more involved than you might be initially considering.</p>
</section>
<section id="packet-receipt">
<h2>Packet Receipt<a class="headerlink" href="#packet-receipt" title="Permalink to this heading"></a></h2>
<p>For packet receipt, it is necessary for some hardware, but not for others. Often
the hardware will DMA a 2 byte FCS at the end of the packet or possibly other
hardware-specific info. But that is only part of the whole story.
<code class="docutils literal notranslate"><span class="pre">CONFIG_NET_GUARDSIZE</span></code> is not just for hardware packet receipt.</p>
</section>
<section id="packet-transmission">
<h2>Packet Transmission<a class="headerlink" href="#packet-transmission" title="Permalink to this heading"></a></h2>
<p>There are several issues for packet transmission. These are less well defined
and need further study, but we need to keep all of the driver packet definitions
in place until we understand how we are going to handle these things:</p>
<ul>
<li><p>Memory Overrun Bugs</p>
<p>There was in the past, a bug that caused write past the end of the buffer by
a couple of bytes during TX message formatting. I don’t know if that bug still
exists, but the minimum, two-byte <code class="docutils literal notranslate"><span class="pre">CONFIG_NET_GUARDSIZE</span></code> was sufficient to
eliminate the bug. That is why it has the name GUARD: Its primary purpose is
to protect from overrunning the packet buffer and corrupting the following memory.</p>
<p>I do no know if we have any such bugs today. Perhaps they still do?
Perhaps they do not? Having such a guard is a good thing for reliability in
any case.</p>
</li>
<li><p>Variable size IP/TCP headers</p>
<p>There is a limitation in the way IP packets are formatted now. Basically they
are formatted like this:</p>
<blockquote>
<div><ol class="arabic simple">
<li><p>When the packet is received a pointer to the location of the payload is
set (d_appdata). This is an offset into the packet buffer For TCP, that
accounts for the MAC/Ethernet header, the minimum IPv4/IPv6 header size,
and the minimum TCP header size.</p></li>
<li><p>The TCP payload is written at that location,</p></li>
<li><p>The correctly sized IPv4/IPv6 headers and the correctly sized TCP header
are added below the payload, and finally</p></li>
<li><p>The MAC/Ethernet header as added.</p></li>
</ol>
</div></blockquote>
<p>The start offset of the packet in the packet is no longer zero, but some
variable offset into the packet buffer. That new start offset would have
to be passed to driver in order to send the packet.</p>
<p>The key to making this all work is:</p>
<blockquote>
<div><ul class="simple">
<li><p>Keep <code class="docutils literal notranslate"><span class="pre">CONFIG_NET_GUARDSIZE</span></code> in all driver buffers, and</p></li>
<li><p>Set the <code class="docutils literal notranslate"><span class="pre">CONFIG_NET_GUARDSIZE</span></code> to the maximum size of IPv4/IPv6 and TCP options
(depending on which IP version is enabled and if TCP is enabled)</p></li>
<li><p>Extend the driver interface to accept data offset into the driver’s packet buffer.</p></li>
</ul>
</div></blockquote>
</li>
<li><p>Variable MSS</p>
<p>Closely related to this is the MSS which is the maximum size of the payload.
Currently that is a constant because it assumes the minimum header lengths.
It should be variable, depending on the actual header sizes.</p>
</li>
</ul>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="netdriver.html" class="btn btn-neutral float-left" title="Network Drivers" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="netlink.html" class="btn btn-neutral float-right" title="Netlink Route 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>