summaryrefslogtreecommitdiff
path: root/libnet/doc
diff options
context:
space:
mode:
Diffstat (limited to 'libnet/doc')
-rw-r--r--libnet/doc/BUGS19
-rw-r--r--libnet/doc/CHANGELOG549
-rw-r--r--libnet/doc/CONTRIB57
-rw-r--r--libnet/doc/COPYING31
-rw-r--r--libnet/doc/CVS/Entries12
-rw-r--r--libnet/doc/CVS/Repository1
-rw-r--r--libnet/doc/CVS/Root1
-rw-r--r--libnet/doc/DESIGN_NOTES134
-rw-r--r--libnet/doc/MIGRATION172
-rw-r--r--libnet/doc/PACKET_BUILDING207
-rw-r--r--libnet/doc/PORTED45
-rw-r--r--libnet/doc/RAWSOCKET_NON_SEQUITUR41
-rw-r--r--libnet/doc/TODO96
-rw-r--r--libnet/doc/libnet.doxygen.conf1102
-rw-r--r--libnet/doc/man/CVS/Entries1
-rw-r--r--libnet/doc/man/CVS/Repository1
-rw-r--r--libnet/doc/man/CVS/Root1
17 files changed, 2470 insertions, 0 deletions
diff --git a/libnet/doc/BUGS b/libnet/doc/BUGS
new file mode 100644
index 0000000..2e8c929
--- /dev/null
+++ b/libnet/doc/BUGS
@@ -0,0 +1,19 @@
+===============================================================================
+ $Id: BUGS,v 1.2 2004/01/03 20:31:00 mike Exp $
+ LIBNET 1.1 (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
+ http://www.packetfactory.net/libnet
+===============================================================================
+
+
+ 1.1.0 KNOWN BUG LIST
+
+ - It appears as though getprotobynumber() is broken in some linux
+ distributions. The /etc/protocols file should be of the format:
+ protocol name protocol number proctocol symbolic constant comment
+ Most of the file (in my redhat 7.1) distro complies with this format
+ until you get to the end of the file:
+ # 134-254 # Unassigned
+ # 255 # Reserved
+ This will cause getprotobynumber() and presumably getprotobyname() to
+ segfault. If you get this behavior in your program and you're calling
+ __libnet_file_dump(), this could be the reason. Caveat Emptor.
diff --git a/libnet/doc/CHANGELOG b/libnet/doc/CHANGELOG
new file mode 100644
index 0000000..b1f844d
--- /dev/null
+++ b/libnet/doc/CHANGELOG
@@ -0,0 +1,549 @@
+===============================================================================
+ $Id: CHANGELOG,v 1.26 2004/11/09 07:05:06 mike Exp $
+ LIBNET 1.1 (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
+ http://www.packetfactory.net/libnet
+===============================================================================
+
+
+ Added a libnet_version() function
+ Fixed a bug in libnet_build_ntp() where two arguments werent used due to a
+ typo
+ Fixed a bug ln libnet_name2addr4 in which it didnt call hstrerror
+ Fixed a memory leak in libnet_if_addr.c
+ Internals: added a payload builder macro
+ Added an HSRP builder
+ Fixed the cdp.c sample code
+ Added AC_PREREQ(2.50) to configure.in to come correct
+ Added a libnet udp header prototype. We need to add an entire exported
+ interface for the sole purpose of casting captured packets, this will
+ presumably be a part of the pcap integration.
+ Added libnet_adv_write_raw_ipv4()
+ Fixed the checksum function
+ Updated the autoconf/automake stuff to be up to date with the latest
+ versions. We now use libtool.
+ Fixed a signed/unsigned comparison warning in the LIBNET_DO_PAYLOAD() macro
+ Changed all empty function prototypes to contain the void keyword
+ Removed all C++ style comments
+ Removed the configure.in check for strerror()
+
+
+Mon Mar 29 09:23:49 PST 2004 1.1.2.1
+
+ Fixed a typo in the ICMP patch mentioned below
+
+Thu Mar 25 10:49:04 PST 2004 1.1.2
+
+ Fixed the ICMP error message builders (there was a pblock assembly bug
+ that would prevent you from building more than one ICMP {unreach, time
+ exceed, redirect} in succession; the order of operations has changed
+ slightly for building these packets, see the documenation and sample code
+ Added a Sebek builder
+ Fixed a bug in libnet_autobuild_arp() that had it pulling in the address to
+ a pointer instead of just the address
+ Added AM_MAINTAINER_MODE to configure.in
+ Changed the __libnet_dump* namespace to the more descriptive libnet_diag*
+ Added libnet_getpacket_size() to return the size of a packet in a given l
+ Removed "protocol" from the libnet context. It was a waste of four bytes
+ The raw socket interface always uses the "IPPROTO_RAW" protocol
+ Fixed a memory leak in the advanced interface; there is now a function
+ libnet_adv_free_packet() to free the memory allocated for the packet
+ when libnet_adv_cull_packet() is called
+ Fixed a bug on big endian boxes that had TCP and UDP checksums with odd
+ payloads come out incorrect
+ Changes all error messages to look and feel the same:
+ "%s(): foo\n", __func__
+ Added a bunch of htons/htonl fixes
+ Continued to add to the doxygen-based documentation
+ Added support for unconfigured interfaces
+ Changed the number of interfaces libnet can handle from 32 to 512
+ Removed uneeded control structure cruft from libnet_link_dlpi.c
+ Removed sample/ip.c and added sample/ip_link.c and sample/ip_raw.c
+ Added IPv6 fragmentation header builder
+ Added IPv6 routing information header builder
+ Added IPv6 destination options header builder
+ Fixed IPv6 flowlabel and traffic class bitwise math
+
+Tue Nov 25 15:33:27 PST 2003 1.1.1
+
+ Fixed a bug in libnet_build_icmp_redirect: htonl(gateway) --> gateway.
+ Added icmp_redirect.c sample code.
+ Added libnet_autobuild_arp().
+ Added a slightly faster checksum.
+ Added a GRE builder.
+ Fixed a buffer overflow in libnet_build_dhcp().
+ Added more sanity checks to ensure we have proper link or network layer
+ headers when not in advanced mode.
+ Fixed a bug that would sometimes make __libnet_dump_context() crash under
+ linux.
+ Migration from sprintf and strcpy snprintf and strncpy.
+ Fixed bug in libnet_build_ipv4() when calculating size of memory block
+ Removed the support directory -- if you're an OLD version of OpenBSD or
+ FreeBSD you deserve what you get.
+ Added a BGP builder.
+ Changed the error handing functions to be more consistent and use
+ __FUNCTION__.
+ Fixed a bug in libnet_pblock_free() -- replaced it with
+ libnet_pblock_delete().
+ Fixed all of the inconsistencies inside all of the builders and pblock code
+ where some fringe conditions could result in u_longs being crunched into
+ u_shorts.
+ Fixed libnet_pblock_coalesce() to only require one pass through the list.
+ Added better diagnostics (__libnet_dump_context(), __libnet_dump_pblock()).
+ Added Token Ring and FDDI builders (Linux and Solaris only).
+ Added Token Ring and FDDI sample programs.
+ Fixed the handling of TCP and IP payloads when reusing a pblocks.
+ Fixed the handling of IP headers such that if a TCP packet changes size
+ via subsequent calls to libnet_build_tcp(), the IP header automatically
+ changes size as well.
+ Added libnet_pblock_delete() to remove a pblock from the list.
+ Added ip.c sample program (builds an arbitrary IP packet).
+ Added additional payload sanity checks to libnet_build_*.
+ Added a payload to sample/icmp_echo_cq.c.
+ Added an MPLS builder.
+ Added an 802.1x builder.
+ Added an RPC builder! Bout time eh?
+ Fixed do1x.c sample code to make the frame valid.
+ Fixed link-interface semantics under Mac/OSX
+ Changed libnet_stats to all be unsigned long longs to accomodate all of
+ hardcore packet writers.
+ Fixed IPv6 support (to some extent) removed the IP_HDRINCL stuff and
+ reworked the resolver stuff to use net_pton() and inet_ntop().
+ Fixed libnet_build_icmpv4_*() to properly handle the IP header in the
+ payload.
+ Fixed libnet_build_igmp() to handle checksums properly.
+ Fixed a bug in libnet_build_dnsv4() -- now it will work for TCP or UDP --
+ see the sample program for details...
+ Fixed a bug in sample/dhcp_discover.c
+ Added multiple packet interface (called the context queue interface).
+ Until I finish the manpage, see the sample code and README files
+ for instructions on how it works.
+ Fixed Cygwin support.
+ Fixed an OS/X compilation error due to lack of system header files.
+ Fixed OS/X link layer bug.
+ Fixed a bug in pblock_coalesce() that resulted in bad checksums when the
+ advanced mode was enabled.
+ Fixed a potential memory leak in pblock_coalesce().
+ Fixed a potential memory leak in libnet_select_device().
+ Fixed a potential memory leak in libnet_plist_chain_new().
+ Fixed Solaris support for IPv6 address support.
+ Fixed minor bugs in libnet_advanced.c.
+ Added loopback device support.
+
+
+Mon Aug 5 15:18:52 PDT 2002 1.1.0
+
+ First 1.1.0 non-beta release.
+
+ Added libnet_adv_write_link() which allows an advanced user to access
+ libnet's low-level frame injection functionality directly.
+
+
+Wed Jul 10 08:18:15 PDT 2002 1.1.0 Beta 07b
+
+ Added some words to the manpage.
+
+ Fixed a typo in libnet-functions.h -- forgot a comma.
+
+
+Sun Jul 7 10:37:12 PDT 2002 1.1.0 Beta 07a
+
+ My bad. Forgot to `make distclean` before last release resulting in some
+ compilation errors.
+
+ My bad. Forgot to add advanced *_ADV writing support to libnet_write().
+ Simple fix.
+
+
+Tue Jul 2 08:42:57 PDT 2002 1.1.0 Beta 07
+
+ BETA support for IPv6.
+
+ Fixed the IP and TCP options bugs that bound the TCP and IP payloads to
+ the IP and TCP headers respectively and saw options being appended
+ after the payload.
+
+ Added libnet_hex_aton(). This functions reads in arbirtrarily long hex
+ strings from the command line and returns the equivalent byte string. It
+ does an implicit malloc() so make sure to free().
+
+ Frédéric Raynal submitted a patch to break the coalesce loop down to two
+ passes using realloc resulting in a modest performance increase! Cool!
+
+ Added "Advanced Mode" which will initialize the library with additional
+ functionality for advanced users who "know what they're doing". Basically
+ this feature will remove some of the sanity checks libnet does when
+ building and injecting packets, at the programmer's peril. It also exposes
+ the libnet_adv() functions.
+
+ FINALLY changed that irritating struct ether_addr redefintion problem.
+ I internalized the name space of it (-> libnet_ether_addr) so there will
+ be no more issues there. Please update your code accordingly!
+
+ Added IGMP checksum support which was omitted by accident.
+
+ Removed netinet/ip_icmp.h from include list. This was causing problems
+ when including dnet.h which includes other system headers. We can
+ probably stand to remove several headers from libnet.h.in.
+
+ Added sanity check to ensure that when *build_ethernet() is called the
+ injection method is LIBNET_LINK (except when advanced mode is on).
+
+
+Thu Mar 28 22:18:46 PST 2002 1.1.0 Beta 06
+
+ Fixed ICMP unreachable checksum error and payload issues. Now using the
+ payload interface with unreachables will append the payload to the IPv4
+ header of the "offending packet".
+
+ Split STP builder into two; libnet_build_stp_conf() and
+ libnet_build_stp_tcn().
+
+ New CHANGELOG format. :)
+
+
+Mar 24 2002 1.1.0 Beta 05
+
+ New building logic. Top down. Much smarter, we now build packets and
+ frames like an OS kernel.
+
+ Added Cisco ISL builder.
+
+
+Mar 18 2002 1.1.0 Beta 04
+
+ Added an STP builder.
+
+ Hooks for Cisco ISL builder.
+
+ Changed libnet_init() to now accept an IP address for the device (so
+ either "fxp0" or "192.168.0.1" will work).
+
+ Added libnet_clear_packet() to free packet memory when we're done with it.
+
+
+Feb 28 2002 1.1.0 Beta 03
+
+ Added 802.1q, 802.2, 802.3 builders.
+
+
+Feb 25 2002 1.1.0 Beta 02
+
+ Fixed Cygwin support.
+
+
+Feb 01 2002 1.1.0 Beta 01
+
+ Complete new API and overhaul of most everything.
+
+ Improved linux packet socket support.
+
+ Renamed libnet_host_lookup() and libnet_name_resolve() to the more
+ intuitive libnet_addr2name() and libnet_name2addr().
+
+ All of the address resolution functions return host byte order (which
+ is what the build functions want).
+
+ Removed a ton of code from every corner of libnet.
+
+ Removed alot of useless crap:
+ misc directory
+ ports directory
+ util directory
+ cleaned out the test directory and moved it to sample
+
+ The libnet-config script is no longer needed to specify machine
+ endianess -- that has been moved to libnet.h and done at compile time.
+ You can still use it to specify other CPP constants as well as
+ libraries.
+
+ Added cygwin support.
+
+ Hooks for a few ieee 802 builders.
+
+ Added NTP builder.
+
+ Added DHCP builder.
+
+ Added BOOTP builder.
+
+ Added Cisco CDP builder (needs work).
+
+ Added IPSEC builder (needs work).
+
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ 1.0.2a 02.06.2001 Oops! Messed up the install stuff. Fixed now.
+ Fixed the config.sub to correctly look for arm*
+ architecture.
+ Fixed the test.sh script
+ (Thankz again to syke).
+
+ 1.0.2 02.03.2001 Added OpenBSD 2.7 etherspoof lkm and kernel patch.
+ (Thankz to obecian).
+ Added FreeBSD 4.0-STABLE (and 5.0-CURRENT?)
+ etherspoof kernel patch.
+ (Thankz to Matt Bing).
+ Added FreeBSD 4 support for automagic MAC address
+ spoofing (via ioctl). No more lkm!
+ (Thankz to Toni Andjelkovic).
+ Added VRRP support.
+ Fixed a NULL pointer check in libnet_checksum.c.
+ (Thankz to syke).
+ Fixed a function naming problem in libnet_if_addr.c.
+ (Thankz to gigisull).
+ Fixed a potential byte error in libnet_version.
+ (Thankz to wotan).
+ Fixed a potential overflow in
+ libnet_link_sockpacket.c and libnet_link_dlpi.c.
+ (Thankz to Jarno Huuskonen).
+ Fixed a manpage discrepancy (get_ip_addr returns
+ host-byte, not network-byte).
+ Fixed arena allocation code (misalignments and
+ whatnot) and arena manpage entry (2 arguments
+ were swapped).
+ (Thankz to Bryan T. Schmersal).
+ Fixed datatype discrepancies (u_char was used
+ liberally when char should have been used).
+ (Thankz to Kyle Hargraves).
+ Fixed the PF_PACKET interface to work correctly.
+ (Thankz to Smiler).
+
+ 1.0.1b 04.07.2000 Fixed portlist chaining code to allow for more than
+ one active plist chain at a time (as per twitch's
+ patch).
+ Fixed discrepancy between the manpage and code for
+ libnet_close_link_interface. It now returns 1 on
+ success as per libnet standard (thankz to Toni
+ Andjelkovic for pointing this out).
+
+ 1.0.1a 03.29.2000 Fixed a small bug in libnet_link_dlpi.c.
+
+ 1.0.1 12.19.1999 Fixed a typo in libnet-headers.h ARH_H -> ARP_H.
+ Fixed a small typo in ether_mod-2.5.c.
+ Pre-happy BD to libnet! She'z almost 2 yearz old!
+
+ 1.0.0 10.27.1999 Added verbose html documentation.
+ Added verbosely commented example code.
+ Fixed OSPF testcode compile issues.
+ Added ping of death ICMP test code module.
+ Fixed manpage installation wrongness.
+ Fixed a reported bug in OpenBSD etherspoof lkm.
+ Merged OSPF lsa checksum code into main checksum
+ module.
+ Fixed a reported bug in the Makefile.in under
+ Solaris when make install was invoked, the ln
+ failed.
+ Fixed linux-based IP broadcasting using the
+ raw sockets interface.
+
+ 0.99g 09.13.1999 Added an OSPF builder (which is still in beta).
+ Fixed the Linux/configure.in bug. This was an odd
+ bug that affected Linux-based boxes, but not
+ BSD-based machines. The configure script refused
+ to expand most of the Makefile.in macros in every file
+ because of a conditional check.
+ Fixed some Makefile.in issues.
+
+ 0.99f 09.09.1999 Changed test/poink.c to not rely on a previous
+ install of libnet to compile.
+ Added a redhat RPM.
+ Changed sourcefile naming scheme to libnet_*.
+ Removed all assertions from the tree.
+ We are moving closer to a 1.0 release and
+ assertions have no place in production code.
+ Furthermore, there should be no exit points
+ inside a library. Currently, all functions that
+ made assertions now return an integral 1 upon
+ success and a -1 when the assertion would have
+ failed (some had to be changed from returning
+ void to returning int). This will not break
+ backward compatbility.
+ Fixed bugs in the arena code.
+ next_packet_from_arena would never return the
+ first chunk of memory, only the "next". It
+ now handles this special case. Thanks to
+ Sascha Gresk for locating this bug.
+ Fixed another potential bug when attempting
+ to allocate large packet sizes inside an arena.
+ Added an OpenBSD 2.5 ether_spoof lkm.
+ Fixed TCP options bugs.
+
+ 0.99e 07.21.1999 Modified the libnet-config script to work more
+ intutively now. It accepts multiple arguments.
+ See README.libnet-config.
+ Solaris m4/sh fixes (autoconf phase).
+ Internal error handling changed to use libnet_error.
+
+ 0.99d 06.24.1999 Added: build_icmp_redirect().
+ Added: FreeBSD 3.x support for spoofing source.
+ Added: libnet_error().
+ Added: port list chaining code.
+ MAC addrresses (see README.bpf).
+ Bugfix: libnet_select_device correctly accepts
+ NULL device arguments.
+ Bugfix: build_icmp.c now copies the correct amount
+ of header information.
+ Bugfix: OpenBSD needs HAVE_SOCKADDR_SA_LEN.
+ Changed: write_ip internal semantics. Cleaner
+ and faster now.
+ Changed: init_packet argument parameters. More
+ correct now. Takes a u_short vs. a size_t.
+
+ 0.99c 05.28.1999 link_int -> libnet_link_int.
+ Misc small testcode fixes.
+ Added libnet_tcp_header and libnet_ip_header.
+ Added libnet-config shell script, see
+ README.libnet-config and the manpage.
+ Updated ports.
+ Revamped checksum module -- it's much simpler
+ and more efficient (ripped out arch specific
+ code which seemed to be buggy with series' of
+ very large packets). Dug Song wrote it, with
+ small fixes/changes by MDS.
+
+ 0.99b 05.06.1999 Fixed a nasty UDP/TCP + data checksum bug.
+ Header structure further divided into subfiles.
+ Moved get_hwaddr into low-level interface locales.
+ Fixed the BSD get_hwaddr (dugsong@anzen.com).
+ Ported to BSD/OS 3.x.
+ Added `LIBNET_VERSION` symbolic constant.
+ build_ip with payload semantics changed (now
+ requires a payload length which is more
+ intuitive).
+ Fixed the `disappearing MAC address problem`
+ within the linux version of get_hwaddr().
+
+ 0.99a 04.14.1999 Linux 2.0.x kernels don't have <net/ethernet.h>
+ 0.99 included this header file without checking
+ to see if it present. This is now fixed.
+ Non-x86 systems have no tcp_check function but the
+ stub.c sourcefile did not check this. This is now
+ fixed.
+ Added the utilities directory and get_mac.c.
+
+ 0.99 04.13.1999 Major manpage redux.
+ Added (broken?) PF_PACKET support for Linux (see
+ README.linux).
+ Moved alot of m4 from configure.in to aclocal.m4.
+ Added Linux m4 macro to detect PF_PACKET.
+ Added build_icmp_unreach
+ Added build_icmp_timestamp
+ Added standard nomenclature for all the ICMP
+ type/code symbolic constants (see the manpage).
+ Changed internal network structure nomenclature.
+ Decided to stop using the word nomenclature so much.
+ Fixed semantics of get_ipaddr (s/PF_INET/AF_INET).
+ Added a symlink in the install directory so libnet
+ is also named `libpwrite`.
+ Added ASN.1 conversion routines, mostly pilfered
+ from ucd snmplib.
+ Removed get_hwaddr from sockpacket.c and made the
+ existing one portable to Linux.
+ Added more testcode and changed testcode structure
+ to be more intuitive.
+ Added init_packet and destroy_packet.
+ Added an arena allocator.
+ Fixed alignment issues on SPARC and Alpha
+ (possibly others with strict alignment
+ requirements).
+ Added a packet dumping routine. Not fully tested.
+ Testcode updates including a master testcode shell
+ script.
+ Added stub functions to ease the eventual
+ transition to a more proper `libnet_*` function
+ naming convention. See README.stubs for more
+ info.
+
+ 0.10a 02.04.1999 Added the libnet.s2h configuration file to the
+ distribution.
+ GLIBC fix.
+
+ 0.10 01.31.1999 Many low-level changes, same interface though.
+ Split up the main libnet.h file into two files.
+ Autoconf changes:
+ checks to see if the underlying architecture
+ needs to be aligned.
+ flexible install location.
+ explicitly set $CC option in Makefile.in.
+ Added ensure-dir.sh.
+ Changes DEBUG semantics as I was told the previous
+ stuff broke on some compilers.
+ Created a FreeBSD/OpenBSD ports entry.
+ SGI snoop (drain) interface fixed.
+ Solaris/HPUX DLPI interface fixed.
+ Support for getting local IP addresses.
+ Support for getting local hardware addresses.
+ Added a DNS packet builder.
+ Added an RIP packet builder.
+ Added an ICMP MASKREQ/REPLY packet builder.
+ Added ICMP at the link layer test code.
+ Changed GLIBC version detection semantics.
+
+ 0.9 12.15.1998 Major changes/additions here...
+ Added lowlevel packet building and writing
+ routines with a codebase from libpcap.
+ Broken DPLI support (fixme!).
+ Added ethernet and ARP building routines.
+ Added ICMP_ECHO building routine which led to the
+ Discovery of an odd kernel panic bug under
+ OpenBSD (see hook.c in test dir).
+ Added IGMP building routine.
+ Reworked autoconf script.
+ Fixed Linux ip_sum vs. ip_csum naming issue.
+ Fixed Solaris checksums (2.4, 2.5.x).
+ Added NetBSD autoconf entry.
+ Changed BSD_BYTE_SWAP semantics to correctly handle
+ IP datagrams through BPF (see write_ip.c).
+
+ 0.8c 11.10.1998 Added more testcode.
+
+ 0.8b 10.21.1998 OK. I THINK WE'VE FINALLY FIXED THAT GLIBC THING.
+ Ported to alpha Linux.
+
+ 0.8a 10.15.1998 Added support for IP TOS bits (oops. Broke
+ backward compatibility again. Like I said, don't
+ rely on this until 1.x).
+
+ 0.8 10.13.1998 Added support for IP options.
+ Added support for TCP options.
+ Added a dummy version function.
+ Fixed linux libc vs. glibc nomenclature discrepancy.
+ Solaris checksums fixed for non-payload laden
+ packets?
+
+ 0.7b 09.22.1998 Linux glibc/libc nomenclature anomoly still there.
+ Fixed Linux/BSD icmp header size problem.
+
+ 0.7a 08.26.1998 Fixed payload support (see test code).
+
+ 0.7 08.25.1998 Solaris port (checksums broken -- Solaris has gay
+ fucking quirks when it comes to checksumming on
+ raw sockets).
+ Added autoconf scripts.
+ Added psuedorandom number generation code.
+ Added payload support (breaks backward
+ compatability and is untested).
+
+ 0.6 06.21.1998 Fixed UDP checksum. Removed USE_NAME CPP option
+ made it a run time decision. Makes code more
+ extensible, but breaks backward compatibility.
+
+ 0.5 06.02.1998 Added TCP/UDP/IP packet assembly routines.
+ Added a checksum function.
+ Added a manpage.
+ Removed daemonizing function (BSD has one).
+ UDP checksums broken...
+
+ 0.4 01.12.1998 IP checksum (x86 assembly implementation).
+
+ 0.3 01.12.1998 daemonizing function.
+
+ 0.2 01.11.1998 raw socket function changed to allow user
+ designated protocol for raw socket
+
+ 0.1 01.05.1998 Initial release, contains:
+ network byte order -> human readable IP address,
+ human readable IP address -> network byte order,
+ simple raw socket / IP_HDRINCL wrapper,
+ TCP checksum (x86 assembly implementation)
+EOF
diff --git a/libnet/doc/CONTRIB b/libnet/doc/CONTRIB
new file mode 100644
index 0000000..7786749
--- /dev/null
+++ b/libnet/doc/CONTRIB
@@ -0,0 +1,57 @@
+===============================================================================
+ $Id: CONTRIB,v 1.9 2004/11/09 07:05:06 mike Exp $
+ LIBNET 1.1 (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
+ http://www.packetfactory.net/libnet
+===============================================================================
+
+
+ 1.1.x CONTRIBUTERS
+
+ Barbato, Luca
+ . faster C checksum routine
+ Beverly, Scott <scottbeverly@xengin.com>
+ Bowman, Don <don@sandvine.com>
+ Coulter, Michae l <mjc@bitz.ca>
+ . arp bugfix
+ Damron, Jason <jsdamron@hushmail.com>
+ . bugfixes
+ . IP/TCP options bugfixes
+ . RPC builder
+ . token ring and fddi support
+ Davis, Michael <mike@datanerds.net>
+ . bugfixes
+ Dulai, Danny <ddulai@stake.com>
+ Keramida, Giorgos <keramida@ceid.upatras.gr>
+ . various bugfixes
+ Kuehl, Kirby <kkuehl@cisco.com>
+ . u_short -> u_long patch
+ . 1.1.1 Win32 porting
+ . tons and tons of other stuff
+ Roberto Larcher <roberto.larcher@libero.it>
+ . 1.1.0 Win32 Porting
+ Newsham, Tim <tnewsham@stake.com>
+ . general elitism
+ O'Donnell, Adam <javaman@west.philly.ghetto.org>
+ . Solaris IPv6 address fix
+ Omella, Alfredo Andres <aandres@s21sec.com>
+ . Solaris DLPI fix
+ Raynal, Frederic <frederic.raynal@security-labs.org>
+ . cq interface
+ . numerous bugfixes and suggestions
+ . keeping the project alive during my sabbatical!
+ Salvatori, Alessandro
+ . many many patches
+ Sehgal, Anupma <asehgal@cisco.com>
+ . pblock sanity check oversight fix
+ Schlott, Stefan <stefan@ploing.de>
+ . IPv6 code
+ Shields, Michael <shieldszero@aol.com>
+ . configure.in patch
+ Simons, Terry <Terry.Simons@m.cc.utah.edu>
+ . OS/X port
+ Song, Doug <dug@monkey.org>
+ . inspiration
+ Su, Joe <cysu@csie.nctu.edu.tw>
+ . IPv6 traffic clas and flow label fix
+ Yardley, Tim <liquid@dqc.org>
+EOF
diff --git a/libnet/doc/COPYING b/libnet/doc/COPYING
new file mode 100644
index 0000000..1a29568
--- /dev/null
+++ b/libnet/doc/COPYING
@@ -0,0 +1,31 @@
+ $Id: COPYING,v 1.1.1.1 2003/06/26 21:55:10 route Exp $
+
+ libnet 1.1.x
+ Copyright (c) 1998 - 2002 Mike D. Schiffman <mike@infonexus.com>
+ http://www.packetfactory.net/libnet
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+
+EOF
diff --git a/libnet/doc/CVS/Entries b/libnet/doc/CVS/Entries
new file mode 100644
index 0000000..9f60c4a
--- /dev/null
+++ b/libnet/doc/CVS/Entries
@@ -0,0 +1,12 @@
+/BUGS/1.2/Sat Jan 3 20:31:00 2004//
+/COPYING/1.1.1.1/Thu Jun 26 21:55:10 2003//
+/MIGRATION/1.2/Sat Jan 3 20:31:00 2004//
+/PORTED/1.2/Sat Jan 3 20:31:00 2004//
+/RAWSOCKET_NON_SEQUITUR/1.2/Sat Jan 3 20:31:00 2004//
+/TODO/1.2/Sat Jan 3 20:31:00 2004//
+D/man////
+/DESIGN_NOTES/1.3/Sat Jan 17 07:51:19 2004//
+/PACKET_BUILDING/1.3/Tue Apr 13 17:32:28 2004//
+/CHANGELOG/1.26/Tue Nov 9 07:05:06 2004//
+/CONTRIB/1.9/Tue Nov 9 07:05:06 2004//
+/libnet.doxygen.conf/1.3/Tue Nov 9 07:05:06 2004//
diff --git a/libnet/doc/CVS/Repository b/libnet/doc/CVS/Repository
new file mode 100644
index 0000000..463dc8c
--- /dev/null
+++ b/libnet/doc/CVS/Repository
@@ -0,0 +1 @@
+/usr/local/CVS/libnet/doc
diff --git a/libnet/doc/CVS/Root b/libnet/doc/CVS/Root
new file mode 100644
index 0000000..52fa133
--- /dev/null
+++ b/libnet/doc/CVS/Root
@@ -0,0 +1 @@
+mike@66.234.207.232:/usr/local/CVS
diff --git a/libnet/doc/DESIGN_NOTES b/libnet/doc/DESIGN_NOTES
new file mode 100644
index 0000000..4d27b89
--- /dev/null
+++ b/libnet/doc/DESIGN_NOTES
@@ -0,0 +1,134 @@
+===============================================================================
+ $Id: DESIGN_NOTES,v 1.3 2004/01/17 07:51:19 mike Exp $
+ LIBNET 1.1 (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
+ http://www.packetfactory.net/libnet
+===============================================================================
+
+
+ DESIGN NOTES
+
+ In order to remove most of the decisions a user had to make (how much
+ memory to allocate for a packet, where to build the packet headers, where
+ to do the checksums, how to inject the packet, etc) I decided to move ALL
+ of that logic into the library, behind the scenes. To initialize
+ things and get an initial libnet context, the applications programmer
+ calls:
+
+ libnet_t *l;
+ l = libnet_init(INJECTION_TYPE, PROTOCOL, DEVICE, ERRBUFFER);
+
+ where:
+
+ INJECTION_TYPE = LIBNET_RAW4 (ipv4 raw socket)
+ LIBNET_RAW6 (ipv6 raw socket)
+ LIBNET_LINK (link-layer socket)
+ LIBNET_RAW4_ADV (advanced mode)
+ LIBNET_RAW6_ADV (advanced mode)
+ LIBNET_LINK_ADV (advanced mode)
+
+ PROTOCOL = IP protocol to be used for the raw socket. This is
+ ignored for the link-layer, and almost always
+ IPPROTO_RAW for ipv4.
+
+ DEVICE = The canoical name of the device, used only with the link
+ layer stuff. For ipv4 raw socket, you can leave this
+ NULL. If it's NULL with the link-layer, libnet will try
+ to find a suitable device.
+
+ ERRBUFFER = Until we have our libnet context l, this is where
+ errors will be.
+
+ Inside of this newly created context we have a ton of stuff including a
+ file descriptor for the packet device the injection type, the device name
+ (if applicable) a pointer to the libnet protocol block structure and some
+ other ancillary data.
+
+ Additionally, we will soon be supporting context manipulation functions
+ that will allow the user to set certain flags inside the context. This
+ interface will be akin to libnet_toggle_checksum() for those of you who
+ care.
+
+ When a packet is first constructed, the protocol block (pblock) stuff comes
+ into play. On the outside, to an applications programmer, a packet is
+ constructed more or less like normal (with a few notable exceptions):
+
+ libnet_ptag_t ip_tag;
+ ip_tag = libnet_build_ipv4(
+ LIBNET_UDP_H,
+ 0,
+ 242,
+ 0,
+ 64,
+ IPPROTO_UDP,
+ 0, /* NEW: checksum */
+ src_ip,
+ dst_ip,
+ NULL,
+ 0,
+ l, /* NEW: libnet context */
+ 0 /* NEW: libnet ptag */
+ );
+
+ The checksum allows an applications programmer to decide if he wants to
+ specify his own random value (useful in NIDS fooling) or precompute the
+ sum elsewhere, or leave it zero and by default libnet will take care of it
+ (although this is over-ridable). The libnet context is the opague
+ pointer we allocated earlier and will show up in just about every libnet
+ function call from here on out. The libnet ptag is a way to reference an
+ ALREADY BUILT protocol block. This is necessary if you want to change
+ some values of a header inside of a packet injection loop.
+
+ So, when you call a build function, internally, it's a completely new
+ system. If the item you're constructing is NEW, a new pblock will be
+ allocated and linked onto the end of the list. It may be helpful to think
+ of this as a "protocol stack" because you MUST build your packets IN
+ ORDER, from the top of the protocol stack on down (i.e.: tcp -> ip ->
+ ethernet). Once you build a new protocol block, it's "pushed down on the
+ stack" and you move on to the next. However, this analogy breaks down
+ because you can modify any one of these items and when they're assembled
+ for the final packet, libnet starts at the head of the list. It may be
+ MORE helpful to think of the pblock chain as a doubly linked FIFO
+ queue, because that's what it is. :)
+
+ For example:
+
+ libnet_ptag_t 1;
+ libnet_ptag_t 2;
+ libnet_ptag_t 3;
+
+ 1 = libnet_build_data(blah, l, 0);
+ 2 = libnet_build_tcp(blah, l, 0);
+ 3 = libnet_build_ipv4(blah, l, 0);
+
+ Will result in:
+ ---------- ---------- ----------
+ l->protocol_blocks--->| data |----->| tcp |----->| ip |
+ | pblock |<-----| pblock |<-----| pblock |----|
+ --| ptag: 1| | ptag: 2| | ptag: 3| |
+ | ---------- ---------- ---------- v
+ | -----
+ |-------------------------------------------> ---
+ -
+
+ To access and change the ip header, an additional call to libnet_build_ipv4
+ with the ptag argument would be made:
+
+ libnet_build_ipv4(blah..., l, 3);
+
+ Note that the ptag DOES NOT CHANGE. Once a pblock is built, its tag is
+ set in stone.
+
+ When it comes time to write the packet to the wire,
+ libnet_pblock_coalesce() is called to assemble the packet fragments.
+
+ 1) Gather up all of the pblock sizes in order to allocate one
+ contiguous block of memory.
+ 2) Copy over the packet fragments.
+ 3) Check each pblock to see which items need checksums, then perform
+ that checksum over each portion (the entire packet is needed for
+ some checksums).
+
+ So that's a quick description of what's going on under the hood. There's
+ more, but this should be enough to get you started.
+
+EOF
diff --git a/libnet/doc/MIGRATION b/libnet/doc/MIGRATION
new file mode 100644
index 0000000..b257241
--- /dev/null
+++ b/libnet/doc/MIGRATION
@@ -0,0 +1,172 @@
+===============================================================================
+ $Id: MIGRATION,v 1.2 2004/01/03 20:31:00 mike Exp $
+ LIBNET 1.1 (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
+ http://www.packetfactory.net/libnet
+===============================================================================
+
+
+ MIGRATING YOUR CODE AND QUICKSTART
+
+ Using Libnet 1.1 you will find it MUCH simpler to build and write packets
+ than before. Instead of the previous five steps (initialize memory,
+ initialize network, build packet, do checksums, write packet) there are
+ now only three steps (initialize library, build packet, write packet).
+ In order to port your existing code, you will mainly be REMOVING
+ function calls and variables.
+
+ 1) Start with code removal:
+
+ - Remove all calls to libnet_init_packet() / packet malloc()ing and
+ all associated variables.
+ - Remove all calls to libnet_open_raw_sock() / libnet_open_link_layer()
+ and all associated variables.
+ - Remove all calls to libnet_do_checksum() and all associated
+ variables.
+
+ 2) Continue with code addition and modification:
+
+ - You will need a single "libnet_t *l" which is your libnet file
+ context and an error buffer:
+
+ libnet_t *l
+ char errbuf[LIBNET_ERRBUF_SIZE];
+
+ l = libnet_init(
+ LIBNET_RAW4, /* or LIBNET_LINK or LIBNET_RAW6 */
+ NULL, /* or device if you using LIBNET_LINK */
+ errbuf);
+
+ - The libnet_build functions are largely unchanged with a few
+ important differences:
+
+ 1) Packets headers MUST be stacked IN ORDER. This is
+ intuitive and shouldn't be a problem. Due to the way
+ individual packet header memory is allocated and how
+ packet pieces are combined to build a packet they HAVE to
+ be built IN ORDER, from the high end of the protocol stack
+ on down. ie: using the raw interface to build a NTP
+ packet, you would:
+ libnet_build_ntp(...)
+ libnet_build_udp(...)
+ libnet_build_ipv4(...)
+ To build the same packet using the LINK interface on
+ top of ethernet you would:
+ libnet_build_ntp(...)
+ libnet_build_udp(...)
+ libnet_build_ipv4(...)
+ libnet_build_ethernet(...)
+ 1a) There is the option now of using libnet_autobuild_ipv4()
+ and libnet_autobuild_ethernet() which have fewer
+ arguments and smaller stack frames and are a bit more
+ convenient.
+ 2) The libnet_build functions return a libnet_ptag_t datatype
+ on success or -1 on error. This ptag is your
+ "protocol/packet tag" so you can find this header again
+ if you needed to modify it later on. If you don't need
+ to modify the packet header you can throw this value
+ away. You should definitely check for error now on
+ your build functions. Alot's going on down there fellas.
+ 2a) NOTE that after packets are built, they may accessed
+ independently of construction order via the saved ptag.
+ 3) They NO LONGER ACCEPT BUFFER ARGUMENTS. This is ALL
+ done internally. The last TWO arguments are the libnet
+ context you created in your call to libnet_init() and
+ an OPTIONAL ptag argument. The ptag argument, if non-zero,
+ specifes a packet tag to an ALREADY EXISTING packet header
+ that will be OVERWRITTEN with the values specified in
+ this libnet_build function call. This is how you modify
+ existing packet header pieces. If this ptag is 0,
+ a new protocol block is allocated and the packet is
+ pushed down on the "protocol stack".
+ 4) For the functions that build headers that have checksums
+ these are NOW SPECIFIED AS AN ARGUMENT. This adds more
+ flexibility in how checksums are done (you can leave the
+ field 0, put in a random value, precompute it on your own,
+ or let the library do it). By default, when you build
+ a header, a "DO_CHECKSUM" flag will be set. This means
+ the library will compute the checksum for the header
+ and possibly over the data before the packet is written.
+ To clear this flag, there is a special macro you
+ can call on the ptag refering to that header.
+ 5) For the functions that have a length, it now specifies
+ the TOTAL packet length from that protocol unit on down.
+ For IP, that would be the entire packet length. For
+ TCP, that would be TCP and any possible data.
+ 6) Nomenclature support for the eventual support of ipv6
+ has been added.
+
+ libnet_ptag_t ip_tag;
+ libnet_ptag_t tcp_tag;
+
+ tcp_tag = libnet_build_tcp(
+ src_prt, /* source TCP port */
+ dst_prt, /* destination TCP port */
+ 0xffff, /* sequence number */
+ 0x53, /* acknowledgement number */
+ TH_SYN, /* control flags */
+ 1024, /* window size */
+ 0xd00d, /* checksum */
+ 0, /* urgent pointer */
+ LIBNET_TCP_H /* TCP packet size */
+ NULL, /* payload (none) */
+ 0, /* payload length */
+ l, /* libnet context */
+ 0); /* ptag */
+
+ ip_tag = libnet_build_ipv4(
+ LIBNET_TCP_H + LIBNET_IPV4_H,/* total packet len */
+ IPTOS_LOWDELAY, /* tos */
+ ip_id, /* IP ID */
+ 0, /* IP Frag */
+ 64, /* TTL */
+ IPPROTO_TCP, /* protocol */
+ 0, /* checksum */
+ src_ip, /* source ip */
+ dst_ip, /* dest ip */
+ NULL, /* payload (none) */
+ 0, /* payload size */
+ l, /* libnet context */
+ 0); /* ptag */
+
+ Now, if you wanted to modify one of these headers in a loop
+ somewhere you would:
+
+ int i;
+ for (ip_tag, tcp_tag = LIBNET_PTAG_INITIALIZER, i = 0; i < 10; i++)
+ {
+ tcp_tag = libnet_build_tcp(++src_prt, ..., l, tcp_tag);
+ ip_tag = libnet_build_ipv4(..., ++ip_id, ..., l, ip_tag);
+ /* do something */
+ }
+ Since we are specifying a ptag for an existing header, the
+ build function will NOT create a new header and append it to
+ the list, it will FIND the one referenced by the ptag and UPDATE
+ it. Since there is nothing new being created, order is NOT
+ important here.
+
+ Also note that it's perfectly fine to wrap the loop around the
+ initial building of the packets. Since we're initializing the
+ ptags (to be zero), the first call into the builder functions
+ will allocate the memory and create the packet blocks. These
+ calls will return ptag values. The next calls will modify
+ these headers since the ptags will not be NULL.
+
+ - Finally, we write the packet. Checksums are computed, by default
+ for each protocol header that requires one. If the user specifies
+ a non-zero value, by default, this will be used INSTEAD of a
+ libnet computed checksum. This behavior is overridable with:
+
+ Turn ON checksums for header referenced by ptag:
+ libnet_toggle_checksum(l, ptag, 1)
+
+ Turn OFF checksums for header referenced by ptag:
+ libnet_toggle_checksum(l, ptag, 0)
+
+ Note, the packet header MUST exist before you can toggle this setting.
+
+ int c;
+ c = libnet_write(l);
+
+ Boom. You're done. Now go read the sample code.
+
+EOF
diff --git a/libnet/doc/PACKET_BUILDING b/libnet/doc/PACKET_BUILDING
new file mode 100644
index 0000000..8f7dfff
--- /dev/null
+++ b/libnet/doc/PACKET_BUILDING
@@ -0,0 +1,207 @@
+===============================================================================
+ $Id: PACKET_BUILDING,v 1.3 2004/04/13 17:32:28 mike Exp $
+ LIBNET 1.1 (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
+ http://www.packetfactory.net/libnet
+===============================================================================
+
+
+ ADDING A NEW PACKET BUILDER, STATIC HEADER SIZE
+
+Adding a new packet building module to libnet is usually pretty simple. The
+following short document details how to add a packet builder to libnet for a
+protocol that has a static header size. We'll use the Sebek protocol as an
+example to walk through the process.
+
+1) Make sure you have a good reference for the protocol in question. Be it an
+ RFC or an official release doc from the author or vendor, you'll need
+ something comprehensive. For Sebek, the comprehensive reference is here:
+ http://project.honeynet.org.
+
+2) Figure out how big the header is and add it to the top of libnet-headers.h:
+
+#define LIBNET_SEBEK_H 0x30 /* sebek header: 48 bytes */
+
+3) Create the protocol header structure and add it to the end of
+ libnet-headers.h. Take care to use POSIX datatypes to define all of your
+ values. Structure naming conventions are more or less up to you. Since
+ they're never exported to the user, it's not a big deal, but try to keep
+ them short and descriptive. Convention is to add the symbolic constant
+ #defines above the structure members they apply to.
+
+/*
+ * Sebek header
+ * Static header size: 48 bytes
+ */
+struct libnet_sebek_hdr
+{
+ u_int32_t magic; /* identify packets that should be hidden */
+ u_int16_t version; /* protocol version, currently 1 */
+#define SEBEK_PROTO_VERSION 1
+ u_int16_t type; /* type of record */
+#define SEBEK_TYPE_READ 0 /* currently, only read is supported */
+#define SEBEK_TYPE_WRITE 1
+ u_int32_t counter; /* PDU counter */
+ u_int32_t time_sec; /* EPOCH timer */
+ u_int32_t time_usec; /* residual microseconds */
+ u_int32_t pid; /* PID */
+ u_int32_t uid; /* UID */
+ u_int32_t fd; /* FD */
+#define SEBEK_CMD_LENGTH 12
+ u_int8_t cmd[SEBEK_CMD_LENGTH]; /* 12 first characters of the command */
+ u_int32_t length; /* PDU length */
+};
+
+3) Append a pblock identifier to the end of the list in libnet-structures.h.
+ The ID number is not imporant as long as it is UNIQUE. As such, just find
+ the last entry, append the new entry after it, and increase the pblock ID
+ by one:
+
+#define LIBNET_PBLOCK_SEBEK_H 0x3f /* Sebek header */
+
+4) Create your new builder file in src/. Adhere to the "libnet_build_PROTOCOL.c"
+ convention. I recommend copying one of the existing builder modules and
+ modifying it as you go.
+
+
+4a)
+
+#if (HAVE_CONFIG_H)
+#include "../include/config.h"
+#endif
+#if (!(_WIN32) || (__CYGWIN__))
+#include "../include/libnet.h"
+#else
+#include "../include/win32/libnet.h"
+#endif
+
+libnet_ptag_t
+libnet_build_sebek(u_int32_t magic, u_int16_t version, u_int16_t type,
+u_int32_t counter, u_int32_t time_sec, u_int32_t time_usec, u_int32_t pid,
+u_int32_t uid, u_int32_t fd, u_int8_t cmd[SEBEK_CMD_LENGTH], u_int32_t length,
+u_int8_t *payload, u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
+{
+
+
+libnet_ptag_t
+libnet_build_XXX(u_char arg1, u_short arg2, u_long arg3, u_char *payload,
+ u_long payload_s, libnet_t *l, libnet_ptag_t ptag)
+{
+ /*
+ * n is the size of the protocol unit. This is usually the header size
+ * plus the payload size. This is also how many bytes are allocated on
+ * the heap to hold this protocol unit.
+ */
+ u_long n;
+
+ /*
+ * h is used inside the pblock structure to let libnet know how big
+ * much data to checksum. This is different for different protocols.
+ * The IPv4 checksum covers the IP header only, while TCP and UDP
+ * checksums cover header and data.
+ */
+ u_short h;
+
+ /*
+ * p will be used to refer to the protocol block that will either be
+ * allocated if the function's pt argument is 0, or located if ptag refers
+ * to a previously created protocol unit.
+ */
+ libnet_pblock_t *p;
+
+ /*
+ * XXX_hdr is the header structure that will be overlaid onto the
+ * allocated memory by way of a memcpy.
+ */
+ struct libnet_XXX_hdr XXX_hdr;
+
+ /*
+ * Here we sanity check to make sure we have a live l.
+ */
+ if (l == NULL)
+ {
+ return (-1);
+ }
+
+ n = LIBNET_XXX_H + payload_s;
+ h = 0; /* no checksum by default */
+
+ /*
+ * Find the existing protocol block if a ptag is specified, or create
+ * a new one.
+ */
+ p = libnet_pblock_probe(l, pt, n, LIBNET_PBLOCK_XXX_H);
+ if (p == NULL)
+ {
+ return (-1);
+ }
+
+ /*
+ * Build your packet here. Be sure to call appropriate endian conversion
+ * routines.
+ */
+ XXX_hdr.field1 = arg1;
+ XXX_hdr.field2 = htons(arg2);
+ XXX_hdr.field3 = htonl(arg3);
+
+ /*
+ * Appened the protocol unit to the list.
+ */
+ n = libnet_pblock_append(l, p, (u_char *)&XXX_hdr, LIBNET_XXX_H);
+ if (n == -1)
+ {
+ goto bad;
+ }
+
+ /*
+ * Sanity check the payload arguments.
+ */
+ if ((payload && !payload_s) || (!payload && payload_s))
+ {
+ sprintf(l->err_buf, "%s(): payload inconsistency\n", __FUNCTION__);
+ goto bad;
+ }
+
+ /*
+ * Append the payload to the list if it exists.
+ */
+ if (payload && payload_s)
+ {
+ n = libnet_pblock_append(l, p, payload, payload_s);
+ if (n == -1)
+ {
+ goto bad;
+ }
+ }
+
+ /*
+ * If this packet header has a checksum field, you'll add this
+ * and you'll have to edit libnet_checksum.c to add it to the switch
+ * table. You might have to define the protocol number too.
+ */
+ if (sum == 0 && l->injection_type != LIBNET_RAW4)
+ {
+ /*
+ * If checksum is zero, by default libnet will compute a checksum
+ * for the user. The programmer can override this by calling
+ * libnet_toggle_checksum(l, ptag, 1);
+ */
+ libnet_pblock_setflags(p, LIBNET_PBLOCK_DO_CHECKSUM);
+ }
+
+ /*
+ * Update the protocol block's meta information and return the protocol
+ * tag id of this pblock. This tag will be used to locate the pblock
+ * in order to modify the protocol header in subsequent calls.
+ */
+ return (pt ? pt : libnet_pblock_update(l, p, h, LIBNET_PBLOCK_XXX_H));
+bad:
+ libnet_pblock_delete(l, p);
+ return (-1);
+
+}
+ 4) Add it to src/Makefile.am and then automake from the TLD.
+ 5) Test the shit out of it.
+ 6) Send it over to mike@infonexus.com.
+
+
+EOF
diff --git a/libnet/doc/PORTED b/libnet/doc/PORTED
new file mode 100644
index 0000000..77df971
--- /dev/null
+++ b/libnet/doc/PORTED
@@ -0,0 +1,45 @@
+===============================================================================
+ $Id: PORTED,v 1.2 2004/01/03 20:31:00 mike Exp $
+ LIBNET 1.1 (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
+ http://www.packetfactory.net/libnet
+===============================================================================
+
+
+ 1.1.0 PORTED OPERATING SYSTEMS
+
+ If you verify libnet building and running successfully (sample code works)
+ on a platform not listed here please send email to mike@infonexus.com.
+
+ - BSD/OS
+ 4.x
+
+ - Cygwin
+ - requires winpcap (http://netgroup-serv.polito.it/winpcap) and pcap
+ header files copied to /usr/include/pcap/ and the library files to
+ be copied to /usr/lib/
+
+ - FreeBSD
+ version?
+
+ - HPUX
+ 11.0
+
+ - Linux
+ 2.0.x
+ 2.2.x
+ 2.4.x
+
+ - OpenBSD
+ 2.x
+ 3.x
+
+ - OS/X
+ version?
+
+ - Solaris
+ 2.x
+ 7
+ 8
+ 9
+
+EOF
diff --git a/libnet/doc/RAWSOCKET_NON_SEQUITUR b/libnet/doc/RAWSOCKET_NON_SEQUITUR
new file mode 100644
index 0000000..7f8c758
--- /dev/null
+++ b/libnet/doc/RAWSOCKET_NON_SEQUITUR
@@ -0,0 +1,41 @@
+===============================================================================
+ $Id: RAWSOCKET_NON_SEQUITUR,v 1.2 2004/01/03 20:31:00 mike Exp $
+ LIBNET 1.1 (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
+ http://www.packetfactory.net/libnet
+===============================================================================
+
+ Raw sockets are horribly non-standard across implementations. Here is
+ an incomplete list of some of the differences (corrections welcomed):
+
+ Linux 2.2+:
+
+ IP fragmentation: performed if packet is larger than MTU
+ IP checksum: always filled in
+ IP total length: always filled in
+ IP ID: filled in when zero
+ IP source address: filled in when zero
+ IP destination address: filled in when zero
+ Max packet size before kernel complains: 1500 bytes
+
+ Solaris 2.6+:
+
+ IP fragmentation bits: can't specify
+ IP fragmentation: performed if packet is larger than MTU
+ IP DF bit: always set
+ IP checksum: always filled in
+ Max packet size before kernel complains: ?
+
+ OpenBSD 2.8+:
+
+ IP fragmentation: performed if packet is larger than MTU
+ Max packet size before kernel complains: 8192 bytes
+
+ Solaris,
+ for example, has terrible support for this packet interface. Older OpenBSD
+ versions and recent FreeBSD versions have the BSD_BYTE_SWAP issue where
+ the ip_len and ip_frag fields need to be in little endian order. Linux
+ apparently doesn't allow for the injection of broadcast IP datagrams.
+ Whenever complete control over the IP header is desired, use the link
+ layer API.
+
+EOF
diff --git a/libnet/doc/TODO b/libnet/doc/TODO
new file mode 100644
index 0000000..84464d1
--- /dev/null
+++ b/libnet/doc/TODO
@@ -0,0 +1,96 @@
+===============================================================================
+ $Id: TODO,v 1.2 2004/01/03 20:31:00 mike Exp $
+ LIBNET 1.1 (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
+ http://www.packetfactory.net/libnet
+===============================================================================
+
+
+ 1.1.x TODO LIST
+
+ * Update the man page!
+
+ - Add a programmer's man page detailing the pblock architecture.
+
+ - Fix plist memory leak.
+
+ - Fix IPv6. According to RFC 2992:
+ "Another difference from IPv4 raw sockets is that complete packets
+ (that is, IPv6 packets with extension headers) cannot be read or
+ written using the IPv6 raw sockets API. Instead, ancillary data
+ objects are used to transfer the extension headers, as described
+ later in this document. Should an application need access to the
+ complete IPv6 packet, some other technique, such as the datalink
+ interfaces BPF or DLPI, must be used.
+
+ All fields in the IPv6 header that an application might want to
+ change (i.e., everything other than the version number) can be
+ modified using ancillary data and/or socket options by the
+ application for output. All fields in a received IPv6 header (other
+ than the version number and Next Header fields) and all extension
+ headers are also made available to the application as ancillary data
+ on input. Hence there is no need for a socket option similar to the
+ IPv4 IP_HDRINCL socket option."
+
+ - Add self-throttling logic to libnet_write()/libnet_init()? Advanced
+ mode thing?
+
+ - Prune the include list in libnet.h.in. Also add conditionals
+ around the headers we use for building the library, but not when
+ using it.
+
+ - Data marshalling API for unaligned structures (like STP).
+
+ - Make cisco ISL work. The issue is that we have build our Ethernet
+ frame first, then encapsulate it inside of an ISL envelope.
+ - We have to compute CRCs for both Ethernet and ISL.
+
+ - Tune advanced interface functionality that allow the application
+ programmer to get inside libnet_t.
+
+ - Test HPUX 11 port.
+
+ - Test cywin32 port.
+
+ - Flesh out the advanced mode.
+
+ - Consider making a flag for "strict mode" where libnet will check
+ things like when you build an IP options list there is an IP
+ header preceding it (likewise for TCP)... Other "smart" things
+ could happen in this mode too. When in non-strict mode, libnet
+ will be less rigid but prone to user-error mode.
+
+ - If we have a problem building a header we might end up freeing it
+ creating a NULL entry on the list and preventing us from getting to
+ entries beyond it (to free or whatever). Maybe we should mark it
+ bad or something and rely on the cleanup at the end to free it up?
+
+ - Fix checksum support for CDP
+
+ - Verify Checksuming:
+ Currently verified working on OpenBSD/Linux/Solaris:
+ - raw IP/UDP [with and without data]
+ - raw IP/TCP [with and without data]
+ - raw IP/ICMP [with and without data]
+ - raw IP/OSPF
+ - hello packet [with no auth data]
+ - hello packet [with no auth data and LSA sub-header (LSA check = bad)]
+ - link IP/UDP [with and without data]
+ - link IP/TCP [with and without data]
+
+ - Update the rest of the libnet_link_* files for the new format, already
+ ported:
+ - bpf [works]
+ - linux packet socket [works]
+ - linux sock packet [works]
+ - dlpi [works]
+
+ - Port link stuff to use writev() in libnet_write() (sendto can't hang).
+
+ - Get IPsec code working.
+
+ - Add the following packet builders:
+ - SNMP
+
+ - Update __libnet_handle_dump to dump everything in l verbosely.
+
+EOF
diff --git a/libnet/doc/libnet.doxygen.conf b/libnet/doc/libnet.doxygen.conf
new file mode 100644
index 0000000..23647a2
--- /dev/null
+++ b/libnet/doc/libnet.doxygen.conf
@@ -0,0 +1,1102 @@
+# Doxyfile 1.3.2
+# $Id: libnet.doxygen.conf,v 1.3 2004/11/09 07:05:06 mike Exp $
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# General configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = "libnet"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = "1.1.1"
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = "doc"
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch,
+# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en
+# (Japanese with English messages), Korean, Norwegian, Polish, Portuguese,
+# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE = English
+
+# This tag can be used to specify the encoding used in the generated output.
+# The encoding is not always determined by the language that is chosen,
+# but also whether or not the output is meant for Windows or non-Windows users.
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
+# forces the Windows encoding (this is the default for the Windows binary),
+# whereas setting the tag to NO uses a Unix-style encoding (the default for
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING = NO
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited
+# members of a class in the documentation of that class as if those members were
+# ordinary class members. Constructors, destructors and assignment operators of
+# the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. It is allowed to use relative paths in the argument list.
+
+STRIP_FROM_PATH =
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = YES
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explict @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member
+# documentation.
+
+DETAILS_AT_TOP = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# reimplements.
+
+INHERIT_DOCS = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 4
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources
+# only. Doxygen will then generate output that is more tailored for Java.
+# For instance, namespaces will be presented as packages, qualified scopes
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = .
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp
+# *.h++ *.idl *.odl *.cs
+
+FILE_PATTERNS = *.c *.h *.in
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories
+# that are symbolic links (a Unix filesystem feature) are excluded from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+
+EXCLUDE_PATTERNS = */sample/*
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+
+INPUT_FILTER =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = YES
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet
+
+HTML_STYLESHEET =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output dir.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = NO
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimised for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assigments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = YES
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_PREDEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse the
+# parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::addtions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or
+# super classes. Setting the tag to NO turns the diagrams off. Note that this
+# option is superceded by the HAVE_DOT option below. This is only a fallback. It is
+# recommended to install and use dot, since it yields more powerful graphs.
+
+CLASS_DIAGRAMS = YES
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# colloborations diagrams in a style similiar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
+# generate a call dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found on the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes that
+# lay further from the root node will be omitted. Note that setting this option to
+# 1 or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that a graph may be further truncated if the graph's image dimensions are
+# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT).
+# If 0 is used for the depth value (the default), the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
+
+#---------------------------------------------------------------------------
+# Configuration::addtions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = NO
+
+# The CGI_NAME tag should be the name of the CGI script that
+# starts the search engine (doxysearch) with the correct parameters.
+# A script with this name will be generated by doxygen.
+
+CGI_NAME = search.cgi
+
+# The CGI_URL tag should be the absolute URL to the directory where the
+# cgi binaries are located. See the documentation of your http daemon for
+# details.
+
+CGI_URL =
+
+# The DOC_URL tag should be the absolute URL to the directory where the
+# documentation is located. If left blank the absolute path to the
+# documentation, with file:// prepended to it, will be used.
+
+DOC_URL =
+
+# The DOC_ABSPATH tag should be the absolute path to the directory where the
+# documentation is located. If left blank the directory on the local machine
+# will be used.
+
+DOC_ABSPATH =
+
+# The BIN_ABSPATH tag must point to the directory where the doxysearch binary
+# is installed.
+
+BIN_ABSPATH = /usr/local/bin/
+
+# The EXT_DOC_PATHS tag can be used to specify one or more paths to
+# documentation generated for other projects. This allows doxysearch to search
+# the documentation for these projects as well.
+
+EXT_DOC_PATHS =
diff --git a/libnet/doc/man/CVS/Entries b/libnet/doc/man/CVS/Entries
new file mode 100644
index 0000000..1784810
--- /dev/null
+++ b/libnet/doc/man/CVS/Entries
@@ -0,0 +1 @@
+D
diff --git a/libnet/doc/man/CVS/Repository b/libnet/doc/man/CVS/Repository
new file mode 100644
index 0000000..2c47d63
--- /dev/null
+++ b/libnet/doc/man/CVS/Repository
@@ -0,0 +1 @@
+/usr/local/CVS/libnet/doc/man
diff --git a/libnet/doc/man/CVS/Root b/libnet/doc/man/CVS/Root
new file mode 100644
index 0000000..52fa133
--- /dev/null
+++ b/libnet/doc/man/CVS/Root
@@ -0,0 +1 @@
+mike@66.234.207.232:/usr/local/CVS