<refentry id="libnetdude-libnd-packet">
<refmeta>
<refentrytitle id="top_of_page">libnd_packet</refentrytitle>
<manvolnum>3</manvolnum>
<refmiscinfo>LIBNETDUDE Library</refmiscinfo>
</refmeta>

<refnamediv>
<refname>libnd_packet</refname>
<refpurpose></refpurpose>
<!--[<xref linkend="desc" endterm="desc.title"/>]-->
</refnamediv>

<refsynopsisdiv id="synopsis">
<title id="synopsis.title">Synopsis</title>

<synopsis>



enum        <link linkend="LND-PacketObserverOp">LND_PacketObserverOp</link>;
<link linkend="void">void</link>        (<link linkend="LND-PacketFunc">*LND_PacketFunc</link>)               (<link linkend="LND-Packet">LND_Packet</link> *packet,
                                             <link linkend="LND-ProtoData">LND_ProtoData</link> *pd,
                                             <link linkend="void">void</link> *user_data);
<link linkend="LND-Packet">LND_Packet</link>* <link linkend="libnd-packet-new">libnd_packet_new</link>                (<link linkend="LND-TracePart">LND_TracePart</link> *tp,
                                             <link linkend="guint">guint</link> data_size);
<link linkend="void">void</link>        <link linkend="libnd-packet-free">libnd_packet_free</link>               (<link linkend="LND-Packet">LND_Packet</link> *packet);
<link linkend="void">void</link>        <link linkend="libnd-packet-remove">libnd_packet_remove</link>             (<link linkend="LND-Packet">LND_Packet</link> *packet);
<link linkend="LND-Trace">LND_Trace</link>*  <link linkend="libnd-packet-get-trace">libnd_packet_get_trace</link>          (const <link linkend="LND-Packet">LND_Packet</link> *packet);
<link linkend="void">void</link>        <link linkend="libnd-packet-dump">libnd_packet_dump</link>               (const <link linkend="LND-Packet">LND_Packet</link> *packet,
                                             <link linkend="pcap-dumper-t">pcap_dumper_t</link> *dumper);
<link linkend="void">void</link>        <link linkend="libnd-packet-set-data">libnd_packet_set_data</link>           (<link linkend="LND-Packet">LND_Packet</link> *packet,
                                             const struct <link linkend="pcap-pkthdr">pcap_pkthdr</link> *hdr,
                                             const <link linkend="guchar">guchar</link> *data);
<link linkend="LND-Packet">LND_Packet</link>* <link linkend="libnd-packet-duplicate">libnd_packet_duplicate</link>          (<link linkend="LND-Packet">LND_Packet</link> *packet);
<link linkend="void">void</link>        <link linkend="libnd-packet-set-filtered">libnd_packet_set_filtered</link>       (<link linkend="LND-Packet">LND_Packet</link> *packet,
                                             <link linkend="gboolean">gboolean</link> filtered);
<link linkend="gboolean">gboolean</link>    <link linkend="libnd-packet-is-filtered">libnd_packet_is_filtered</link>        (<link linkend="LND-Packet">LND_Packet</link> *packet);
<link linkend="void">void</link>        <link linkend="libnd-packet-init">libnd_packet_init</link>               (<link linkend="LND-Packet">LND_Packet</link> *packet);
<link linkend="void">void</link>        <link linkend="libnd-packet-init-from-pcap">libnd_packet_init_from_pcap</link>     (<link linkend="LND-Packet">LND_Packet</link> *packet,
                                             <link linkend="pcap-t">pcap_t</link> *pcap);
<link linkend="gboolean">gboolean</link>    <link linkend="libnd-packet-is-complete">libnd_packet_is_complete</link>        (const <link linkend="LND-Packet">LND_Packet</link> *packet);
<link linkend="void">void</link>        <link linkend="libnd-packet-update">libnd_packet_update</link>             (<link linkend="LND-Packet">LND_Packet</link> *packet,
                                             <link linkend="LND-Protocol">LND_Protocol</link> *proto,
                                             <link linkend="guint">guint</link> nesting);
<link linkend="guchar">guchar</link>*     <link linkend="libnd-packet-get-data">libnd_packet_get_data</link>           (const <link linkend="LND-Packet">LND_Packet</link> *packet,
                                             const <link linkend="LND-Protocol">LND_Protocol</link> *proto,
                                             <link linkend="guint">guint</link> nesting);
<link linkend="guchar">guchar</link>*     <link linkend="libnd-packet-get-data-end">libnd_packet_get_data_end</link>       (const <link linkend="LND-Packet">LND_Packet</link> *packet,
                                             const <link linkend="LND-Protocol">LND_Protocol</link> *proto,
                                             <link linkend="guint">guint</link> nesting);
<link linkend="void">void</link>        <link linkend="libnd-packet-add-proto-data">libnd_packet_add_proto_data</link>     (<link linkend="LND-Packet">LND_Packet</link> *packet,
                                             <link linkend="LND-Protocol">LND_Protocol</link> *proto,
                                             <link linkend="guchar">guchar</link> *data,
                                             <link linkend="guchar">guchar</link> *data_end);
