fixes to npc (NormPrecoder) and updated its documentation. Include 'auto' block sizing' feature

pull/91/head
bebopagogo 2025-01-26 20:26:49 -05:00
parent 7a6c09ae17
commit b7b252fd55
3 changed files with 28 additions and 34 deletions

Binary file not shown.

View File

@ -35,12 +35,12 @@
content.</para> content.</para>
<para>The Naval Research Laboratory (NRL) reference implementation of the <para>The Naval Research Laboratory (NRL) reference implementation of the
NORM protocol includes support for 8-bit (and very soon 16-bit) NORM protocol includes support for 8-bit and 16-bit Reed-Solomon FEC
Reed-Solomon FEC encoding with additional support for other coding encoding with additional support for other coding algorithms (e.g.,
algorithms (e.g., Low-Density Parity Check (LDPC)) planned for the future. Low-Density Parity Check (LDPC)) planned for the future. The NORM
The NORM specification allows for different FEC algorithms to be applied specification allows for different FEC algorithms to be applied within the
within the protocol. The current Reed-Solomon NORM FEC algorithms in the protocol. The current Reed-Solomon NORM FEC algorithms in the NRL
NRL implementation are limited to modest code block sizes (With 16-bit implementation are limited to modest code block sizes (With 16-bit
Reed-Solomon coding, larger block sizes will be allowed but very high data Reed-Solomon coding, larger block sizes will be allowed but very high data
rates may not be possible). For channels with random errors, the current rates may not be possible). For channels with random errors, the current
NORM FEC codecs are often adequate as there is flexibility in how the NORM FEC codecs are often adequate as there is flexibility in how the
@ -59,17 +59,10 @@
sizes).</para> sizes).</para>
<para>The NORM protocol is described in Internet Engineering Task Force <para>The NORM protocol is described in Internet Engineering Task Force
(IETF) Request For Comments (RFC) RFC 3940 and RFC 3941. These are (IETF) Request For Comments (RFC) RFC 5740 and RFC 5741. NRL provides a
experimental RFC standards. These documents have been revised in recent NORM protocol library with a well-defined API that it is suitable for
Internet-Drafts and it should be noted that the Naval Research Laboratory application development. Refer to the NORM website &lt;<ulink
(NRL) implementation of NORM that is represented here has been updated to url="https://github.com/USNavalResearchLaboratory/norm">https://github.com/USNavalResearchLaboratory/norm</ulink>&gt;
reflect the revised protocol. In addition to this demonstration
application, NRL provides a NORM protocol library with a well-defined API
that it is suitable for application development. Additionally, the NRL
source code distribution supports building the NORM protocol as a
component into <emphasis>ns-2</emphasis> and OPNET network simulation
environments. Refer to the NRL NORM website &lt;<ulink
url="http://cs.itd.nrl.navy.mil/work/norm">http://cs.itd.nrl.navy.mil/work/norm</ulink>&gt;
for these other components as well as up-to-date versions of this for these other components as well as up-to-date versions of this
demonstration application and documentation.</para> demonstration application and documentation.</para>
@ -203,12 +196,12 @@
<programlisting>npc encode input originalFile.txt</programlisting> <programlisting>npc encode input originalFile.txt</programlisting>
<para>The default npc configuration is XXX.</para>
<para>This will produce and output file named <para>This will produce and output file named
"<filename>originalFile_txt.npc</filename>" in the current working "<filename>originalFile_txt.npc</filename>" in the current working
directory, The original file can be recovered (decoded) using the directory. The default <command>npc</command> configuration is
syntax:</para> "<command>auto 100.0</command>" providing 100% parity content which makes
the encoded file size roughly double the input file. The original file can
be recovered (decoded) using the syntax:</para>
<programlisting>npc decode input originalFile_txt.npc</programlisting> <programlisting>npc decode input originalFile_txt.npc</programlisting>
@ -216,8 +209,8 @@
named "<filename>originalFile.txt"</filename> in the current working named "<filename>originalFile.txt"</filename> in the current working
directory. (The file name information was stored in first "meta data" directory. (The file name information was stored in first "meta data"
segment of the ".npc" file). This default naming convention can be segment of the ".npc" file). This default naming convention can be
overridden by using the npc "output" option. For example, the overridden by using the <command>npc</command> "<option>output</option>"
syntax:</para> command. For example, the syntax:</para>
<programlisting>npc decode input originalFile_txt.npc output file.txt</programlisting> <programlisting>npc decode input originalFile_txt.npc output file.txt</programlisting>
@ -247,13 +240,13 @@
commands included to support transport of <command>npc</command> encoded commands included to support transport of <command>npc</command> encoded
files. The distinction here is that a file that _fails_ NORM transport files. The distinction here is that a file that _fails_ NORM transport
might still be successfully decoded with <command>npc</command>. There might still be successfully decoded with <command>npc</command>. There
are two receiver-side norm demo application options that apply are two receiver-side <command>norm</command> demo application options
here:</para> that apply here:</para>
<orderedlist> <orderedlist>
<listitem> <listitem>
<para>The "<option>saveAborts</option>" command causes <para>The "<option>saveAborts</option>" command causes
<emphasis>norm</emphasis> to not delete (and attempt to postprocess) <command>norm</command> to not delete (and attempt to postprocess)
"aborted" files (files that failed reliable NORM transport).</para> "aborted" files (files that failed reliable NORM transport).</para>
</listitem> </listitem>
@ -323,8 +316,8 @@
</option><parameter>&lt;numData&gt;</parameter></para></entry> </option><parameter>&lt;numData&gt;</parameter></para></entry>
<entry><para>Specify the number of source data segments (packets) <entry><para>Specify the number of source data segments (packets)
per npc FEC coding block. (Default block sizing is per <command>npc</command> FEC coding block. (Default block sizing
auto)</para></entry> is auto)</para></entry>
</row> </row>
<row> <row>
@ -332,7 +325,7 @@
</option><parameter>&lt;numParity&gt;</parameter></para></entry> </option><parameter>&lt;numParity&gt;</parameter></para></entry>
<entry><para>Specify the number of FEC parity segments (packets) <entry><para>Specify the number of FEC parity segments (packets)
added per npc FEC coding block. (Default is 2 added per <command>npc</command> FEC coding block. (Default is 2
segments).</para></entry> segments).</para></entry>
</row> </row>
@ -345,10 +338,10 @@
percentage of FEC parity segments to include per block. The "auto" percentage of FEC parity segments to include per block. The "auto"
block sizing sets the block size as large as possible to treat the block sizing sets the block size as large as possible to treat the
entire files as one logical FEC block to maximize FEC performance. entire files as one logical FEC block to maximize FEC performance.
The maximum possible block size currently supported by npc are The maximum possible block size currently supported by
blocks where (numData + numParity) is less than or equal to 65536. <command>npc</command> are blocks where (numData + numParity) is
The maximum buffer size can be limited by using the less than or equal to 65536. The maximum buffer size can be
<option>bmax</option> command.</para></entry> limited by using the <option>bmax</option> command.</para></entry>
</row> </row>
<row> <row>

View File

@ -112,7 +112,7 @@ const ProtoFile::Offset NormPrecodeApp::SEGMENT_MAX = 8192;
NormPrecodeApp::NormPrecodeApp() NormPrecodeApp::NormPrecodeApp()
: encode(true), segment_size(1024), num_data(196), num_parity(4), : encode(true), segment_size(1024), num_data(196), num_parity(4),
parity_fraction(-1.0), b_max(65536), parity_fraction(100.0), b_max(65536),
i_max(1000), i_buffer_max(1500000000) i_max(1000), i_buffer_max(1500000000)
{ {
in_file_path[0] = '\0'; in_file_path[0] = '\0';
@ -222,6 +222,7 @@ bool NormPrecodeApp::OnCommand(const char* cmd, const char* val)
return false; return false;
} }
num_data = numData; num_data = numData;
parity_fraction = -1.0; // explicit block size overrides "auto" mode
} }
else if (!strncmp("parity", cmd, len)) else if (!strncmp("parity", cmd, len))
{ {