all: import netsniff-ng 0.5.8-rc0 source
authorDaniel Borkmann <dborkman@redhat.com>
Fri, 15 Mar 2013 09:41:48 +0000 (15 10:41 +0100)
committerDaniel Borkmann <dborkman@redhat.com>
Fri, 15 Mar 2013 09:41:48 +0000 (15 10:41 +0100)
We decided to get rid of the old Git history and start a new one for
several reasons:

 *) Allow / enforce only high-quality commits (which was not the case
    for many commits in the history), have a policy that is more close
    to the one from the Linux kernel. With high quality commits, we
    mean code that is logically split into commits and commit messages
    that are signed-off and have a proper subject and message body.
    We do not allow automatic Github merges anymore, since they are
    total bullshit. However, we will either cherry-pick your patches
    or pull them manually.

 *) The old archive was about ~27MB for no particular good reason.
    This basically derived from the bad decision that also some PDF
    files where stored there. From this moment onwards, no binary
    objects are allowed to be stored in this repository anymore.

The old archive is not wiped away from the Internet. You will still
be able to find it, e.g. on git.cryptoism.org etc.

Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
137 files changed:
.gitignore [new file with mode: 0644]
AUTHORS [new file with mode: 0644]
COPYING [new file with mode: 0644]
Documentation/CodingStyle [new file with mode: 0644]
Documentation/Downstream [new file with mode: 0644]
Documentation/KnownIssues [new file with mode: 0644]
Documentation/Mirrors [new file with mode: 0644]
Documentation/Performance [new file with mode: 0644]
Documentation/RelatedWork [new file with mode: 0644]
Documentation/Sponsors [new file with mode: 0644]
Documentation/SubmittingPatches [new file with mode: 0644]
Documentation/Summary [new file with mode: 0644]
INSTALL [new file with mode: 0644]
Makefile [new file with mode: 0644]
README [new file with mode: 0644]
REPORTING-BUGS [new file with mode: 0644]
astraceroute.c [new file with mode: 0644]
astraceroute/.gitignore [new file with mode: 0644]
astraceroute/Makefile [new file with mode: 0644]
bpf.c [new file with mode: 0644]
bpf.h [new file with mode: 0644]
bpf_comp.c [new file with mode: 0644]
bpf_lexer.l [new file with mode: 0644]
bpf_parser.y [new file with mode: 0644]
bpfc.c [new file with mode: 0644]
bpfc/.gitignore [new file with mode: 0644]
bpfc/Makefile [new file with mode: 0644]
built_in.h [new file with mode: 0644]
colors.h [new file with mode: 0644]
configs/ether.conf [new file with mode: 0644]
configs/geoip.conf [new file with mode: 0644]
configs/oui.conf [new file with mode: 0644]
configs/stddef.h [new file with mode: 0644]
configs/tcp.conf [new file with mode: 0644]
configs/udp.conf [new file with mode: 0644]
cpusched.c [new file with mode: 0644]
cpusched.h [new file with mode: 0644]
csum.h [new file with mode: 0644]
ct_client.c [new file with mode: 0644]
ct_server.c [new file with mode: 0644]
ct_servmgmt.c [new file with mode: 0644]
ct_servmgmt.h [new file with mode: 0644]
ct_usermgmt.c [new file with mode: 0644]
ct_usermgmt.h [new file with mode: 0644]
curve.c [new file with mode: 0644]
curve.h [new file with mode: 0644]
curvetun.c [new file with mode: 0644]
curvetun.h [new file with mode: 0644]
curvetun/.gitignore [new file with mode: 0644]
curvetun/Makefile [new file with mode: 0644]
curvetun/abiname.c [new file with mode: 0644]
curvetun/build_nacl.sh [new file with mode: 0755]
curvetun/nacl_path.sh [new file with mode: 0755]
die.h [new file with mode: 0644]
dissector.c [new file with mode: 0644]
dissector.h [new file with mode: 0644]
dissector_80211.c [new file with mode: 0644]
dissector_80211.h [new file with mode: 0644]
dissector_eth.c [new file with mode: 0644]
dissector_eth.h [new file with mode: 0644]
flowtop.c [new file with mode: 0644]
flowtop/.gitignore [new file with mode: 0644]
flowtop/Makefile [new file with mode: 0644]
geoip.c [new file with mode: 0644]
geoip.h [new file with mode: 0644]
hash.c [new file with mode: 0644]
hash.h [new file with mode: 0644]
ifpps.c [new file with mode: 0644]
ifpps/.gitignore [new file with mode: 0644]
ifpps/Makefile [new file with mode: 0644]
ipv4.h [new file with mode: 0644]
ipv6.h [new file with mode: 0644]
locking.h [new file with mode: 0644]
mac80211.c [new file with mode: 0644]
mac80211.h [new file with mode: 0644]
netsniff-ng.c [new file with mode: 0644]
netsniff-ng/.gitignore [new file with mode: 0644]
netsniff-ng/Makefile [new file with mode: 0644]
oui.c [new file with mode: 0644]
oui.h [new file with mode: 0644]
patricia.c [new file with mode: 0644]
patricia.h [new file with mode: 0644]
pcap_io.h [new file with mode: 0644]
pcap_mm.c [new file with mode: 0644]
pcap_rw.c [new file with mode: 0644]
pcap_sg.c [new file with mode: 0644]
pkt_buff.h [new file with mode: 0644]
proto.h [new file with mode: 0644]
proto_80211_mac_hdr.c [new file with mode: 0644]
proto_arp.c [new file with mode: 0644]
proto_ethernet.c [new file with mode: 0644]
proto_icmpv4.c [new file with mode: 0644]
proto_icmpv6.c [new file with mode: 0644]
proto_igmp.c [new file with mode: 0644]
proto_ip_authentication_hdr.c [new file with mode: 0644]
proto_ip_esp.c [new file with mode: 0644]
proto_ipv4.c [new file with mode: 0644]
proto_ipv6.c [new file with mode: 0644]
proto_ipv6_dest_opts.c [new file with mode: 0644]
proto_ipv6_fragm.c [new file with mode: 0644]
proto_ipv6_hop_by_hop.c [new file with mode: 0644]
proto_ipv6_in_ipv4.c [new file with mode: 0644]
proto_ipv6_mobility_hdr.c [new file with mode: 0644]
proto_ipv6_no_nxt_hdr.c [new file with mode: 0644]
proto_ipv6_routing.c [new file with mode: 0644]
proto_lldp.c [new file with mode: 0644]
proto_mpls_unicast.c [new file with mode: 0644]
proto_none.c [new file with mode: 0644]
proto_tcp.c [new file with mode: 0644]
proto_udp.c [new file with mode: 0644]
proto_vlan.c [new file with mode: 0644]
proto_vlan_q_in_q.c [new file with mode: 0644]
protos.h [new file with mode: 0644]
ring.h [new file with mode: 0644]
ring_rx.c [new file with mode: 0644]
ring_rx.h [new file with mode: 0644]
ring_tx.c [new file with mode: 0644]
ring_tx.h [new file with mode: 0644]
stun.c [new file with mode: 0644]
test/dissector_fuzz.sh [new file with mode: 0755]
tprintf.c [new file with mode: 0644]
tprintf.h [new file with mode: 0644]
trafgen.c [new file with mode: 0644]
trafgen/.gitignore [new file with mode: 0644]
trafgen/Makefile [new file with mode: 0644]
trafgen_conf.h [new file with mode: 0644]
trafgen_lexer.l [new file with mode: 0644]
trafgen_parser.y [new file with mode: 0644]
trie.c [new file with mode: 0644]
trie.h [new file with mode: 0644]
update-oui.py [new file with mode: 0755]
xio.c [new file with mode: 0644]
xio.h [new file with mode: 0644]
xmalloc.c [new file with mode: 0644]
xmalloc.h [new file with mode: 0644]
xutils.c [new file with mode: 0644]
xutils.h [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..dadfb3d
--- /dev/null
@@ -0,0 +1,42 @@
+# Editor crap (emacs, vim, ...)
+*.swp
+*.orig
+\#*\#
+.\#*
+.*.sw[a-z]
+*.un~
+
+# Hidden files, general things
+.*
+*~
+
+# Compiled object files
+*.slo
+*.lo
+*.o
+
+# Compiled dynamic libraries
+*.so
+
+# Compiled static libraries
+*.lai
+*.la
+*.a
+
+# Testing folders
+test/fuzzing/
+
+# Ignore if someone adapts Makefile
+Makefile
+
+# Other documentation ignores
+*.md
+*.ps
+
+# Compressed archives
+*.tar.bz2
+*.tar.bz
+*.tar.xz
+
+# Excluded from ignorance
+!.gitignore
diff --git a/AUTHORS b/AUTHORS
new file mode 100644 (file)
index 0000000..29bab77
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,52 @@
+Maintainer:
+
+ * Daniel Borkmann <borkmann@redhat.com>
+ * Tobias Klauser <tklauser@distanz.ch>
+
+Major contributors (> 30 commits):
+
+ * Daniel Borkmann <borkmann@redhat.com>
+ * Emmanuel Roullit <emmanuel.roullit@gmail.com>
+ * Markus Amend <markus@netsniff-ng.org>
+ * Tobias Klauser <tklauser@distanz.ch>
+ * Christoph Jaeger <email@christophjaeger.info>
+ * Herbert Haas <herbert@perihel.at>*
+
+Minor contributors (<= 30 commits):
+
+ * Scott Moeller <electronjoe@gmail.com>
+ * Jesper Dangaard Brouer <brouer@redhat.com>
+ * Jaroslav Škarvada <jskarvad@redhat.com>
+ * Dennis Gilmore <dennis@ausil.us>
+ * Dan Horák <dan@danny.cz>
+ * Doug Burks <doug.burks@gmail.com>
+ * Kartik Mistry <kartik@debian.org>
+ * Ulrich Weber <uweber@astaro.com>
+ * Teguh <info@egeektronic.com>
+ * Markus Kötter <nepenthesdev@gmail.com>
+ * Jim Binder <jbinder6342@gmail.com>
+ * Ronald W. Henderson <rwhalb@nycap.rr.com>
+ * Stefan Seering <sseerin@imn.htwk-leipzig.de>
+ * Jon Schipp <jonschipp@gmail.com>
+ * Sibir Chakraborty <sibir.chakraborty@gmail.com>
+
+Notes:
+
+The order of authors with > 30 commits listed here is sorted by contributions
+from high to low through ``git log --no-merges $@ | grep Author: | \
+cut -d: -f2 | cut -d\< -f1 | sort | uniq -c | sort -n -r''. The list of minor
+contributors is currently unsorted and contains people who have contributed
+code ``in some way'' (e.g. on the upstream or maintenance repositories), either
+through Git or email.
+
+Note that we have taken over the maintenance and further development of Herbert
+Haas' mausezahn [ˈmauzəˌtsa:n] utility after he passed away in 2011. There were
+no Git commit statistics available from the import of his project. The project
+is currently in an experimental branch only, but will be fully integrated
+soon. (*)
+
+Want to join the core team? Submit enough great patches over a long time,
+implement what's on the TODO file and show an ongoing, active interest in
+supporting netsniff-ng. What's in for you? If you ever come to Switzerland,
+you get a free beer on Daniel and you can meet some great people involved in
+this project. ;)
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..a60c0c7
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,347 @@
+ Note that the only valid version of the GPL as far as this project  is
+ concerned is _this_ particular version of the license (i.e. v2, not  v2.2 or
+ v3.x or whatever), unless explicitly otherwise stated.
+
+                       Daniel Borkmann
+
+-----------------------------------------------------------------------------
+
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/Documentation/CodingStyle b/Documentation/CodingStyle
new file mode 100644 (file)
index 0000000..31265b4
--- /dev/null
@@ -0,0 +1,833 @@
+ The coding conventions of the netsniff-ng toolkit match with the Linux kernel
+ style guidelines. So here we go with a copy of linux/Documentation/CodingStyle
+ written by Linus.
+
+ In general, keep this in mind: (i) simplicity, (ii) brevity, (iii) elegance.
+ You are also obliged to treat files in Documentation/ in same quality as code.
+
+                       Daniel Borkmann
+
+-------------------------------------------------------------------------------
+
+               Linux kernel coding style
+
+This is a short document describing the preferred coding style for the
+linux kernel.  Coding style is very personal, and I won't _force_ my
+views on anybody, but this is what goes for anything that I have to be
+able to maintain, and I'd prefer it for most other things too.  Please
+at least consider the points made here.
+
+First off, I'd suggest printing out a copy of the GNU coding standards,
+and NOT read it.  Burn them, it's a great symbolic gesture.
+
+Anyway, here goes:
+
+
+               Chapter 1: Indentation
+
+Tabs are 8 characters, and thus indentations are also 8 characters.
+There are heretic movements that try to make indentations 4 (or even 2!)
+characters deep, and that is akin to trying to define the value of PI to
+be 3.
+
+Rationale: The whole idea behind indentation is to clearly define where
+a block of control starts and ends.  Especially when you've been looking
+at your screen for 20 straight hours, you'll find it a lot easier to see
+how the indentation works if you have large indentations.
+
+Now, some people will claim that having 8-character indentations makes
+the code move too far to the right, and makes it hard to read on a
+80-character terminal screen.  The answer to that is that if you need
+more than 3 levels of indentation, you're screwed anyway, and should fix
+your program.
+
+In short, 8-char indents make things easier to read, and have the added
+benefit of warning you when you're nesting your functions too deep.
+Heed that warning.
+
+The preferred way to ease multiple indentation levels in a switch statement is
+to align the "switch" and its subordinate "case" labels in the same column
+instead of "double-indenting" the "case" labels.  E.g.:
+
+       switch (suffix) {
+       case 'G':
+       case 'g':
+               mem <<= 30;
+               break;
+       case 'M':
+       case 'm':
+               mem <<= 20;
+               break;
+       case 'K':
+       case 'k':
+               mem <<= 10;
+               /* fall through */
+       default:
+               break;
+       }
+
+
+Don't put multiple statements on a single line unless you have
+something to hide:
+
+       if (condition) do_this;
+         do_something_everytime;
+
+Don't put multiple assignments on a single line either.  Kernel coding style
+is super simple.  Avoid tricky expressions.
+
+Outside of comments, documentation and except in Kconfig, spaces are never
+used for indentation, and the above example is deliberately broken.
+
+Get a decent editor and don't leave whitespace at the end of lines.
+
+
+               Chapter 2: Breaking long lines and strings
+
+Coding style is all about readability and maintainability using commonly
+available tools.
+
+The limit on the length of lines is 80 columns and this is a strongly
+preferred limit.
+
+Statements longer than 80 columns will be broken into sensible chunks.
+Descendants are always substantially shorter than the parent and are placed
+substantially to the right. The same applies to function headers with a long
+argument list. Long strings are as well broken into shorter strings. The
+only exception to this is where exceeding 80 columns significantly increases
+readability and does not hide information.
+
+void fun(int a, int b, int c)
+{
+       if (condition)
+               printk(KERN_WARNING "Warning this is a long printk with "
+                                               "3 parameters a: %u b: %u "
+                                               "c: %u \n", a, b, c);
+       else
+               next_statement;
+}
+
+               Chapter 3: Placing Braces and Spaces
+
+The other issue that always comes up in C styling is the placement of
+braces.  Unlike the indent size, there are few technical reasons to
+choose one placement strategy over the other, but the preferred way, as
+shown to us by the prophets Kernighan and Ritchie, is to put the opening
+brace last on the line, and put the closing brace first, thusly:
+
+       if (x is true) {
+               we do y
+       }
+
+This applies to all non-function statement blocks (if, switch, for,
+while, do).  E.g.:
+
+       switch (action) {
+       case KOBJ_ADD:
+               return "add";
+       case KOBJ_REMOVE:
+               return "remove";
+       case KOBJ_CHANGE:
+               return "change";
+       default:
+               return NULL;
+       }
+
+However, there is one special case, namely functions: they have the
+opening brace at the beginning of the next line, thus:
+
+       int function(int x)
+       {
+               body of function
+       }
+
+Heretic people all over the world have claimed that this inconsistency
+is ...  well ...  inconsistent, but all right-thinking people know that
+(a) K&R are _right_ and (b) K&R are right.  Besides, functions are
+special anyway (you can't nest them in C).
+
+Note that the closing brace is empty on a line of its own, _except_ in
+the cases where it is followed by a continuation of the same statement,
+ie a "while" in a do-statement or an "else" in an if-statement, like
+this:
+
+       do {
+               body of do-loop
+       } while (condition);
+
+and
+
+       if (x == y) {
+               ..
+       } else if (x > y) {
+               ...
+       } else {
+               ....
+       }
+
+Rationale: K&R.
+
+Also, note that this brace-placement also minimizes the number of empty
+(or almost empty) lines, without any loss of readability.  Thus, as the
+supply of new-lines on your screen is not a renewable resource (think
+25-line terminal screens here), you have more empty lines to put
+comments on.
+
+Do not unnecessarily use braces where a single statement will do.
+
+if (condition)
+       action();
+
+This does not apply if one branch of a conditional statement is a single
+statement. Use braces in both branches.
+
+if (condition) {
+       do_this();
+       do_that();
+} else {
+       otherwise();
+}
+
+               3.1:  Spaces
+
+Linux kernel style for use of spaces depends (mostly) on
+function-versus-keyword usage.  Use a space after (most) keywords.  The
+notable exceptions are sizeof, typeof, alignof, and __attribute__, which look
+somewhat like functions (and are usually used with parentheses in Linux,
+although they are not required in the language, as in: "sizeof info" after
+"struct fileinfo info;" is declared).
+
+So use a space after these keywords:
+       if, switch, case, for, do, while
+but not with sizeof, typeof, alignof, or __attribute__.  E.g.,
+       s = sizeof(struct file);
+
+Do not add spaces around (inside) parenthesized expressions.  This example is
+*bad*:
+
+       s = sizeof( struct file );
+
+When declaring pointer data or a function that returns a pointer type, the
+preferred use of '*' is adjacent to the data name or function name and not
+adjacent to the type name.  Examples:
+
+       char *linux_banner;
+       unsigned long long memparse(char *ptr, char **retptr);
+       char *match_strdup(substring_t *s);
+
+Use one space around (on each side of) most binary and ternary operators,
+such as any of these:
+
+       =  +  -  <  >  *  /  %  |  &  ^  <=  >=  ==  !=  ?  :
+
+but no space after unary operators:
+       &  *  +  -  ~  !  sizeof  typeof  alignof  __attribute__  defined
+
+no space before the postfix increment & decrement unary operators:
+       ++  --
+
+no space after the prefix increment & decrement unary operators:
+       ++  --
+
+and no space around the '.' and "->" structure member operators.
+
+Do not leave trailing whitespace at the ends of lines.  Some editors with
+"smart" indentation will insert whitespace at the beginning of new lines as
+appropriate, so you can start typing the next line of code right away.
+However, some such editors do not remove the whitespace if you end up not
+putting a line of code there, such as if you leave a blank line.  As a result,
+you end up with lines containing trailing whitespace.
+
+Git will warn you about patches that introduce trailing whitespace, and can
+optionally strip the trailing whitespace for you; however, if applying a series
+of patches, this may make later patches in the series fail by changing their
+context lines.
+
+
+               Chapter 4: Naming
+
+C is a Spartan language, and so should your naming be.  Unlike Modula-2
+and Pascal programmers, C programmers do not use cute names like
+ThisVariableIsATemporaryCounter.  A C programmer would call that
+variable "tmp", which is much easier to write, and not the least more
+difficult to understand.
+
+HOWEVER, while mixed-case names are frowned upon, descriptive names for
+global variables are a must.  To call a global function "foo" is a
+shooting offense.
+
+GLOBAL variables (to be used only if you _really_ need them) need to
+have descriptive names, as do global functions.  If you have a function
+that counts the number of active users, you should call that
+"count_active_users()" or similar, you should _not_ call it "cntusr()".
+
+Encoding the type of a function into the name (so-called Hungarian
+notation) is brain damaged - the compiler knows the types anyway and can
+check those, and it only confuses the programmer.  No wonder MicroSoft
+makes buggy programs.
+
+LOCAL variable names should be short, and to the point.  If you have
+some random integer loop counter, it should probably be called "i".
+Calling it "loop_counter" is non-productive, if there is no chance of it
+being mis-understood.  Similarly, "tmp" can be just about any type of
+variable that is used to hold a temporary value.
+
+If you are afraid to mix up your local variable names, you have another
+problem, which is called the function-growth-hormone-imbalance syndrome.
+See chapter 6 (Functions).
+
+
+               Chapter 5: Typedefs
+
+Please don't use things like "vps_t".
+
+It's a _mistake_ to use typedef for structures and pointers. When you see a
+
+       vps_t a;
+
+in the source, what does it mean?
+
+In contrast, if it says
+
+       struct virtual_container *a;
+
+you can actually tell what "a" is.
+
+Lots of people think that typedefs "help readability". Not so. They are
+useful only for:
+
+ (a) totally opaque objects (where the typedef is actively used to _hide_
+     what the object is).
+
+     Example: "pte_t" etc. opaque objects that you can only access using
+     the proper accessor functions.
+
+     NOTE! Opaqueness and "accessor functions" are not good in themselves.
+     The reason we have them for things like pte_t etc. is that there
+     really is absolutely _zero_ portably accessible information there.
+
+ (b) Clear integer types, where the abstraction _helps_ avoid confusion
+     whether it is "int" or "long".
+
+     u8/u16/u32 are perfectly fine typedefs, although they fit into
+     category (d) better than here.
+
+     NOTE! Again - there needs to be a _reason_ for this. If something is
+     "unsigned long", then there's no reason to do
+
+       typedef unsigned long myflags_t;
+
+     but if there is a clear reason for why it under certain circumstances
+     might be an "unsigned int" and under other configurations might be
+     "unsigned long", then by all means go ahead and use a typedef.
+
+ (c) when you use sparse to literally create a _new_ type for
+     type-checking.
+
+ (d) New types which are identical to standard C99 types, in certain
+     exceptional circumstances.
+
+     Although it would only take a short amount of time for the eyes and
+     brain to become accustomed to the standard types like 'uint32_t',
+     some people object to their use anyway.
+
+     Therefore, the Linux-specific 'u8/u16/u32/u64' types and their
+     signed equivalents which are identical to standard types are
+     permitted -- although they are not mandatory in new code of your
+     own.
+
+     When editing existing code which already uses one or the other set
+     of types, you should conform to the existing choices in that code.
+
+ (e) Types safe for use in userspace.
+
+     In certain structures which are visible to userspace, we cannot
+     require C99 types and cannot use the 'u32' form above. Thus, we
+     use __u32 and similar types in all structures which are shared
+     with userspace.
+
+Maybe there are other cases too, but the rule should basically be to NEVER
+EVER use a typedef unless you can clearly match one of those rules.
+
+In general, a pointer, or a struct that has elements that can reasonably
+be directly accessed should _never_ be a typedef.
+
+
+               Chapter 6: Functions
+
+Functions should be short and sweet, and do just one thing.  They should
+fit on one or two screenfuls of text (the ISO/ANSI screen size is 80x24,
+as we all know), and do one thing and do that well.
+
+The maximum length of a function is inversely proportional to the
+complexity and indentation level of that function.  So, if you have a
+conceptually simple function that is just one long (but simple)
+case-statement, where you have to do lots of small things for a lot of
+different cases, it's OK to have a longer function.
+
+However, if you have a complex function, and you suspect that a
+less-than-gifted first-year high-school student might not even
+understand what the function is all about, you should adhere to the
+maximum limits all the more closely.  Use helper functions with
+descriptive names (you can ask the compiler to in-line them if you think
+it's performance-critical, and it will probably do a better job of it
+than you would have done).
+
+Another measure of the function is the number of local variables.  They
+shouldn't exceed 5-10, or you're doing something wrong.  Re-think the
+function, and split it into smaller pieces.  A human brain can
+generally easily keep track of about 7 different things, anything more
+and it gets confused.  You know you're brilliant, but maybe you'd like
+to understand what you did 2 weeks from now.
+
+In source files, separate functions with one blank line.  If the function is
+exported, the EXPORT* macro for it should follow immediately after the closing
+function brace line.  E.g.:
+
+int system_is_up(void)
+{
+       return system_state == SYSTEM_RUNNING;
+}
+EXPORT_SYMBOL(system_is_up);
+
+In function prototypes, include parameter names with their data types.
+Although this is not required by the C language, it is preferred in Linux
+because it is a simple way to add valuable information for the reader.
+
+
+               Chapter 7: Centralized exiting of functions
+
+Albeit deprecated by some people, the equivalent of the goto statement is
+used frequently by compilers in form of the unconditional jump instruction.
+
+The goto statement comes in handy when a function exits from multiple
+locations and some common work such as cleanup has to be done.
+
+The rationale is:
+
+- unconditional statements are easier to understand and follow
+- nesting is reduced
+- errors by not updating individual exit points when making
+    modifications are prevented
+- saves the compiler work to optimize redundant code away ;)
+
+int fun(int a)
+{
+       int result = 0;
+       char *buffer = kmalloc(SIZE);
+
+       if (buffer == NULL)
+               return -ENOMEM;
+
+       if (condition1) {
+               while (loop1) {
+                       ...
+               }
+               result = 1;
+               goto out;
+       }
+       ...
+out:
+       kfree(buffer);
+       return result;
+}
+
+               Chapter 8: Commenting
+
+Comments are good, but there is also a danger of over-commenting.  NEVER
+try to explain HOW your code works in a comment: it's much better to
+write the code so that the _working_ is obvious, and it's a waste of
+time to explain badly written code.
+
+Generally, you want your comments to tell WHAT your code does, not HOW.
+Also, try to avoid putting comments inside a function body: if the
+function is so complex that you need to separately comment parts of it,
+you should probably go back to chapter 6 for a while.  You can make
+small comments to note or warn about something particularly clever (or
+ugly), but try to avoid excess.  Instead, put the comments at the head
+of the function, telling people what it does, and possibly WHY it does
+it.
+
+When commenting the kernel API functions, please use the kernel-doc format.
+See the files Documentation/kernel-doc-nano-HOWTO.txt and scripts/kernel-doc
+for details.
+
+Linux style for comments is the C89 "/* ... */" style.
+Don't use C99-style "// ..." comments.
+
+The preferred style for long (multi-line) comments is:
+
+       /*
+        * This is the preferred style for multi-line
+        * comments in the Linux kernel source code.
+        * Please use it consistently.
+        *
+        * Description:  A column of asterisks on the left side,
+        * with beginning and ending almost-blank lines.
+        */
+
+It's also important to comment data, whether they are basic types or derived
+types.  To this end, use just one data declaration per line (no commas for
+multiple data declarations).  This leaves you room for a small comment on each
+item, explaining its use.
+
+
+               Chapter 9: You've made a mess of it
+
+That's OK, we all do.  You've probably been told by your long-time Unix
+user helper that "GNU emacs" automatically formats the C sources for
+you, and you've noticed that yes, it does do that, but the defaults it
+uses are less than desirable (in fact, they are worse than random
+typing - an infinite number of monkeys typing into GNU emacs would never
+make a good program).
+
+So, you can either get rid of GNU emacs, or change it to use saner
+values.  To do the latter, you can stick the following in your .emacs file:
+
+(defun c-lineup-arglist-tabs-only (ignored)
+  "Line up argument lists by tabs, not spaces"
+  (let* ((anchor (c-langelem-pos c-syntactic-element))
+        (column (c-langelem-2nd-pos c-syntactic-element))
+        (offset (- (1+ column) anchor))
+        (steps (floor offset c-basic-offset)))
+    (* (max steps 1)
+       c-basic-offset)))
+
+(add-hook 'c-mode-common-hook
+          (lambda ()
+            ;; Add kernel style
+            (c-add-style
+             "linux-tabs-only"
+             '("linux" (c-offsets-alist
+                        (arglist-cont-nonempty
+                         c-lineup-gcc-asm-reg
+                         c-lineup-arglist-tabs-only))))))
+
+(add-hook 'c-mode-hook
+          (lambda ()
+            (let ((filename (buffer-file-name)))
+              ;; Enable kernel mode for the appropriate files
+              (when (and filename
+                         (string-match (expand-file-name "~/src/linux-trees")
+                                       filename))
+                (setq indent-tabs-mode t)
+                (c-set-style "linux-tabs-only")))))
+
+This will make emacs go better with the kernel coding style for C
+files below ~/src/linux-trees.
+
+But even if you fail in getting emacs to do sane formatting, not
+everything is lost: use "indent".
+
+Now, again, GNU indent has the same brain-dead settings that GNU emacs
+has, which is why you need to give it a few command line options.
+However, that's not too bad, because even the makers of GNU indent
+recognize the authority of K&R (the GNU people aren't evil, they are
+just severely misguided in this matter), so you just give indent the
+options "-kr -i8" (stands for "K&R, 8 character indents"), or use
+"scripts/Lindent", which indents in the latest style.
+
+"indent" has a lot of options, and especially when it comes to comment
+re-formatting you may want to take a look at the man page.  But
+remember: "indent" is not a fix for bad programming.
+
+
+               Chapter 10: Kconfig configuration files
+
+For all of the Kconfig* configuration files throughout the source tree,
+the indentation is somewhat different.  Lines under a "config" definition
+are indented with one tab, while help text is indented an additional two
+spaces.  Example:
+
+config AUDIT
+       bool "Auditing support"
+       depends on NET
+       help
+         Enable auditing infrastructure that can be used with another
+         kernel subsystem, such as SELinux (which requires this for
+         logging of avc messages output).  Does not do system-call
+         auditing without CONFIG_AUDITSYSCALL.
+
+Features that might still be considered unstable should be defined as
+dependent on "EXPERIMENTAL":
+
+config SLUB
+       depends on EXPERIMENTAL && !ARCH_USES_SLAB_PAGE_STRUCT
+       bool "SLUB (Unqueued Allocator)"
+       ...
+
+while seriously dangerous features (such as write support for certain
+filesystems) should advertise this prominently in their prompt string:
+
+config ADFS_FS_RW
+       bool "ADFS write support (DANGEROUS)"
+       depends on ADFS_FS
+       ...
+
+For full documentation on the configuration files, see the file
+Documentation/kbuild/kconfig-language.txt.
+
+
+               Chapter 11: Data structures
+
+Data structures that have visibility outside the single-threaded
+environment they are created and destroyed in should always have
+reference counts.  In the kernel, garbage collection doesn't exist (and
+outside the kernel garbage collection is slow and inefficient), which
+means that you absolutely _have_ to reference count all your uses.
+
+Reference counting means that you can avoid locking, and allows multiple
+users to have access to the data structure in parallel - and not having
+to worry about the structure suddenly going away from under them just
+because they slept or did something else for a while.
+
+Note that locking is _not_ a replacement for reference counting.
+Locking is used to keep data structures coherent, while reference
+counting is a memory management technique.  Usually both are needed, and
+they are not to be confused with each other.
+
+Many data structures can indeed have two levels of reference counting,
+when there are users of different "classes".  The subclass count counts
+the number of subclass users, and decrements the global count just once
+when the subclass count goes to zero.
+
+Examples of this kind of "multi-level-reference-counting" can be found in
+memory management ("struct mm_struct": mm_users and mm_count), and in
+filesystem code ("struct super_block": s_count and s_active).
+
+Remember: if another thread can find your data structure, and you don't
+have a reference count on it, you almost certainly have a bug.
+
+
+               Chapter 12: Macros, Enums and RTL
+
+Names of macros defining constants and labels in enums are capitalized.
+
+#define CONSTANT 0x12345
+
+Enums are preferred when defining several related constants.
+
+CAPITALIZED macro names are appreciated but macros resembling functions
+may be named in lower case.
+
+Generally, inline functions are preferable to macros resembling functions.
+
+Macros with multiple statements should be enclosed in a do - while block:
+
+#define macrofun(a, b, c)                      \
+       do {                                    \
+               if (a == 5)                     \
+                       do_this(b, c);          \
+       } while (0)
+
+Things to avoid when using macros:
+
+1) macros that affect control flow:
+
+#define FOO(x)                                 \
+       do {                                    \
+               if (blah(x) < 0)                \
+                       return -EBUGGERED;      \
+       } while(0)
+
+is a _very_ bad idea.  It looks like a function call but exits the "calling"
+function; don't break the internal parsers of those who will read the code.
+
+2) macros that depend on having a local variable with a magic name:
+
+#define FOO(val) bar(index, val)
+
+might look like a good thing, but it's confusing as hell when one reads the
+code and it's prone to breakage from seemingly innocent changes.
+
+3) macros with arguments that are used as l-values: FOO(x) = y; will
+bite you if somebody e.g. turns FOO into an inline function.
+
+4) forgetting about precedence: macros defining constants using expressions
+must enclose the expression in parentheses. Beware of similar issues with
+macros using parameters.
+
+#define CONSTANT 0x4000
+#define CONSTEXP (CONSTANT | 3)
+
+The cpp manual deals with macros exhaustively. The gcc internals manual also
+covers RTL which is used frequently with assembly language in the kernel.
+
+
+               Chapter 13: Printing kernel messages
+
+Kernel developers like to be seen as literate. Do mind the spelling
+of kernel messages to make a good impression. Do not use crippled
+words like "dont"; use "do not" or "don't" instead.  Make the messages
+concise, clear, and unambiguous.
+
+Kernel messages do not have to be terminated with a period.
+
+Printing numbers in parentheses (%d) adds no value and should be avoided.
+
+There are a number of driver model diagnostic macros in <linux/device.h>
+which you should use to make sure messages are matched to the right device
+and driver, and are tagged with the right level:  dev_err(), dev_warn(),
+dev_info(), and so forth.  For messages that aren't associated with a
+particular device, <linux/kernel.h> defines pr_debug() and pr_info().
+
+Coming up with good debugging messages can be quite a challenge; and once
+you have them, they can be a huge help for remote troubleshooting.  Such
+messages should be compiled out when the DEBUG symbol is not defined (that
+is, by default they are not included).  When you use dev_dbg() or pr_debug(),
+that's automatic.  Many subsystems have Kconfig options to turn on -DDEBUG.
+A related convention uses VERBOSE_DEBUG to add dev_vdbg() messages to the
+ones already enabled by DEBUG.
+
+
+               Chapter 14: Allocating memory
+
+The kernel provides the following general purpose memory allocators:
+kmalloc(), kzalloc(), kcalloc(), and vmalloc().  Please refer to the API
+documentation for further information about them.
+
+The preferred form for passing a size of a struct is the following:
+
+       p = kmalloc(sizeof(*p), ...);
+
+The alternative form where struct name is spelled out hurts readability and
+introduces an opportunity for a bug when the pointer variable type is changed
+but the corresponding sizeof that is passed to a memory allocator is not.
+
+Casting the return value which is a void pointer is redundant. The conversion
+from void pointer to any other pointer type is guaranteed by the C programming
+language.
+
+
+               Chapter 15: The inline disease
+
+There appears to be a common misperception that gcc has a magic "make me
+faster" speedup option called "inline". While the use of inlines can be
+appropriate (for example as a means of replacing macros, see Chapter 12), it
+very often is not. Abundant use of the inline keyword leads to a much bigger
+kernel, which in turn slows the system as a whole down, due to a bigger
+icache footprint for the CPU and simply because there is less memory
+available for the pagecache. Just think about it; a pagecache miss causes a
+disk seek, which easily takes 5 miliseconds. There are a LOT of cpu cycles
+that can go into these 5 miliseconds.
+
+A reasonable rule of thumb is to not put inline at functions that have more
+than 3 lines of code in them. An exception to this rule are the cases where
+a parameter is known to be a compiletime constant, and as a result of this
+constantness you *know* the compiler will be able to optimize most of your
+function away at compile time. For a good example of this later case, see
+the kmalloc() inline function.
+
+Often people argue that adding inline to functions that are static and used
+only once is always a win since there is no space tradeoff. While this is
+technically correct, gcc is capable of inlining these automatically without
+help, and the maintenance issue of removing the inline when a second user
+appears outweighs the potential value of the hint that tells gcc to do
+something it would have done anyway.
+
+
+               Chapter 16: Function return values and names
+
+Functions can return values of many different kinds, and one of the
+most common is a value indicating whether the function succeeded or
+failed.  Such a value can be represented as an error-code integer
+(-Exxx = failure, 0 = success) or a "succeeded" boolean (0 = failure,
+non-zero = success).
+
+Mixing up these two sorts of representations is a fertile source of
+difficult-to-find bugs.  If the C language included a strong distinction
+between integers and booleans then the compiler would find these mistakes
+for us... but it doesn't.  To help prevent such bugs, always follow this
+convention:
+
+       If the name of a function is an action or an imperative command,
+       the function should return an error-code integer.  If the name
+       is a predicate, the function should return a "succeeded" boolean.
+
+For example, "add work" is a command, and the add_work() function returns 0
+for success or -EBUSY for failure.  In the same way, "PCI device present" is
+a predicate, and the pci_dev_present() function returns 1 if it succeeds in
+finding a matching device or 0 if it doesn't.
+
+All EXPORTed functions must respect this convention, and so should all
+public functions.  Private (static) functions need not, but it is
+recommended that they do.
+
+Functions whose return value is the actual result of a computation, rather
+than an indication of whether the computation succeeded, are not subject to
+this rule.  Generally they indicate failure by returning some out-of-range
+result.  Typical examples would be functions that return pointers; they use
+NULL or the ERR_PTR mechanism to report failure.
+
+
+               Chapter 17:  Don't re-invent the kernel macros
+
+The header file include/linux/kernel.h contains a number of macros that
+you should use, rather than explicitly coding some variant of them yourself.
+For example, if you need to calculate the length of an array, take advantage
+of the macro
+
+  #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+
+Similarly, if you need to calculate the size of some structure member, use
+
+  #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
+
+There are also min() and max() macros that do strict type checking if you
+need them.  Feel free to peruse that header file to see what else is already
+defined that you shouldn't reproduce in your code.
+
+
+               Chapter 18:  Editor modelines and other cruft
+
+Some editors can interpret configuration information embedded in source files,
+indicated with special markers.  For example, emacs interprets lines marked
+like this:
+
+-*- mode: c -*-
+
+Or like this:
+
+/*
+Local Variables:
+compile-command: "gcc -DMAGIC_DEBUG_FLAG foo.c"
+End:
+*/
+
+Vim interprets markers that look like this:
+
+/* vim:set sw=8 noet */
+
+Do not include any of these in source files.  People have their own personal
+editor configurations, and your source files should not override them.  This
+includes markers for indentation and mode configuration.  People may use their
+own custom mode, or may have some other magic method for making indentation
+work correctly.
+
+
+
+               Appendix I: References
+
+The C Programming Language, Second Edition
+by Brian W. Kernighan and Dennis M. Ritchie.
+Prentice Hall, Inc., 1988.
+ISBN 0-13-110362-8 (paperback), 0-13-110370-9 (hardback).
+URL: http://cm.bell-labs.com/cm/cs/cbook/
+
+The Practice of Programming
+by Brian W. Kernighan and Rob Pike.
+Addison-Wesley, Inc., 1999.
+ISBN 0-201-61586-X.
+URL: http://cm.bell-labs.com/cm/cs/tpop/
+
+GNU manuals - where in compliance with K&R and this text - for cpp, gcc,
+gcc internals and indent, all available from http://www.gnu.org/manual/
+
+WG14 is the international standardization working group for the programming
+language C, URL: http://www.open-std.org/JTC1/SC22/WG14/
+
+Kernel CodingStyle, by greg@kroah.com at OLS 2002:
+http://www.kroah.com/linux/talks/ols_2002_kernel_codingstyle_talk/html/
+
+--
+Last updated on 2007-July-13.
diff --git a/Documentation/Downstream b/Documentation/Downstream
new file mode 100644 (file)
index 0000000..ba22cdd
--- /dev/null
@@ -0,0 +1,140 @@
+Maintainer:
+///////////
+
+netsniff-ng operating system distribution package maintainers are listed here
+with the following attributes: 1 - OS distribution top-level site, 2 - OS
+distribution netsniff-ng site, M - Maintainers name, W - Maintainers website,
+E - Maintainers e-mail, C - Maintainers country.
+
+We'd hereby like to express a huge thanks to our awesome maintainers! Kudos!
+If you are a maintainer for netsniff-ng and not listed here, please contact
+us at <workgroup@netsniff-ng.org>.
+
+Debian
+ * 1: http://www.debian.org/
+ * 2: http://packages.debian.org/search?keywords=netsniff-ng
+ * M: Kartik Mistry
+ * W: http://people.debian.org/~kartik/
+ * E: kartik@debian.org
+ * C: India
+
+Fedora / Fedora Security Lab Spin / Red Hat Enterprise Linux
+ * 1: http://fedoraproject.org/
+ * 2: https://admin.fedoraproject.org/pkgdb/acls/name/netsniff-ng
+ * M: Jaroslav Škarvada
+ * W: https://admin.fedoraproject.org/pkgdb/users/packages/jskarvad
+ * E: jskarvad@redhat.com
+ * C: Czech Republic
+
+Ubuntu
+ * 1: http://www.ubuntu.com/
+ * 2: https://launchpad.net/ubuntu/+source/netsniff-ng/
+ * (pulled from Debian)
+
+Arch Linux
+ * 1: http://archlinux.org/
+ * 2: http://aur.archlinux.org/packages.php?K=netsniff-ng
+ * M: Can Celasun
+ * W: http://durucancelasun.info/
+ * E: dcelasun@gmail.com
+ * C: Turkey
+
+Linux Mint
+ * 1: http://www.linuxmint.com
+ * 2: http://community.linuxmint.com/software/view/netsniff-ng
+ * (pulled from Debian)
+
+Gentoo
+ * 1: http://www.gentoo.org/
+ * 2: http://packages.gentoo.org/package/net-analyzer/netsniff-ng
+ * M: Michael Weber
+ * W: http://cia.vc/stats/author/xmw 
+ * E: xmw@gentoo.org
+ * C: Germany
+
+Sabayon
+ * 1: http://www.sabayon.org/
+ * 2: http://gpo.zugaina.org/net-misc/netsniff-ng
+ * M: Epinephrine
+ * E: epinephrineaddict@gmail.com
+
+Slackware
+ * 1: http://www.slackware.com/
+ * 2: http://www.slackers.it/repository/netsniff-ng/
+ * M: Corrado Franco
+ * W: http://conraid.net/
+ * E: conraid@gmail.com
+ * C: Italy
+
+openSUSE / SUSE Linux Enterprise
+ * 1: http://opensuse.org/
+ * 2: http://software.opensuse.org/search?baseproject=ALL&p=1&q=netsniff-ng
+ * M: Pascal Bleser
+ * W: http://linux01.gwdg.de/~pbleser/
+ * E: pascal.bleser@skynet.be
+ * C: Belgium
+
+Mageia
+ * 1: http://www.mageia.org/
+ * 2: https://bugs.mageia.org/show_bug.cgi?id=7268
+ * M: Matteo Pasotti
+ * E: pasotti.matteo@gmail.com
+ * C: Italy
+
+Mandriva
+ * 1: http://www.mandriva.com/
+ * 2: http://sophie.zarb.org/srpm/Mandriva,cooker,/netsniff-ng
+ * M: Dmitry Mikhirev
+ * E: dmikhirev@mandriva.org
+ * C: Russia
+
+Trisquel
+ * 1: http://trisquel.info/
+ * 2: http://packages.trisquel.info/slaine/net/netsniff-ng
+ * (pulled from Debian)
+
+GRML
+ * 1: http://grml.org/
+ * 2: http://grml.org/changelogs/README-grml-2010.04/
+ * M: Michael Prokop
+ * E: mika@grml.org
+ * C: Austria
+
+Alpine Linux
+ * 1: http://alpinelinux.org/
+ * M: Fabian Affolter
+ * W: http://affolter-engineering.ch
+ * E: fabian@affolter-engineering.ch
+ * C: Switzerland
+
+Network Security Toolkit
+ * 1: http://networksecuritytoolkit.org/
+ * 2: http://networksecuritytoolkit.org/nst/links.html
+ * M: Ronald W. Henderson
+ * W: http://www.networksecuritytoolkit.org/nstpro/help/aboutus.html
+ * E: rwhalb@nycap.rr.com
+ * C: USA
+
+Network Forensic Analysis Tool (NFAT, Xplico)
+ * 1: http://www.xplico.org/
+ * 2: http://www.xplico.org/archives/1184
+ * M: Gianluca Costa
+ * E: g.costa@iserm.com
+ * C: Italy
+
+Backtrack
+ * 1: http://backtrack-linux.org/
+ * 2: http://redmine.backtrack-linux.org:8080/issues/572
+ * E: slyscorpion@gmail.com
+
+Scientific Linux by Fermilab / CERN
+ * 1: http://linux.web.cern.ch/linux/scientific.shtml
+ * E: linux.support@cern.ch
+ * C: Switzerland
+
+Security Onion
+ * 1: http://code.google.com/p/security-onion/
+ * 2: http://code.google.com/p/security-onion/wiki/Beta
+ * M: Doug Burks
+ * E: doug.burks@gmail.com
+ * C: USA
diff --git a/Documentation/KnownIssues b/Documentation/KnownIssues
new file mode 100644 (file)
index 0000000..eb17a3f
--- /dev/null
@@ -0,0 +1,97 @@
+netsniff-ng's known issues:
+///////////////////////////
+
+Q: When I perform a traffic capture on the Ethernet interface, the PCAP file is
+   created and packets are received but without 802.1Q header. If I use
+   tshark, I get all headers but netsniff-ng removes 802.1Q headers. Is that
+   normal behavior?
+A: Yes and no. The way how VLAN headers are handled in PF_PACKET sockets by the
+   kernel is somewhat problematic [1]. The problem in the Linux kernel is that
+   some drivers already handle VLAN, others not. Those who handle it have
+   different implementations, i.e. hardware acceleration and so on. So in some
+   cases the VLAN tag is even stripped before entering the protocol stack, in
+   some cases probably not. Bottom line is that the netdev hackers introduced
+   a "hack" in PF_PACKET so that a VLAN ID is visible in some helper data
+   structure that is accessible from the RX_RING. And then it gets really messy
+   in the user space to artificially put the VLAN header back into the right
+   place. Not mentioning about the resulting performance implications on that
+   of /all/ libpcap tools since parts of the packet need to be copied for
+   reassembly. A user reported the following, just to demonstrate this mess:
+   Some tests were made with two machines, and it seems that results depends on
+   the driver ...
+
+    1) AR8131
+        * ethtool -k eth0 gives "rx-vlan-offload: on"
+        -> wireshark gets the vlan header
+        -> netsniff-ng doesn't get the vlan header
+
+        * ethtool -K eth0 rxvlan off
+        -> wireshark gets twice the same vlan header (like QinQ even though
+           I never sent QinQ)
+        -> netsniff-ng gets the vlan header
+
+    2) RTL8111/8168B
+        * ethtool -k eth0 gives "rx-vlan-offload: on"
+        -> wireshark gets the vlan header
+        -> netsniff-ng doesn't get the vlan header
+
+        * ethtool -K eth0 rxvlan off
+        -> wireshark gets the vlan header
+        -> netsniff-ng doesn't get the vlan header
+
+    Even if we would agree on doing the same workaround as libpcap, we still
+    will not be able to see QinQ, for instance, due to the fact that only /one/
+    VLAN tag is stored in this kernel helper data structure. We think that
+    there should be a good consensus on the kernel space side about what gets
+    transferred to the userland.
+
+    [1] http://lkml.indiana.edu/hypermail/linux/kernel/0710.3/3816.html
+
+    Update (28.11.2012): the Linux kernel and also bpfc has built-in support
+    for hardware accelerated VLAN filtering, even though tags might not be
+    visible in the payload itself as reported here. However, the filtering
+    for VLANs works reliable if your NIC supports it. bpfc example for filtering
+    for any tags:
+
+       _main:
+        ld #vlanp
+        jeq #0, drop
+        ret #-1
+       drop:
+        ret #0
+
+   Filtering for a particular VLAN tag:
+
+       _main:
+        ld #vlant
+        jneq #10, drop
+        ret #-1
+       drop:
+        ret #0
+
+   Where 10 is VLAN ID 10 in this example. Or, more pedantic:
+
+       _main:
+        ld #vlanp
+        jeq #0, drop
+        ld #vlant
+        jneq #10, drop
+        ret #-1
+       drop:
+        ret #0
+
+Q: When I start trafgen, my kernel crashes! What is happening?
+A: We have fixed this ``bug'' in the Linux kernel under commit
+   7f5c3e3a80e6654cf48dfba7cf94f88c6b505467 (http://bit.ly/PcH5Nd). Either
+   update your kernel to the latest version, e.g. clone and build it from
+   git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git or don't
+   start multiple trafgen instances at once resp. start trafgen with flag -A
+   to disable temporary socket memory tuning! Although trafgen's mechanism is
+   written in a correct manner, some probably Linux internal side-effects
+   cause the tigger of the BUG macro. Why tuning? In general, if not otherwise
+   specified, the netsniff-ng suite tries to get a good performance on default.
+   For instance, this includes things like tuning the system's socket memory,
+   enabling the BPF JIT compiler, migrating the NIC's interrupt affinity and
+   so on. If you don't want netsniff-ng to do this, look at the relevant cmd
+   line options that disable them with ``--help'' and explicitly specify them
+   on the program start.
diff --git a/Documentation/Mirrors b/Documentation/Mirrors
new file mode 100644 (file)
index 0000000..c7d7e79
--- /dev/null
@@ -0,0 +1,17 @@
+Mirrors:
+////////
+
+Official mirrors for the netsniff-ng website:
+
+ * Germany: http://netsniff-ng.{org,net,com}
+
+Official mirrors for the netsniff-ng Git repository:
+
+ * Czech Republic: git://repo.or.cz/netsniff-ng.git
+ * United States: git://github.com/gnumaniacs/netsniff-ng.git
+ * Iceland: git://git.cryptoism.org/pub/git/netsniff-ng.git
+
+Distribution specific maintenance/release Git repositories:
+
+ * Debian Linux: git://anonscm.debian.org/collab-maint/netsniff-ng.git
+ * Fedora/RHEL Linux: git://pkgs.fedoraproject.org/netsniff-ng.git
diff --git a/Documentation/Performance b/Documentation/Performance
new file mode 100644 (file)
index 0000000..e51411a
--- /dev/null
@@ -0,0 +1,278 @@
+Hitchhiker's guide to high-performance with netsniff-ng:
+////////////////////////////////////////////////////////
+
+This is a collection of short notes in random order concerning software
+and hardware for optimizing throughput (partly copied or derived from sources
+that are mentioned at the end of this file):
+
+<=== Hardware ====>
+
+.-=> Use a PCI-X or PCIe server NIC
+`--------------------------------------------------------------------------
+Only if it says Gigabit Ethernet on the box of your NIC, that does not
+necessarily mean that you will also reach it. Especially on small packet
+sizes, you won't reach wire-rate with a PCI adapter built for desktop or
+consumer machines. Rather, you should buy a server adapter that has faster
+interconnects such as PCIe. Also, make your choice of a server adapter,
+whether it has a good support in the kernel. Check the Linux drivers
+directory for your targeted chipset and look at the netdev list if the adapter
+is updated frequently. Also, check the location/slot of the NIC adapter on
+the system motherboard: Our experience resulted in significantly different
+measurement values by locating the NIC adapter in different PCIe slots.
+Since we did not have schematics for the system motherboard, this was a
+trial and error effort. Moreover, check the specifications of the NIC
+hardware: is the system bus connector I/O capable of Gigabit Ethernet
+frame rate throughput? Also check the network topology: is your network
+Gigabit switch capable of switching Ethernet frames at the maximum rate
+or is a direct connection of two end-nodes the better solution? Is Ethernet
+flow control being used? "ethtool -a eth0" can be used to determine this.
+For measurement purposes, you might want to turn it off to increase throughput:
+  * ethtool -A eth0 autoneg off
+  * ethtool -A eth0 rx off
+  * ethtool -A eth0 tx off
+
+.-=> Use better (faster) hardware
+`--------------------------------------------------------------------------
+Before doing software-based fine-tuning, check if you can afford better and
+especially faster hardware. For instance, get a fast CPU with lots of cores
+or a NUMA architecture with multi-core CPUs and a fast interconnect. If you
+dump PCAP files to disc with netsniff-ng, then a fast SSD is appropriate.
+If you plan to memory map PCAP files with netsniff-ng, then choose an
+appropriate amount of RAM and so on and so forth.
+
+<=== Software (Linux kernel specific) ====>
+
+.-=> Use NAPI drivers
+`--------------------------------------------------------------------------
+The "New API" (NAPI) is a rework of the packet processing code in the
+kernel to improve performance for high speed networking. NAPI provides
+two major features:
+
+Interrupt mitigation: High-speed networking can create thousands of
+interrupts per second, all of which tell the system something it already
+knew: it has lots of packets to process. NAPI allows drivers to run with
+(some) interrupts disabled during times of high traffic, with a
+corresponding decrease in system load.
+
+Packet throttling: When the system is overwhelmed and must drop packets,
+it's better if those packets are disposed of before much effort goes into
+processing them. NAPI-compliant drivers can often cause packets to be
+dropped in the network adaptor itself, before the kernel sees them at all.
+
+Many recent NIC drivers automatically support NAPI, so you don't need to do
+anything. Some drivers need you to explicitly specify NAPI in the kernel
+config or on the command line when compiling the driver. If you are unsure,
+check your driver documentation.
+
+.-=> Use a tickless kernel
+`--------------------------------------------------------------------------
+The tickless kernel feature allows for on-demand timer interrupts. This
+means that during idle periods, fewer timer interrupts will fire, which
+should lead to power savings, cooler running systems, and fewer useless
+context switches. (Kernel option: CONFIG_NO_HZ=y)
+
+.-=> Reduce timer interrupts
+`--------------------------------------------------------------------------
+You can select the rate at which timer interrupts in the kernel will fire.
+When a timer interrupt fires on a CPU, the process running on that CPU is
+interrupted while the timer interrupt is handled. Reducing the rate at
+which the timer fires allows for fewer interruptions of your running
+processes. This option is particularly useful for servers with multiple
+CPUs where processes are not running interactively. (Kernel options:
+CONFIG_HZ_100=y and CONFIG_HZ=100)
+
+.-=> Use Intel's I/OAT DMA Engine
+`--------------------------------------------------------------------------
+This kernel option enables the Intel I/OAT DMA engine that is present in
+recent Xeon CPUs. This option increases network throughput as the DMA
+engine allows the kernel to offload network data copying from the CPU to
+the DMA engine. This frees up the CPU to do more useful work.
+
+Check to see if it's enabled:
+
+[foo@bar]% dmesg | grep ioat
+ioatdma 0000:00:08.0: setting latency timer to 64
+ioatdma 0000:00:08.0: Intel(R) I/OAT DMA Engine found, 4 channels, [...]
+ioatdma 0000:00:08.0: irq 56 for MSI/MSI-X
+
+There's also a sysfs interface where you can get some statistics about the
+DMA engine. Check the directories under /sys/class/dma/. (Kernel options:
+CONFIG_DMADEVICES=y and CONFIG_INTEL_IOATDMA=y and CONFIG_DMA_ENGINE=y and
+CONFIG_NET_DMA=y and CONFIG_ASYNC_TX_DMA=y)
+
+.-=> Use Direct Cache Access (DCA)
+`--------------------------------------------------------------------------
+Intel's I/OAT also includes a feature called Direct Cache Access (DCA).
+DCA allows a driver to warm a CPU cache. A few NICs support DCA, the most
+popular (to my knowledge) is the Intel 10GbE driver (ixgbe). Refer to your
+NIC driver documentation to see if your NIC supports DCA. To enable DCA,
+a switch in the BIOS must be flipped. Some vendors supply machines that
+support DCA, but don't expose a switch for DCA.
+
+You can check if DCA is enabled:
+
+[foo@bar]% dmesg | grep dca
+dca service started, version 1.8
+
+If DCA is possible on your system but disabled you'll see:
+
+ioatdma 0000:00:08.0: DCA is disabled in BIOS
+
+Which means you'll need to enable it in the BIOS or manually. (Kernel
+option: CONFIG_DCA=y)
+
+.-=> Throttle NIC Interrupts
+`--------------------------------------------------------------------------
+Some drivers allow the user to specify the rate at which the NIC will
+generate interrupts. The e1000e driver allows you to pass a command line
+option InterruptThrottleRate when loading the module with insmod. For
+the e1000e there are two dynamic interrupt throttle mechanisms, specified
+on the command line as 1 (dynamic) and 3 (dynamic conservative). The
+adaptive algorithm traffic into different classes and adjusts the interrupt
+rate appropriately. The difference between dynamic and dynamic conservative
+is the rate for the 'Lowest Latency' traffic class, dynamic (1) has a much
+more aggressive interrupt rate for this traffic class.
+
+As always, check your driver documentation for more information.
+
+With modprobe: insmod e1000e.o InterruptThrottleRate=1
+
+.-=> Use Process and IRQ affinity
+`--------------------------------------------------------------------------
+Linux allows the user to specify which CPUs processes and interrupt
+handlers are bound.
+
+Processes: You can use taskset to specify which CPUs a process can run on
+Interrupt Handlers: The interrupt map can be found in /proc/interrupts, and
+the affinity for each interrupt can be set in the file smp_affinity in the
+directory for each interrupt under /proc/irq/.
+
+This is useful because you can pin the interrupt handlers for your NICs
+to specific CPUs so that when a shared resource is touched (a lock in the
+network stack) and loaded to a CPU cache, the next time the handler runs,
+it will be put on the same CPU avoiding costly cache invalidations that
+can occur if the handler is put on a different CPU.
+
+However, reports of up to a 24% improvement can be had if processes and
+the IRQs for the NICs the processes get data from are pinned to the same
+CPUs. Doing this ensures that the data loaded into the CPU cache by the
+interrupt handler can be used (without invalidation) by the process;
+extremely high cache locality is achieved.
+
+NOTE: If netsniff-ng or trafgen is bound to a specific, it automatically
+migrates the NIC's IRQ affinity to this CPU to achieve a high cache locality.
+
+.-=> Tune Socket's memory allocation area
+`--------------------------------------------------------------------------
+On default, each socket has a backend memory between 130KB and 160KB on
+a x86/x86_64 machine with 4GB RAM. Hence, network packets can be received
+on the NIC driver layer, but later dropped at the socket queue due to memory
+restrictions. "sysctl -a | grep mem" will display your current memory
+settings. To increase maximum and default values of read and write memory
+areas, use:
+   * sysctl -w net.core.rmem_max=8388608 
+     This sets the max OS receive buffer size for all types of connections.
+   * sysctl -w net.core.wmem_max=8388608
+     This sets the max OS send buffer size for all types of connections.
+   * sysctl -w net.core.rmem_default=65536
+     This sets the default OS receive buffer size for all types of connections.
+   * sysctl -w net.core.wmem_default=65536
+     This sets the default OS send buffer size for all types of connections.
+
+.-=> Enable Linux' BPF Just-in-Time compiler
+`--------------------------------------------------------------------------
+If you're using filtering with netsniff-ng (or tcpdump, Wireshark, ...), you
+should activate the Berkeley Packet Filter Just-in-Time compiler. The Linux
+kernel has a built-in "virtual machine" that interprets BPF opcodes for
+filtering packets. Hence, those small filter applications are applied to
+each packet. (Read more about this in the Bpfc document.) The Just-in-Time
+compiler is able to 'compile' such an filter application to assembler code
+that can directly be run on the CPU instead on the virtual machine. If
+netsniff-ng or trafgen detects that the BPF JIT is present on the system, it
+automatically enables it. (Kernel option: CONFIG_HAVE_BPF_JIT=y and
+CONFIG_BPF_JIT=y)
+
+.-=> Increase the TX queue length
+`--------------------------------------------------------------------------
+There are settings available to regulate the size of the queue between the
+kernel network subsystems and the driver for network interface card. Just
+as with any queue, it is recommended to size it such that losses do no
+occur due to local buffer overflows. Therefore careful tuning is required
+to ensure that the sizes of the queues are optimal for your network
+connection.
+
+There are two queues to consider, the txqueuelen; which is related to the
+transmit queue size, and the netdev_backlog; which determines the recv
+queue size. Users can manually set this queue size using the ifconfig
+command on the required device:
+
+ifconfig eth0 txqueuelen 2000
+
+The default of 100 is inadequate for long distance, or high throughput pipes.
+For example, on a network with a rtt of 120ms and at Gig rates, a
+txqueuelen of at least 10000 is recommended.
+
+.-=> Increase kernel receiver backlog queue
+`--------------------------------------------------------------------------
+For the receiver side, we have a similar queue for incoming packets. This
+queue will build up in size when an interface receives packets faster than
+the kernel can process them. If this queue is too small (default is 300),
+we will begin to loose packets at the receiver, rather than on the network.
+One can set this value by:
+
+sysctl -w net.core.netdev_max_backlog=2000
+
+.-=> Use a RAM-based filesystem if possible
+`--------------------------------------------------------------------------
+If you have a considerable amount of RAM, you can also think of using a
+RAM-based file system such as ramfs for dumping pcap files with netsniff-ng.
+This can be useful for small until middle-sized pcap sizes or for pcap probes
+that are generated with netsniff-ng.
+
+<=== Software (netsniff-ng / trafgen specific) ====>
+
+.-=> Bind netsniff-ng / trafgen to a CPU
+`--------------------------------------------------------------------------
+Both tools have a command-line option '--bind-cpu' that can be used like
+'--bind-cpu 0' in order to pin the process to a specific CPU. This was
+already mentioned earlier in this file. However, netsniff-ng and trafgen are
+able to do this without an external tool. Next to this CPU pinning, they also
+automatically migrate this CPU's NIC IRQ affinity. Hence, as in '--bind-cpu 0'
+netsniff-ng will not be migrated to a different CPU and the NIC's IRQ affinity
+will also be moved to CPU 0 to increase cache locality.
+
+.-=> Use netsniff-ng in silent mode
+`--------------------------------------------------------------------------
+Don't print information to the konsole while you want to achieve high-speed,
+because this highly slows down the application. Hence, use netsniff-ng's
+'--silent' option when recording or replaying PCAP files!
+
+.-=> Use netsniff-ng's scatter/gather or mmap for PCAP files
+`--------------------------------------------------------------------------
+The scatter/gather I/O mode which is default in netsniff-ng can be used to
+record large PCAP files and is slower than the memory mapped I/O. However,
+you don't have the RAM size as your limit for recording. Use netsniff-ng's
+memory mapped I/O option for achieving a higher speed for recording a PCAP,
+but with the trade-off that the maximum allowed size is limited.
+
+.-=> Use static packet configurations in trafgen
+`--------------------------------------------------------------------------
+Don't use counters or byte randomization in trafgen configuration file, since
+it slows down the packet generation process. Static packet bytes are the fastest
+to go with.
+
+.-=> Generate packets with different txhashes in trafgen
+`--------------------------------------------------------------------------
+For 10Gbit/s multiqueue NICs, it might be good to generate packets that result
+in different txhashes, thus multiple queues are used in the transmission path
+(and therefore high likely also multiple CPUs).
+
+Sources:
+~~~~~~~~
+
+* http://www.linuxfoundation.org/collaborate/workgroups/networking/napi
+* http://datatag.web.cern.ch/datatag/howto/tcp.html
+* http://thread.gmane.org/gmane.linux.network/191115
+* http://bit.ly/3XbBrM
+* http://wwwx.cs.unc.edu/~sparkst/howto/network_tuning.php
+* http://bit.ly/pUFJxU
diff --git a/Documentation/RelatedWork b/Documentation/RelatedWork
new file mode 100644 (file)
index 0000000..ed7dba8
--- /dev/null
@@ -0,0 +1,87 @@
+Work that relates to netsniff-ng and how we differ from it:
+///////////////////////////////////////////////////////////
+
+ntop
+ * W: http://www.ntop.org/
+
+ The ntop projects offers zero-copy for network packets. Is this approach
+ significantly different from the already built-in from the Linux kernel?
+ High likely not. In both cases packets are memory mapped between both address
+ spaces. The biggest difference is that you get this for free, without
+ modifying your kernel with netsniff-ng since it uses the kernel's RX_RING
+ and TX_RING functionality. Unfortunately this is not really mentioned on the
+ ntop's website. Surely for promotional reasons. For many years the ntop
+ projects lives on next to the Linux kernel, attempts have been made to
+ integrate it [1] but discussions got stuck and both sides seem to have no
+ interest in it anymore, e.g. [2]. Therefore, if you want to use ntop, you are
+ dependent on ntop's modified drivers that are maintained out of the Linux
+ kernel's mainline tree. Thus, this will not provide you with the latest
+ improvements. Also, the Linux kernel's PF_PACKET is maintained by a much bigger
+ audience, probably better reviewed and optimized. Therefore, also we decided
+ to go with the Linux kernel's variant. So to keep it short: both approaches
+ are zero-copy, both have similar performance (if someone tells you something
+ different, he would lie due to their technical similarities) and we are using
+ the kernel's built-in variant to reach a broader audience.
+
+ [1] http://lists.openwall.net/netdev/2009/10/14/37
+ [2] http://www.spinics.net/lists/netfilter-devel/msg20212.html
+
+tcpdump
+ * W: http://www.tcpdump.org/
+
+ tcpdump is probably the oldest and most famous packet analyzer. It is based on
+ libpcap and in fact the MIT team that maintains tcpdump also maintains libpcap.
+ It has been ported to much more architectures and operating systems than
+ netsniff-ng. However, we don't aim to rebuild or clone tcpdump. We rather focus
+ on achieving a higher capturing speed by carefully tuning and optimizing our
+ code. That said doesn't mean that tcpdump people do not take care of it. It
+ just means that we don't have additional layers of abstractions for being as
+ portable as possible. This already gives us a smaller code footprint. Also, on
+ default we perform some system tuning such as remapping the NIC's IRQ affinity
+ that tcpdump probably would never do due to its generic nature. By generic, we
+ mean to serve as many different user groups as possible. We rather aim at
+ serving users for high-speed needs. By that, they have less manual work to do
+ since it's already performed in the background. Next to this, we also aim at
+ being a useful networking toolkit rather than only an analyzer. So many other
+ tools are provided such as trafgen for traffic generation.
+
+Wireshark/tshark
+ * W: http://www.wireshark.org/
+
+ Probably we could tell you the same as in the previous section. I guess it is
+ safe to say that Wireshark might have the best protocol dissector out there.
+ However, this is not a free lunch. You pay for it with a performance
+ degradation, which is quite expensive. It is also based on libpcap (we are not)
+ and it comes with a graphical user interface, whereas we rather aim at being
+ used somewhere on a server or middle-box site where you only have access to a
+ shell, for instance. Again, offline analysis of /large/ pcap files might even
+ let it hang for a long time. Here netsniff-ng has a better performance also in
+ capturing pcaps. Again, we furthermore aim at being a toolkit rather than only
+ an analyzer.
+
+libpcap
+ * W: http://www.tcpdump.org/
+
+ Price question: why don't you rely on libpcap? The answer is quite simple. We
+ started developing netsniff-ng with its zero-copy capabilities back in 2009
+ when libpcap was still doing packet copies between address spaces. Since the
+ API to the Linux kernel was quite simple, we felt more comfortable using it
+ directly and bypassing this additional layer of libpcap code. Today we feel
+ good about this decision, because since the TX_RING functionality was added to
+ the Linux kernel we have a clean integration of both, RX_RING and TX_RING.
+ libpcap on the other hand was designed for capturing and not for transmission
+ of network packets. Therefore, it only uses RX_RING on systems where it's
+ available but no TX_RING functionality. This would have resulted in a mess in
+ our code. Additionally, with netsniff-ng, one is able to a more fine grained
+ tuning of those rings. Why didn't you wrap netsniff-ng around your own library
+ just like tcpdump and libpcap? Because we are ignorant. If you design a library
+ than you have to design it well right at the beginning. A library would be a
+ crappy one if it changes its API ever. Or, if it changes its API, than it has
+ to keep its old one for the sake of being backwards compatible. Otherwise no
+ trust in its user or developer base can be achieved. Further, by keeping this
+ long tail of deprecated functions you will become a code bloat over time. We
+ wanted to keep this freedom of large-scale refactoring our code and not having
+ to maintain a stable API to the outer world. This is the whole story behind it.
+ If you desperately need our internal functionality, you still can feel free to
+ copy our code as long as your derived code complies with the GPL version 2.0.
+ So no need to whine. ;-)
diff --git a/Documentation/Sponsors b/Documentation/Sponsors
new file mode 100644 (file)
index 0000000..2d21600
--- /dev/null
@@ -0,0 +1,14 @@
+netsniff-ng is partly sponsored by:
+///////////////////////////////////
+
+Red Hat
+ * W: http://www.redhat.com/
+
+Deutsche Flugsicherung GmbH
+ * W: https://secais.dfs.de/
+
+ETH Zurich:
+ * W: http://csg.ethz.ch/
+
+Max Planck Institute for Human Cognitive and Brain Sciences
+ * W: http://www.cbs.mpg.de/
diff --git a/Documentation/SubmittingPatches b/Documentation/SubmittingPatches
new file mode 100644 (file)
index 0000000..fbe72c4
--- /dev/null
@@ -0,0 +1,122 @@
+Checklist for Patches:
+//////////////////////
+
+Submitting patches should follow this guideline (derived from the Git project):
+
+If you are familiar with upstream Linux kernel development, then you do not
+need to read this file, it's basically the same process.
+
+* Commits:
+
+- make sure to comply with the coding guidelines (see CodingStyle)
+- make commits of logical units
+- check for unnecessary whitespace with "git diff --check" before committing
+- do not check in commented out code or unneeded files
+- the first line of the commit message should be a short description (50
+  characters is the soft limit, see DISCUSSION in git-commit(1)), and should
+  skip the full stop
+- the body should provide a meaningful commit message, which:
+  . explains the problem the change tries to solve, iow, what is wrong with
+    the current code without the change.
+  . justifies the way the change solves the problem, iow, why the result with
+    the change is better.
+  . alternate solutions considered but discarded, if any.
+- describe changes in imperative mood, e.g. "make xyzzy do frotz" instead of
+  "[This patch] makes xyzzy do frotz" or "[I] changed xyzzy to do frotz", as
+  if you are giving orders to the codebase to change its behaviour.
+- try to make sure your explanation can be understood without external
+  resources. Instead of giving a URL to a mailing list archive, summarize the
+  relevant points of the discussion.
+- add a "Signed-off-by: Your Name <you@example.com>" line to the commit message
+  (or just use the option "-s" when committing) to confirm that you agree to
+  the Developer's Certificate of Origin (see also
+  http://linux.yyz.us/patch-format.html or below); this is mandatory
+- make sure syntax of man-pages is free of errors: podchecker <tool>.c
+
+* For Patches via GitHub:
+
+- fork the netsniff-ng project on GitHub to your local GitHub account
+  (https://github.com/gnumaniacs/netsniff-ng)
+- make your changes to the latest master branch with respect to the commit
+  section above
+- if you change, add, or remove a command line option or make some other user
+  interface change, the associated documentation should be updated as well.
+- open a pull request on (https://github.com/gnumaniacs/netsniff-ng) and send
+  a notification to the list (netsniff-ng@googlegroups.com) and CC one of the
+  maintainers if (and only if) the patch is ready for inclusion.
+- if your name is not writable in ASCII, make sure that you send off a message
+  in the correct encoding.
+- add a short description what the patch or patchset is about
+
+* For Patches via Mail:
+
+- use "git format-patch -M" to create the patch
+- do not PGP sign your patch
+- do not attach your patch, but read in the mail body, unless you cannot teach
+  your mailer to leave the formatting of the patch alone.
+- be careful doing cut & paste into your mailer, not to corrupt whitespaces.
+- provide additional information (which is unsuitable for the commit message)
+  between the "---" and the diffstat
+- if you change, add, or remove a command line option or make some other user
+  interface change, the associated documentation should be updated as well.
+- if your name is not writable in ASCII, make sure that you send off a message
+  in the correct encoding.
+- send the patch to the list (netsniff-ng@googlegroups.com) and CC one of the
+  maintainers if (and only if) the patch is ready for inclusion. If you use
+  git-send-email(1), please test it first by sending email to yourself.
+
+* What does the 'Signed-off-by' mean?
+
+  It certifies the following (extract from the Linux kernel documentation):
+
+  Developer's Certificate of Origin 1.1
+
+  By making a contribution to this project, I certify that:
+  (a) The contribution was created in whole or in part by me and I
+      have the right to submit it under the open source license
+      indicated in the file; or
+  (b) The contribution is based upon previous work that, to the best
+      of my knowledge, is covered under an appropriate open source
+      license and I have the right under that license to submit that
+      work with modifications, whether created in whole or in part
+      by me, under the same open source license (unless I am
+      permitted to submit under a different license), as indicated
+      in the file; or
+  (c) The contribution was provided directly to me by some other
+      person who certified (a), (b) or (c) and I have not modified it.
+  (d) I understand and agree that this project and the contribution
+      are public and that a record of the contribution (including all
+      personal information I submit with it, including my sign-off) is
+      maintained indefinitely and may be redistributed consistent with
+      this project or the open source license(s) involved.
+
+  then you just add a line saying
+    Signed-off-by: Random J Developer <random@developer.example.org>
+  using your real name (sorry, no pseudonyms or anonymous contributions).
+
+* Example commit:
+
+  Please write good git commit messages. A good commit message looks like this:
+
+       Header line: explaining the commit in one line
+
+       Body of commit message is a few lines of text, explaining things
+       in more detail, possibly giving some background about the issue
+       being fixed, etc etc.
+
+       The body of the commit message can be several paragraphs, and
+       please do proper word-wrap and keep columns shorter than about
+       74 characters or so. That way "git log" will show things
+       nicely even when it's indented.
+
+       Reported-by: whoever-reported-it
+       Signed-off-by: Your Name <youremail@yourhost.com>
+
+  where that header line really should be meaningful, and really should be
+  just one line.  That header line is what is shown by tools like gitk and
+  shortlog, and should summarize the change in one readable line of text,
+  independently of the longer explanation.
+
+Note that future (0.5.7 onwards) changelogs will include a summary that is
+generated by 'git shortlog -n'. Hence, that's why we need you to stick to
+the convention.
diff --git a/Documentation/Summary b/Documentation/Summary
new file mode 100644 (file)
index 0000000..2863d60
--- /dev/null
@@ -0,0 +1,59 @@
+Tools:
+//////
+
+The toolkit is split into small, useful utilities that are or are not
+necessarily related to each other. Each program for itself fills a gap as
+a helper in your daily network debugging, development or audit.
+
+*netsniff-ng* is a high-performance network analyzer based on packet mmap(2)
+mechanisms. It can record pcap files to disc, replay them and also do an
+offline and online analysis. Capturing, analysis or replay of raw 802.11
+frames are supported as well. pcap files are also compatible with tcpdump
+or Wireshark traces. netsniff-ng processes those pcap traces either in
+scatter-gather I/O or by mmap(2) I/O.
+
+*trafgen* is a high-performance network traffic generator based on packet
+mmap(2) mechanisms. It has its own flexible, macro-based low-level packet
+configuration language. Injection of raw 802.11 frames are supported as well.
+trafgen has a significantly higher speed than mausezahn and comes very close
+to pktgen, but runs from user space. pcap traces can also be converted into
+a trafgen packet configuration.
+
+*mausezahn* is a performant high-level packet generator that can run on a
+hardware-software appliance and comes with a Cisco-like CLI. It can craft
+nearly every possible or impossible packet. Thus, it can be used, for example,
+to test network behaviour under strange circumstances (stress test, malformed
+packets) or to test hardware-software appliances for several kind of attacks.
+
+*bpfc* is a Berkeley Packet Filter (BPF) compiler that understands the original
+BPF language developed by McCanne and Jacobson. It accepts BPF mnemonics and
+converts them into kernel/netsniff-ng readable BPF ``opcodes''. It also
+supports undocumented Linux filter extensions. This can especially be useful
+for more complicated filters, that high-level filters fail to support.
+
+*ifpps* is a tool which periodically provides top-like networking and system
+statistics from the Linux kernel. It gathers statistical data directly from
+procfs files and does not apply any user space traffic monitoring that would
+falsify statistics on high packet rates. For wireless, data about link
+connectivity is provided as well.
+
+*flowtop* is a top-like connection tracking tool that can run on an end host
+or router. It is able to present TCP, UDP(lite), SCTP, DCCP, ICMP(v6) flows
+that have been collected by the kernel's netfilter connection tracking
+framework. GeoIP and TCP/SCTP/DCCP state machine information is displayed.
+Also, on end hosts flowtop can show PIDs and application names that flows
+relate to as well as aggregated packet and byte counter (if available). No
+user space traffic monitoring is done, thus all data is gathered by the kernel.
+
+*curvetun* is a lightweight, high-speed ECDH multiuser VPN for Linux. curvetun
+uses the Linux TUN/TAP interface and supports {IPv4,IPv6} over {IPv4,IPv6} with
+UDP or TCP as carrier protocols. Packets are encrypted end-to-end by a
+symmetric stream cipher (Salsa20) and authenticated by a MAC (Poly1305), where
+keys have previously been computed with the ECDH key agreement
+protocol (Curve25519).
+
+*astraceroute* is an autonomous system (AS) trace route utility. Unlike
+traceroute or tcptraceroute, it not only display hops, but also their AS
+information they belong to as well as GeoIP information and other interesting
+things. On default, it uses a TCP probe packet and falls back to ICMP probes
+in case no ICMP answer has been received.
diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..74fc8e4
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,160 @@
+Currently only operating systems running on Linux kernels with the option
+CONFIG_PACKET_MMAP enabled. This feature can be found even back to the days of
+2.4 kernels. Most operating systems ship pre-compiled kernels that have this
+config option enabled and even the latest kernel versions got rid of this
+option and have this functionality already built-in. However, we recommend a
+kernel >= 2.6.31, because the TX_RING is officially integrated since then. In
+any case, if you have the possibility, consider getting the latest kernel from
+Linus' Git repository, tweak and compile it, and run this one!
+
+A note for distribution package maintainers can be found at the end of the file.
+
+What additional tools are required to build netsniff-ng?
+
+ - ccache (optional)
+ - flex, bison (bpfc, trafgen)
+
+What libraries are required?
+
+ - libncurses (ifpps, flowtop)
+ - libGeoIP >=1.4.8 (astraceroute, flowtop, netsniff-ng)
+ - libz (astraceroute, flowtop, netsniff-ng)
+ - libnacl (curvetun)
+ - libnetfilter-conntrack (flowtop)
+ - libpcap (netsniff-ng, for tcpdump-like filters)
+ - liburcu (flowtop)
+ - libnl3 (netsniff-ng, trafgen)
+
+What additional tools are recommended after the build?
+
+ - cpp (trafgen)
+ - ntpd (curvetun)
+ - setcap (all)
+
+It is common, that these libraries are shipped as distribution packages
+for an easy installation. We try to keep this as minimal as possible.
+
+One-liner installation for *all* dependencies on Debian:
+
+  $ sudo apt-get install ccache flex bison libnl-3-dev \
+  libnl-genl-3-dev libgeoip-dev libnetfilter-conntrack-dev \
+  libncurses5-dev liburcu-dev libnacl-dev libpcap-dev \
+  zlib1g-dev
+
+One-liner installation for *all* dependencies on Fedora:
+  $ sudo yum install ccache flex bison ccache libnl3-devel \
+  GeoIP-devel libnetfilter_conntrack-devel ncurses-devel \
+  userspace-rcu-devel nacl-devel libpcap-devel zlib-devel
+
+After downloading the netsniff-ng toolkit, you should change to the
+repository root directory:
+
+  $ cd netsniff-ng/
+
+The installation (deinstallation) process done by make is fairly simple:
+
+  $ make
+  # make install
+
+  (# make distclean)
+  ($ make clean)
+  (or for both at once: # make mrproper)
+
+You can also build only a particular tool, e.g.:
+  
+  $ make trafgen
+  # make trafgen_install
+
+  (# make trafgen_distclean)
+  ($ make trafgen_clean)
+
+Currently mausezahn is experimental and not included in the default repository
+resp. build:
+
+  $ git pull origin with-mausezahn
+
+This means if you want to use mausezahn, you have to execute 'make mausezahn'
+for a build. This will be changed at the time when we have cleaned up and
+fixed the imported code.
+
+If you want to build all tools, but curvetun (i.e. because you don't need
+the tunneling software and the NaCl build process lasts quite long):
+
+  $ make allbutcurvetun
+  # make install_allbutcurvetun
+
+  (# make mrproper)
+
+In order to build curvetun, libnacl must be built first. A helper script
+called build_nacl.sh is there to facilitate this process. If you want to
+build NaCl in the directory ~/nacl, the script should be called this way:
+
+  $ cd curvetun
+  $ ./build_nacl.sh ~/nacl
+
+There's also an abbreviation for this by simply typing:
+
+  $ make nacl
+
+This gives an initial output such as "Building NaCl for arch amd64 on host
+fuuubar (grab a coffee, this takes a while) ...". If the automatically
+detected architecture (such as amd64) is not the one you intend to compile
+for, then edit the (cc="gcc") variable within the build_nacl.sh script to
+your cross compiler. Yes, we know, the build system of NaCl is a bit of a
+pain, so you might check for a pre-built package from your distribution in
+case you are not cross compiling.
+
+If NaCl already has been built on the target, it is quicker to use
+nacl_path.sh this way:
+
+  $ cd curvetun
+  $ ./nacl_path.sh ~/nacl/build/include/x86 ~/nacl/build/lib/x86
+
+When done, netsniff-ng's build infrastructure will read those evironment
+variables in order to get the needed paths to NaCl.
+
+If you're unsure with any make targets, check out: make help
+
+In order to run the toolkit as a normal user, set the following privilege
+separation after the build/installation:
+
+  $ sudo setcap cap_net_raw,cap_ipc_lock,cap_sys_admin,cap_net_admin=eip {toolname}
+
+For cross-compiling netsniff-ng, the process is faily simple. Assuming you
+want to build netsniff-ng for the Microblaze architecture, update the PATH
+variable first, e.g.:
+
+  $ export PATH=<cc-tools-path>/microblazeel-unknown-linux-gnu/bin:$PATH
+
+And then, build the toolkit like this:
+
+  $ make CROSS_COMPILE=microblazeel-unknown-linux-gnu- \
+        CROSS_LD_LIBRARY_PATH=<cc-lib-search-path>
+
+Note that some adaptations might be necessary regarding the CFLAGS, since not
+all might be supported by a different architecture.
+
+For doing a debug build of the toolkit with less optimizations and non-stripped
+symbols, do:
+
+  $ make DEBUG=1
+
+For debugging the build system, full commands are shown if every make target is
+executed with:
+
+  $ make Q=
+
+Concerning packaging the toolkit for a Linux distribution, by default,
+netsniff-ng has some architecture-specific tuning options enabled that don't
+belong into a package binary of a distribution. Hence, you might want to adapt
+some build-related things before starting to package the toolkit. All
+necessary things (e.g., CFLAGS,WFLAGS) can be found in Makefile. Hence,
+you need to adapt it there. You can then build and install the toolkit into
+a prefixed path like:
+
+  $ make PREFIX=<path-prefix-for-package>
+  $ make PREFIX=<path-prefix-for-package> install
+
+Thanks for maintaining netsniff-ng in your distribution. Further questions
+will be answered on the public mainling list.
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..a211137
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,307 @@
+# netsniff-ng build system
+# Copyright 2012 - 2013 Daniel Borkmann <borkmann@gnumaniacs.org>
+# Subject to the GNU GPL, version 2.
+
+VERSION = 0
+PATCHLEVEL = 5
+SUBLEVEL = 8
+EXTRAVERSION = -rc0
+NAME = Ziggomatic
+
+TOOLS = netsniff-ng trafgen astraceroute flowtop ifpps bpfc curvetun
+
+# For packaging purposes, prefix can define a different path.
+PREFIX ?=
+
+# Debugging option
+ifeq ("$(origin DEBUG)", "command line")
+  DEBUG := 1
+else
+  DEBUG := 0
+endif
+
+# Disable if you don't want it
+CCACHE = ccache
+
+# Location of installation paths.
+BINDIR = $(PREFIX)/usr/bin
+SBINDIR = $(PREFIX)/usr/sbin
+INCDIR = $(PREFIX)/usr/include
+ETCDIR = $(PREFIX)/etc
+ETCDIRE = $(ETCDIR)/netsniff-ng
+DOCDIR = $(PREFIX)/usr/share/doc
+DOCDIRE = $(DOCDIR)/netsniff-ng
+
+# Shut up make, helper warnings, parallel compilation!
+MAKEFLAGS += --no-print-directory
+MAKEFLAGS += -rR
+MAKEFLAGS += --warn-undefined-variables
+MAKEFLAGS += --jobs=$(shell grep "^processor" /proc/cpuinfo | wc -l)
+
+# For packaging purposes, you might want to disable O3+arch tuning
+CFLAGS = -fstack-protector
+ifeq ($(DEBUG), 1)
+  CFLAGS += -g
+  CFLAGS += -O2
+else
+  CFLAGS += -march=native
+  CFLAGS += -mtune=native
+  CFLAGS += -O3
+  CFLAGS += -fpie
+  CFLAGS += -pipe
+  CFLAGS += -fomit-frame-pointer
+endif
+CFLAGS += --param=ssp-buffer-size=4
+CFLAGS += -fno-strict-aliasing
+CFLAGS += -fexceptions
+CFLAGS += -fasynchronous-unwind-tables
+CFLAGS += -fno-delete-null-pointer-checks
+CFLAGS += -D_FORTIFY_SOURCE=2
+CFLAGS += -D_REENTRANT
+CFLAGS += -D_FILE_OFFSET_BITS=64
+CFLAGS += -D_LARGEFILE_SOURCE
+CFLAGS += -D_LARGEFILE64_SOURCE
+ifneq ($(wildcard /usr/include/linux/net_tstamp.h),)
+  CFLAGS += -D__WITH_HARDWARE_TIMESTAMPING
+endif
+CFLAGS += -DVERSION_STRING=\"$(VERSION_STRING)\"
+CFLAGS += -std=gnu99
+
+WFLAGS  = -Wall
+WFLAGS += -Wformat=2
+WFLAGS += -Wmissing-prototypes
+WFLAGS += -Wdeclaration-after-statement
+WFLAGS += -Werror-implicit-function-declaration
+WFLAGS += -Wstrict-prototypes
+WFLAGS += -Wundef
+WFLAGS += -Wimplicit-int
+
+WFLAGS_EXTRA  = -Wno-unused-result
+WFLAGS_EXTRA += -Wmissing-parameter-type
+WFLAGS_EXTRA += -Wtype-limits
+WFLAGS_EXTRA += -Wclobbered
+WFLAGS_EXTRA += -Wmissing-field-initializers
+WFLAGS_EXTRA += -Woverride-init
+WFLAGS_EXTRA += -Wold-style-declaration
+WFLAGS_EXTRA += -Wignored-qualifiers
+WFLAGS_EXTRA += -Wempty-body
+WFLAGS_EXTRA += -Wuninitialized
+
+CFLAGS += $(WFLAGS) -I.
+CPPFLAGS =
+ifeq ("$(origin CROSS_LD_LIBRARY_PATH)", "command line")
+  LDFLAGS = -L$(CROSS_LD_LIBRARY_PATH)
+else
+  LDFLAGS =
+endif
+
+ALL_CFLAGS = $(CFLAGS)
+ALL_LDFLAGS = $(LDFLAGS)
+TARGET_ARCH =
+LEX_FLAGS =
+YAAC_FLAGS =
+
+Q = @
+
+LD = $(Q)echo -e "  LD\t$@" && $(CCACHE) $(CROSS_COMPILE)gcc
+CCNQ = $(CCACHE) $(CROSS_COMPILE)gcc
+CC = $(Q)echo -e "  CC\t$<" && $(CCNQ)
+MKDIR = $(Q)echo -e "  MKDIR\t$@" && mkdir
+ifeq ($(DEBUG), 1)
+  STRIP = $(Q)true
+else
+  STRIP = $(Q)echo -e "  STRIP\t$@" && $(CROSS_COMPILE)strip
+endif
+LEX = $(Q)echo -e "  LEX\t$<" && flex
+YAAC = $(Q)echo -e "  YAAC\t$<" && bison
+INST = echo -e "  INST\t$(1)" && install -d $(2) && \
+       install --mode=644 -DC $(1) $(2)/$(shell basename $(1))
+ifeq ("$(origin PREFIX)", "command line")
+  INSTX = echo -e "  INST\t$(1)" && install -d $(2) && \
+       install -C $(1) $(2)/$(shell basename $(1))
+else
+  INSTX = echo -e "  INST\t$(1)" && install -C $(1) $(2)/$(shell basename $(1))
+endif
+RM = echo -e "  RM\t$(1)" && rm -rf $(1)
+RMDIR = echo -e "  RM\t$(1)" && rmdir --ignore-fail-on-non-empty $(1) 2> /dev/null || true
+GIT_ARCHIVE = git archive --prefix=netsniff-ng-$(VERSION_STRING)/ $(VERSION_STRING) | \
+             $(1) > ../netsniff-ng-$(VERSION_STRING).tar.$(2)
+GIT_TAG = git tag -a $(VERSION_STRING) -m "$(VERSION_STRING) release"
+
+export VERSION PATCHLEVEL SUBLEVEL EXTRAVERSION
+export CROSS_COMPILE
+
+VERSION_STRING = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
+VERSION_SHORT = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)
+
+bold = $(shell tput bold)
+normal = $(shell tput sgr0)
+
+ifndef NACL_LIB_DIR
+ifndef NACL_INC_DIR
+   $(info $(bold)NACL_LIB_DIR/NACL_INC_DIR is undefined, build libnacl first for curvetun!$(normal))
+endif
+endif
+
+ifeq ("$(origin CROSS_COMPILE)", "command line")
+  WHAT := Cross compiling
+else
+  WHAT := Building
+endif
+
+build_showinfo:
+       $(Q)echo "$(bold)$(WHAT) netsniff-ng toolkit ($(VERSION_STRING)) for" \
+             $(shell $(CCNQ) -dumpmachine)":$(normal)"
+clean_showinfo:
+       $(Q)echo "$(bold)Cleaning netsniff-ng toolkit ($(VERSION_STRING)):$(normal)"
+
+%.yy.o: %.l
+       $(LEX) -P $(shell perl -wlne 'print $$1 if /lex-func-prefix:\s([a-z]+)/' $<) \
+              -o $(BUILD_DIR)/$(shell basename $< .l).yy.c $(LEX_FLAGS) $<
+%.tab.o: %.y
+       $(YAAC) -p $(shell perl -wlne 'print $$1 if /yaac-func-prefix:\s([a-z]+)/' $<) \
+               -o $(BUILD_DIR)/$(shell basename $< .y).tab.c $(YAAC_FLAGS) -d $<
+
+.PHONY: all toolkit $(TOOLS) clean %_prehook %_distclean %_clean %_install tag tags cscope
+.FORCE:
+.DEFAULT_GOAL := all
+.DEFAULT:
+.IGNORE: %_clean_custom %_install_custom
+.NOTPARALLEL: $(TOOLS)
+
+DOC_FILES = Summary RelatedWork Performance KnownIssues Sponsors SubmittingPatches CodingStyle
+
+NCONF_FILES = ether.conf tcp.conf udp.conf oui.conf geoip.conf
+
+all: build_showinfo toolkit
+allbutcurvetun: $(filter-out curvetun,$(TOOLS))
+allbutmausezahn: $(filter-out mausezahn,$(TOOLS))
+toolkit: $(TOOLS)
+install: install_all
+install_all: $(foreach tool,$(TOOLS),$(tool)_install)
+       $(Q)$(foreach file,$(DOC_FILES),$(call INST,Documentation/$(file),$(DOCDIRE));)
+install_allbutcurvetun: $(foreach tool,$(filter-out curvetun,$(TOOLS)),$(tool)_install)
+       $(Q)$(foreach file,$(DOC_FILES),$(call INST,Documentation/$(file),$(DOCDIRE));)
+install_allbutmausezahn: $(foreach tool,$(filter-out mausezahn,$(TOOLS)),$(tool)_install)
+       $(Q)$(foreach file,$(DOC_FILES),$(call INST,Documentation/$(file),$(DOCDIRE));)
+clean mostlyclean: $(foreach tool,$(TOOLS),$(tool)_clean)
+realclean distclean clobber: $(foreach tool,$(TOOLS),$(tool)_distclean)
+       $(Q)$(foreach file,$(DOC_FILES),$(call RM,$(DOCDIRE)/$(file));)
+       $(Q)$(call RMDIR,$(DOCDIRE))
+       $(Q)$(call RMDIR,$(ETCDIRE))
+mrproper: clean distclean
+
+define TOOL_templ
+  include $(1)/Makefile
+  $(1) $(1)%: BUILD_DIR := $(1)
+  $(1)_prehook:
+       $(Q)echo "$(bold)$(WHAT) $(1):$(normal)"
+  $(1): $(1)_prehook $$($(1)-lex) $$($(1)-yaac) $$(patsubst %.o,$(1)/%.o,$$($(1)-objs))
+  $(1)_clean: $(1)_clean_custom
+       $(Q)$$(call RM,$(1)/*.o $(1)/$(1))
+  $(1)_install: $(1)_install_custom
+       $(Q)$$(call INSTX,$(1)/$(1),$$(SBINDIR))
+  $(1)_distclean: $(1)_distclean_custom
+       $(Q)$$(call RM,$$(SBINDIR)/$(1))
+  $(1)/%.yy.o: $(1)/%.yy.c
+       $$(CC) $$(ALL_CFLAGS) -o $$@ -c $$<
+  $(1)/%.tab.o: $(1)/%.tab.c
+       $$(CC) $$(ALL_CFLAGS) -o $$@ -c $$<
+  $(1)/%.o: %.c
+       $$(CC) $$(ALL_CFLAGS) -o $$@ -c $$<
+endef
+
+$(foreach tool,$(TOOLS),$(eval $(call TOOL_templ,$(tool))))
+
+%:: ;
+
+netsniff-ng: ALL_CFLAGS += -I$(INCDIR)/libnl3/ -D__WITH_PROTOS -D__WITH_TCPDUMP_LIKE_FILTER
+trafgen: ALL_CFLAGS += -I.. -I$(INCDIR)/libnl3/ -D__WITH_PROTOS
+bpfc: ALL_CFLAGS += -I..
+curvetun: ALL_CFLAGS += -I ${NACL_INC_DIR}
+curvetun: ALL_LDFLAGS += -L ${NACL_LIB_DIR}
+
+bpfc_clean_custom:
+       $(Q)$(call RM,$(BUILD_DIR)/*.h $(BUILD_DIR)/*.c)
+trafgen_clean_custom:
+       $(Q)$(call RM,$(BUILD_DIR)/*.h $(BUILD_DIR)/*.c)
+
+netsniff-ng_distclean_custom flowtop_distclean_custom:
+       $(Q)$(foreach file,$(NCONF_FILES),$(call RM,$(ETCDIRE)/$(file));)
+       $(Q)$(call RMDIR,$(ETCDIRE))
+trafgen_distclean_custom:
+       $(Q)$(call RM,$(ETCDIRE)/stddef.h)
+       $(Q)$(call RMDIR,$(ETCDIRE))
+astraceroute_distclean_custom:
+       $(Q)$(call RM,$(ETCDIRE)/geoip.conf)
+       $(Q)$(call RMDIR,$(ETCDIRE))
+
+netsniff-ng_install_custom flowtop_install_custom:
+       $(Q)$(foreach file,$(NCONF_FILES),$(call INST,configs/$(file),$(ETCDIRE));)
+trafgen_install_custom:
+       $(Q)$(call INST,configs/stddef.h,$(ETCDIRE))
+astraceroute_install_custom:
+       $(Q)$(call INST,configs/geoip.conf,$(ETCDIRE))
+
+$(TOOLS): WFLAGS += $(WFLAGS_EXTRA)
+$(TOOLS):
+       $(LD) $(ALL_LDFLAGS) -o $@/$@ $@/*.o $($@-libs)
+       $(STRIP) $@/$@
+
+nacl:
+       $(Q)echo "$(bold)$(WHAT) $@:$(normal)"
+       $(Q)cd curvetun/ && ./build_nacl.sh ~/nacl
+       $(Q)source ~/.bashrc
+
+tarball.gz:  ; $(call GIT_ARCHIVE,gzip,gz)
+tarball.bz2: ; $(call GIT_ARCHIVE,bzip2,bz2)
+tarball.xz:  ; $(call GIT_ARCHIVE,xz,xz)
+tarball: tarball.gz tarball.bz2 tarball.xz
+
+tag:
+       $(GIT_TAG)
+
+FIND_SOURCE_FILES = ( git ls-files '*.[hcS]' 2>/dev/null || \
+                       find . \( -name .git -type d -prune \) \
+                               -o \( -name '*.[hcS]' -type f -print \) )
+
+tags ctags:
+       $(Q)$(call RM,tags)
+       $(FIND_SOURCE_FILES) | xargs ctags -a
+
+cscope:
+       $(Q)$(call RM,cscope*)
+       $(FIND_SOURCE_FILES) | xargs cscope -b
+
+help:
+       $(Q)echo "$(bold)Available tools from the toolkit:$(normal)"
+       $(Q)echo " <toolnames>:={$(TOOLS)}"
+       $(Q)echo "$(bold)Targets for building the toolkit:$(normal)"
+       $(Q)echo " all|toolkit                  - Build the whole toolkit"
+       $(Q)echo " allbutcurvetun               - Build all except curvetun"
+       $(Q)echo " <toolname>                   - Build only one of the tools"
+       $(Q)echo "$(bold)Targets for cleaning the toolkit's build files:$(normal)"
+       $(Q)echo " clean|mostlyclean            - Remove all build files"
+       $(Q)echo " <toolname>_clean             - Remove only one of the tool's files"
+       $(Q)echo "$(bold)Targets for installing the toolkit:$(normal)"
+       $(Q)echo " install                      - Install the whole toolkit"
+       $(Q)echo " <toolname>_install           - Install only one of the tools"
+       $(Q)echo "$(bold)Targets for removing the toolkit:$(normal)"
+       $(Q)echo " realclean|distclean|clobber  - Remove the whole toolkit from the system"
+       $(Q)echo " <toolname>_distclean         - Remove only one of the tools"
+       $(Q)echo " mrproper                     - Remove build and install files"
+       $(Q)echo "$(bold)Hacking/development targets:$(normal)"
+       $(Q)echo " tag                          - Generate Git tag of current version"
+       $(Q)echo " tarball                      - Generate tarball of latest version"
+       $(Q)echo " tags                         - Generate sparse ctags"
+       $(Q)echo " cscope                       - Generate cscope files"
+       $(Q)echo "$(bold)Misc targets:$(normal)"
+       $(Q)echo " nacl                         - Execute the build_nacl script"
+       $(Q)echo " help                         - Show this help"
+       $(Q)echo "$(bold)Available parameters:$(normal)"
+       $(Q)echo " DEBUG=1                      - Enable debugging"
+       $(Q)echo " PREFIX=/path                 - Install path prefix"
+       $(Q)echo " CROSS_COMPILE=/path-prefix   - Kernel-like cross-compiling prefix"
+       $(Q)echo " CROSS_LD_LIBRARY_PATH=/path  - Library search path for cross-compiling"
+       $(Q)echo " CC=cgcc                      - Use sparse compiler wrapper"
+       $(Q)echo " Q=                           - Show verbose garbage"
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..fdf591f
--- /dev/null
+++ b/README
@@ -0,0 +1,58 @@
+//////////////////////////////////////////////////////////////////////////////
+
+                    netsniff-ng - the packet sniffing beast
+
+\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
+                                         .      .
+netsniff-ng is a free, performant       /(      )\
+Linux network analyzer and            .' {______} '.
+networking toolkit. If you will,       \ ^,    ,^ /
+the Swiss army knife for network        |'O\  /O'|   _.<0101011>--
+packets.                                > `'  '` <  /
+                                        ) ,.==., (  |
+Web: http://netsniff-ng.org          .-(|/--~~--\|)-'
+                                    (      ___
+The gain of performance is           \__.=|___E 
+reached by built-in zero-copy
+mechanisms, so that on packet reception and transmission the kernel does not
+need to copy packets from kernel space to user space, and vice versa.
+
+The netsniff-ng toolkit's primary usage goal is to facilitate a network
+developer's / hacker's daily Linux plumbing. It can be used for network
+development, debugging, analysis, auditing or network reconnaissance. It
+consists of the following fixed set of utilities:
+
+  * netsniff-ng: a zero-copy packet analyzer, pcap capturing/replaying tool
+  * trafgen: a multithreaded low-level zero-copy network packet generator
+  * mausezahn: high-level packet generator for HW/SW appliances with Cisco-CLI
+  * ifpps: a top-like kernel networking and system statistics tool
+  * curvetun: a lightweight curve25519-based multiuser IP tunnel
+  * astraceroute: an autonomous system trace route and DPI testing utility
+  * flowtop: a top-like netfilter connection tracking tool
+  * bpfc: a Berkeley Packet Filter compiler with Linux extensions
+
+Have a look at the Documentation/ folder for further information, also at known
+issues under Documentation/KnownIssues. Carefully read the INSTALL document for
+the next steps in building netsniff-ng. Note that the toolkit is still quite
+young and under heavy development, not yet feature complete and in a quality
+level where we're satisfied with (i.e. for mausezahn). However, we're on a good
+way towards tackling all these goals.
+
+The netsniff-ng toolkit is an open source project covered by the GNU General 
+Public License, version 2.0. For any questions or feedback about netsniff-ng
+you are welcome to leave us a message at <netsniff-ng@googlegroups.com>.
+
+netsniff-ng is non-profit and provided in the hope, that it is found useful.
+The current project status can be considered as "working". In general, all tools
+have been tested by us to a great extend including their command-line options.
+In fact, many of our tools are used in a lot of production systems. However, we
+give no guarantee that our tools are free of bugs! If you spot some issues,
+contact us as described in REPORTING-BUGS. Also, have a look at our FAQ [2] for
+answering your questions. This project has received support from companies and
+institutions listed in Documentation/Sponsors. Thanks for contributing, we're
+thrilled to provide you with netsniff-ng!
+
+Happy packet hacking!
+
+  [1] http://netsniff-ng.org/
+  [2] http://netsniff-ng.org/faq.html
diff --git a/REPORTING-BUGS b/REPORTING-BUGS
new file mode 100644 (file)
index 0000000..6d10ce7
--- /dev/null
@@ -0,0 +1,18 @@
+For reporting bugs send an email to the <netsniff-ng@googlegroups.com> list.
+
+If you use Fedora or have a RHEL subscription, you can also report bugs to:
+
+  * https://bugzilla.redhat.com/
+
+If you use Debian Linux, we might also process / track bugs there:
+
+  * http://bugs.debian.org/cgi-bin/pkgreport.cgi?src=netsniff-ng
+
+In any way, you'll get a reply from us. Please do not contact individual
+developers directly in case of netsniff-ng issues or patches, but rather
+always our mailing list. By this, you're not wasting time of a single
+developer and increase your chances of getting a reply from us.
+
+In general, we are also highly interested in how you use the toolkit, what
+problems you are trying to sovle and what kind of things you would like to have
+improved. So feel free to drop us some feature requests as well.
diff --git a/astraceroute.c b/astraceroute.c
new file mode 100644 (file)
index 0000000..a8c289b
--- /dev/null
@@ -0,0 +1,1077 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2011 - 2013 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#define _BSD_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <getopt.h>
+#include <ctype.h>
+#include <stdint.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/socket.h>
+#include <sys/fsuid.h>
+#include <fcntl.h>
+#include <time.h>
+#include <string.h>
+#include <asm/byteorder.h>
+#include <linux/tcp.h>
+#include <netinet/ip.h>
+#include <netinet/ip6.h>
+#include <netinet/in.h>
+#include <errno.h>
+#include <netdb.h>
+#include <sys/time.h>
+#include <arpa/inet.h>
+#include <linux/if_ether.h>
+#include <linux/icmp.h>
+#include <linux/icmpv6.h>
+
+#include "bpf.h"
+#include "die.h"
+#include "tprintf.h"
+#include "pkt_buff.h"
+#include "proto.h"
+#include "xmalloc.h"
+#include "xio.h"
+#include "csum.h"
+#include "geoip.h"
+#include "xutils.h"
+#include "ring_rx.h"
+#include "built_in.h"
+
+struct ctx {
+       char *host, *port, *dev, *payload;
+       int init_ttl, max_ttl, dns_resolv, queries, timeout, totlen, rcvlen;
+       int syn, ack, ecn, fin, psh, rst, urg, tos, nofrag, proto, show;
+       int sd_len, dport, latitude;
+};
+
+struct proto_ops {
+       int (*assembler)(uint8_t *packet, size_t len, int ttl, int proto,
+                        const struct ctx *ctx, const struct sockaddr *dst,
+                        const struct sockaddr *src);
+       const struct sock_filter *filter;
+       unsigned int flen;
+       unsigned int min_len_tcp, min_len_icmp;
+       int (*check)(uint8_t *packet, size_t len, int ttl, int id,
+                    const struct sockaddr *src);
+       void (*handler)(uint8_t *packet, size_t len, int dns_resolv,
+                       int latitude);
+};
+
+sig_atomic_t sigint = 0;
+
+static int assemble_ipv4(uint8_t *packet, size_t len, int ttl, int proto,
+                        const struct ctx *ctx, const struct sockaddr *dst,
+                        const struct sockaddr *src);
+static int assemble_ipv6(uint8_t *packet, size_t len, int ttl, int proto,
+                        const struct ctx *ctx, const struct sockaddr *dst,
+                        const struct sockaddr *src);
+static int check_ipv4(uint8_t *packet, size_t len, int ttl, int id,
+                      const struct sockaddr *ss);
+static void handle_ipv4(uint8_t *packet, size_t len, int dns_resolv,
+                       int latitude);
+static int check_ipv6(uint8_t *packet, size_t len, int ttl, int id,
+                      const struct sockaddr *ss);
+static void handle_ipv6(uint8_t *packet, size_t len, int dns_resolv,
+                       int latitude);
+
+static const char *short_options = "H:p:nNf:m:i:d:q:x:SAEFPURt:Gl:hv46X:ZuL";
+static const struct option long_options[] = {
+       {"host",        required_argument,      NULL, 'H'},
+       {"port",        required_argument,      NULL, 'p'},
+       {"init-ttl",    required_argument,      NULL, 'f'},
+       {"max-ttl",     required_argument,      NULL, 'm'},
+       {"dev",         required_argument,      NULL, 'd'},
+       {"num-probes",  required_argument,      NULL, 'q'},
+       {"timeout",     required_argument,      NULL, 'x'},
+       {"tos",         required_argument,      NULL, 't'},
+       {"payload",     required_argument,      NULL, 'X'},
+       {"totlen",      required_argument,      NULL, 'l'},
+       {"numeric",     no_argument,            NULL, 'n'},
+       {"latitude",    no_argument,            NULL, 'L'},
+       {"update",      no_argument,            NULL, 'u'},
+       {"dns",         no_argument,            NULL, 'N'},
+       {"ipv4",        no_argument,            NULL, '4'},
+       {"ipv6",        no_argument,            NULL, '6'},
+       {"syn",         no_argument,            NULL, 'S'},
+       {"ack",         no_argument,            NULL, 'A'},
+       {"urg",         no_argument,            NULL, 'U'},
+       {"fin",         no_argument,            NULL, 'F'},
+       {"psh",         no_argument,            NULL, 'P'},
+       {"rst",         no_argument,            NULL, 'R'},
+       {"ecn-syn",     no_argument,            NULL, 'E'},
+       {"show-packet", no_argument,            NULL, 'Z'},
+       {"nofrag",      no_argument,            NULL, 'G'},
+       {"version",     no_argument,            NULL, 'v'},
+       {"help",        no_argument,            NULL, 'h'},
+       {NULL, 0, NULL, 0}
+};
+
+static const struct sock_filter ipv4_icmp_type_11[] = {
+       { 0x28, 0, 0, 0x0000000c },     /* ldh [12]             */
+       { 0x15, 0, 8, 0x00000800 },     /* jneq #0x800, drop    */
+       { 0x30, 0, 0, 0x00000017 },     /* ldb [23]             */
+       { 0x15, 0, 6, 0x00000001 },     /* jneq #0x1, drop      */
+       { 0x28, 0, 0, 0x00000014 },     /* ldh [20]             */
+       { 0x45, 4, 0, 0x00001fff },     /* jset #0x1fff, drop   */
+       { 0xb1, 0, 0, 0x0000000e },     /* ldxb 4*([14]&0xf)    */
+       { 0x50, 0, 0, 0x0000000e },     /* ldb [x + 14]         */
+       { 0x15, 0, 1, 0x0000000b },     /* jneq #0xb, drop      */
+       { 0x06, 0, 0, 0xffffffff },     /* ret #-1              */
+       { 0x06, 0, 0, 0x00000000 },     /* drop: ret #0         */
+};
+
+static const struct sock_filter ipv6_icmp6_type_3[] = {
+       { 0x28, 0, 0, 0x0000000c },     /* ldh [12]             */
+       { 0x15, 0, 5, 0x000086dd },     /* jneq #0x86dd, drop   */
+       { 0x30, 0, 0, 0x00000014 },     /* ldb [20]             */
+       { 0x15, 0, 3, 0x0000003a },     /* jneq #0x3a, drop     */
+       { 0x30, 0, 0, 0x00000036 },     /* ldb [54]             */
+       { 0x15, 0, 1, 0x00000003 },     /* jneq #0x3, drop      */
+       { 0x06, 0, 0, 0xffffffff },     /* ret #-1              */
+       { 0x06, 0, 0, 0x00000000 },     /* drop: ret #0         */
+};
+
+static const struct proto_ops af_ops[] = {
+       [IPPROTO_IP]    =       {
+                       .assembler      =       assemble_ipv4,
+                       .handler        =       handle_ipv4,
+                       .check          =       check_ipv4,
+                       .filter         =       ipv4_icmp_type_11,
+                       .flen           =       array_size(ipv4_icmp_type_11),
+                       .min_len_tcp    =       sizeof(struct iphdr) + sizeof(struct tcphdr),
+                       .min_len_icmp   =       sizeof(struct iphdr) + sizeof(struct icmphdr),
+               },
+       [IPPROTO_IPV6]  =       {
+                       .assembler      =       assemble_ipv6,
+                       .handler        =       handle_ipv6,
+                       .check          =       check_ipv6,
+                       .filter         =       ipv6_icmp6_type_3,
+                       .flen           =       array_size(ipv6_icmp6_type_3),
+                       .min_len_tcp    =       sizeof(struct ip6_hdr) + sizeof(struct tcphdr),
+                       .min_len_icmp   =       sizeof(struct ip6_hdr) + sizeof(struct icmp6hdr),
+               },
+};
+
+static void signal_handler(int number)
+{
+       switch (number) {
+       case SIGINT:
+               sigint = 1;
+       default:
+               break;
+       }
+}
+
+static void help(void)
+{
+       printf("\nastraceroute %s, autonomous system trace route utility\n", VERSION_STRING);
+       puts("http://www.netsniff-ng.org\n\n"
+            "Usage: astraceroute [options]\n"
+            "Options:\n"
+            " -H|--host <host>        Host/IPv4/IPv6 to lookup AS route to\n"
+            " -p|--port <port>        Hosts port to lookup AS route to\n"
+            " -i|-d|--dev <device>    Networking device, e.g. eth0\n"
+            " -f|--init-ttl <ttl>     Set initial TTL\n"
+            " -m|--max-ttl <ttl>      Set maximum TTL (def: 30)\n"
+            " -q|--num-probes <num>   Number of max probes for each hop (def: 2)\n"
+            " -x|--timeout <sec>      Probe response timeout in sec (def: 3)\n"
+            " -X|--payload <string>   Specify a payload string to test DPIs\n"
+            " -l|--totlen <len>       Specify total packet len\n"
+            " -4|--ipv4               Use IPv4-only requests\n"
+            " -6|--ipv6               Use IPv6-only requests\n"
+            " -n|--numeric            Do not do reverse DNS lookup for hops\n"
+            " -u|--update             Update GeoIP databases\n"
+            " -L|--latitude           Show latitude and longtitude\n"
+            " -N|--dns                Do a reverse DNS lookup for hops\n"
+            " -S|--syn                Set TCP SYN flag\n"
+            " -A|--ack                Set TCP ACK flag\n"
+            " -F|--fin                Set TCP FIN flag\n"
+            " -P|--psh                Set TCP PSH flag\n"
+            " -U|--urg                Set TCP URG flag\n"
+            " -R|--rst                Set TCP RST flag\n"
+            " -E|--ecn-syn            Send ECN SYN packets (RFC3168)\n"
+            " -t|--tos <tos>          Set the IP TOS field\n"
+            " -G|--nofrag             Set do not fragment bit\n"
+            " -Z|--show-packet        Show returned packet on each hop\n"
+            " -v|--version            Print version\n"
+            " -h|--help               Print this help\n\n"
+            "Examples:\n"
+            "  IPv4 trace of AS with TCP SYN probe (this will most-likely pass):\n"
+            "    astraceroute -i eth0 -N -S -H netsniff-ng.org\n"
+            "  IPv4 trace of AS with TCP ECN SYN probe:\n"
+            "    astraceroute -i eth0 -N -E -H netsniff-ng.org\n"
+            "  IPv4 trace of AS with TCP FIN probe:\n"
+            "    astraceroute -i eth0 -N -F -H netsniff-ng.org\n"
+            "  IPv4 trace of AS with Xmas probe:\n"
+            "    astraceroute -i eth0 -N -FPU -H netsniff-ng.org\n"
+            "  IPv4 trace of AS with Null probe with ASCII payload:\n"
+            "    astraceroute -i eth0 -N -H netsniff-ng.org -X \"censor-me\" -Z\n"
+            "  IPv6 trace of AS up to www.6bone.net:\n"
+            "    astraceroute -6 -i eth0 -S -E -N -H www.6bone.net\n\n"
+            "Note:\n"
+            "  If the TCP probe did not give any results, then astraceroute will\n"
+            "  automatically probe for classic ICMP packets! To gather more\n"
+            "  information about astraceroute's fetched AS numbers, see e.g.\n"
+            "  http://bgp.he.net/AS<number>!\n\n"
+            "Please report bugs to <bugs@netsniff-ng.org>\n"
+            "Copyright (C) 2011-2013 Daniel Borkmann <dborkma@tik.ee.ethz.ch>\n"
+            "Swiss federal institute of technology (ETH Zurich)\n"
+            "License: GNU GPL version 2.0\n"
+            "This is free software: you are free to change and redistribute it.\n"
+            "There is NO WARRANTY, to the extent permitted by law.\n");
+       die();
+}
+
+static void version(void)
+{
+       printf("\nastraceroute %s, autonomous system trace route utility\n", VERSION_STRING);
+       puts("http://www.netsniff-ng.org\n\n"
+            "Please report bugs to <bugs@netsniff-ng.org>\n"
+            "Copyright (C) 2011-2013 Daniel Borkmann <dborkma@tik.ee.ethz.ch>\n"
+            "Swiss federal institute of technology (ETH Zurich)\n"
+            "License: GNU GPL version 2.0\n"
+            "This is free software: you are free to change and redistribute it.\n"
+            "There is NO WARRANTY, to the extent permitted by law.\n");
+       die();
+}
+
+static void __assemble_data(uint8_t *packet, size_t len, const char *payload)
+{
+       int i;
+
+       if (payload == NULL) {
+               for (i = 0; i < len; ++i)
+                       packet[i] = (uint8_t) rand();
+       } else {
+               int lmin = min(len, strlen(payload));
+
+               for (i = 0; i < lmin; ++i)
+                       packet[i] = (uint8_t) payload[i];
+               for (i = lmin; i < len; ++i)
+                       packet[i] = (uint8_t) rand();
+       }
+}
+
+static void __assemble_icmp4(uint8_t *packet, size_t len)
+{
+       struct icmphdr *icmph = (struct icmphdr *) packet;
+
+       bug_on(len < sizeof(struct icmphdr));
+
+       icmph->type = ICMP_ECHO;
+       icmph->code = 0;
+       icmph->checksum = 0;
+}
+
+static void __assemble_icmp6(uint8_t *packet, size_t len)
+{
+       struct icmp6hdr *icmp6h = (struct icmp6hdr *) packet;
+
+       bug_on(len < sizeof(struct icmp6hdr));
+
+       icmp6h->icmp6_type = ICMPV6_ECHO_REQUEST;
+       icmp6h->icmp6_code = 0;
+       icmp6h->icmp6_cksum = 0;
+}
+
+static void __assemble_tcp(uint8_t *packet, size_t len, int syn, int ack,
+                          int urg, int fin, int rst, int psh, int ecn,
+                          int dport)
+{
+       struct tcphdr *tcph = (struct tcphdr *) packet;
+
+       bug_on(len < sizeof(struct tcphdr));
+
+       tcph->source = htons((uint16_t) rand());
+       tcph->dest = htons((uint16_t) dport);
+
+       tcph->seq = htonl(rand());
+       tcph->ack_seq = (!!ack ? htonl(rand()) : 0);
+
+       tcph->doff = 5;
+
+       tcph->syn = !!syn;
+       tcph->ack = !!ack;
+       tcph->urg = !!urg;
+       tcph->fin = !!fin;
+       tcph->rst = !!rst;
+       tcph->psh = !!psh;
+       tcph->ece = !!ecn;
+       tcph->cwr = !!ecn;
+
+       tcph->window = htons((uint16_t) (100 + (rand() % 65435)));
+       tcph->urg_ptr = (!!urg ? htons((uint16_t) rand()) :  0);
+       tcph->check = 0;
+}
+
+static int assemble_ipv4(uint8_t *packet, size_t len, int ttl, int proto,
+                        const struct ctx *ctx, const struct sockaddr *dst,
+                        const struct sockaddr *src)
+{
+       uint8_t *data;
+       size_t data_len, off_next = 0;
+       struct iphdr *iph = (struct iphdr *) packet;
+
+       bug_on(!src || !dst);
+       bug_on(src->sa_family != PF_INET || dst->sa_family != PF_INET);
+       bug_on(len < sizeof(*iph) + min(sizeof(struct tcphdr),
+                                       sizeof(struct icmphdr)));
+
+       iph->ihl = 5;
+       iph->version = 4;
+       iph->tos = (uint8_t) ctx->tos;
+
+       iph->tot_len = htons((uint16_t) len);
+       iph->id = htons((uint16_t) rand());
+
+       iph->frag_off = ctx->nofrag ? IP_DF : 0;
+       iph->ttl = (uint8_t) ttl;
+
+       iph->saddr = ((const struct sockaddr_in *) src)->sin_addr.s_addr;
+       iph->daddr = ((const struct sockaddr_in *) dst)->sin_addr.s_addr;
+
+       iph->protocol = (uint8_t) proto;
+
+       data = packet + sizeof(*iph);
+       data_len = len - sizeof(*iph);
+
+       switch (proto) {
+       case IPPROTO_TCP:
+               __assemble_tcp(data, data_len, ctx->syn, ctx->ack, ctx->urg,
+                              ctx->fin, ctx->rst, ctx->psh, ctx->ecn, ctx->dport);
+               off_next = sizeof(struct tcphdr);
+               break;
+       case IPPROTO_ICMP:
+               __assemble_icmp4(data, data_len);
+               off_next = sizeof(struct icmphdr);
+               break;
+       default:
+               bug();
+       }
+
+       data = packet + sizeof(*iph) + off_next;
+       data_len = len - sizeof(*iph) - off_next;
+
+       __assemble_data(data, data_len, ctx->payload);
+
+       iph->check = csum((unsigned short *) packet, ntohs(iph->tot_len) >> 1);
+
+       return ntohs(iph->id);
+}
+
+static int assemble_ipv6(uint8_t *packet, size_t len, int ttl, int proto,
+                        const struct ctx *ctx, const struct sockaddr *dst,
+                        const struct sockaddr *src)
+{
+       uint8_t *data;
+       size_t data_len, off_next = 0;
+       struct ip6_hdr *ip6h = (struct ip6_hdr *) packet;
+
+       bug_on(!src || !dst);
+       bug_on(src->sa_family != PF_INET6 || dst->sa_family != PF_INET6);
+       bug_on(len < sizeof(*ip6h) + min(sizeof(struct tcphdr),
+                                        sizeof(struct icmp6hdr)));
+
+       ip6h->ip6_flow = htonl(rand() & 0x000fffff);
+       ip6h->ip6_vfc = 0x60;
+
+       ip6h->ip6_plen = htons((uint16_t) len - sizeof(*ip6h));
+       ip6h->ip6_nxt = (uint8_t) proto;
+       ip6h->ip6_hlim = (uint8_t) ttl;
+
+       memcpy(&ip6h->ip6_src, &(((const struct sockaddr_in6 *)
+              src)->sin6_addr), sizeof(ip6h->ip6_src));
+       memcpy(&ip6h->ip6_dst, &(((const struct sockaddr_in6 *)
+              dst)->sin6_addr), sizeof(ip6h->ip6_dst));
+
+       data = packet + sizeof(*ip6h);
+       data_len = len - sizeof(*ip6h);
+
+       switch (proto) {
+       case IPPROTO_TCP:
+               __assemble_tcp(data, data_len, ctx->syn, ctx->ack, ctx->urg,
+                              ctx->fin, ctx->rst, ctx->psh, ctx->ecn, ctx->dport);
+               off_next = sizeof(struct tcphdr);
+               break;
+       case IPPROTO_ICMP:
+       case IPPROTO_ICMPV6:
+               __assemble_icmp6(data, data_len);
+               off_next = sizeof(struct icmp6hdr);
+               break;
+       default:
+               bug();
+       }
+
+       data = packet + sizeof(*ip6h) + off_next;
+       data_len = len - sizeof(*ip6h) - off_next;
+
+       __assemble_data(data, data_len, ctx->payload);
+
+       return ntohl(ip6h->ip6_flow) & 0x000fffff;
+}
+
+static int check_ipv4(uint8_t *packet, size_t len, int ttl, int id,
+                     const struct sockaddr *ss)
+{
+       struct iphdr *iph = (struct iphdr *) packet;
+       struct iphdr *iph_inner;
+       struct icmphdr *icmph;
+
+       if (iph->protocol != IPPROTO_ICMP)
+               return -EINVAL;
+       if (iph->daddr != ((const struct sockaddr_in *) ss)->sin_addr.s_addr)
+               return -EINVAL;
+
+       icmph = (struct icmphdr *) (packet + sizeof(struct iphdr));
+       if (icmph->type != ICMP_TIME_EXCEEDED)
+               return -EINVAL;
+       if (icmph->code != ICMP_EXC_TTL)
+               return -EINVAL;
+
+       iph_inner = (struct iphdr *) (packet + sizeof(struct iphdr) +
+                                     sizeof(struct icmphdr));
+       if (ntohs(iph_inner->id) != id)
+               return -EINVAL;
+
+       return len;
+}
+
+static void handle_ipv4(uint8_t *packet, size_t len, int dns_resolv, int latitude)
+{
+       char hbuff[256];
+       struct iphdr *iph = (struct iphdr *) packet;
+       struct sockaddr_in sd;
+       struct hostent *hent;
+       const char *as, *country, *city;
+
+       memset(hbuff, 0, sizeof(hbuff));
+       memset(&sd, 0, sizeof(sd));
+       sd.sin_family = PF_INET;
+       sd.sin_addr.s_addr = iph->saddr;
+
+       getnameinfo((struct sockaddr *) &sd, sizeof(sd),
+                   hbuff, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
+
+       as = geoip4_as_name(sd);
+       country = geoip4_country_name(sd);
+       city = geoip4_city_name(sd);
+
+       if (dns_resolv) {
+               hent = gethostbyaddr(&sd.sin_addr, sizeof(sd.sin_addr), PF_INET);
+               if (hent)
+                       printf(" %s (%s)", hent->h_name, hbuff);
+               else
+                       printf(" %s", hbuff);
+       } else {
+               printf(" %s", hbuff);
+       }
+       if (as)
+               printf(" in %s", as);
+       if (country) {
+               printf(" in %s", country);
+               if (city)
+                       printf(", %s", city);
+       }
+       if (latitude)
+               printf(" (%f/%f)", geoip4_latitude(sd), geoip4_longitude(sd));
+}
+
+static int check_ipv6(uint8_t *packet, size_t len, int ttl, int id,
+                     const struct sockaddr *ss)
+{
+       struct ip6_hdr *ip6h = (struct ip6_hdr *) packet;
+       struct ip6_hdr *ip6h_inner;
+       struct icmp6hdr *icmp6h;
+
+       if (ip6h->ip6_nxt != 0x3a)
+               return -EINVAL;
+       if (memcmp(&ip6h->ip6_dst, &(((const struct sockaddr_in6 *)
+                  ss)->sin6_addr), sizeof(ip6h->ip6_dst)))
+               return -EINVAL;
+
+       icmp6h = (struct icmp6hdr *) (packet + sizeof(*ip6h));
+       if (icmp6h->icmp6_type != ICMPV6_TIME_EXCEED)
+               return -EINVAL;
+       if (icmp6h->icmp6_code != ICMPV6_EXC_HOPLIMIT)
+               return -EINVAL;
+
+       ip6h_inner = (struct ip6_hdr *) (packet + sizeof(*ip6h) + sizeof(*icmp6h));
+       if ((ntohl(ip6h_inner->ip6_flow) & 0x000fffff) != id)
+               return -EINVAL;
+
+       return len;
+}
+
+static void handle_ipv6(uint8_t *packet, size_t len, int dns_resolv, int latitude)
+{
+       char hbuff[256];
+       struct ip6_hdr *ip6h = (struct ip6_hdr *) packet;
+       struct sockaddr_in6 sd;
+       struct hostent *hent;
+       const char *as, *country, *city;
+
+       memset(hbuff, 0, sizeof(hbuff));
+       memset(&sd, 0, sizeof(sd));
+       sd.sin6_family = PF_INET6;
+       memcpy(&sd.sin6_addr, &ip6h->ip6_src, sizeof(ip6h->ip6_src));
+
+       getnameinfo((struct sockaddr *) &sd, sizeof(sd),
+                   hbuff, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
+
+       as = geoip6_as_name(sd);
+       country = geoip6_country_name(sd);
+       city = geoip6_city_name(sd);
+
+       if (dns_resolv) {
+               hent = gethostbyaddr(&sd.sin6_addr, sizeof(sd.sin6_addr), PF_INET6);
+               if (hent)
+                       printf(" %s (%s)", hent->h_name, hbuff);
+               else
+                       printf(" %s", hbuff);
+       } else {
+               printf(" %s", hbuff);
+       }
+       if (as)
+               printf(" in %s", as);
+       if (country) {
+               printf(" in %s", country);
+               if (city)
+                       printf(", %s", city);
+       }
+       if (latitude)
+               printf(" (%f/%f)", geoip6_latitude(sd), geoip6_longitude(sd));
+}
+
+static void show_trace_info(struct ctx *ctx, const struct sockaddr_storage *ss,
+                           const struct sockaddr_storage *sd)
+{
+       char hbuffs[256], hbuffd[256];
+
+       memset(hbuffd, 0, sizeof(hbuffd));
+       getnameinfo((struct sockaddr *) sd, sizeof(*sd),
+                   hbuffd, sizeof(hbuffd), NULL, 0, NI_NUMERICHOST);
+
+       memset(hbuffs, 0, sizeof(hbuffs));
+       getnameinfo((struct sockaddr *) ss, sizeof(*ss),
+                   hbuffs, sizeof(hbuffs), NULL, 0, NI_NUMERICHOST);
+
+       printf("AS path IPv%d TCP trace from %s to %s:%s (%s) with len %d "
+              "Bytes, %u max hops\n", ctx->proto == IPPROTO_IP ? 4 : 6,
+              hbuffs, hbuffd, ctx->port, ctx->host, ctx->totlen, ctx->max_ttl);
+
+       printf("Using flags SYN:%d,ACK:%d,ECN:%d,FIN:%d,PSH:%d,RST:%d,URG:%d\n",
+              ctx->syn, ctx->ack, ctx->ecn, ctx->fin, ctx->psh, ctx->rst, ctx->urg);
+
+       if (ctx->payload)
+               printf("With payload: \'%s\'\n", ctx->payload);
+}
+
+static int get_remote_fd(struct ctx *ctx, struct sockaddr_storage *ss,
+                        struct sockaddr_storage *sd)
+{
+       int fd = -1, ret, one = 1;
+       struct addrinfo hints, *ahead, *ai;
+
+       memset(&hints, 0, sizeof(hints));
+       hints.ai_family = PF_UNSPEC;
+       hints.ai_socktype = SOCK_STREAM;
+       hints.ai_protocol = IPPROTO_TCP;
+       hints.ai_flags = AI_NUMERICSERV;
+
+       ret = getaddrinfo(ctx->host, ctx->port, &hints, &ahead);
+       if (ret < 0)
+               panic("Cannot get address info!\n");
+
+       for (ai = ahead; ai != NULL && fd < 0; ai = ai->ai_next) {
+               if (!((ai->ai_family == PF_INET6 && ctx->proto == IPPROTO_IPV6) ||
+                     (ai->ai_family == PF_INET  && ctx->proto == IPPROTO_IP)))
+                       continue;
+
+               fd = socket(ai->ai_family, SOCK_RAW, IPPROTO_RAW);
+               if (fd < 0)
+                       continue;
+
+               memset(ss, 0, sizeof(*ss));
+               ret = device_address(ctx->dev, ai->ai_family, ss);
+               if (ret < 0)
+                       panic("Cannot get own device address!\n");
+
+               ret = bind(fd, (struct sockaddr *) ss, sizeof(*ss));
+               if (ret < 0)
+                       panic("Cannot bind socket!\n");
+
+               memset(sd, 0, sizeof(*sd));
+               memcpy(sd, ai->ai_addr, ai->ai_addrlen);
+
+               ctx->sd_len = ai->ai_addrlen;
+               ctx->dport = strtoul(ctx->port, NULL, 10);
+
+               ret = setsockopt(fd, ctx->proto, IP_HDRINCL, &one, sizeof(one));
+               if (ret < 0)
+                       panic("Kernel does not support IP_HDRINCL!\n");
+
+               if (ai->ai_family == PF_INET6) {
+                       struct sockaddr_in6 *sd6 = (struct sockaddr_in6 *) sd;
+
+                       sd6->sin6_port = 0;
+               }
+
+               break;
+       }
+
+       freeaddrinfo(ahead);
+
+       if (fd < 0)
+               panic("Cannot create socket! Does remote "
+                     "support IPv%d?!\n",
+                     ctx->proto == IPPROTO_IP ? 4 : 6);
+
+       return fd;
+}
+
+static void inject_filter(struct ctx *ctx, int fd)
+{
+       struct sock_fprog bpf_ops;
+
+       enable_kernel_bpf_jit_compiler();
+
+       memset(&bpf_ops, 0, sizeof(bpf_ops));
+       bpf_ops.filter = (struct sock_filter *) af_ops[ctx->proto].filter;
+       bpf_ops.len = af_ops[ctx->proto].flen;
+
+       bpf_attach_to_sock(fd, &bpf_ops);
+}
+
+static int __process_node(struct ctx *ctx, int fd, int fd_cap, int ttl,
+                         int inner_proto, uint8_t *pkt_snd, uint8_t *pkt_rcv,
+                         const struct sockaddr_storage *ss,
+                         const struct sockaddr_storage *sd, struct timeval *diff)
+{
+       int pkt_id, ret, timeout;
+       struct pollfd pfd;
+       struct timeval start, end;
+
+       prepare_polling(fd_cap, &pfd);
+
+       memset(pkt_snd, 0, ctx->totlen);
+       pkt_id = af_ops[ctx->proto].assembler(pkt_snd, ctx->totlen, ttl,
+                                             inner_proto, ctx,
+                                             (const struct sockaddr *) sd,
+                                             (const struct sockaddr *) ss);
+
+       ret = sendto(fd, pkt_snd, ctx->totlen, 0, (struct sockaddr *) sd,
+                    ctx->sd_len);
+       if (ret < 0)
+               panic("sendto failed: %s\n", strerror(errno));
+
+       bug_on(gettimeofday(&start, NULL));
+
+       timeout = (ctx->timeout > 0 ? ctx->timeout : 2) * 1000;
+
+       ret = poll(&pfd, 1, timeout);
+       if (ret > 0 && pfd.revents & POLLIN && sigint == 0) {
+               bug_on(gettimeofday(&end, NULL));
+               if (diff)
+                       timersub(&end, &start, diff);
+
+               ret = recvfrom(fd_cap, pkt_rcv, ctx->rcvlen, 0, NULL, NULL);
+               if (ret < sizeof(struct ethhdr) + af_ops[ctx->proto].min_len_icmp)
+                       return -EIO;
+
+               return af_ops[ctx->proto].check(pkt_rcv + sizeof(struct ethhdr),
+                                               ret - sizeof(struct ethhdr), ttl,
+                                               pkt_id, (const struct sockaddr *) ss);
+       } else {
+               return -EIO;
+       }
+
+       return 0;
+}
+
+static void timerdiv(const unsigned long divisor, const struct timeval *tv,
+                    struct timeval *result)
+{
+       uint64_t x = ((uint64_t) tv->tv_sec * 1000 * 1000 + tv->tv_usec) / divisor;
+
+       result->tv_sec = x / 1000 / 1000;
+       result->tv_usec = x % (1000 * 1000);
+}
+
+static int timevalcmp(const void *t1, const void *t2)
+{
+       if (timercmp((struct timeval *) t1, (struct timeval *) t2, <))
+               return -1;
+       if (timercmp((struct timeval *) t1, (struct timeval *) t2, >))
+               return  1;
+
+       return 0;
+}
+
+static int __process_time(struct ctx *ctx, int fd, int fd_cap, int ttl,
+                         int inner_proto, uint8_t *pkt_snd, uint8_t *pkt_rcv,
+                         const struct sockaddr_storage *ss,
+                         const struct sockaddr_storage *sd)
+{
+       int good = 0, i, j = 0, ret = -EIO, idx, ret_good = -EIO;
+       struct timeval probes[9], *tmp, sum, res;
+       uint8_t *trash = xmalloc(ctx->rcvlen);
+       char *cwait[] = { "-", "\\", "|", "/" };
+       const char *proto_short[] = {
+               [IPPROTO_TCP]           =       "t",
+               [IPPROTO_ICMP]          =       "i",
+               [IPPROTO_ICMPV6]        =       "i",
+       };
+
+       memset(probes, 0, sizeof(probes));
+       for (i = 0; i < array_size(probes) && sigint == 0; ++i) {
+               ret = __process_node(ctx, fd, fd_cap, ttl, inner_proto,
+                                    pkt_snd, good == 0 ? pkt_rcv : trash,
+                                    ss, sd, &probes[i]);
+               if (ret > 0) {
+                       if (good == 0)
+                               ret_good = ret;
+                       good++;
+               }
+
+               if (good == 0 && ctx->queries == i)
+                       break;
+
+               usleep(50000);
+
+               printf("\r%2d: %s", ttl, cwait[j++]);
+               fflush(stdout);
+               if (j >= array_size(cwait))
+                       j = 0;
+       }
+
+       if (good == 0) {
+               xfree(trash);
+               return -EIO;
+       }
+
+       tmp = xmalloc(sizeof(struct timeval) * good);
+       for (i = j = 0; i < array_size(probes); ++i) {
+               if (probes[i].tv_sec == 0 && probes[i].tv_usec == 0)
+                       continue;
+               tmp[j].tv_sec = probes[i].tv_sec;
+               tmp[j].tv_usec = probes[i].tv_usec;
+               j++;
+       }
+
+       qsort(tmp, j, sizeof(struct timeval), timevalcmp);
+
+       printf("\r%2d: %s[", ttl, proto_short[inner_proto]);
+       idx = j / 2;
+       switch (j % 2) {
+       case 0:
+               timeradd(&tmp[idx], &tmp[idx - 1], &sum);
+               timerdiv(2, &sum, &res);
+               if (res.tv_sec > 0)
+                       printf("%lu sec ", res.tv_sec);
+               printf("%7lu us", res.tv_usec);
+               break;
+       case 1:
+               if (tmp[idx].tv_sec > 0)
+                       printf("%lu sec ", tmp[idx].tv_sec);
+               printf("%7lu us", tmp[idx].tv_usec);
+               break;
+       default:
+               bug();
+       }
+       printf("]");
+
+       xfree(tmp);
+       xfree(trash);
+
+       return ret_good;
+}
+
+static int __probe_remote(struct ctx *ctx, int fd, int fd_cap, int ttl,
+                         uint8_t *pkt_snd, uint8_t *pkt_rcv,
+                         const struct sockaddr_storage *ss,
+                         const struct sockaddr_storage *sd,
+                         int inner_proto)
+{
+       int ret = -EIO, tries = ctx->queries;
+
+       while (tries-- > 0 && sigint == 0) {
+               ret = __process_time(ctx, fd, fd_cap, ttl, inner_proto,
+                                    pkt_snd, pkt_rcv, ss, sd);
+               if (ret < 0)
+                       continue;
+
+               af_ops[ctx->proto].handler(pkt_rcv + sizeof(struct ethhdr),
+                                          ret - sizeof(struct ethhdr),
+                                          ctx->dns_resolv, ctx->latitude);
+               if (ctx->show) {
+                       struct pkt_buff *pkt;
+
+                       printf("\n");
+                       pkt = pkt_alloc(pkt_rcv, ret);
+                       hex_ascii(pkt);
+                       tprintf_flush();
+                       pkt_free(pkt);
+               }
+
+               break;
+       }
+
+       return ret;
+}
+
+static int __process_ttl(struct ctx *ctx, int fd, int fd_cap, int ttl,
+                        uint8_t *pkt_snd, uint8_t *pkt_rcv,
+                        const struct sockaddr_storage *ss,
+                        const struct sockaddr_storage *sd)
+{
+       int ret = -EIO, i;
+       const int inner_protos[] = {
+               IPPROTO_TCP,
+               IPPROTO_ICMP,
+       };
+
+       printf("%2d: ", ttl);
+       fflush(stdout);
+
+       for (i = 0; i < array_size(inner_protos) && sigint == 0; ++i) {
+               ret = __probe_remote(ctx, fd, fd_cap, ttl, pkt_snd, pkt_rcv, ss, sd,
+                                    inner_protos[i]);
+               if (ret > 0)
+                       break;
+       }
+
+       if (ret <= 0)
+               printf("\r%2d: ?[ no answer]", ttl);
+       if (ctx->show == 0)
+               printf("\n");
+       if (ctx->show && ret <= 0)
+               printf("\n\n");
+
+       fflush(stdout);
+       return 0;
+}
+
+static int main_trace(struct ctx *ctx)
+{
+       int fd, fd_cap, ifindex, ttl;
+       struct ring dummy_ring;
+       struct sockaddr_storage ss, sd;
+       uint8_t *pkt_snd, *pkt_rcv;
+
+       fd = get_remote_fd(ctx, &ss, &sd);
+       fd_cap = pf_socket();
+
+       inject_filter(ctx, fd_cap);
+
+       ifindex = device_ifindex(ctx->dev);
+       bind_rx_ring(fd_cap, &dummy_ring, ifindex);
+
+       if (ctx->totlen < af_ops[ctx->proto].min_len_tcp) {
+               ctx->totlen = af_ops[ctx->proto].min_len_tcp;
+               if (ctx->payload)
+                       ctx->totlen += strlen(ctx->payload);
+       }
+
+       ctx->rcvlen = device_mtu(ctx->dev) - sizeof(struct ethhdr);
+       if (ctx->totlen >= ctx->rcvlen)
+               panic("Packet len exceeds device MTU!\n");
+
+       pkt_snd = xmalloc(ctx->totlen);
+       pkt_rcv = xmalloc(ctx->rcvlen);
+
+       show_trace_info(ctx, &ss, &sd);
+
+       for (ttl = ctx->init_ttl; ttl <= ctx->max_ttl && sigint == 0; ++ttl)
+               __process_ttl(ctx, fd, fd_cap, ttl, pkt_snd, pkt_rcv,
+                             &ss, &sd);
+
+       xfree(pkt_snd);
+       xfree(pkt_rcv);
+
+       close(fd_cap);
+       close(fd);
+
+       return 0;
+}
+
+int main(int argc, char **argv)
+{
+       int c, opt_index, ret;
+       struct ctx ctx;
+
+       setfsuid(getuid());
+       setfsgid(getgid());
+
+       srand(time(NULL));
+
+       memset(&ctx, 0, sizeof(ctx));
+       ctx.init_ttl = 1;
+       ctx.max_ttl = 30;
+       ctx.queries = 2;
+       ctx.timeout = 2;
+       ctx.proto = IPPROTO_IP;
+       ctx.payload = NULL;
+       ctx.dev = xstrdup("eth0");
+       ctx.port = xstrdup("80");
+
+       while ((c = getopt_long(argc, argv, short_options, long_options,
+               &opt_index)) != EOF) {
+               switch (c) {
+               case 'h':
+                       help();
+                       break;
+               case 'v':
+                       version();
+                       break;
+               case 'u':
+                       update_geoip();
+                       die();
+                       break;
+               case 'H':
+                       ctx.host = xstrdup(optarg);
+                       break;
+               case 'p':
+                       if (ctx.port)
+                               xfree(ctx.port);
+                       ctx.port = xstrdup(optarg);
+                       break;
+               case 'n':
+                       ctx.dns_resolv = 0;
+                       break;
+               case '4':
+                       ctx.proto = IPPROTO_IP;
+                       break;
+               case '6':
+                       ctx.proto = IPPROTO_IPV6;
+                       break;
+               case 'Z':
+                       ctx.show = 1;
+                       break;
+               case 'N':
+                       ctx.dns_resolv = 1;
+                       break;
+               case 'f':
+                       ctx.init_ttl = atoi(optarg);
+                       if (ctx.init_ttl <= 0)
+                               help();
+                       break;
+               case 'm':
+                       ctx.max_ttl = atoi(optarg);
+                       if (ctx.max_ttl <= 0)
+                               help();
+                       break;
+               case 'i':
+               case 'd':
+                       free(ctx.dev);
+                       ctx.dev = xstrdup(optarg);
+                       break;
+               case 'q':
+                       ctx.queries = atoi(optarg);
+                       if (ctx.queries <= 0)
+                               help();
+                       break;
+               case 'x':
+                       ctx.timeout = atoi(optarg);
+                       if (ctx.timeout <= 0)
+                               help();
+                       break;
+               case 'L':
+                       ctx.latitude = 1;
+                       break;
+               case 'S':
+                       ctx.syn = 1;
+                       break;
+               case 'A':
+                       ctx.ack = 1;
+                       break;
+               case 'F':
+                       ctx.fin = 1;
+                       break;
+               case 'U':
+                       ctx.urg = 1;
+                       break;
+               case 'P':
+                       ctx.psh = 1;
+                       break;
+               case 'R':
+                       ctx.rst = 1;
+                       break;
+               case 'E':
+                       ctx.syn = 1;
+                       ctx.ecn = 1;
+                       break;
+               case 't':
+                       ctx.tos = atoi(optarg);
+                       if (ctx.tos < 0)
+                               help();
+                       break;
+               case 'G':
+                       ctx.nofrag = 1;
+                       break;
+               case 'X':
+                       ctx.payload = xstrdup(optarg);
+                       break;
+               case 'l':
+                       ctx.totlen = atoi(optarg);
+                       if (ctx.totlen <= 0)
+                               help();
+                       break;
+               case '?':
+                       switch (optopt) {
+                       case 'H':
+                       case 'p':
+                       case 'f':
+                       case 'm':
+                       case 'i':
+                       case 'd':
+                       case 'q':
+                       case 'x':
+                       case 'X':
+                       case 't':
+                       case 'l':
+                               panic("Option -%c requires an argument!\n",
+                                     optopt);
+                       default:
+                               if (isprint(optopt))
+                                       printf("Unknown option character `0x%X\'!\n", optopt);
+                               die();
+               }
+               default:
+                       break;
+               }
+       }
+
+       if (argc < 3 || !ctx.host || !ctx.port || ctx.init_ttl > ctx.max_ttl ||
+           ctx.init_ttl > MAXTTL || ctx.max_ttl > MAXTTL)
+               help();
+
+       if (!device_up_and_running(ctx.dev))
+               panic("Networking device not up and running!\n");
+       if (device_mtu(ctx.dev) <= ctx.totlen)
+               panic("Packet larger than device MTU!\n");
+
+       register_signal(SIGHUP, signal_handler);
+       register_signal(SIGINT, signal_handler);
+
+       tprintf_init();
+       init_geoip(1);
+
+       ret = main_trace(&ctx);
+
+       destroy_geoip();
+       tprintf_cleanup();
+
+       free(ctx.dev);
+       free(ctx.host);
+       free(ctx.port);
+       free(ctx.payload);
+
+       return ret;
+}
diff --git a/astraceroute/.gitignore b/astraceroute/.gitignore
new file mode 100644 (file)
index 0000000..6343402
--- /dev/null
@@ -0,0 +1,5 @@
+*.*
+
+!.gitignore
+!Makefile
+!build_geoip.sh
diff --git a/astraceroute/Makefile b/astraceroute/Makefile
new file mode 100644 (file)
index 0000000..91f0a9e
--- /dev/null
@@ -0,0 +1,13 @@
+astraceroute-libs =    -lGeoIP \
+                       -lpthread \
+                       -lz
+
+astraceroute-objs =    xmalloc.o \
+                       xio.o \
+                       xutils.o \
+                       proto_none.o \
+                       tprintf.o \
+                       bpf.o \
+                       geoip.o \
+                       ring_rx.o \
+                       astraceroute.o
diff --git a/bpf.c b/bpf.c
new file mode 100644 (file)
index 0000000..dc7e3cb
--- /dev/null
+++ b/bpf.c
@@ -0,0 +1,765 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009 - 2012 Daniel Borkmann.
+ * Copyright 2009, 2010 Emmanuel Roullit.
+ * Copyright 1990-1996 The Regents of the University of
+ * California. All rights reserved. (3-clause BSD license)
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdint.h>
+#include <stdio.h>
+#include <arpa/inet.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "bpf.h"
+#include "xmalloc.h"
+#include "xutils.h"
+#include "die.h"
+
+#define EXTRACT_SHORT(packet)                                          \
+               ((unsigned short) ntohs(*(unsigned short *) packet))
+#define EXTRACT_LONG(packet)                                           \
+               (ntohl(*(unsigned long *) packet))
+
+#ifndef BPF_MEMWORDS
+# define BPF_MEMWORDS  16
+#endif
+
+#define BPF_LD_B       (BPF_LD   |    BPF_B)
+#define BPF_LD_H       (BPF_LD   |    BPF_H)
+#define BPF_LD_W       (BPF_LD   |    BPF_W)
+#define BPF_LDX_B      (BPF_LDX  |    BPF_B)
+#define BPF_LDX_W      (BPF_LDX  |    BPF_W)
+#define BPF_JMP_JA     (BPF_JMP  |   BPF_JA)
+#define BPF_JMP_JEQ    (BPF_JMP  |  BPF_JEQ)
+#define BPF_JMP_JGT    (BPF_JMP  |  BPF_JGT)
+#define BPF_JMP_JGE    (BPF_JMP  |  BPF_JGE)
+#define BPF_JMP_JSET   (BPF_JMP  | BPF_JSET)
+#define BPF_ALU_ADD    (BPF_ALU  |  BPF_ADD)
+#define BPF_ALU_SUB    (BPF_ALU  |  BPF_SUB)
+#define BPF_ALU_MUL    (BPF_ALU  |  BPF_MUL)
+#define BPF_ALU_DIV    (BPF_ALU  |  BPF_DIV)
+#define BPF_ALU_MOD    (BPF_ALU  |  BPF_MOD)
+#define BPF_ALU_NEG    (BPF_ALU  |  BPF_NEG)
+#define BPF_ALU_AND    (BPF_ALU  |  BPF_AND)
+#define BPF_ALU_OR     (BPF_ALU  |   BPF_OR)
+#define BPF_ALU_XOR    (BPF_ALU  |  BPF_XOR)
+#define BPF_ALU_LSH    (BPF_ALU  |  BPF_LSH)
+#define BPF_ALU_RSH    (BPF_ALU  |  BPF_RSH)
+#define BPF_MISC_TAX   (BPF_MISC |  BPF_TAX)
+#define BPF_MISC_TXA   (BPF_MISC |  BPF_TXA)
+
+static const char *op_table[] = {
+       [BPF_LD_B]      =       "ldb",
+       [BPF_LD_H]      =       "ldh",
+       [BPF_LD_W]      =       "ld",
+       [BPF_LDX]       =       "ldx",
+       [BPF_LDX_B]     =       "ldxb",
+       [BPF_ST]        =       "st",
+       [BPF_STX]       =       "stx",
+       [BPF_JMP_JA]    =       "ja",
+       [BPF_JMP_JEQ]   =       "jeq",
+       [BPF_JMP_JGT]   =       "jgt",
+       [BPF_JMP_JGE]   =       "jge",
+       [BPF_JMP_JSET]  =       "jset",
+       [BPF_ALU_ADD]   =       "add",
+       [BPF_ALU_SUB]   =       "sub",
+       [BPF_ALU_MUL]   =       "mul",
+       [BPF_ALU_DIV]   =       "div",
+       [BPF_ALU_MOD]   =       "mod",
+       [BPF_ALU_NEG]   =       "neg",
+       [BPF_ALU_AND]   =       "and",
+       [BPF_ALU_OR]    =       "or",
+       [BPF_ALU_XOR]   =       "xor",
+       [BPF_ALU_LSH]   =       "lsh",
+       [BPF_ALU_RSH]   =       "rsh",
+       [BPF_RET]       =       "ret",
+       [BPF_MISC_TAX]  =       "tax",
+       [BPF_MISC_TXA]  =       "txa",
+};
+
+void bpf_dump_op_table(void)
+{
+       int i;
+       for (i = 0; i < array_size(op_table); ++i) {
+               if (op_table[i])
+                       printf("%s\n", op_table[i]);
+       }
+}
+
+static const char *bpf_dump_linux_k(uint32_t k)
+{
+       switch (k) {
+       default:
+               return "[%d]";
+       case SKF_AD_OFF + SKF_AD_PROTOCOL:
+               return "#proto";
+       case SKF_AD_OFF + SKF_AD_PKTTYPE:
+               return "#type";
+       case SKF_AD_OFF + SKF_AD_IFINDEX:
+               return "#ifidx";
+       case SKF_AD_OFF + SKF_AD_NLATTR:
+               return "#nla";
+       case SKF_AD_OFF + SKF_AD_NLATTR_NEST:
+               return "#nlan";
+       case SKF_AD_OFF + SKF_AD_MARK:
+               return "#mark";
+       case SKF_AD_OFF + SKF_AD_QUEUE:
+               return "#queue";
+       case SKF_AD_OFF + SKF_AD_HATYPE:
+               return "#hatype";
+       case SKF_AD_OFF + SKF_AD_RXHASH:
+               return "#rxhash";
+       case SKF_AD_OFF + SKF_AD_CPU:
+               return "#cpu";
+       case SKF_AD_OFF + SKF_AD_VLAN_TAG:
+               return "#vlant";
+       case SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT:
+               return "#vlanp";
+       }
+}
+
+static char *__bpf_dump(const struct sock_filter bpf, int n)
+{
+       int v;
+       const char *fmt, *op;
+       static char image[256];
+       char operand[64];
+
+       v = bpf.k;
+       switch (bpf.code) {
+       default:
+               op = "unimp";
+               fmt = "0x%x";
+               v = bpf.code;
+               break;
+       case BPF_RET | BPF_K:
+               op = op_table[BPF_RET];
+               fmt = "#0x%x";
+               break;
+       case BPF_RET | BPF_A:
+               op = op_table[BPF_RET];
+               fmt = "a";
+               break;
+       case BPF_RET | BPF_X:
+               op = op_table[BPF_RET];
+               fmt = "x";
+               break;
+       case BPF_LD_W | BPF_ABS:
+               op = op_table[BPF_LD_W];
+               fmt = bpf_dump_linux_k(bpf.k);
+               break;
+       case BPF_LD_H | BPF_ABS:
+               op = op_table[BPF_LD_H];
+               fmt = bpf_dump_linux_k(bpf.k);
+               break;
+       case BPF_LD_B | BPF_ABS:
+               op = op_table[BPF_LD_B];
+               fmt = bpf_dump_linux_k(bpf.k);
+               break;
+       case BPF_LD_W | BPF_LEN:
+               op = op_table[BPF_LD_W];
+               fmt = "#len";
+               break;
+       case BPF_LD_W | BPF_IND:
+               op = op_table[BPF_LD_W];
+               fmt = "[x + %d]";
+               break;
+       case BPF_LD_H | BPF_IND:
+               op = op_table[BPF_LD_H];
+               fmt = "[x + %d]";
+               break;
+       case BPF_LD_B | BPF_IND:
+               op = op_table[BPF_LD_B];
+               fmt = "[x + %d]";
+               break;
+       case BPF_LD | BPF_IMM:
+               op = op_table[BPF_LD_W];
+               fmt = "#0x%x";
+               break;
+       case BPF_LDX | BPF_IMM:
+               op = op_table[BPF_LDX];
+               fmt = "#0x%x";
+               break;
+       case BPF_LDX_B | BPF_MSH:
+               op = op_table[BPF_LDX_B];
+               fmt = "4*([%d]&0xf)";
+               break;
+       case BPF_LD | BPF_MEM:
+               op = op_table[BPF_LD_W];
+               fmt = "M[%d]";
+               break;
+       case BPF_LDX | BPF_MEM:
+               op = op_table[BPF_LDX];
+               fmt = "M[%d]";
+               break;
+       case BPF_ST:
+               op = op_table[BPF_ST];
+               fmt = "M[%d]";
+               break;
+       case BPF_STX:
+               op = op_table[BPF_STX];
+               fmt = "M[%d]";
+               break;
+       case BPF_JMP_JA:
+               op = op_table[BPF_JMP_JA];
+               fmt = "%d";
+               v = n + 1 + bpf.k;
+               break;
+       case BPF_JMP_JGT | BPF_K:
+               op = op_table[BPF_JMP_JGT];
+               fmt = "#0x%x";
+               break;
+       case BPF_JMP_JGE | BPF_K:
+               op = op_table[BPF_JMP_JGE];
+               fmt = "#0x%x";
+               break;
+       case BPF_JMP_JEQ | BPF_K:
+               op = op_table[BPF_JMP_JEQ];
+               fmt = "#0x%x";
+               break;
+       case BPF_JMP_JSET | BPF_K:
+               op = op_table[BPF_JMP_JSET];
+               fmt = "#0x%x";
+               break;
+       case BPF_JMP_JGT | BPF_X:
+               op = op_table[BPF_JMP_JGT];
+               fmt = "x";
+               break;
+       case BPF_JMP_JGE | BPF_X:
+               op = op_table[BPF_JMP_JGE];
+               fmt = "x";
+               break;
+       case BPF_JMP_JEQ | BPF_X:
+               op = op_table[BPF_JMP_JEQ];
+               fmt = "x";
+               break;
+       case BPF_JMP_JSET | BPF_X:
+               op = op_table[BPF_JMP_JSET];
+               fmt = "x";
+               break;
+       case BPF_ALU_ADD | BPF_X:
+               op = op_table[BPF_ALU_ADD];
+               fmt = "x";
+               break;
+       case BPF_ALU_SUB | BPF_X:
+               op = op_table[BPF_ALU_SUB];
+               fmt = "x";
+               break;
+       case BPF_ALU_MUL | BPF_X:
+               op = op_table[BPF_ALU_MUL];
+               fmt = "x";
+               break;
+       case BPF_ALU_DIV | BPF_X:
+               op = op_table[BPF_ALU_DIV];
+               fmt = "x";
+               break;
+       case BPF_ALU_MOD | BPF_X:
+               op = op_table[BPF_ALU_MOD];
+               fmt = "x";
+               break;
+       case BPF_ALU_AND | BPF_X:
+               op = op_table[BPF_ALU_AND];
+               fmt = "x";
+               break;
+       case BPF_ALU_OR | BPF_X:
+               op = op_table[BPF_ALU_OR];
+               fmt = "x";
+               break;
+       case BPF_ALU_XOR | BPF_X:
+               op = op_table[BPF_ALU_XOR];
+               fmt = "x";
+               break;
+       case BPF_ALU_LSH | BPF_X:
+               op = op_table[BPF_ALU_LSH];
+               fmt = "x";
+               break;
+       case BPF_ALU_RSH | BPF_X:
+               op = op_table[BPF_ALU_RSH];
+               fmt = "x";
+               break;
+       case BPF_ALU_ADD | BPF_K:
+               op = op_table[BPF_ALU_ADD];
+               fmt = "#%d";
+               break;
+       case BPF_ALU_SUB | BPF_K:
+               op = op_table[BPF_ALU_SUB];
+               fmt = "#%d";
+               break;
+       case BPF_ALU_MUL | BPF_K:
+               op = op_table[BPF_ALU_MUL];
+               fmt = "#%d";
+               break;
+       case BPF_ALU_DIV | BPF_K:
+               op = op_table[BPF_ALU_DIV];
+               fmt = "#%d";
+               break;
+       case BPF_ALU_MOD | BPF_K:
+               op = op_table[BPF_ALU_MOD];
+               fmt = "#%d";
+               break;
+       case BPF_ALU_AND | BPF_K:
+               op = op_table[BPF_ALU_AND];
+               fmt = "#0x%x";
+               break;
+       case BPF_ALU_OR | BPF_K:
+               op = op_table[BPF_ALU_OR];
+               fmt = "#0x%x";
+               break;
+       case BPF_ALU_XOR | BPF_K:
+               op = op_table[BPF_ALU_XOR];
+               fmt = "#0x%x";
+               break;
+       case BPF_ALU_LSH | BPF_K:
+               op = op_table[BPF_ALU_LSH];
+               fmt = "#%d";
+               break;
+       case BPF_ALU_RSH | BPF_K:
+               op = op_table[BPF_ALU_RSH];
+               fmt = "#%d";
+               break;
+       case BPF_ALU_NEG:
+               op = op_table[BPF_ALU_NEG];
+               fmt = "";
+               break;
+       case BPF_MISC_TAX:
+               op = op_table[BPF_MISC_TAX];
+               fmt = "";
+               break;
+       case BPF_MISC_TXA:
+               op = op_table[BPF_MISC_TXA];
+               fmt = "";
+               break;
+       }
+
+       slprintf_nocheck(operand, sizeof(operand), fmt, v);
+       slprintf_nocheck(image, sizeof(image),
+                        (BPF_CLASS(bpf.code) == BPF_JMP &&
+                         BPF_OP(bpf.code) != BPF_JA) ?
+                        " L%d: %s %s, L%d, L%d" : " L%d: %s %s",
+                        n, op, operand, n + 1 + bpf.jt, n + 1 + bpf.jf);
+       return image;
+}
+
+void bpf_dump_all(struct sock_fprog *bpf)
+{
+       int i;
+       for (i = 0; i < bpf->len; ++i)
+               printf("%s\n", __bpf_dump(bpf->filter[i], i));
+}
+
+void bpf_attach_to_sock(int sock, struct sock_fprog *bpf)
+{
+       int ret;
+
+       if (bpf->filter[0].code == BPF_RET &&
+           bpf->filter[0].k == 0xFFFFFFFF)
+               return;
+
+       ret = setsockopt(sock, SOL_SOCKET, SO_ATTACH_FILTER,
+                        bpf, sizeof(*bpf));
+       if (ret < 0)
+               panic("Cannot attach filter to socket!\n");
+}
+
+void bpf_detach_from_sock(int sock)
+{
+       int ret, empty = 0;
+
+       ret = setsockopt(sock, SOL_SOCKET, SO_DETACH_FILTER,
+                        &empty, sizeof(empty));
+       if (ret < 0)
+               panic("Cannot detach filter from socket!\n");
+}
+
+int enable_kernel_bpf_jit_compiler(void)
+{
+       int fd;
+       ssize_t ret;
+       char *file = "/proc/sys/net/core/bpf_jit_enable";
+
+       fd = open(file, O_WRONLY);
+       if (fd < 0)
+               return -1;
+
+       ret = write(fd, "1", strlen("1"));
+
+       close(fd);
+       return ret;
+}
+
+int __bpf_validate(const struct sock_fprog *bpf)
+{
+       uint32_t i, from;
+       const struct sock_filter *p;
+
+       if (!bpf)
+               return 0;
+       if (bpf->len < 1)
+               return 0;
+
+       for (i = 0; i < bpf->len; ++i) {
+               p = &bpf->filter[i];
+               switch (BPF_CLASS(p->code)) {
+                       /* Check that memory operations use valid addresses. */
+               case BPF_LD:
+               case BPF_LDX:
+                       switch (BPF_MODE(p->code)) {
+                       case BPF_IMM:
+                               break;
+                       case BPF_ABS:
+                       case BPF_IND:
+                       case BPF_MSH:
+                               /* There's no maximum packet data size
+                                * in userland.  The runtime packet length
+                                * check suffices.
+                                */
+                               break;
+                       case BPF_MEM:
+                               if (p->k >= BPF_MEMWORDS)
+                                       return 0;
+                               break;
+                       case BPF_LEN:
+                               break;
+                       default:
+                               return 0;
+                       }
+                       break;
+               case BPF_ST:
+               case BPF_STX:
+                       if (p->k >= BPF_MEMWORDS)
+                               return 0;
+                       break;
+               case BPF_ALU:
+                       switch (BPF_OP(p->code)) {
+                       case BPF_ADD:
+                       case BPF_SUB:
+                       case BPF_MUL:
+                       case BPF_OR:
+                       case BPF_XOR:
+                       case BPF_AND:
+                       case BPF_LSH:
+                       case BPF_RSH:
+                       case BPF_NEG:
+                               break;
+                       case BPF_DIV:
+                       case BPF_MOD:
+                               /* Check for constant division by 0 (undefined
+                                * for div and mod).
+                                */
+                               if (BPF_RVAL(p->code) == BPF_K && p->k == 0)
+                                       return 0;
+                               break;
+                       default:
+                               return 0;
+                       }
+                       break;
+               case BPF_JMP:
+                       /* Check that jumps are within the code block,
+                        * and that unconditional branches don't go
+                        * backwards as a result of an overflow.
+                        * Unconditional branches have a 32-bit offset,
+                        * so they could overflow; we check to make
+                        * sure they don't.  Conditional branches have
+                        * an 8-bit offset, and the from address is <=
+                        * BPF_MAXINSNS, and we assume that BPF_MAXINSNS
+                        * is sufficiently small that adding 255 to it
+                        * won't overflow.
+                        *
+                        * We know that len is <= BPF_MAXINSNS, and we
+                        * assume that BPF_MAXINSNS is < the maximum size
+                        * of a u_int, so that i + 1 doesn't overflow.
+                        *
+                        * For userland, we don't know that the from
+                        * or len are <= BPF_MAXINSNS, but we know that
+                        * from <= len, and, except on a 64-bit system,
+                        * it's unlikely that len, if it truly reflects
+                        * the size of the program we've been handed,
+                        * will be anywhere near the maximum size of
+                        * a u_int.  We also don't check for backward
+                        * branches, as we currently support them in
+                        * userland for the protochain operation.
+                        */
+                       from = i + 1;
+                       switch (BPF_OP(p->code)) {
+                       case BPF_JA:
+                               if (from + p->k >= bpf->len)
+                                       return 0;
+                               break;
+                       case BPF_JEQ:
+                       case BPF_JGT:
+                       case BPF_JGE:
+                       case BPF_JSET:
+                               if (from + p->jt >= bpf->len ||
+                                   from + p->jf >= bpf->len)
+                                       return 0;
+                               break;
+                       default:
+                               return 0;
+                       }
+                       break;
+               case BPF_RET:
+                       break;
+               case BPF_MISC:
+                       break;
+               default:
+                       return 0;
+               }
+       }
+
+       return BPF_CLASS(bpf->filter[bpf->len - 1].code) == BPF_RET;
+}
+
+uint32_t bpf_run_filter(const struct sock_fprog * fcode, uint8_t * packet,
+                       size_t plen)
+{
+       /* XXX: caplen == len */
+       uint32_t A, X;
+       uint32_t k;
+       struct sock_filter *bpf;
+       int32_t mem[BPF_MEMWORDS] = { 0, };
+
+       if (fcode == NULL || fcode->filter == NULL || fcode->len == 0)
+               return 0xFFFFFFFF;
+
+       A = 0;
+       X = 0;
+
+       bpf = fcode->filter;
+       --bpf;
+       while (1) {
+               ++bpf;
+               switch (bpf->code) {
+               default:
+                       return 0;
+               case BPF_RET | BPF_K:
+                       return (uint32_t) bpf->k;
+               case BPF_RET | BPF_A:
+                       return (uint32_t) A;
+               case BPF_LD_W | BPF_ABS:
+                       /* No Linux extensions supported here! */
+                       k = bpf->k;
+                       if (k + sizeof(int32_t) > plen)
+                               return 0;
+                       A = EXTRACT_LONG(&packet[k]);
+                       continue;
+               case BPF_LD_H | BPF_ABS:
+                       /* No Linux extensions supported here! */
+                       k = bpf->k;
+                       if (k + sizeof(short) > plen)
+                               return 0;
+                       A = EXTRACT_SHORT(&packet[k]);
+                       continue;
+               case BPF_LD_B | BPF_ABS:
+                       /* No Linux extensions supported here! */
+                       k = bpf->k;
+                       if (k >= plen)
+                               return 0;
+                       A = packet[k];
+                       continue;
+               case BPF_LD_W | BPF_LEN:
+                       A = plen;
+                       continue;
+               case BPF_LDX_W | BPF_LEN:
+                       X = plen;
+                       continue;
+               case BPF_LD_W | BPF_IND:
+                       k = X + bpf->k;
+                       if (k + sizeof(int32_t) > plen)
+                               return 0;
+                       A = EXTRACT_LONG(&packet[k]);
+                       continue;
+               case BPF_LD_H | BPF_IND:
+                       k = X + bpf->k;
+                       if (k + sizeof(short) > plen)
+                               return 0;
+                       A = EXTRACT_SHORT(&packet[k]);
+                       continue;
+               case BPF_LD_B | BPF_IND:
+                       k = X + bpf->k;
+                       if (k >= plen)
+                               return 0;
+                       A = packet[k];
+                       continue;
+               case BPF_LDX_B | BPF_MSH:
+                       k = bpf->k;
+                       if (k >= plen)
+                               return 0;
+                       X = (packet[bpf->k] & 0xf) << 2;
+                       continue;
+               case BPF_LD | BPF_IMM:
+                       A = bpf->k;
+                       continue;
+               case BPF_LDX | BPF_IMM:
+                       X = bpf->k;
+                       continue;
+               case BPF_LD | BPF_MEM:
+                       A = mem[bpf->k];
+                       continue;
+               case BPF_LDX | BPF_MEM:
+                       X = mem[bpf->k];
+                       continue;
+               case BPF_ST:
+                       mem[bpf->k] = A;
+                       continue;
+               case BPF_STX:
+                       mem[bpf->k] = X;
+                       continue;
+               case BPF_JMP_JA:
+                       bpf += bpf->k;
+                       continue;
+               case BPF_JMP_JGT | BPF_K:
+                       bpf += (A > bpf->k) ? bpf->jt : bpf->jf;
+                       continue;
+               case BPF_JMP_JGE | BPF_K:
+                       bpf += (A >= bpf->k) ? bpf->jt : bpf->jf;
+                       continue;
+               case BPF_JMP_JEQ | BPF_K:
+                       bpf += (A == bpf->k) ? bpf->jt : bpf->jf;
+                       continue;
+               case BPF_JMP_JSET | BPF_K:
+                       bpf += (A & bpf->k) ? bpf->jt : bpf->jf;
+                       continue;
+               case BPF_JMP_JGT | BPF_X:
+                       bpf += (A > X) ? bpf->jt : bpf->jf;
+                       continue;
+               case BPF_JMP_JGE | BPF_X:
+                       bpf += (A >= X) ? bpf->jt : bpf->jf;
+                       continue;
+               case BPF_JMP_JEQ | BPF_X:
+                       bpf += (A == X) ? bpf->jt : bpf->jf;
+                       continue;
+               case BPF_JMP_JSET | BPF_X:
+                       bpf += (A & X) ? bpf->jt : bpf->jf;
+                       continue;
+               case BPF_ALU_ADD | BPF_X:
+                       A += X;
+                       continue;
+               case BPF_ALU_SUB | BPF_X:
+                       A -= X;
+                       continue;
+               case BPF_ALU_MUL | BPF_X:
+                       A *= X;
+                       continue;
+               case BPF_ALU_DIV | BPF_X:
+                       if (X == 0)
+                               return 0;
+                       A /= X;
+                       continue;
+               case BPF_ALU_MOD | BPF_X:
+                       if (X == 0)
+                               return 0;
+                       A %= X;
+                       continue;
+               case BPF_ALU_AND | BPF_X:
+                       A &= X;
+                       continue;
+               case BPF_ALU_OR | BPF_X:
+                       A |= X;
+                       continue;
+               case BPF_ALU_XOR | BPF_X:
+                       A ^= X;
+                       continue;
+               case BPF_ALU_LSH | BPF_X:
+                       A <<= X;
+                       continue;
+               case BPF_ALU_RSH | BPF_X:
+                       A >>= X;
+                       continue;
+               case BPF_ALU_ADD | BPF_K:
+                       A += bpf->k;
+                       continue;
+               case BPF_ALU_SUB | BPF_K:
+                       A -= bpf->k;
+                       continue;
+               case BPF_ALU_MUL | BPF_K:
+                       A *= bpf->k;
+                       continue;
+               case BPF_ALU_DIV | BPF_K:
+                       A /= bpf->k;
+                       continue;
+               case BPF_ALU_MOD | BPF_K:
+                       A %= bpf->k;
+                       continue;
+               case BPF_ALU_AND | BPF_K:
+                       A &= bpf->k;
+                       continue;
+               case BPF_ALU_OR | BPF_K:
+                       A |= bpf->k;
+                       continue;
+               case BPF_ALU_XOR | BPF_K:
+                       A ^= bpf->k;
+                       continue;
+               case BPF_ALU_LSH | BPF_K:
+                       A <<= bpf->k;
+                       continue;
+               case BPF_ALU_RSH | BPF_K:
+                       A >>= bpf->k;
+                       continue;
+               case BPF_ALU_NEG:
+                       A = -A;
+                       continue;
+               case BPF_MISC_TAX:
+                       X = A;
+                       continue;
+               case BPF_MISC_TXA:
+                       A = X;
+                       continue;
+               }
+       }
+}
+
+void bpf_parse_rules(char *rulefile, struct sock_fprog *bpf, uint32_t link_type)
+{
+       int ret;
+       char buff[256];
+       struct sock_filter sf_single = { 0x06, 0, 0, 0xFFFFFFFF };
+       FILE *fp;
+
+       if (rulefile == NULL) {
+               bpf->len = 1;
+               bpf->filter = xmalloc(sizeof(sf_single));
+               fmemcpy(&bpf->filter[0], &sf_single, sizeof(sf_single));
+               return;
+       }
+
+       fp = fopen(rulefile, "r");
+       if (!fp) {
+               bpf_try_compile(rulefile, bpf, link_type);
+               return;
+       }
+
+       fmemset(buff, 0, sizeof(buff));
+       while (fgets(buff, sizeof(buff), fp) != NULL) {
+               buff[sizeof(buff) - 1] = 0;
+               if (buff[0] != '{') {
+                       fmemset(buff, 0, sizeof(buff));
+                       continue;
+               }
+
+               fmemset(&sf_single, 0, sizeof(sf_single));
+               ret = sscanf(buff, "{ 0x%x, %u, %u, 0x%08x },",
+                            (unsigned int *) &sf_single.code,
+                            (unsigned int *) &sf_single.jt,
+                            (unsigned int *) &sf_single.jf,
+                            (unsigned int *) &sf_single.k);
+               if (ret != 4)
+                       panic("BPF syntax error!\n");
+
+               bpf->len++;
+               bpf->filter = xrealloc(bpf->filter, 1,
+                                      bpf->len * sizeof(sf_single));
+
+               fmemcpy(&bpf->filter[bpf->len - 1], &sf_single,
+                      sizeof(sf_single));
+               fmemset(buff, 0, sizeof(buff));
+       }
+
+       fclose(fp);
+
+       if (__bpf_validate(bpf) == 0)
+               panic("This is not a valid BPF program!\n");
+}
diff --git a/bpf.h b/bpf.h
new file mode 100644 (file)
index 0000000..84cf0b8
--- /dev/null
+++ b/bpf.h
@@ -0,0 +1,135 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef BPF_I_H
+#define BPF_I_H
+
+#include <linux/filter.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#include "xmalloc.h"
+
+extern void bpf_dump_op_table(void);
+extern void bpf_dump_all(struct sock_fprog *bpf);
+extern int __bpf_validate(const struct sock_fprog *bpf);
+extern uint32_t bpf_run_filter(const struct sock_fprog *bpf, uint8_t *packet,
+                              size_t plen);
+extern void bpf_attach_to_sock(int sock, struct sock_fprog *bpf);
+extern void bpf_detach_from_sock(int sock);
+extern int enable_kernel_bpf_jit_compiler(void);
+extern void bpf_parse_rules(char *rulefile, struct sock_fprog *bpf, uint32_t link_type);
+#ifdef __WITH_TCPDUMP_LIKE_FILTER
+extern void bpf_try_compile(const char *rulefile, struct sock_fprog *bpf,
+                           uint32_t link_type);
+#else
+static inline void bpf_try_compile(const char *rulefile, struct sock_fprog *bpf,
+                                  uint32_t link_type)
+{
+       panic("Cannot open file %s!\n", rulefile);
+}
+#endif
+
+static inline void bpf_release(struct sock_fprog *bpf)
+{
+       free(bpf->filter);
+}
+
+#define BPF_CLASS(code) ((code) & 0x07)
+#define        BPF_LD          0x00
+#define        BPF_LDX         0x01
+#define        BPF_ST          0x02
+#define        BPF_STX         0x03
+#define        BPF_ALU         0x04
+#define        BPF_JMP         0x05
+#define        BPF_RET         0x06
+#define        BPF_MISC        0x07
+
+#define BPF_SIZE(code) ((code) & 0x18)
+#define        BPF_W           0x00
+#define        BPF_H           0x08
+#define        BPF_B           0x10
+
+#define BPF_MODE(code) ((code) & 0xe0)
+#define        BPF_IMM         0x00
+#define        BPF_ABS         0x20
+#define        BPF_IND         0x40
+#define        BPF_MEM         0x60
+#define        BPF_LEN         0x80
+#define        BPF_MSH         0xa0
+
+#define BPF_OP(code)   ((code) & 0xf0)
+#define        BPF_ADD         0x00
+#define        BPF_SUB         0x10
+#define        BPF_MUL         0x20
+#define        BPF_DIV         0x30
+#define        BPF_OR          0x40
+#define        BPF_AND         0x50
+#define        BPF_LSH         0x60
+#define        BPF_RSH         0x70
+#define        BPF_NEG         0x80
+#define BPF_MOD                0x90
+#define        BPF_XOR         0xa0
+
+#define        BPF_JA          0x00
+#define        BPF_JEQ         0x10
+#define        BPF_JGT         0x20
+#define        BPF_JGE         0x30
+#define        BPF_JSET        0x40
+
+#define BPF_SRC(code)  ((code) & 0x08)
+#define        BPF_K           0x00
+#define        BPF_X           0x08
+
+/* ret - BPF_K and BPF_X also apply */
+#define BPF_RVAL(code) ((code) & 0x18)
+#define        BPF_A           0x10
+
+#define BPF_MISCOP(code) ((code) & 0xf8)
+#define        BPF_TAX         0x00
+#define        BPF_TXA         0x80
+
+#ifndef SKF_AD_OFF
+# define SKF_AD_OFF                    (-0x1000)
+#endif
+#ifndef SKF_AD_PROTOCOL
+# define SKF_AD_PROTOCOL               0
+#endif
+#ifndef SKF_AD_PKTTYPE
+# define SKF_AD_PKTTYPE                        4
+#endif
+#ifndef SKF_AD_IFINDEX
+# define SKF_AD_IFINDEX                        8
+#endif
+#ifndef SKF_AD_NLATTR
+# define SKF_AD_NLATTR                 12
+#endif
+#ifndef SKF_AD_NLATTR_NEST
+# define SKF_AD_NLATTR_NEST            16
+#endif
+#ifndef SKF_AD_MARK
+# define SKF_AD_MARK                   20
+#endif
+#ifndef SKF_AD_QUEUE
+# define SKF_AD_QUEUE                  24
+#endif
+#ifndef SKF_AD_HATYPE
+# define SKF_AD_HATYPE                 28
+#endif
+#ifndef SKF_AD_RXHASH
+# define SKF_AD_RXHASH                 32
+#endif
+#ifndef SKF_AD_CPU
+# define SKF_AD_CPU                    36
+#endif
+#ifndef SKF_AD_VLAN_TAG
+# define SKF_AD_VLAN_TAG               44
+#endif
+#ifndef SKF_AD_VLAN_TAG_PRESENT
+# define SKF_AD_VLAN_TAG_PRESENT       48
+#endif
+
+#endif /* BPF_I_H */
diff --git a/bpf_comp.c b/bpf_comp.c
new file mode 100644 (file)
index 0000000..27f7a00
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2013 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#include <pcap.h>
+#include <linux/filter.h>
+
+#include "xmalloc.h"
+#include "bpf.h"
+#include "die.h"
+
+void bpf_try_compile(const char *rulefile, struct sock_fprog *bpf, uint32_t link_type)
+{
+       int i, ret;
+       const struct bpf_insn *ins;
+       struct sock_filter *out;
+       struct bpf_program _bpf;
+
+       ret = pcap_compile_nopcap(65535, link_type, &_bpf, rulefile, 1, 0xffffffff);
+       if (ret < 0)
+               panic("Cannot compile filter %s\n", rulefile);
+
+       bpf->len = _bpf.bf_len;
+       bpf->filter = xrealloc(bpf->filter, 1, bpf->len * sizeof(*out));
+
+       for (i = 0, ins = _bpf.bf_insns, out = bpf->filter; i < bpf->len; ++i, ++ins, ++out) {
+
+               out->code = ins->code;
+               out->jt = ins->jt;
+               out->jf = ins->jf;
+               out->k = ins->k;
+
+               if (out->code == 0x06 && out->k > 0)
+                       out->k = 0xFFFFFFFF;
+       }
+
+       pcap_freecode(&_bpf);
+
+       if (__bpf_validate(bpf) == 0)
+               panic("This is not a valid BPF program!\n");
+}
diff --git a/bpf_lexer.l b/bpf_lexer.l
new file mode 100644 (file)
index 0000000..d4b6947
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * By Daniel Borkmann <daniel@netsniff-ng.org>
+ * Copyright 2012 Daniel Borkmann <dborkma@tik.ee.ethz.ch>,
+ * Swiss federal institute of technology (ETH Zurich)
+ * Subject to the GPL, version 2.
+ */
+
+/* lex-func-prefix: yy */
+
+%{
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "bpf_parser.tab.h"
+#include "xmalloc.h"
+
+extern void yyerror(const char *);
+
+%}
+
+%option align
+%option nounput
+%option noyywrap
+%option noreject
+%option 8bit
+%option caseless
+%option noinput
+%option nodefault
+
+number_oct     ([0][0-9]+)
+number_hex     ([0][x][a-fA-F0-9]+)
+number_bin     ([0][b][0-1]+)
+number_dec     (([0])|([-+]?[1-9][0-9]*))
+
+label          [a-zA-Z_][a-zA-Z0-9_]+
+
+%%
+
+"ldb"          { return OP_LDB; }
+"ldh"          { return OP_LDH; }
+"ld"           { return OP_LD; }
+"ldi"          { return OP_LDI; }
+"ldx"          { return OP_LDX; }
+"ldxi"         { return OP_LDXI; }
+"ldxb"         { return OP_LDXB; }
+"st"           { return OP_ST; }
+"stx"          { return OP_STX; }
+"jmp"|"ja"     { return OP_JMP; }
+"jeq"          { return OP_JEQ; }
+"jneq"|"jne"   { return OP_JNEQ; }
+"jlt"          { return OP_JLT; }
+"jle"          { return OP_JLE; }
+"jgt"          { return OP_JGT; }
+"jge"          { return OP_JGE; }
+"jset"         { return OP_JSET; }
+"add"          { return OP_ADD; }
+"sub"          { return OP_SUB; }
+"mul"          { return OP_MUL; }
+"div"          { return OP_DIV; }
+"mod"          { return OP_MOD; }
+"neg"          { return OP_NEG; }
+"and"          { return OP_AND; }
+"xor"          { return OP_XOR; }
+"or"           { return OP_OR; }
+"lsh"          { return OP_LSH; }
+"rsh"          { return OP_RSH; }
+"ret"          { return OP_RET; }
+"tax"          { return OP_TAX; }
+"txa"          { return OP_TXA; }
+
+"#"?("len"|"pktlen")   { return K_PKT_LEN; }
+"#"?("pto"|"proto")    { return K_PROTO; }
+"#"?("type")           { return K_TYPE; }
+"#"?("ifx"|"ifidx")    { return K_IFIDX; }
+"#"?("nla")            { return K_NLATTR; }
+"#"?("nlan")           { return K_NLATTR_NEST; }
+"#"?("mark")           { return K_MARK; }
+"#"?("que"|"queue"|"Q")        { return K_QUEUE; }
+"#"?("hat"|"hatype")   { return K_HATYPE; }
+"#"?("rxh"|"rxhash")   { return K_RXHASH; }
+"#"?("cpu")            { return K_CPU; }
+"#"?("vlant"|"vlan_tci") { return K_VLANT; }
+"#"?("vlana"|"vlan_acc") { return K_VLANP; }
+"#"?("vlanp")           { return K_VLANP; }
+
+":"            { return ':'; }
+","            { return ','; }
+"#"            { return '#'; }
+"["            { return '['; }
+"]"            { return ']'; }
+"("            { return '('; }
+")"            { return ')'; }
+"x"            { return 'x'; }
+"a"            { return 'a'; }
+"+"            { return '+'; }
+"M"            { return 'M'; }
+"*"            { return '*'; }
+"&"            { return '&'; }
+
+{number_hex}   { yylval.number = strtoul(yytext, NULL, 16);
+                 return number; }
+
+{number_oct}   { yylval.number = strtol(yytext + 1, NULL, 8);
+                 return number; }
+
+{number_bin}   { yylval.number = strtol(yytext + 2, NULL, 2);
+                 return number; }
+
+{number_dec}   { yylval.number = strtol(yytext, NULL, 10);
+                 return number; }
+
+{label}                { yylval.label = xstrdup(yytext);
+                 return label; }
+
+"/*"([^\*]|\*[^/])*"*/" { /* NOP */ }
+";"[^\n]*      {/* NOP */}
+"\n"           { yylineno++; }
+[ \t]+         {/* NOP */ }
+.              { printf("Unknown character '%s'", yytext);
+                 yyerror("lex Unknown character"); }
+
+%%
diff --git a/bpf_parser.y b/bpf_parser.y
new file mode 100644 (file)
index 0000000..4c35e07
--- /dev/null
@@ -0,0 +1,673 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * By Daniel Borkmann <daniel@netsniff-ng.org>
+ * Copyright 2011 Daniel Borkmann <dborkma@tik.ee.ethz.ch>,
+ * Swiss federal institute of technology (ETH Zurich)
+ * Subject to the GPL, version 2.
+ */
+
+/* yaac-func-prefix: yy */
+
+%{
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <signal.h>
+#include <stdint.h>
+#include <errno.h>
+
+#include "bpf.h"
+#include "xmalloc.h"
+#include "bpf_parser.tab.h"
+#include "built_in.h"
+#include "die.h"
+
+#define MAX_INSTRUCTIONS       4096
+
+int compile_filter(char *file, int verbose, int bypass, int decimal);
+
+static int curr_instr = 0;
+
+static struct sock_filter out[MAX_INSTRUCTIONS];
+
+static char *labels[MAX_INSTRUCTIONS];
+
+static char *labels_jt[MAX_INSTRUCTIONS];
+static char *labels_jf[MAX_INSTRUCTIONS];
+static char *labels_k[MAX_INSTRUCTIONS];
+
+#define YYERROR_VERBOSE                0
+#define YYDEBUG                        0
+#define YYENABLE_NLS           1
+#define YYLTYPE_IS_TRIVIAL     1
+#define ENABLE_NLS             1
+
+extern FILE *yyin;
+extern int yylex(void);
+extern void yyerror(const char *);
+extern int yylineno;
+extern char *yytext;
+
+static inline void check_max_instr(void)
+{
+       if (curr_instr >= MAX_INSTRUCTIONS)
+               panic("Exceeded maximal number of instructions!\n");
+}
+
+static inline void set_curr_instr(uint16_t code, uint8_t jt, uint8_t jf, uint32_t k)
+{
+       check_max_instr();
+
+       out[curr_instr].code = code;
+       out[curr_instr].jt = jt;
+       out[curr_instr].jf = jf;
+       out[curr_instr].k = k;
+
+       curr_instr++;
+}
+
+static inline void set_curr_label(char *label)
+{
+       check_max_instr();
+
+       labels[curr_instr] = label;
+}
+
+#define JTL            1
+#define JFL            2
+#define JKL            3
+
+static inline void set_jmp_label(char *label, int which)
+{
+       check_max_instr();
+
+       switch (which) {
+       case JTL:
+               labels_jt[curr_instr] = label;
+               break;
+       case JFL:
+               labels_jf[curr_instr] = label;
+               break;
+       case JKL:
+               labels_k[curr_instr] = label;
+               break;
+       default:
+               bug();
+       }
+}
+
+static int find_intr_offset_or_panic(char *label_to_search)
+{
+       int i, max = curr_instr, ret = -ENOENT;
+
+       bug_on(!label_to_search);
+
+       for (i = 0; i < max; ++i) {
+               if (labels[i] != NULL) {
+                       /* Both are \0-terminated! */
+                       if (!strcmp(label_to_search, labels[i])) {
+                               ret = i;
+                               break;
+                       }
+               }
+       }
+
+       if (ret == -ENOENT)
+               panic("No such label!\n");
+
+       return ret;
+}
+
+%}
+
+%union {
+       char *label;
+       long int number;
+}
+
+%token OP_LDB OP_LDH OP_LD OP_LDX OP_ST OP_STX OP_JMP OP_JEQ OP_JGT OP_JGE
+%token OP_JSET OP_ADD OP_SUB OP_MUL OP_DIV OP_AND OP_OR OP_XOR OP_LSH OP_RSH
+%token OP_RET OP_TAX OP_TXA OP_LDXB OP_MOD OP_NEG OP_JNEQ OP_JLT OP_JLE OP_LDI
+%token OP_LDXI
+
+%token K_PKT_LEN K_PROTO K_TYPE K_NLATTR K_NLATTR_NEST K_MARK K_QUEUE K_HATYPE
+%token K_RXHASH K_CPU K_IFIDX K_VLANT K_VLANP
+
+%token ':' ',' '[' ']' '(' ')' 'x' 'a' '+' 'M' '*' '&' '#'
+
+%token number label
+
+%type <number> number
+%type <label> label
+
+%%
+
+prog
+       : line
+       | prog line
+       ;
+
+line
+       : instr
+       | labelled_instr
+       ;
+
+labelled_instr
+       : labelled instr
+       ;
+
+instr
+       : ldb
+       | ldh
+       | ld
+       | ldi
+       | ldx
+       | ldxi
+       | st
+       | stx
+       | jmp
+       | jeq
+       | jneq
+       | jlt
+       | jle
+       | jgt
+       | jge
+       | jset
+       | add
+       | sub
+       | mul
+       | div
+       | mod
+       | neg
+       | and
+       | or
+       | xor
+       | lsh
+       | rsh
+       | ret
+       | tax
+       | txa
+       ;
+
+labelled
+       : label ':' { set_curr_label($1); }
+       ;
+
+ldb
+       : OP_LDB '[' 'x' '+' number ']' {
+               set_curr_instr(BPF_LD | BPF_B | BPF_IND, 0, 0, $5); }
+       | OP_LDB '[' number ']' {
+               set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, $3); }
+       | OP_LDB K_PROTO {
+               set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_PROTOCOL); }
+       | OP_LDB K_TYPE {
+               set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_PKTTYPE); }
+       | OP_LDB K_IFIDX {
+               set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_IFINDEX); }
+       | OP_LDB K_NLATTR {
+               set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_NLATTR); }
+       | OP_LDB K_NLATTR_NEST {
+               set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_NLATTR_NEST); }
+       | OP_LDB K_MARK {
+               set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_MARK); }
+       | OP_LDB K_QUEUE {
+               set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_QUEUE); }
+       | OP_LDB K_HATYPE {
+               set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_HATYPE); }
+       | OP_LDB K_RXHASH {
+               set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_RXHASH); }
+       | OP_LDB K_CPU {
+               set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_CPU); }
+       | OP_LDB K_VLANT {
+               set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_VLAN_TAG); }
+       | OP_LDB K_VLANP {
+               set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT); }
+       ;
+
+ldh
+       : OP_LDH '[' 'x' '+' number ']' {
+               set_curr_instr(BPF_LD | BPF_H | BPF_IND, 0, 0, $5); }
+       | OP_LDH '[' number ']' {
+               set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, $3); }
+       | OP_LDH K_PROTO {
+               set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_PROTOCOL); }
+       | OP_LDH K_TYPE {
+               set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_PKTTYPE); }
+       | OP_LDH K_IFIDX {
+               set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_IFINDEX); }
+       | OP_LDH K_NLATTR {
+               set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_NLATTR); }
+       | OP_LDH K_NLATTR_NEST {
+               set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_NLATTR_NEST); }
+       | OP_LDH K_MARK {
+               set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_MARK); }
+       | OP_LDH K_QUEUE {
+               set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_QUEUE); }
+       | OP_LDH K_HATYPE {
+               set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_HATYPE); }
+       | OP_LDH K_RXHASH {
+               set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_RXHASH); }
+       | OP_LDH K_CPU {
+               set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_CPU); }
+       | OP_LDH K_VLANT {
+               set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_VLAN_TAG); }
+       | OP_LDH K_VLANP {
+               set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT); }
+       ;
+
+ldi
+       : OP_LDI number {
+               set_curr_instr(BPF_LD | BPF_IMM, 0, 0, $2); }
+       ;
+
+ld
+       : OP_LD '#' number {
+               set_curr_instr(BPF_LD | BPF_IMM, 0, 0, $3); }
+       | OP_LD K_PKT_LEN {
+               set_curr_instr(BPF_LD | BPF_W | BPF_LEN, 0, 0, 0); }
+       | OP_LD K_PROTO {
+               set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_PROTOCOL); }
+       | OP_LD K_TYPE {
+               set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_PKTTYPE); }
+       | OP_LD K_IFIDX {
+               set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_IFINDEX); }
+       | OP_LD K_NLATTR {
+               set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_NLATTR); }
+       | OP_LD K_NLATTR_NEST {
+               set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_NLATTR_NEST); }
+       | OP_LD K_MARK {
+               set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_MARK); }
+       | OP_LD K_QUEUE {
+               set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_QUEUE); }
+       | OP_LD K_HATYPE {
+               set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_HATYPE); }
+       | OP_LD K_RXHASH {
+               set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_RXHASH); }
+       | OP_LD K_CPU {
+               set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_CPU); }
+       | OP_LD K_VLANT {
+               set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_VLAN_TAG); }
+       | OP_LD K_VLANP {
+               set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0,
+                              SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT); }
+       | OP_LD 'M' '[' number ']' {
+               set_curr_instr(BPF_LD | BPF_MEM, 0, 0, $4); }
+       | OP_LD '[' 'x' '+' number ']' {
+               set_curr_instr(BPF_LD | BPF_W | BPF_IND, 0, 0, $5); }
+       | OP_LD '[' number ']' {
+               set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, $3); }
+       ;
+
+ldxi
+       : OP_LDXI number {
+               set_curr_instr(BPF_LDX | BPF_IMM, 0, 0, $2); }
+       ;
+
+ldx
+       : OP_LDX '#' number {
+               set_curr_instr(BPF_LDX | BPF_IMM, 0, 0, $3); }
+       | OP_LDX 'M' '[' number ']' {
+               set_curr_instr(BPF_LDX | BPF_MEM, 0, 0, $4); }
+       | OP_LDXB number '*' '(' '[' number ']' '&' number ')' {
+               if ($2 != 4 || $9 != 0xf) {
+                       panic("ldxb offset not supported!\n");
+               } else {
+                       set_curr_instr(BPF_LDX | BPF_MSH | BPF_B, 0, 0, $6); } }
+       | OP_LDX number '*' '(' '[' number ']' '&' number ')' {
+               if ($2 != 4 || $9 != 0xf) {
+                       panic("ldxb offset not supported!\n");
+               } else {
+                       set_curr_instr(BPF_LDX | BPF_MSH | BPF_B, 0, 0, $6); } }
+       ;
+
+st
+       : OP_ST 'M' '[' number ']' {
+               set_curr_instr(BPF_ST, 0, 0, $4); }
+       ;
+
+stx
+       : OP_STX 'M' '[' number ']' {
+               set_curr_instr(BPF_STX, 0, 0, $4); }
+       ;
+
+jmp
+       : OP_JMP label {
+               set_jmp_label($2, JKL);
+               set_curr_instr(BPF_JMP | BPF_JA, 0, 0, 0); }
+       ;
+
+jeq
+       : OP_JEQ '#' number ',' label ',' label {
+               set_jmp_label($5, JTL);
+               set_jmp_label($7, JFL);
+               set_curr_instr(BPF_JMP | BPF_JEQ | BPF_K, 0, 0, $3); }
+       | OP_JEQ 'x' ',' label ',' label {
+               set_jmp_label($4, JTL);
+               set_jmp_label($6, JFL);
+               set_curr_instr(BPF_JMP | BPF_JEQ | BPF_X, 0, 0, 0); }
+       | OP_JEQ '#' number ',' label {
+               set_jmp_label($5, JTL);
+               set_curr_instr(BPF_JMP | BPF_JEQ | BPF_K, 0, 0, $3); }
+       | OP_JEQ 'x' ',' label {
+               set_jmp_label($4, JTL);
+               set_curr_instr(BPF_JMP | BPF_JEQ | BPF_X, 0, 0, 0); }
+       ;
+
+jneq
+       : OP_JNEQ '#' number ',' label {
+               set_jmp_label($5, JFL);
+               set_curr_instr(BPF_JMP | BPF_JEQ | BPF_K, 0, 0, $3); }
+       | OP_JNEQ 'x' ',' label {
+               set_jmp_label($4, JFL);
+               set_curr_instr(BPF_JMP | BPF_JEQ | BPF_X, 0, 0, 0); }
+       ;
+
+jlt
+       : OP_JLT '#' number ',' label {
+               set_jmp_label($5, JFL);
+               set_curr_instr(BPF_JMP | BPF_JGE | BPF_K, 0, 0, $3); }  
+       | OP_JLT 'x' ',' label {
+               set_jmp_label($4, JFL);
+               set_curr_instr(BPF_JMP | BPF_JGE | BPF_X, 0, 0, 0); }
+       ;
+
+jle
+       : OP_JLE '#' number ',' label {
+               set_jmp_label($5, JFL);
+               set_curr_instr(BPF_JMP | BPF_JGT | BPF_K, 0, 0, $3); }  
+       | OP_JLE 'x' ',' label {
+               set_jmp_label($4, JFL);
+               set_curr_instr(BPF_JMP | BPF_JGT | BPF_X, 0, 0, 0); }
+       ;
+
+jgt
+       : OP_JGT '#' number ',' label ',' label {
+               set_jmp_label($5, JTL);
+               set_jmp_label($7, JFL);
+               set_curr_instr(BPF_JMP | BPF_JGT | BPF_K, 0, 0, $3); }  
+       | OP_JGT 'x' ',' label ',' label {
+               set_jmp_label($4, JTL);
+               set_jmp_label($6, JFL);
+               set_curr_instr(BPF_JMP | BPF_JGT | BPF_X, 0, 0, 0); }
+       | OP_JGT '#' number ',' label {
+               set_jmp_label($5, JTL);
+               set_curr_instr(BPF_JMP | BPF_JGT | BPF_K, 0, 0, $3); }  
+       | OP_JGT 'x' ',' label {
+               set_jmp_label($4, JTL);
+               set_curr_instr(BPF_JMP | BPF_JGT | BPF_X, 0, 0, 0); }
+       ;
+
+jge
+       : OP_JGE '#' number ',' label ',' label {
+               set_jmp_label($5, JTL);
+               set_jmp_label($7, JFL);
+               set_curr_instr(BPF_JMP | BPF_JGE | BPF_K, 0, 0, $3); }
+       | OP_JGE 'x' ',' label ',' label {
+               set_jmp_label($4, JTL);
+               set_jmp_label($6, JFL);
+               set_curr_instr(BPF_JMP | BPF_JGE | BPF_X, 0, 0, 0); }
+       | OP_JGE '#' number ',' label {
+               set_jmp_label($5, JTL);
+               set_curr_instr(BPF_JMP | BPF_JGE | BPF_K, 0, 0, $3); }
+       | OP_JGE 'x' ',' label {
+               set_jmp_label($4, JTL);
+               set_curr_instr(BPF_JMP | BPF_JGE | BPF_X, 0, 0, 0); }
+       ;
+
+jset
+       : OP_JSET '#' number ',' label ',' label {
+               set_jmp_label($5, JTL);
+               set_jmp_label($7, JFL);
+               set_curr_instr(BPF_JMP | BPF_JSET | BPF_K, 0, 0, $3); }
+       | OP_JSET 'x' ',' label ',' label {
+               set_jmp_label($4, JTL);
+               set_jmp_label($6, JFL);
+               set_curr_instr(BPF_JMP | BPF_JSET | BPF_X, 0, 0, 0); }
+       | OP_JSET '#' number ',' label {
+               set_jmp_label($5, JTL);
+               set_curr_instr(BPF_JMP | BPF_JSET | BPF_K, 0, 0, $3); }
+       | OP_JSET 'x' ',' label {
+               set_jmp_label($4, JTL);
+               set_curr_instr(BPF_JMP | BPF_JSET | BPF_X, 0, 0, 0); }
+       ;
+
+add
+       : OP_ADD '#' number {
+               set_curr_instr(BPF_ALU | BPF_ADD | BPF_K, 0, 0, $3); }
+       | OP_ADD 'x' {
+               set_curr_instr(BPF_ALU | BPF_ADD | BPF_X, 0, 0, 0); }
+       ;
+
+sub
+       : OP_SUB '#' number {
+               set_curr_instr(BPF_ALU | BPF_SUB | BPF_K, 0, 0, $3); }
+       | OP_SUB 'x' {
+               set_curr_instr(BPF_ALU | BPF_SUB | BPF_X, 0, 0, 0); }
+       ;
+
+mul
+       : OP_MUL '#' number {
+               set_curr_instr(BPF_ALU | BPF_MUL | BPF_K, 0, 0, $3); }
+       | OP_MUL 'x' {
+               set_curr_instr(BPF_ALU | BPF_MUL | BPF_X, 0, 0, 0); }
+       ;
+
+div
+       : OP_DIV '#' number {
+               set_curr_instr(BPF_ALU | BPF_DIV | BPF_K, 0, 0, $3); }
+       | OP_DIV 'x' {
+               set_curr_instr(BPF_ALU | BPF_DIV | BPF_X, 0, 0, 0); }
+       ;
+
+mod
+       : OP_MOD '#' number {
+               set_curr_instr(BPF_ALU | BPF_MOD | BPF_K, 0, 0, $3); }
+       | OP_MOD 'x' {
+               set_curr_instr(BPF_ALU | BPF_MOD | BPF_X, 0, 0, 0); }
+       ;
+
+neg
+       : OP_NEG {
+               set_curr_instr(BPF_ALU | BPF_NEG, 0, 0, 0); }
+       ;
+
+and
+       : OP_AND '#' number {
+               set_curr_instr(BPF_ALU | BPF_AND | BPF_K, 0, 0, $3); }
+       | OP_AND 'x' {
+               set_curr_instr(BPF_ALU | BPF_AND | BPF_X, 0, 0, 0); }
+       ;
+
+or
+       : OP_OR '#' number {
+               set_curr_instr(BPF_ALU | BPF_OR | BPF_K, 0, 0, $3); }
+       | OP_OR 'x' {
+               set_curr_instr(BPF_ALU | BPF_OR | BPF_X, 0, 0, 0); }
+       ;
+
+xor
+       : OP_XOR '#' number {
+               set_curr_instr(BPF_ALU | BPF_XOR | BPF_K, 0, 0, $3); }
+       | OP_XOR 'x' {
+               set_curr_instr(BPF_ALU | BPF_XOR | BPF_X, 0, 0, 0); }
+       ;
+
+lsh
+       : OP_LSH '#' number {
+               set_curr_instr(BPF_ALU | BPF_LSH | BPF_K, 0, 0, $3); }
+       | OP_LSH 'x' {
+               set_curr_instr(BPF_ALU | BPF_LSH | BPF_X, 0, 0, 0); }
+       ;
+
+rsh
+       : OP_RSH '#' number {
+               set_curr_instr(BPF_ALU | BPF_RSH | BPF_K, 0, 0, $3); }
+       | OP_RSH 'x' {
+               set_curr_instr(BPF_ALU | BPF_RSH | BPF_X, 0, 0, 0); }
+       ;
+
+ret
+       : OP_RET 'a' {
+               set_curr_instr(BPF_RET | BPF_A, 0, 0, 0); }
+       | OP_RET 'x' {
+               set_curr_instr(BPF_RET | BPF_X, 0, 0, 0); }
+       | OP_RET '#' number {
+               set_curr_instr(BPF_RET | BPF_K, 0, 0, $3); }
+       ;
+
+tax
+       : OP_TAX {
+               set_curr_instr(BPF_MISC | BPF_TAX, 0, 0, 0); }
+       ;
+
+txa
+       : OP_TXA {
+               set_curr_instr(BPF_MISC | BPF_TXA, 0, 0, 0); }
+       ;
+
+%%
+
+static void stage_1_inline(void)
+{
+       yyparse();
+}
+
+static void stage_2_label_reduce(void)
+{
+       int i, max = curr_instr, off;
+
+       /* 1. reduce k jumps */
+       for (i = 0; i < max; ++i) {
+               if (labels_k[i] != NULL) {
+                       off = find_intr_offset_or_panic(labels_k[i]);
+                       out[i].k = (uint32_t) (off - i - 1);
+               }
+       }
+
+       /* 1. reduce jt jumps */
+       for (i = 0; i < max; ++i) {
+               if (labels_jt[i] != NULL) {
+                       off = find_intr_offset_or_panic(labels_jt[i]);
+                       out[i].jt = (uint8_t) (off - i -1);
+               }
+       }
+
+       /* 1. reduce jf jumps */
+       for (i = 0; i < max; ++i) {
+               if (labels_jf[i] != NULL) {
+                       off = find_intr_offset_or_panic(labels_jf[i]);
+                       out[i].jf = (uint8_t) (off - i - 1);
+               }
+       }
+}
+
+int compile_filter(char *file, int verbose, int bypass, int decimal)
+{
+       int i;
+       struct sock_fprog res;
+
+       if (!strncmp("-", file, strlen("-")))
+               yyin = stdin;
+       else
+               yyin = fopen(file, "r");
+       if (!yyin)
+               panic("Cannot open file!\n");
+
+       memset(out, 0, sizeof(out));
+       memset(labels, 0, sizeof(labels));
+       memset(labels_jf, 0, sizeof(labels_jf));
+       memset(labels_jt, 0, sizeof(labels_jt));
+       memset(labels_k, 0, sizeof(labels_k));
+
+       stage_1_inline();
+       stage_2_label_reduce();
+
+       res.filter = out;
+       res.len = curr_instr;
+
+       if (verbose) {
+               printf("Generated program:\n");
+               bpf_dump_all(&res);
+       }
+
+       if (!bypass) {
+               if (verbose) {
+                       printf("Validating: ");
+                       fflush(stdout);
+               }
+
+               if (__bpf_validate(&res) == 0) {
+                       if (verbose)
+                               printf("Semantic error! BPF validation failed!\n");
+                       else
+                               panic("Semantic error! BPF validation failed! "
+                                     "Try -V for debugging output!\n");
+               } else if (verbose) {
+                       printf("is runnable!\n");
+               }
+       }
+
+       if (verbose)
+               printf("Result:\n");
+       for (i = 0; i < res.len; ++i) {
+               if (decimal) {
+                       printf("%u %u %u %u\n",
+                              res.filter[i].code, res.filter[i].jt,
+                              res.filter[i].jf, res.filter[i].k);
+               } else {
+                       printf("{ 0x%x, %u, %u, 0x%08x },\n",
+                              res.filter[i].code, res.filter[i].jt,
+                              res.filter[i].jf, res.filter[i].k);
+               }
+
+               free(labels[i]);
+               free(labels_jt[i]);
+               free(labels_jf[i]);
+               free(labels_k[i]);
+       }
+
+       fclose(yyin);
+       return 0;
+}
+
+void yyerror(const char *err)
+{
+       panic("Syntax error at line %d: %s! %s!\n",
+             yylineno, yytext, err);
+}
diff --git a/bpfc.c b/bpfc.c
new file mode 100644 (file)
index 0000000..53ad5b3
--- /dev/null
+++ b/bpfc.c
@@ -0,0 +1,132 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2011 Daniel Borkmann <dborkma@tik.ee.ethz.ch>,
+ * Swiss federal institute of technology (ETH Zurich)
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <getopt.h>
+#include <ctype.h>
+#include <unistd.h>
+#include <sys/fsuid.h>
+
+#include "xmalloc.h"
+#include "xutils.h"
+#include "die.h"
+#include "bpf.h"
+
+static const char *short_options = "vhi:VdbD";
+static const struct option long_options[] = {
+       {"input",       required_argument,      NULL, 'i'},
+       {"verbose",     no_argument,            NULL, 'V'},
+       {"decimal",     no_argument,            NULL, 'D'},
+       {"bypass",      no_argument,            NULL, 'b'},
+       {"dump",        no_argument,            NULL, 'd'},
+       {"version",     no_argument,            NULL, 'v'},
+       {"help",        no_argument,            NULL, 'h'},
+       {NULL, 0, NULL, 0}
+};
+
+extern int compile_filter(char *file, int verbose, int bypass, int decimal);
+
+static void help(void)
+{
+       printf("\nbpfc %s, a tiny BPF compiler\n", VERSION_STRING);
+       puts("http://www.netsniff-ng.org\n\n"
+            "Usage: bpfc [options] || bpfc <program>\n"
+            "Options:\n"
+            "  -i|--input <program/->  Berkeley Packet Filter file/stdin\n"
+            "  -D|--decimal            Decimal output, e.g. for xt_bpf\n"
+            "  -V|--verbose            Be more verbose\n"
+            "  -b|--bypass             Bypass filter validation (e.g. for bug testing)\n"
+            "  -d|--dump               Dump supported instruction table\n"
+            "  -v|--version            Print version\n"
+            "  -h|--help               Print this help\n\n"
+            "Examples:\n"
+            "  bpfc fubar\n"
+            "  bpfc -Dbi fubar\n"
+            "  bpfc -   (read from stdin)\n\n"
+            "Please report bugs to <bugs@netsniff-ng.org>\n"
+            "Copyright (C) 2011-2013 Daniel Borkmann <dborkma@tik.ee.ethz.ch>,\n"
+            "Swiss federal institute of technology (ETH Zurich)\n"
+            "License: GNU GPL version 2.0\n"
+            "This is free software: you are free to change and redistribute it.\n"
+            "There is NO WARRANTY, to the extent permitted by law.\n");
+       die();
+}
+
+static void version(void)
+{
+       printf("\nbpfc %s, a tiny BPF compiler\n", VERSION_STRING);
+       puts("http://www.netsniff-ng.org\n\n"
+            "Please report bugs to <bugs@netsniff-ng.org>\n"
+            "Copyright (C) 2011-2013 Daniel Borkmann <dborkma@tik.ee.ethz.ch>,\n"
+            "Swiss federal institute of technology (ETH Zurich)\n"
+            "License: GNU GPL version 2.0\n"
+            "This is free software: you are free to change and redistribute it.\n"
+            "There is NO WARRANTY, to the extent permitted by law.\n");
+       die();
+}
+
+int main(int argc, char **argv)
+{
+       int ret, verbose = 0, c, opt_index, bypass = 0, decimal = 0;
+       char *file = NULL;
+
+       setfsuid(getuid());
+       setfsgid(getgid());
+
+       if (argc == 1)
+               help();
+
+       while ((c = getopt_long(argc, argv, short_options,
+                               long_options, &opt_index)) != EOF) {
+               switch (c) {
+               case 'h':
+                       help();
+                       break;
+               case 'v':
+                       version();
+                       break;
+               case 'V':
+                       verbose = 1;
+                       break;
+               case 'D':
+                       decimal = 1;
+                       break;
+               case 'b':
+                       bypass = 1;
+                       break;
+               case 'd':
+                       bpf_dump_op_table();
+                       die();
+               case 'i':
+                       file = xstrdup(optarg);
+                       break;
+               case '?':
+                       switch (optopt) {
+                       case 'i':
+                               panic("Option -%c requires an argument!\n",
+                                     optopt);
+                       default:
+                               if (isprint(optopt))
+                                       printf("Unknown option character `0x%X\'!\n", optopt);
+                               die();
+                       }
+               default:
+                       break;
+               }
+       }
+
+       if (argc == 2)
+               file = xstrdup(argv[1]);
+       if (!file)
+               panic("No Berkeley Packet Filter program specified!\n");
+
+       ret = compile_filter(file, verbose, bypass, decimal);
+
+       xfree(file);
+       return ret;
+}
diff --git a/bpfc/.gitignore b/bpfc/.gitignore
new file mode 100644 (file)
index 0000000..32aad4d
--- /dev/null
@@ -0,0 +1,4 @@
+*.*
+
+!.gitignore
+!Makefile
diff --git a/bpfc/Makefile b/bpfc/Makefile
new file mode 100644 (file)
index 0000000..4451f64
--- /dev/null
@@ -0,0 +1,12 @@
+bpfc-libs =
+
+bpfc-objs =    xmalloc.o \
+               xutils.o \
+               bpf.o \
+               bpf_lexer.yy.o \
+               bpf_parser.tab.o \
+               bpfc.o
+
+bpfc-lex =     bpf_lexer.yy.o
+
+bpfc-yaac =    bpf_parser.tab.o
diff --git a/built_in.h b/built_in.h
new file mode 100644 (file)
index 0000000..ee97c74
--- /dev/null
@@ -0,0 +1,344 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009-2012 Daniel Borkmann.
+ * Parts taken from the Linux kernel, GPL, version 2.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef BUILT_IN_H
+#define BUILT_IN_H
+
+#include <linux/if_packet.h>
+#include <assert.h>
+#include <endian.h>
+#include <byteswap.h>
+#include <asm/byteorder.h>
+#include <stdint.h>
+
+typedef uint64_t       u64;
+typedef uint32_t       u32;
+typedef uint16_t       u16;
+typedef uint8_t                u8;
+
+#ifndef CO_CACHE_LINE_SIZE
+# define CO_CACHE_LINE_SIZE    (1 << CO_IN_CACHE_SHIFT)
+#endif
+
+#ifndef MAX_CPUS
+# define MAX_CPUS                      32
+#endif
+
+#ifndef __aligned_16
+# define __aligned_16          __attribute__((aligned(16)))
+#endif
+
+#ifndef __cacheline_aligned
+# define __cacheline_aligned   __attribute__((aligned(CO_CACHE_LINE_SIZE)))
+#endif
+
+#ifndef __aligned_tpacket
+# define __aligned_tpacket     __attribute__((aligned(TPACKET_ALIGNMENT)))
+#endif
+
+#ifndef __align_tpacket
+# define __align_tpacket(x)    __attribute__((aligned(TPACKET_ALIGN(x))))
+#endif
+
+#ifndef __check_format_printf
+# define __check_format_printf(pos_fmtstr, pos_fmtargs)                \
+               __attribute__ ((format (printf, (pos_fmtstr), (pos_fmtargs))))
+#endif
+
+#ifndef __packed
+# define __packed              __attribute__((packed))
+#endif
+
+#ifndef round_up
+# define round_up(x, alignment)        (((x) + (alignment) - 1) & ~((alignment) - 1))
+#endif
+
+#ifndef round_up_cacheline
+# define round_up_cacheline(x) round_up((x), CO_CACHE_LINE_SIZE)
+#endif
+
+#ifndef likely
+# define likely(x)             __builtin_expect(!!(x), 1)
+#endif
+
+#ifndef unlikely
+# define unlikely(x)           __builtin_expect(!!(x), 0)
+#endif
+
+#ifndef constant
+# define constant(x)           __builtin_constant_p(x)
+#endif
+
+#ifndef fmemset
+# define fmemset               __builtin_memset
+#endif
+
+#ifndef fmemcpy
+# define fmemcpy               __builtin_memcpy
+#endif
+
+#ifndef __maybe_unused
+# define __maybe_unused                __attribute__ ((__unused__))
+#endif
+
+#ifndef noinline
+# define noinline              __attribute__((noinline))
+#endif
+
+#ifndef __hidden
+# define __hidden              __attribute__((visibility("hidden")))
+#endif
+
+#ifndef __pure
+# define __pure                        __attribute__ ((pure))
+#endif
+
+#ifndef __force
+# define __force               /* unimplemented */
+#endif
+
+#ifndef force_cast
+# define force_cast(type, arg) ((type) (arg))
+#endif
+
+#ifndef max
+# define max(a, b)                                                     \
+       ({                                                              \
+               typeof (a) _a = (a);                                    \
+               typeof (b) _b = (b);                                    \
+               _a > _b ? _a : _b;                                      \
+       })
+#endif /* max */
+
+#ifndef min
+# define min(a, b)                                                     \
+       ({                                                              \
+               typeof (a) _a = (a);                                    \
+               typeof (b) _b = (b);                                    \
+               _a < _b ? _a : _b;                                      \
+       })
+#endif /* min */
+
+#ifndef ispow2
+# define ispow2(x)             ({ !!((x) && !((x) & ((x) - 1))); })
+#endif
+
+#ifndef offsetof
+# define offsetof(type, member)        ((size_t) &((type *) 0)->member)
+#endif
+
+#ifndef container_of
+# define container_of(ptr, type, member)                               \
+       ({                                                              \
+               const typeof(((type *) 0)->member) * __mptr = (ptr);    \
+               (type *) ((char *) __mptr - offsetof(type, member));    \
+       })
+#endif
+
+#ifndef array_size
+# define array_size(x) (sizeof(x) / sizeof((x)[0]) + __must_be_array(x))
+#endif
+
+#ifndef __must_be_array
+# define __must_be_array(x)                                            \
+       build_bug_on_zero(__builtin_types_compatible_p(typeof(x),       \
+                                                      typeof(&x[0])))
+#endif
+
+#ifndef build_bug_on_zero
+# define build_bug_on_zero(e)  (sizeof(char[1 - 2 * !!(e)]) - 1)
+#endif
+
+#ifndef bug_on
+# define bug_on(cond)          assert(!(cond))
+#endif
+
+#ifndef bug
+# define bug()                 assert(0)
+#endif
+
+#define PAGE_SIZE              (getpagesize())
+#define PAGE_MASK              (~(PAGE_SIZE - 1))
+#define PAGE_ALIGN(addr)       (((addr) + PAGE_SIZE - 1) & PAGE_MASK)
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+static inline uint64_t htonll(uint64_t x)
+{
+       return bswap_64(x);
+}
+
+static inline uint64_t ntohll(uint64_t x)
+{
+       return bswap_64(x);
+}
+#elif __BYTE_ORDER == __BIG_ENDIAN
+static inline uint64_t htonll(uint64_t x)
+{
+       return x;
+}
+
+static inline uint64_t ntohll(uint64_t x)
+{
+       return x;
+}
+#else
+# error __BYTE_ORDER is neither __LITTLE_ENDIAN nor __BIG_ENDIAN
+#endif
+#ifndef ___constant_swab16
+# define ___constant_swab16(x) ((__u16)(                       \
+       (((__u16)(x) & (__u16)0x00ffU) << 8) |                  \
+       (((__u16)(x) & (__u16)0xff00U) >> 8)))
+#endif
+#ifndef ___constant_swab32
+# define ___constant_swab32(x) ((__u32)(                       \
+       (((__u32)(x) & (__u32)0x000000ffUL) << 24) |            \
+       (((__u32)(x) & (__u32)0x0000ff00UL) <<  8) |            \
+       (((__u32)(x) & (__u32)0x00ff0000UL) >>  8) |            \
+       (((__u32)(x) & (__u32)0xff000000UL) >> 24)))
+#endif
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+static inline u16 cpu_to_be16(u16 val)
+{
+       return bswap_16(val);
+}
+
+static inline u32 cpu_to_be32(u32 val)
+{
+       return bswap_32(val);
+}
+
+static inline u64 cpu_to_be64(u64 val)
+{
+       return bswap_64(val);
+}
+
+static inline u16 cpu_to_le16(u16 val)
+{
+       return val;
+}
+
+static inline u32 cpu_to_le32(u32 val)
+{
+       return val;
+}
+
+static inline u64 cpu_to_le64(u64 val)
+{
+       return val;
+}
+
+# ifndef __constant_htonl
+#  define __constant_htonl(x) ((__force __be32)___constant_swab32((x)))
+# endif
+# ifndef __constant_ntohl
+#  define __constant_ntohl(x) ___constant_swab32((__force __be32)(x))
+# endif
+# ifndef __constant_htons
+#  define __constant_htons(x) ((__force __be16)___constant_swab16((x)))
+# endif
+# ifndef __constant_ntohs
+#  define __constant_ntohs(x) ___constant_swab16((__force __be16)(x))
+# endif
+#elif __BYTE_ORDER == __BIG_ENDIAN
+static inline u16 cpu_to_be16(u16 val)
+{
+       return val;
+}
+
+static inline u32 cpu_to_be32(u32 val)
+{
+       return val;
+}
+
+static inline u64 cpu_to_be64(u64 val)
+{
+       return val;
+}
+
+static inline u16 cpu_to_le16(u16 val)
+{
+       return bswap_16(val);
+}
+
+static inline u32 cpu_to_le32(u32 val)
+{
+       return bswap_32(val);
+}
+
+static inline u64 cpu_to_le64(u64 val)
+{
+       return bswap_64(val);
+}
+
+# ifndef __constant_htonl
+#  define __constant_htonl(x) ((__force __be32)(__u32)(x))
+# endif
+# ifndef __constant_ntohl
+#  define __constant_ntohl(x) ((__force __u32)(__be32)(x))
+# endif
+# ifndef __constant_htons
+#  define __constant_htons(x) ((__force __be16)(__u16)(x))
+# endif
+# ifndef __constant_ntohs
+#  define __constant_ntohs(x) ((__force __u16)(__be16)(x))
+# endif
+#else
+# error __BYTE_ORDER is neither __LITTLE_ENDIAN nor __BIG_ENDIAN
+#endif
+
+#define le64_to_cpu    cpu_to_le64
+#define le32_to_cpu    cpu_to_le32
+#define le16_to_cpu    cpu_to_le16
+#define be64_to_cpu    cpu_to_be64
+#define be32_to_cpu    cpu_to_be32
+#define be16_to_cpu    cpu_to_be16
+
+#undef memset
+#undef memcpy
+
+#define memset         fmemset
+#define memcpy         fmemcpy
+
+#if defined(__amd64__) || defined(__x86_64__) || defined(__AMD64__) || \
+    defined(_M_X64) || defined(__amd64)
+# define CO_IN_CACHE_SHIFT             7
+#elif defined(__i386__) || defined(__x86__) || defined(__X86__) || \
+      defined(_M_IX86) || defined(__i386)
+# define CO_IN_CACHE_SHIFT             7
+#elif defined(__ia64__) || defined(__IA64__) || defined(__M_IA64)
+# define CO_IN_CACHE_SHIFT             6
+#elif defined(__SPU__)
+# define CO_IN_CACHE_SHIFT             7
+#elif defined(__powerpc64__) || defined(__ppc64__) || defined(__PPC64__) || \
+      defined(_ARCH_PPC64)
+# define CO_IN_CACHE_SHIFT             8
+#elif defined(__powerpc__) || defined(__ppc__) || defined(__PPC__) || \
+      defined(_ARCH_PPC)
+# define CO_IN_CACHE_SHIFT             7
+#elif defined(__sparcv9__) || defined(__sparcv9)
+# define CO_IN_CACHE_SHIFT             6
+#elif defined(__sparc_v8__)
+# define CO_IN_CACHE_SHIFT             5
+#elif defined(__sparc__) || defined(__sparc)
+# define CO_IN_CACHE_SHIFT             5
+#elif defined(__ARM_EABI__)
+# define CO_IN_CACHE_SHIFT             5
+#elif defined(__arm__)
+# define CO_IN_CACHE_SHIFT             5
+#elif defined(__mips__) || defined(__mips) || defined(__MIPS__)
+# if defined(_ABIO32)
+# define CO_IN_CACHE_SHIFT             5
+# elif defined(_ABIN32)
+# define CO_IN_CACHE_SHIFT             5
+# else
+# define CO_IN_CACHE_SHIFT             6
+# endif
+#else
+# define CO_IN_CACHE_SHIFT             5
+#endif
+
+#endif /* BUILT_IN_H */
diff --git a/colors.h b/colors.h
new file mode 100644 (file)
index 0000000..7675583
--- /dev/null
+++ b/colors.h
@@ -0,0 +1,31 @@
+/* netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef COLORS_H
+#define COLORS_H
+
+#define __reset                 "0"
+
+#define __bold                  "1"
+
+#define __black                 "30"
+#define __red                   "31"
+#define __green                 "32"
+#define __yellow                "33"
+#define __blue                  "34"
+#define __magenta               "35"
+#define __cyan                  "36"
+#define __white                 "37"
+
+#define __on_black              "40"
+#define __on_red                "41"
+#define __on_green              "42"
+#define __on_yellow             "43"
+#define __on_blue               "44"
+#define __on_magenta            "45"
+#define __on_cyan               "46"
+#define __on_white              "47"
+
+#endif /* COLORS_H */
diff --git a/configs/ether.conf b/configs/ether.conf
new file mode 100644 (file)
index 0000000..4d65f62
--- /dev/null
@@ -0,0 +1,291 @@
+0x0000, IEEE802.3 Length Field
+0x0060, Ethernet Loopback packet
+0x0101, Experimental
+0x0200, Xerox PUP packet
+0x0201, Xerox PUP Addr Trans packet
+0x0400, Nixdorf (conflicts with 802.3 Length Field)
+0x05f8, Ethernet II
+0x0600, XEROX NS IDP
+0x0601, XNS Address Translation (3Mb only)
+0x0660, DLOG
+0x0661, DLOG
+0x0800, IPv4
+0x0801, X.75 Internet
+0x0802, NBS Internet
+0x0803, ECMA Internet
+0x0804, Chaosnet
+0x0805, CCITT X.25
+0x0806, ARP
+0x0807, XNS Compatability
+0x0808, Frame Relay ARP
+0x081C, Symbolics Private
+0x0888, Xyplex
+0x08FF, G8BPQ AX.25 Ethernet Packet
+0x0900, Ungermann-Bass net debugger
+0x0A00, Xerox IEEE802.3 PUP packet
+0x0A01, Xerox IEEE802.3 PUP Addr Trans packet
+0x0BAD, Banyan VINES
+0x0BAE, VINES Loopback
+0x0BAF, VINES Echo
+0x1000, Berkeley Trailer nego
+0x1001, Berkeley Trailer encapsulation for IP
+0x1002, Berkeley Trailer encapsulation for IP
+0x1003, Berkeley Trailer encapsulation for IP
+0x1004, Berkeley Trailer encapsulation for IP
+0x1005, Berkeley Trailer encapsulation for IP
+0x1006, Berkeley Trailer encapsulation for IP
+0x1007, Berkeley Trailer encapsulation for IP
+0x1008, Berkeley Trailer encapsulation for IP
+0x1009, Berkeley Trailer encapsulation for IP
+0x100A, Berkeley Trailer encapsulation for IP
+0x100B, Berkeley Trailer encapsulation for IP
+0x100C, Berkeley Trailer encapsulation for IP
+0x100D, Berkeley Trailer encapsulation for IP
+0x100E, Berkeley Trailer encapsulation for IP
+0x100F, Berkeley Trailer encapsulation for IP
+0x1234, DCA - Multicast
+0x1600, Valid Systems
+0x1989, Artificial Horizons (\"Aviator\" dogfight simulator [on Sun])
+0x1995, Datapoint Corporation (RCL lan protocol)
+0x3C00, 3Com NBP virtual circuit datagram (like XNS SPP)
+0x3C01, 3Com NBP System control datagram
+0x3C02, 3Com NBP Connect request (virtual cct)
+0x3C03, 3Com NBP Connect repsonse
+0x3C04, 3Com NBP Connect complete
+0x3C05, 3Com NBP Close request (virtual cct)
+0x3C06, 3Com NBP Close response
+0x3C07, 3Com NBP Datagram (like XNS IDP)
+0x3C08, 3Com NBP Datagram broadcast
+0x3C09, 3Com NBP Claim NetBIOS name
+0x3C0A, 3Com NBP Delete Netbios name
+0x3C0B, 3Com NBP Remote adaptor status
+0x3C0C, 3Com NBP Remote adaptor response
+0x3C0D, 3Com NBP Reset
+0x4242, PCS Basic Block Protocol
+0x424C, Information Modes Little Big LAN diagnostic
+0x4321, THD - Diddle
+0x4C42, Information Modes Little Big LAN
+0x5208, BBN Simnet
+0x6000, DEC Assigned proto
+0x6001, DEC DNA Dump/Load
+0x6002, DEC DNA Remote Console
+0x6003, DEC DNA Routing
+0x6004, DEC LAT
+0x6005, DEC Diagnostics
+0x6006, DEC Customer use
+0x6007, DEC Systems Comms Arch
+0x6008, DEC Unassigned
+0x6009, DEC MUMPS
+0x6010, 3Com Corporation
+0x6011, 3Com Corporation
+0x6012, 3Com Corporation
+0x6013, 3Com Corporation
+0x6014, 3Com Corporation
+0x6558, Trans Ether Bridging
+0x6559, Raw Frame Relay
+0x7000, Ungermann-Bass download
+0x7001, Ungermann-Bass NIUs
+0x7002, Ungermann-Bass dia/loop
+0x7003, Ungermann-Bass ??? (NMC to/from UB Bridge)
+0x7005, Ungermann-Bass Bridge Spanning Tree
+0x7007, OS/9 Microware
+0x7009, OS/9 Net?
+0x7020, LRT (England) (now Sintrom)
+0x7021, LRT (England) (now Sintrom)
+0x7022, LRT (England) (now Sintrom)
+0x7023, LRT (England) (now Sintrom)
+0x7024, LRT (England) (now Sintrom)
+0x7025, LRT (England) (now Sintrom)
+0x7026, LRT (England) (now Sintrom)
+0x7027, LRT (England) (now Sintrom)
+0x7028, LRT (England) (now Sintrom)
+0x7029, LRT (England) (now Sintrom)
+0x7030, Proteon / Racal-Interlan
+0x7031, Prime NTS (Network Terminal Service)
+0x7034, Cabletron
+0x8003, Cronus VLN
+0x8004, Cronus Direct
+0x8005, HP Probe
+0x8006, Nestar
+0x8008, AT&T
+0x8010, Excelan
+0x8013, SGI diagnostics
+0x8014, SGI network games
+0x8015, SGI reserved
+0x8016, SGI bounce server
+0x8019, Apollo Domain
+0x802E, Tymshare
+0x802F, Tigan, Inc.
+0x8035, RARP
+0x8036, Aeonic Systems
+0x8037, IPX (Novell Netware?)
+0x8038, DEC LanBridge Management
+0x8039, DEC DSM/DDP
+0x803A, DEC Argonaut Console
+0x803B, DEC VAXELN
+0x803C, DEC DNS Naming Service
+0x803D, DEC Ethernet CSMA/CD Encryption Protocol
+0x803E, DEC Distributed Time Service
+0x803F, DEC LAN Traffic Monitor Protocol
+0x8040, 8040 DEC PATHWORKS DECnet NETBIOS Emulation
+0x8041, DEC Local Area System Transport
+0x8042, DEC unassigned
+0x8044, Planning Research Corp.
+0x8046, AT&T
+0x8047, AT&T
+0x8048, DEC Availability Manager for Distributed Systems DECamds (?)
+0x8049, ExperData
+0x805B, VMTP (Versatile Message Transaction Protocol, RFC-1045) (Stanford)
+0x805C, Stanford V Kernel, version 6.0
+0x805D, Evans & Sutherland
+0x8060, Little Machines
+0x8062, Counterpoint Computers
+0x8065, Univ. of Mass. @ Amherst
+0x8066, Univ. of Mass. @ Amherst
+0x8067, Veeco Integrated Auto.
+0x8068, General Dynamics
+0x8069, AT&T
+0x806A, Autophon
+0x806C, ComDesign
+0x806D, Computgraphic Corp.
+0x806E, Landmark Graphics Corp.
+0x807A, Matra
+0x807B, Dansk Data Elektronik
+0x807C, Merit Internodal
+0x807D, Vitalink Communications
+0x8080, Vitalink TransLAN III
+0x8081, Counterpoint Computers
+0x809B, Appletalk DDP
+0x809C, Datability
+0x809F, Spider Systems Ltd.
+0x80A3, Nixdorf Computers
+0x80A4, Siemens Gammasonics Inc.
+0x80C0, DCA Data Exchange Cluster
+0x80C4, Banyan Systems
+0x80C5, Banyan Systems
+0x80C6, Pacer Software
+0x80C7, Applitek Corporation
+0x80C8, Intergraph Corporation
+0x80CD, Harris Corporation
+0x80CF, Taylor Instrument
+0x80D3, Rosemount Corporation
+0x80D5, IBM SNA Service on Ether
+0x80DD, Varian Associates
+0x80DE, Integrated Solutions TRFS
+0x80E0, Allen-Bradley
+0x80E4, Datability
+0x80F2, Retix
+0x80F3, AppleTalk Address Resolution Protocol (AARP)
+0x80F4, Kinetics
+0x80F7, Apollo Computer
+0x80FF, Wellfleet Communications
+0x8100, 802.1Q VLAN Extended Header
+0x8101, Wellfleet Communications
+0x8102, Wellfleet; BOFL (Breath OF Life) pkts [every 5-10 secs.]
+0x8103, Wellfleet Communications
+0x8107, Symbolics Private
+0x812B, Talaris
+0x8130, Hayes Microcomputers
+0x8131, VG Laboratory Systems
+0x8132, Bridge Communications
+0x8137, IPX over DIX
+0x8138, Novell, Inc.
+0x8139, KTI
+0x813F, M/MUMPS data sharing
+0x8145, Vrije Universiteit (NL), Amoeba 4 RPC (obsolete)
+0x8146, Vrije Universiteit (NL), FLIP (Fast Local Internet Protocol)
+0x8147, Vrije Universiteit (NL) [reserved]
+0x8148, Logicraft
+0x8149, Network Computing Devices
+0x814A, Alpha Micro
+0x814C, SNMP over Ethernet (see RFC1089)
+0x814D, BIIN
+0x814E, BIIN
+0x814F, Technically Elite Concept
+0x8150, Rational Corp
+0x8151, Qualcomm
+0x815C, Computer Protocol Pty Ltd
+0x8164, Charles River Data System
+0x817D, XTP
+0x817E, SGI/Time Warner prop.
+0x8180, HIPPI-FP encapsulation
+0x8181, Spanning Tree Protocol (STP), HIPPI-ST
+0x8182, Reserved for HIPPI-6400
+0x8183, Reserved for HIPPI-6400
+0x8184, Silicon Graphics prop.
+0x818D, Motorola Computer
+0x8191, PowerLAN NetBIOS/NetBEUI (PC)
+0x819A, Qualcomm
+0x81A4, ARAI Bunkichi
+0x81A5, RAD Network Devices
+0x81B7, Xyplex
+0x81CC, Apricot Computers
+0x81D6, Artisoft
+0x81D7, Artisoft
+0x81E6, Polygon
+0x81F0, Comsat Labs
+0x81F3, SAIC
+0x81F6, VG Analytical
+0x8203, Quantum Software
+0x8221, Ascom Banking Systems
+0x823E, Advanced Encryption Systems
+0x827F, Athena Programming
+0x8263, Charles River Data System
+0x829A, Inst Ind Info Tech
+0x829C, Taurus Controls
+0x82AC, Walker Richer & Quinn
+0x8390, Accton Technologies (unregistered)
+0x852B, Talaris multicast
+0x8582, Kalpana
+0x8694, Idea Courier
+0x869E, Computer Network Tech
+0x86A3, Gateway Communications
+0x86DB, SECTRA
+0x86DE, Delta Controls
+0x86DD, IPv6
+0x86DF, ATOMIC
+0x86E0, Landis & Gyr Powers
+0x8700, Motorola
+0x8739, Control Technology Inc. RDP Without IP
+0x873A, Control Technology Inc. Mcast Industrial Ctrl Proto.
+0x873B, Control Technology Inc. Proprietary
+0x873C, Control Technology Inc. Proprietary
+0x876B, TCP/IP Compression
+0x876C, IP Autonomous Systems
+0x876D, Secure Data
+0x8808, IEEE Pause frame
+0x8809, Slow Protocol
+0x880B, PPP, Point-to-Point Protocol
+0x880C, GSMP, General Switch Management Protocol
+0x8820, Hitachi Cable (Optoelectronic Systems Laboratory)
+0x883E, Web-cache coordination protocol
+0x8847, MPLS Unicast traffic
+0x8848, MPLS Multicast traffic
+0x884c, MultiProtocol Over ATM
+0x8856, Axis Communications AB proprietary bootstrap/config
+0x8863, PPPoE Discovery Stage
+0x8864, PPPoE Session Stage
+0x8884, Frame-based ATM Transport over Ethernet
+0x8888, HP LanProbe test?
+0x888E, Port Access Entity
+0x88A2, ATA over Ethernet
+0x88BB, LWAPP, Light Weight Access Point Protocol
+0x88CA, TIPC
+0x88CC, LLDP, Link Layer Discovery Protocol
+0x88F7, IEEE 1588 Timesync
+0x88FB, PRP Supervision
+0x8906, Fibre Channel over Ethernet
+0x8914, FCoE Initialization Protocol
+0x8A96, Invisible Software
+0x8E88, EAPOL, EAP over LAN
+0x9000, Loopback
+0x9001, 3Com(Bridge) XNS Systems Management
+0x9002, 3Com(Bridge) TCP/IP Systems Management
+0x9003, 3Com(Bridge) loopback detection
+0x9100, VLAN Tag Protocol Identifier
+0x9200, VLAN Tag Protocol Identifier
+0xAAAA, DECNET? Used by VAX 6220 DEBNI
+0xDADA, Ethertype DSA
+0xFAF5, Sonix Arpeggio
+0xFF00, BBN VITAL-LanBridge cache wakeups (?)
+0xFFFF, Reserved
diff --git a/configs/geoip.conf b/configs/geoip.conf
new file mode 100644 (file)
index 0000000..43c6238
--- /dev/null
@@ -0,0 +1,2 @@
+geolite.maxmind.com
+cryptoism.org
diff --git a/configs/oui.conf b/configs/oui.conf
new file mode 100644 (file)
index 0000000..87a0d10
--- /dev/null
@@ -0,0 +1,17557 @@
+0x000000, XEROX CORPORATION
+0x000001, XEROX CORPORATION
+0x000002, XEROX CORPORATION
+0x000003, XEROX CORPORATION
+0x000004, XEROX CORPORATION
+0x000005, XEROX CORPORATION
+0x000006, XEROX CORPORATION
+0x000007, XEROX CORPORATION
+0x000008, XEROX CORPORATION
+0x000009, XEROX CORPORATION
+0x00000A, OMRON TATEISI ELECTRONICS CO.
+0x00000B, MATRIX CORPORATION
+0x00000C, CISCO SYSTEMS, INC.
+0x00000D, FIBRONICS LTD.
+0x00000E, FUJITSU LIMITED
+0x00000F, NEXT, INC.
+0x000010, SYTEK INC.
+0x000011, NORMEREL SYSTEMES
+0x000012, INFORMATION TECHNOLOGY LIMITED
+0x000013, CAMEX
+0x000014, NETRONIX
+0x000015, DATAPOINT CORPORATION
+0x000016, DU PONT PIXEL SYSTEMS     .
+0x000017, TEKELEC
+0x000018, WEBSTER COMPUTER CORPORATION
+0x000019, APPLIED DYNAMICS INTERNATIONAL
+0x00001A, ADVANCED MICRO DEVICES
+0x00001B, NOVELL INC.
+0x00001C, BELL TECHNOLOGIES
+0x00001D, CABLETRON SYSTEMS, INC.
+0x00001E, TELSIST INDUSTRIA ELECTRONICA
+0x00001F, Telco Systems, Inc.
+0x000020, DATAINDUSTRIER DIAB AB
+0x000021, SUREMAN COMP. & COMMUN. CORP.
+0x000022, VISUAL TECHNOLOGY INC.
+0x000023, ABB INDUSTRIAL SYSTEMS AB
+0x000024, CONNECT AS
+0x000025, RAMTEK CORP.
+0x000026, SHA-KEN CO., LTD.
+0x000027, JAPAN RADIO COMPANY
+0x000028, PRODIGY SYSTEMS CORPORATION
+0x000029, IMC NETWORKS CORP.
+0x00002A, TRW - SEDD/INP
+0x00002B, CRISP AUTOMATION, INC
+0x00002C, AUTOTOTE LIMITED
+0x00002D, CHROMATICS INC
+0x00002E, SOCIETE EVIRA
+0x00002F, TIMEPLEX INC.
+0x000030, VG LABORATORY SYSTEMS LTD
+0x000031, QPSX COMMUNICATIONS PTY LTD
+0x000032, Marconi plc
+0x000033, EGAN MACHINERY COMPANY
+0x000034, NETWORK RESOURCES CORPORATION
+0x000035, SPECTRAGRAPHICS CORPORATION
+0x000036, ATARI CORPORATION
+0x000037, OXFORD METRICS LIMITED
+0x000038, CSS LABS
+0x000039, TOSHIBA CORPORATION
+0x00003A, CHYRON CORPORATION
+0x00003B, i Controls, Inc.
+0x00003C, AUSPEX SYSTEMS INC.
+0x00003D, UNISYS
+0x00003E, SIMPACT
+0x00003F, SYNTREX, INC.
+0x000040, APPLICON, INC.
+0x000041, ICE CORPORATION
+0x000042, METIER MANAGEMENT SYSTEMS LTD.
+0x000043, MICRO TECHNOLOGY
+0x000044, CASTELLE CORPORATION
+0x000045, FORD AEROSPACE & COMM. CORP.
+0x000046, OLIVETTI NORTH AMERICA
+0x000047, NICOLET INSTRUMENTS CORP.
+0x000048, SEIKO EPSON CORPORATION
+0x000049, APRICOT COMPUTERS, LTD
+0x00004A, ADC CODENOLL TECHNOLOGY CORP.
+0x00004B, ICL DATA OY
+0x00004C, NEC CORPORATION
+0x00004D, DCI CORPORATION
+0x00004E, AMPEX CORPORATION
+0x00004F, LOGICRAFT, INC.
+0x000050, RADISYS CORPORATION
+0x000051, HOB ELECTRONIC GMBH & CO. KG
+0x000052, Intrusion.com, Inc.
+0x000053, COMPUCORP
+0x000054, MODICON, INC.
+0x000055, COMMISSARIAT A L`ENERGIE ATOM.
+0x000056, DR. B. STRUCK
+0x000057, SCITEX CORPORATION LTD.
+0x000058, RACORE COMPUTER PRODUCTS INC.
+0x000059, HELLIGE GMBH
+0x00005A, SysKonnect GmbH
+0x00005B, ELTEC ELEKTRONIK AG
+0x00005C, TELEMATICS INTERNATIONAL INC.
+0x00005D, CS TELECOM
+0x00005E, USC INFORMATION SCIENCES INST
+0x00005F, SUMITOMO ELECTRIC IND., LTD.
+0x000060, KONTRON ELEKTRONIK GMBH
+0x000061, GATEWAY COMMUNICATIONS
+0x000062, BULL HN INFORMATION SYSTEMS
+0x000063, BARCO CONTROL ROOMS GMBH
+0x000064, YOKOGAWA DIGITAL COMPUTER CORP
+0x000065, Network General Corporation
+0x000066, TALARIS SYSTEMS, INC.
+0x000067, SOFT * RITE, INC.
+0x000068, ROSEMOUNT CONTROLS
+0x000069, CONCORD COMMUNICATIONS INC
+0x00006A, COMPUTER CONSOLES INC.
+0x00006B, SILICON GRAPHICS INC./MIPS
+0x00006C, PRIVATE
+0x00006D, CRAY COMMUNICATIONS, LTD.
+0x00006E, ARTISOFT, INC.
+0x00006F, Madge Ltd.
+0x000070, HCL LIMITED
+0x000071, ADRA SYSTEMS INC.
+0x000072, MINIWARE TECHNOLOGY
+0x000073, SIECOR CORPORATION
+0x000074, RICOH COMPANY LTD.
+0x000075, Nortel Networks
+0x000076, ABEKAS VIDEO SYSTEM
+0x000077, INTERPHASE CORPORATION
+0x000078, LABTAM LIMITED
+0x000079, NETWORTH INCORPORATED
+0x00007A, DANA COMPUTER INC.
+0x00007B, RESEARCH MACHINES
+0x00007C, AMPERE INCORPORATED
+0x00007D, Oracle Corporation
+0x00007E, CLUSTRIX CORPORATION
+0x00007F, LINOTYPE-HELL AG
+0x000080, CRAY COMMUNICATIONS A/S
+0x000081, BAY NETWORKS
+0x000082, LECTRA SYSTEMES SA
+0x000083, TADPOLE TECHNOLOGY PLC
+0x000084, SUPERNET
+0x000085, CANON INC.
+0x000086, MEGAHERTZ CORPORATION
+0x000087, HITACHI, LTD.
+0x000088, Brocade Communications Systems, Inc.
+0x000089, CAYMAN SYSTEMS INC.
+0x00008A, DATAHOUSE INFORMATION SYSTEMS
+0x00008B, INFOTRON
+0x00008C, Alloy Computer Products (Australia) Pty Ltd
+0x00008D, Cryptek Inc.
+0x00008E, SOLBOURNE COMPUTER, INC.
+0x00008F, Raytheon
+0x000090, MICROCOM
+0x000091, ANRITSU CORPORATION
+0x000092, COGENT DATA TECHNOLOGIES
+0x000093, PROTEON INC.
+0x000094, ASANTE TECHNOLOGIES
+0x000095, SONY TEKTRONIX CORP.
+0x000096, MARCONI ELECTRONICS LTD.
+0x000097, EMC Corporation
+0x000098, CROSSCOMM CORPORATION
+0x000099, MTX, INC.
+0x00009A, RC COMPUTER A/S
+0x00009B, INFORMATION INTERNATIONAL, INC
+0x00009C, ROLM MIL-SPEC COMPUTERS
+0x00009D, LOCUS COMPUTING CORPORATION
+0x00009E, MARLI S.A.
+0x00009F, AMERISTAR TECHNOLOGIES INC.
+0x0000A0, SANYO Electric Co., Ltd.
+0x0000A1, MARQUETTE ELECTRIC CO.
+0x0000A2, BAY NETWORKS
+0x0000A3, NETWORK APPLICATION TECHNOLOGY
+0x0000A4, ACORN COMPUTERS LIMITED
+0x0000A5, Tattile SRL
+0x0000A6, NETWORK GENERAL CORPORATION
+0x0000A7, NETWORK COMPUTING DEVICES INC.
+0x0000A8, STRATUS COMPUTER INC.
+0x0000A9, NETWORK SYSTEMS CORP.
+0x0000AA, XEROX CORPORATION
+0x0000AB, LOGIC MODELING CORPORATION
+0x0000AC, CONWARE COMPUTER CONSULTING
+0x0000AD, BRUKER INSTRUMENTS INC.
+0x0000AE, DASSAULT ELECTRONIQUE
+0x0000AF, NUCLEAR DATA INSTRUMENTATION
+0x0000B0, RND-RAD NETWORK DEVICES
+0x0000B1, ALPHA MICROSYSTEMS INC.
+0x0000B2, TELEVIDEO SYSTEMS, INC.
+0x0000B3, CIMLINC INCORPORATED
+0x0000B4, EDIMAX COMPUTER COMPANY
+0x0000B5, DATABILITY SOFTWARE SYS. INC.
+0x0000B6, MICRO-MATIC RESEARCH
+0x0000B7, DOVE COMPUTER CORPORATION
+0x0000B8, SEIKOSHA CO., LTD.
+0x0000B9, MCDONNELL DOUGLAS COMPUTER SYS
+0x0000BA, SIIG, INC.
+0x0000BB, TRI-DATA
+0x0000BC, Rockwell Automation
+0x0000BD, MITSUBISHI CABLE COMPANY
+0x0000BE, THE NTI GROUP
+0x0000BF, SYMMETRIC COMPUTER SYSTEMS
+0x0000C0, WESTERN DIGITAL CORPORATION
+0x0000C1, Madge Ltd.
+0x0000C2, INFORMATION PRESENTATION TECH.
+0x0000C3, HARRIS CORP COMPUTER SYS DIV
+0x0000C4, WATERS DIV. OF MILLIPORE
+0x0000C5, FARALLON COMPUTING/NETOPIA
+0x0000C6, EON SYSTEMS
+0x0000C7, ARIX CORPORATION
+0x0000C8, ALTOS COMPUTER SYSTEMS
+0x0000C9, Emulex Corporation
+0x0000CA, ARRIS International
+0x0000CB, COMPU-SHACK ELECTRONIC GMBH
+0x0000CC, DENSAN CO., LTD.
+0x0000CD, Allied Telesis Labs Ltd
+0x0000CE, MEGADATA CORP.
+0x0000CF, HAYES MICROCOMPUTER PRODUCTS
+0x0000D0, DEVELCON ELECTRONICS LTD.
+0x0000D1, ADAPTEC INCORPORATED
+0x0000D2, SBE, INC.
+0x0000D3, WANG LABORATORIES INC.
+0x0000D4, PURE DATA LTD.
+0x0000D5, MICROGNOSIS INTERNATIONAL
+0x0000D6, PUNCH LINE HOLDING
+0x0000D7, DARTMOUTH COLLEGE
+0x0000D8, NOVELL, INC.
+0x0000D9, NIPPON TELEGRAPH & TELEPHONE
+0x0000DA, ATEX
+0x0000DB, British Telecommunications plc
+0x0000DC, HAYES MICROCOMPUTER PRODUCTS
+0x0000DD, TCL INCORPORATED
+0x0000DE, CETIA
+0x0000DF, BELL & HOWELL PUB SYS DIV
+0x0000E0, QUADRAM CORP.
+0x0000E1, GRID SYSTEMS
+0x0000E2, ACER TECHNOLOGIES CORP.
+0x0000E3, INTEGRATED MICRO PRODUCTS LTD
+0x0000E4, IN2 GROUPE INTERTECHNIQUE
+0x0000E5, SIGMEX LTD.
+0x0000E6, APTOR PRODUITS DE COMM INDUST
+0x0000E7, STAR GATE TECHNOLOGIES
+0x0000E8, ACCTON TECHNOLOGY CORP.
+0x0000E9, ISICAD, INC.
+0x0000EA, UPNOD AB
+0x0000EB, MATSUSHITA COMM. IND. CO. LTD.
+0x0000EC, MICROPROCESS
+0x0000ED, APRIL
+0x0000EE, NETWORK DESIGNERS, LTD.
+0x0000EF, KTI
+0x0000F0, SAMSUNG ELECTRONICS CO., LTD.
+0x0000F1, MAGNA COMPUTER CORPORATION
+0x0000F2, SPIDER COMMUNICATIONS
+0x0000F3, GANDALF DATA LIMITED
+0x0000F4, Allied Telesis
+0x0000F5, DIAMOND SALES LIMITED
+0x0000F6, APPLIED MICROSYSTEMS CORP.
+0x0000F7, YOUTH KEEP ENTERPRISE CO LTD
+0x0000F8, DIGITAL EQUIPMENT CORPORATION
+0x0000F9, QUOTRON SYSTEMS INC.
+0x0000FA, MICROSAGE COMPUTER SYSTEMS INC
+0x0000FB, RECHNER ZUR KOMMUNIKATION
+0x0000FC, MEIKO
+0x0000FD, HIGH LEVEL HARDWARE
+0x0000FE, ANNAPOLIS MICRO SYSTEMS
+0x0000FF, CAMTEC ELECTRONICS LTD.
+0x000100, EQUIP'TRANS
+0x000101, PRIVATE
+0x000102, 3COM CORPORATION
+0x000103, 3COM CORPORATION
+0x000104, DVICO Co., Ltd.
+0x000105, Beckhoff Automation GmbH
+0x000106, Tews Datentechnik GmbH
+0x000107, Leiser GmbH
+0x000108, AVLAB Technology, Inc.
+0x000109, Nagano Japan Radio Co., Ltd.
+0x00010A, CIS TECHNOLOGY INC.
+0x00010B, Space CyberLink, Inc.
+0x00010C, System Talks Inc.
+0x00010D, CORECO, INC.
+0x00010E, Bri-Link Technologies Co., Ltd
+0x00010F, Brocade Communications Systems, Inc.
+0x000110, Gotham Networks
+0x000111, iDigm Inc.
+0x000112, Shark Multimedia Inc.
+0x000113, OLYMPUS CORPORATION
+0x000114, KANDA TSUSHIN KOGYO CO., LTD.
+0x000115, EXTRATECH CORPORATION
+0x000116, Netspect Technologies, Inc.
+0x000117, CANAL +
+0x000118, EZ Digital Co., Ltd.
+0x000119, RTUnet (Australia)
+0x00011A, EEH DataLink GmbH
+0x00011B, Unizone Technologies, Inc.
+0x00011C, Universal Talkware Corporation
+0x00011D, Centillium Communications
+0x00011E, Precidia Technologies, Inc.
+0x00011F, RC Networks, Inc.
+0x000120, OSCILLOQUARTZ S.A.
+0x000121, Watchguard Technologies, Inc.
+0x000122, Trend Communications, Ltd.
+0x000123, DIGITAL ELECTRONICS CORP.
+0x000124, Acer Incorporated
+0x000125, YAESU MUSEN CO., LTD.
+0x000126, PAC Labs
+0x000127, OPEN Networks Pty Ltd
+0x000128, EnjoyWeb, Inc.
+0x000129, DFI Inc.
+0x00012A, Telematica Sistems Inteligente
+0x00012B, TELENET Co., Ltd.
+0x00012C, Aravox Technologies, Inc.
+0x00012D, Komodo Technology
+0x00012E, PC Partner Ltd.
+0x00012F, Twinhead International Corp
+0x000130, Extreme Networks
+0x000131, Bosch Security Systems, Inc.
+0x000132, Dranetz - BMI
+0x000133, KYOWA Electronic Instruments C
+0x000134, Selectron Systems AG
+0x000135, KDC Corp.
+0x000136, CyberTAN Technology, Inc.
+0x000137, IT Farm Corporation
+0x000138, XAVi Technologies Corp.
+0x000139, Point Multimedia Systems
+0x00013A, SHELCAD COMMUNICATIONS, LTD.
+0x00013B, BNA SYSTEMS
+0x00013C, TIW SYSTEMS
+0x00013D, RiscStation Ltd.
+0x00013E, Ascom Tateco AB
+0x00013F, Neighbor World Co., Ltd.
+0x000140, Sendtek Corporation
+0x000141, CABLE PRINT
+0x000142, CISCO SYSTEMS, INC.
+0x000143, CISCO SYSTEMS, INC.
+0x000144, EMC Corporation
+0x000145, WINSYSTEMS, INC.
+0x000146, Tesco Controls, Inc.
+0x000147, Zhone Technologies
+0x000148, X-traWeb Inc.
+0x000149, T.D.T. Transfer Data Test GmbH
+0x00014A, Sony Corporation
+0x00014B, Ennovate Networks, Inc.
+0x00014C, Berkeley Process Control
+0x00014D, Shin Kin Enterprises Co., Ltd
+0x00014E, WIN Enterprises, Inc.
+0x00014F, ADTRAN INC
+0x000150, GILAT COMMUNICATIONS, LTD.
+0x000151, Ensemble Communications
+0x000152, CHROMATEK INC.
+0x000153, ARCHTEK TELECOM CORPORATION
+0x000154, G3M Corporation
+0x000155, Promise Technology, Inc.
+0x000156, FIREWIREDIRECT.COM, INC.
+0x000157, SYSWAVE CO., LTD
+0x000158, Electro Industries/Gauge Tech
+0x000159, S1 Corporation
+0x00015A, Digital Video Broadcasting
+0x00015B, ITALTEL S.p.A/RF-UP-I
+0x00015C, CADANT INC.
+0x00015D, Oracle Corporation
+0x00015E, BEST TECHNOLOGY CO., LTD.
+0x00015F, DIGITAL DESIGN GmbH
+0x000160, ELMEX Co., LTD.
+0x000161, Meta Machine Technology
+0x000162, Cygnet Technologies, Inc.
+0x000163, CISCO SYSTEMS, INC.
+0x000164, CISCO SYSTEMS, INC.
+0x000165, AirSwitch Corporation
+0x000166, TC GROUP A/S
+0x000167, HIOKI E.E. CORPORATION
+0x000168, VITANA CORPORATION
+0x000169, Celestix Networks Pte Ltd.
+0x00016A, ALITEC
+0x00016B, LightChip, Inc.
+0x00016C, FOXCONN
+0x00016D, CarrierComm Inc.
+0x00016E, Conklin Corporation
+0x00016F, Inkel Corp.
+0x000170, ESE Embedded System Engineer'g
+0x000171, Allied Data Technologies
+0x000172, TechnoLand Co., LTD.
+0x000173, AMCC
+0x000174, CyberOptics Corporation
+0x000175, Radiant Communications Corp.
+0x000176, Orient Silver Enterprises
+0x000177, EDSL
+0x000178, MARGI Systems, Inc.
+0x000179, WIRELESS TECHNOLOGY, INC.
+0x00017A, Chengdu Maipu Electric Industrial Co., Ltd.
+0x00017B, Heidelberger Druckmaschinen AG
+0x00017C, AG-E GmbH
+0x00017D, ThermoQuest
+0x00017E, ADTEK System Science Co., Ltd.
+0x00017F, Experience Music Project
+0x000180, AOpen, Inc.
+0x000181, Nortel Networks
+0x000182, DICA TECHNOLOGIES AG
+0x000183, ANITE TELECOMS
+0x000184, SIEB & MEYER AG
+0x000185, Hitachi Aloka Medical, Ltd.
+0x000186, Uwe Disch
+0x000187, i2SE GmbH
+0x000188, LXCO Technologies ag
+0x000189, Refraction Technology, Inc.
+0x00018A, ROI COMPUTER AG
+0x00018B, NetLinks Co., Ltd.
+0x00018C, Mega Vision
+0x00018D, AudeSi Technologies
+0x00018E, Logitec Corporation
+0x00018F, Kenetec, Inc.
+0x000190, SMK-M
+0x000191, SYRED Data Systems
+0x000192, Texas Digital Systems
+0x000193, Hanbyul Telecom Co., Ltd.
+0x000194, Capital Equipment Corporation
+0x000195, Sena Technologies, Inc.
+0x000196, CISCO SYSTEMS, INC.
+0x000197, CISCO SYSTEMS, INC.
+0x000198, Darim Vision
+0x000199, HeiSei Electronics
+0x00019A, LEUNIG GmbH
+0x00019B, Kyoto Microcomputer Co., Ltd.
+0x00019C, JDS Uniphase Inc.
+0x00019D, E-Control Systems, Inc.
+0x00019E, ESS Technology, Inc.
+0x00019F, ReadyNet
+0x0001A0, Infinilink Corporation
+0x0001A1, Mag-Tek, Inc.
+0x0001A2, Logical Co., Ltd.
+0x0001A3, GENESYS LOGIC, INC.
+0x0001A4, Microlink Corporation
+0x0001A5, Nextcomm, Inc.
+0x0001A6, Scientific-Atlanta Arcodan A/S
+0x0001A7, UNEX TECHNOLOGY CORPORATION
+0x0001A8, Welltech Computer Co., Ltd.
+0x0001A9, BMW AG
+0x0001AA, Airspan Communications, Ltd.
+0x0001AB, Main Street Networks
+0x0001AC, Sitara Networks, Inc.
+0x0001AD, Coach Master International  d.b.a. CMI Worldwide, Inc.
+0x0001AE, Trex Enterprises
+0x0001AF, Emerson Network Power
+0x0001B0, Fulltek Technology Co., Ltd.
+0x0001B1, General Bandwidth
+0x0001B2, Digital Processing Systems, Inc.
+0x0001B3, Precision Electronic Manufacturing
+0x0001B4, Wayport, Inc.
+0x0001B5, Turin Networks, Inc.
+0x0001B6, SAEJIN T&M Co., Ltd.
+0x0001B7, Centos, Inc.
+0x0001B8, Netsensity, Inc.
+0x0001B9, SKF Condition Monitoring
+0x0001BA, IC-Net, Inc.
+0x0001BB, Frequentis
+0x0001BC, Brains Corporation
+0x0001BD, Peterson Electro-Musical Products, Inc.
+0x0001BE, Gigalink Co., Ltd.
+0x0001BF, Teleforce Co., Ltd.
+0x0001C0, CompuLab, Ltd.
+0x0001C1, Vitesse Semiconductor Corporation
+0x0001C2, ARK Research Corp.
+0x0001C3, Acromag, Inc.
+0x0001C4, NeoWave, Inc.
+0x0001C5, Simpler Networks
+0x0001C6, Quarry Technologies
+0x0001C7, CISCO SYSTEMS, INC.
+0x0001C8, THOMAS CONRAD CORP.
+0x0001C8, CONRAD CORP.
+0x0001C9, CISCO SYSTEMS, INC.
+0x0001CA, Geocast Network Systems, Inc.
+0x0001CB, EVR
+0x0001CC, Japan Total Design Communication Co., Ltd.
+0x0001CD, ARtem
+0x0001CE, Custom Micro Products, Ltd.
+0x0001CF, Alpha Data Parallel Systems, Ltd.
+0x0001D0, VitalPoint, Inc.
+0x0001D1, CoNet Communications, Inc.
+0x0001D2, inXtron, Inc.
+0x0001D3, PAXCOMM, Inc.
+0x0001D4, Leisure Time, Inc.
+0x0001D5, HAEDONG INFO & COMM CO., LTD
+0x0001D6, manroland AG
+0x0001D7, F5 Networks, Inc.
+0x0001D8, Teltronics, Inc.
+0x0001D9, Sigma, Inc.
+0x0001DA, WINCOMM Corporation
+0x0001DB, Freecom Technologies GmbH
+0x0001DC, Activetelco
+0x0001DD, Avail Networks
+0x0001DE, Trango Systems, Inc.
+0x0001DF, ISDN Communications, Ltd.
+0x0001E0, Fast Systems, Inc.
+0x0001E1, Kinpo Electronics, Inc.
+0x0001E2, Ando Electric Corporation
+0x0001E3, Siemens AG
+0x0001E4, Sitera, Inc.
+0x0001E5, Supernet, Inc.
+0x0001E6, Hewlett-Packard Company
+0x0001E7, Hewlett-Packard Company
+0x0001E8, Force10 Networks, Inc.
+0x0001E9, Litton Marine Systems B.V.
+0x0001EA, Cirilium Corp.
+0x0001EB, C-COM Corporation
+0x0001EC, Ericsson Group
+0x0001ED, SETA Corp.
+0x0001EE, Comtrol Europe, Ltd.
+0x0001EF, Camtel Technology Corp.
+0x0001F0, Tridium, Inc.
+0x0001F1, Innovative Concepts, Inc.
+0x0001F2, Mark of the Unicorn, Inc.
+0x0001F3, QPS, Inc.
+0x0001F4, Enterasys Networks
+0x0001F5, ERIM S.A.
+0x0001F6, Association of Musical Electronics Industry
+0x0001F7, Image Display Systems, Inc.
+0x0001F8, Adherent Systems, Ltd.
+0x0001F9, TeraGlobal Communications Corp.
+0x0001FA, HOROSCAS
+0x0001FB, DoTop Technology, Inc.
+0x0001FC, Keyence Corporation
+0x0001FD, Digital Voice Systems, Inc.
+0x0001FE, DIGITAL EQUIPMENT CORPORATION
+0x0001FF, Data Direct Networks, Inc.
+0x000200, Net & Sys Co., Ltd.
+0x000201, IFM Electronic gmbh
+0x000202, Amino Communications, Ltd.
+0x000203, Woonsang Telecom, Inc.
+0x000204, Bodmann Industries Elektronik GmbH
+0x000205, Hitachi Denshi, Ltd.
+0x000206, Telital R&D Denmark A/S
+0x000207, VisionGlobal Network Corp.
+0x000208, Unify Networks, Inc.
+0x000209, Shenzhen SED Information Technology Co., Ltd.
+0x00020A, Gefran Spa
+0x00020B, Native Networks, Inc.
+0x00020C, Metro-Optix
+0x00020D, Micronpc.com
+0x00020E, ECI Telecom, Ltd., NSD-US
+0x00020F, AATR
+0x000210, Fenecom
+0x000211, Nature Worldwide Technology Corp.
+0x000212, SierraCom
+0x000213, S.D.E.L.
+0x000214, DTVRO
+0x000215, Cotas Computer Technology A/B
+0x000216, CISCO SYSTEMS, INC.
+0x000217, CISCO SYSTEMS, INC.
+0x000218, Advanced Scientific Corp
+0x000219, Paralon Technologies
+0x00021A, Zuma Networks
+0x00021B, Kollmorgen-Servotronix
+0x00021C, Network Elements, Inc.
+0x00021D, Data General Communication Ltd.
+0x00021E, SIMTEL S.R.L.
+0x00021F, Aculab PLC
+0x000220, CANON FINETECH INC.
+0x000221, DSP Application, Ltd.
+0x000222, Chromisys, Inc.
+0x000223, ClickTV
+0x000224, C-COR
+0x000225, One Stop Systems
+0x000226, XESystems, Inc.
+0x000227, ESD Electronic System Design GmbH
+0x000228, Necsom, Ltd.
+0x000229, Adtec Corporation
+0x00022A, Asound Electronic
+0x00022B, SAXA, Inc.
+0x00022C, ABB Bomem, Inc.
+0x00022D, Agere Systems
+0x00022E, TEAC Corp. R& D
+0x00022F, P-Cube, Ltd.
+0x000230, Intersoft Electronics
+0x000231, Ingersoll-Rand
+0x000232, Avision, Inc.
+0x000233, Mantra Communications, Inc.
+0x000234, Imperial Technology, Inc.
+0x000235, Paragon Networks International
+0x000236, INIT GmbH
+0x000237, Cosmo Research Corp.
+0x000238, Serome Technology, Inc.
+0x000239, Visicom
+0x00023A, ZSK Stickmaschinen GmbH
+0x00023B, Ericsson
+0x00023C, Creative Technology, Ltd.
+0x00023D, Cisco Systems, Inc.
+0x00023E, Selta Telematica S.p.a
+0x00023F, Compal Electronics, Inc.
+0x000240, Seedek Co., Ltd.
+0x000241, Amer.com
+0x000242, Videoframe Systems
+0x000243, Raysis Co., Ltd.
+0x000244, SURECOM Technology Co.
+0x000245, Lampus Co, Ltd.
+0x000246, All-Win Tech Co., Ltd.
+0x000247, Great Dragon Information Technology (Group) Co., Ltd.
+0x000248, Pilz GmbH & Co.
+0x000249, Aviv Infocom Co, Ltd.
+0x00024A, CISCO SYSTEMS, INC.
+0x00024B, CISCO SYSTEMS, INC.
+0x00024C, SiByte, Inc.
+0x00024D, Mannesman Dematic Colby Pty. Ltd.
+0x00024E, Datacard Group
+0x00024F, IPM Datacom S.R.L.
+0x000250, Geyser Networks, Inc.
+0x000251, Soma Networks, Inc.
+0x000252, Carrier Corporation
+0x000253, Televideo, Inc.
+0x000254, WorldGate
+0x000255, IBM Corp
+0x000256, Alpha Processor, Inc.
+0x000257, Microcom Corp.
+0x000258, Flying Packets Communications
+0x000259, Tsann Kuen China (Shanghai)Enterprise Co., Ltd. IT Group
+0x00025A, Catena Networks
+0x00025B, Cambridge Silicon Radio
+0x00025C, SCI Systems (Kunshan) Co., Ltd.
+0x00025D, Calix Networks
+0x00025E, High Technology Ltd
+0x00025F, Nortel Networks
+0x000260, Accordion Networks, Inc.
+0x000261, Tilgin AB
+0x000262, Soyo Group Soyo Com Tech Co., Ltd
+0x000263, UPS Manufacturing SRL
+0x000264, AudioRamp.com
+0x000265, Virditech Co. Ltd.
+0x000266, Thermalogic Corporation
+0x000267, NODE RUNNER, INC.
+0x000268, Harris Government Communications
+0x000269, Nadatel Co., Ltd
+0x00026A, Cocess Telecom Co., Ltd.
+0x00026B, BCM Computers Co., Ltd.
+0x00026C, Philips CFT
+0x00026D, Adept Telecom
+0x00026E, NeGeN Access, Inc.
+0x00026F, Senao International Co., Ltd.
+0x000270, Crewave Co., Ltd.
+0x000271, Zhone Technologies
+0x000272, CC&C Technologies, Inc.
+0x000273, Coriolis Networks
+0x000274, Tommy Technologies Corp.
+0x000275, SMART Technologies, Inc.
+0x000276, Primax Electronics Ltd.
+0x000277, Cash Systemes Industrie
+0x000278, Samsung Electro-Mechanics Co., Ltd.
+0x000279, Control Applications, Ltd.
+0x00027A, IOI Technology Corporation
+0x00027B, Amplify Net, Inc.
+0x00027C, Trilithic, Inc.
+0x00027D, CISCO SYSTEMS, INC.
+0x00027E, CISCO SYSTEMS, INC.
+0x00027F, ask-technologies.com
+0x000280, Mu Net, Inc.
+0x000281, Madge Ltd.
+0x000282, ViaClix, Inc.
+0x000283, Spectrum Controls, Inc.
+0x000284, AREVA T&D
+0x000285, Riverstone Networks
+0x000286, Occam Networks
+0x000287, Adapcom
+0x000288, GLOBAL VILLAGE COMMUNICATION
+0x000289, DNE Technologies
+0x00028A, Ambit Microsystems Corporation
+0x00028B, VDSL Systems OY
+0x00028C, Micrel-Synergy Semiconductor
+0x00028D, Movita Technologies, Inc.
+0x00028E, Rapid 5 Networks, Inc.
+0x00028F, Globetek, Inc.
+0x000290, Woorigisool, Inc.
+0x000291, Open Network Co., Ltd.
+0x000292, Logic Innovations, Inc.
+0x000293, Solid Data Systems
+0x000294, Tokyo Sokushin Co., Ltd.
+0x000295, IP.Access Limited
+0x000296, Lectron Co,. Ltd.
+0x000297, C-COR.net
+0x000298, Broadframe Corporation
+0x000299, Apex, Inc.
+0x00029A, Storage Apps
+0x00029B, Kreatel Communications AB
+0x00029C, 3COM
+0x00029D, Merix Corp.
+0x00029E, Information Equipment Co., Ltd.
+0x00029F, L-3 Communication Aviation Recorders
+0x0002A0, Flatstack Ltd.
+0x0002A1, World Wide Packets
+0x0002A2, Hilscher GmbH
+0x0002A3, ABB Switzerland Ltd, Power Systems
+0x0002A4, AddPac Technology Co., Ltd.
+0x0002A5, Hewlett-Packard Company
+0x0002A6, Effinet Systems Co., Ltd.
+0x0002A7, Vivace Networks
+0x0002A8, Air Link Technology
+0x0002A9, RACOM, s.r.o.
+0x0002AA, PLcom Co., Ltd.
+0x0002AB, CTC Union Technologies Co., Ltd.
+0x0002AC, 3PAR data
+0x0002AD, HOYA Corporation
+0x0002AE, Scannex Electronics Ltd.
+0x0002AF, TeleCruz Technology, Inc.
+0x0002B0, Hokubu Communication & Industrial Co., Ltd.
+0x0002B1, Anritsu, Ltd.
+0x0002B2, Cablevision
+0x0002B3, Intel Corporation
+0x0002B4, DAPHNE
+0x0002B5, Avnet, Inc.
+0x0002B6, Acrosser Technology Co., Ltd.
+0x0002B7, Watanabe Electric Industry Co., Ltd.
+0x0002B8, WHI KONSULT AB
+0x0002B9, CISCO SYSTEMS, INC.
+0x0002BA, CISCO SYSTEMS, INC.
+0x0002BB, Continuous Computing Corp
+0x0002BC, LVL 7 Systems, Inc.
+0x0002BD, Bionet Co., Ltd.
+0x0002BE, Totsu Engineering, Inc.
+0x0002BF, dotRocket, Inc.
+0x0002C0, Bencent Tzeng Industry Co., Ltd.
+0x0002C1, Innovative Electronic Designs, Inc.
+0x0002C2, Net Vision Telecom
+0x0002C3, Arelnet Ltd.
+0x0002C4, Vector International BVBA
+0x0002C5, Evertz Microsystems Ltd.
+0x0002C6, Data Track Technology PLC
+0x0002C7, ALPS ELECTRIC Co., Ltd.
+0x0002C8, Technocom Communications Technology (pte) Ltd
+0x0002C9, Mellanox Technologies
+0x0002CA, EndPoints, Inc.
+0x0002CB, TriState Ltd.
+0x0002CC, M.C.C.I
+0x0002CD, TeleDream, Inc.
+0x0002CE, FoxJet, Inc.
+0x0002CF, ZyGate Communications, Inc.
+0x0002D0, Comdial Corporation
+0x0002D1, Vivotek, Inc.
+0x0002D2, Workstation AG
+0x0002D3, NetBotz, Inc.
+0x0002D4, PDA Peripherals, Inc.
+0x0002D5, ACR
+0x0002D6, NICE Systems
+0x0002D7, EMPEG Ltd
+0x0002D8, BRECIS Communications Corporation
+0x0002D9, Reliable Controls
+0x0002DA, ExiO Communications, Inc.
+0x0002DB, NETSEC
+0x0002DC, Fujitsu General Limited
+0x0002DD, Bromax Communications, Ltd.
+0x0002DE, Astrodesign, Inc.
+0x0002DF, Net Com Systems, Inc.
+0x0002E0, ETAS GmbH
+0x0002E1, Integrated Network Corporation
+0x0002E2, NDC Infared Engineering
+0x0002E3, LITE-ON Communications, Inc.
+0x0002E4, JC HYUN Systems, Inc.
+0x0002E5, Timeware Ltd.
+0x0002E6, Gould Instrument Systems, Inc.
+0x0002E7, CAB GmbH & Co KG
+0x0002E8, E.D.&A.
+0x0002E9, CS Systemes De Securite - C3S
+0x0002EA, Focus Enhancements
+0x0002EB, Pico Communications
+0x0002EC, Maschoff Design Engineering
+0x0002ED, DXO Telecom Co., Ltd.
+0x0002EE, Nokia Danmark A/S
+0x0002EF, CCC Network Systems Group Ltd.
+0x0002F0, AME Optimedia Technology Co., Ltd.
+0x0002F1, Pinetron Co., Ltd.
+0x0002F2, eDevice, Inc.
+0x0002F3, Media Serve Co., Ltd.
+0x0002F4, PCTEL, Inc.
+0x0002F5, VIVE Synergies, Inc.
+0x0002F6, Equipe Communications
+0x0002F7, ARM
+0x0002F8, SEAKR Engineering, Inc.
+0x0002F9, Mimos Semiconductor SDN BHD
+0x0002FA, DX Antenna Co., Ltd.
+0x0002FB, Baumuller Aulugen-Systemtechnik GmbH
+0x0002FC, CISCO SYSTEMS, INC.
+0x0002FD, CISCO SYSTEMS, INC.
+0x0002FE, Viditec, Inc.
+0x0002FF, Handan BroadInfoCom
+0x000300, Barracuda Networks, Inc.
+0x000301, Avantas Networks Corporation
+0x000302, Charles Industries, Ltd.
+0x000303, JAMA Electronics Co., Ltd.
+0x000304, Pacific Broadband Communications
+0x000305, MSC Vertriebs GmbH
+0x000306, Fusion In Tech Co., Ltd.
+0x000307, Secure Works, Inc.
+0x000308, AM Communications, Inc.
+0x000309, Texcel Technology PLC
+0x00030A, Argus Technologies
+0x00030B, Hunter Technology, Inc.
+0x00030C, Telesoft Technologies Ltd.
+0x00030D, Uniwill Computer Corp.
+0x00030E, Core Communications Co., Ltd.
+0x00030F, Digital China (Shanghai) Networks Ltd.
+0x000310, ITX E-Globaledge Corporation
+0x000311, Micro Technology Co., Ltd.
+0x000312, TR-Systemtechnik GmbH
+0x000313, Access Media SPA
+0x000314, Teleware Network Systems
+0x000315, Cidco Incorporated
+0x000316, Nobell Communications, Inc.
+0x000317, Merlin Systems, Inc.
+0x000318, Cyras Systems, Inc.
+0x000319, Infineon AG
+0x00031A, Beijing Broad Telecom Ltd., China
+0x00031B, Cellvision Systems, Inc.
+0x00031C, Svenska Hardvarufabriken AB
+0x00031D, Taiwan Commate Computer, Inc.
+0x00031E, Optranet, Inc.
+0x00031F, Condev Ltd.
+0x000320, Xpeed, Inc.
+0x000321, Reco Research Co., Ltd.
+0x000322, IDIS Co., Ltd.
+0x000323, Cornet Technology, Inc.
+0x000324, SANYO Consumer Electronics Co., Ltd.
+0x000325, Arima Computer Corp.
+0x000326, Iwasaki Information Systems Co., Ltd.
+0x000327, ACT'L
+0x000328, Mace Group, Inc.
+0x000329, F3, Inc.
+0x00032A, UniData Communication Systems, Inc.
+0x00032B, GAI Datenfunksysteme GmbH
+0x00032C, ABB Switzerland Ltd
+0x00032D, IBASE Technology, Inc.
+0x00032E, Scope Information Management, Ltd.
+0x00032F, Global Sun Technology, Inc.
+0x000330, Imagenics, Co., Ltd.
+0x000331, CISCO SYSTEMS, INC.
+0x000332, CISCO SYSTEMS, INC.
+0x000333, Digitel Co., Ltd.
+0x000334, Newport Electronics
+0x000335, Mirae Technology
+0x000336, Zetes Technologies
+0x000337, Vaone, Inc.
+0x000338, Oak Technology
+0x000339, Eurologic Systems, Ltd.
+0x00033A, Silicon Wave, Inc.
+0x00033B, TAMI Tech Co., Ltd.
+0x00033C, Daiden Co., Ltd.
+0x00033D, ILSHin Lab
+0x00033E, Tateyama System Laboratory Co., Ltd.
+0x00033F, BigBand Networks, Ltd.
+0x000340, Floware Wireless Systems, Ltd.
+0x000341, Axon Digital Design
+0x000342, Nortel Networks
+0x000343, Martin Professional A/S
+0x000344, Tietech.Co., Ltd.
+0x000345, Routrek Networks Corporation
+0x000346, Hitachi Kokusai Electric, Inc.
+0x000347, Intel Corporation
+0x000348, Norscan Instruments, Ltd.
+0x000349, Vidicode Datacommunicatie B.V.
+0x00034A, RIAS Corporation
+0x00034B, Nortel Networks
+0x00034C, Shanghai DigiVision Technology Co., Ltd.
+0x00034D, Chiaro Networks, Ltd.
+0x00034E, Pos Data Company, Ltd.
+0x00034F, Sur-Gard Security
+0x000350, BTICINO SPA
+0x000351, Diebold, Inc.
+0x000352, Colubris Networks
+0x000353, Mitac, Inc.
+0x000354, Fiber Logic Communications
+0x000355, TeraBeam Internet Systems
+0x000356, Wincor Nixdorf International GmbH
+0x000357, Intervoice-Brite, Inc.
+0x000358, Hanyang Digitech Co., Ltd.
+0x000359, DigitalSis
+0x00035A, Photron Limited
+0x00035B, BridgeWave Communications
+0x00035C, Saint Song Corp.
+0x00035D, Bosung Hi-Net Co., Ltd.
+0x00035E, Metropolitan Area Networks, Inc.
+0x00035F, Prüftechnik Condition Monitoring GmbH & Co. KG
+0x000360, PAC Interactive Technology, Inc.
+0x000361, Widcomm, Inc.
+0x000362, Vodtel Communications, Inc.
+0x000363, Miraesys Co., Ltd.
+0x000364, Scenix Semiconductor, Inc.
+0x000365, Kira Information & Communications, Ltd.
+0x000366, ASM Pacific Technology
+0x000367, Jasmine Networks, Inc.
+0x000368, Embedone Co., Ltd.
+0x000369, Nippon Antenna Co., Ltd.
+0x00036A, Mainnet, Ltd.
+0x00036B, CISCO SYSTEMS, INC.
+0x00036C, CISCO SYSTEMS, INC.
+0x00036D, Runtop, Inc.
+0x00036E, Nicon Systems (Pty) Limited
+0x00036F, Telsey SPA
+0x000370, NXTV, Inc.
+0x000371, Acomz Networks Corp.
+0x000372, ULAN
+0x000373, Aselsan A.S
+0x000374, Control Microsystems
+0x000375, NetMedia, Inc.
+0x000376, Graphtec Technology, Inc.
+0x000377, Gigabit Wireless
+0x000378, HUMAX Co., Ltd.
+0x000379, Proscend Communications, Inc.
+0x00037A, Taiyo Yuden Co., Ltd.
+0x00037B, IDEC IZUMI Corporation
+0x00037C, Coax Media
+0x00037D, Stellcom
+0x00037E, PORTech Communications, Inc.
+0x00037F, Atheros Communications, Inc.
+0x000380, SSH Communications Security Corp.
+0x000381, Ingenico International
+0x000382, A-One Co., Ltd.
+0x000383, Metera Networks, Inc.
+0x000384, AETA
+0x000385, Actelis Networks, Inc.
+0x000386, Ho Net, Inc.
+0x000387, Blaze Network Products
+0x000388, Fastfame Technology Co., Ltd.
+0x000389, Plantronics
+0x00038A, America Online, Inc.
+0x00038B, PLUS-ONE I&T, Inc.
+0x00038C, Total Impact
+0x00038D, PCS Revenue Control Systems, Inc.
+0x00038E, Atoga Systems, Inc.
+0x00038F, Weinschel Corporation
+0x000390, Digital Video Communications, Inc.
+0x000391, Advanced Digital Broadcast, Ltd.
+0x000392, Hyundai Teletek Co., Ltd.
+0x000393, Apple Computer, Inc.
+0x000394, Connect One
+0x000395, California Amplifier
+0x000396, EZ Cast Co., Ltd.
+0x000397, Watchfront Limited
+0x000398, WISI
+0x000399, Dongju Informations & Communications Co., Ltd.
+0x00039A, SiConnect
+0x00039B, NetChip Technology, Inc.
+0x00039C, OptiMight Communications, Inc.
+0x00039D, Qisda Corporation
+0x00039E, Tera System Co., Ltd.
+0x00039F, CISCO SYSTEMS, INC.
+0x0003A0, CISCO SYSTEMS, INC.
+0x0003A1, HIPER Information & Communication, Inc.
+0x0003A2, Catapult Communications
+0x0003A3, MAVIX, Ltd.
+0x0003A4, Imation Corp.
+0x0003A5, Medea Corporation
+0x0003A6, Traxit Technology, Inc.
+0x0003A7, Unixtar Technology, Inc.
+0x0003A8, IDOT Computers, Inc.
+0x0003A9, AXCENT Media AG
+0x0003AA, Watlow
+0x0003AB, Bridge Information Systems
+0x0003AC, Fronius Schweissmaschinen
+0x0003AD, Emerson Energy Systems AB
+0x0003AE, Allied Advanced Manufacturing Pte, Ltd.
+0x0003AF, Paragea Communications
+0x0003B0, Xsense Technology Corp.
+0x0003B1, Hospira Inc.
+0x0003B2, Radware
+0x0003B3, IA Link Systems Co., Ltd.
+0x0003B4, Macrotek International Corp.
+0x0003B5, Entra Technology Co.
+0x0003B6, QSI Corporation
+0x0003B7, ZACCESS Systems
+0x0003B8, NetKit Solutions, LLC
+0x0003B9, Hualong Telecom Co., Ltd.
+0x0003BA, Oracle Corporation
+0x0003BB, Signal Communications Limited
+0x0003BC, COT GmbH
+0x0003BD, OmniCluster Technologies, Inc.
+0x0003BE, Netility
+0x0003BF, Centerpoint Broadband Technologies, Inc.
+0x0003C0, RFTNC Co., Ltd.
+0x0003C1, Packet Dynamics Ltd
+0x0003C2, Solphone K.K.
+0x0003C3, Micronik Multimedia
+0x0003C4, Tomra Systems ASA
+0x0003C5, Mobotix AG
+0x0003C6, ICUE Systems, Inc.
+0x0003C7, hopf Elektronik GmbH
+0x0003C8, CML Emergency Services
+0x0003C9, TECOM Co., Ltd.
+0x0003CA, MTS Systems Corp.
+0x0003CB, Nippon Systems Development Co., Ltd.
+0x0003CC, Momentum Computer, Inc.
+0x0003CD, Clovertech, Inc.
+0x0003CE, ETEN Technologies, Inc.
+0x0003CF, Muxcom, Inc.
+0x0003D0, KOANKEISO Co., Ltd.
+0x0003D1, Takaya Corporation
+0x0003D2, Crossbeam Systems, Inc.
+0x0003D3, Internet Energy Systems, Inc.
+0x0003D4, Alloptic, Inc.
+0x0003D5, Advanced Communications Co., Ltd.
+0x0003D6, RADVision, Ltd.
+0x0003D7, NextNet Wireless, Inc.
+0x0003D8, iMPath Networks, Inc.
+0x0003D9, Secheron SA
+0x0003DA, Takamisawa Cybernetics Co., Ltd.
+0x0003DB, Apogee Electronics Corp.
+0x0003DC, Lexar Media, Inc.
+0x0003DD, Comark Corp.
+0x0003DE, OTC Wireless
+0x0003DF, Desana Systems
+0x0003E0, Motorola, Inc.
+0x0003E1, Winmate Communication, Inc.
+0x0003E2, Comspace Corporation
+0x0003E3, CISCO SYSTEMS, INC.
+0x0003E4, CISCO SYSTEMS, INC.
+0x0003E5, Hermstedt SG
+0x0003E6, Entone, Inc.
+0x0003E7, Logostek Co. Ltd.
+0x0003E8, Wavelength Digital Limited
+0x0003E9, Akara Canada, Inc.
+0x0003EA, Mega System Technologies, Inc.
+0x0003EB, Atrica
+0x0003EC, ICG Research, Inc.
+0x0003ED, Shinkawa Electric Co., Ltd.
+0x0003EE, MKNet Corporation
+0x0003EF, Oneline AG
+0x0003F0, Redfern Broadband Networks
+0x0003F1, Cicada Semiconductor, Inc.
+0x0003F2, Seneca Networks
+0x0003F3, Dazzle Multimedia, Inc.
+0x0003F4, NetBurner
+0x0003F5, Chip2Chip
+0x0003F6, Allegro Networks, Inc.
+0x0003F7, Plast-Control GmbH
+0x0003F8, SanCastle Technologies, Inc.
+0x0003F9, Pleiades Communications, Inc.
+0x0003FA, TiMetra Networks
+0x0003FB, ENEGATE Co.,Ltd.
+0x0003FC, Intertex Data AB
+0x0003FD, CISCO SYSTEMS, INC.
+0x0003FE, CISCO SYSTEMS, INC.
+0x0003FF, Microsoft Corporation
+0x000400, LEXMARK INTERNATIONAL, INC.
+0x000401, Osaki Electric Co., Ltd.
+0x000402, Nexsan Technologies, Ltd.
+0x000403, Nexsi Corporation
+0x000404, Makino Milling Machine Co., Ltd.
+0x000405, ACN Technologies
+0x000406, Fa. Metabox AG
+0x000407, Topcon Positioning Systems, Inc.
+0x000408, Sanko Electronics Co., Ltd.
+0x000409, Cratos Networks
+0x00040A, Sage Systems
+0x00040B, 3com Europe Ltd.
+0x00040C, KANNO Work's Ltd.
+0x00040D, Avaya, Inc.
+0x00040E, AVM GmbH
+0x00040F, Asus Network Technologies, Inc.
+0x000410, Spinnaker Networks, Inc.
+0x000411, Inkra Networks, Inc.
+0x000412, WaveSmith Networks, Inc.
+0x000413, SNOM Technology AG
+0x000414, Umezawa Musen Denki Co., Ltd.
+0x000415, Rasteme Systems Co., Ltd.
+0x000416, Parks S/A Comunicacoes Digitais
+0x000417, ELAU AG
+0x000418, Teltronic S.A.U.
+0x000419, Fibercycle Networks, Inc.
+0x00041A, Ines Test and Measurement GmbH & CoKG
+0x00041B, Bridgeworks Ltd.
+0x00041C, ipDialog, Inc.
+0x00041D, Corega of America
+0x00041E, Shikoku Instrumentation Co., Ltd.
+0x00041F, Sony Computer Entertainment, Inc.
+0x000420, Slim Devices, Inc.
+0x000421, Ocular Networks
+0x000422, Gordon Kapes, Inc.
+0x000423, Intel Corporation
+0x000424, TMC s.r.l.
+0x000425, Atmel Corporation
+0x000426, Autosys
+0x000427, CISCO SYSTEMS, INC.
+0x000428, CISCO SYSTEMS, INC.
+0x000429, Pixord Corporation
+0x00042A, Wireless Networks, Inc.
+0x00042B, IT Access Co., Ltd.
+0x00042C, Minet, Inc.
+0x00042D, Sarian Systems, Ltd.
+0x00042E, Netous Technologies, Ltd.
+0x00042F, International Communications Products, Inc.
+0x000430, Netgem
+0x000431, GlobalStreams, Inc.
+0x000432, Voyetra Turtle Beach, Inc.
+0x000433, Cyberboard A/S
+0x000434, Accelent Systems, Inc.
+0x000435, Comptek International, Inc.
+0x000436, ELANsat Technologies, Inc.
+0x000437, Powin Information Technology, Inc.
+0x000438, Nortel Networks
+0x000439, Rosco Entertainment Technology, Inc.
+0x00043A, Intelligent Telecommunications, Inc.
+0x00043B, Lava Computer Mfg., Inc.
+0x00043C, SONOS Co., Ltd.
+0x00043D, INDEL AG
+0x00043E, Telencomm
+0x00043F, ESTeem Wireless Modems, Inc
+0x000440, cyberPIXIE, Inc.
+0x000441, Half Dome Systems, Inc.
+0x000442, NACT
+0x000443, Agilent Technologies, Inc.
+0x000444, Western Multiplex Corporation
+0x000445, LMS Skalar Instruments GmbH
+0x000446, CYZENTECH Co., Ltd.
+0x000447, Acrowave Systems Co., Ltd.
+0x000448, Polaroid Corporation
+0x000449, Mapletree Networks
+0x00044A, iPolicy Networks, Inc.
+0x00044B, NVIDIA
+0x00044C, JENOPTIK
+0x00044D, CISCO SYSTEMS, INC.
+0x00044E, CISCO SYSTEMS, INC.
+0x00044F, Leukhardt Systemelektronik GmbH
+0x000450, DMD Computers SRL
+0x000451, Medrad, Inc.
+0x000452, RocketLogix, Inc.
+0x000453, YottaYotta, Inc.
+0x000454, Quadriga UK
+0x000455, ANTARA.net
+0x000456, Cambium Networks Limited
+0x000457, Universal Access Technology, Inc.
+0x000458, Fusion X Co., Ltd.
+0x000459, Veristar Corporation
+0x00045A, The Linksys Group, Inc.
+0x00045B, Techsan Electronics Co., Ltd.
+0x00045C, Mobiwave Pte Ltd
+0x00045D, BEKA Elektronik
+0x00045E, PolyTrax Information Technology AG
+0x00045F, Evalue Technology, Inc.
+0x000460, Knilink Technology, Inc.
+0x000461, EPOX Computer Co., Ltd.
+0x000462, DAKOS Data & Communication Co., Ltd.
+0x000463, Bosch Security Systems
+0x000464, Fantasma Networks, Inc.
+0x000465, i.s.t isdn-support technik GmbH
+0x000466, ARMITEL Co.
+0x000467, Wuhan Research Institute of MII
+0x000468, Vivity, Inc.
+0x000469, Innocom, Inc.
+0x00046A, Navini Networks
+0x00046B, Palm Wireless, Inc.
+0x00046C, Cyber Technology Co., Ltd.
+0x00046D, CISCO SYSTEMS, INC.
+0x00046E, CISCO SYSTEMS, INC.
+0x00046F, Digitel S/A Industria Eletronica
+0x000470, ipUnplugged AB
+0x000471, IPrad
+0x000472, Telelynx, Inc.
+0x000473, Photonex Corporation
+0x000474, LEGRAND
+0x000475, 3 Com Corporation
+0x000476, 3 Com Corporation
+0x000477, Scalant Systems, Inc.
+0x000478, G. Star Technology Corporation
+0x000479, Radius Co., Ltd.
+0x00047A, AXXESSIT ASA
+0x00047B, Schlumberger
+0x00047C, Skidata AG
+0x00047D, Pelco
+0x00047E, Siqura B.V.
+0x00047F, Chr. Mayr GmbH & Co. KG
+0x000480, Brocade Communications Systems, Inc
+0x000481, Econolite Control Products, Inc.
+0x000482, Medialogic Corp.
+0x000483, Deltron Technology, Inc.
+0x000484, Amann GmbH
+0x000485, PicoLight
+0x000486, ITTC, University of Kansas
+0x000487, Cogency Semiconductor, Inc.
+0x000488, Eurotherm Controls
+0x000489, YAFO Networks, Inc.
+0x00048A, Temia Vertriebs GmbH
+0x00048B, Poscon Corporation
+0x00048C, Nayna Networks, Inc.
+0x00048D, Tone Commander Systems, Inc.
+0x00048E, Ohm Tech Labs, Inc.
+0x00048F, TD Systems Corporation
+0x000490, Optical Access
+0x000491, Technovision, Inc.
+0x000492, Hive Internet, Ltd.
+0x000493, Tsinghua Unisplendour Co., Ltd.
+0x000494, Breezecom, Ltd.
+0x000495, Tejas Networks India Limited
+0x000496, Extreme Networks
+0x000497, MacroSystem Digital Video AG
+0x000498, Mahi Networks
+0x000499, Chino Corporation
+0x00049A, CISCO SYSTEMS, INC.
+0x00049B, CISCO SYSTEMS, INC.
+0x00049C, Surgient Networks, Inc.
+0x00049D, Ipanema Technologies
+0x00049E, Wirelink Co., Ltd.
+0x00049F, Freescale Semiconductor
+0x0004A0, Verity Instruments, Inc.
+0x0004A1, Pathway Connectivity
+0x0004A2, L.S.I. Japan Co., Ltd.
+0x0004A3, Microchip Technology, Inc.
+0x0004A4, NetEnabled, Inc.
+0x0004A5, Barco Projection Systems NV
+0x0004A6, SAF Tehnika Ltd.
+0x0004A7, FabiaTech Corporation
+0x0004A8, Broadmax Technologies, Inc.
+0x0004A9, SandStream Technologies, Inc.
+0x0004AA, Jetstream Communications
+0x0004AB, Comverse Network Systems, Inc.
+0x0004AC, IBM Corp
+0x0004AD, Malibu Networks
+0x0004AE, Sullair Corporation
+0x0004AF, Digital Fountain, Inc.
+0x0004B0, ELESIGN Co., Ltd.
+0x0004B1, Signal Technology, Inc.
+0x0004B2, ESSEGI SRL
+0x0004B3, Videotek, Inc.
+0x0004B4, CIAC
+0x0004B5, Equitrac Corporation
+0x0004B6, Stratex Networks, Inc.
+0x0004B7, AMB i.t. Holding
+0x0004B8, Kumahira Co., Ltd.
+0x0004B9, S.I. Soubou, Inc.
+0x0004BA, KDD Media Will Corporation
+0x0004BB, Bardac Corporation
+0x0004BC, Giantec, Inc.
+0x0004BD, Motorola Mobility, Inc.
+0x0004BE, OptXCon, Inc.
+0x0004BF, VersaLogic Corp.
+0x0004C0, CISCO SYSTEMS, INC.
+0x0004C1, CISCO SYSTEMS, INC.
+0x0004C2, Magnipix, Inc.
+0x0004C3, CASTOR Informatique
+0x0004C4, Allen & Heath Limited
+0x0004C5, ASE Technologies, USA
+0x0004C6, Yamaha Motor Co., Ltd.
+0x0004C7, NetMount
+0x0004C8, LIBA Maschinenfabrik GmbH
+0x0004C9, Micro Electron Co., Ltd.
+0x0004CA, FreeMs Corp.
+0x0004CB, Tdsoft Communication, Ltd.
+0x0004CC, Peek Traffic B.V.
+0x0004CD, Informedia Research Group
+0x0004CE, Patria Ailon
+0x0004CF, Seagate Technology
+0x0004D0, Softlink s.r.o.
+0x0004D1, Drew Technologies, Inc.
+0x0004D2, Adcon Telemetry GmbH
+0x0004D3, Toyokeiki Co., Ltd.
+0x0004D4, Proview Electronics Co., Ltd.
+0x0004D5, Hitachi Information & Communication Engineering, Ltd.
+0x0004D6, Takagi Industrial Co., Ltd.
+0x0004D7, Omitec Instrumentation Ltd.
+0x0004D8, IPWireless, Inc.
+0x0004D9, Titan Electronics, Inc.
+0x0004DA, Relax Technology, Inc.
+0x0004DB, Tellus Group Corp.
+0x0004DC, Nortel Networks
+0x0004DD, CISCO SYSTEMS, INC.
+0x0004DE, CISCO SYSTEMS, INC.
+0x0004DF, Teracom Telematica Ltda.
+0x0004E0, Procket Networks
+0x0004E1, Infinior Microsystems
+0x0004E2, SMC Networks, Inc.
+0x0004E3, Accton Technology Corp.
+0x0004E4, Daeryung Ind., Inc.
+0x0004E5, Glonet Systems, Inc.
+0x0004E6, Banyan Network Private Limited
+0x0004E7, Lightpointe Communications, Inc
+0x0004E8, IER, Inc.
+0x0004E9, Infiniswitch Corporation
+0x0004EA, Hewlett-Packard Company
+0x0004EB, Paxonet Communications, Inc.
+0x0004EC, Memobox SA
+0x0004ED, Billion Electric Co., Ltd.
+0x0004EE, Lincoln Electric Company
+0x0004EF, Polestar Corp.
+0x0004F0, International Computers, Ltd
+0x0004F1, WhereNet
+0x0004F2, Polycom
+0x0004F3, FS FORTH-SYSTEME GmbH
+0x0004F4, Infinite Electronics Inc.
+0x0004F5, SnowShore Networks, Inc.
+0x0004F6, Amphus
+0x0004F7, Omega Band, Inc.
+0x0004F8, QUALICABLE TV Industria E Com., Ltda
+0x0004F9, Xtera Communications, Inc.
+0x0004FA, NBS Technologies Inc.
+0x0004FB, Commtech, Inc.
+0x0004FC, Stratus Computer (DE), Inc.
+0x0004FD, Japan Control Engineering Co., Ltd.
+0x0004FE, Pelago Networks
+0x0004FF, Acronet Co., Ltd.
+0x000500, CISCO SYSTEMS, INC.
+0x000501, CISCO SYSTEMS, INC.
+0x000502, APPLE COMPUTER
+0x000503, ICONAG
+0x000504, Naray Information & Communication Enterprise
+0x000505, Systems Integration Solutions, Inc.
+0x000506, Reddo Networks AB
+0x000507, Fine Appliance Corp.
+0x000508, Inetcam, Inc.
+0x000509, AVOC Nishimura Ltd.
+0x00050A, ICS Spa
+0x00050B, SICOM Systems, Inc.
+0x00050C, Network Photonics, Inc.
+0x00050D, Midstream Technologies, Inc.
+0x00050E, 3ware, Inc.
+0x00050F, Tanaka S/S Ltd.
+0x000510, Infinite Shanghai Communication Terminals Ltd.
+0x000511, Complementary Technologies Ltd
+0x000512, MeshNetworks, Inc.
+0x000513, VTLinx Multimedia Systems, Inc.
+0x000514, KDT Systems Co., Ltd.
+0x000515, Nuark Co., Ltd.
+0x000516, SMART Modular Technologies
+0x000517, Shellcomm, Inc.
+0x000518, Jupiters Technology
+0x000519, Siemens Building Technologies AG,
+0x00051A, 3Com Europe Ltd.
+0x00051B, Magic Control Technology Corporation
+0x00051C, Xnet Technology Corp.
+0x00051D, Airocon, Inc.
+0x00051E, Brocade Communications Systems, Inc.
+0x00051F, Taijin Media Co., Ltd.
+0x000520, Smartronix, Inc.
+0x000521, Control Microsystems
+0x000522, LEA*D Corporation, Inc.
+0x000523, AVL List GmbH
+0x000524, BTL System (HK) Limited
+0x000525, Puretek Industrial Co., Ltd.
+0x000526, IPAS GmbH
+0x000527, SJ Tek Co. Ltd
+0x000528, New Focus, Inc.
+0x000529, Shanghai Broadan Communication Technology Co., Ltd
+0x00052A, Ikegami Tsushinki Co., Ltd.
+0x00052B, HORIBA, Ltd.
+0x00052C, Supreme Magic Corporation
+0x00052D, Zoltrix International Limited
+0x00052E, Cinta Networks
+0x00052F, Leviton Network Solutions
+0x000530, Andiamo Systems, Inc.
+0x000531, CISCO SYSTEMS, INC.
+0x000532, CISCO SYSTEMS, INC.
+0x000533, Brocade Communications Systems, Inc.
+0x000534, Northstar Engineering Ltd.
+0x000535, Chip PC Ltd.
+0x000536, Danam Communications, Inc.
+0x000537, Nets Technology Co., Ltd.
+0x000538, Merilus, Inc.
+0x000539, A Brand New World in Sweden AB
+0x00053A, Willowglen Services Pte Ltd
+0x00053B, Harbour Networks Ltd., Co. Beijing
+0x00053C, Xircom
+0x00053D, Agere Systems
+0x00053E, KID Systeme GmbH
+0x00053F, VisionTek, Inc.
+0x000540, FAST Corporation
+0x000541, Advanced Systems Co., Ltd.
+0x000542, Otari, Inc.
+0x000543, IQ Wireless GmbH
+0x000544, Valley Technologies, Inc.
+0x000545, Internet Photonics
+0x000546, KDDI Network & Solultions Inc.
+0x000547, Starent Networks
+0x000548, Disco Corporation
+0x000549, Salira Optical Network Systems
+0x00054A, Ario Data Networks, Inc.
+0x00054B, Eaton Automation AG
+0x00054C, RF Innovations Pty Ltd
+0x00054D, Brans Technologies, Inc.
+0x00054E, Philips
+0x00054F, PRIVATE
+0x000550, Vcomms Connect Limited
+0x000551, F & S Elektronik Systeme GmbH
+0x000552, Xycotec Computer GmbH
+0x000553, DVC Company, Inc.
+0x000554, Rangestar Wireless
+0x000555, Japan Cash Machine Co., Ltd.
+0x000556, 360 Systems
+0x000557, Agile TV Corporation
+0x000558, Synchronous, Inc.
+0x000559, Intracom S.A.
+0x00055A, Power Dsine Ltd.
+0x00055B, Charles Industries, Ltd.
+0x00055C, Kowa Company, Ltd.
+0x00055D, D-Link Systems, Inc.
+0x00055E, CISCO SYSTEMS, INC.
+0x00055F, CISCO SYSTEMS, INC.
+0x000560, LEADER COMM.CO., LTD
+0x000561, nac Image Technology, Inc.
+0x000562, Digital View Limited
+0x000563, J-Works, Inc.
+0x000564, Tsinghua Bitway Co., Ltd.
+0x000565, Tailyn Communication Company Ltd.
+0x000566, Secui.com Corporation
+0x000567, Etymonic Design, Inc.
+0x000568, Piltofish Networks AB
+0x000569, VMware, Inc.
+0x00056A, Heuft Systemtechnik GmbH
+0x00056B, C.P. Technology Co., Ltd.
+0x00056C, Hung Chang Co., Ltd.
+0x00056D, Pacific Corporation
+0x00056E, National Enhance Technology, Inc.
+0x00056F, Innomedia Technologies Pvt. Ltd.
+0x000570, Baydel Ltd.
+0x000571, Seiwa Electronics Co.
+0x000572, Deonet Co., Ltd.
+0x000573, CISCO SYSTEMS, INC.
+0x000574, CISCO SYSTEMS, INC.
+0x000575, CDS-Electronics BV
+0x000576, NSM Technology Ltd.
+0x000577, SM Information & Communication
+0x000578, PRIVATE
+0x000579, Universal Control Solution Corp.
+0x00057A, Overture Networks
+0x00057B, Chung Nam Electronic Co., Ltd.
+0x00057C, RCO Security AB
+0x00057D, Sun Communications, Inc.
+0x00057E, Eckelmann Steuerungstechnik GmbH
+0x00057F, Acqis Technology
+0x000580, Fibrolan Ltd.
+0x000581, Snell
+0x000582, ClearCube Technology
+0x000583, ImageCom Limited
+0x000584, AbsoluteValue Systems, Inc.
+0x000585, Juniper Networks, Inc.
+0x000586, Lucent Technologies
+0x000587, Locus, Incorporated
+0x000588, Sensoria Corp.
+0x000589, National Datacomputer
+0x00058A, Netcom Co., Ltd.
+0x00058B, IPmental, Inc.
+0x00058C, Opentech Inc.
+0x00058D, Lynx Photonic Networks, Inc.
+0x00058E, Flextronics International GmbH & Co. Nfg. KG
+0x00058F, CLCsoft co.
+0x000590, Swissvoice Ltd.
+0x000591, Active Silicon Ltd
+0x000592, Pultek Corp.
+0x000593, Grammar Engine Inc.
+0x000594, IXXAT Automation GmbH
+0x000595, Alesis Corporation
+0x000596, Genotech Co., Ltd.
+0x000597, Eagle Traffic Control Systems
+0x000598, CRONOS S.r.l.
+0x000599, DRS Test and Energy Management or DRS-TEM
+0x00059A, CISCO SYSTEMS, INC.
+0x00059B, CISCO SYSTEMS, INC.
+0x00059C, Kleinknecht GmbH, Ing. Büro
+0x00059D, Daniel Computing Systems, Inc.
+0x00059E, Zinwell Corporation
+0x00059F, Yotta Networks, Inc.
+0x0005A0, MOBILINE Kft.
+0x0005A1, Zenocom
+0x0005A2, CELOX Networks
+0x0005A3, QEI, Inc.
+0x0005A4, Lucid Voice Ltd.
+0x0005A5, KOTT
+0x0005A6, Extron Electronics
+0x0005A7, Hyperchip, Inc.
+0x0005A8, WYLE ELECTRONICS
+0x0005A9, Princeton Networks, Inc.
+0x0005AA, Moore Industries International Inc.
+0x0005AB, Cyber Fone, Inc.
+0x0005AC, Northern Digital, Inc.
+0x0005AD, Topspin Communications, Inc.
+0x0005AE, Mediaport USA
+0x0005AF, InnoScan Computing A/S
+0x0005B0, Korea Computer Technology Co., Ltd.
+0x0005B1, ASB Technology BV
+0x0005B2, Medison Co., Ltd.
+0x0005B3, Asahi-Engineering Co., Ltd.
+0x0005B4, Aceex Corporation
+0x0005B5, Broadcom Technologies
+0x0005B6, INSYS Microelectronics GmbH
+0x0005B7, Arbor Technology Corp.
+0x0005B8, Electronic Design Associates, Inc.
+0x0005B9, Airvana, Inc.
+0x0005BA, Area Netwoeks, Inc.
+0x0005BB, Myspace AB
+0x0005BC, Resorsys Ltd.
+0x0005BD, ROAX BV
+0x0005BE, Kongsberg Seatex AS
+0x0005BF, JustEzy Technology, Inc.
+0x0005C0, Digital Network Alacarte Co., Ltd.
+0x0005C1, A-Kyung Motion, Inc.
+0x0005C2, Soronti, Inc.
+0x0005C3, Pacific Instruments, Inc.
+0x0005C4, Telect, Inc.
+0x0005C5, Flaga HF
+0x0005C6, Triz Communications
+0x0005C7, I/F-COM A/S
+0x0005C8, VERYTECH
+0x0005C9, LG Innotek Co., Ltd.
+0x0005CA, Hitron Technology, Inc.
+0x0005CB, ROIS Technologies, Inc.
+0x0005CC, Sumtel Communications, Inc.
+0x0005CD, Denon, Ltd.
+0x0005CE, Prolink Microsystems Corporation
+0x0005CF, Thunder River Technologies, Inc.
+0x0005D0, Solinet Systems
+0x0005D1, Metavector Technologies
+0x0005D2, DAP Technologies
+0x0005D3, eProduction Solutions, Inc.
+0x0005D4, FutureSmart Networks, Inc.
+0x0005D5, Speedcom Wireless
+0x0005D6, Titan Wireless
+0x0005D7, Vista Imaging, Inc.
+0x0005D8, Arescom, Inc.
+0x0005D9, Techno Valley, Inc.
+0x0005DA, Apex Automationstechnik
+0x0005DB, PSI Nentec GmbH
+0x0005DC, CISCO SYSTEMS, INC.
+0x0005DD, CISCO SYSTEMS, INC.
+0x0005DE, Gi Fone Korea, Inc.
+0x0005DF, Electronic Innovation, Inc.
+0x0005E0, Empirix Corp.
+0x0005E1, Trellis Photonics, Ltd.
+0x0005E2, Creativ Network Technologies
+0x0005E3, LightSand Communications, Inc.
+0x0005E4, Red Lion Controls Inc.
+0x0005E5, Renishaw PLC
+0x0005E6, Egenera, Inc.
+0x0005E7, Netrake an AudioCodes Company
+0x0005E8, TurboWave, Inc.
+0x0005E9, Unicess Network, Inc.
+0x0005EA, Rednix
+0x0005EB, Blue Ridge Networks, Inc.
+0x0005EC, Mosaic Systems Inc.
+0x0005ED, Technikum Joanneum GmbH
+0x0005EE, BEWATOR Group
+0x0005EF, ADOIR Digital Technology
+0x0005F0, SATEC
+0x0005F1, Vrcom, Inc.
+0x0005F2, Power R, Inc.
+0x0005F3, Webyn
+0x0005F4, System Base Co., Ltd.
+0x0005F5, OYO Geospace
+0x0005F6, Young Chang Co. Ltd.
+0x0005F7, Analog Devices, Inc.
+0x0005F8, Real Time Access, Inc.
+0x0005F9, TOA Corporation
+0x0005FA, IPOptical, Inc.
+0x0005FB, ShareGate, Inc.
+0x0005FC, Schenck Pegasus Corp.
+0x0005FD, PacketLight Networks Ltd.
+0x0005FE, Traficon N.V.
+0x0005FF, SNS Solutions, Inc.
+0x000600, Toshiba Teli Corporation
+0x000601, Otanikeiki Co., Ltd.
+0x000602, Cirkitech Electronics Co.
+0x000603, Baker Hughes Inc.
+0x000604, @Track Communications, Inc.
+0x000605, Inncom International, Inc.
+0x000606, RapidWAN, Inc.
+0x000607, Omni Directional Control Technology Inc.
+0x000608, At-Sky SAS
+0x000609, Crossport Systems
+0x00060A, Blue2space
+0x00060B, Emerson Network Power
+0x00060C, Melco Industries, Inc.
+0x00060D, Wave7 Optics
+0x00060E, IGYS Systems, Inc.
+0x00060F, Narad Networks Inc
+0x000610, Abeona Networks Inc
+0x000611, Zeus Wireless, Inc.
+0x000612, Accusys, Inc.
+0x000613, Kawasaki Microelectronics Incorporated
+0x000614, Prism Holdings
+0x000615, Kimoto Electric Co., Ltd.
+0x000616, Tel Net Co., Ltd.
+0x000617, Redswitch Inc.
+0x000618, DigiPower Manufacturing Inc.
+0x000619, Connection Technology Systems
+0x00061A, Zetari Inc.
+0x00061B, Notebook Development Lab.  Lenovo Japan Ltd.
+0x00061C, Hoshino Metal Industries, Ltd.
+0x00061D, MIP Telecom, Inc.
+0x00061E, Maxan Systems
+0x00061F, Vision Components GmbH
+0x000620, Serial System Ltd.
+0x000621, Hinox, Co., Ltd.
+0x000622, Chung Fu Chen Yeh Enterprise Corp.
+0x000623, MGE UPS Systems France
+0x000624, Gentner Communications Corp.
+0x000625, The Linksys Group, Inc.
+0x000626, MWE GmbH
+0x000627, Uniwide Technologies, Inc.
+0x000628, CISCO SYSTEMS, INC.
+0x000629, IBM Corp
+0x00062A, CISCO SYSTEMS, INC.
+0x00062B, INTRASERVER TECHNOLOGY
+0x00062C, Bivio Networks
+0x00062D, TouchStar Technologies, L.L.C.
+0x00062E, Aristos Logic Corp.
+0x00062F, Pivotech Systems Inc.
+0x000630, Adtranz Sweden
+0x000631, Optical Solutions, Inc.
+0x000632, Mesco Engineering GmbH
+0x000633, Cross Match Technologies GmbH
+0x000634, GTE Airfone Inc.
+0x000635, PacketAir Networks, Inc.
+0x000636, Jedai Broadband Networks
+0x000637, Toptrend-Meta Information (ShenZhen) Inc.
+0x000638, Sungjin C&C Co., Ltd.
+0x000639, Newtec
+0x00063A, Dura Micro, Inc.
+0x00063B, Arcturus Networks Inc.
+0x00063C, Intrinsyc Europe Ltd
+0x00063D, Microwave Data Systems Inc.
+0x00063E, Opthos Inc.
+0x00063F, Everex Communications Inc.
+0x000640, White Rock Networks
+0x000641, ITCN
+0x000642, Genetel Systems Inc.
+0x000643, SONO Computer Co., Ltd.
+0x000644, Neix,Inc
+0x000645, Meisei Electric Co. Ltd.
+0x000646, ShenZhen XunBao Network Technology Co Ltd
+0x000647, Etrali S.A.
+0x000648, Seedsware, Inc.
+0x000649, 3M Deutschland GmbH
+0x00064A, Honeywell Co., Ltd. (KOREA)
+0x00064B, Alexon Co., Ltd.
+0x00064C, Invicta Networks, Inc.
+0x00064D, Sencore
+0x00064E, Broad Net Technology Inc.
+0x00064F, PRO-NETS Technology Corporation
+0x000650, Tiburon Networks, Inc.
+0x000651, Aspen Networks Inc.
+0x000652, CISCO SYSTEMS, INC.
+0x000653, CISCO SYSTEMS, INC.
+0x000654, Winpresa Building Automation Technologies GmbH
+0x000655, Yipee, Inc.
+0x000656, Tactel AB
+0x000657, Market Central, Inc.
+0x000658, Helmut Fischer GmbH Institut für Elektronik und Messtechnik
+0x000659, EAL (Apeldoorn) B.V.
+0x00065A, Strix Systems
+0x00065B, Dell Computer Corp.
+0x00065C, Malachite Technologies, Inc.
+0x00065D, Heidelberg Web Systems
+0x00065E, Photuris, Inc.
+0x00065F, ECI Telecom - NGTS Ltd.
+0x000660, NADEX Co., Ltd.
+0x000661, NIA Home Technologies Corp.
+0x000662, MBM Technology Ltd.
+0x000663, Human Technology Co., Ltd.
+0x000664, Fostex Corporation
+0x000665, Sunny Giken, Inc.
+0x000666, Roving Networks
+0x000667, Tripp Lite
+0x000668, Vicon Industries Inc.
+0x000669, Datasound Laboratories Ltd
+0x00066A, InfiniCon Systems, Inc.
+0x00066B, Sysmex Corporation
+0x00066C, Robinson Corporation
+0x00066D, Compuprint S.P.A.
+0x00066E, Delta Electronics, Inc.
+0x00066F, Korea Data Systems
+0x000670, Upponetti Oy
+0x000671, Softing AG
+0x000672, Netezza
+0x000673, TKH Security Solutions USA
+0x000674, Spectrum Control, Inc.
+0x000675, Banderacom, Inc.
+0x000676, Novra Technologies Inc.
+0x000677, SICK AG
+0x000678, Marantz Brand Company
+0x000679, Konami Corporation
+0x00067A, JMP Systems
+0x00067B, Toplink C&C Corporation
+0x00067C, CISCO SYSTEMS, INC.
+0x00067D, Takasago Ltd.
+0x00067E, WinCom Systems, Inc.
+0x00067F, Digeo, Inc.
+0x000680, Card Access, Inc.
+0x000681, Goepel Electronic GmbH
+0x000682, Convedia
+0x000683, Bravara Communications, Inc.
+0x000684, Biacore AB
+0x000685, NetNearU Corporation
+0x000686, ZARDCOM Co., Ltd.
+0x000687, Omnitron Systems Technology, Inc.
+0x000688, Telways Communication Co., Ltd.
+0x000689, yLez Technologies Pte Ltd
+0x00068A, NeuronNet Co. Ltd. R&D Center
+0x00068B, AirRunner Technologies, Inc.
+0x00068C, 3Com Corporation
+0x00068D, SEPATON, Inc.
+0x00068E, HID Corporation
+0x00068F, Telemonitor, Inc.
+0x000690, Euracom Communication GmbH
+0x000691, PT Inovacao
+0x000692, Intruvert Networks, Inc.
+0x000693, Flexus Computer Technology, Inc.
+0x000694, Mobillian Corporation
+0x000695, Ensure Technologies, Inc.
+0x000696, Advent Networks
+0x000697, R & D Center
+0x000698, egnite Software GmbH
+0x000699, Vida Design Co.
+0x00069A, e & Tel
+0x00069B, AVT Audio Video Technologies GmbH
+0x00069C, Transmode Systems AB
+0x00069D, Petards Ltd
+0x00069E, UNIQA, Inc.
+0x00069F, Kuokoa Networks
+0x0006A0, Mx Imaging
+0x0006A1, Celsian Technologies, Inc.
+0x0006A2, Microtune, Inc.
+0x0006A3, Bitran Corporation
+0x0006A4, INNOWELL Corp.
+0x0006A5, PINON Corp.
+0x0006A6, Artistic Licence Engineering Ltd
+0x0006A7, Primarion
+0x0006A8, KC Technology, Inc.
+0x0006A9, Universal Instruments Corp.
+0x0006AA, VT Miltope
+0x0006AB, W-Link Systems, Inc.
+0x0006AC, Intersoft Co.
+0x0006AD, KB Electronics Ltd.
+0x0006AE, Himachal Futuristic Communications Ltd
+0x0006AF, Xalted Networks
+0x0006B0, Comtech EF Data Corp.
+0x0006B1, Sonicwall
+0x0006B2, Linxtek Co.
+0x0006B3, Diagraph Corporation
+0x0006B4, Vorne Industries, Inc.
+0x0006B5, Source Photonics, Inc.
+0x0006B6, Nir-Or Israel Ltd.
+0x0006B7, TELEM GmbH
+0x0006B8, Bandspeed Pty Ltd
+0x0006B9, A5TEK Corp.
+0x0006BA, Westwave Communications
+0x0006BB, ATI Technologies Inc.
+0x0006BC, Macrolink, Inc.
+0x0006BD, BNTECHNOLOGY Co., Ltd.
+0x0006BE, Baumer Optronic GmbH
+0x0006BF, Accella Technologies Co., Ltd.
+0x0006C0, United Internetworks, Inc.
+0x0006C1, CISCO SYSTEMS, INC.
+0x0006C2, Smartmatic Corporation
+0x0006C3, Schindler Elevator Ltd.
+0x0006C4, Piolink Inc.
+0x0006C5, INNOVI Technologies Limited
+0x0006C6, lesswire AG
+0x0006C7, RFNET Technologies Pte Ltd (S)
+0x0006C8, Sumitomo Metal Micro Devices, Inc.
+0x0006C9, Technical Marketing Research, Inc.
+0x0006CA, American Computer & Digital Components, Inc. (ACDC)
+0x0006CB, Jotron Electronics A/S
+0x0006CC, JMI Electronics Co., Ltd.
+0x0006CD, Leaf Imaging Ltd.
+0x0006CE, DATENO
+0x0006CF, Thales Avionics In-Flight Systems, LLC
+0x0006D0, Elgar Electronics Corp.
+0x0006D1, Tahoe Networks, Inc.
+0x0006D2, Tundra Semiconductor Corp.
+0x0006D3, Alpha Telecom, Inc. U.S.A.
+0x0006D4, Interactive Objects, Inc.
+0x0006D5, Diamond Systems Corp.
+0x0006D6, CISCO SYSTEMS, INC.
+0x0006D7, CISCO SYSTEMS, INC.
+0x0006D8, Maple Optical Systems
+0x0006D9, IPM-Net S.p.A.
+0x0006DA, ITRAN Communications Ltd.
+0x0006DB, ICHIPS Co., Ltd.
+0x0006DC, Syabas Technology (Amquest)
+0x0006DD, AT &am