<link linkend="LND-ProtoData">LND_ProtoData</link>* <link linkend="libnd-packet-get-proto-data">libnd_packet_get_proto_data</link>  (const <link linkend="LND-Packet">LND_Packet</link> *packet,
                                             const <link linkend="LND-Protocol">LND_Protocol</link> *proto,
                                             <link linkend="guint">guint</link> nesting);
<link linkend="guchar">guchar</link>*     <link linkend="libnd-packet-get-end">libnd_packet_get_end</link>            (const <link linkend="LND-Packet">LND_Packet</link> *packet);
<link linkend="gboolean">gboolean</link>    <link linkend="libnd-packet-has-complete-header">libnd_packet_has_complete_header</link>
                                            (const <link linkend="LND-Packet">LND_Packet</link> *packet,
                                             const <link linkend="LND-Protocol">LND_Protocol</link> *proto,
                                             <link linkend="guint">guint</link> nesting);
<link linkend="gboolean">gboolean</link>    <link linkend="libnd-packet-has-proto">libnd_packet_has_proto</link>          (const <link linkend="LND-Packet">LND_Packet</link> *packet,
                                             const <link linkend="LND-Protocol">LND_Protocol</link> *proto);
<link linkend="gboolean">gboolean</link>    <link linkend="libnd-packet-has-proto-nested">libnd_packet_has_proto_nested</link>   (const <link linkend="LND-Packet">LND_Packet</link> *packet,
                                             const <link linkend="LND-Protocol">LND_Protocol</link> *proto,
                                             <link linkend="guint">guint</link> nesting);
<link linkend="LND-ProtoData">LND_ProtoData</link>* <link linkend="libnd-packet-get-last-nonraw">libnd_packet_get_last_nonraw</link> (const <link linkend="LND-Packet">LND_Packet</link> *packet);
<link linkend="void">void</link>        <link linkend="libnd-packet-update-proto-state">libnd_packet_update_proto_state</link> (<link linkend="LND-Packet">LND_Packet</link> *packet,
                                             <link linkend="int">int</link> index);
<link linkend="void">void</link>        <link linkend="libnd-packet-foreach-proto">libnd_packet_foreach_proto</link>      (<link linkend="LND-Packet">LND_Packet</link> *packet,
                                             <link linkend="LND-PacketFunc">LND_PacketFunc</link> cb,
                                             <link linkend="void">void</link> *user_data);
<link linkend="void">void</link>        <link linkend="libnd-packet-foreach-proto-backward">libnd_packet_foreach_proto_backward</link>
                                            (<link linkend="LND-Packet">LND_Packet</link> *packet,
                                             <link linkend="LND-PacketFunc">LND_PacketFunc</link> cb,
                                             <link linkend="void">void</link> *user_data);
<link linkend="void">void</link>        <link linkend="libnd-packet-modified">libnd_packet_modified</link>           (<link linkend="LND-Packet">LND_Packet</link> *packet);
<link linkend="int">int</link>         <link linkend="libnd-packet-get-index">libnd_packet_get_index</link>          (const <link linkend="LND-Packet">LND_Packet</link> *packet);
<link linkend="int">int</link>         <link linkend="libnd-packet-get-proto-nesting">libnd_packet_get_proto_nesting</link>  (const <link linkend="LND-Packet">LND_Packet</link> *packet,
                                             const <link linkend="LND-Protocol">LND_Protocol</link> *proto,
                                             <link linkend="guchar">guchar</link> *data);
<link linkend="gboolean">gboolean</link>    <link linkend="libnd-packet-fix">libnd_packet_fix</link>                (<link linkend="LND-Packet">LND_Packet</link> *packet);
<link linkend="LND-PacketObserver">LND_PacketObserver</link>* <link linkend="libnd-packet-observer-new">libnd_packet_observer_new</link>
                                            (void);
<link linkend="void">void</link>        <link linkend="libnd-packet-observer-free">libnd_packet_observer_free</link>      (<link linkend="LND-PacketObserver">LND_PacketObserver</link> *ob);
<link linkend="void">void</link>        <link linkend="libnd-packet-add-observer">libnd_packet_add_observer</link>       (<link linkend="LND-PacketObserver">LND_PacketObserver</link> *ob);
<link linkend="void">void</link>        <link linkend="libnd-packet-del-observer">libnd_packet_del_observer</link>       (<link linkend="LND-PacketObserver">LND_PacketObserver</link> *ob);
<link linkend="void">void</link>        <link linkend="libnd-packet-tell-observers">libnd_packet_tell_observers</link>     (<link linkend="LND-Packet">LND_Packet</link> *packet,
                                             <link linkend="LND-PacketObserverOp">LND_PacketObserverOp</link> op,
                                             <link linkend="void">void</link> *data);
</synopsis>
</refsynopsisdiv>









<refsect1 id="desc">
<title id="desc.title">Description</title>
<para>

</para>
</refsect1>

<refsect1 id="details">
<title id="details.title">Details</title>
<refsect2>
<title><anchor id="LND-PacketObserverOp" role="enum">enum LND_PacketObserverOp</title>
<indexterm><primary>LND_PacketObserverOp</primary></indexterm><programlisting>typedef enum {
  LND_PACKET_INITIALIZED = (1 &lt;&lt; 0), /* Packet got initialized */
  LND_PACKET_MODIFIED    = (1 &lt;&lt; 1), /* Packet got modified */
  LND_PACKET_DELETE_PRE  = (1 &lt;&lt; 2), /* Packet gets deleted (pre-action) */
  LND_PACKET_DELETE_POST = (1 &lt;&lt; 3), /* Packet got deleted (post-action) */
  LND_PACKET_INSERT_PRE  = (1 &lt;&lt; 4), /* Packet gets inserted (pre-action) */
  LND_PACKET_INSERT_POST = (1 &lt;&lt; 5), /* Packet got inserted (post-action) */
  LND_PACKET_DUPLICATED  = (1 &lt;&lt; 6), /* Packet got duplicated */
  LND_PACKET_VISIBILITY  = (1 &lt;&lt; 7), /* Packet visibility changed */
  LND_PACKET_UPDATED     = (1 &lt;&lt; 8), /* Packet got updated (partial initialization) */
  LND_PACKET_FIXED       = (1 &lt;&lt; 9)  /* Packet checksums got fixed */
} LND_PacketObserverOp;
</programlisting>
<para>

</para></refsect2>
<refsect2>
<title><anchor id="LND-PacketFunc" role="function">LND_PacketFunc ()</title>
<indexterm><primary>LND_PacketFunc</primary></indexterm><programlisting><link linkend="void">void</link>        (*LND_PacketFunc)               (<link linkend="LND-Packet">LND_Packet</link> *packet,
                                             <link linkend="LND-ProtoData">LND_ProtoData</link> *pd,
                                             <link linkend="void">void</link> *user_data);</programlisting>
<para>
Functions of this signature are used to iterate over the
protocols that are contained in packtes. See
<link linkend="libnd-packet-foreach-proto"><function>libnd_packet_foreach_proto()</function></link> and <link linkend="libnd-packet-foreach-proto-backward"><function>libnd_packet_foreach_proto_backward()</function></link>.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> the packet over whose protocol data is iterated.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>pd</parameter>&nbsp;:</term>
<listitem><simpara> iterated protocol data.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>user_data</parameter>&nbsp;:</term>
<listitem><simpara> arbitrary data passed through to this callback.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-new" role="function">libnd_packet_new ()</title>
<indexterm><primary>libnd_packet_new</primary></indexterm><programlisting><link linkend="LND-Packet">LND_Packet</link>* libnd_packet_new                (<link linkend="LND-TracePart">LND_TracePart</link> *tp,
                                             <link linkend="guint">guint</link> data_size);</programlisting>
<para>
The function creates a packet and returns it. Each packet must
belong to a trace. The function does not register the packet
in the trace, because a packet could be inserted anywhere.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>tp</parameter>&nbsp;:</term>
<listitem><simpara> trace part the new packet belongs to.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>data_size</parameter>&nbsp;:</term>
<listitem><simpara> amount of payload the new packet holds.
</simpara></listitem></varlistentry>
<varlistentry><term><emphasis>Returns</emphasis>&nbsp;:</term><listitem><simpara> fresh packet.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-free" role="function">libnd_packet_free ()</title>
<indexterm><primary>libnd_packet_free</primary></indexterm><programlisting><link linkend="void">void</link>        libnd_packet_free               (<link linkend="LND-Packet">LND_Packet</link> *packet);</programlisting>
<para>
This function removes <parameter>packet</parameter> from its trace's
packet lists, then frees <parameter>packet</parameter>.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to delete.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-remove" role="function">libnd_packet_remove ()</title>
<indexterm><primary>libnd_packet_remove</primary></indexterm><programlisting><link linkend="void">void</link>        libnd_packet_remove             (<link linkend="LND-Packet">LND_Packet</link> *packet);</programlisting>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara>


</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-get-trace" role="function">libnd_packet_get_trace ()</title>
<indexterm><primary>libnd_packet_get_trace</primary></indexterm><programlisting><link linkend="LND-Trace">LND_Trace</link>*  libnd_packet_get_trace          (const <link linkend="LND-Packet">LND_Packet</link> *packet);</programlisting>
<para>
</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet whose trace to return.
</simpara></listitem></varlistentry>
<varlistentry><term><emphasis>Returns</emphasis>&nbsp;:</term><listitem><simpara> the trace that <parameter>packet</parameter> belongs to, or <link linkend="NULL:CAPS"><literal>NULL</literal></link> if <parameter>packet</parameter>
currently belongs to no trace.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-dump" role="function">libnd_packet_dump ()</title>
<indexterm><primary>libnd_packet_dump</primary></indexterm><programlisting><link linkend="void">void</link>        libnd_packet_dump               (const <link linkend="LND-Packet">LND_Packet</link> *packet,
                                             <link linkend="pcap-dumper-t">pcap_dumper_t</link> *dumper);</programlisting>
<para>
The function writes <parameter>packet</parameter> to <parameter>dumper</parameter>. Always use this function
when you want to save some packet's content and don't use the data
and ph fields yourself, as the resulting saved packet would contain
bogus data.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to write.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>dumper</parameter>&nbsp;:</term>
<listitem><simpara> dumper to write to.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-set-data" role="function">libnd_packet_set_data ()</title>
<indexterm><primary>libnd_packet_set_data</primary></indexterm><programlisting><link linkend="void">void</link>        libnd_packet_set_data           (<link linkend="LND-Packet">LND_Packet</link> *packet,
                                             const struct <link linkend="pcap-pkthdr">pcap_pkthdr</link> *hdr,
                                             const <link linkend="guchar">guchar</link> *data);</programlisting>
<para>
The function copies the amount of bytes specified by <parameter>hdr</parameter> into <parameter>packet</parameter>,
starting at <parameter>data</parameter>. Less is copied if <parameter>packet</parameter> was created for fewer bytes.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to set content of.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>hdr</parameter>&nbsp;:</term>
<listitem><simpara> pcap header structure.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>data</parameter>&nbsp;:</term>
<listitem><simpara> packet data copied into packet.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-duplicate" role="function">libnd_packet_duplicate ()</title>
<indexterm><primary>libnd_packet_duplicate</primary></indexterm><programlisting><link linkend="LND-Packet">LND_Packet</link>* libnd_packet_duplicate          (<link linkend="LND-Packet">LND_Packet</link> *packet);</programlisting>
<para>
Returns a deep copy of a packet, but with the
list pointers set to NULL (i.e. the copy does not
belong to any packet list). It also doesn't belong
to any trace part (i.e., packet-&gt;part == NULL).</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to copy.
</simpara></listitem></varlistentry>
<varlistentry><term><emphasis>Returns</emphasis>&nbsp;:</term><listitem><simpara> packet copy or NULL when error occured.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-set-filtered" role="function">libnd_packet_set_filtered ()</title>
<indexterm><primary>libnd_packet_set_filtered</primary></indexterm><programlisting><link linkend="void">void</link>        libnd_packet_set_filtered       (<link linkend="LND-Packet">LND_Packet</link> *packet,
                                             <link linkend="gboolean">gboolean</link> filtered);</programlisting>
<para>
The function marks the given packet as filtered (if <parameter>filtered</parameter>
is <link linkend="TRUE:CAPS"><literal>TRUE</literal></link>) or unfiltered (if <parameter>filtered</parameter> is <link linkend="FALSE:CAPS"><literal>FALSE</literal></link>).</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to (un)filter.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>filtered</parameter>&nbsp;:</term>
<listitem><simpara> filtering status.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-is-filtered" role="function">libnd_packet_is_filtered ()</title>
<indexterm><primary>libnd_packet_is_filtered</primary></indexterm><programlisting><link linkend="gboolean">gboolean</link>    libnd_packet_is_filtered        (<link linkend="LND-Packet">LND_Packet</link> *packet);</programlisting>
<para>
</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to query.
</simpara></listitem></varlistentry>
<varlistentry><term><emphasis>Returns</emphasis>&nbsp;:</term><listitem><simpara> <link linkend="TRUE:CAPS"><literal>TRUE</literal></link> when the packet is currently filtered, <link linkend="FALSE:CAPS"><literal>FALSE</literal></link>
otherwise.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-init" role="function">libnd_packet_init ()</title>
<indexterm><primary>libnd_packet_init</primary></indexterm><programlisting><link linkend="void">void</link>        libnd_packet_init               (<link linkend="LND-Packet">LND_Packet</link> *packet);</programlisting>
<para>
The function initializes a packet, its data offset pointers,
and the protocol types for the protcol stack. It cleans
up before adjusting internal settings, so you can call this
repeatedly without any cleanups etc.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to initialize.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-init-from-pcap" role="function">libnd_packet_init_from_pcap ()</title>
<indexterm><primary>libnd_packet_init_from_pcap</primary></indexterm><programlisting><link linkend="void">void</link>        libnd_packet_init_from_pcap     (<link linkend="LND-Packet">LND_Packet</link> *packet,
                                             <link linkend="pcap-t">pcap_t</link> *pcap);</programlisting>
<para>
The function initializes a packet using information provided
in the given pcap handle. Use this if you want to initialize
a standalone packet that is not part of an LND_Trace. Other
than that, it's just like <link linkend="libnd-packet-init"><function>libnd_packet_init()</function></link>.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to initialize.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>pcap</parameter>&nbsp;:</term>
<listitem><simpara> pcap handle.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-is-complete" role="function">libnd_packet_is_complete ()</title>
<indexterm><primary>libnd_packet_is_complete</primary></indexterm><programlisting><link linkend="gboolean">gboolean</link>    libnd_packet_is_complete        (const <link linkend="LND-Packet">LND_Packet</link> *packet);</programlisting>
<para>
The predicate returns <link linkend="TRUE:CAPS"><literal>TRUE</literal></link> if the packet was captured
completely (i.e. pcap's caplen == len) and <link linkend="FALSE:CAPS"><literal>FALSE</literal></link> otherwise.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to check.
</simpara></listitem></varlistentry>
<varlistentry><term><emphasis>Returns</emphasis>&nbsp;:</term><listitem><simpara> completeness result.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-update" role="function">libnd_packet_update ()</title>
<indexterm><primary>libnd_packet_update</primary></indexterm><programlisting><link linkend="void">void</link>        libnd_packet_update             (<link linkend="LND-Packet">LND_Packet</link> *packet,
                                             <link linkend="LND-Protocol">LND_Protocol</link> *proto,
                                             <link linkend="guint">guint</link> nesting);</programlisting>
<para>
This is <link linkend="libnd-packet-init"><function>libnd_packet_init()</function></link>'s little brother. It doesn't initialize
the whole packet, but only the part starting at <parameter>proto</parameter> with
nesting level <parameter>nesting</parameter>.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to update.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>proto</parameter>&nbsp;:</term>
<listitem><simpara> protocol where to start update.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>nesting</parameter>&nbsp;:</term>
<listitem><simpara> at what nesting of <parameter>proto</parameter> to update.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-get-data" role="function">libnd_packet_get_data ()</title>
<indexterm><primary>libnd_packet_get_data</primary></indexterm><programlisting><link linkend="guchar">guchar</link>*     libnd_packet_get_data           (const <link linkend="LND-Packet">LND_Packet</link> *packet,
                                             const <link linkend="LND-Protocol">LND_Protocol</link> *proto,
                                             <link linkend="guint">guint</link> nesting);</programlisting>
<para>
The function returns a pointer to the packet data containing
the start of <parameter>proto</parameter>'s data at the given nesting level. If the
packet doesn't contain any such data, <link linkend="NULL:CAPS"><literal>NULL</literal></link> is returned.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to query.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>proto</parameter>&nbsp;:</term>
<listitem><simpara> protocol to look up.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>nesting</parameter>&nbsp;:</term>
<listitem><simpara> nesting level of <parameter>proto</parameter> to use.
</simpara></listitem></varlistentry>
<varlistentry><term><emphasis>Returns</emphasis>&nbsp;:</term><listitem><simpara> data pointer.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-get-data-end" role="function">libnd_packet_get_data_end ()</title>
<indexterm><primary>libnd_packet_get_data_end</primary></indexterm><programlisting><link linkend="guchar">guchar</link>*     libnd_packet_get_data_end       (const <link linkend="LND-Packet">LND_Packet</link> *packet,
                                             const <link linkend="LND-Protocol">LND_Protocol</link> *proto,
                                             <link linkend="guint">guint</link> nesting);</programlisting>
<para>
The function returns a pointer to the first byte after the
data containing the start of <parameter>proto</parameter>'s data at the given nesting
level. If the packet doesn't contain any such data, <link linkend="NULL:CAPS"><literal>NULL</literal></link>
is returned.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to query.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>proto</parameter>&nbsp;:</term>
<listitem><simpara> protocol to look up.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>nesting</parameter>&nbsp;:</term>
<listitem><simpara> nesting level of <parameter>proto</parameter> to use.
</simpara></listitem></varlistentry>
<varlistentry><term><emphasis>Returns</emphasis>&nbsp;:</term><listitem><simpara> data pointer.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-add-proto-data" role="function">libnd_packet_add_proto_data ()</title>
<indexterm><primary>libnd_packet_add_proto_data</primary></indexterm><programlisting><link linkend="void">void</link>        libnd_packet_add_proto_data     (<link linkend="LND-Packet">LND_Packet</link> *packet,
                                             <link linkend="LND-Protocol">LND_Protocol</link> *proto,
                                             <link linkend="guchar">guchar</link> *data,
                                             <link linkend="guchar">guchar</link> *data_end);</programlisting>
<para>
Each packet internally maintains a list of data offsets which
store info about the protocol type, nesting etc. This function
appends a new chunk information to that list. It is called from
<link linkend="libnd-packet-init"><function>libnd_packet_init()</function></link> and <link linkend="libnd-packet-update"><function>libnd_packet_update()</function></link>, chances are you want
these functions instead.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to update.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>proto</parameter>&nbsp;:</term>
<listitem><simpara> protocol type of data chunk
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>data</parameter>&nbsp;:</term>
<listitem><simpara> start of protocol data.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>data_end</parameter>&nbsp;:</term>
<listitem><simpara> first byte of data after protocol data.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-get-proto-data" role="function">libnd_packet_get_proto_data ()</title>
<indexterm><primary>libnd_packet_get_proto_data</primary></indexterm><programlisting><link linkend="LND-ProtoData">LND_ProtoData</link>* libnd_packet_get_proto_data  (const <link linkend="LND-Packet">LND_Packet</link> *packet,
                                             const <link linkend="LND-Protocol">LND_Protocol</link> *proto,
                                             <link linkend="guint">guint</link> nesting);</programlisting>
<para>
This function is like libnd_packet_get_data, but does not only
return the data pointer but the full <link linkend="LND-ProtoData"><type>LND_ProtoData</type></link> structure,
which yields nesting info, data start end end pointers etc.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to query.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>proto</parameter>&nbsp;:</term>
<listitem><simpara> protocol to look up.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>nesting</parameter>&nbsp;:</term>
<listitem><simpara> nesting level for <parameter>proto</parameter>.
</simpara></listitem></varlistentry>
<varlistentry><term><emphasis>Returns</emphasis>&nbsp;:</term><listitem><simpara> protocol data or <link linkend="NULL:CAPS"><literal>NULL</literal></link> if n/a.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-get-end" role="function">libnd_packet_get_end ()</title>
<indexterm><primary>libnd_packet_get_end</primary></indexterm><programlisting><link linkend="guchar">guchar</link>*     libnd_packet_get_end            (const <link linkend="LND-Packet">LND_Packet</link> *packet);</programlisting>
<para>
The function returns a ponter to the byte following the last
byte of the captured data.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to query.
</simpara></listitem></varlistentry>
<varlistentry><term><emphasis>Returns</emphasis>&nbsp;:</term><listitem><simpara> data pointer.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-has-complete-header" role="function">libnd_packet_has_complete_header ()</title>
<indexterm><primary>libnd_packet_has_complete_header</primary></indexterm><programlisting><link linkend="gboolean">gboolean</link>    libnd_packet_has_complete_header
                                            (const <link linkend="LND-Packet">LND_Packet</link> *packet,
                                             const <link linkend="LND-Protocol">LND_Protocol</link> *proto,
                                             <link linkend="guint">guint</link> nesting);</programlisting>
<para>
The predicate returns <link linkend="TRUE:CAPS"><literal>TRUE</literal></link> when a packet contains a complete header
of the requested protocol, <link linkend="FALSE:CAPS"><literal>FALSE</literal></link> otherwise. The implementation of
the check itself is up to the implementation of <parameter>proto</parameter>'s plug-in.
If you only need to know whether a protocol is present in the packet
at all, use <link linkend="libnd-packet-has-proto"><function>libnd_packet_has_proto()</function></link>, which is faster.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to query.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>proto</parameter>&nbsp;:</term>
<listitem><simpara> protocol to check for.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>nesting</parameter>&nbsp;:</term>
<listitem><simpara> nesting level for <parameter>proto</parameter>.
</simpara></listitem></varlistentry>
<varlistentry><term><emphasis>Returns</emphasis>&nbsp;:</term><listitem><simpara> check result.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-has-proto" role="function">libnd_packet_has_proto ()</title>
<indexterm><primary>libnd_packet_has_proto</primary></indexterm><programlisting><link linkend="gboolean">gboolean</link>    libnd_packet_has_proto          (const <link linkend="LND-Packet">LND_Packet</link> *packet,
                                             const <link linkend="LND-Protocol">LND_Protocol</link> *proto);</programlisting>
<para>
The predicate returns <link linkend="TRUE:CAPS"><literal>TRUE</literal></link> when a packet contains data of the
given protocol. It may contain multiple instances of a protocol,
but the function only checks if a protocol is present at all.
If you need to find out whether a protocol is present at a given
nesting level (e.g. whether a packet contains IP in IP), use
<link linkend="libnd-packet-has-complete-header"><function>libnd_packet_has_complete_header()</function></link> or <link linkend="libnd-packet-has-proto-nested"><function>libnd_packet_has_proto_nested()</function></link>.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to query.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>proto</parameter>&nbsp;:</term>
<listitem><simpara> protocol to check for.
</simpara></listitem></varlistentry>
<varlistentry><term><emphasis>Returns</emphasis>&nbsp;:</term><listitem><simpara> check result.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-has-proto-nested" role="function">libnd_packet_has_proto_nested ()</title>
<indexterm><primary>libnd_packet_has_proto_nested</primary></indexterm><programlisting><link linkend="gboolean">gboolean</link>    libnd_packet_has_proto_nested   (const <link linkend="LND-Packet">LND_Packet</link> *packet,
                                             const <link linkend="LND-Protocol">LND_Protocol</link> *proto,
                                             <link linkend="guint">guint</link> nesting);</programlisting>
<para>
The predicate returns <link linkend="TRUE:CAPS"><literal>TRUE</literal></link> when a packet contains data of the
given protocol at the requested nesting level.
If you only need to find out whether a protocol is present at all,
use <link linkend="libnd-packet-has-proto"><function>libnd_packet_has_proto()</function></link> instead, which is faster.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to query.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>proto</parameter>&nbsp;:</term>
<listitem><simpara> protocol to check for.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>nesting</parameter>&nbsp;:</term>
<listitem><simpara> nesting level of <parameter>proto</parameter>.
</simpara></listitem></varlistentry>
<varlistentry><term><emphasis>Returns</emphasis>&nbsp;:</term><listitem><simpara> check result.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-get-last-nonraw" role="function">libnd_packet_get_last_nonraw ()</title>
<indexterm><primary>libnd_packet_get_last_nonraw</primary></indexterm><programlisting><link linkend="LND-ProtoData">LND_ProtoData</link>* libnd_packet_get_last_nonraw (const <link linkend="LND-Packet">LND_Packet</link> *packet);</programlisting>
<para>
The function tries to find the innermost protocol in the packet coming
before any uninterpreted raw data.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to query.
</simpara></listitem></varlistentry>
<varlistentry><term><emphasis>Returns</emphasis>&nbsp;:</term><listitem><simpara> the protocol data before raw data, if there is both
raw data interpreted data coming before it, or <link linkend="NULL:CAPS"><literal>NULL</literal></link> if either is
missing.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-update-proto-state" role="function">libnd_packet_update_proto_state ()</title>
<indexterm><primary>libnd_packet_update_proto_state</primary></indexterm><programlisting><link linkend="void">void</link>        libnd_packet_update_proto_state (<link linkend="LND-Packet">LND_Packet</link> *packet,
                                             <link linkend="int">int</link> index);</programlisting>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara>
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>index</parameter>&nbsp;:</term>
<listitem><simpara>


</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-foreach-proto" role="function">libnd_packet_foreach_proto ()</title>
<indexterm><primary>libnd_packet_foreach_proto</primary></indexterm><programlisting><link linkend="void">void</link>        libnd_packet_foreach_proto      (<link linkend="LND-Packet">LND_Packet</link> *packet,
                                             <link linkend="LND-PacketFunc">LND_PacketFunc</link> cb,
                                             <link linkend="void">void</link> *user_data);</programlisting>
<para>
The function iterates over the protocols in the packet, from
outer- to the innermost, and calls <parameter>cb</parameter> with that the corresponding
packet, protocol data and <parameter>user_data</parameter>.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet whose protocols to iterate.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>cb</parameter>&nbsp;:</term>
<listitem><simpara> callback to call.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>user_data</parameter>&nbsp;:</term>
<listitem><simpara> arbitrary data passed to <parameter>cb</parameter>.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-foreach-proto-backward" role="function">libnd_packet_foreach_proto_backward ()</title>
<indexterm><primary>libnd_packet_foreach_proto_backward</primary></indexterm><programlisting><link linkend="void">void</link>        libnd_packet_foreach_proto_backward
                                            (<link linkend="LND-Packet">LND_Packet</link> *packet,
                                             <link linkend="LND-PacketFunc">LND_PacketFunc</link> cb,
                                             <link linkend="void">void</link> *user_data);</programlisting>
<para>
The function iterates over the protocols in the packet, from
inner- to the outermost, and calls <parameter>cb</parameter> with that the corresponding
packet, protocol data and <parameter>user_data</parameter>.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet whose protocols to iterate.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>cb</parameter>&nbsp;:</term>
<listitem><simpara> callback to call.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>user_data</parameter>&nbsp;:</term>
<listitem><simpara> arbitrary data passed to <parameter>cb</parameter>.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-modified" role="function">libnd_packet_modified ()</title>
<indexterm><primary>libnd_packet_modified</primary></indexterm><programlisting><link linkend="void">void</link>        libnd_packet_modified           (<link linkend="LND-Packet">LND_Packet</link> *packet);</programlisting>
<para>
The function marks a packet as modified and updates the GUI
accordingly.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to mark.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-get-index" role="function">libnd_packet_get_index ()</title>
<indexterm><primary>libnd_packet_get_index</primary></indexterm><programlisting><link linkend="int">int</link>         libnd_packet_get_index          (const <link linkend="LND-Packet">LND_Packet</link> *packet);</programlisting>
<para>
The function returns the index of the packet in it's trace,
the first packet has index 0.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to query.
</simpara></listitem></varlistentry>
<varlistentry><term><emphasis>Returns</emphasis>&nbsp;:</term><listitem><simpara> index, or -1 if error occurred.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-get-proto-nesting" role="function">libnd_packet_get_proto_nesting ()</title>
<indexterm><primary>libnd_packet_get_proto_nesting</primary></indexterm><programlisting><link linkend="int">int</link>         libnd_packet_get_proto_nesting  (const <link linkend="LND-Packet">LND_Packet</link> *packet,
                                             const <link linkend="LND-Protocol">LND_Protocol</link> *proto,
                                             <link linkend="guchar">guchar</link> *data);</programlisting>
<para>
The function returns the nesting level of <parameter>proto</parameter> at the given
data offset. The first occurrence of a protocol has nesting level 0.
So, if you call this for IP and the data pointer points to somewhere
in or after the IP header in an ICMP error message, the nesting level
will be 1.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to query.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>proto</parameter>&nbsp;:</term>
<listitem><simpara> protocol whose nesting level to find.
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>data</parameter>&nbsp;:</term>
<listitem><simpara> data pointer.
</simpara></listitem></varlistentry>
<varlistentry><term><emphasis>Returns</emphasis>&nbsp;:</term><listitem><simpara> nesting level, or -1 when an error occurred.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-fix" role="function">libnd_packet_fix ()</title>
<indexterm><primary>libnd_packet_fix</primary></indexterm><programlisting><link linkend="gboolean">gboolean</link>    libnd_packet_fix                (<link linkend="LND-Packet">LND_Packet</link> *packet);</programlisting>
<para>
The function calls the fix_packet callback of every protocol that
is contained in <parameter>packet</parameter>, iterating from the inner- to the outermost
protocol.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara> packet to fix.
</simpara></listitem></varlistentry>
<varlistentry><term><emphasis>Returns</emphasis>&nbsp;:</term><listitem><simpara> <link linkend="TRUE:CAPS"><literal>TRUE</literal></link> if <parameter>packet</parameter> got modified, <link linkend="FALSE:CAPS"><literal>FALSE</literal></link> otherwise.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-observer-new" role="function">libnd_packet_observer_new ()</title>
<indexterm><primary>libnd_packet_observer_new</primary></indexterm><programlisting><link linkend="LND-PacketObserver">LND_PacketObserver</link>* libnd_packet_observer_new
                                            (void);</programlisting>
<para>
The function allocates a new, empty packet observer. You should
then fill in callbacks for the events you're interested in,
and register the thing using <link linkend="libnd-packet-add-observer"><function>libnd_packet_add_observer()</function></link>.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><emphasis>Returns</emphasis>&nbsp;:</term><listitem><simpara> new packet observer with dummy callbacks.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-observer-free" role="function">libnd_packet_observer_free ()</title>
<indexterm><primary>libnd_packet_observer_free</primary></indexterm><programlisting><link linkend="void">void</link>        libnd_packet_observer_free      (<link linkend="LND-PacketObserver">LND_PacketObserver</link> *ob);</programlisting>
<para>
The function releases all memory associated with <parameter>ob</parameter>.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>ob</parameter>&nbsp;:</term>
<listitem><simpara> observer to delete.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-add-observer" role="function">libnd_packet_add_observer ()</title>
<indexterm><primary>libnd_packet_add_observer</primary></indexterm><programlisting><link linkend="void">void</link>        libnd_packet_add_observer       (<link linkend="LND-PacketObserver">LND_PacketObserver</link> *ob);</programlisting>
<para>
The function registers the new observer for notifications about
future changes to packets.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>ob</parameter>&nbsp;:</term>
<listitem><simpara> new observer to register.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-del-observer" role="function">libnd_packet_del_observer ()</title>
<indexterm><primary>libnd_packet_del_observer</primary></indexterm><programlisting><link linkend="void">void</link>        libnd_packet_del_observer       (<link linkend="LND-PacketObserver">LND_PacketObserver</link> *ob);</programlisting>
<para>
The function stops packet operations from being reported to
<parameter>ob</parameter>. It does not release <parameter>ob</parameter>'s memory, use <link linkend="libnd-packet-observer-free"><function>libnd_packet_observer_free()</function></link>
for that.</para>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>ob</parameter>&nbsp;:</term>
<listitem><simpara> observer to drop.
</simpara></listitem></varlistentry>
</variablelist></refsect2>
<refsect2>
<title><anchor id="libnd-packet-tell-observers" role="function">libnd_packet_tell_observers ()</title>
<indexterm><primary>libnd_packet_tell_observers</primary></indexterm><programlisting><link linkend="void">void</link>        libnd_packet_tell_observers     (<link linkend="LND-Packet">LND_Packet</link> *packet,
                                             <link linkend="LND-PacketObserverOp">LND_PacketObserverOp</link> op,
                                             <link linkend="void">void</link> *data);</programlisting>
<para>

</para><variablelist role="params">
<varlistentry><term><parameter>packet</parameter>&nbsp;:</term>
<listitem><simpara>
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>op</parameter>&nbsp;:</term>
<listitem><simpara>
</simpara></listitem></varlistentry>
<varlistentry><term><parameter>data</parameter>&nbsp;:</term>
<listitem><simpara>


</simpara></listitem></varlistentry>
</variablelist></refsect2>

</refsect1>




</refentry>
