summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore42
-rw-r--r--AUTHORS52
-rw-r--r--COPYING347
-rw-r--r--Documentation/CodingStyle833
-rw-r--r--Documentation/Downstream140
-rw-r--r--Documentation/KnownIssues97
-rw-r--r--Documentation/Mirrors17
-rw-r--r--Documentation/Performance278
-rw-r--r--Documentation/RelatedWork87
-rw-r--r--Documentation/Sponsors14
-rw-r--r--Documentation/SubmittingPatches122
-rw-r--r--Documentation/Summary59
-rw-r--r--INSTALL160
-rw-r--r--Makefile307
-rw-r--r--README58
-rw-r--r--REPORTING-BUGS18
-rw-r--r--astraceroute.c1077
-rw-r--r--astraceroute/.gitignore5
-rw-r--r--astraceroute/Makefile13
-rw-r--r--bpf.c765
-rw-r--r--bpf.h135
-rw-r--r--bpf_comp.c43
-rw-r--r--bpf_lexer.l126
-rw-r--r--bpf_parser.y673
-rw-r--r--bpfc.c132
-rw-r--r--bpfc/.gitignore4
-rw-r--r--bpfc/Makefile12
-rw-r--r--built_in.h344
-rw-r--r--colors.h31
-rw-r--r--configs/ether.conf291
-rw-r--r--configs/geoip.conf2
-rw-r--r--configs/oui.conf17557
-rw-r--r--configs/stddef.h197
-rw-r--r--configs/tcp.conf1100
-rw-r--r--configs/udp.conf1056
-rw-r--r--cpusched.c180
-rw-r--r--cpusched.h16
-rw-r--r--csum.h179
-rw-r--r--ct_client.c440
-rw-r--r--ct_server.c811
-rw-r--r--ct_servmgmt.c278
-rw-r--r--ct_servmgmt.h21
-rw-r--r--ct_usermgmt.c772
-rw-r--r--ct_usermgmt.h49
-rw-r--r--curve.c281
-rw-r--r--curve.h218
-rw-r--r--curvetun.c692
-rw-r--r--curvetun.h42
-rw-r--r--curvetun/.gitignore7
-rw-r--r--curvetun/Makefile17
-rw-r--r--curvetun/abiname.c46
-rwxr-xr-xcurvetun/build_nacl.sh46
-rwxr-xr-xcurvetun/nacl_path.sh18
-rw-r--r--die.h69
-rw-r--r--dissector.c115
-rw-r--r--dissector.h64
-rw-r--r--dissector_80211.c54
-rw-r--r--dissector_80211.h43
-rw-r--r--dissector_eth.c219
-rw-r--r--dissector_eth.h48
-rw-r--r--flowtop.c1208
-rw-r--r--flowtop/.gitignore4
-rw-r--r--flowtop/Makefile19
-rw-r--r--geoip.c595
-rw-r--r--geoip.h29
-rw-r--r--hash.c169
-rw-r--r--hash.h86
-rw-r--r--ifpps.c949
-rw-r--r--ifpps/.gitignore4
-rw-r--r--ifpps/Makefile6
-rw-r--r--ipv4.h36
-rw-r--r--ipv6.h39
-rw-r--r--locking.h97
-rw-r--r--mac80211.c223
-rw-r--r--mac80211.h13
-rw-r--r--netsniff-ng.c1369
-rw-r--r--netsniff-ng/.gitignore4
-rw-r--r--netsniff-ng/Makefile50
-rw-r--r--oui.c104
-rw-r--r--oui.h19
-rw-r--r--patricia.c353
-rw-r--r--patricia.h49
-rw-r--r--pcap_io.h581
-rw-r--r--pcap_mm.c197
-rw-r--r--pcap_rw.c79
-rw-r--r--pcap_sg.c193
-rw-r--r--pkt_buff.h112
-rw-r--r--proto.h34
-rw-r--r--proto_80211_mac_hdr.c3627
-rw-r--r--proto_arp.c163
-rw-r--r--proto_ethernet.c80
-rw-r--r--proto_icmpv4.c68
-rw-r--r--proto_icmpv6.c1641
-rw-r--r--proto_igmp.c560
-rw-r--r--proto_ip_authentication_hdr.c87
-rw-r--r--proto_ip_esp.c53
-rw-r--r--proto_ipv4.c201
-rw-r--r--proto_ipv6.c112
-rw-r--r--proto_ipv6_dest_opts.c101
-rw-r--r--proto_ipv6_fragm.c70
-rw-r--r--proto_ipv6_hop_by_hop.c100
-rw-r--r--proto_ipv6_in_ipv4.c25
-rw-r--r--proto_ipv6_mobility_hdr.c311
-rw-r--r--proto_ipv6_no_nxt_hdr.c41
-rw-r--r--proto_ipv6_routing.c163
-rw-r--r--proto_lldp.c469
-rw-r--r--proto_mpls_unicast.c109
-rw-r--r--proto_none.c83
-rw-r--r--proto_tcp.c155
-rw-r--r--proto_udp.c89
-rw-r--r--proto_vlan.c61
-rw-r--r--proto_vlan_q_in_q.c63
-rw-r--r--protos.h37
-rw-r--r--ring.h174
-rw-r--r--ring_rx.c130
-rw-r--r--ring_rx.h31
-rw-r--r--ring_tx.c136
-rw-r--r--ring_tx.h40
-rw-r--r--stun.c190
-rwxr-xr-xtest/dissector_fuzz.sh68
-rw-r--r--tprintf.c169
-rw-r--r--tprintf.h27
-rw-r--r--trafgen.c1064
-rw-r--r--trafgen/.gitignore4
-rw-r--r--trafgen/Makefile16
-rw-r--r--trafgen_conf.h55
-rw-r--r--trafgen_lexer.l152
-rw-r--r--trafgen_parser.y611
-rw-r--r--trie.c117
-rw-r--r--trie.h21
-rwxr-xr-xupdate-oui.py81
-rw-r--r--xio.c248
-rw-r--r--xio.h22
-rw-r--r--xmalloc.c151
-rw-r--r--xmalloc.h35
-rw-r--r--xutils.c1024
-rw-r--r--xutils.h94
137 files changed, 50669 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..dadfb3d
--- /dev/null
+++ b/.gitignore
@@ -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
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
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
index 0000000..31265b4
--- /dev/null
+++ b/Documentation/CodingStyle
@@ -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
index 0000000..ba22cdd
--- /dev/null
+++ b/Documentation/Downstream
@@ -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
index 0000000..eb17a3f
--- /dev/null
+++ b/Documentation/KnownIssues
@@ -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
index 0000000..c7d7e79
--- /dev/null
+++ b/Documentation/Mirrors
@@ -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
index 0000000..e51411a
--- /dev/null
+++ b/Documentation/Performance
@@ -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
index 0000000..ed7dba8
--- /dev/null
+++ b/Documentation/RelatedWork
@@ -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
index 0000000..2d21600
--- /dev/null
+++ b/Documentation/Sponsors
@@ -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
index 0000000..fbe72c4
--- /dev/null
+++ b/Documentation/SubmittingPatches
@@ -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
index 0000000..2863d60
--- /dev/null
+++ b/Documentation/Summary
@@ -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
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
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
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
index 0000000..6d10ce7
--- /dev/null
+++ b/REPORTING-BUGS
@@ -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
index 0000000..a8c289b
--- /dev/null
+++ b/astraceroute.c
@@ -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
index 0000000..6343402
--- /dev/null
+++ b/astraceroute/.gitignore
@@ -0,0 +1,5 @@
+*.*
+
+!.gitignore
+!Makefile
+!build_geoip.sh
diff --git a/astraceroute/Makefile b/astraceroute/Makefile
new file mode 100644
index 0000000..91f0a9e
--- /dev/null
+++ b/astraceroute/Makefile
@@ -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
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
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
index 0000000..27f7a00
--- /dev/null
+++ b/bpf_comp.c
@@ -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
index 0000000..d4b6947
--- /dev/null
+++ b/bpf_lexer.l
@@ -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
index 0000000..4c35e07
--- /dev/null
+++ b/bpf_parser.y
@@ -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
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
index 0000000..32aad4d
--- /dev/null
+++ b/bpfc/.gitignore
@@ -0,0 +1,4 @@
+*.*
+
+!.gitignore
+!Makefile
diff --git a/bpfc/Makefile b/bpfc/Makefile
new file mode 100644
index 0000000..4451f64
--- /dev/null
+++ b/bpfc/Makefile
@@ -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
index 0000000..ee97c74
--- /dev/null
+++ b/built_in.h
@@ -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
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
index 0000000..4d65f62
--- /dev/null
+++ b/configs/ether.conf
@@ -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
index 0000000..43c6238
--- /dev/null
+++ b/configs/geoip.conf
@@ -0,0 +1,2 @@
+geolite.maxmind.com
+cryptoism.org
diff --git a/configs/oui.conf b/configs/oui.conf
new file mode 100644
index 0000000..87a0d10
--- /dev/null
+++ b/configs/oui.conf
@@ -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 & T Laboratories - Cambridge Ltd
+0x0006DE, Flash Technology
+0x0006DF, AIDONIC Corporation
+0x0006E0, MAT Co., Ltd.
+0x0006E1, Techno Trade s.a
+0x0006E2, Ceemax Technology Co., Ltd.
+0x0006E3, Quantitative Imaging Corporation
+0x0006E4, Citel Technologies Ltd.
+0x0006E5, Fujian Newland Computer Ltd. Co.
+0x0006E6, DongYang Telecom Co., Ltd.
+0x0006E7, Bit Blitz Communications Inc.
+0x0006E8, Optical Network Testing, Inc.
+0x0006E9, Intime Corp.
+0x0006EA, ELZET80 Mikrocomputer GmbH&Co. KG
+0x0006EB, Global Data
+0x0006EC, Harris Corporation
+0x0006ED, Inara Networks
+0x0006EE, Shenyang Neu-era Information & Technology Stock Co., Ltd
+0x0006EF, Maxxan Systems, Inc.
+0x0006F0, Digeo, Inc.
+0x0006F1, Optillion
+0x0006F2, Platys Communications
+0x0006F3, AcceLight Networks
+0x0006F4, Prime Electronics & Satellitics Inc.
+0x0006F5, ALPS Co,. Ltd.
+0x0006F6, CISCO SYSTEMS, INC.
+0x0006F7, ALPS Electric Co,. Ltd.
+0x0006F8, CPU Technology, Inc.
+0x0006F9, Mitsui Zosen Systems Research Inc.
+0x0006FA, IP SQUARE Co, Ltd.
+0x0006FB, Hitachi Printing Solutions, Ltd.
+0x0006FC, Fnet Co., Ltd.
+0x0006FD, Comjet Information Systems Corp.
+0x0006FE, Ambrado, Inc
+0x0006FF, Sheba Systems Co., Ltd.
+0x000700, Zettamedia Korea
+0x000701, RACAL-DATACOM
+0x000702, Varian Medical Systems
+0x000703, CSEE Transport
+0x000704, ALPS Electric Co,. Ltd.
+0x000705, Endress & Hauser GmbH & Co
+0x000706, Sanritz Corporation
+0x000707, Interalia Inc.
+0x000708, Bitrage Inc.
+0x000709, Westerstrand Urfabrik AB
+0x00070A, Unicom Automation Co., Ltd.
+0x00070B, Novabase SGPS, SA
+0x00070C, SVA-Intrusion.com Co. Ltd.
+0x00070D, CISCO SYSTEMS, INC.
+0x00070E, CISCO SYSTEMS, INC.
+0x00070F, Fujant, Inc.
+0x000710, Adax, Inc.
+0x000711, Acterna
+0x000712, JAL Information Technology
+0x000713, IP One, Inc.
+0x000714, Brightcom
+0x000715, General Research of Electronics, Inc.
+0x000716, J & S Marine Ltd.
+0x000717, Wieland Electric GmbH
+0x000718, iCanTek Co., Ltd.
+0x000719, Mobiis Co., Ltd.
+0x00071A, Finedigital Inc.
+0x00071B, CDVI Americas Ltd
+0x00071C, AT&T Fixed Wireless Services
+0x00071D, Satelsa Sistemas Y Aplicaciones De Telecomunicaciones, S.A.
+0x00071E, Tri-M Engineering / Nupak Dev. Corp.
+0x00071F, European Systems Integration
+0x000720, Trutzschler GmbH & Co. KG
+0x000721, Formac Elektronik GmbH
+0x000722, The Nielsen Company
+0x000723, ELCON Systemtechnik GmbH
+0x000724, Telemax Co., Ltd.
+0x000725, Bematech International Corp.
+0x000726, Shenzhen Gongjin Electronics Co., Ltd.
+0x000727, Zi Corporation (HK) Ltd.
+0x000728, Neo Telecom
+0x000729, Kistler Instrumente AG
+0x00072A, Innovance Networks
+0x00072B, Jung Myung Telecom Co., Ltd.
+0x00072C, Fabricom
+0x00072D, CNSystems
+0x00072E, North Node AB
+0x00072F, Intransa, Inc.
+0x000730, Hutchison OPTEL Telecom Technology Co., Ltd.
+0x000731, Ophir-Spiricon Inc
+0x000732, AAEON Technology Inc.
+0x000733, DANCONTROL Engineering
+0x000734, ONStor, Inc.
+0x000735, Flarion Technologies, Inc.
+0x000736, Data Video Technologies Co., Ltd.
+0x000737, Soriya Co. Ltd.
+0x000738, Young Technology Co., Ltd.
+0x000739, Scotty Group Austria Gmbh
+0x00073A, Inventel Systemes
+0x00073B, Tenovis GmbH & Co KG
+0x00073C, Telecom Design
+0x00073D, Nanjing Postel Telecommunications Co., Ltd.
+0x00073E, China Great-Wall Computer Shenzhen Co., Ltd.
+0x00073F, Woojyun Systec Co., Ltd.
+0x000740, Buffalo, Inc
+0x000741, Sierra Automated Systems
+0x000742, Current Technologies, LLC
+0x000743, Chelsio Communications
+0x000744, Unico, Inc.
+0x000745, Radlan Computer Communications Ltd.
+0x000746, TURCK, Inc.
+0x000747, Mecalc
+0x000748, The Imaging Source Europe
+0x000749, CENiX Inc.
+0x00074A, Carl Valentin GmbH
+0x00074B, Daihen Corporation
+0x00074C, Beicom Inc.
+0x00074D, Zebra Technologies Corp.
+0x00074E, IPFRONT Inc
+0x00074F, CISCO SYSTEMS, INC.
+0x000750, CISCO SYSTEMS, INC.
+0x000751, m-u-t AG
+0x000752, Rhythm Watch Co., Ltd.
+0x000753, Beijing Qxcomm Technology Co., Ltd.
+0x000754, Xyterra Computing, Inc.
+0x000755, Lafon SA
+0x000756, Juyoung Telecom
+0x000757, Topcall International AG
+0x000758, Dragonwave
+0x000759, Boris Manufacturing Corp.
+0x00075A, Air Products and Chemicals, Inc.
+0x00075B, Gibson Guitars
+0x00075C, Eastman Kodak Company
+0x00075D, Celleritas Inc.
+0x00075E, Ametek Power Instruments
+0x00075F, VCS Video Communication Systems AG
+0x000760, TOMIS Information & Telecom Corp.
+0x000761, Logitech SA
+0x000762, Group Sense Limited
+0x000763, Sunniwell Cyber Tech. Co., Ltd.
+0x000764, YoungWoo Telecom Co. Ltd.
+0x000765, Jade Quantum Technologies, Inc.
+0x000766, Chou Chin Industrial Co., Ltd.
+0x000767, Yuxing Electronics Company Limited
+0x000768, Danfoss A/S
+0x000769, Italiana Macchi SpA
+0x00076A, NEXTEYE Co., Ltd.
+0x00076B, Stralfors AB
+0x00076C, Daehanet, Inc.
+0x00076D, Flexlight Networks
+0x00076E, Sinetica Corporation Limited
+0x00076F, Synoptics Limited
+0x000770, Locusnetworks Corporation
+0x000771, Embedded System Corporation
+0x000772, Alcatel Shanghai Bell Co., Ltd.
+0x000773, Ascom Powerline Communications Ltd.
+0x000774, GuangZhou Thinker Technology Co. Ltd.
+0x000775, Valence Semiconductor, Inc.
+0x000776, Federal APD
+0x000777, Motah Ltd.
+0x000778, GERSTEL GmbH & Co. KG
+0x000779, Sungil Telecom Co., Ltd.
+0x00077A, Infoware System Co., Ltd.
+0x00077B, Millimetrix Broadband Networks
+0x00077C, Westermo Teleindustri AB
+0x00077D, CISCO SYSTEMS, INC.
+0x00077E, Elrest GmbH
+0x00077F, J Communications Co., Ltd.
+0x000780, Bluegiga Technologies OY
+0x000781, Itron Inc.
+0x000782, Oracle Corporation
+0x000783, SynCom Network, Inc.
+0x000784, CISCO SYSTEMS, INC.
+0x000785, CISCO SYSTEMS, INC.
+0x000786, Wireless Networks Inc.
+0x000787, Idea System Co., Ltd.
+0x000788, Clipcomm, Inc.
+0x000789, DONGWON SYSTEMS
+0x00078A, Mentor Data System Inc.
+0x00078B, Wegener Communications, Inc.
+0x00078C, Elektronikspecialisten i Borlange AB
+0x00078D, NetEngines Ltd.
+0x00078E, Garz & Friche GmbH
+0x00078F, Emkay Innovative Products
+0x000790, Tri-M Technologies (s) Limited
+0x000791, International Data Communications, Inc.
+0x000792, Sütron Electronic GmbH
+0x000793, Shin Satellite Public Company Limited
+0x000794, Simple Devices, Inc.
+0x000795, Elitegroup Computer System Co. (ECS)
+0x000796, LSI Systems, Inc.
+0x000797, Netpower Co., Ltd.
+0x000798, Selea SRL
+0x000799, Tipping Point Technologies, Inc.
+0x00079A, Verint Systems Inc
+0x00079B, Aurora Networks
+0x00079C, Golden Electronics Technology Co., Ltd.
+0x00079D, Musashi Co., Ltd.
+0x00079E, Ilinx Co., Ltd.
+0x00079F, Action Digital Inc.
+0x0007A0, e-Watch Inc.
+0x0007A1, VIASYS Healthcare GmbH
+0x0007A2, Opteon Corporation
+0x0007A3, Ositis Software, Inc.
+0x0007A4, GN Netcom Ltd.
+0x0007A5, Y.D.K Co. Ltd.
+0x0007A6, Home Automation, Inc.
+0x0007A7, A-Z Inc.
+0x0007A8, Haier Group Technologies Ltd.
+0x0007A9, Novasonics
+0x0007AA, Quantum Data Inc.
+0x0007AB, Samsung Electronics Co.,Ltd
+0x0007AC, Eolring
+0x0007AD, Pentacon GmbH Foto-und Feinwerktechnik
+0x0007AE, Britestream Networks, Inc.
+0x0007AF, N-TRON Corporation
+0x0007B0, Office Details, Inc.
+0x0007B1, Equator Technologies
+0x0007B2, Transaccess S.A.
+0x0007B3, CISCO SYSTEMS, INC.
+0x0007B4, CISCO SYSTEMS, INC.
+0x0007B5, Any One Wireless Ltd.
+0x0007B6, Telecom Technology Ltd.
+0x0007B7, Samurai Ind. Prods Eletronicos Ltda
+0x0007B8, Corvalent Corporation
+0x0007B9, Ginganet Corporation
+0x0007BA, UTStarcom, Inc.
+0x0007BB, Candera Inc.
+0x0007BC, Identix Inc.
+0x0007BD, Radionet Ltd.
+0x0007BE, DataLogic SpA
+0x0007BF, Armillaire Technologies, Inc.
+0x0007C0, NetZerver Inc.
+0x0007C1, Overture Networks, Inc.
+0x0007C2, Netsys Telecom
+0x0007C3, Thomson
+0x0007C4, JEAN Co. Ltd.
+0x0007C5, Gcom, Inc.
+0x0007C6, VDS Vosskuhler GmbH
+0x0007C7, Synectics Systems Limited
+0x0007C8, Brain21, Inc.
+0x0007C9, Technol Seven Co., Ltd.
+0x0007CA, Creatix Polymedia Ges Fur Kommunikaitonssysteme
+0x0007CB, Freebox SA
+0x0007CC, Kaba Benzing GmbH
+0x0007CD, NMTEL Co., Ltd.
+0x0007CE, Cabletime Limited
+0x0007CF, Anoto AB
+0x0007D0, Automat Engenharia de Automação Ltda.
+0x0007D1, Spectrum Signal Processing Inc.
+0x0007D2, Logopak Systeme
+0x0007D3, Stork Prints B.V.
+0x0007D4, Zhejiang Yutong Network Communication Co Ltd.
+0x0007D5, 3e Technologies Int;., Inc.
+0x0007D6, Commil Ltd.
+0x0007D7, Caporis Networks AG
+0x0007D8, Hitron Systems Inc.
+0x0007D9, Splicecom
+0x0007DA, Neuro Telecom Co., Ltd.
+0x0007DB, Kirana Networks, Inc.
+0x0007DC, Atek Co, Ltd.
+0x0007DD, Cradle Technologies
+0x0007DE, eCopilt AB
+0x0007DF, Vbrick Systems Inc.
+0x0007E0, Palm Inc.
+0x0007E1, WIS Communications Co. Ltd.
+0x0007E2, Bitworks, Inc.
+0x0007E3, Navcom Technology, Inc.
+0x0007E4, SoftRadio Co., Ltd.
+0x0007E5, Coup Corporation
+0x0007E6, edgeflow Canada Inc.
+0x0007E7, FreeWave Technologies
+0x0007E8, EdgeWave
+0x0007E9, Intel Corporation
+0x0007EA, Massana, Inc.
+0x0007EB, CISCO SYSTEMS, INC.
+0x0007EC, CISCO SYSTEMS, INC.
+0x0007ED, Altera Corporation
+0x0007EE, telco Informationssysteme GmbH
+0x0007EF, Lockheed Martin Tactical Systems
+0x0007F0, LogiSync LLC
+0x0007F1, TeraBurst Networks Inc.
+0x0007F2, IOA Corporation
+0x0007F3, Thinkengine Networks
+0x0007F4, Eletex Co., Ltd.
+0x0007F5, Bridgeco Co AG
+0x0007F6, Qqest Software Systems
+0x0007F7, Galtronics
+0x0007F8, ITDevices, Inc.
+0x0007F9, Phonetics, Inc.
+0x0007FA, ITT Co., Ltd.
+0x0007FB, Giga Stream UMTS Technologies GmbH
+0x0007FC, Adept Systems Inc.
+0x0007FD, LANergy Ltd.
+0x0007FE, Rigaku Corporation
+0x0007FF, Gluon Networks
+0x000800, MULTITECH SYSTEMS, INC.
+0x000801, HighSpeed Surfing Inc.
+0x000802, Hewlett-Packard Company
+0x000803, Cos Tron
+0x000804, ICA Inc.
+0x000805, Techno-Holon Corporation
+0x000806, Raonet Systems, Inc.
+0x000807, Access Devices Limited
+0x000808, PPT Vision, Inc.
+0x000809, Systemonic AG
+0x00080A, Espera-Werke GmbH
+0x00080B, Birka BPA Informationssystem AB
+0x00080C, VDA Elettronica spa
+0x00080D, Toshiba
+0x00080E, Motorola Mobility, Inc.
+0x00080F, Proximion Fiber Optics AB
+0x000810, Key Technology, Inc.
+0x000811, VOIX Corporation
+0x000812, GM-2 Corporation
+0x000813, Diskbank, Inc.
+0x000814, TIL Technologies
+0x000815, CATS Co., Ltd.
+0x000816, Bluetags A/S
+0x000817, EmergeCore Networks LLC
+0x000818, Pixelworks, Inc.
+0x000819, Banksys
+0x00081A, Sanrad Intelligence Storage Communications (2000) Ltd.
+0x00081B, Windigo Systems
+0x00081C, @pos.com
+0x00081D, Ipsil, Incorporated
+0x00081E, Repeatit AB
+0x00081F, Pou Yuen Tech Corp. Ltd.
+0x000820, CISCO SYSTEMS, INC.
+0x000821, CISCO SYSTEMS, INC.
+0x000822, InPro Comm
+0x000823, Texa Corp.
+0x000824, Nuance Document Imaging
+0x000825, Acme Packet
+0x000826, Colorado Med Tech
+0x000827, ADB Broadband Italia
+0x000828, Koei Engineering Ltd.
+0x000829, Aval Nagasaki Corporation
+0x00082A, Powerwallz Network Security
+0x00082B, Wooksung Electronics, Inc.
+0x00082C, Homag AG
+0x00082D, Indus Teqsite Private Limited
+0x00082E, Multitone Electronics PLC
+0x00082F, CISCO SYSTEMS, INC.
+0x000830, CISCO SYSTEMS, INC.
+0x000831, CISCO SYSTEMS, INC.
+0x000832, Cisco
+0x00084E, DivergeNet, Inc.
+0x00084F, Qualstar Corporation
+0x000850, Arizona Instrument Corp.
+0x000851, Canadian Bank Note Company, Ltd.
+0x000852, Davolink Co. Inc.
+0x000853, Schleicher GmbH & Co. Relaiswerke KG
+0x000854, Netronix, Inc.
+0x000855, NASA-Goddard Space Flight Center
+0x000856, Gamatronic Electronic Industries Ltd.
+0x000857, Polaris Networks, Inc.
+0x000858, Novatechnology Inc.
+0x000859, ShenZhen Unitone Electronics Co., Ltd.
+0x00085A, IntiGate Inc.
+0x00085B, Hanbit Electronics Co., Ltd.
+0x00085C, Shanghai Dare Technologies Co. Ltd.
+0x00085D, Aastra
+0x00085E, PCO AG
+0x00085F, Picanol N.V.
+0x000860, LodgeNet Entertainment Corp.
+0x000861, SoftEnergy Co., Ltd.
+0x000862, NEC Eluminant Technologies, Inc.
+0x000863, Entrisphere Inc.
+0x000864, Fasy S.p.A.
+0x000865, JASCOM CO., LTD
+0x000866, DSX Access Systems, Inc.
+0x000867, Uptime Devices
+0x000868, PurOptix
+0x000869, Command-e Technology Co.,Ltd.
+0x00086A, Securiton Gmbh
+0x00086B, MIPSYS
+0x00086C, Plasmon LMS
+0x00086D, Missouri FreeNet
+0x00086E, Hyglo AB
+0x00086F, Resources Computer Network Ltd.
+0x000870, Rasvia Systems, Inc.
+0x000871, NORTHDATA Co., Ltd.
+0x000872, Sorenson Communications
+0x000873, DapTechnology B.V.
+0x000874, Dell Computer Corp.
+0x000875, Acorp Electronics Corp.
+0x000876, SDSystem
+0x000877, Liebert-Hiross Spa
+0x000878, Benchmark Storage Innovations
+0x000879, CEM Corporation
+0x00087A, Wipotec GmbH
+0x00087B, RTX Telecom A/S
+0x00087C, CISCO SYSTEMS, INC.
+0x00087D, CISCO SYSTEMS, INC.
+0x00087E, Bon Electro-Telecom Inc.
+0x00087F, SPAUN electronic GmbH & Co. KG
+0x000880, BroadTel Canada Communications inc.
+0x000881, DIGITAL HANDS CO.,LTD.
+0x000882, SIGMA CORPORATION
+0x000883, Hewlett-Packard Company
+0x000884, Index Braille AB
+0x000885, EMS Dr. Thomas Wünsche
+0x000886, Hansung Teliann, Inc.
+0x000887, Maschinenfabrik Reinhausen GmbH
+0x000888, OULLIM Information Technology Inc,.
+0x000889, Echostar Technologies Corp
+0x00088A, Minds@Work
+0x00088B, Tropic Networks Inc.
+0x00088C, Quanta Network Systems Inc.
+0x00088D, Sigma-Links Inc.
+0x00088E, Nihon Computer Co., Ltd.
+0x00088F, ADVANCED DIGITAL TECHNOLOGY
+0x000890, AVILINKS SA
+0x000891, Lyan Inc.
+0x000892, EM Solutions
+0x000893, LE INFORMATION COMMUNICATION INC.
+0x000894, InnoVISION Multimedia Ltd.
+0x000895, DIRC Technologie GmbH & Co.KG
+0x000896, Printronix, Inc.
+0x000897, Quake Technologies
+0x000898, Gigabit Optics Corporation
+0x000899, Netbind, Inc.
+0x00089A, Alcatel Microelectronics
+0x00089B, ICP Electronics Inc.
+0x00089C, Elecs Industry Co., Ltd.
+0x00089D, UHD-Elektronik
+0x00089E, Beijing Enter-Net co.LTD
+0x00089F, EFM Networks
+0x0008A0, Stotz Feinmesstechnik GmbH
+0x0008A1, CNet Technology Inc.
+0x0008A2, ADI Engineering, Inc.
+0x0008A3, CISCO SYSTEMS, INC.
+0x0008A4, CISCO SYSTEMS, INC.
+0x0008A5, Peninsula Systems Inc.
+0x0008A6, Multiware & Image Co., Ltd.
+0x0008A7, iLogic Inc.
+0x0008A8, Systec Co., Ltd.
+0x0008A9, SangSang Technology, Inc.
+0x0008AA, KARAM
+0x0008AB, EnerLinx.com, Inc.
+0x0008AC, Eltromat GmbH
+0x0008AD, Toyo-Linx Co., Ltd.
+0x0008AE, PacketFront International AB
+0x0008AF, Novatec Corporation
+0x0008B0, BKtel communications GmbH
+0x0008B1, ProQuent Systems
+0x0008B2, SHENZHEN COMPASS TECHNOLOGY DEVELOPMENT CO.,LTD
+0x0008B3, Fastwel
+0x0008B4, SYSPOL
+0x0008B5, TAI GUEN ENTERPRISE CO., LTD
+0x0008B6, RouteFree, Inc.
+0x0008B7, HIT Incorporated
+0x0008B8, E.F. Johnson
+0x0008B9, KAON MEDIA Co., Ltd.
+0x0008BA, Erskine Systems Ltd
+0x0008BB, NetExcell
+0x0008BC, Ilevo AB
+0x0008BD, TEPG-US
+0x0008BE, XENPAK MSA Group
+0x0008BF, Aptus Elektronik AB
+0x0008C0, ASA SYSTEMS
+0x0008C1, Avistar Communications Corporation
+0x0008C2, CISCO SYSTEMS, INC.
+0x0008C3, Contex A/S
+0x0008C4, Hikari Co.,Ltd.
+0x0008C5, Liontech Co., Ltd.
+0x0008C6, Philips Consumer Communications
+0x0008C7, Hewlett-Packard Company
+0x0008C8, Soneticom, Inc.
+0x0008C9, TechniSat Digital GmbH
+0x0008CA, TwinHan Technology Co.,Ltd
+0x0008CB, Zeta Broadband Inc.
+0x0008CC, Remotec, Inc.
+0x0008CD, With-Net Inc
+0x0008CE, IPMobileNet Inc.
+0x0008CF, Nippon Koei Power Systems Co., Ltd.
+0x0008D0, Musashi Engineering Co., LTD.
+0x0008D1, KAREL INC.
+0x0008D2, ZOOM Networks Inc.
+0x0008D3, Hercules Technologies S.A.
+0x0008D4, IneoQuest Technologies, Inc
+0x0008D5, Vanguard Networks Solutions, LLC
+0x0008D6, HASSNET Inc.
+0x0008D7, HOW CORPORATION
+0x0008D8, Dowkey Microwave
+0x0008D9, Mitadenshi Co.,LTD
+0x0008DA, SofaWare Technologies Ltd.
+0x0008DB, Corrigent Systems
+0x0008DC, Wiznet
+0x0008DD, Telena Communications, Inc.
+0x0008DE, 3UP Systems
+0x0008DF, Alistel Inc.
+0x0008E0, ATO Technology Ltd.
+0x0008E1, Barix AG
+0x0008E2, CISCO SYSTEMS, INC.
+0x0008E3, CISCO SYSTEMS, INC.
+0x0008E4, Envenergy Inc
+0x0008E5, IDK Corporation
+0x0008E6, Littlefeet
+0x0008E7, SHI ControlSystems,Ltd.
+0x0008E8, Excel Master Ltd.
+0x0008E9, NextGig
+0x0008EA, Motion Control Engineering, Inc
+0x0008EB, ROMWin Co.,Ltd.
+0x0008EC, Optical Zonu Corporation
+0x0008ED, ST&T Instrument Corp.
+0x0008EE, Logic Product Development
+0x0008EF, DIBAL,S.A.
+0x0008F0, Next Generation Systems, Inc.
+0x0008F1, Voltaire
+0x0008F2, C&S Technology
+0x0008F3, WANY
+0x0008F4, Bluetake Technology Co., Ltd.
+0x0008F5, YESTECHNOLOGY Co.,Ltd.
+0x0008F6, Sumitomo Electric System Solutions Co.,Ltd.
+0x0008F7, Hitachi Ltd, Semiconductor & Integrated Circuits Gr
+0x0008F8, UTC CCS
+0x0008F9, Emerson Network Power
+0x0008FA, Karl E.Brinkmann GmbH
+0x0008FB, SonoSite, Inc.
+0x0008FC, Gigaphoton Inc.
+0x0008FD, BlueKorea Co., Ltd.
+0x0008FE, UNIK C&C Co.,Ltd.
+0x0008FF, Trilogy Communications Ltd
+0x000900, TMT
+0x000901, Shenzhen Shixuntong Information & Technoligy Co
+0x000902, Redline Communications Inc.
+0x000903, Panasas, Inc
+0x000904, MONDIAL electronic
+0x000905, iTEC Technologies Ltd.
+0x000906, Esteem Networks
+0x000907, Chrysalis Development
+0x000908, VTech Technology Corp.
+0x000909, Telenor Connect A/S
+0x00090A, SnedFar Technology Co., Ltd.
+0x00090B, MTL Instruments PLC
+0x00090C, Mayekawa Mfg. Co. Ltd.
+0x00090D, LEADER ELECTRONICS CORP.
+0x00090E, Helix Technology Inc.
+0x00090F, Fortinet Inc.
+0x000910, Simple Access Inc.
+0x000911, CISCO SYSTEMS, INC.
+0x000912, CISCO SYSTEMS, INC.
+0x000913, SystemK Corporation
+0x000914, COMPUTROLS INC.
+0x000915, CAS Corp.
+0x000916, Listman Home Technologies, Inc.
+0x000917, WEM Technology Inc
+0x000918, SAMSUNG TECHWIN CO.,LTD
+0x000919, MDS Gateways
+0x00091A, Macat Optics & Electronics Co., Ltd.
+0x00091B, Digital Generation Inc.
+0x00091C, CacheVision, Inc
+0x00091D, Proteam Computer Corporation
+0x00091E, Firstech Technology Corp.
+0x00091F, A&D Co., Ltd.
+0x000920, EpoX COMPUTER CO.,LTD.
+0x000921, Planmeca Oy
+0x000922, TST Biometrics GmbH
+0x000923, Heaman System Co., Ltd
+0x000924, Telebau GmbH
+0x000925, VSN Systemen BV
+0x000926, YODA COMMUNICATIONS, INC.
+0x000927, TOYOKEIKI CO.,LTD.
+0x000928, Telecore
+0x000929, Sanyo Industries (UK) Limited
+0x00092A, MYTECS Co.,Ltd.
+0x00092B, iQstor Networks, Inc.
+0x00092C, Hitpoint Inc.
+0x00092D, HTC Corporation
+0x00092E, B&Tech System Inc.
+0x00092F, Akom Technology Corporation
+0x000930, AeroConcierge Inc.
+0x000931, Future Internet, Inc.
+0x000932, Omnilux
+0x000933, Ophit Co.Ltd.
+0x000934, Dream-Multimedia-Tv GmbH
+0x000935, Sandvine Incorporated
+0x000936, Ipetronik GmbH & Co.KG
+0x000937, Inventec Appliance Corp
+0x000938, Allot Communications
+0x000939, ShibaSoku Co.,Ltd.
+0x00093A, Molex Fiber Optics
+0x00093B, HYUNDAI NETWORKS INC.
+0x00093C, Jacques Technologies P/L
+0x00093D, Newisys,Inc.
+0x00093E, C&I Technologies
+0x00093F, Double-Win Enterpirse CO., LTD
+0x000940, AGFEO GmbH & Co. KG
+0x000941, Allied Telesis K.K.
+0x000942, Wireless Technologies, Inc
+0x000943, CISCO SYSTEMS, INC.
+0x000944, CISCO SYSTEMS, INC.
+0x000945, Palmmicro Communications Inc
+0x000946, Cluster Labs GmbH
+0x000947, Aztek, Inc.
+0x000948, Vista Control Systems, Corp.
+0x000949, Glyph Technologies Inc.
+0x00094A, Homenet Communications
+0x00094B, FillFactory NV
+0x00094C, Communication Weaver Co.,Ltd.
+0x00094D, Braintree Communications Pty Ltd
+0x00094E, BARTECH SYSTEMS INTERNATIONAL, INC
+0x00094F, elmegt GmbH & Co. KG
+0x000950, Independent Storage Corporation
+0x000951, Apogee Imaging Systems
+0x000952, Auerswald GmbH & Co. KG
+0x000953, Linkage System Integration Co.Ltd.
+0x000954, AMiT spol. s. r. o.
+0x000955, Young Generation International Corp.
+0x000956, Network Systems Group, Ltd. (NSG)
+0x000957, Supercaller, Inc.
+0x000958, INTELNET S.A.
+0x000959, Sitecsoft
+0x00095A, RACEWOOD TECHNOLOGY
+0x00095B, Netgear, Inc.
+0x00095C, Philips Medical Systems - Cardiac and Monitoring Systems (CM
+0x00095D, Dialogue Technology Corp.
+0x00095E, Masstech Group Inc.
+0x00095F, Telebyte, Inc.
+0x000960, YOZAN Inc.
+0x000961, Switchgear and Instrumentation Ltd
+0x000962, Sonitor Technologies AS
+0x000963, Dominion Lasercom Inc.
+0x000964, Hi-Techniques, Inc.
+0x000965, HyunJu Computer Co., Ltd.
+0x000966, Thales Navigation
+0x000967, Tachyon, Inc
+0x000968, TECHNOVENTURE, INC.
+0x000969, Meret Optical Communications
+0x00096A, Cloverleaf Communications Inc.
+0x00096B, IBM Corp
+0x00096C, Imedia Semiconductor Corp.
+0x00096D, Powernet Technologies Corp.
+0x00096E, GIANT ELECTRONICS LTD.
+0x00096F, Beijing Zhongqing Elegant Tech. Corp.,Limited
+0x000970, Vibration Research Corporation
+0x000971, Time Management, Inc.
+0x000972, Securebase,Inc
+0x000973, Lenten Technology Co., Ltd.
+0x000974, Innopia Technologies, Inc.
+0x000975, fSONA Communications Corporation
+0x000976, Datasoft ISDN Systems GmbH
+0x000977, Brunner Elektronik AG
+0x000978, AIJI System Co., Ltd.
+0x000979, Advanced Television Systems Committee, Inc.
+0x00097A, Louis Design Labs.
+0x00097B, CISCO SYSTEMS, INC.
+0x00097C, CISCO SYSTEMS, INC.
+0x00097D, SecWell Networks Oy
+0x00097E, IMI TECHNOLOGY CO., LTD
+0x00097F, Vsecure 2000 LTD.
+0x000980, Power Zenith Inc.
+0x000981, Newport Networks
+0x000982, Loewe Opta GmbH
+0x000983, GlobalTop Technology, Inc.
+0x000984, MyCasa Network Inc.
+0x000985, Auto Telecom Company
+0x000986, Metalink LTD.
+0x000987, NISHI NIPPON ELECTRIC WIRE & CABLE CO.,LTD.
+0x000988, Nudian Electron Co., Ltd.
+0x000989, VividLogic Inc.
+0x00098A, EqualLogic Inc
+0x00098B, Entropic Communications, Inc.
+0x00098C, Option Wireless Sweden
+0x00098D, Velocity Semiconductor
+0x00098E, ipcas GmbH
+0x00098F, Cetacean Networks
+0x000990, ACKSYS Communications & systems
+0x000991, GE Fanuc Automation Manufacturing, Inc.
+0x000992, InterEpoch Technology,INC.
+0x000993, Visteon Corporation
+0x000994, Cronyx Engineering
+0x000995, Castle Technology Ltd
+0x000996, RDI
+0x000997, Nortel Networks
+0x000998, Capinfo Company Limited
+0x000999, CP GEORGES RENAULT
+0x00099A, ELMO COMPANY, LIMITED
+0x00099B, Western Telematic Inc.
+0x00099C, Naval Research Laboratory
+0x00099D, Haliplex Communications
+0x00099E, Testech, Inc.
+0x00099F, VIDEX INC.
+0x0009A0, Microtechno Corporation
+0x0009A1, Telewise Communications, Inc.
+0x0009A2, Interface Co., Ltd.
+0x0009A3, Leadfly Techologies Corp. Ltd.
+0x0009A4, HARTEC Corporation
+0x0009A5, HANSUNG ELETRONIC INDUSTRIES DEVELOPMENT CO., LTD
+0x0009A6, Ignis Optics, Inc.
+0x0009A7, Bang & Olufsen A/S
+0x0009A8, Eastmode Pte Ltd
+0x0009A9, Ikanos Communications
+0x0009AA, Data Comm for Business, Inc.
+0x0009AB, Netcontrol Oy
+0x0009AC, LANVOICE
+0x0009AD, HYUNDAI SYSCOMM, INC.
+0x0009AE, OKANO ELECTRIC CO.,LTD
+0x0009AF, e-generis
+0x0009B0, Onkyo Corporation
+0x0009B1, Kanematsu Electronics, Ltd.
+0x0009B2, L&F Inc.
+0x0009B3, MCM Systems Ltd
+0x0009B4, KISAN TELECOM CO., LTD.
+0x0009B5, 3J Tech. Co., Ltd.
+0x0009B6, CISCO SYSTEMS, INC.
+0x0009B7, CISCO SYSTEMS, INC.
+0x0009B8, Entise Systems
+0x0009B9, Action Imaging Solutions
+0x0009BA, MAKU Informationstechik GmbH
+0x0009BB, MathStar, Inc.
+0x0009BC, Digital Safety Technologies, Inc
+0x0009BD, Epygi Technologies, Ltd.
+0x0009BE, Mamiya-OP Co.,Ltd.
+0x0009BF, Nintendo Co.,Ltd.
+0x0009C0, 6WIND
+0x0009C1, PROCES-DATA A/S
+0x0009C2, Onity, Inc.
+0x0009C3, NETAS
+0x0009C4, Medicore Co., Ltd
+0x0009C5, KINGENE Technology Corporation
+0x0009C6, Visionics Corporation
+0x0009C7, Movistec
+0x0009C8, SINAGAWA TSUSHIN KEISOU SERVICE
+0x0009C9, BlueWINC Co., Ltd.
+0x0009CA, iMaxNetworks(Shenzhen)Limited.
+0x0009CB, HBrain
+0x0009CC, Moog GmbH
+0x0009CD, HUDSON SOFT CO.,LTD.
+0x0009CE, SpaceBridge Semiconductor Corp.
+0x0009CF, iAd GmbH
+0x0009D0, Solacom Technologies Inc.
+0x0009D1, SERANOA NETWORKS INC
+0x0009D2, Mai Logic Inc.
+0x0009D3, Western DataCom Co., Inc.
+0x0009D4, Transtech Networks
+0x0009D5, Signal Communication, Inc.
+0x0009D6, KNC One GmbH
+0x0009D7, DC Security Products
+0x0009D8, Fält Communications AB
+0x0009D9, Neoscale Systems, Inc
+0x0009DA, Control Module Inc.
+0x0009DB, eSpace
+0x0009DC, Galaxis Technology AG
+0x0009DD, Mavin Technology Inc.
+0x0009DE, Samjin Information & Communications Co., Ltd.
+0x0009DF, Vestel Komunikasyon Sanayi ve Ticaret A.S.
+0x0009E0, XEMICS S.A.
+0x0009E1, Gemtek Technology Co., Ltd.
+0x0009E2, Sinbon Electronics Co., Ltd.
+0x0009E3, Angel Iglesias S.A.
+0x0009E4, K Tech Infosystem Inc.
+0x0009E5, Hottinger Baldwin Messtechnik GmbH
+0x0009E6, Cyber Switching Inc.
+0x0009E7, ADC Techonology
+0x0009E8, CISCO SYSTEMS, INC.
+0x0009E9, CISCO SYSTEMS, INC.
+0x0009EA, YEM Inc.
+0x0009EB, HuMANDATA LTD.
+0x0009EC, Daktronics, Inc.
+0x0009ED, CipherOptics
+0x0009EE, MEIKYO ELECTRIC CO.,LTD
+0x0009EF, Vocera Communications
+0x0009F0, Shimizu Technology Inc.
+0x0009F1, Yamaki Electric Corporation
+0x0009F2, Cohu, Inc., Electronics Division
+0x0009F3, WELL Communication Corp.
+0x0009F4, Alcon Laboratories, Inc.
+0x0009F5, Emerson Network Power Co.,Ltd
+0x0009F6, Shenzhen Eastern Digital Tech Ltd.
+0x0009F7, SED, a division of Calian
+0x0009F8, UNIMO TECHNOLOGY CO., LTD.
+0x0009F9, ART JAPAN CO., LTD.
+0x0009FB, Philips Patient Monitoring
+0x0009FC, IPFLEX Inc.
+0x0009FD, Ubinetics Limited
+0x0009FE, Daisy Technologies, Inc.
+0x0009FF, X.net 2000 GmbH
+0x000A00, Mediatek Corp.
+0x000A01, SOHOware, Inc.
+0x000A02, ANNSO CO., LTD.
+0x000A03, ENDESA SERVICIOS, S.L.
+0x000A04, 3Com Ltd
+0x000A05, Widax Corp.
+0x000A06, Teledex LLC
+0x000A07, WebWayOne Ltd
+0x000A08, ALPINE ELECTRONICS, INC.
+0x000A09, TaraCom Integrated Products, Inc.
+0x000A0A, SUNIX Co., Ltd.
+0x000A0B, Sealevel Systems, Inc.
+0x000A0C, Scientific Research Corporation
+0x000A0D, FCI Deutschland GmbH
+0x000A0E, Invivo Research Inc.
+0x000A0F, Ilryung Telesys, Inc
+0x000A10, FAST media integrations AG
+0x000A11, ExPet Technologies, Inc
+0x000A12, Azylex Technology, Inc
+0x000A13, Honeywell Video Systems
+0x000A14, TECO a.s.
+0x000A15, Silicon Data, Inc
+0x000A16, Lassen Research
+0x000A17, NESTAR COMMUNICATIONS, INC
+0x000A18, Vichel Inc.
+0x000A19, Valere Power, Inc.
+0x000A1A, Imerge Ltd
+0x000A1B, Stream Labs
+0x000A1C, Bridge Information Co., Ltd.
+0x000A1D, Optical Communications Products Inc.
+0x000A1E, Red-M Products Limited
+0x000A1F, ART WARE Telecommunication Co., Ltd.
+0x000A20, SVA Networks, Inc.
+0x000A21, Integra Telecom Co. Ltd
+0x000A22, Amperion Inc
+0x000A23, Parama Networks Inc
+0x000A24, Octave Communications
+0x000A25, CERAGON NETWORKS
+0x000A26, CEIA S.p.A.
+0x000A27, Apple Computer, Inc.
+0x000A28, Motorola
+0x000A29, Pan Dacom Networking AG
+0x000A2A, QSI Systems Inc.
+0x000A2B, Etherstuff
+0x000A2C, Active Tchnology Corporation
+0x000A2D, Cabot Communications Limited
+0x000A2E, MAPLE NETWORKS CO., LTD
+0x000A2F, Artnix Inc.
+0x000A30, Johnson Controls-ASG
+0x000A31, HCV Consulting
+0x000A32, Xsido Corporation
+0x000A33, Emulex Corporation
+0x000A34, Identicard Systems Incorporated
+0x000A35, Xilinx
+0x000A36, Synelec Telecom Multimedia
+0x000A37, Procera Networks, Inc.
+0x000A38, Apani Networks
+0x000A39, LoPA Information Technology
+0x000A3A, J-THREE INTERNATIONAL Holding Co., Ltd.
+0x000A3B, GCT Semiconductor, Inc
+0x000A3C, Enerpoint Ltd.
+0x000A3D, Elo Sistemas Eletronicos S.A.
+0x000A3E, EADS Telecom
+0x000A3F, Data East Corporation
+0x000A40, Crown Audio -- Harmanm International
+0x000A41, CISCO SYSTEMS, INC.
+0x000A42, CISCO SYSTEMS, INC.
+0x000A43, Chunghwa Telecom Co., Ltd.
+0x000A44, Avery Dennison Deutschland GmbH
+0x000A45, Audio-Technica Corp.
+0x000A46, ARO WELDING TECHNOLOGIES SAS
+0x000A47, Allied Vision Technologies
+0x000A48, Albatron Technology
+0x000A49, F5 Networks, Inc.
+0x000A4A, Targa Systems Ltd.
+0x000A4B, DataPower Technology, Inc.
+0x000A4C, Molecular Devices Corporation
+0x000A4D, Noritz Corporation
+0x000A4E, UNITEK Electronics INC.
+0x000A4F, Brain Boxes Limited
+0x000A50, REMOTEK CORPORATION
+0x000A51, GyroSignal Technology Co., Ltd.
+0x000A52, AsiaRF Ltd.
+0x000A53, Intronics, Incorporated
+0x000A54, Laguna Hills, Inc.
+0x000A55, MARKEM Corporation
+0x000A56, HITACHI Maxell Ltd.
+0x000A57, Hewlett-Packard Company - Standards
+0x000A58, Ingenieur-Büro Freyer & Siegel
+0x000A59, HW server
+0x000A5A, GreenNET Technologies Co.,Ltd.
+0x000A5B, Power-One as
+0x000A5C, Carel s.p.a.
+0x000A5D, PUC Founder (MSC) Berhad
+0x000A5E, 3COM Corporation
+0x000A5F, almedio inc.
+0x000A60, Autostar Technology Pte Ltd
+0x000A61, Cellinx Systems Inc.
+0x000A62, Crinis Networks, Inc.
+0x000A63, DHD GmbH
+0x000A64, Eracom Technologies
+0x000A65, GentechMedia.co.,ltd.
+0x000A66, MITSUBISHI ELECTRIC SYSTEM & SERVICE CO.,LTD.
+0x000A67, OngCorp
+0x000A68, SolarFlare Communications, Inc.
+0x000A69, SUNNY bell Technology Co., Ltd.
+0x000A6A, SVM Microwaves s.r.o.
+0x000A6B, Tadiran Telecom Business Systems LTD
+0x000A6C, Walchem Corporation
+0x000A6D, EKS Elektronikservice GmbH
+0x000A6E, Harmonic, Inc
+0x000A6F, ZyFLEX Technologies Inc
+0x000A70, MPLS Forum
+0x000A71, Avrio Technologies, Inc
+0x000A72, STEC, INC.
+0x000A73, Scientific Atlanta
+0x000A74, Manticom Networks Inc.
+0x000A75, Caterpillar, Inc
+0x000A76, Beida Jade Bird Huaguang Technology Co.,Ltd
+0x000A77, Bluewire Technologies LLC
+0x000A78, OLITEC
+0x000A79, Allied Telesis K.K. corega division
+0x000A7A, Kyoritsu Electric Co., Ltd.
+0x000A7B, Cornelius Consult
+0x000A7C, Tecton Ltd
+0x000A7D, Valo, Inc.
+0x000A7E, The Advantage Group
+0x000A7F, Teradon Industries, Inc
+0x000A80, Telkonet Inc.
+0x000A81, TEIMA Audiotex S.L.
+0x000A82, TATSUTA SYSTEM ELECTRONICS CO.,LTD.
+0x000A83, SALTO SYSTEMS S.L.
+0x000A84, Rainsun Enterprise Co., Ltd.
+0x000A85, PLAT'C2,Inc
+0x000A86, Lenze
+0x000A87, Integrated Micromachines Inc.
+0x000A88, InCypher S.A.
+0x000A89, Creval Systems, Inc.
+0x000A8A, CISCO SYSTEMS, INC.
+0x000A8B, CISCO SYSTEMS, INC.
+0x000A8C, Guardware Systems Ltd.
+0x000A8D, EUROTHERM LIMITED
+0x000A8E, Invacom Ltd
+0x000A8F, Aska International Inc.
+0x000A90, Bayside Interactive, Inc.
+0x000A91, HemoCue AB
+0x000A92, Presonus Corporation
+0x000A93, W2 Networks, Inc.
+0x000A94, ShangHai cellink CO., LTD
+0x000A95, Apple Computer, Inc.
+0x000A96, MEWTEL TECHNOLOGY INC.
+0x000A97, SONICblue, Inc.
+0x000A98, M+F Gwinner GmbH & Co
+0x000A99, Calamp Wireless Networks Inc
+0x000A9A, Aiptek International Inc
+0x000A9B, TB Group Inc
+0x000A9C, Server Technology, Inc.
+0x000A9D, King Young Technology Co. Ltd.
+0x000A9E, BroadWeb Corportation
+0x000A9F, Pannaway Technologies, Inc.
+0x000AA0, Cedar Point Communications
+0x000AA1, V V S Limited
+0x000AA2, SYSTEK INC.
+0x000AA3, SHIMAFUJI ELECTRIC CO.,LTD.
+0x000AA4, SHANGHAI SURVEILLANCE TECHNOLOGY CO,LTD
+0x000AA5, MAXLINK INDUSTRIES LIMITED
+0x000AA6, Hochiki Corporation
+0x000AA7, FEI Electron Optics
+0x000AA8, ePipe Pty. Ltd.
+0x000AA9, Brooks Automation GmbH
+0x000AAA, AltiGen Communications Inc.
+0x000AAB, Toyota Technical Development Corporation
+0x000AAC, TerraTec Electronic GmbH
+0x000AAD, Stargames Corporation
+0x000AAE, Rosemount Process Analytical
+0x000AAF, Pipal Systems
+0x000AB0, LOYTEC electronics GmbH
+0x000AB1, GENETEC Corporation
+0x000AB2, Fresnel Wireless Systems
+0x000AB3, Fa. GIRA
+0x000AB4, ETIC Telecommunications
+0x000AB5, Digital Electronic Network
+0x000AB6, COMPUNETIX, INC
+0x000AB7, CISCO SYSTEMS, INC.
+0x000AB8, CISCO SYSTEMS, INC.
+0x000AB9, Astera Technologies Corp.
+0x000ABA, Arcon Technology Limited
+0x000ABB, Taiwan Secom Co,. Ltd
+0x000ABC, Seabridge Ltd.
+0x000ABD, Rupprecht & Patashnick Co.
+0x000ABE, OPNET Technologies CO., LTD.
+0x000ABF, HIROTA SS
+0x000AC0, Fuyoh Video Industry CO., LTD.
+0x000AC1, Futuretel
+0x000AC2, FiberHome Telecommunication Technologies CO.,LTD
+0x000AC3, eM Technics Co., Ltd.
+0x000AC4, Daewoo Teletech Co., Ltd
+0x000AC5, Color Kinetics
+0x000AC6, Overture Networks.
+0x000AC7, Unication Group
+0x000AC8, ZPSYS CO.,LTD. (Planning&Management)
+0x000AC9, Zambeel Inc
+0x000ACA, YOKOYAMA SHOKAI CO.,Ltd.
+0x000ACB, XPAK MSA Group
+0x000ACC, Winnow Networks, Inc.
+0x000ACD, Sunrich Technology Limited
+0x000ACE, RADIANTECH, INC.
+0x000ACF, PROVIDEO Multimedia Co. Ltd.
+0x000AD0, Niigata Develoment Center, F.I.T. Co., Ltd.
+0x000AD1, MWS
+0x000AD2, JEPICO Corporation
+0x000AD3, INITECH Co., Ltd
+0x000AD4, CoreBell Systems Inc.
+0x000AD5, Brainchild Electronic Co., Ltd.
+0x000AD6, BeamReach Networks
+0x000AD7, Origin ELECTRIC CO.,LTD.
+0x000AD8, IPCserv Technology Corp.
+0x000AD9, Sony Ericsson Mobile Communications AB
+0x000ADA, Vindicator Technologies
+0x000ADB, SkyPilot Network, Inc
+0x000ADC, RuggedCom Inc.
+0x000ADD, Allworx Corp.
+0x000ADE, Happy Communication Co., Ltd.
+0x000ADF, Gennum Corporation
+0x000AE0, Fujitsu Softek
+0x000AE1, EG Technology
+0x000AE2, Binatone Electronics International, Ltd
+0x000AE3, YANG MEI TECHNOLOGY CO., LTD
+0x000AE4, Wistron Corp.
+0x000AE5, ScottCare Corporation
+0x000AE6, Elitegroup Computer System Co. (ECS)
+0x000AE7, ELIOP S.A.
+0x000AE8, Cathay Roxus Information Technology Co. LTD
+0x000AE9, AirVast Technology Inc.
+0x000AEA, ADAM ELEKTRONIK LTD. ŞTI
+0x000AEB, Shenzhen Tp-Link Technology Co; Ltd.
+0x000AEC, Koatsu Gas Kogyo Co., Ltd.
+0x000AED, HARTING Systems GmbH & Co KG
+0x000AEE, GCD Hard- & Software GmbH
+0x000AEF, OTRUM ASA
+0x000AF0, SHIN-OH ELECTRONICS CO., LTD. R&D
+0x000AF1, Clarity Design, Inc.
+0x000AF2, NeoAxiom Corp.
+0x000AF3, CISCO SYSTEMS, INC.
+0x000AF4, CISCO SYSTEMS, INC.
+0x000AF5, Airgo Networks, Inc.
+0x000AF6, Emerson Climate Technologies Retail Solutions, Inc.
+0x000AF7, Broadcom Corp.
+0x000AF8, American Telecare Inc.
+0x000AF9, HiConnect, Inc.
+0x000AFA, Traverse Technologies Australia
+0x000AFB, Ambri Limited
+0x000AFC, Core Tec Communications, LLC
+0x000AFD, Viking Electronic Services
+0x000AFE, NovaPal Ltd
+0x000AFF, Kilchherr Elektronik AG
+0x000B00, FUJIAN START COMPUTER EQUIPMENT CO.,LTD
+0x000B01, DAIICHI ELECTRONICS CO., LTD.
+0x000B02, Dallmeier electronic
+0x000B03, Taekwang Industrial Co., Ltd
+0x000B04, Volktek Corporation
+0x000B05, Pacific Broadband Networks
+0x000B06, Motorola Mobility, Inc.
+0x000B07, Voxpath Networks
+0x000B08, Pillar Data Systems
+0x000B09, Ifoundry Systems Singapore
+0x000B0A, dBm Optics
+0x000B0B, Corrent Corporation
+0x000B0C, Agile Systems Inc.
+0x000B0D, Air2U, Inc.
+0x000B0E, Trapeze Networks
+0x000B0F, Bosch Rexroth
+0x000B10, 11wave Technonlogy Co.,Ltd
+0x000B11, HIMEJI ABC TRADING CO.,LTD.
+0x000B12, NURI Telecom Co., Ltd.
+0x000B13, ZETRON INC
+0x000B14, ViewSonic Corporation
+0x000B15, Platypus Technology
+0x000B16, Communication Machinery Corporation
+0x000B17, MKS Instruments
+0x000B18, PRIVATE
+0x000B19, Vernier Networks, Inc.
+0x000B1A, Industrial Defender, Inc.
+0x000B1B, Systronix, Inc.
+0x000B1C, SIBCO bv
+0x000B1D, LayerZero Power Systems, Inc.
+0x000B1E, KAPPA opto-electronics GmbH
+0x000B1F, I CON Computer Co.
+0x000B20, Hirata corporation
+0x000B21, G-Star Communications Inc.
+0x000B22, Environmental Systems and Services
+0x000B23, Siemens Subscriber Networks
+0x000B24, AirLogic
+0x000B25, Aeluros
+0x000B26, Wetek Corporation
+0x000B27, Scion Corporation
+0x000B28, Quatech Inc.
+0x000B29, LS(LG) Industrial Systems co.,Ltd
+0x000B2A, HOWTEL Co., Ltd.
+0x000B2B, HOSTNET CORPORATION
+0x000B2C, Eiki Industrial Co. Ltd.
+0x000B2D, Danfoss Inc.
+0x000B2E, Cal-Comp Electronics (Thailand) Public Company Limited Taipe
+0x000B2F, bplan GmbH
+0x000B30, Beijing Gongye Science & Technology Co.,Ltd
+0x000B31, Yantai ZhiYang Scientific and technology industry CO., LTD
+0x000B32, VORMETRIC, INC.
+0x000B33, Vivato Technologies
+0x000B34, ShangHai Broadband Technologies CO.LTD
+0x000B35, Quad Bit System co., Ltd.
+0x000B36, Productivity Systems, Inc.
+0x000B37, MANUFACTURE DES MONTRES ROLEX SA
+0x000B38, Knürr GmbH
+0x000B39, Keisoku Giken Co.,Ltd.
+0x000B3A, QuStream Corporation
+0x000B3B, devolo AG
+0x000B3C, Cygnal Integrated Products, Inc.
+0x000B3D, CONTAL OK Ltd.
+0x000B3E, BittWare, Inc
+0x000B3F, Anthology Solutions Inc.
+0x000B40, Oclaro
+0x000B41, Ing. Büro Dr. Beutlhauser
+0x000B42, commax Co., Ltd.
+0x000B43, Microscan Systems, Inc.
+0x000B44, Concord IDea Corp.
+0x000B45, CISCO SYSTEMS, INC.
+0x000B46, CISCO SYSTEMS, INC.
+0x000B47, Advanced Energy
+0x000B48, sofrel
+0x000B49, RF-Link System Inc.
+0x000B4A, Visimetrics (UK) Ltd
+0x000B4B, VISIOWAVE SA
+0x000B4C, Clarion (M) Sdn Bhd
+0x000B4D, Emuzed
+0x000B4E, VertexRSI, General Dynamics SatCOM Technologies, Inc.
+0x000B4F, Verifone, INC.
+0x000B50, Oxygnet
+0x000B51, Micetek International Inc.
+0x000B52, JOYMAX ELECTRONICS CO. LTD.
+0x000B53, INITIUM Co., Ltd.
+0x000B54, BiTMICRO Networks, Inc.
+0x000B55, ADInstruments
+0x000B56, Cybernetics
+0x000B57, Silicon Laboratories
+0x000B58, Astronautics C.A LTD
+0x000B59, ScriptPro, LLC
+0x000B5A, HyperEdge
+0x000B5B, Rincon Research Corporation
+0x000B5C, Newtech Co.,Ltd
+0x000B5D, FUJITSU LIMITED
+0x000B5E, Audio Engineering Society Inc.
+0x000B5F, CISCO SYSTEMS, INC.
+0x000B60, CISCO SYSTEMS, INC.
+0x000B61, Friedrich Lütze GmbH & Co. KG
+0x000B62, Ingenieurbüro für Elektronikdesign Ingo Mohnen
+0x000B63, Kaleidescape
+0x000B64, Kieback & Peter GmbH & Co KG
+0x000B65, Sy.A.C. srl
+0x000B66, Teralink Communications
+0x000B67, Topview Technology Corporation
+0x000B68, Addvalue Communications Pte Ltd
+0x000B69, Franke Finland Oy
+0x000B6A, Asiarock Incorporation
+0x000B6B, Wistron Neweb Corp.
+0x000B6C, Sychip Inc.
+0x000B6D, SOLECTRON JAPAN NAKANIIDA
+0x000B6E, Neff Instrument Corp.
+0x000B6F, Media Streaming Networks Inc
+0x000B70, Load Technology, Inc.
+0x000B71, Litchfield Communications Inc.
+0x000B72, Lawo AG
+0x000B73, Kodeos Communications
+0x000B74, Kingwave Technology Co., Ltd.
+0x000B75, Iosoft Ltd.
+0x000B76, ET&T Technology Co. Ltd.
+0x000B77, Cogent Systems, Inc.
+0x000B78, TAIFATECH INC.
+0x000B79, X-COM, Inc.
+0x000B7A, Wave Science Inc.
+0x000B7B, Test-Um Inc.
+0x000B7C, Telex Communications
+0x000B7D, SOLOMON EXTREME INTERNATIONAL LTD.
+0x000B7E, SAGINOMIYA Seisakusho Inc.
+0x000B7F, Align Engineering LLC
+0x000B80, Lycium Networks
+0x000B81, Kaparel Corporation
+0x000B82, Grandstream Networks, Inc.
+0x000B83, DATAWATT B.V.
+0x000B84, BODET
+0x000B85, CISCO SYSTEMS, INC.
+0x000B86, Aruba Networks
+0x000B87, American Reliance Inc.
+0x000B88, Vidisco ltd.
+0x000B89, Top Global Technology, Ltd.
+0x000B8A, MITEQ Inc.
+0x000B8B, KERAJET, S.A.
+0x000B8C, Flextronics
+0x000B8D, Avvio Networks
+0x000B8E, Ascent Corporation
+0x000B8F, AKITA ELECTRONICS SYSTEMS CO.,LTD.
+0x000B90, ADVA Optical Networking Ltd.
+0x000B91, Aglaia Gesellschaft für Bildverarbeitung und Kommunikation mbH
+0x000B92, Ascom Danmark A/S
+0x000B93, Ritter Elektronik
+0x000B94, Digital Monitoring Products, Inc.
+0x000B95, eBet Gaming Systems Pty Ltd
+0x000B96, Innotrac Diagnostics Oy
+0x000B97, Matsushita Electric Industrial Co.,Ltd.
+0x000B98, NiceTechVision
+0x000B99, SensAble Technologies, Inc.
+0x000B9A, Shanghai Ulink Telecom Equipment Co. Ltd.
+0x000B9B, Sirius System Co, Ltd.
+0x000B9C, TriBeam Technologies, Inc.
+0x000B9D, TwinMOS Technologies Inc.
+0x000B9E, Yasing Technology Corp.
+0x000B9F, Neue ELSA GmbH
+0x000BA0, T&L Information Inc.
+0x000BA1, SYSCOM Ltd.
+0x000BA2, Sumitomo Electric Networks, Inc
+0x000BA3, Siemens AG, I&S
+0x000BA4, Shiron Satellite Communications Ltd. (1996)
+0x000BA5, Quasar Cipta Mandiri, PT
+0x000BA6, Miyakawa Electric Works Ltd.
+0x000BA7, Maranti Networks
+0x000BA8, HANBACK ELECTRONICS CO., LTD.
+0x000BA9, CloudShield Technologies, Inc.
+0x000BAA, Aiphone co.,Ltd
+0x000BAB, Advantech Technology (CHINA) Co., Ltd.
+0x000BAC, 3Com Ltd
+0x000BAD, PC-PoS Inc.
+0x000BAE, Vitals System Inc.
+0x000BAF, WOOJU COMMUNICATIONS Co,.Ltd
+0x000BB0, Sysnet Telematica srl
+0x000BB1, Super Star Technology Co., Ltd.
+0x000BB2, SMALLBIG TECHNOLOGY
+0x000BB3, RiT technologies Ltd.
+0x000BB4, RDC Semiconductor Inc.,
+0x000BB5, nStor Technologies, Inc.
+0x000BB6, Metalligence Technology Corp.
+0x000BB7, Micro Systems Co.,Ltd.
+0x000BB8, Kihoku Electronic Co.
+0x000BB9, Imsys AB
+0x000BBA, Harmonic, Inc
+0x000BBB, Etin Systems Co., Ltd
+0x000BBC, En Garde Systems, Inc.
+0x000BBD, Connexionz Limited
+0x000BBE, CISCO SYSTEMS, INC.
+0x000BBF, CISCO SYSTEMS, INC.
+0x000BC0, China IWNComm Co., Ltd.
+0x000BC1, Bay Microsystems, Inc.
+0x000BC2, Corinex Communication Corp.
+0x000BC3, Multiplex, Inc.
+0x000BC4, BIOTRONIK GmbH & Co
+0x000BC5, SMC Networks, Inc.
+0x000BC6, ISAC, Inc.
+0x000BC7, ICET S.p.A.
+0x000BC8, AirFlow Networks
+0x000BC9, Electroline Equipment
+0x000BCA, DATAVAN International Corporation
+0x000BCB, Fagor Automation , S. Coop
+0x000BCC, JUSAN, S.A.
+0x000BCD, Hewlett-Packard Company
+0x000BCE, Free2move AB
+0x000BCF, AGFA NDT INC.
+0x000BD0, XiMeta Technology Americas Inc.
+0x000BD1, Aeronix, Inc.
+0x000BD2, Remopro Technology Inc.
+0x000BD3, cd3o
+0x000BD4, Beijing Wise Technology & Science Development Co.Ltd
+0x000BD5, Nvergence, Inc.
+0x000BD6, Paxton Access Ltd
+0x000BD7, DORMA Time + Access GmbH
+0x000BD8, Industrial Scientific Corp.
+0x000BD9, General Hydrogen
+0x000BDA, EyeCross Co.,Inc.
+0x000BDB, Dell ESG PCBA Test
+0x000BDC, AKCP
+0x000BDD, TOHOKU RICOH Co., LTD.
+0x000BDE, TELDIX GmbH
+0x000BDF, Shenzhen RouterD Networks Limited
+0x000BE0, SercoNet Ltd.
+0x000BE1, Nokia NET Product Operations
+0x000BE2, Lumenera Corporation
+0x000BE3, Key Stream Co., Ltd.
+0x000BE4, Hosiden Corporation
+0x000BE5, HIMS Korea Co., Ltd.
+0x000BE6, Datel Electronics
+0x000BE7, COMFLUX TECHNOLOGY INC.
+0x000BE8, AOIP
+0x000BE9, Actel Corporation
+0x000BEA, Zultys Technologies
+0x000BEB, Systegra AG
+0x000BEC, NIPPON ELECTRIC INSTRUMENT, INC.
+0x000BED, ELM Inc.
+0x000BEE, inc.jet, Incorporated
+0x000BEF, Code Corporation
+0x000BF0, MoTEX Products Co., Ltd.
+0x000BF1, LAP Laser Applikations
+0x000BF2, Chih-Kan Technology Co., Ltd.
+0x000BF3, BAE SYSTEMS
+0x000BF4, PRIVATE
+0x000BF5, Shanghai Sibo Telecom Technology Co.,Ltd
+0x000BF6, Nitgen Co., Ltd
+0x000BF7, NIDEK CO.,LTD
+0x000BF8, Infinera
+0x000BF9, Gemstone communications, Inc.
+0x000BFA, EXEMYS SRL
+0x000BFB, D-NET International Corporation
+0x000BFC, CISCO SYSTEMS, INC.
+0x000BFD, CISCO SYSTEMS, INC.
+0x000BFE, CASTEL Broadband Limited
+0x000BFF, Berkeley Camera Engineering
+0x000C00, BEB Industrie-Elektronik AG
+0x000C01, Abatron AG
+0x000C02, ABB Oy
+0x000C03, HDMI Licensing, LLC
+0x000C04, Tecnova
+0x000C05, RPA Reserch Co., Ltd.
+0x000C06, Nixvue Systems Pte Ltd
+0x000C07, Iftest AG
+0x000C08, HUMEX Technologies Corp.
+0x000C09, Hitachi IE Systems Co., Ltd
+0x000C0A, Guangdong Province Electronic Technology Research Institute
+0x000C0B, Broadbus Technologies
+0x000C0C, APPRO TECHNOLOGY INC.
+0x000C0D, Communications & Power Industries / Satcom Division
+0x000C0E, XtremeSpectrum, Inc.
+0x000C0F, Techno-One Co., Ltd
+0x000C10, PNI Corporation
+0x000C11, NIPPON DEMPA CO.,LTD.
+0x000C12, Micro-Optronic-Messtechnik GmbH
+0x000C13, MediaQ
+0x000C14, Diagnostic Instruments, Inc.
+0x000C15, CyberPower Systems, Inc.
+0x000C16, Concorde Microsystems Inc.
+0x000C17, AJA Video Systems Inc
+0x000C18, Zenisu Keisoku Inc.
+0x000C19, Telio Communications GmbH
+0x000C1A, Quest Technical Solutions Inc.
+0x000C1B, ORACOM Co, Ltd.
+0x000C1C, MicroWeb Co., Ltd.
+0x000C1D, Mettler & Fuchs AG
+0x000C1E, Global Cache
+0x000C1F, Glimmerglass Networks
+0x000C20, Fi WIn, Inc.
+0x000C21, Faculty of Science and Technology, Keio University
+0x000C22, Double D Electronics Ltd
+0x000C23, Beijing Lanchuan Tech. Co., Ltd.
+0x000C24, ANATOR
+0x000C25, Allied Telesis Labs, Inc.
+0x000C26, Weintek Labs. Inc.
+0x000C27, Sammy Corporation
+0x000C28, RIFATRON
+0x000C29, VMware, Inc.
+0x000C2A, OCTTEL Communication Co., Ltd.
+0x000C2B, ELIAS Technology, Inc.
+0x000C2C, Enwiser Inc.
+0x000C2D, FullWave Technology Co., Ltd.
+0x000C2E, Openet information technology(shenzhen) Co., Ltd.
+0x000C2F, SeorimTechnology Co.,Ltd.
+0x000C30, CISCO SYSTEMS, INC.
+0x000C31, CISCO SYSTEMS, INC.
+0x000C32, Avionic Design Development GmbH
+0x000C33, Compucase Enterprise Co. Ltd.
+0x000C34, Vixen Co., Ltd.
+0x000C35, KaVo Dental GmbH & Co. KG
+0x000C36, SHARP TAKAYA ELECTRONICS INDUSTRY CO.,LTD.
+0x000C37, Geomation, Inc.
+0x000C38, TelcoBridges Inc.
+0x000C39, Sentinel Wireless Inc.
+0x000C3A, Oxance
+0x000C3B, Orion Electric Co., Ltd.
+0x000C3C, MediaChorus, Inc.
+0x000C3D, Glsystech Co., Ltd.
+0x000C3E, Crest Audio
+0x000C3F, Cogent Defence & Security Networks,
+0x000C40, Altech Controls
+0x000C41, Cisco-Linksys
+0x000C42, Routerboard.com
+0x000C43, Ralink Technology, Corp.
+0x000C44, Automated Interfaces, Inc.
+0x000C45, Animation Technologies Inc.
+0x000C46, Allied Telesyn Inc.
+0x000C47, SK Teletech(R&D Planning Team)
+0x000C48, QoStek Corporation
+0x000C49, Dangaard Telecom RTC Division A/S
+0x000C4A, Cygnus Microsystems (P) Limited
+0x000C4B, Cheops Elektronik
+0x000C4C, Arcor AG&Co.
+0x000C4D, Curtiss-Wright Controls Avionics & Electronics
+0x000C4E, Winbest Technology CO,LT
+0x000C4F, UDTech Japan Corporation
+0x000C50, Seagate Technology
+0x000C51, Scientific Technologies Inc.
+0x000C52, Roll Systems Inc.
+0x000C53, PRIVATE
+0x000C54, Pedestal Networks, Inc
+0x000C55, Microlink Communications Inc.
+0x000C56, Megatel Computer (1986) Corp.
+0x000C57, MACKIE Engineering Services Belgium BVBA
+0x000C58, M&S Systems
+0x000C59, Indyme Electronics, Inc.
+0x000C5A, IBSmm Industrieelektronik Multimedia
+0x000C5B, HANWANG TECHNOLOGY CO.,LTD
+0x000C5C, GTN Systems B.V.
+0x000C5D, CHIC TECHNOLOGY (CHINA) CORP.
+0x000C5E, Calypso Medical
+0x000C5F, Avtec, Inc.
+0x000C60, ACM Systems
+0x000C61, AC Tech corporation DBA Advanced Digital
+0x000C62, ABB AB, Cewe-Control
+0x000C63, Zenith Electronics Corporation
+0x000C64, X2 MSA Group
+0x000C65, Sunin Telecom
+0x000C66, Pronto Networks Inc
+0x000C67, OYO ELECTRIC CO.,LTD
+0x000C68, SigmaTel, Inc.
+0x000C69, National Radio Astronomy Observatory
+0x000C6A, MBARI
+0x000C6B, Kurz Industrie-Elektronik GmbH
+0x000C6C, Elgato Systems LLC
+0x000C6D, Edwards Ltd.
+0x000C6E, ASUSTEK COMPUTER INC.
+0x000C6F, Amtek system co.,LTD.
+0x000C70, ACC GmbH
+0x000C71, Wybron, Inc
+0x000C72, Tempearl Industrial Co., Ltd.
+0x000C73, TELSON ELECTRONICS CO., LTD
+0x000C74, RIVERTEC CORPORATION
+0x000C75, Oriental integrated electronics. LTD
+0x000C76, MICRO-STAR INTERNATIONAL CO., LTD.
+0x000C77, Life Racing Ltd
+0x000C78, In-Tech Electronics Limited
+0x000C79, Extel Communications P/L
+0x000C7A, DaTARIUS Technologies GmbH
+0x000C7B, ALPHA PROJECT Co.,Ltd.
+0x000C7C, Internet Information Image Inc.
+0x000C7D, TEIKOKU ELECTRIC MFG. CO., LTD
+0x000C7E, Tellium Incorporated
+0x000C7F, synertronixx GmbH
+0x000C80, Opelcomm Inc.
+0x000C81, Schneider Electric (Australia)
+0x000C82, NETWORK TECHNOLOGIES INC
+0x000C83, Logical Solutions
+0x000C84, Eazix, Inc.
+0x000C85, CISCO SYSTEMS, INC.
+0x000C86, CISCO SYSTEMS, INC.
+0x000C87, AMD
+0x000C88, Apache Micro Peripherals, Inc.
+0x000C89, AC Electric Vehicles, Ltd.
+0x000C8A, Bose Corporation
+0x000C8B, Connect Tech Inc
+0x000C8C, KODICOM CO.,LTD.
+0x000C8D, MATRIX VISION GmbH
+0x000C8E, Mentor Engineering Inc
+0x000C8F, Nergal s.r.l.
+0x000C90, Octasic Inc.
+0x000C91, Riverhead Networks Inc.
+0x000C92, WolfVision Gmbh
+0x000C93, Xeline Co., Ltd.
+0x000C94, United Electronic Industries, Inc. (EUI)
+0x000C95, PrimeNet
+0x000C96, OQO, Inc.
+0x000C97, NV ADB TTV Technologies SA
+0x000C98, LETEK Communications Inc.
+0x000C99, HITEL LINK Co.,Ltd
+0x000C9A, Hitech Electronics Corp.
+0x000C9B, EE Solutions, Inc
+0x000C9C, Chongho information & communications
+0x000C9D, AirWalk Communications, Inc.
+0x000C9E, MemoryLink Corp.
+0x000C9F, NKE Corporation
+0x000CA0, StorCase Technology, Inc.
+0x000CA1, SIGMACOM Co., LTD.
+0x000CA2, Harmonic Video Network
+0x000CA3, Rancho Technology, Inc.
+0x000CA4, Prompttec Product Management GmbH
+0x000CA5, Naman NZ LTd
+0x000CA6, Mintera Corporation
+0x000CA7, Metro (Suzhou) Technologies Co., Ltd.
+0x000CA8, Garuda Networks Corporation
+0x000CA9, Ebtron Inc.
+0x000CAA, Cubic Transportation Systems Inc
+0x000CAB, COMMEND International
+0x000CAC, Citizen Watch Co., Ltd.
+0x000CAD, BTU International
+0x000CAE, Ailocom Oy
+0x000CAF, TRI TERM CO.,LTD.
+0x000CB0, Star Semiconductor Corporation
+0x000CB1, Salland Engineering (Europe) BV
+0x000CB2, Comstar Co., Ltd.
+0x000CB3, ROUND Co.,Ltd.
+0x000CB4, AutoCell Laboratories, Inc.
+0x000CB5, Premier Technolgies, Inc
+0x000CB6, NANJING SEU MOBILE & INTERNET TECHNOLOGY CO.,LTD
+0x000CB7, Nanjing Huazhuo Electronics Co., Ltd.
+0x000CB8, MEDION AG
+0x000CB9, LEA
+0x000CBA, Jamex, Inc.
+0x000CBB, ISKRAEMECO
+0x000CBC, Iscutum
+0x000CBD, Interface Masters, Inc
+0x000CBE, Innominate Security Technologies AG
+0x000CBF, Holy Stone Ent. Co., Ltd.
+0x000CC0, Genera Oy
+0x000CC1, Cooper Industries Inc.
+0x000CC2, ControlNet (India) Private Limited
+0x000CC3, BeWAN systems
+0x000CC4, Tiptel AG
+0x000CC5, Nextlink Co., Ltd.
+0x000CC6, Ka-Ro electronics GmbH
+0x000CC7, Intelligent Computer Solutions Inc.
+0x000CC8, Xytronix Research & Design, Inc.
+0x000CC9, ILWOO DATA & TECHNOLOGY CO.,LTD
+0x000CCA, HGST a Western Digital Company
+0x000CCB, Design Combus Ltd
+0x000CCC, Aeroscout Ltd.
+0x000CCD, IEC - TC57
+0x000CCE, CISCO SYSTEMS, INC.
+0x000CCF, CISCO SYSTEMS, INC.
+0x000CD0, Symetrix
+0x000CD1, SFOM Technology Corp.
+0x000CD2, Schaffner EMV AG
+0x000CD3, Prettl Elektronik Radeberg GmbH
+0x000CD4, Positron Public Safety Systems inc.
+0x000CD5, Passave Inc.
+0x000CD6, PARTNER TECH
+0x000CD7, Nallatech Ltd
+0x000CD8, M. K. Juchheim GmbH & Co
+0x000CD9, Itcare Co., Ltd
+0x000CDA, FreeHand Systems, Inc.
+0x000CDB, Brocade Communications Systems, Inc
+0x000CDC, BECS Technology, Inc
+0x000CDD, AOS Technologies AG
+0x000CDE, ABB STOTZ-KONTAKT GmbH
+0x000CDF, PULNiX America, Inc
+0x000CE0, Trek Diagnostics Inc.
+0x000CE1, The Open Group
+0x000CE2, Rolls-Royce
+0x000CE3, Option International N.V.
+0x000CE4, NeuroCom International, Inc.
+0x000CE5, Motorola Mobility, Inc.
+0x000CE6, Meru Networks Inc
+0x000CE7, MediaTek Inc.
+0x000CE8, GuangZhou AnJuBao Co., Ltd
+0x000CE9, BLOOMBERG L.P.
+0x000CEA, aphona Kommunikationssysteme
+0x000CEB, CNMP Networks, Inc.
+0x000CEC, Spectracom Corp.
+0x000CED, Real Digital Media
+0x000CEE, jp-embedded
+0x000CEF, Open Networks Engineering Ltd
+0x000CF0, M & N GmbH
+0x000CF1, Intel Corporation
+0x000CF2, GAMESA Eólica
+0x000CF3, CALL IMAGE SA
+0x000CF4, AKATSUKI ELECTRIC MFG.CO.,LTD.
+0x000CF5, InfoExpress
+0x000CF6, Sitecom Europe BV
+0x000CF7, Nortel Networks
+0x000CF8, Nortel Networks
+0x000CF9, ITT Flygt AB
+0x000CFA, Digital Systems Corp
+0x000CFB, Korea Network Systems
+0x000CFC, S2io Technologies Corp
+0x000CFD, Hyundai ImageQuest Co.,Ltd.
+0x000CFE, Grand Electronic Co., Ltd
+0x000CFF, MRO-TEK LIMITED
+0x000D00, Seaway Networks Inc.
+0x000D01, P&E Microcomputer Systems, Inc.
+0x000D02, NEC AccessTechnica, Ltd.
+0x000D03, Matrics, Inc.
+0x000D04, Foxboro Eckardt Development GmbH
+0x000D05, cybernet manufacturing inc.
+0x000D06, Compulogic Limited
+0x000D07, Calrec Audio Ltd
+0x000D08, AboveCable, Inc.
+0x000D09, Yuehua(Zhuhai) Electronic CO. LTD
+0x000D0A, Projectiondesign as
+0x000D0B, Buffalo Inc.
+0x000D0C, MDI Security Systems
+0x000D0D, ITSupported, LLC
+0x000D0E, Inqnet Systems, Inc.
+0x000D0F, Finlux Ltd
+0x000D10, Embedtronics Oy
+0x000D11, DENTSPLY - Gendex
+0x000D12, AXELL Corporation
+0x000D13, Wilhelm Rutenbeck GmbH&Co.
+0x000D14, Vtech Innovation LP dba Advanced American Telephones
+0x000D15, Voipac s.r.o.
+0x000D16, UHS Systems Pty Ltd
+0x000D17, Turbo Networks Co.Ltd
+0x000D18, Mega-Trend Electronics CO., LTD.
+0x000D19, ROBE Show lighting
+0x000D1A, Mustek System Inc.
+0x000D1B, Kyoto Electronics Manufacturing Co., Ltd.
+0x000D1C, Amesys Defense
+0x000D1D, HIGH-TEK HARNESS ENT. CO., LTD.
+0x000D1E, Control Techniques
+0x000D1F, AV Digital
+0x000D20, ASAHIKASEI TECHNOSYSTEM CO.,LTD.
+0x000D21, WISCORE Inc.
+0x000D22, Unitronics LTD
+0x000D23, Smart Solution, Inc
+0x000D24, SENTEC E&E CO., LTD.
+0x000D25, SANDEN CORPORATION
+0x000D26, Primagraphics Limited
+0x000D27, MICROPLEX Printware AG
+0x000D28, CISCO SYSTEMS, INC.
+0x000D29, CISCO SYSTEMS, INC.
+0x000D2A, Scanmatic AS
+0x000D2B, Racal Instruments
+0x000D2C, Patapsco Designs Ltd
+0x000D2D, NCT Deutschland GmbH
+0x000D2E, Matsushita Avionics Systems Corporation
+0x000D2F, AIN Comm.Tech.Co., LTD
+0x000D30, IceFyre Semiconductor
+0x000D31, Compellent Technologies, Inc.
+0x000D32, DispenseSource, Inc.
+0x000D33, Prediwave Corp.
+0x000D34, Shell International Exploration and Production, Inc.
+0x000D35, PAC International Ltd
+0x000D36, Wu Han Routon Electronic Co., Ltd
+0x000D37, WIPLUG
+0x000D38, NISSIN INC.
+0x000D39, Network Electronics
+0x000D3A, Microsoft Corp.
+0x000D3B, Microelectronics Technology Inc.
+0x000D3C, i.Tech Dynamic Ltd
+0x000D3D, Hammerhead Systems, Inc.
+0x000D3E, APLUX Communications Ltd.
+0x000D3F, VTI Instruments Corporation
+0x000D40, Verint Loronix Video Solutions
+0x000D41, Siemens AG ICM MP UC RD IT KLF1
+0x000D42, Newbest Development Limited
+0x000D43, DRS Tactical Systems Inc.
+0x000D44, Audio BU - Logitech
+0x000D45, Tottori SANYO Electric Co., Ltd.
+0x000D46, Parker SSD Drives
+0x000D47, Collex
+0x000D48, AEWIN Technologies Co., Ltd.
+0x000D49, Triton Systems of Delaware, Inc.
+0x000D4A, Steag ETA-Optik
+0x000D4B, Roku, LLC
+0x000D4C, Outline Electronics Ltd.
+0x000D4D, Ninelanes
+0x000D4E, NDR Co.,LTD.
+0x000D4F, Kenwood Corporation
+0x000D50, Galazar Networks
+0x000D51, DIVR Systems, Inc.
+0x000D52, Comart system
+0x000D53, Beijing 5w Communication Corp.
+0x000D54, 3Com Ltd
+0x000D55, SANYCOM Technology Co.,Ltd
+0x000D56, Dell ESG PCBA Test
+0x000D57, Fujitsu I-Network Systems Limited.
+0x000D58, PRIVATE
+0x000D59, Amity Systems, Inc.
+0x000D5A, Tiesse SpA
+0x000D5B, Smart Empire Investments Limited
+0x000D5C, Robert Bosch GmbH, VT-ATMO
+0x000D5D, Raritan Computer, Inc
+0x000D5E, NEC Personal Products
+0x000D5F, Minds Inc
+0x000D60, IBM Corp
+0x000D61, Giga-Byte Technology Co., Ltd.
+0x000D62, Funkwerk Dabendorf GmbH
+0x000D63, DENT Instruments, Inc.
+0x000D64, COMAG Handels AG
+0x000D65, CISCO SYSTEMS, INC.
+0x000D66, CISCO SYSTEMS, INC.
+0x000D67, Ericsson
+0x000D68, Vinci Systems, Inc.
+0x000D69, TMT&D Corporation
+0x000D6A, Redwood Technologies LTD
+0x000D6B, Mita-Teknik A/S
+0x000D6C, M-Audio
+0x000D6D, K-Tech Devices Corp.
+0x000D6E, K-Patents Oy
+0x000D6F, Ember Corporation
+0x000D70, Datamax Corporation
+0x000D71, boca systems
+0x000D72, 2Wire, Inc
+0x000D73, Technical Support, Inc.
+0x000D74, Sand Network Systems, Inc.
+0x000D75, Kobian Pte Ltd - Taiwan Branch
+0x000D76, Hokuto Denshi Co,. Ltd.
+0x000D77, FalconStor Software
+0x000D78, Engineering & Security
+0x000D79, Dynamic Solutions Co,.Ltd.
+0x000D7A, DiGATTO Asia Pacific Pte Ltd
+0x000D7B, Consensys Computers Inc.
+0x000D7C, Codian Ltd
+0x000D7D, Afco Systems
+0x000D7E, Axiowave Networks, Inc.
+0x000D7F, MIDAS COMMUNICATION TECHNOLOGIES PTE LTD ( Foreign Branch)
+0x000D80, Online Development Inc
+0x000D81, Pepperl+Fuchs GmbH
+0x000D82, PHS srl
+0x000D83, Sanmina-SCI Hungary Ltd.
+0x000D84, Makus Inc.
+0x000D85, Tapwave, Inc.
+0x000D86, Huber + Suhner AG
+0x000D87, Elitegroup Computer System Co. (ECS)
+0x000D88, D-Link Corporation
+0x000D89, Bils Technology Inc
+0x000D8A, Winners Electronics Co., Ltd.
+0x000D8B, T&D Corporation
+0x000D8C, Shanghai Wedone Digital Ltd. CO.
+0x000D8D, ProLinx Communication Gateways, Inc.
+0x000D8E, Koden Electronics Co., Ltd.
+0x000D8F, King Tsushin Kogyo Co., LTD.
+0x000D90, Factum Electronics AB
+0x000D91, Eclipse (HQ Espana) S.L.
+0x000D92, Arima Communication Corporation
+0x000D93, Apple Computer
+0x000D94, AFAR Communications,Inc
+0x000D95, Opti-cell, Inc.
+0x000D96, Vtera Technology Inc.
+0x000D97, Tropos Networks, Inc.
+0x000D98, S.W.A.C. Schmitt-Walter Automation Consult GmbH
+0x000D99, Orbital Sciences Corp.; Launch Systems Group
+0x000D9A, INFOTEC LTD
+0x000D9B, Heraeus Electro-Nite International N.V.
+0x000D9C, Elan GmbH & Co KG
+0x000D9D, Hewlett-Packard Company
+0x000D9E, TOKUDEN OHIZUMI SEISAKUSYO Co.,Ltd.
+0x000D9F, RF Micro Devices
+0x000DA0, NEDAP N.V.
+0x000DA1, MIRAE ITS Co.,LTD.
+0x000DA2, Infrant Technologies, Inc.
+0x000DA3, Emerging Technologies Limited
+0x000DA4, DOSCH & AMAND SYSTEMS AG
+0x000DA5, Fabric7 Systems, Inc
+0x000DA6, Universal Switching Corporation
+0x000DA7, PRIVATE
+0x000DA8, Teletronics Technology Corporation
+0x000DA9, T.E.A.M. S.L.
+0x000DAA, S.A.Tehnology co.,Ltd.
+0x000DAB, Parker Hannifin GmbH Electromechanical Division Europe
+0x000DAC, Japan CBM Corporation
+0x000DAD, Dataprobe, Inc.
+0x000DAE, SAMSUNG HEAVY INDUSTRIES CO., LTD.
+0x000DAF, Plexus Corp (UK) Ltd
+0x000DB0, Olym-tech Co.,Ltd.
+0x000DB1, Japan Network Service Co., Ltd.
+0x000DB2, Ammasso, Inc.
+0x000DB3, SDO Communication Corperation
+0x000DB4, NETASQ
+0x000DB5, GLOBALSAT TECHNOLOGY CORPORATION
+0x000DB6, Broadcom Corporation
+0x000DB7, SANKO ELECTRIC CO,.LTD
+0x000DB8, SCHILLER AG
+0x000DB9, PC Engines GmbH
+0x000DBA, Océ Document Technologies GmbH
+0x000DBB, Nippon Dentsu Co.,Ltd.
+0x000DBC, CISCO SYSTEMS, INC.
+0x000DBD, CISCO SYSTEMS, INC.
+0x000DBE, Bel Fuse Europe Ltd.,UK
+0x000DBF, TekTone Sound & Signal Mfg., Inc.
+0x000DC0, Spagat AS
+0x000DC1, SafeWeb Inc
+0x000DC2, PRIVATE
+0x000DC3, First Communication, Inc.
+0x000DC4, Emcore Corporation
+0x000DC5, EchoStar Global B.V.
+0x000DC6, DigiRose Technology Co., Ltd.
+0x000DC7, COSMIC ENGINEERING INC.
+0x000DC8, AirMagnet, Inc
+0x000DC9, THALES Elektronik Systeme GmbH
+0x000DCA, Tait Electronics
+0x000DCB, Petcomkorea Co., Ltd.
+0x000DCC, NEOSMART Corp.
+0x000DCD, GROUPE TXCOM
+0x000DCE, Dynavac Technology Pte Ltd
+0x000DCF, Cidra Corp.
+0x000DD0, TetraTec Instruments GmbH
+0x000DD1, Stryker Corporation
+0x000DD2, Simrad Optronics ASA
+0x000DD3, SAMWOO Telecommunication Co.,Ltd.
+0x000DD4, Symantec Corporation
+0x000DD5, O'RITE TECHNOLOGY CO.,LTD
+0x000DD6, ITI LTD
+0x000DD7, Bright
+0x000DD8, BBN
+0x000DD9, Anton Paar GmbH
+0x000DDA, ALLIED TELESIS K.K.
+0x000DDB, AIRWAVE TECHNOLOGIES INC.
+0x000DDC, VAC
+0x000DDD, Profilo Telra Elektronik Sanayi ve Ticaret. A.Ş
+0x000DDE, Joyteck Co., Ltd.
+0x000DDF, Japan Image & Network Inc.
+0x000DE0, ICPDAS Co.,LTD
+0x000DE1, Control Products, Inc.
+0x000DE2, CMZ Sistemi Elettronici
+0x000DE3, AT Sweden AB
+0x000DE4, DIGINICS, Inc.
+0x000DE5, Samsung Thales
+0x000DE6, YOUNGBO ENGINEERING CO.,LTD
+0x000DE7, Snap-on OEM Group
+0x000DE8, Nasaco Electronics Pte. Ltd
+0x000DE9, Napatech Aps
+0x000DEA, Kingtel Telecommunication Corp.
+0x000DEB, CompXs Limited
+0x000DEC, CISCO SYSTEMS, INC.
+0x000DED, CISCO SYSTEMS, INC.
+0x000DEE, Andrew RF Power Amplifier Group
+0x000DEF, Soc. Coop. Bilanciai
+0x000DF0, QCOM TECHNOLOGY INC.
+0x000DF1, IONIX INC.
+0x000DF2, PRIVATE
+0x000DF3, Asmax Solutions
+0x000DF4, Watertek Co.
+0x000DF5, Teletronics International Inc.
+0x000DF6, Technology Thesaurus Corp.
+0x000DF7, Space Dynamics Lab
+0x000DF8, ORGA Kartensysteme GmbH
+0x000DF9, NDS Limited
+0x000DFA, Micro Control Systems Ltd.
+0x000DFB, Komax AG
+0x000DFC, ITFOR Inc.
+0x000DFD, Huges Hi-Tech Inc.,
+0x000DFE, Hauppauge Computer Works, Inc.
+0x000DFF, CHENMING MOLD INDUSTRY CORP.
+0x000E00, Atrie
+0x000E01, ASIP Technologies Inc.
+0x000E02, Advantech AMT Inc.
+0x000E03, Emulex
+0x000E04, CMA/Microdialysis AB
+0x000E05, WIRELESS MATRIX CORP.
+0x000E06, Team Simoco Ltd
+0x000E07, Sony Ericsson Mobile Communications AB
+0x000E08, Cisco Linksys LLC
+0x000E09, Shenzhen Coship Software Co.,LTD.
+0x000E0A, SAKUMA DESIGN OFFICE
+0x000E0B, Netac Technology Co., Ltd.
+0x000E0C, Intel Corporation
+0x000E0D, Hesch Schröder GmbH
+0x000E0E, ESA elettronica S.P.A.
+0x000E0F, ERMME
+0x000E10, C-guys, Inc.
+0x000E11, BDT Büro und Datentechnik GmbH & Co.KG
+0x000E12, Adaptive Micro Systems Inc.
+0x000E13, Accu-Sort Systems inc.
+0x000E14, Visionary Solutions, Inc.
+0x000E15, Tadlys LTD
+0x000E16, SouthWing S.L.
+0x000E17, PRIVATE
+0x000E18, MyA Technology
+0x000E19, LogicaCMG Pty Ltd
+0x000E1A, JPS Communications
+0x000E1B, IAV GmbH
+0x000E1C, Hach Company
+0x000E1D, ARION Technology Inc.
+0x000E1E, QLogic Corporation
+0x000E1F, TCL Networks Equipment Co., Ltd.
+0x000E20, ACCESS Systems Americas, Inc.
+0x000E21, MTU Friedrichshafen GmbH
+0x000E22, PRIVATE
+0x000E23, Incipient, Inc.
+0x000E24, Huwell Technology Inc.
+0x000E25, Hannae Technology Co., Ltd
+0x000E26, Gincom Technology Corp.
+0x000E27, Crere Networks, Inc.
+0x000E28, Dynamic Ratings P/L
+0x000E29, Shester Communications Inc
+0x000E2A, PRIVATE
+0x000E2B, Safari Technologies
+0x000E2C, Netcodec co.
+0x000E2D, Hyundai Digital Technology Co.,Ltd.
+0x000E2E, Edimax Technology Co., Ltd.
+0x000E2F, Disetronic Medical Systems AG
+0x000E30, AERAS Networks, Inc.
+0x000E31, Olympus Soft Imaging Solutions GmbH
+0x000E32, Kontron Medical
+0x000E33, Shuko Electronics Co.,Ltd
+0x000E34, NexGen City, LP
+0x000E35, Intel Corp
+0x000E36, HEINESYS, Inc.
+0x000E37, Harms & Wende GmbH & Co.KG
+0x000E38, CISCO SYSTEMS, INC.
+0x000E39, CISCO SYSTEMS, INC.
+0x000E3A, Cirrus Logic
+0x000E3B, Hawking Technologies, Inc.
+0x000E3C, Transact Technologies Inc
+0x000E3D, Televic N.V.
+0x000E3E, Sun Optronics Inc
+0x000E3F, Soronti, Inc.
+0x000E40, Nortel Networks
+0x000E41, NIHON MECHATRONICS CO.,LTD.
+0x000E42, Motic Incoporation Ltd.
+0x000E43, G-Tek Electronics Sdn. Bhd.
+0x000E44, Digital 5, Inc.
+0x000E45, Beijing Newtry Electronic Technology Ltd
+0x000E46, Niigata Seimitsu Co.,Ltd.
+0x000E47, NCI System Co.,Ltd.
+0x000E48, Lipman TransAction Solutions
+0x000E49, Forsway Scandinavia AB
+0x000E4A, Changchun Huayu WEBPAD Co.,LTD
+0x000E4B, atrium c and i
+0x000E4C, Bermai Inc.
+0x000E4D, Numesa Inc.
+0x000E4E, Waveplus Technology Co., Ltd.
+0x000E4F, Trajet GmbH
+0x000E50, Thomson Telecom Belgium
+0x000E51, tecna elettronica srl
+0x000E52, Optium Corporation
+0x000E53, AV TECH CORPORATION
+0x000E54, AlphaCell Wireless Ltd.
+0x000E55, AUVITRAN
+0x000E56, 4G Systems GmbH & Co. KG
+0x000E57, Iworld Networking, Inc.
+0x000E58, Sonos, Inc.
+0x000E59, SAGEM SA
+0x000E5A, TELEFIELD inc.
+0x000E5B, ParkerVision - Direct2Data
+0x000E5C, Motorola Mobility, Inc.
+0x000E5D, Triple Play Technologies A/S
+0x000E5E, Raisecom Technology
+0x000E5F, activ-net GmbH & Co. KG
+0x000E60, 360SUN Digital Broadband Corporation
+0x000E61, MICROTROL LIMITED
+0x000E62, Nortel Networks
+0x000E63, Lemke Diagnostics GmbH
+0x000E64, Elphel, Inc
+0x000E65, TransCore
+0x000E66, Hitachi Advanced Digital, Inc.
+0x000E67, Eltis Microelectronics Ltd.
+0x000E68, E-TOP Network Technology Inc.
+0x000E69, China Electric Power Research Institute
+0x000E6A, 3Com Ltd
+0x000E6B, Janitza electronics GmbH
+0x000E6C, Device Drivers Limited
+0x000E6D, Murata Manufacturing Co., Ltd.
+0x000E6E, MICRELEC ELECTRONICS S.A
+0x000E6F, IRIS Corporation Berhad
+0x000E70, in2 Networks
+0x000E71, Gemstar Technology Development Ltd.
+0x000E72, CTS electronics
+0x000E73, Tpack A/S
+0x000E74, Solar Telecom. Tech
+0x000E75, New York Air Brake Corp.
+0x000E76, GEMSOC INNOVISION INC.
+0x000E77, Decru, Inc.
+0x000E78, Amtelco
+0x000E79, Ample Communications Inc.
+0x000E7A, GemWon Communications Co., Ltd.
+0x000E7B, Toshiba
+0x000E7C, Televes S.A.
+0x000E7D, Electronics Line 3000 Ltd.
+0x000E7E, ionSign Oy
+0x000E7F, Hewlett-Packard Company
+0x000E80, Thomson Technology Inc
+0x000E81, Devicescape Software, Inc.
+0x000E82, Commtech Wireless
+0x000E83, CISCO SYSTEMS, INC.
+0x000E84, CISCO SYSTEMS, INC.
+0x000E85, Catalyst Enterprises, Inc.
+0x000E86, Alcatel North America
+0x000E87, adp Gauselmann GmbH
+0x000E88, VIDEOTRON CORP.
+0x000E89, CLEMATIC
+0x000E8A, Avara Technologies Pty. Ltd.
+0x000E8B, Astarte Technology Co, Ltd.
+0x000E8C, Siemens AG A&D ET
+0x000E8D, Systems in Progress Holding GmbH
+0x000E8E, SparkLAN Communications, Inc.
+0x000E8F, Sercomm Corp.
+0x000E90, PONICO CORP.
+0x000E91, Navico Auckland Ltd
+0x000E92, Millinet Co., Ltd.
+0x000E93, Milénio 3 Sistemas Electrónicos, Lda.
+0x000E94, Maas International BV
+0x000E95, Fujiya Denki Seisakusho Co.,Ltd.
+0x000E96, Cubic Defense Applications, Inc.
+0x000E97, Ultracker Technology CO., Inc
+0x000E98, HME Clear-Com LTD.
+0x000E99, Spectrum Digital, Inc
+0x000E9A, BOE TECHNOLOGY GROUP CO.,LTD
+0x000E9B, Ambit Microsystems Corporation
+0x000E9C, Pemstar
+0x000E9D, Tiscali UK Ltd
+0x000E9E, Topfield Co., Ltd
+0x000E9F, TEMIC SDS GmbH
+0x000EA0, NetKlass Technology Inc.
+0x000EA1, Formosa Teletek Corporation
+0x000EA2, McAfee, Inc
+0x000EA3, CNCR-IT CO.,LTD,HangZhou P.R.CHINA
+0x000EA4, Certance Inc.
+0x000EA5, BLIP Systems
+0x000EA6, ASUSTEK COMPUTER INC.
+0x000EA7, Endace Technology
+0x000EA8, United Technologists Europe Limited
+0x000EA9, Shanghai Xun Shi Communications Equipment Ltd. Co.
+0x000EAA, Scalent Systems, Inc.
+0x000EAB, Cray Inc
+0x000EAC, MINTRON ENTERPRISE CO., LTD.
+0x000EAD, Metanoia Technologies, Inc.
+0x000EAE, GAWELL TECHNOLOGIES CORP.
+0x000EAF, CASTEL
+0x000EB0, Solutions Radio BV
+0x000EB1, Newcotech,Ltd
+0x000EB2, Micro-Research Finland Oy
+0x000EB3, Hewlett-Packard
+0x000EB4, GUANGZHOU GAOKE COMMUNICATIONS TECHNOLOGY CO.LTD.
+0x000EB5, Ecastle Electronics Co., Ltd.
+0x000EB6, Riverbed Technology, Inc.
+0x000EB7, Knovative, Inc.
+0x000EB8, Iiga co.,Ltd
+0x000EB9, HASHIMOTO Electronics Industry Co.,Ltd.
+0x000EBA, HANMI SEMICONDUCTOR CO., LTD.
+0x000EBB, Everbee Networks
+0x000EBC, Paragon Fidelity GmbH
+0x000EBD, Burdick, a Quinton Compny
+0x000EBE, B&B Electronics Manufacturing Co.
+0x000EBF, Remsdaq Limited
+0x000EC0, Nortel Networks
+0x000EC1, MYNAH Technologies
+0x000EC2, Lowrance Electronics, Inc.
+0x000EC3, Logic Controls, Inc.
+0x000EC4, Iskra Transmission d.d.
+0x000EC5, Digital Multitools Inc
+0x000EC6, ASIX ELECTRONICS CORP.
+0x000EC7, Motorola Korea
+0x000EC8, Zoran Corporation
+0x000EC9, YOKO Technology Corp.
+0x000ECA, WTSS Inc
+0x000ECB, VineSys Technology
+0x000ECC, Tableau, LLC
+0x000ECD, SKOV A/S
+0x000ECE, S.I.T.T.I. S.p.A.
+0x000ECF, PROFIBUS Nutzerorganisation e.V.
+0x000ED0, Privaris, Inc.
+0x000ED1, Osaka Micro Computer.
+0x000ED2, Filtronic plc
+0x000ED3, Epicenter, Inc.
+0x000ED4, CRESITT INDUSTRIE
+0x000ED5, COPAN Systems Inc.
+0x000ED6, CISCO SYSTEMS, INC.
+0x000ED7, CISCO SYSTEMS, INC.
+0x000ED8, Aktino, Inc.
+0x000ED9, Aksys, Ltd.
+0x000EDA, C-TECH UNITED CORP.
+0x000EDB, XiNCOM Corp.
+0x000EDC, Tellion INC.
+0x000EDD, SHURE INCORPORATED
+0x000EDE, REMEC, Inc.
+0x000EDF, PLX Technology
+0x000EE0, Mcharge
+0x000EE1, ExtremeSpeed Inc.
+0x000EE2, Custom Engineering S.p.A.
+0x000EE3, Chiyu Technology Co.,Ltd
+0x000EE4, BOE TECHNOLOGY GROUP CO.,LTD
+0x000EE5, bitWallet, Inc.
+0x000EE6, Adimos Systems LTD
+0x000EE7, AAC ELECTRONICS CORP.
+0x000EE8, zioncom
+0x000EE9, WayTech Development, Inc.
+0x000EEA, Shadong Luneng Jicheng Electronics,Co.,Ltd
+0x000EEB, Sandmartin(zhong shan)Electronics Co.,Ltd
+0x000EEC, Orban
+0x000EED, Nokia Danmark A/S
+0x000EEE, Muco Industrie BV
+0x000EEF, PRIVATE
+0x000EF0, Festo AG & Co. KG
+0x000EF1, EZQUEST INC.
+0x000EF2, Infinico Corporation
+0x000EF3, Smarthome
+0x000EF4, Kasda Digital Technology Co.,Ltd
+0x000EF5, iPAC Technology Co., Ltd.
+0x000EF6, E-TEN Information Systems Co., Ltd.
+0x000EF7, Vulcan Portals Inc
+0x000EF8, SBC ASI
+0x000EF9, REA Elektronik GmbH
+0x000EFA, Optoway Technology Incorporation
+0x000EFB, Macey Enterprises
+0x000EFC, JTAG Technologies B.V.
+0x000EFD, FUJINON CORPORATION
+0x000EFE, EndRun Technologies LLC
+0x000EFF, Megasolution,Inc.
+0x000F00, Legra Systems, Inc.
+0x000F01, DIGITALKS INC
+0x000F02, Digicube Technology Co., Ltd
+0x000F03, COM&C CO., LTD
+0x000F04, cim-usa inc
+0x000F05, 3B SYSTEM INC.
+0x000F06, Nortel Networks
+0x000F07, Mangrove Systems, Inc.
+0x000F08, Indagon Oy
+0x000F09, PRIVATE
+0x000F0A, Clear Edge Networks
+0x000F0B, Kentima Technologies AB
+0x000F0C, SYNCHRONIC ENGINEERING
+0x000F0D, Hunt Electronic Co., Ltd.
+0x000F0E, WaveSplitter Technologies, Inc.
+0x000F0F, Real ID Technology Co., Ltd.
+0x000F10, RDM Corporation
+0x000F11, Prodrive B.V.
+0x000F12, Panasonic Europe Ltd.
+0x000F13, Nisca corporation
+0x000F14, Mindray Co., Ltd.
+0x000F15, Kjaerulff1 A/S
+0x000F16, JAY HOW TECHNOLOGY CO.,
+0x000F17, Insta Elektro GmbH
+0x000F18, Industrial Control Systems
+0x000F19, Boston Scientific
+0x000F1A, Gaming Support B.V.
+0x000F1B, Ego Systems Inc.
+0x000F1C, DigitAll World Co., Ltd
+0x000F1D, Cosmo Techs Co., Ltd.
+0x000F1E, Chengdu KT Electric Co.of High & New Technology
+0x000F1F, Dell ESG PCBA Test
+0x000F20, Hewlett-Packard Company
+0x000F21, Scientific Atlanta, Inc
+0x000F22, Helius, Inc.
+0x000F23, CISCO SYSTEMS, INC.
+0x000F24, CISCO SYSTEMS, INC.
+0x000F25, AimValley B.V.
+0x000F26, WorldAccxx LLC
+0x000F27, TEAL Electronics, Inc.
+0x000F28, Itronix Corporation
+0x000F29, Augmentix Corporation
+0x000F2A, Cableware Electronics
+0x000F2B, GREENBELL SYSTEMS
+0x000F2C, Uplogix, Inc.
+0x000F2D, CHUNG-HSIN ELECTRIC & MACHINERY MFG.CORP.
+0x000F2E, Megapower International Corp.
+0x000F2F, W-LINX TECHNOLOGY CO., LTD.
+0x000F30, Raza Microelectronics Inc
+0x000F31, Allied Vision Technologies Canada Inc
+0x000F32, Lootom Optoelectronic Technology (Wuxi) Co Ltd
+0x000F33, DUALi Inc.
+0x000F34, CISCO SYSTEMS, INC.
+0x000F35, CISCO SYSTEMS, INC.
+0x000F36, Accurate Techhnologies, Inc.
+0x000F37, Xambala Incorporated
+0x000F38, Netstar
+0x000F39, IRIS SENSORS
+0x000F3A, HISHARP
+0x000F3B, Fuji System Machines Co., Ltd.
+0x000F3C, Endeleo Limited
+0x000F3D, D-Link Corporation
+0x000F3E, CardioNet, Inc
+0x000F3F, Big Bear Networks
+0x000F40, Optical Internetworking Forum
+0x000F41, Zipher Ltd
+0x000F42, Xalyo Systems
+0x000F43, Wasabi Systems Inc.
+0x000F44, Tivella Inc.
+0x000F45, Stretch, Inc.
+0x000F46, SINAR AG
+0x000F47, ROBOX SPA
+0x000F48, Polypix Inc.
+0x000F49, Northover Solutions Limited
+0x000F4A, Kyushu-kyohan co.,ltd
+0x000F4B, Oracle Corporation
+0x000F4C, Elextech INC
+0x000F4D, TalkSwitch
+0x000F4E, Cellink
+0x000F4F, Cadmus Technology Ltd
+0x000F50, StreamScale Limited
+0x000F51, Azul Systems, Inc.
+0x000F52, YORK Refrigeration, Marine & Controls
+0x000F53, Solarflare Communications Inc
+0x000F54, Entrelogic Corporation
+0x000F55, Datawire Communication Networks Inc.
+0x000F56, Continuum Photonics Inc
+0x000F57, CABLELOGIC Co., Ltd.
+0x000F58, Adder Technology Limited
+0x000F59, Phonak Communications AG
+0x000F5A, Peribit Networks
+0x000F5B, Delta Information Systems, Inc.
+0x000F5C, Day One Digital Media Limited
+0x000F5D, PacketFront International AB
+0x000F5E, Veo
+0x000F5F, Nicety Technologies Inc. (NTS)
+0x000F60, Lifetron Co.,Ltd
+0x000F61, Hewlett-Packard Company
+0x000F62, Alcatel Bell Space N.V.
+0x000F63, Obzerv Technologies
+0x000F64, D&R Electronica Weesp BV
+0x000F65, icube Corp.
+0x000F66, Cisco-Linksys
+0x000F67, West Instruments
+0x000F68, Vavic Network Technology, Inc.
+0x000F69, SEW Eurodrive GmbH & Co. KG
+0x000F6A, Nortel Networks
+0x000F6B, GateWare Communications GmbH
+0x000F6C, ADDI-DATA GmbH
+0x000F6D, Midas Engineering
+0x000F6E, BBox
+0x000F6F, FTA Communication Technologies
+0x000F70, Wintec Industries, inc.
+0x000F71, Sanmei Electronics Co.,Ltd
+0x000F72, Sandburst
+0x000F73, RS Automation Co., Ltd
+0x000F74, Qamcom Technology AB
+0x000F75, First Silicon Solutions
+0x000F76, Digital Keystone, Inc.
+0x000F77, DENTUM CO.,LTD
+0x000F78, Datacap Systems Inc
+0x000F79, Bluetooth Interest Group Inc.
+0x000F7A, BeiJing NuQX Technology CO.,LTD
+0x000F7B, Arce Sistemas, S.A.
+0x000F7C, ACTi Corporation
+0x000F7D, Xirrus
+0x000F7E, Ablerex Electronics Co., LTD
+0x000F7F, UBSTORAGE Co.,Ltd.
+0x000F80, Trinity Security Systems,Inc.
+0x000F81, Secure Info Imaging
+0x000F82, Mortara Instrument, Inc.
+0x000F83, Brainium Technologies Inc.
+0x000F84, Astute Networks, Inc.
+0x000F85, ADDO-Japan Corporation
+0x000F86, Research In Motion Limited
+0x000F87, Maxcess International
+0x000F88, AMETEK, Inc.
+0x000F89, Winnertec System Co., Ltd.
+0x000F8A, WideView
+0x000F8B, Orion MultiSystems Inc
+0x000F8C, Gigawavetech Pte Ltd
+0x000F8D, FAST TV-Server AG
+0x000F8E, DONGYANG TELECOM CO.,LTD.
+0x000F8F, CISCO SYSTEMS, INC.
+0x000F90, CISCO SYSTEMS, INC.
+0x000F91, Aerotelecom Co.,Ltd.
+0x000F92, Microhard Systems Inc.
+0x000F93, Landis+Gyr Ltd.
+0x000F94, Genexis
+0x000F95, ELECOM Co.,LTD Laneed Division
+0x000F96, Telco Systems, Inc.
+0x000F97, Avanex Corporation
+0x000F98, Avamax Co. Ltd.
+0x000F99, APAC opto Electronics Inc.
+0x000F9A, Synchrony, Inc.
+0x000F9B, Ross Video Limited
+0x000F9C, Panduit Corp
+0x000F9D, DisplayLink (UK) Ltd
+0x000F9E, Murrelektronik GmbH
+0x000F9F, Motorola Mobility, Inc.
+0x000FA0, CANON KOREA BUSINESS SOLUTIONS INC.
+0x000FA1, Gigabit Systems Inc.
+0x000FA2, Digital Path Networks
+0x000FA3, Alpha Networks Inc.
+0x000FA4, Sprecher Automation GmbH
+0x000FA5, BWA Technology GmbH
+0x000FA6, S2 Security Corporation
+0x000FA7, Raptor Networks Technology
+0x000FA8, Photometrics, Inc.
+0x000FA9, PC Fabrik
+0x000FAA, Nexus Technologies
+0x000FAB, Kyushu Electronics Systems Inc.
+0x000FAC, IEEE 802.11
+0x000FAD, FMN communications GmbH
+0x000FAE, E2O Communications
+0x000FAF, Dialog Inc.
+0x000FB0, Compal Electronics,INC.
+0x000FB1, Cognio Inc.
+0x000FB2, Broadband Pacenet (India) Pvt. Ltd.
+0x000FB3, Actiontec Electronics, Inc
+0x000FB4, Timespace Technology
+0x000FB5, NETGEAR Inc
+0x000FB6, Europlex Technologies
+0x000FB7, Cavium Networks
+0x000FB8, CallURL Inc.
+0x000FB9, Adaptive Instruments
+0x000FBA, Tevebox AB
+0x000FBB, Nokia Siemens Networks GmbH & Co. KG
+0x000FBC, Onkey Technologies, Inc.
+0x000FBD, MRV Communications (Networks) LTD
+0x000FBE, e-w/you Inc.
+0x000FBF, DGT Sp. z o.o.
+0x000FC0, DELCOMp
+0x000FC1, WAVE Corporation
+0x000FC2, Uniwell Corporation
+0x000FC3, PalmPalm Technology, Inc.
+0x000FC4, NST co.,LTD.
+0x000FC5, KeyMed Ltd
+0x000FC6, Eurocom Industries A/S
+0x000FC7, Dionica R&D Ltd.
+0x000FC8, Chantry Networks
+0x000FC9, Allnet GmbH
+0x000FCA, A-JIN TECHLINE CO, LTD
+0x000FCB, 3Com Ltd
+0x000FCC, Netopia, Inc.
+0x000FCD, Nortel Networks
+0x000FCE, Kikusui Electronics Corp.
+0x000FCF, Datawind Research
+0x000FD0, ASTRI
+0x000FD1, Applied Wireless Identifications Group, Inc.
+0x000FD2, EWA Technologies, Inc.
+0x000FD3, Digium
+0x000FD4, Soundcraft
+0x000FD5, Schwechat - RISE
+0x000FD6, Sarotech Co., Ltd
+0x000FD7, Harman Music Group
+0x000FD8, Force, Inc.
+0x000FD9, FlexDSL Telecommunications AG
+0x000FDA, YAZAKI CORPORATION
+0x000FDB, Westell Technologies
+0x000FDC, Ueda Japan Radio Co., Ltd.
+0x000FDD, SORDIN AB
+0x000FDE, Sony Ericsson Mobile Communications AB
+0x000FDF, SOLOMON Technology Corp.
+0x000FE0, NComputing Co.,Ltd.
+0x000FE1, ID DIGITAL CORPORATION
+0x000FE2, Hangzhou H3C Technologies Co., Ltd.
+0x000FE3, Damm Cellular Systems A/S
+0x000FE4, Pantech Co.,Ltd
+0x000FE5, MERCURY SECURITY CORPORATION
+0x000FE6, MBTech Systems, Inc.
+0x000FE7, Lutron Electronics Co., Inc.
+0x000FE8, Lobos, Inc.
+0x000FE9, GW TECHNOLOGIES CO.,LTD.
+0x000FEA, Giga-Byte Technology Co.,LTD.
+0x000FEB, Cylon Controls
+0x000FEC, ARKUS Inc.
+0x000FED, Anam Electronics Co., Ltd
+0x000FEE, XTec, Incorporated
+0x000FEF, Thales e-Transactions GmbH
+0x000FF0, Sunray Co. Ltd.
+0x000FF1, nex-G Systems Pte.Ltd
+0x000FF2, Loud Technologies Inc.
+0x000FF3, Jung Myoung Communications&Technology
+0x000FF4, Guntermann & Drunck GmbH
+0x000FF5, GN&S company
+0x000FF6, Darfon Electronics Corp.
+0x000FF7, CISCO SYSTEMS, INC.
+0x000FF8, CISCO SYSTEMS, INC.
+0x000FF9, Valcretec, Inc.
+0x000FFA, Optinel Systems, Inc.
+0x000FFB, Nippon Denso Industry Co., Ltd.
+0x000FFC, Merit Li-Lin Ent.
+0x000FFD, Glorytek Network Inc.
+0x000FFE, G-PRO COMPUTER
+0x000FFF, Control4
+0x001000, CABLE TELEVISION LABORATORIES, INC.
+0x001001, Citel
+0x001002, ACTIA
+0x001003, IMATRON, INC.
+0x001004, THE BRANTLEY COILE COMPANY,INC
+0x001005, UEC COMMERCIAL
+0x001006, Thales Contact Solutions Ltd.
+0x001007, CISCO SYSTEMS, INC.
+0x001008, VIENNA SYSTEMS CORPORATION
+0x001009, HORO QUARTZ
+0x00100A, WILLIAMS COMMUNICATIONS GROUP
+0x00100B, CISCO SYSTEMS, INC.
+0x00100C, ITO CO., LTD.
+0x00100D, CISCO SYSTEMS, INC.
+0x00100E, MICRO LINEAR COPORATION
+0x00100F, INDUSTRIAL CPU SYSTEMS
+0x001010, INITIO CORPORATION
+0x001011, CISCO SYSTEMS, INC.
+0x001012, PROCESSOR SYSTEMS (I) PVT LTD
+0x001013, Kontron America, Inc.
+0x001014, CISCO SYSTEMS, INC.
+0x001015, OOmon Inc.
+0x001016, T.SQWARE
+0x001017, Bosch Access Systems GmbH
+0x001018, BROADCOM CORPORATION
+0x001019, SIRONA DENTAL SYSTEMS GmbH & Co. KG
+0x00101A, PictureTel Corp.
+0x00101B, CORNET TECHNOLOGY, INC.
+0x00101C, OHM TECHNOLOGIES INTL, LLC
+0x00101D, WINBOND ELECTRONICS CORP.
+0x00101E, MATSUSHITA ELECTRONIC INSTRUMENTS CORP.
+0x00101F, CISCO SYSTEMS, INC.
+0x001020, Hand Held Products Inc
+0x001021, ENCANTO NETWORKS, INC.
+0x001022, SatCom Media Corporation
+0x001023, Network Equipment Technologies
+0x001024, NAGOYA ELECTRIC WORKS CO., LTD
+0x001025, Grayhill, Inc
+0x001026, ACCELERATED NETWORKS, INC.
+0x001027, L-3 COMMUNICATIONS EAST
+0x001028, COMPUTER TECHNICA, INC.
+0x001029, CISCO SYSTEMS, INC.
+0x00102A, ZF MICROSYSTEMS, INC.
+0x00102B, UMAX DATA SYSTEMS, INC.
+0x00102C, Lasat Networks A/S
+0x00102D, HITACHI SOFTWARE ENGINEERING
+0x00102E, NETWORK SYSTEMS & TECHNOLOGIES PVT. LTD.
+0x00102F, CISCO SYSTEMS, INC.
+0x001030, EION Inc.
+0x001031, OBJECTIVE COMMUNICATIONS, INC.
+0x001032, ALTA TECHNOLOGY
+0x001033, ACCESSLAN COMMUNICATIONS, INC.
+0x001034, GNP Computers
+0x001035, ELITEGROUP COMPUTER SYSTEMS CO., LTD
+0x001036, INTER-TEL INTEGRATED SYSTEMS
+0x001037, CYQ've Technology Co., Ltd.
+0x001038, MICRO RESEARCH INSTITUTE, INC.
+0x001039, Vectron Systems AG
+0x00103A, DIAMOND NETWORK TECH
+0x00103B, HIPPI NETWORKING FORUM
+0x00103C, IC ENSEMBLE, INC.
+0x00103D, PHASECOM, LTD.
+0x00103E, NETSCHOOLS CORPORATION
+0x00103F, TOLLGRADE COMMUNICATIONS, INC.
+0x001040, INTERMEC CORPORATION
+0x001041, BRISTOL BABCOCK, INC.
+0x001042, Alacritech, Inc.
+0x001043, A2 CORPORATION
+0x001044, InnoLabs Corporation
+0x001045, Nortel Networks
+0x001046, ALCORN MCBRIDE INC.
+0x001047, ECHO ELETRIC CO. LTD.
+0x001048, HTRC AUTOMATION, INC.
+0x001049, ShoreTel, Inc
+0x00104A, The Parvus Corporation
+0x00104B, 3COM CORPORATION
+0x00104C, LeCroy Corporation
+0x00104D, SURTEC INDUSTRIES, INC.
+0x00104E, CEOLOGIC
+0x00104F, Oracle Corporation
+0x001050, RION CO., LTD.
+0x001051, CMICRO CORPORATION
+0x001052, METTLER-TOLEDO (ALBSTADT) GMBH
+0x001053, COMPUTER TECHNOLOGY CORP.
+0x001054, CISCO SYSTEMS, INC.
+0x001055, FUJITSU MICROELECTRONICS, INC.
+0x001056, SODICK CO., LTD.
+0x001057, Rebel.com, Inc.
+0x001058, ArrowPoint Communications
+0x001059, DIABLO RESEARCH CO. LLC
+0x00105A, 3COM CORPORATION
+0x00105B, NET INSIGHT AB
+0x00105C, QUANTUM DESIGNS (H.K.) LTD.
+0x00105D, Draeger Medical
+0x00105E, HEKIMIAN LABORATORIES, INC.
+0x00105F, ZODIAC DATA SYSTEMS
+0x001060, BILLIONTON SYSTEMS, INC.
+0x001061, HOSTLINK CORP.
+0x001062, NX SERVER, ILNC.
+0x001063, STARGUIDE DIGITAL NETWORKS
+0x001064, DNPG, LLC
+0x001065, RADYNE CORPORATION
+0x001066, ADVANCED CONTROL SYSTEMS, INC.
+0x001067, Ericsson
+0x001068, COMOS TELECOM
+0x001069, HELIOSS COMMUNICATIONS, INC.
+0x00106A, DIGITAL MICROWAVE CORPORATION
+0x00106B, SONUS NETWORKS, INC.
+0x00106C, Infratec AG
+0x00106D, Axxcelera Broadband Wireless
+0x00106E, TADIRAN COM. LTD.
+0x00106F, TRENTON TECHNOLOGY INC.
+0x001070, CARADON TREND LTD.
+0x001071, ADVANET INC.
+0x001072, GVN TECHNOLOGIES, INC.
+0x001073, Technobox, Inc.
+0x001074, ATEN INTERNATIONAL CO., LTD.
+0x001075, Maxtor Corporation
+0x001076, EUREM GmbH
+0x001077, SAF DRIVE SYSTEMS, LTD.
+0x001078, NUERA COMMUNICATIONS, INC.
+0x001079, CISCO SYSTEMS, INC.
+0x00107A, AmbiCom, Inc.
+0x00107B, CISCO SYSTEMS, INC.
+0x00107C, P-COM, INC.
+0x00107D, AURORA COMMUNICATIONS, LTD.
+0x00107E, BACHMANN ELECTRONIC GmbH
+0x00107F, CRESTRON ELECTRONICS, INC.
+0x001080, METAWAVE COMMUNICATIONS
+0x001081, DPS, INC.
+0x001082, JNA TELECOMMUNICATIONS LIMITED
+0x001083, HEWLETT-PACKARD COMPANY
+0x001084, K-BOT COMMUNICATIONS
+0x001085, POLARIS COMMUNICATIONS, INC.
+0x001086, ATTO Technology, Inc.
+0x001087, Xstreamis PLC
+0x001088, AMERICAN NETWORKS INC.
+0x001089, WebSonic
+0x00108A, TeraLogic, Inc.
+0x00108B, LASERANIMATION SOLLINGER GmbH
+0x00108C, FUJITSU TELECOMMUNICATIONS EUROPE, LTD.
+0x00108D, Johnson Controls, Inc.
+0x00108E, HUGH SYMONS CONCEPT Technologies Ltd.
+0x00108F, RAPTOR SYSTEMS
+0x001090, CIMETRICS, INC.
+0x001091, NO WIRES NEEDED BV
+0x001092, NETCORE INC.
+0x001093, CMS COMPUTERS, LTD.
+0x001094, Performance Analysis Broadband, Spirent plc
+0x001095, Thomson Inc.
+0x001096, TRACEWELL SYSTEMS, INC.
+0x001097, WinNet Metropolitan Communications Systems, Inc.
+0x001098, STARNET TECHNOLOGIES, INC.
+0x001099, InnoMedia, Inc.
+0x00109A, NETLINE
+0x00109B, Emulex Corporation
+0x00109C, M-SYSTEM CO., LTD.
+0x00109D, CLARINET SYSTEMS, INC.
+0x00109E, AWARE, INC.
+0x00109F, PAVO, INC.
+0x0010A0, INNOVEX TECHNOLOGIES, INC.
+0x0010A1, KENDIN SEMICONDUCTOR, INC.
+0x0010A2, TNS
+0x0010A3, OMNITRONIX, INC.
+0x0010A4, XIRCOM
+0x0010A5, OXFORD INSTRUMENTS
+0x0010A6, CISCO SYSTEMS, INC.
+0x0010A7, UNEX TECHNOLOGY CORPORATION
+0x0010A8, RELIANCE COMPUTER CORP.
+0x0010A9, ADHOC TECHNOLOGIES
+0x0010AA, MEDIA4, INC.
+0x0010AB, KOITO ELECTRIC INDUSTRIES, LTD.
+0x0010AC, IMCI TECHNOLOGIES
+0x0010AD, SOFTRONICS USB, INC.
+0x0010AE, SHINKO ELECTRIC INDUSTRIES CO.
+0x0010AF, TAC SYSTEMS, INC.
+0x0010B0, MERIDIAN TECHNOLOGY CORP.
+0x0010B1, FOR-A CO., LTD.
+0x0010B2, COACTIVE AESTHETICS
+0x0010B3, NOKIA MULTIMEDIA TERMINALS
+0x0010B4, ATMOSPHERE NETWORKS
+0x0010B5, ACCTON TECHNOLOGY CORPORATION
+0x0010B6, ENTRATA COMMUNICATIONS CORP.
+0x0010B7, COYOTE TECHNOLOGIES, LLC
+0x0010B8, ISHIGAKI COMPUTER SYSTEM CO.
+0x0010B9, MAXTOR CORP.
+0x0010BA, MARTINHO-DAVIS SYSTEMS, INC.
+0x0010BB, DATA & INFORMATION TECHNOLOGY
+0x0010BC, Aastra Telecom
+0x0010BD, THE TELECOMMUNICATION TECHNOLOGY COMMITTEE (TTC)
+0x0010BE, MARCH NETWORKS CORPORATION
+0x0010BF, InterAir Wireless
+0x0010C0, ARMA, Inc.
+0x0010C1, OI ELECTRIC CO., LTD.
+0x0010C2, WILLNET, INC.
+0x0010C3, CSI-CONTROL SYSTEMS
+0x0010C4, MEDIA LINKS CO., LTD.
+0x0010C5, PROTOCOL TECHNOLOGIES, INC.
+0x0010C6, Universal Global Scientific Industrial Co., Ltd.
+0x0010C7, DATA TRANSMISSION NETWORK
+0x0010C8, COMMUNICATIONS ELECTRONICS SECURITY GROUP
+0x0010C9, MITSUBISHI ELECTRONICS LOGISTIC SUPPORT CO.
+0x0010CA, Telco Systems, Inc.
+0x0010CB, FACIT K.K.
+0x0010CC, CLP COMPUTER LOGISTIK PLANUNG GmbH
+0x0010CD, INTERFACE CONCEPT
+0x0010CE, VOLAMP, LTD.
+0x0010CF, FIBERLANE COMMUNICATIONS
+0x0010D0, WITCOM, LTD.
+0x0010D1, Top Layer Networks, Inc.
+0x0010D2, NITTO TSUSHINKI CO., LTD
+0x0010D3, GRIPS ELECTRONIC GMBH
+0x0010D4, STORAGE COMPUTER CORPORATION
+0x0010D5, IMASDE CANARIAS, S.A.
+0x0010D6, ITT - A/CD
+0x0010D7, ARGOSY RESEARCH INC.
+0x0010D8, CALISTA
+0x0010D9, IBM JAPAN, FUJISAWA MT+D
+0x0010DA, MOTION ENGINEERING, INC.
+0x0010DB, Juniper Networks, Inc.
+0x0010DC, MICRO-STAR INTERNATIONAL CO., LTD.
+0x0010DD, ENABLE SEMICONDUCTOR, INC.
+0x0010DE, INTERNATIONAL DATACASTING CORPORATION
+0x0010DF, RISE COMPUTER INC.
+0x0010E0, Oracle Corporation
+0x0010E1, S.I. TECH, INC.
+0x0010E2, ArrayComm, Inc.
+0x0010E3, Hewlett-Packard Company
+0x0010E4, NSI CORPORATION
+0x0010E5, SOLECTRON TEXAS
+0x0010E6, APPLIED INTELLIGENT SYSTEMS, INC.
+0x0010E7, BreezeCom
+0x0010E8, TELOCITY, INCORPORATED
+0x0010E9, RAIDTEC LTD.
+0x0010EA, ADEPT TECHNOLOGY
+0x0010EB, SELSIUS SYSTEMS, INC.
+0x0010EC, RPCG, LLC
+0x0010ED, SUNDANCE TECHNOLOGY, INC.
+0x0010EE, CTI PRODUCTS, INC.
+0x0010EF, DBTEL INCORPORATED
+0x0010F1, I-O CORPORATION
+0x0010F2, ANTEC
+0x0010F3, Nexcom International Co., Ltd.
+0x0010F4, Vertical Communications
+0x0010F5, AMHERST SYSTEMS, INC.
+0x0010F6, CISCO SYSTEMS, INC.
+0x0010F7, IRIICHI TECHNOLOGIES Inc.
+0x0010F8, Niikke Techno System Co. Ltd
+0x0010F9, UNIQUE SYSTEMS, INC.
+0x0010FA, Apple, Inc
+0x0010FB, ZIDA TECHNOLOGIES LIMITED
+0x0010FC, BROADBAND NETWORKS, INC.
+0x0010FD, COCOM A/S
+0x0010FE, DIGITAL EQUIPMENT CORPORATION
+0x0010FF, CISCO SYSTEMS, INC.
+0x001100, Schneider Electric
+0x001101, CET Technologies Pte Ltd
+0x001102, Aurora Multimedia Corp.
+0x001103, kawamura electric inc.
+0x001104, TELEXY
+0x001105, Sunplus Technology Co., Ltd.
+0x001106, Siemens NV (Belgium)
+0x001107, RGB Networks Inc.
+0x001108, Orbital Data Corporation
+0x001109, Micro-Star International
+0x00110A, Hewlett-Packard Company
+0x00110B, Franklin Technology Systems
+0x00110C, Atmark Techno, Inc.
+0x00110D, SANBlaze Technology, Inc.
+0x00110E, Tsurusaki Sealand Transportation Co. Ltd.
+0x00110F, netplat,Inc.
+0x001110, Maxanna Technology Co., Ltd.
+0x001111, Intel Corporation
+0x001112, Honeywell CMSS
+0x001113, Fraunhofer FOKUS
+0x001114, EverFocus Electronics Corp.
+0x001115, EPIN Technologies, Inc.
+0x001116, COTEAU VERT CO., LTD.
+0x001117, CESNET
+0x001118, BLX IC Design Corp., Ltd.
+0x001119, Solteras, Inc.
+0x00111A, Motorola Mobility, Inc.
+0x00111B, Targa Systems Div L-3 Communications Canada
+0x00111C, Pleora Technologies Inc.
+0x00111D, Hectrix Limited
+0x00111E, EPSG (Ethernet Powerlink Standardization Group)
+0x00111F, Doremi Labs, Inc.
+0x001120, CISCO SYSTEMS, INC.
+0x001121, CISCO SYSTEMS, INC.
+0x001122, CIMSYS Inc
+0x001123, Appointech, Inc.
+0x001124, Apple Computer
+0x001125, IBM Corp
+0x001126, Venstar Inc.
+0x001127, TASI, Inc
+0x001128, Streamit
+0x001129, Paradise Datacom Ltd.
+0x00112A, Niko NV
+0x00112B, NetModule AG
+0x00112C, IZT GmbH
+0x00112D, iPulse Systems
+0x00112E, CEICOM
+0x00112F, ASUSTek Computer Inc.
+0x001130, Allied Telesis (Hong Kong) Ltd.
+0x001131, UNATECH. CO.,LTD
+0x001132, Synology Incorporated
+0x001133, Siemens Austria SIMEA
+0x001134, MediaCell, Inc.
+0x001135, Grandeye Ltd
+0x001136, Goodrich Sensor Systems
+0x001137, AICHI ELECTRIC CO., LTD.
+0x001138, TAISHIN CO., LTD.
+0x001139, STOEBER ANTRIEBSTECHNIK GmbH + Co. KG.
+0x00113A, SHINBORAM
+0x00113B, Micronet Communications Inc.
+0x00113C, Micronas GmbH
+0x00113D, KN SOLTEC CO.,LTD.
+0x00113E, JL Corporation
+0x00113F, Alcatel DI
+0x001140, Nanometrics Inc.
+0x001141, GoodMan Corporation
+0x001142, e-SMARTCOM INC.
+0x001143, Dell ESG PCBA Test
+0x001144, Assurance Technology Corp
+0x001145, ValuePoint Networks
+0x001146, Telecard-Pribor Ltd
+0x001147, Secom-Industry co.LTD.
+0x001148, Prolon Control Systems
+0x001149, Proliphix Inc.
+0x00114A, KAYABA INDUSTRY Co,.Ltd.
+0x00114B, Francotyp-Postalia GmbH
+0x00114C, caffeina applied research ltd.
+0x00114D, Atsumi Electric Co.,LTD.
+0x00114E, 690885 Ontario Inc.
+0x00114F, US Digital Television, Inc
+0x001150, Belkin Corporation
+0x001151, Mykotronx
+0x001152, Eidsvoll Electronics AS
+0x001153, Trident Tek, Inc.
+0x001154, Webpro Technologies Inc.
+0x001155, Sevis Systems
+0x001156, Pharos Systems NZ
+0x001157, OF Networks Co., Ltd.
+0x001158, Nortel Networks
+0x001159, MATISSE NETWORKS INC
+0x00115A, Ivoclar Vivadent AG
+0x00115B, Elitegroup Computer System Co. (ECS)
+0x00115C, CISCO SYSTEMS, INC.
+0x00115D, CISCO SYSTEMS, INC.
+0x00115E, ProMinent Dosiertechnik GmbH
+0x00115F, ITX Security Co., Ltd.
+0x001160, ARTDIO Company Co., LTD
+0x001161, NetStreams, LLC
+0x001162, STAR MICRONICS CO.,LTD.
+0x001163, SYSTEM SPA DEPT. ELECTRONICS
+0x001164, ACARD Technology Corp.
+0x001165, Znyx Networks
+0x001166, Taelim Electronics Co., Ltd.
+0x001167, Integrated System Solution Corp.
+0x001168, HomeLogic LLC
+0x001169, EMS Satcom
+0x00116A, Domo Ltd
+0x00116B, Digital Data Communications Asia Co.,Ltd
+0x00116C, Nanwang Multimedia Inc.,Ltd
+0x00116D, American Time and Signal
+0x00116E, PePLink Ltd.
+0x00116F, Netforyou Co., LTD.
+0x001170, GSC SRL
+0x001171, DEXTER Communications, Inc.
+0x001172, COTRON CORPORATION
+0x001173, SMART Storage Systems
+0x001174, Wibhu Technologies, Inc.
+0x001175, PathScale, Inc.
+0x001176, Intellambda Systems, Inc.
+0x001177, Coaxial Networks, Inc.
+0x001178, Chiron Technology Ltd
+0x001179, Singular Technology Co. Ltd.
+0x00117A, Singim International Corp.
+0x00117B, Büchi Labortechnik AG
+0x00117C, e-zy.net
+0x00117D, ZMD America, Inc.
+0x00117E, Progeny, A division of Midmark Corp
+0x00117F, Neotune Information Technology Corporation,.LTD
+0x001180, Motorola Mobility, Inc.
+0x001181, InterEnergy Co.Ltd,
+0x001182, IMI Norgren Ltd
+0x001183, Datalogic ADC, Inc.
+0x001184, Humo Laboratory,Ltd.
+0x001185, Hewlett-Packard Company
+0x001186, Prime Systems, Inc.
+0x001187, Category Solutions, Inc
+0x001188, Enterasys
+0x001189, Aerotech Inc
+0x00118A, Viewtran Technology Limited
+0x00118B, Alcatel-Lucent, Enterprise Business Group
+0x00118C, Missouri Department of Transportation
+0x00118D, Hanchang System Corp.
+0x00118E, Halytech Mace
+0x00118F, EUTECH INSTRUMENTS PTE. LTD.
+0x001190, Digital Design Corporation
+0x001191, CTS-Clima Temperatur Systeme GmbH
+0x001192, CISCO SYSTEMS, INC.
+0x001193, CISCO SYSTEMS, INC.
+0x001194, Chi Mei Communication Systems, Inc.
+0x001195, D-Link Corporation
+0x001196, Actuality Systems, Inc.
+0x001197, Monitoring Technologies Limited
+0x001198, Prism Media Products Limited
+0x001199, 2wcom Systems GmbH
+0x00119A, Alkeria srl
+0x00119B, Telesynergy Research Inc.
+0x00119C, EP&T Energy
+0x00119D, Diginfo Technology Corporation
+0x00119E, Solectron Brazil
+0x00119F, Nokia Danmark A/S
+0x0011A0, Vtech Engineering Canada Ltd
+0x0011A1, VISION NETWARE CO.,LTD
+0x0011A2, Manufacturing Technology Inc
+0x0011A3, LanReady Technologies Inc.
+0x0011A4, JStream Technologies Inc.
+0x0011A5, Fortuna Electronic Corp.
+0x0011A6, Sypixx Networks
+0x0011A7, Infilco Degremont Inc.
+0x0011A8, Quest Technologies
+0x0011A9, MOIMSTONE Co., LTD
+0x0011AA, Uniclass Technology, Co., LTD
+0x0011AB, TRUSTABLE TECHNOLOGY CO.,LTD.
+0x0011AC, Simtec Electronics
+0x0011AD, Shanghai Ruijie Technology
+0x0011AE, Motorola Mobility, Inc.
+0x0011AF, Medialink-i,Inc
+0x0011B0, Fortelink Inc.
+0x0011B1, BlueExpert Technology Corp.
+0x0011B2, 2001 Technology Inc.
+0x0011B3, YOSHIMIYA CO.,LTD.
+0x0011B4, Westermo Teleindustri AB
+0x0011B5, Shenzhen Powercom Co.,Ltd
+0x0011B6, Open Systems International
+0x0011B7, Octalix B.V.
+0x0011B8, Liebherr - Elektronik GmbH
+0x0011B9, Inner Range Pty. Ltd.
+0x0011BA, Elexol Pty Ltd
+0x0011BB, CISCO SYSTEMS, INC.
+0x0011BC, CISCO SYSTEMS, INC.
+0x0011BD, Bombardier Transportation
+0x0011BE, AGP Telecom Co. Ltd
+0x0011BF, AESYS S.p.A.
+0x0011C0, Aday Technology Inc
+0x0011C1, 4P MOBILE DATA PROCESSING
+0x0011C2, United Fiber Optic Communication
+0x0011C3, Transceiving System Technology Corporation
+0x0011C4, Terminales de Telecomunicacion Terrestre, S.L.
+0x0011C5, TEN Technology
+0x0011C6, Seagate Technology LLC
+0x0011C7, Raymarine UK Ltd
+0x0011C8, Powercom Co., Ltd.
+0x0011C9, MTT Corporation
+0x0011CA, Long Range Systems, Inc.
+0x0011CB, Jacobsons AB
+0x0011CC, Guangzhou Jinpeng Group Co.,Ltd.
+0x0011CD, Axsun Technologies
+0x0011CE, Ubisense Limited
+0x0011CF, Thrane & Thrane A/S
+0x0011D0, Tandberg Data ASA
+0x0011D1, Soft Imaging System GmbH
+0x0011D2, Perception Digital Ltd
+0x0011D3, NextGenTel Holding ASA
+0x0011D4, NetEnrich, Inc
+0x0011D5, Hangzhou Sunyard System Engineering Co.,Ltd.
+0x0011D6, HandEra, Inc.
+0x0011D7, eWerks Inc
+0x0011D8, ASUSTek Computer Inc.
+0x0011D9, TiVo
+0x0011DA, Vivaas Technology Inc.
+0x0011DB, Land-Cellular Corporation
+0x0011DC, Glunz & Jensen
+0x0011DD, FROMUS TEC. Co., Ltd.
+0x0011DE, EURILOGIC
+0x0011DF, Current Energy
+0x0011E0, U-MEDIA Communications, Inc.
+0x0011E1, Arcelik A.S
+0x0011E2, Hua Jung Components Co., Ltd.
+0x0011E3, Thomson, Inc.
+0x0011E4, Danelec Electronics A/S
+0x0011E5, KCodes Corporation
+0x0011E6, Scientific Atlanta
+0x0011E7, WORLDSAT - Texas de France
+0x0011E8, Tixi.Com
+0x0011E9, STARNEX CO., LTD.
+0x0011EA, IWICS Inc.
+0x0011EB, Innovative Integration
+0x0011EC, AVIX INC.
+0x0011ED, 802 Global
+0x0011EE, Estari, Inc.
+0x0011EF, Conitec Datensysteme GmbH
+0x0011F0, Wideful Limited
+0x0011F1, QinetiQ Ltd
+0x0011F2, Institute of Network Technologies
+0x0011F3, NeoMedia Europe AG
+0x0011F4, woori-net
+0x0011F5, ASKEY COMPUTER CORP.
+0x0011F6, Asia Pacific Microsystems , Inc.
+0x0011F7, Shenzhen Forward Industry Co., Ltd
+0x0011F8, AIRAYA Corp
+0x0011F9, Nortel Networks
+0x0011FA, Rane Corporation
+0x0011FB, Heidelberg Engineering GmbH
+0x0011FC, HARTING Electric Gmbh & Co.KG
+0x0011FD, KORG INC.
+0x0011FE, Keiyo System Research, Inc.
+0x0011FF, Digitro Tecnologia Ltda
+0x001200, CISCO SYSTEMS, INC.
+0x001201, CISCO SYSTEMS, INC.
+0x001202, Decrane Aerospace - Audio International Inc.
+0x001203, ActivNetworks
+0x001204, u10 Networks, Inc.
+0x001205, Terrasat Communications, Inc.
+0x001206, iQuest (NZ) Ltd
+0x001207, Head Strong International Limited
+0x001208, Gantner Instruments GmbH
+0x001209, Fastrax Ltd
+0x00120A, Emerson Electric GmbH & Co. OHG
+0x00120B, Chinasys Technologies Limited
+0x00120C, CE-Infosys Pte Ltd
+0x00120D, Advanced Telecommunication Technologies, Inc.
+0x00120E, AboCom
+0x00120F, IEEE 802.3
+0x001210, WideRay Corp
+0x001211, Protechna Herbst GmbH & Co. KG
+0x001212, PLUS Corporation
+0x001213, Metrohm AG
+0x001214, Koenig & Bauer AG
+0x001215, iStor Networks, Inc.
+0x001216, ICP Internet Communication Payment AG
+0x001217, Cisco-Linksys, LLC
+0x001218, ARUZE Corporation
+0x001219, Ahead Communication Systems Inc
+0x00121A, Techno Soft Systemnics Inc.
+0x00121B, Sound Devices, LLC
+0x00121C, PARROT S.A.
+0x00121D, Netfabric Corporation
+0x00121E, Juniper Networks, Inc.
+0x00121F, Harding Intruments
+0x001220, Cadco Systems
+0x001221, B.Braun Melsungen AG
+0x001222, Skardin (UK) Ltd
+0x001223, Pixim
+0x001224, NexQL Corporation
+0x001225, Motorola Mobility, Inc.
+0x001226, Japan Direx Corporation
+0x001227, Franklin Electric Co., Inc.
+0x001228, Data Ltd.
+0x001229, BroadEasy Technologies Co.,Ltd
+0x00122A, VTech Telecommunications Ltd.
+0x00122B, Virbiage Pty Ltd
+0x00122C, Soenen Controls N.V.
+0x00122D, SiNett Corporation
+0x00122E, Signal Technology - AISD
+0x00122F, Sanei Electric Inc.
+0x001230, Picaso Infocommunication CO., LTD.
+0x001231, Motion Control Systems, Inc.
+0x001232, LeWiz Communications Inc.
+0x001233, JRC TOKKI Co.,Ltd.
+0x001234, Camille Bauer
+0x001235, Andrew Corporation
+0x001236, ConSentry Networks
+0x001237, Texas Instruments
+0x001238, SetaBox Technology Co., Ltd.
+0x001239, S Net Systems Inc.
+0x00123A, Posystech Inc., Co.
+0x00123B, KeRo Systems ApS
+0x00123C, Second Rule LLC
+0x00123D, GES
+0x00123E, ERUNE technology Co., Ltd.
+0x00123F, Dell ESG PCBA Test
+0x001240, AMOI ELECTRONICS CO.,LTD
+0x001241, a2i marketing center
+0x001242, Millennial Net
+0x001243, CISCO SYSTEMS, INC.
+0x001244, CISCO SYSTEMS, INC.
+0x001245, Zellweger Analytics, Inc.
+0x001246, T.O.M TECHNOLOGY INC..
+0x001247, Samsung Electronics Co., Ltd.
+0x001248, EMC Corporation (Kashya)
+0x001249, Delta Elettronica S.p.A.
+0x00124A, Dedicated Devices, Inc.
+0x00124B, Texas Instruments
+0x00124C, BBWM Corporation
+0x00124D, Inducon BV
+0x00124E, XAC AUTOMATION CORP.
+0x00124F, Tyco Thermal Controls LLC.
+0x001250, Tokyo Aircaft Instrument Co., Ltd.
+0x001251, SILINK
+0x001252, Citronix, LLC
+0x001253, AudioDev AB
+0x001254, Spectra Technologies Holdings Company Ltd
+0x001255, NetEffect Incorporated
+0x001256, LG INFORMATION & COMM.
+0x001257, LeapComm Communication Technologies Inc.
+0x001258, Activis Polska
+0x001259, THERMO ELECTRON KARLSRUHE
+0x00125A, Microsoft Corporation
+0x00125B, KAIMEI ELECTRONI
+0x00125C, Green Hills Software, Inc.
+0x00125D, CyberNet Inc.
+0x00125E, CAEN
+0x00125F, AWIND Inc.
+0x001260, Stanton Magnetics,inc.
+0x001261, Adaptix, Inc
+0x001262, Nokia Danmark A/S
+0x001263, Data Voice Technologies GmbH
+0x001264, daum electronic gmbh
+0x001265, Enerdyne Technologies, Inc.
+0x001266, Swisscom Hospitality Services SA
+0x001267, Matsushita Electronic Components Co., Ltd.
+0x001268, IPS d.o.o.
+0x001269, Value Electronics
+0x00126A, OPTOELECTRONICS Co., Ltd.
+0x00126B, Ascalade Communications Limited
+0x00126C, Visonic Ltd.
+0x00126D, University of California, Berkeley
+0x00126E, Seidel Elektronik GmbH Nfg.KG
+0x00126F, Rayson Technology Co., Ltd.
+0x001270, NGES Denro Systems
+0x001271, Measurement Computing Corp
+0x001272, Redux Communications Ltd.
+0x001273, Stoke Inc
+0x001274, NIT lab
+0x001275, Sentilla Corporation
+0x001276, CG Power Systems Ireland Limited
+0x001277, Korenix Technologies Co., Ltd.
+0x001278, International Bar Code
+0x001279, Hewlett-Packard Company
+0x00127A, Sanyu Industry Co.,Ltd.
+0x00127B, VIA Networking Technologies, Inc.
+0x00127C, SWEGON AB
+0x00127D, MobileAria
+0x00127E, Digital Lifestyles Group, Inc.
+0x00127F, CISCO SYSTEMS, INC.
+0x001280, CISCO SYSTEMS, INC.
+0x001281, March Networks S.p.A.
+0x001282, Qovia
+0x001283, Nortel Networks
+0x001284, Lab33 Srl
+0x001285, Gizmondo Europe Ltd
+0x001286, ENDEVCO CORP
+0x001287, Digital Everywhere Unterhaltungselektronik GmbH
+0x001288, 2Wire, Inc
+0x001289, Advance Sterilization Products
+0x00128A, Motorola Mobility, Inc.
+0x00128B, Sensory Networks Inc
+0x00128C, Woodward Governor
+0x00128D, STB Datenservice GmbH
+0x00128E, Q-Free ASA
+0x00128F, Montilio
+0x001290, KYOWA Electric & Machinery Corp.
+0x001291, KWS Computersysteme GmbH
+0x001292, Griffin Technology
+0x001293, GE Energy
+0x001294, SUMITOMO ELECTRIC DEVICE INNOVATIONS, INC
+0x001295, Aiware Inc.
+0x001296, Addlogix
+0x001297, O2Micro, Inc.
+0x001298, MICO ELECTRIC(SHENZHEN) LIMITED
+0x001299, Ktech Telecommunications Inc
+0x00129A, IRT Electronics Pty Ltd
+0x00129B, E2S Electronic Engineering Solutions, S.L.
+0x00129C, Yulinet
+0x00129D, First International Computer do Brasil
+0x00129E, Surf Communications Inc.
+0x00129F, RAE Systems
+0x0012A0, NeoMeridian Sdn Bhd
+0x0012A1, BluePacket Communications Co., Ltd.
+0x0012A2, VITA
+0x0012A3, Trust International B.V.
+0x0012A4, ThingMagic, LLC
+0x0012A5, Stargen, Inc.
+0x0012A6, Dolby Australia
+0x0012A7, ISR TECHNOLOGIES Inc
+0x0012A8, intec GmbH
+0x0012A9, 3Com Ltd
+0x0012AA, IEE, Inc.
+0x0012AB, WiLife, Inc.
+0x0012AC, ONTIMETEK INC.
+0x0012AD, IDS GmbH
+0x0012AE, HLS HARD-LINE Solutions Inc.
+0x0012AF, ELPRO Technologies
+0x0012B0, Efore Oyj (Plc)
+0x0012B1, Dai Nippon Printing Co., Ltd
+0x0012B2, AVOLITES LTD.
+0x0012B3, Advance Wireless Technology Corp.
+0x0012B4, Work Microwave GmbH
+0x0012B5, Vialta, Inc.
+0x0012B6, Santa Barbara Infrared, Inc.
+0x0012B7, PTW Freiburg
+0x0012B8, G2 Microsystems
+0x0012B9, Fusion Digital Technology
+0x0012BA, FSI Systems, Inc.
+0x0012BB, Telecommunications Industry Association TR-41 Committee
+0x0012BC, Echolab LLC
+0x0012BD, Avantec Manufacturing Limited
+0x0012BE, Astek Corporation
+0x0012BF, Arcadyan Technology Corporation
+0x0012C0, HotLava Systems, Inc.
+0x0012C1, Check Point Software Technologies
+0x0012C2, Apex Electronics Factory
+0x0012C3, WIT S.A.
+0x0012C4, Viseon, Inc.
+0x0012C5, V-Show Technology (China) Co.,Ltd
+0x0012C6, TGC America, Inc
+0x0012C7, SECURAY Technologies Ltd.Co.
+0x0012C8, Perfect tech
+0x0012C9, Motorola Mobility, Inc.
+0x0012CA, Mechatronic Brick Aps
+0x0012CB, CSS Inc.
+0x0012CC, Bitatek CO., LTD
+0x0012CD, ASEM SpA
+0x0012CE, Advanced Cybernetics Group
+0x0012CF, Accton Technology Corporation
+0x0012D0, Gossen-Metrawatt-GmbH
+0x0012D1, Texas Instruments Inc
+0x0012D2, Texas Instruments
+0x0012D3, Zetta Systems, Inc.
+0x0012D4, Princeton Technology, Ltd
+0x0012D5, Motion Reality Inc.
+0x0012D6, Jiangsu Yitong High-Tech Co.,Ltd
+0x0012D7, Invento Networks, Inc.
+0x0012D8, International Games System Co., Ltd.
+0x0012D9, CISCO SYSTEMS, INC.
+0x0012DA, CISCO SYSTEMS, INC.
+0x0012DB, ZIEHL industrie-elektronik GmbH + Co KG
+0x0012DC, SunCorp Industrial Limited
+0x0012DD, Shengqu Information Technology (Shanghai) Co., Ltd.
+0x0012DE, Radio Components Sweden AB
+0x0012DF, Novomatic AG
+0x0012E0, Codan Limited
+0x0012E1, Alliant Networks, Inc
+0x0012E2, ALAXALA Networks Corporation
+0x0012E3, Agat-RT, Ltd.
+0x0012E4, ZIEHL industrie-electronik GmbH + Co KG
+0x0012E5, Time America, Inc.
+0x0012E6, SPECTEC COMPUTER CO., LTD.
+0x0012E7, Projectek Networking Electronics Corp.
+0x0012E8, Fraunhofer IMS
+0x0012E9, Abbey Systems Ltd
+0x0012EA, Trane
+0x0012EB, R2DI, LLC
+0x0012EC, Movacolor b.v.
+0x0012ED, AVG Advanced Technologies
+0x0012EE, Sony Ericsson Mobile Communications AB
+0x0012EF, OneAccess SA
+0x0012F0, Intel Corporate
+0x0012F1, IFOTEC
+0x0012F2, Brocade Communications Systems, Inc
+0x0012F3, connectBlue AB
+0x0012F4, Belco International Co.,Ltd.
+0x0012F5, Imarda New Zealand Limited
+0x0012F6, MDK CO.,LTD.
+0x0012F7, Xiamen Xinglian Electronics Co., Ltd.
+0x0012F8, WNI Resources, LLC
+0x0012F9, URYU SEISAKU, LTD.
+0x0012FA, THX LTD
+0x0012FB, Samsung Electronics
+0x0012FC, PLANET System Co.,LTD
+0x0012FD, OPTIMUS IC S.A.
+0x0012FE, Lenovo Mobile Communication Technology Ltd.
+0x0012FF, Lely Industries N.V.
+0x001300, IT-FACTORY, INC.
+0x001301, IronGate S.L.
+0x001302, Intel Corporate
+0x001303, GateConnect Technologies GmbH
+0x001304, Flaircomm Technologies Co. LTD
+0x001305, Epicom, Inc.
+0x001306, Always On Wireless
+0x001307, Paravirtual Corporation
+0x001308, Nuvera Fuel Cells
+0x001309, Ocean Broadband Networks
+0x00130A, Nortel
+0x00130B, Mextal B.V.
+0x00130C, HF System Corporation
+0x00130D, GALILEO AVIONICA
+0x00130E, Focusrite Audio Engineering Limited
+0x00130F, EGEMEN Bilgisayar Muh San ve Tic LTD STI
+0x001310, Cisco-Linksys, LLC
+0x001311, ARRIS International
+0x001312, Amedia Networks Inc.
+0x001313, GuangZhou Post & Telecom Equipment ltd
+0x001314, Asiamajor Inc.
+0x001315, SONY Computer Entertainment inc,
+0x001316, L-S-B Broadcast Technologies GmbH
+0x001317, GN Netcom as
+0x001318, DGSTATION Co., Ltd.
+0x001319, CISCO SYSTEMS, INC.
+0x00131A, CISCO SYSTEMS, INC.
+0x00131B, BeCell Innovations Corp.
+0x00131C, LiteTouch, Inc.
+0x00131D, Scanvaegt International A/S
+0x00131E, Peiker acustic GmbH & Co. KG
+0x00131F, NxtPhase T&D, Corp.
+0x001320, Intel Corporate
+0x001321, Hewlett-Packard Company
+0x001322, DAQ Electronics, Inc.
+0x001323, Cap Co., Ltd.
+0x001324, Schneider Electric Ultra Terminal
+0x001325, Cortina Systems Inc
+0x001326, ECM Systems Ltd
+0x001327, Data Acquisitions limited
+0x001328, Westech Korea Inc.,
+0x001329, VSST Co., LTD
+0x00132A, Sitronics Telecom Solutions
+0x00132B, Phoenix Digital
+0x00132C, MAZ Brandenburg GmbH
+0x00132D, iWise Communications
+0x00132E, ITian Coporation
+0x00132F, Interactek
+0x001330, EURO PROTECTION SURVEILLANCE
+0x001331, CellPoint Connect
+0x001332, Beijing Topsec Network Security Technology Co., Ltd.
+0x001333, BaudTec Corporation
+0x001334, Arkados, Inc.
+0x001335, VS Industry Berhad
+0x001336, Tianjin 712 Communication Broadcasting co., ltd.
+0x001337, Orient Power Home Network Ltd.
+0x001338, FRESENIUS-VIAL
+0x001339, EL-ME AG
+0x00133A, VadaTech Inc.
+0x00133B, Speed Dragon Multimedia Limited
+0x00133C, QUINTRON SYSTEMS INC.
+0x00133D, Micro Memory Curtiss Wright Co
+0x00133E, MetaSwitch
+0x00133F, Eppendorf Instrumente GmbH
+0x001340, AD.EL s.r.l.
+0x001341, Shandong New Beiyang Information Technology Co.,Ltd
+0x001342, Vision Research, Inc.
+0x001343, Matsushita Electronic Components (Europe) GmbH
+0x001344, Fargo Electronics Inc.
+0x001345, Eaton Corporation
+0x001346, D-Link Corporation
+0x001347, BlueTree Wireless Data Inc.
+0x001348, Artila Electronics Co., Ltd.
+0x001349, ZyXEL Communications Corporation
+0x00134A, Engim, Inc.
+0x00134B, ToGoldenNet Technology Inc.
+0x00134C, YDT Technology International
+0x00134D, Inepro BV
+0x00134E, Valox Systems, Inc.
+0x00134F, Tranzeo Wireless Technologies Inc.
+0x001350, Silver Spring Networks, Inc
+0x001351, Niles Audio Corporation
+0x001352, Naztec, Inc.
+0x001353, HYDAC Filtertechnik GMBH
+0x001354, Zcomax Technologies, Inc.
+0x001355, TOMEN Cyber-business Solutions, Inc.
+0x001356, FLIR Radiation Inc
+0x001357, Soyal Technology Co., Ltd.
+0x001358, Realm Systems, Inc.
+0x001359, ProTelevision Technologies A/S
+0x00135A, Project T&E Limited
+0x00135B, PanelLink Cinema, LLC
+0x00135C, OnSite Systems, Inc.
+0x00135D, NTTPC Communications, Inc.
+0x00135E, EAB/RWI/K
+0x00135F, CISCO SYSTEMS, INC.
+0x001360, CISCO SYSTEMS, INC.
+0x001361, Biospace Co., Ltd.
+0x001362, ShinHeung Precision Co., Ltd.
+0x001363, Verascape, Inc.
+0x001364, Paradigm Technology Inc..
+0x001365, Nortel
+0x001366, Neturity Technologies Inc.
+0x001367, Narayon. Co., Ltd.
+0x001368, Maersk Data Defence
+0x001369, Honda Electron Co., LED.
+0x00136A, Hach Lange SA
+0x00136B, E-TEC
+0x00136C, TomTom
+0x00136D, Tentaculus AB
+0x00136E, Techmetro Corp.
+0x00136F, PacketMotion, Inc.
+0x001370, Nokia Danmark A/S
+0x001371, Motorola Mobility, Inc.
+0x001372, Dell ESG PCBA Test
+0x001373, BLwave Electronics Co., Ltd
+0x001374, Atheros Communications, Inc.
+0x001375, American Security Products Co.
+0x001376, Tabor Electronics Ltd.
+0x001377, Samsung Electronics CO., LTD
+0x001378, QSAN Technology, Inc.
+0x001379, PONDER INFORMATION INDUSTRIES LTD.
+0x00137A, Netvox Technology Co., Ltd.
+0x00137B, Movon Corporation
+0x00137C, Kaicom co., Ltd.
+0x00137D, Dynalab, Inc.
+0x00137E, CorEdge Networks, Inc.
+0x00137F, CISCO SYSTEMS, INC.
+0x001380, CISCO SYSTEMS, INC.
+0x001381, CHIPS & Systems, Inc.
+0x001382, Cetacea Networks Corporation
+0x001383, Application Technologies and Engineering Research Laboratory
+0x001384, Advanced Motion Controls
+0x001385, Add-On Technology Co., LTD.
+0x001386, ABB Inc./Totalflow
+0x001387, 27M Technologies AB
+0x001388, WiMedia Alliance
+0x001389, Redes de Telefonía Móvil S.A.
+0x00138A, QINGDAO GOERTEK ELECTRONICS CO.,LTD.
+0x00138B, Phantom Technologies LLC
+0x00138C, Kumyoung.Co.Ltd
+0x00138D, Kinghold
+0x00138E, FOAB Elektronik AB
+0x00138F, Asiarock Incorporation
+0x001390, Termtek Computer Co., Ltd
+0x001391, OUEN CO.,LTD.
+0x001392, Ruckus Wireless
+0x001393, Panta Systems, Inc.
+0x001394, Infohand Co.,Ltd
+0x001395, congatec AG
+0x001396, Acbel Polytech Inc.
+0x001397, Oracle Corporation
+0x001398, TrafficSim Co.,Ltd
+0x001399, STAC Corporation.
+0x00139A, K-ubique ID Corp.
+0x00139B, ioIMAGE Ltd.
+0x00139C, Exavera Technologies, Inc.
+0x00139D, Marvell Hispana S.L.
+0x00139E, Ciara Technologies Inc.
+0x00139F, Electronics Design Services, Co., Ltd.
+0x0013A0, ALGOSYSTEM Co., Ltd.
+0x0013A1, Crow Electronic Engeneering
+0x0013A2, MaxStream, Inc
+0x0013A3, Siemens Com CPE Devices
+0x0013A4, KeyEye Communications
+0x0013A5, General Solutions, LTD.
+0x0013A6, Extricom Ltd
+0x0013A7, BATTELLE MEMORIAL INSTITUTE
+0x0013A8, Tanisys Technology
+0x0013A9, Sony Corporation
+0x0013AA, ALS & TEC Ltd.
+0x0013AB, Telemotive AG
+0x0013AC, Sunmyung Electronics Co., LTD
+0x0013AD, Sendo Ltd
+0x0013AE, Radiance Technologies, Inc.
+0x0013AF, NUMA Technology,Inc.
+0x0013B0, Jablotron
+0x0013B1, Intelligent Control Systems (Asia) Pte Ltd
+0x0013B2, Carallon Limited
+0x0013B3, Ecom Communications Technology Co., Ltd.
+0x0013B4, Appear TV
+0x0013B5, Wavesat
+0x0013B6, Sling Media, Inc.
+0x0013B7, Scantech ID
+0x0013B8, RyCo Electronic Systems Limited
+0x0013B9, BM SPA
+0x0013BA, ReadyLinks Inc
+0x0013BB, Smartvue Corporation
+0x0013BC, Artimi Ltd
+0x0013BD, HYMATOM SA
+0x0013BE, Virtual Conexions
+0x0013BF, Media System Planning Corp.
+0x0013C0, Trix Tecnologia Ltda.
+0x0013C1, Asoka USA Corporation
+0x0013C2, WACOM Co.,Ltd
+0x0013C3, CISCO SYSTEMS, INC.
+0x0013C4, CISCO SYSTEMS, INC.
+0x0013C5, LIGHTRON FIBER-OPTIC DEVICES INC.
+0x0013C6, OpenGear, Inc
+0x0013C7, IONOS Co.,Ltd.
+0x0013C8, ADB Broadband Italia
+0x0013C9, Beyond Achieve Enterprises Ltd.
+0x0013CA, Pico Digital
+0x0013CB, Zenitel Norway AS
+0x0013CC, Tall Maple Systems
+0x0013CD, MTI co. LTD
+0x0013CE, Intel Corporate
+0x0013CF, 4Access Communications
+0x0013D0, t+ Medical Ltd
+0x0013D1, KIRK telecom A/S
+0x0013D2, PAGE IBERICA, S.A.
+0x0013D3, MICRO-STAR INTERNATIONAL CO., LTD.
+0x0013D4, ASUSTek COMPUTER INC.
+0x0013D5, RuggedCom
+0x0013D6, TII NETWORK TECHNOLOGIES, INC.
+0x0013D7, SPIDCOM Technologies SA
+0x0013D8, Princeton Instruments
+0x0013D9, Matrix Product Development, Inc.
+0x0013DA, Diskware Co., Ltd
+0x0013DB, SHOEI Electric Co.,Ltd
+0x0013DC, IBTEK INC.
+0x0013DD, Abbott Diagnostics
+0x0013DE, Adapt4, LLC
+0x0013DF, Ryvor Corp.
+0x0013E0, Murata Manufacturing Co., Ltd.
+0x0013E1, Iprobe AB
+0x0013E2, GeoVision Inc.
+0x0013E3, CoVi Technologies, Inc.
+0x0013E4, YANGJAE SYSTEMS CORP.
+0x0013E5, TENOSYS, INC.
+0x0013E6, Technolution
+0x0013E7, Halcro
+0x0013E8, Intel Corporate
+0x0013E9, VeriWave, Inc.
+0x0013EA, Kamstrup A/S
+0x0013EB, Sysmaster Corporation
+0x0013EC, Sunbay Software AG
+0x0013ED, PSIA
+0x0013EE, JBX Designs Inc.
+0x0013EF, Kingjon Digital Technology Co.,Ltd
+0x0013F0, Wavefront Semiconductor
+0x0013F1, AMOD Technology Co., Ltd.
+0x0013F2, Klas Ltd
+0x0013F3, Giga-byte Communications Inc.
+0x0013F4, Psitek (Pty) Ltd
+0x0013F5, Akimbi Systems
+0x0013F6, Cintech
+0x0013F7, SMC Networks, Inc.
+0x0013F8, Dex Security Solutions
+0x0013F9, Cavera Systems
+0x0013FA, LifeSize Communications, Inc
+0x0013FB, RKC INSTRUMENT INC.
+0x0013FC, SiCortex, Inc
+0x0013FD, Nokia Danmark A/S
+0x0013FE, GRANDTEC ELECTRONIC CORP.
+0x0013FF, Dage-MTI of MC, Inc.
+0x001400, MINERVA KOREA CO., LTD
+0x001401, Rivertree Networks Corp.
+0x001402, kk-electronic a/s
+0x001403, Renasis, LLC
+0x001404, Motorola Mobility, Inc.
+0x001405, OpenIB, Inc.
+0x001406, Go Networks
+0x001407, Sperian Protection Instrumentation
+0x001408, Eka Systems Inc.
+0x001409, MAGNETI MARELLI S.E. S.p.A.
+0x00140A, WEPIO Co., Ltd.
+0x00140B, FIRST INTERNATIONAL COMPUTER, INC.
+0x00140C, GKB CCTV CO., LTD.
+0x00140D, Nortel
+0x00140E, Nortel
+0x00140F, Federal State Unitary Enterprise Leningrad R&D Institute of
+0x001410, Suzhou Keda Technology CO.,Ltd
+0x001411, Deutschmann Automation GmbH & Co. KG
+0x001412, S-TEC electronics AG
+0x001413, Trebing & Himstedt Prozeßautomation GmbH & Co. KG
+0x001414, Jumpnode Systems LLC.
+0x001415, Intec Automation Inc.
+0x001416, Scosche Industries, Inc.
+0x001417, RSE Informations Technologie GmbH
+0x001418, C4Line
+0x001419, SIDSA
+0x00141A, DEICY CORPORATION
+0x00141B, CISCO SYSTEMS, INC.
+0x00141C, CISCO SYSTEMS, INC.
+0x00141D, Lust Antriebstechnik GmbH
+0x00141E, P.A. Semi, Inc.
+0x00141F, SunKwang Electronics Co., Ltd
+0x001420, G-Links networking company
+0x001421, Total Wireless Technologies Pte. Ltd.
+0x001422, Dell ESG PCBA Test
+0x001423, J-S Co. NEUROCOM
+0x001424, Merry Electrics CO., LTD.
+0x001425, Galactic Computing Corp.
+0x001426, NL Technology
+0x001427, JazzMutant
+0x001428, Vocollect, Inc
+0x001429, V Center Technologies Co., Ltd.
+0x00142A, Elitegroup Computer System Co., Ltd
+0x00142B, Edata Communication Inc.
+0x00142C, Koncept International, Inc.
+0x00142D, Toradex AG
+0x00142E, 77 Elektronika Kft.
+0x00142F, WildPackets
+0x001430, ViPowER, Inc
+0x001431, PDL Electronics Ltd
+0x001432, Tarallax Wireless, Inc.
+0x001433, Empower Technologies(Canada) Inc.
+0x001434, Keri Systems, Inc
+0x001435, CityCom Corp.
+0x001436, Qwerty Elektronik AB
+0x001437, GSTeletech Co.,Ltd.
+0x001438, Hewlett-Packard Company
+0x001439, Blonder Tongue Laboratories, Inc.
+0x00143A, RAYTALK INTERNATIONAL SRL
+0x00143B, Sensovation AG
+0x00143C, Rheinmetall Canada Inc.
+0x00143D, Aevoe Inc.
+0x00143E, AirLink Communications, Inc.
+0x00143F, Hotway Technology Corporation
+0x001440, ATOMIC Corporation
+0x001441, Innovation Sound Technology Co., LTD.
+0x001442, ATTO CORPORATION
+0x001443, Consultronics Europe Ltd
+0x001444, Grundfos Electronics
+0x001445, Telefon-Gradnja d.o.o.
+0x001446, SuperVision Solutions LLC
+0x001447, BOAZ Inc.
+0x001448, Inventec Multimedia & Telecom Corporation
+0x001449, Sichuan Changhong Electric Ltd.
+0x00144A, Taiwan Thick-Film Ind. Corp.
+0x00144B, Hifn, Inc.
+0x00144C, General Meters Corp.
+0x00144D, Intelligent Systems
+0x00144E, SRISA
+0x00144F, Oracle Corporation
+0x001450, Heim Systems GmbH
+0x001451, Apple Computer Inc.
+0x001452, CALCULEX,INC.
+0x001453, ADVANTECH TECHNOLOGIES CO.,LTD
+0x001454, Symwave
+0x001455, Coder Electronics Corporation
+0x001456, Edge Products
+0x001457, T-VIPS AS
+0x001458, HS Automatic ApS
+0x001459, Moram Co., Ltd.
+0x00145A, Neratec AG
+0x00145B, SeekerNet Inc.
+0x00145C, Intronics B.V.
+0x00145D, WJ Communications, Inc.
+0x00145E, IBM Corp
+0x00145F, ADITEC CO. LTD
+0x001460, Kyocera Wireless Corp.
+0x001461, CORONA CORPORATION
+0x001462, Digiwell Technology, inc
+0x001463, IDCS N.V.
+0x001464, Cryptosoft
+0x001465, Novo Nordisk A/S
+0x001466, Kleinhenz Elektronik GmbH
+0x001467, ArrowSpan Inc.
+0x001468, CelPlan International, Inc.
+0x001469, CISCO SYSTEMS, INC.
+0x00146A, CISCO SYSTEMS, INC.
+0x00146B, Anagran, Inc.
+0x00146C, Netgear Inc.
+0x00146D, RF Technologies
+0x00146E, H. Stoll GmbH & Co. KG
+0x00146F, Kohler Co
+0x001470, Prokom Software SA
+0x001471, Eastern Asia Technology Limited
+0x001472, China Broadband Wireless IP Standard Group
+0x001473, Bookham Inc
+0x001474, K40 Electronics
+0x001475, Wiline Networks, Inc.
+0x001476, MultiCom Industries Limited
+0x001477, Nertec Inc.
+0x001478, ShenZhen TP-LINK Technologies Co., Ltd.
+0x001479, NEC Magnus Communications,Ltd.
+0x00147A, Eubus GmbH
+0x00147B, Iteris, Inc.
+0x00147C, 3Com Ltd
+0x00147D, Aeon Digital International
+0x00147E, InnerWireless
+0x00147F, Thomson Telecom Belgium
+0x001480, Hitachi-LG Data Storage Korea, Inc
+0x001481, Multilink Inc
+0x001482, GoBackTV, Inc
+0x001483, eXS Inc.
+0x001484, Cermate Technologies Inc.
+0x001485, Giga-Byte
+0x001486, Echo Digital Audio Corporation
+0x001487, American Technology Integrators
+0x001488, Akorri
+0x001489, B15402100 - JANDEI, S.L.
+0x00148A, Elin Ebg Traction Gmbh
+0x00148B, Globo Electronic GmbH & Co. KG
+0x00148C, Fortress Technologies
+0x00148D, Cubic Defense Simulation Systems
+0x00148E, Tele Power Inc.
+0x00148F, Protronic (Far East) Ltd.
+0x001490, ASP Corporation
+0x001491, Daniels Electronics Ltd.
+0x001492, Liteon, Mobile Media Solution SBU
+0x001493, Systimax Solutions
+0x001494, ESU AG
+0x001495, 2Wire, Inc.
+0x001496, Phonic Corp.
+0x001497, ZHIYUAN Eletronics co.,ltd.
+0x001498, Viking Design Technology
+0x001499, Helicomm Inc
+0x00149A, Motorola Mobility, Inc.
+0x00149B, Nokota Communications, LLC
+0x00149C, HF Company
+0x00149D, Sound ID Inc.
+0x00149E, UbONE Co., Ltd
+0x00149F, System and Chips, Inc.
+0x0014A0, Accsense, Inc.
+0x0014A1, Synchronous Communication Corp
+0x0014A2, Core Micro Systems Inc.
+0x0014A3, Vitelec BV
+0x0014A4, Hon Hai Precision Ind. Co., Ltd.
+0x0014A5, Gemtek Technology Co., Ltd.
+0x0014A6, Teranetics, Inc.
+0x0014A7, Nokia Danmark A/S
+0x0014A8, CISCO SYSTEMS, INC.
+0x0014A9, CISCO SYSTEMS, INC.
+0x0014AA, Ashly Audio, Inc.
+0x0014AB, Senhai Electronic Technology Co., Ltd.
+0x0014AC, Bountiful WiFi
+0x0014AD, Gassner Wiege- und Meßtechnik GmbH
+0x0014AE, Wizlogics Co., Ltd.
+0x0014AF, Datasym POS Inc.
+0x0014B0, Naeil Community
+0x0014B1, Avitec AB
+0x0014B2, mCubelogics Corporation
+0x0014B3, CoreStar International Corp
+0x0014B4, General Dynamics United Kingdom Ltd
+0x0014B5, PHYSIOMETRIX,INC
+0x0014B6, Enswer Technology Inc.
+0x0014B7, AR Infotek Inc.
+0x0014B8, Hill-Rom
+0x0014B9, MSTAR SEMICONDUCTOR
+0x0014BA, Carvers SA de CV
+0x0014BB, Open Interface North America
+0x0014BC, SYNECTIC TELECOM EXPORTS PVT. LTD.
+0x0014BD, incNETWORKS, Inc
+0x0014BE, Wink communication technology CO.LTD
+0x0014BF, Cisco-Linksys LLC
+0x0014C0, Symstream Technology Group Ltd
+0x0014C1, U.S. Robotics Corporation
+0x0014C2, Hewlett-Packard Company
+0x0014C3, Seagate Technology LLC
+0x0014C4, Vitelcom Mobile Technology
+0x0014C5, Alive Technologies Pty Ltd
+0x0014C6, Quixant Ltd
+0x0014C7, Nortel
+0x0014C8, Contemporary Research Corp
+0x0014C9, Brocade Communications Systems, Inc.
+0x0014CA, Key Radio Systems Limited
+0x0014CB, LifeSync Corporation
+0x0014CC, Zetec, Inc.
+0x0014CD, DigitalZone Co., Ltd.
+0x0014CE, NF CORPORATION
+0x0014CF, INVISIO Communications
+0x0014D0, BTI Systems Inc.
+0x0014D1, TRENDnet
+0x0014D2, Kyuden Technosystems Corporation
+0x0014D3, SEPSA
+0x0014D4, K Technology Corporation
+0x0014D5, Datang Telecom Technology CO. , LCD,Optical Communication Br
+0x0014D6, Jeongmin Electronics Co.,Ltd.
+0x0014D7, Datastore Technology Corp
+0x0014D8, bio-logic SA
+0x0014D9, IP Fabrics, Inc.
+0x0014DA, Huntleigh Healthcare
+0x0014DB, Elma Trenew Electronic GmbH
+0x0014DC, Communication System Design & Manufacturing (CSDM)
+0x0014DD, Covergence Inc.
+0x0014DE, Sage Instruments Inc.
+0x0014DF, HI-P Tech Corporation
+0x0014E0, LET'S Corporation
+0x0014E1, Data Display AG
+0x0014E2, datacom systems inc.
+0x0014E3, mm-lab GmbH
+0x0014E4, infinias, LLC
+0x0014E5, Alticast
+0x0014E6, AIM Infrarotmodule GmbH
+0x0014E7, Stolinx,. Inc
+0x0014E8, Motorola Mobility, Inc.
+0x0014E9, Nortech International
+0x0014EA, S Digm Inc. (Safe Paradigm Inc.)
+0x0014EB, AwarePoint Corporation
+0x0014EC, Acro Telecom
+0x0014ED, Airak, Inc.
+0x0014EE, Western Digital Technologies, Inc.
+0x0014EF, TZero Technologies, Inc.
+0x0014F0, Business Security OL AB
+0x0014F1, CISCO SYSTEMS, INC.
+0x0014F2, CISCO SYSTEMS, INC.
+0x0014F3, ViXS Systems Inc
+0x0014F4, DekTec Digital Video B.V.
+0x0014F5, OSI Security Devices
+0x0014F6, Juniper Networks, Inc.
+0x0014F7, CREVIS Co., LTD
+0x0014F8, Scientific Atlanta
+0x0014F9, Vantage Controls
+0x0014FA, AsGa S.A.
+0x0014FB, Technical Solutions Inc.
+0x0014FC, Extandon, Inc.
+0x0014FD, Thecus Technology Corp.
+0x0014FE, Artech Electronics
+0x0014FF, Precise Automation, Inc.
+0x001500, Intel Corporate
+0x001501, LexBox
+0x001502, BETA tech
+0x001503, PROFIcomms s.r.o.
+0x001504, GAME PLUS CO., LTD.
+0x001505, Actiontec Electronics, Inc
+0x001506, Neo Photonics
+0x001507, Renaissance Learning Inc
+0x001508, Global Target Enterprise Inc
+0x001509, Plus Technology Co., Ltd
+0x00150A, Sonoa Systems, Inc
+0x00150B, SAGE INFOTECH LTD.
+0x00150C, AVM GmbH
+0x00150D, Hoana Medical, Inc.
+0x00150E, OPENBRAIN TECHNOLOGIES CO., LTD.
+0x00150F, mingjong
+0x001510, Techsphere Co., Ltd
+0x001511, Data Center Systems
+0x001512, Zurich University of Applied Sciences
+0x001513, EFS sas
+0x001514, Hu Zhou NAVA Networks&Electronics Ltd.
+0x001515, Leipold+Co.GmbH
+0x001516, URIEL SYSTEMS INC.
+0x001517, Intel Corporate
+0x001518, Shenzhen 10MOONS Technology Development CO.,Ltd
+0x001519, StoreAge Networking Technologies
+0x00151A, Hunter Engineering Company
+0x00151B, Isilon Systems Inc.
+0x00151C, LENECO
+0x00151D, M2I CORPORATION
+0x00151E, Ethernet Powerlink Standardization Group (EPSG)
+0x00151F, Multivision Intelligent Surveillance (Hong Kong) Ltd
+0x001520, Radiocrafts AS
+0x001521, Horoquartz
+0x001522, Dea Security
+0x001523, Meteor Communications Corporation
+0x001524, Numatics, Inc.
+0x001525, Chamberlain Access Solutions
+0x001526, Remote Technologies Inc
+0x001527, Balboa Instruments
+0x001528, Beacon Medical Products LLC d.b.a. BeaconMedaes
+0x001529, N3 Corporation
+0x00152A, Nokia GmbH
+0x00152B, CISCO SYSTEMS, INC.
+0x00152C, CISCO SYSTEMS, INC.
+0x00152D, TenX Networks, LLC
+0x00152E, PacketHop, Inc.
+0x00152F, Motorola Mobility, Inc.
+0x001530, EMC Corporation
+0x001531, KOCOM
+0x001532, Consumer Technologies Group, LLC
+0x001533, NADAM.CO.,LTD
+0x001534, A Beltrónica-Companhia de Comunicações, Lda
+0x001535, OTE Spa
+0x001536, Powertech co.,Ltd
+0x001537, Ventus Networks
+0x001538, RFID, Inc.
+0x001539, Technodrive SRL
+0x00153A, Shenzhen Syscan Technology Co.,Ltd.
+0x00153B, EMH metering GmbH & Co. KG
+0x00153C, Kprotech Co., Ltd.
+0x00153D, ELIM PRODUCT CO.
+0x00153E, Q-Matic Sweden AB
+0x00153F, Alcatel Alenia Space Italia
+0x001540, Nortel
+0x001541, StrataLight Communications, Inc.
+0x001542, MICROHARD S.R.L.
+0x001543, Aberdeen Test Center
+0x001544, coM.s.a.t. AG
+0x001545, SEECODE Co., Ltd.
+0x001546, ITG Worldwide Sdn Bhd
+0x001547, AiZen Solutions Inc.
+0x001548, CUBE TECHNOLOGIES
+0x001549, Dixtal Biomedica Ind. Com. Ltda
+0x00154A, WANSHIH ELECTRONIC CO., LTD
+0x00154B, Wonde Proud Technology Co., Ltd
+0x00154C, Saunders Electronics
+0x00154D, Netronome Systems, Inc.
+0x00154E, IEC
+0x00154F, one RF Technology
+0x001550, Nits Technology Inc
+0x001551, RadioPulse Inc.
+0x001552, Wi-Gear Inc.
+0x001553, Cytyc Corporation
+0x001554, Atalum Wireless S.A.
+0x001555, DFM GmbH
+0x001556, SAGEM COMMUNICATION
+0x001557, Olivetti
+0x001558, FOXCONN
+0x001559, Securaplane Technologies, Inc.
+0x00155A, DAINIPPON PHARMACEUTICAL CO., LTD.
+0x00155B, Sampo Corporation
+0x00155C, Dresser Wayne
+0x00155D, Microsoft Corporation
+0x00155E, Morgan Stanley
+0x00155F, GreenPeak Technologies
+0x001560, Hewlett-Packard Company
+0x001561, JJPlus Corporation
+0x001562, CISCO SYSTEMS, INC.
+0x001563, CISCO SYSTEMS, INC.
+0x001564, BEHRINGER Spezielle Studiotechnik GmbH
+0x001565, XIAMEN YEALINK NETWORK TECHNOLOGY CO.,LTD
+0x001566, A-First Technology Co., Ltd.
+0x001567, RADWIN Inc.
+0x001568, Dilithium Networks
+0x001569, PECO II, Inc.
+0x00156A, DG2L Technologies Pvt. Ltd.
+0x00156B, Perfisans Networks Corp.
+0x00156C, SANE SYSTEM CO., LTD
+0x00156D, Ubiquiti Networks Inc.
+0x00156E, A. W. Communication Systems Ltd
+0x00156F, Xiranet Communications GmbH
+0x001570, Symbol TechnologiesWholly owned Subsidiary of Motorola
+0x001571, Nolan Systems
+0x001572, Red-Lemon
+0x001573, NewSoft Technology Corporation
+0x001574, Horizon Semiconductors Ltd.
+0x001575, Nevis Networks Inc.
+0x001576, LABiTec - Labor Biomedical Technologies GmbH
+0x001577, Allied Telesis
+0x001578, Audio / Video Innovations
+0x001579, Lunatone Industrielle Elektronik GmbH
+0x00157A, Telefin S.p.A.
+0x00157B, Leuze electronic GmbH + Co. KG
+0x00157C, Dave Networks, Inc.
+0x00157D, POSDATA CO., LTD.
+0x00157E, Weidmüller Interface GmbH & Co. KG
+0x00157F, ChuanG International Holding CO.,LTD.
+0x001580, U-WAY CORPORATION
+0x001581, MAKUS Inc.
+0x001582, Pulse Eight Limited
+0x001583, IVT corporation
+0x001584, Schenck Process GmbH
+0x001585, Aonvision Technolopy Corp.
+0x001586, Xiamen Overseas Chinese Electronic Co., Ltd.
+0x001587, Takenaka Seisakusho Co.,Ltd
+0x001588, Balda Solution Malaysia Sdn Bhd
+0x001589, D-MAX Technology Co.,Ltd
+0x00158A, SURECOM Technology Corp.
+0x00158B, Park Air Systems Ltd
+0x00158C, Liab ApS
+0x00158D, Jennic Ltd
+0x00158E, Plustek.INC
+0x00158F, NTT Advanced Technology Corporation
+0x001590, Hectronic GmbH
+0x001591, RLW Inc.
+0x001592, Facom UK Ltd (Melksham)
+0x001593, U4EA Technologies Inc.
+0x001594, BIXOLON CO.,LTD
+0x001595, Quester Tangent Corporation
+0x001596, ARRIS International
+0x001597, AETA AUDIO SYSTEMS
+0x001598, Kolektor group
+0x001599, Samsung Electronics Co., LTD
+0x00159A, Motorola Mobility, Inc.
+0x00159B, Nortel
+0x00159C, B-KYUNG SYSTEM Co.,Ltd.
+0x00159D, Minicom Advanced Systems ltd
+0x00159E, Mad Catz Interactive Inc
+0x00159F, Terascala, Inc.
+0x0015A0, Nokia Danmark A/S
+0x0015A1, ECA-SINTERS
+0x0015A2, ARRIS International
+0x0015A3, ARRIS International
+0x0015A4, ARRIS International
+0x0015A5, DCI Co., Ltd.
+0x0015A6, Digital Electronics Products Ltd.
+0x0015A7, Robatech AG
+0x0015A8, Motorola Mobility, Inc.
+0x0015A9, KWANG WOO I&C CO.,LTD
+0x0015AA, Rextechnik International Co.,
+0x0015AB, PRO CO SOUND INC
+0x0015AC, Capelon AB
+0x0015AD, Accedian Networks
+0x0015AE, kyung il
+0x0015AF, AzureWave Technologies, Inc.
+0x0015B0, AUTOTELENET CO.,LTD
+0x0015B1, Ambient Corporation
+0x0015B2, Advanced Industrial Computer, Inc.
+0x0015B3, Caretech AB
+0x0015B4, Polymap Wireless LLC
+0x0015B5, CI Network Corp.
+0x0015B6, ShinMaywa Industries, Ltd.
+0x0015B7, Toshiba
+0x0015B8, Tahoe
+0x0015B9, Samsung Electronics Co., Ltd.
+0x0015BA, iba AG
+0x0015BB, SMA Solar Technology AG
+0x0015BC, Develco
+0x0015BD, Group 4 Technology Ltd
+0x0015BE, Iqua Ltd.
+0x0015BF, technicob
+0x0015C0, DIGITAL TELEMEDIA CO.,LTD.
+0x0015C1, SONY Computer Entertainment inc,
+0x0015C2, 3M Germany
+0x0015C3, Ruf Telematik AG
+0x0015C4, FLOVEL CO., LTD.
+0x0015C5, Dell ESG PCBA Test
+0x0015C6, CISCO SYSTEMS, INC.
+0x0015C7, CISCO SYSTEMS, INC.
+0x0015C8, FlexiPanel Ltd
+0x0015C9, Gumstix, Inc
+0x0015CA, TeraRecon, Inc.
+0x0015CB, Surf Communication Solutions Ltd.
+0x0015CC, UQUEST, LTD.
+0x0015CD, Exartech International Corp.
+0x0015CE, ARRIS International
+0x0015CF, ARRIS International
+0x0015D0, ARRIS International
+0x0015D1, ARRIS Group, Inc.
+0x0015D2, Xantech Corporation
+0x0015D3, Pantech&Curitel Communications, Inc.
+0x0015D4, Emitor AB
+0x0015D5, NICEVT
+0x0015D6, OSLiNK Sp. z o.o.
+0x0015D7, Reti Corporation
+0x0015D8, Interlink Electronics
+0x0015D9, PKC Electronics Oy
+0x0015DA, IRITEL A.D.
+0x0015DB, Canesta Inc.
+0x0015DC, KT&C Co., Ltd.
+0x0015DD, IP Control Systems Ltd.
+0x0015DE, Nokia Danmark A/S
+0x0015DF, Clivet S.p.A.
+0x0015E0, ST-Ericsson
+0x0015E1, Picochip Ltd
+0x0015E2, Dr.Ing. Herbert Knauer GmbH
+0x0015E3, Dream Technologies Corporation
+0x0015E4, Zimmer Elektromedizin
+0x0015E5, Cheertek Inc.
+0x0015E6, MOBILE TECHNIKA Inc.
+0x0015E7, Quantec ProAudio
+0x0015E8, Nortel
+0x0015E9, D-Link Corporation
+0x0015EA, Tellumat (Pty) Ltd
+0x0015EB, ZTE CORPORATION
+0x0015EC, Boca Devices LLC
+0x0015ED, Fulcrum Microsystems, Inc.
+0x0015EE, Omnex Control Systems
+0x0015EF, NEC TOKIN Corporation
+0x0015F0, EGO BV
+0x0015F1, KYLINK Communications Corp.
+0x0015F2, ASUSTek COMPUTER INC.
+0x0015F3, PELTOR AB
+0x0015F4, Eventide
+0x0015F5, Sustainable Energy Systems
+0x0015F6, SCIENCE AND ENGINEERING SERVICES, INC.
+0x0015F7, Wintecronics Ltd.
+0x0015F8, Kingtronics Industrial Co. Ltd.
+0x0015F9, CISCO SYSTEMS, INC.
+0x0015FA, CISCO SYSTEMS, INC.
+0x0015FB, setex schermuly textile computer gmbh
+0x0015FC, Littelfuse Startco
+0x0015FD, Complete Media Systems
+0x0015FE, SCHILLING ROBOTICS LLC
+0x0015FF, Novatel Wireless, Inc.
+0x001600, CelleBrite Mobile Synchronization
+0x001601, Buffalo Inc.
+0x001602, CEYON TECHNOLOGY CO.,LTD.
+0x001603, COOLKSKY Co., LTD
+0x001604, Sigpro
+0x001605, YORKVILLE SOUND INC.
+0x001606, Ideal Industries
+0x001607, Curves International Inc.
+0x001608, Sequans Communications
+0x001609, Unitech electronics co., ltd.
+0x00160A, SWEEX Europe BV
+0x00160B, TVWorks LLC
+0x00160C, LPL DEVELOPMENT S.A. DE C.V
+0x00160D, Be Here Corporation
+0x00160E, Optica Technologies Inc.
+0x00160F, BADGER METER INC
+0x001610, Carina Technology
+0x001611, Altecon Srl
+0x001612, Otsuka Electronics Co., Ltd.
+0x001613, LibreStream Technologies Inc.
+0x001614, Picosecond Pulse Labs
+0x001615, Nittan Company, Limited
+0x001616, BROWAN COMMUNICATION INC.
+0x001617, MSI
+0x001618, HIVION Co., Ltd.
+0x001619, La Factoría de Comunicaciones Aplicadas,S.L.
+0x00161A, Dametric AB
+0x00161B, Micronet Corporation
+0x00161C, e:cue
+0x00161D, Innovative Wireless Technologies, Inc.
+0x00161E, Woojinnet
+0x00161F, SUNWAVETEC Co., Ltd.
+0x001620, Sony Ericsson Mobile Communications AB
+0x001621, Colorado Vnet
+0x001622, BBH SYSTEMS GMBH
+0x001623, Interval Media
+0x001624, Teneros, Inc.
+0x001625, Impinj, Inc.
+0x001626, Motorola Mobility, Inc.
+0x001627, embedded-logic DESIGN AND MORE GmbH
+0x001628, Ultra Electronics Manufacturing and Card Systems
+0x001629, Nivus GmbH
+0x00162A, Antik computers & communications s.r.o.
+0x00162B, Togami Electric Mfg.co.,Ltd.
+0x00162C, Xanboo
+0x00162D, STNet Co., Ltd.
+0x00162E, Space Shuttle Hi-Tech Co., Ltd.
+0x00162F, Geutebrück GmbH
+0x001630, Vativ Technologies
+0x001631, Xteam
+0x001632, SAMSUNG ELECTRONICS CO., LTD.
+0x001633, Oxford Diagnostics Ltd.
+0x001634, Mathtech, Inc.
+0x001635, Hewlett-Packard Company
+0x001636, Quanta Computer Inc.
+0x001637, CITEL SpA
+0x001638, TECOM Co., Ltd.
+0x001639, UBIQUAM Co.,Ltd
+0x00163A, YVES TECHNOLOGY CO., LTD.
+0x00163B, VertexRSI/General Dynamics
+0x00163C, Rebox B.V.
+0x00163D, Tsinghua Tongfang Legend Silicon Tech. Co., Ltd.
+0x00163E, Xensource, Inc.
+0x00163F, CReTE SYSTEMS Inc.
+0x001640, Asmobile Communication Inc.
+0x001641, Universal Global Scientific Industrial Co., Ltd.
+0x001642, Pangolin
+0x001643, Sunhillo Corporation
+0x001644, LITE-ON Technology Corp.
+0x001645, Power Distribution, Inc.
+0x001646, CISCO SYSTEMS, INC.
+0x001647, CISCO SYSTEMS, INC.
+0x001648, SSD Company Limited
+0x001649, SetOne GmbH
+0x00164A, Vibration Technology Limited
+0x00164B, Quorion Data Systems GmbH
+0x00164C, PLANET INT Co., Ltd
+0x00164D, Alcatel North America IP Division
+0x00164E, Nokia Danmark A/S
+0x00164F, World Ethnic Broadcastin Inc.
+0x001650, Herley General Microwave Israel.
+0x001651, Exeo Systems
+0x001652, Hoatech Technologies, Inc.
+0x001653, LEGO System A/S IE Electronics Division
+0x001654, Flex-P Industries Sdn. Bhd.
+0x001655, FUHO TECHNOLOGY Co., LTD
+0x001656, Nintendo Co., Ltd.
+0x001657, Aegate Ltd
+0x001658, Fusiontech Technologies Inc.
+0x001659, Z.M.P. RADWAG
+0x00165A, Harman Specialty Group
+0x00165B, Grip Audio
+0x00165C, Trackflow Ltd
+0x00165D, AirDefense, Inc.
+0x00165E, Precision I/O
+0x00165F, Fairmount Automation
+0x001660, Nortel
+0x001661, Novatium Solutions (P) Ltd
+0x001662, Liyuh Technology Ltd.
+0x001663, KBT Mobile
+0x001664, Prod-El SpA
+0x001665, Cellon France
+0x001666, Quantier Communication Inc.
+0x001667, A-TEC Subsystem INC.
+0x001668, Eishin Electronics
+0x001669, MRV Communication (Networks) LTD
+0x00166A, TPS
+0x00166B, Samsung Electronics
+0x00166C, Samsung Electonics Digital Video System Division
+0x00166D, Yulong Computer Telecommunication Scientific(shenzhen)Co.,Lt
+0x00166E, Arbitron Inc.
+0x00166F, Intel Corporation
+0x001670, SKNET Corporation
+0x001671, Symphox Information Co.
+0x001672, Zenway enterprise ltd
+0x001673, Bury GmbH & Co. KG
+0x001674, EuroCB (Phils.), Inc.
+0x001675, Motorola Mobility, Inc.
+0x001676, Intel Corporation
+0x001677, Bihl + Wiedemann GmbH
+0x001678, SHENZHEN BAOAN GAOKE ELECTRONICS CO., LTD
+0x001679, eOn Communications
+0x00167A, Skyworth Overseas Dvelopment Ltd.
+0x00167B, Haver&Boecker
+0x00167C, iRex Technologies BV
+0x00167D, Sky-Line Information Co., Ltd.
+0x00167E, DIBOSS.CO.,LTD
+0x00167F, Bluebird Soft Inc.
+0x001680, Bally Gaming + Systems
+0x001681, Vector Informatik GmbH
+0x001682, Pro Dex, Inc
+0x001683, WEBIO International Co.,.Ltd.
+0x001684, Donjin Co.,Ltd.
+0x001685, Elisa Oyj
+0x001686, Karl Storz Imaging
+0x001687, Chubb CSC-Vendor AP
+0x001688, ServerEngines LLC
+0x001689, Pilkor Electronics Co., Ltd
+0x00168A, id-Confirm Inc
+0x00168B, Paralan Corporation
+0x00168C, DSL Partner AS
+0x00168D, KORWIN CO., Ltd.
+0x00168E, Vimicro corporation
+0x00168F, GN Netcom as
+0x001690, J-TEK INCORPORATION
+0x001691, Moser-Baer AG
+0x001692, Scientific-Atlanta, Inc.
+0x001693, PowerLink Technology Inc.
+0x001694, Sennheiser Communications A/S
+0x001695, AVC Technology (International) Limited
+0x001696, QDI Technology (H.K.) Limited
+0x001697, NEC Corporation
+0x001698, T&A Mobile Phones
+0x001699, Tonic DVB Marketing Ltd
+0x00169A, Quadrics Ltd
+0x00169B, Alstom Transport
+0x00169C, CISCO SYSTEMS, INC.
+0x00169D, CISCO SYSTEMS, INC.
+0x00169E, TV One Ltd
+0x00169F, Vimtron Electronics Co., Ltd.
+0x0016A0, Auto-Maskin
+0x0016A1, 3Leaf Networks
+0x0016A2, CentraLite Systems, Inc.
+0x0016A3, Ingeteam Transmission&Distribution, S.A.
+0x0016A4, Ezurio Ltd
+0x0016A5, Tandberg Storage ASA
+0x0016A6, Dovado FZ-LLC
+0x0016A7, AWETA G&P
+0x0016A8, CWT CO., LTD.
+0x0016A9, 2EI
+0x0016AA, Kei Communication Technology Inc.
+0x0016AB, PBI-Dansensor A/S
+0x0016AC, Toho Technology Corp.
+0x0016AD, BT-Links Company Limited
+0x0016AE, INVENTEL
+0x0016AF, Shenzhen Union Networks Equipment Co.,Ltd.
+0x0016B0, VK Corporation
+0x0016B1, KBS
+0x0016B2, DriveCam Inc
+0x0016B3, Photonicbridges (China) Co., Ltd.
+0x0016B4, PRIVATE
+0x0016B5, Motorola Mobility, Inc.
+0x0016B6, Cisco-Linksys
+0x0016B7, Seoul Commtech
+0x0016B8, Sony Ericsson Mobile Communications
+0x0016B9, ProCurve Networking
+0x0016BA, WEATHERNEWS INC.
+0x0016BB, Law-Chain Computer Technology Co Ltd
+0x0016BC, Nokia Danmark A/S
+0x0016BD, ATI Industrial Automation
+0x0016BE, INFRANET, Inc.
+0x0016BF, PaloDEx Group Oy
+0x0016C0, Semtech Corporation
+0x0016C1, Eleksen Ltd
+0x0016C2, Avtec Systems Inc
+0x0016C3, BA Systems Inc
+0x0016C4, SiRF Technology, Inc.
+0x0016C5, Shenzhen Xing Feng Industry Co.,Ltd
+0x0016C6, North Atlantic Industries
+0x0016C7, CISCO SYSTEMS, INC.
+0x0016C8, CISCO SYSTEMS, INC.
+0x0016C9, NAT Seattle, Inc.
+0x0016CA, Nortel
+0x0016CB, Apple Computer
+0x0016CC, Xcute Mobile Corp.
+0x0016CD, HIJI HIGH-TECH CO., LTD.
+0x0016CE, Hon Hai Precision Ind. Co., Ltd.
+0x0016CF, Hon Hai Precision Ind. Co., Ltd.
+0x0016D0, ATech elektronika d.o.o.
+0x0016D1, ZAT a.s.
+0x0016D2, Caspian
+0x0016D3, Wistron Corporation
+0x0016D4, Compal Communications, Inc.
+0x0016D5, Synccom Co., Ltd
+0x0016D6, TDA Tech Pty Ltd
+0x0016D7, Sunways AG
+0x0016D8, Senea AB
+0x0016D9, NINGBO BIRD CO.,LTD.
+0x0016DA, Futronic Technology Co. Ltd.
+0x0016DB, Samsung Electronics Co., Ltd.
+0x0016DC, ARCHOS
+0x0016DD, Gigabeam Corporation
+0x0016DE, FAST Inc
+0x0016DF, Lundinova AB
+0x0016E0, 3Com Ltd
+0x0016E1, SiliconStor, Inc.
+0x0016E2, American Fibertek, Inc.
+0x0016E3, ASKEY COMPUTER CORP.
+0x0016E4, VANGUARD SECURITY ENGINEERING CORP.
+0x0016E5, FORDLEY DEVELOPMENT LIMITED
+0x0016E6, GIGA-BYTE TECHNOLOGY CO.,LTD.
+0x0016E7, Dynamix Promotions Limited
+0x0016E8, Sigma Designs, Inc.
+0x0016E9, Tiba Medical Inc
+0x0016EA, Intel Corporation
+0x0016EB, Intel Corporation
+0x0016EC, Elitegroup Computer Systems Co., Ltd.
+0x0016ED, Digital Safety Technologies, Inc
+0x0016EE, RoyalDigital Inc.
+0x0016EF, Koko Fitness, Inc.
+0x0016F0, Dell
+0x0016F1, OmniSense, LLC
+0x0016F2, Dmobile System Co., Ltd.
+0x0016F3, CAST Information Co., Ltd
+0x0016F4, Eidicom Co., Ltd.
+0x0016F5, Dalian Golden Hualu Digital Technology Co.,Ltd
+0x0016F6, Video Products Group
+0x0016F7, L-3 Communications, Aviation Recorders
+0x0016F8, AVIQTECH TECHNOLOGY CO., LTD.
+0x0016F9, CETRTA POT, d.o.o., Kranj
+0x0016FA, ECI Telecom Ltd.
+0x0016FB, SHENZHEN MTC CO.,LTD.
+0x0016FC, TOHKEN CO.,LTD.
+0x0016FD, Jaty Electronics
+0x0016FE, Alps Electric Co., Ltd
+0x0016FF, Wamin Optocomm Mfg Corp
+0x001700, Motorola Mobility, Inc.
+0x001701, KDE, Inc.
+0x001702, Osung Midicom Co., Ltd
+0x001703, MOSDAN Internation Co.,Ltd
+0x001704, Shinco Electronics Group Co.,Ltd
+0x001705, Methode Electronics
+0x001706, Techfaith Wireless Communication Technology Limited.
+0x001707, InGrid, Inc
+0x001708, Hewlett-Packard Company
+0x001709, Exalt Communications
+0x00170A, INEW DIGITAL COMPANY
+0x00170B, Contela, Inc.
+0x00170C, Twig Com Ltd.
+0x00170D, Dust Networks Inc.
+0x00170E, CISCO SYSTEMS, INC.
+0x00170F, CISCO SYSTEMS, INC.
+0x001710, Casa Systems Inc.
+0x001711, GE Healthcare Bio-Sciences AB
+0x001712, ISCO International
+0x001713, Tiger NetCom
+0x001714, BR Controls Nederland bv
+0x001715, Qstik
+0x001716, Qno Technology Inc.
+0x001717, Leica Geosystems AG
+0x001718, Vansco Electronics Oy
+0x001719, AudioCodes USA, Inc
+0x00171A, Winegard Company
+0x00171B, Innovation Lab Corp.
+0x00171C, NT MicroSystems, Inc.
+0x00171D, DIGIT
+0x00171E, Theo Benning GmbH & Co. KG
+0x00171F, IMV Corporation
+0x001720, Image Sensing Systems, Inc.
+0x001721, FITRE S.p.A.
+0x001722, Hanazeder Electronic GmbH
+0x001723, Summit Data Communications
+0x001724, Studer Professional Audio GmbH
+0x001725, Liquid Computing
+0x001726, m2c Electronic Technology Ltd.
+0x001727, Thermo Ramsey Italia s.r.l.
+0x001728, Selex Communications
+0x001729, Ubicod Co.LTD
+0x00172A, Proware Technology Corp.
+0x00172B, Global Technologies Inc.
+0x00172C, TAEJIN INFOTECH
+0x00172D, Axcen Photonics Corporation
+0x00172E, FXC Inc.
+0x00172F, NeuLion Incorporated
+0x001730, Automation Electronics
+0x001731, ASUSTek COMPUTER INC.
+0x001732, Science-Technical Center "RISSA"
+0x001733, SFR
+0x001734, ADC Telecommunications
+0x001735, PRIVATE
+0x001736, iiTron Inc.
+0x001737, Industrie Dial Face S.p.A.
+0x001738, International Business Machines
+0x001739, Bright Headphone Electronics Company
+0x00173A, Reach Systems Inc.
+0x00173B, Cisco Systems, Inc.
+0x00173C, Extreme Engineering Solutions
+0x00173D, Neology
+0x00173E, LeucotronEquipamentos Ltda.
+0x00173F, Belkin Corporation
+0x001740, Bluberi Gaming Technologies Inc
+0x001741, DEFIDEV
+0x001742, FUJITSU LIMITED
+0x001743, Deck Srl
+0x001744, Araneo Ltd.
+0x001745, INNOTZ CO., Ltd
+0x001746, Freedom9 Inc.
+0x001747, Trimble
+0x001748, Neokoros Brasil Ltda
+0x001749, HYUNDAE YONG-O-SA CO.,LTD
+0x00174A, SOCOMEC
+0x00174B, Nokia Danmark A/S
+0x00174C, Millipore
+0x00174D, DYNAMIC NETWORK FACTORY, INC.
+0x00174E, Parama-tech Co.,Ltd.
+0x00174F, iCatch Inc.
+0x001750, GSI Group, MicroE Systems
+0x001751, Online Corporation
+0x001752, DAGS, Inc
+0x001753, nFore Technology Inc.
+0x001754, Arkino HiTOP Corporation Limited
+0x001755, GE Security
+0x001756, Vinci Labs Oy
+0x001757, RIX TECHNOLOGY LIMITED
+0x001758, ThruVision Ltd
+0x001759, CISCO SYSTEMS, INC.
+0x00175A, CISCO SYSTEMS, INC.
+0x00175B, ACS Solutions Switzerland Ltd.
+0x00175C, SHARP CORPORATION
+0x00175D, Dongseo system.
+0x00175E, Zed-3
+0x00175F, XENOLINK Communications Co., Ltd.
+0x001760, Naito Densei Machida MFG.CO.,LTD
+0x001761, ZKSoftware Inc.
+0x001762, Solar Technology, Inc.
+0x001763, Essentia S.p.A.
+0x001764, ATMedia GmbH
+0x001765, Nortel
+0x001766, Accense Technology, Inc.
+0x001767, Earforce AS
+0x001768, Zinwave Ltd
+0x001769, Cymphonix Corp
+0x00176A, Avago Technologies
+0x00176B, Kiyon, Inc.
+0x00176C, Pivot3, Inc.
+0x00176D, CORE CORPORATION
+0x00176E, DUCATI SISTEMI
+0x00176F, PAX Computer Technology(Shenzhen) Ltd.
+0x001770, Arti Industrial Electronics Ltd.
+0x001771, APD Communications Ltd
+0x001772, ASTRO Strobel Kommunikationssysteme GmbH
+0x001773, Laketune Technologies Co. Ltd
+0x001774, Elesta GmbH
+0x001775, TTE Germany GmbH
+0x001776, Meso Scale Diagnostics, LLC
+0x001777, Obsidian Research Corporation
+0x001778, Central Music Co.
+0x001779, QuickTel
+0x00177A, ASSA ABLOY AB
+0x00177B, Azalea Networks inc
+0x00177C, Smartlink Network Systems Limited
+0x00177D, IDT International Limited
+0x00177E, Meshcom Technologies Inc.
+0x00177F, Worldsmart Retech
+0x001780, Applied Biosystems B.V.
+0x001781, Greystone Data System, Inc.
+0x001782, LoBenn Inc.
+0x001783, Texas Instruments
+0x001784, Motorola Mobility, Inc.
+0x001785, Sparr Electronics Ltd
+0x001786, wisembed
+0x001787, Brother, Brother & Sons ApS
+0x001788, Philips Lighting BV
+0x001789, Zenitron Corporation
+0x00178A, DARTS TECHNOLOGIES CORP.
+0x00178B, Teledyne Technologies Incorporated
+0x00178C, Independent Witness, Inc
+0x00178D, Checkpoint Systems, Inc.
+0x00178E, Gunnebo Cash Automation AB
+0x00178F, NINGBO YIDONG ELECTRONIC CO.,LTD.
+0x001790, HYUNDAI DIGITECH Co, Ltd.
+0x001791, LinTech GmbH
+0x001792, Falcom Wireless Comunications Gmbh
+0x001793, Tigi Corporation
+0x001794, CISCO SYSTEMS, INC.
+0x001795, CISCO SYSTEMS, INC.
+0x001796, Rittmeyer AG
+0x001797, Telsy Elettronica S.p.A.
+0x001798, Azonic Technology Co., LTD
+0x001799, SmarTire Systems Inc.
+0x00179A, D-Link Corporation
+0x00179B, Chant Sincere CO., LTD.
+0x00179C, DEPRAG SCHULZ GMBH u. CO.
+0x00179D, Kelman Limited
+0x00179E, Sirit Inc
+0x00179F, Apricorn
+0x0017A0, RoboTech srl
+0x0017A1, 3soft inc.
+0x0017A2, Camrivox Ltd.
+0x0017A3, MIX s.r.l.
+0x0017A4, Hewlett-Packard Company
+0x0017A5, Ralink Technology Corp
+0x0017A6, YOSIN ELECTRONICS CO., LTD.
+0x0017A7, Mobile Computing Promotion Consortium
+0x0017A8, EDM Corporation
+0x0017A9, Sentivision
+0x0017AA, elab-experience inc.
+0x0017AB, Nintendo Co., Ltd.
+0x0017AC, O'Neil Product Development Inc.
+0x0017AD, AceNet Corporation
+0x0017AE, GAI-Tronics
+0x0017AF, Enermet
+0x0017B0, Nokia Danmark A/S
+0x0017B1, ACIST Medical Systems, Inc.
+0x0017B2, SK Telesys
+0x0017B3, Aftek Infosys Limited
+0x0017B4, Remote Security Systems, LLC
+0x0017B5, Peerless Systems Corporation
+0x0017B6, Aquantia
+0x0017B7, Tonze Technology Co.
+0x0017B8, NOVATRON CO., LTD.
+0x0017B9, Gambro Lundia AB
+0x0017BA, SEDO CO., LTD.
+0x0017BB, Syrinx Industrial Electronics
+0x0017BC, Touchtunes Music Corporation
+0x0017BD, Tibetsystem
+0x0017BE, Tratec Telecom B.V.
+0x0017BF, Coherent Research Limited
+0x0017C0, PureTech Systems, Inc.
+0x0017C1, CM Precision Technology LTD.
+0x0017C2, ADB Broadband Italia
+0x0017C3, KTF Technologies Inc.
+0x0017C4, Quanta Microsystems, INC.
+0x0017C5, SonicWALL
+0x0017C6, Cross Match Technologies Inc
+0x0017C7, MARA Systems Consulting AB
+0x0017C8, Kyocera Mita Corporation
+0x0017C9, Samsung Electronics Co., Ltd.
+0x0017CA, Qisda Corporation
+0x0017CB, Juniper Networks
+0x0017CC, Alcatel-Lucent
+0x0017CD, CEC Wireless R&D Ltd.
+0x0017CE, Screen Service Spa
+0x0017CF, iMCA-GmbH
+0x0017D0, Opticom Communications, LLC
+0x0017D1, Nortel
+0x0017D2, THINLINX PTY LTD
+0x0017D3, Etymotic Research, Inc.
+0x0017D4, Monsoon Multimedia, Inc
+0x0017D5, Samsung Electronics Co., Ltd.
+0x0017D6, Bluechips Microhouse Co.,Ltd.
+0x0017D7, ION Geophysical Corporation Inc.
+0x0017D8, Magnum Semiconductor, Inc.
+0x0017D9, AAI Corporation
+0x0017DA, Spans Logic
+0x0017DB, CANKO TECHNOLOGIES INC.
+0x0017DC, DAEMYUNG ZERO1
+0x0017DD, Clipsal Australia
+0x0017DE, Advantage Six Ltd
+0x0017DF, CISCO SYSTEMS, INC.
+0x0017E0, CISCO SYSTEMS, INC.
+0x0017E1, DACOS Technologies Co., Ltd.
+0x0017E2, Motorola Mobility, Inc.
+0x0017E3, Texas Instruments
+0x0017E4, Texas Instruments
+0x0017E5, Texas Instruments
+0x0017E6, Texas Instruments
+0x0017E7, Texas Instruments
+0x0017E8, Texas Instruments
+0x0017E9, Texas Instruments
+0x0017EA, Texas Instruments
+0x0017EB, Texas Instruments
+0x0017EC, Texas Instruments
+0x0017ED, WooJooIT Ltd.
+0x0017EE, Motorola Mobility, Inc.
+0x0017EF, IBM Corp
+0x0017F0, SZCOM Broadband Network Technology Co.,Ltd
+0x0017F1, Renu Electronics Pvt Ltd
+0x0017F2, Apple Computer
+0x0017F3, Harris Corparation
+0x0017F4, ZERON ALLIANCE
+0x0017F5, LIG NEOPTEK
+0x0017F6, Pyramid Meriden Inc.
+0x0017F7, CEM Solutions Pvt Ltd
+0x0017F8, Motech Industries Inc.
+0x0017F9, Forcom Sp. z o.o.
+0x0017FA, Microsoft Corporation
+0x0017FB, FA
+0x0017FC, Suprema Inc.
+0x0017FD, Amulet Hotkey
+0x0017FE, TALOS SYSTEM INC.
+0x0017FF, PLAYLINE Co.,Ltd.
+0x001800, UNIGRAND LTD
+0x001801, Actiontec Electronics, Inc
+0x001802, Alpha Networks Inc.
+0x001803, ArcSoft Shanghai Co. LTD
+0x001804, E-TEK DIGITAL TECHNOLOGY LIMITED
+0x001805, Beijing InHand Networking Technology Co.,Ltd.
+0x001806, Hokkei Industries Co., Ltd.
+0x001807, Fanstel Corp.
+0x001808, SightLogix, Inc.
+0x001809, CRESYN
+0x00180A, Meraki, Inc.
+0x00180B, Brilliant Telecommunications
+0x00180C, Optelian Access Networks
+0x00180D, Terabytes Server Storage Tech Corp
+0x00180E, Avega Systems
+0x00180F, Nokia Danmark A/S
+0x001810, IPTrade S.A.
+0x001811, Neuros Technology International, LLC.
+0x001812, Beijing Xinwei Telecom Technology Co., Ltd.
+0x001813, Sony Ericsson Mobile Communications
+0x001814, Mitutoyo Corporation
+0x001815, GZ Technologies, Inc.
+0x001816, Ubixon Co., Ltd.
+0x001817, D. E. Shaw Research, LLC
+0x001818, CISCO SYSTEMS, INC.
+0x001819, CISCO SYSTEMS, INC.
+0x00181A, AVerMedia Information Inc.
+0x00181B, TaiJin Metal Co., Ltd.
+0x00181C, Exterity Limited
+0x00181D, ASIA ELECTRONICS CO.,LTD
+0x00181E, GDX Technologies Ltd.
+0x00181F, Palmmicro Communications
+0x001820, w5networks
+0x001821, SINDORICOH
+0x001822, CEC TELECOM CO.,LTD.
+0x001823, Delta Electronics, Inc.
+0x001824, Kimaldi Electronics, S.L.
+0x001825, PRIVATE
+0x001826, Cale Access AB
+0x001827, NEC UNIFIED SOLUTIONS NEDERLAND B.V.
+0x001828, e2v technologies (UK) ltd.
+0x001829, Gatsometer
+0x00182A, Taiwan Video & Monitor
+0x00182B, Softier
+0x00182C, Ascend Networks, Inc.
+0x00182D, Artec Design
+0x00182E, XStreamHD, LLC
+0x00182F, Texas Instruments
+0x001830, Texas Instruments
+0x001831, Texas Instruments
+0x001832, Texas Instruments
+0x001833, Texas Instruments
+0x001834, Texas Instruments
+0x001835, Thoratec / ITC
+0x001836, Reliance Electric Limited
+0x001837, Universal ABIT Co., Ltd.
+0x001838, PanAccess Communications,Inc.
+0x001839, Cisco-Linksys LLC
+0x00183A, Westell Technologies
+0x00183B, CENITS Co., Ltd.
+0x00183C, Encore Software Limited
+0x00183D, Vertex Link Corporation
+0x00183E, Digilent, Inc
+0x00183F, 2Wire, Inc
+0x001840, 3 Phoenix, Inc.
+0x001841, High Tech Computer Corp
+0x001842, Nokia Danmark A/S
+0x001843, Dawevision Ltd
+0x001844, Heads Up Technologies, Inc.
+0x001845, NPL Pulsar Ltd.
+0x001846, Crypto S.A.
+0x001847, AceNet Technology Inc.
+0x001848, Vecima Networks Inc.
+0x001849, Pigeon Point Systems
+0x00184A, Catcher, Inc.
+0x00184B, Las Vegas Gaming, Inc.
+0x00184C, Bogen Communications
+0x00184D, Netgear Inc.
+0x00184E, Lianhe Technologies, Inc.
+0x00184F, 8 Ways Technology Corp.
+0x001850, Secfone Kft
+0x001851, SWsoft
+0x001852, StorLink Semiconductors, Inc.
+0x001853, Atera Networks LTD.
+0x001854, Argard Co., Ltd
+0x001855, Aeromaritime Systembau GmbH
+0x001856, EyeFi, Inc
+0x001857, Unilever R&D
+0x001858, TagMaster AB
+0x001859, Strawberry Linux Co.,Ltd.
+0x00185A, uControl, Inc.
+0x00185B, Network Chemistry, Inc
+0x00185C, EDS Lab Pte Ltd
+0x00185D, TAIGUEN TECHNOLOGY (SHEN-ZHEN) CO., LTD.
+0x00185E, Nexterm Inc.
+0x00185F, TAC Inc.
+0x001860, SIM Technology Group Shanghai Simcom Ltd.,
+0x001861, Ooma, Inc.
+0x001862, Seagate Technology
+0x001863, Veritech Electronics Limited
+0x001864, Eaton Corporation
+0x001865, Siemens Healthcare Diagnostics Manufacturing Ltd
+0x001866, Leutron Vision
+0x001867, Evolution Robotics Retail
+0x001868, Scientific Atlanta, A Cisco Company
+0x001869, KINGJIM
+0x00186A, Global Link Digital Technology Co,.LTD
+0x00186B, Sambu Communics CO., LTD.
+0x00186C, Neonode AB
+0x00186D, Zhenjiang Sapphire Electronic Industry CO.
+0x00186E, 3Com Ltd
+0x00186F, Setha Industria Eletronica LTDA
+0x001870, E28 Shanghai Limited
+0x001871, Hewlett-Packard Company
+0x001872, Expertise Engineering
+0x001873, CISCO SYSTEMS, INC.
+0x001874, CISCO SYSTEMS, INC.
+0x001875, AnaCise Testnology Pte Ltd
+0x001876, WowWee Ltd.
+0x001877, Amplex A/S
+0x001878, Mackware GmbH
+0x001879, dSys
+0x00187A, Wiremold
+0x00187B, 4NSYS Co. Ltd.
+0x00187C, INTERCROSS, LLC
+0x00187D, Armorlink shanghai Co. Ltd
+0x00187E, RGB Spectrum
+0x00187F, ZODIANET
+0x001880, Maxim Integrated Products
+0x001881, Buyang Electronics Industrial Co., Ltd
+0x001882, Huawei Technologies Co., Ltd.
+0x001883, FORMOSA21 INC.
+0x001884, Fon Technology S.L.
+0x001885, Avigilon Corporation
+0x001886, EL-TECH, INC.
+0x001887, Metasystem SpA
+0x001888, GOTIVE a.s.
+0x001889, WinNet Solutions Limited
+0x00188A, Infinova LLC
+0x00188B, Dell ESG PCBA Test
+0x00188C, Mobile Action Technology Inc.
+0x00188D, Nokia Danmark A/S
+0x00188E, Ekahau, Inc.
+0x00188F, Montgomery Technology, Inc.
+0x001890, RadioCOM, s.r.o.
+0x001891, Zhongshan General K-mate Electronics Co., Ltd
+0x001892, ads-tec GmbH
+0x001893, SHENZHEN PHOTON BROADBAND TECHNOLOGY CO.,LTD
+0x001894, zimocom
+0x001895, Hansun Technologies Inc.
+0x001896, Great Well Electronic LTD
+0x001897, JESS-LINK PRODUCTS Co., LTD
+0x001898, KINGSTATE ELECTRONICS CORPORATION
+0x001899, ShenZhen jieshun Science&Technology Industry CO,LTD.
+0x00189A, HANA Micron Inc.
+0x00189B, Thomson Inc.
+0x00189C, Weldex Corporation
+0x00189D, Navcast Inc.
+0x00189E, OMNIKEY GmbH.
+0x00189F, Lenntek Corporation
+0x0018A0, Cierma Ascenseurs
+0x0018A1, Tiqit Computers, Inc.
+0x0018A2, XIP Technology AB
+0x0018A3, ZIPPY TECHNOLOGY CORP.
+0x0018A4, Motorola Mobility, Inc.
+0x0018A5, ADigit Technologies Corp.
+0x0018A6, Persistent Systems, LLC
+0x0018A7, Yoggie Security Systems LTD.
+0x0018A8, AnNeal Technology Inc.
+0x0018A9, Ethernet Direct Corporation
+0x0018AA, Protec Fire Detection plc
+0x0018AB, BEIJING LHWT MICROELECTRONICS INC.
+0x0018AC, Shanghai Jiao Da HISYS Technology Co. Ltd.
+0x0018AD, NIDEC SANKYO CORPORATION
+0x0018AE, TVT CO.,LTD
+0x0018AF, Samsung Electronics Co., Ltd.
+0x0018B0, Nortel
+0x0018B1, IBM Corp
+0x0018B2, ADEUNIS RF
+0x0018B3, TEC WizHome Co., Ltd.
+0x0018B4, Dawon Media Inc.
+0x0018B5, Magna Carta
+0x0018B6, S3C, Inc.
+0x0018B7, D3 LED, LLC
+0x0018B8, New Voice International AG
+0x0018B9, CISCO SYSTEMS, INC.
+0x0018BA, CISCO SYSTEMS, INC.
+0x0018BB, Eliwell Controls srl
+0x0018BC, ZAO NVP Bolid
+0x0018BD, SHENZHEN DVBWORLD TECHNOLOGY CO., LTD.
+0x0018BE, ANSA Corporation
+0x0018BF, Essence Technology Solution, Inc.
+0x0018C0, Motorola Mobility, Inc.
+0x0018C1, Almitec Informática e Comércio
+0x0018C2, Firetide, Inc
+0x0018C3, CS Corporation
+0x0018C4, Raba Technologies LLC
+0x0018C5, Nokia Danmark A/S
+0x0018C6, OPW Fuel Management Systems
+0x0018C7, Real Time Automation
+0x0018C8, ISONAS Inc.
+0x0018C9, EOps Technology Limited
+0x0018CA, Viprinet GmbH
+0x0018CB, Tecobest Technology Limited
+0x0018CC, AXIOHM SAS
+0x0018CD, Erae Electronics Industry Co., Ltd
+0x0018CE, Dreamtech Co., Ltd
+0x0018CF, Baldor Electric Company
+0x0018D0, AtRoad, A Trimble Company
+0x0018D1, Siemens Home & Office Comm. Devices
+0x0018D2, High-Gain Antennas LLC
+0x0018D3, TEAMCAST
+0x0018D4, Unified Display Interface SIG
+0x0018D5, REIGNCOM
+0x0018D6, Swirlnet A/S
+0x0018D7, Javad Navigation Systems Inc.
+0x0018D8, ARCH METER Corporation
+0x0018D9, Santosha Internatonal, Inc
+0x0018DA, AMBER wireless GmbH
+0x0018DB, EPL Technology Ltd
+0x0018DC, Prostar Co., Ltd.
+0x0018DD, Silicondust Engineering Ltd
+0x0018DE, Intel Corporation
+0x0018DF, The Morey Corporation
+0x0018E0, ANAVEO
+0x0018E1, Verkerk Service Systemen
+0x0018E2, Topdata Sistemas de Automacao Ltda
+0x0018E3, Visualgate Systems, Inc.
+0x0018E4, YIGUANG
+0x0018E5, Adhoco AG
+0x0018E6, Computer Hardware Design SIA
+0x0018E7, Cameo Communications, INC.
+0x0018E8, Hacetron Corporation
+0x0018E9, Numata Corporation
+0x0018EA, Alltec GmbH
+0x0018EB, BroVis Wireless Networks
+0x0018EC, Welding Technology Corporation
+0x0018ED, Accutech Ultrasystems Co., Ltd.
+0x0018EE, Videology Imaging Solutions, Inc.
+0x0018EF, Escape Communications, Inc.
+0x0018F0, JOYTOTO Co., Ltd.
+0x0018F1, Chunichi Denshi Co.,LTD.
+0x0018F2, Beijing Tianyu Communication Equipment Co., Ltd
+0x0018F3, ASUSTek COMPUTER INC.
+0x0018F4, EO TECHNICS Co., Ltd.
+0x0018F5, Shenzhen Streaming Video Technology Company Limited
+0x0018F6, Thomson Telecom Belgium
+0x0018F7, Kameleon Technologies
+0x0018F8, Cisco-Linksys LLC
+0x0018F9, VVOND, Inc.
+0x0018FA, Yushin Precision Equipment Co.,Ltd.
+0x0018FB, Compro Technology
+0x0018FC, Altec Electronic AG
+0x0018FD, Optimal Technologies International Inc.
+0x0018FE, Hewlett-Packard Company
+0x0018FF, PowerQuattro Co.
+0x001900, Intelliverese - DBA Voicecom
+0x001901, F1MEDIA
+0x001902, Cambridge Consultants Ltd
+0x001903, Bigfoot Networks Inc
+0x001904, WB Electronics Sp. z o.o.
+0x001905, SCHRACK Seconet AG
+0x001906, CISCO SYSTEMS, INC.
+0x001907, CISCO SYSTEMS, INC.
+0x001908, Duaxes Corporation
+0x001909, DEVI - Danfoss A/S
+0x00190A, HASWARE INC.
+0x00190B, Southern Vision Systems, Inc.
+0x00190C, Encore Electronics, Inc.
+0x00190D, IEEE 1394c
+0x00190E, Atech Technology Co., Ltd.
+0x00190F, Advansus Corp.
+0x001910, Knick Elektronische Messgeraete GmbH & Co. KG
+0x001911, Just In Mobile Information Technologies (Shanghai) Co., Ltd.
+0x001912, Welcat Inc
+0x001913, Chuang-Yi Network Equipment Co.Ltd.
+0x001914, Winix Co., Ltd
+0x001915, TECOM Co., Ltd.
+0x001916, PayTec AG
+0x001917, Posiflex Inc.
+0x001918, Interactive Wear AG
+0x001919, ASTEL Inc.
+0x00191A, IRLINK
+0x00191B, Sputnik Engineering AG
+0x00191C, Sensicast Systems
+0x00191D, Nintendo Co.,Ltd.
+0x00191E, Beyondwiz Co., Ltd.
+0x00191F, Microlink communications Inc.
+0x001920, KUME electric Co.,Ltd.
+0x001921, Elitegroup Computer System Co.
+0x001922, CM Comandos Lineares
+0x001923, Phonex Korea Co., LTD.
+0x001924, LBNL Engineering
+0x001925, Intelicis Corporation
+0x001926, BitsGen Co., Ltd.
+0x001927, ImCoSys Ltd
+0x001928, Siemens AG, Transportation Systems
+0x001929, 2M2B Montadora de Maquinas Bahia Brasil LTDA
+0x00192A, Antiope Associates
+0x00192B, Aclara RF Systems Inc.
+0x00192C, Motorola Mobility, Inc.
+0x00192D, Nokia Corporation
+0x00192E, Spectral Instruments, Inc.
+0x00192F, CISCO SYSTEMS, INC.
+0x001930, CISCO SYSTEMS, INC.
+0x001931, Balluff GmbH
+0x001932, Gude Analog- und Digialsysteme GmbH
+0x001933, Strix Systems, Inc.
+0x001934, TRENDON TOUCH TECHNOLOGY CORP.
+0x001935, DÜRR DENTAL AG
+0x001936, STERLITE OPTICAL TECHNOLOGIES LIMITED
+0x001937, CommerceGuard AB
+0x001938, UMB Communications Co., Ltd.
+0x001939, Gigamips
+0x00193A, OESOLUTIONS
+0x00193B, Wilibox Deliberant Group LLC
+0x00193C, HighPoint Technologies Incorporated
+0x00193D, GMC Guardian Mobility Corp.
+0x00193E, ADB Broadband Italia
+0x00193F, RDI technology(Shenzhen) Co.,LTD
+0x001940, Rackable Systems
+0x001941, Pitney Bowes, Inc
+0x001942, ON SOFTWARE INTERNATIONAL LIMITED
+0x001943, Belden
+0x001944, Fossil Partners, L.P.
+0x001945, Ten-Tec Inc.
+0x001946, Cianet Industria e Comercio S/A
+0x001947, Scientific Atlanta, A Cisco Company
+0x001948, AireSpider Networks
+0x001949, TENTEL COMTECH CO., LTD.
+0x00194A, TESTO AG
+0x00194B, SAGEM COMMUNICATION
+0x00194C, Fujian Stelcom information & Technology CO.,Ltd
+0x00194D, Avago Technologies Sdn Bhd
+0x00194E, Ultra Electronics - TCS (Tactical Communication Systems)
+0x00194F, Nokia Danmark A/S
+0x001950, Harman Multimedia
+0x001951, NETCONS, s.r.o.
+0x001952, ACOGITO Co., Ltd
+0x001953, Chainleader Communications Corp.
+0x001954, Leaf Corporation.
+0x001955, CISCO SYSTEMS, INC.
+0x001956, CISCO SYSTEMS, INC.
+0x001957, Saafnet Canada Inc.
+0x001958, Bluetooth SIG, Inc.
+0x001959, Staccato Communications Inc.
+0x00195A, Jenaer Antriebstechnik GmbH
+0x00195B, D-Link Corporation
+0x00195C, Innotech Corporation
+0x00195D, ShenZhen XinHuaTong Opto Electronics Co.,Ltd
+0x00195E, Motorola Mobility, Inc.
+0x00195F, Valemount Networks Corporation
+0x001960, DoCoMo Systems, Inc.
+0x001961, Blaupunkt Embedded Systems GmbH
+0x001962, Commerciant, LP
+0x001963, Sony Ericsson Mobile Communications AB
+0x001964, Doorking Inc.
+0x001965, YuHua TelTech (ShangHai) Co., Ltd.
+0x001966, Asiarock Technology Limited
+0x001967, TELDAT Sp.J.
+0x001968, Digital Video Networks(Shanghai) CO. LTD.
+0x001969, Nortel
+0x00196A, MikroM GmbH
+0x00196B, Danpex Corporation
+0x00196C, ETROVISION TECHNOLOGY
+0x00196D, Raybit Systems Korea, Inc
+0x00196E, Metacom (Pty) Ltd.
+0x00196F, SensoPart GmbH
+0x001970, Z-Com, Inc.
+0x001971, Guangzhou Unicomp Technology Co.,Ltd
+0x001972, Plexus (Xiamen) Co.,ltd
+0x001973, Zeugma Systems
+0x001974, AboCom Systems, Inc.
+0x001975, Beijing Huisen networks technology Inc
+0x001976, Xipher Technologies, LLC
+0x001977, Aerohive Networks, Inc.
+0x001978, Datum Systems, Inc.
+0x001979, Nokia Danmark A/S
+0x00197A, MAZeT GmbH
+0x00197B, Picotest Corp.
+0x00197C, Riedel Communications GmbH
+0x00197D, Hon Hai Precision Ind. Co., Ltd
+0x00197E, Hon Hai Precision Ind. Co., Ltd
+0x00197F, PLANTRONICS, INC.
+0x001980, Gridpoint Systems
+0x001981, Vivox Inc
+0x001982, SmarDTV
+0x001983, CCT R&D Limited
+0x001984, ESTIC Corporation
+0x001985, IT Watchdogs, Inc
+0x001986, Cheng Hongjian
+0x001987, Panasonic Mobile Communications Co., Ltd.
+0x001988, Wi2Wi, Inc
+0x001989, Sonitrol Corporation
+0x00198A, Northrop Grumman Systems Corp.
+0x00198B, Novera Optics Korea, Inc.
+0x00198C, iXSea
+0x00198D, Ocean Optics, Inc.
+0x00198E, Oticon A/S
+0x00198F, Alcatel Bell N.V.
+0x001990, ELM DATA Co., Ltd.
+0x001991, avinfo
+0x001992, ADTRAN INC.
+0x001993, Changshu Switchgear MFG. Co.,Ltd. (Former Changshu Switchgea
+0x001994, Jorjin Technologies Inc.
+0x001995, Jurong Hi-Tech (Suzhou)Co.ltd
+0x001996, TurboChef Technologies Inc.
+0x001997, Soft Device Sdn Bhd
+0x001998, SATO CORPORATION
+0x001999, Fujitsu Technology Solutions
+0x00199A, EDO-EVI
+0x00199B, Diversified Technical Systems, Inc.
+0x00199C, CTRING
+0x00199D, VIZIO, Inc.
+0x00199E, SHOWADENSHI ELECTRONICS,INC.
+0x00199F, DKT A/S
+0x0019A0, NIHON DATA SYSTENS, INC.
+0x0019A1, LG INFORMATION & COMM.
+0x0019A2, ORDYN TECHNOLOGIES
+0x0019A3, asteel electronique atlantique
+0x0019A4, Austar Technology (hang zhou) Co.,Ltd
+0x0019A5, RadarFind Corporation
+0x0019A6, Motorola Mobility, Inc.
+0x0019A7, ITU-T
+0x0019A8, WiQuest Communications
+0x0019A9, CISCO SYSTEMS, INC.
+0x0019AA, CISCO SYSTEMS, INC.
+0x0019AB, Raycom CO ., LTD
+0x0019AC, GSP SYSTEMS Inc.
+0x0019AD, BOBST SA
+0x0019AE, Hopling Technologies b.v.
+0x0019AF, Rigol Technologies, Inc.
+0x0019B0, HanYang System
+0x0019B1, Arrow7 Corporation
+0x0019B2, XYnetsoft Co.,Ltd
+0x0019B3, Stanford Research Systems
+0x0019B4, VideoCast Ltd.
+0x0019B5, Famar Fueguina S.A.
+0x0019B6, Euro Emme s.r.l.
+0x0019B7, Nokia Danmark A/S
+0x0019B8, Boundary Devices
+0x0019B9, Dell Inc.
+0x0019BA, Paradox Security Systems Ltd
+0x0019BB, Hewlett-Packard Company
+0x0019BC, ELECTRO CHANCE SRL
+0x0019BD, New Media Life
+0x0019BE, Altai Technologies Limited
+0x0019BF, Citiway technology Co.,ltd
+0x0019C0, Motorola Mobility, Inc.
+0x0019C1, Alps Electric Co., Ltd
+0x0019C2, Equustek Solutions, Inc.
+0x0019C3, Qualitrol
+0x0019C4, Infocrypt Inc.
+0x0019C5, SONY Computer Entertainment inc,
+0x0019C6, ZTE Corporation
+0x0019C7, Cambridge Industries(Group) Co.,Ltd.
+0x0019C8, AnyDATA Corporation
+0x0019C9, S&C ELECTRIC COMPANY
+0x0019CA, Broadata Communications, Inc
+0x0019CB, ZyXEL Communications Corporation
+0x0019CC, RCG (HK) Ltd
+0x0019CD, Chengdu ethercom information technology Ltd.
+0x0019CE, Progressive Gaming International
+0x0019CF, SALICRU, S.A.
+0x0019D0, Cathexis
+0x0019D1, Intel Corporation
+0x0019D2, Intel Corporation
+0x0019D3, TRAK Microwave
+0x0019D4, ICX Technologies
+0x0019D5, IP Innovations, Inc.
+0x0019D6, LS Cable Ltd.
+0x0019D7, FORTUNETEK CO., LTD
+0x0019D8, MAXFOR
+0x0019D9, Zeutschel GmbH
+0x0019DA, Welltrans O&E Technology Co. , Ltd.
+0x0019DB, MICRO-STAR INTERNATIONAL CO., LTD.
+0x0019DC, ENENSYS Technologies
+0x0019DD, FEI-Zyfer, Inc.
+0x0019DE, MOBITEK
+0x0019DF, Thomson Inc.
+0x0019E0, TP-LINK Technologies Co., Ltd.
+0x0019E1, Nortel
+0x0019E2, Juniper Networks
+0x0019E3, Apple Computer Inc.
+0x0019E4, 2Wire, Inc
+0x0019E5, Lynx Studio Technology, Inc.
+0x0019E6, TOYO MEDIC CO.,LTD.
+0x0019E7, CISCO SYSTEMS, INC.
+0x0019E8, CISCO SYSTEMS, INC.
+0x0019E9, S-Information Technolgy, Co., Ltd.
+0x0019EA, TeraMage Technologies Co., Ltd.
+0x0019EB, Pyronix Ltd
+0x0019EC, Sagamore Systems, Inc.
+0x0019ED, Axesstel Inc.
+0x0019EE, CARLO GAVAZZI CONTROLS SPA-Controls Division
+0x0019EF, SHENZHEN LINNKING ELECTRONICS CO.,LTD
+0x0019F0, UNIONMAN TECHNOLOGY CO.,LTD
+0x0019F1, Star Communication Network Technology Co.,Ltd
+0x0019F2, Teradyne K.K.
+0x0019F3, Cetis, Inc
+0x0019F4, Convergens Oy Ltd
+0x0019F5, Imagination Technologies Ltd
+0x0019F6, Acconet (PTE) Ltd
+0x0019F7, Onset Computer Corporation
+0x0019F8, Embedded Systems Design, Inc.
+0x0019F9, TDK-Lambda
+0x0019FA, Cable Vision Electronics CO., LTD.
+0x0019FB, BSkyB Ltd
+0x0019FC, PT. Ufoakses Sukses Luarbiasa
+0x0019FD, Nintendo Co., Ltd.
+0x0019FE, SHENZHEN SEECOMM TECHNOLOGY CO.,LTD.
+0x0019FF, Finnzymes
+0x001A00, MATRIX INC.
+0x001A01, Smiths Medical
+0x001A02, SECURE CARE PRODUCTS, INC
+0x001A03, Angel Electronics Co., Ltd.
+0x001A04, Interay Solutions BV
+0x001A05, OPTIBASE LTD
+0x001A06, OpVista, Inc.
+0x001A07, Arecont Vision
+0x001A08, Dalman Technical Services
+0x001A09, Wayfarer Transit Systems Ltd
+0x001A0A, Adaptive Micro-Ware Inc.
+0x001A0B, BONA TECHNOLOGY INC.
+0x001A0C, Swe-Dish Satellite Systems AB
+0x001A0D, HandHeld entertainment, Inc.
+0x001A0E, Cheng Uei Precision Industry Co.,Ltd
+0x001A0F, Sistemas Avanzados de Control, S.A.
+0x001A10, LUCENT TRANS ELECTRONICS CO.,LTD
+0x001A11, Google Inc.
+0x001A12, Essilor
+0x001A13, Wanlida Group Co., LTD
+0x001A14, Xin Hua Control Engineering Co.,Ltd.
+0x001A15, gemalto e-Payment
+0x001A16, Nokia Danmark A/S
+0x001A17, Teak Technologies, Inc.
+0x001A18, Advanced Simulation Technology inc.
+0x001A19, Computer Engineering Limited
+0x001A1A, Gentex Corporation/Electro-Acoustic Products
+0x001A1B, Motorola Mobility, Inc.
+0x001A1C, GT&T Engineering Pte Ltd
+0x001A1D, PChome Online Inc.
+0x001A1E, Aruba Networks
+0x001A1F, Coastal Environmental Systems
+0x001A20, CMOTECH Co. Ltd.
+0x001A21, Indac B.V.
+0x001A22, eQ-3 Entwicklung GmbH
+0x001A23, Ice Qube, Inc
+0x001A24, Galaxy Telecom Technologies Ltd
+0x001A25, DELTA DORE
+0x001A26, Deltanode Solutions AB
+0x001A27, Ubistar
+0x001A28, ASWT Co., LTD. Taiwan Branch H.K.
+0x001A29, Techsonic Industries d/b/a Humminbird
+0x001A2A, Arcadyan Technology Corporation
+0x001A2B, Ayecom Technology Co., Ltd.
+0x001A2C, SATEC Co.,LTD
+0x001A2D, The Navvo Group
+0x001A2E, Ziova Coporation
+0x001A2F, CISCO SYSTEMS, INC.
+0x001A30, CISCO SYSTEMS, INC.
+0x001A31, SCAN COIN Industries AB
+0x001A32, ACTIVA MULTIMEDIA
+0x001A33, ASI Communications, Inc.
+0x001A34, Konka Group Co., Ltd.
+0x001A35, BARTEC GmbH
+0x001A36, Aipermon GmbH & Co. KG
+0x001A37, Lear Corporation
+0x001A38, Sanmina-SCI
+0x001A39, Merten GmbH&CoKG
+0x001A3A, Dongahelecomm
+0x001A3B, Doah Elecom Inc.
+0x001A3C, Technowave Ltd.
+0x001A3D, Ajin Vision Co.,Ltd
+0x001A3E, Faster Technology LLC
+0x001A3F, intelbras
+0x001A40, A-FOUR TECH CO., LTD.
+0x001A41, INOCOVA Co.,Ltd
+0x001A42, Techcity Technology co., Ltd.
+0x001A43, Logical Link Communications
+0x001A44, JWTrading Co., Ltd
+0x001A45, GN Netcom as
+0x001A46, Digital Multimedia Technology Co., Ltd
+0x001A47, Agami Systems, Inc.
+0x001A48, Takacom Corporation
+0x001A49, Micro Vision Co.,LTD
+0x001A4A, Qumranet Inc.
+0x001A4B, Hewlett-Packard Company
+0x001A4C, Crossbow Technology, Inc
+0x001A4D, GIGA-BYTE TECHNOLOGY CO.,LTD.
+0x001A4E, NTI AG / LinMot
+0x001A4F, AVM GmbH
+0x001A50, PheeNet Technology Corp.
+0x001A51, Alfred Mann Foundation
+0x001A52, Meshlinx Wireless Inc.
+0x001A53, Zylaya
+0x001A54, Hip Shing Electronics Ltd.
+0x001A55, ACA-Digital Corporation
+0x001A56, ViewTel Co,. Ltd.
+0x001A57, Matrix Design Group, LLC
+0x001A58, CCV Deutschland GmbH - Celectronic eHealth Div.
+0x001A59, Ircona
+0x001A5A, Korea Electric Power Data Network (KDN) Co., Ltd
+0x001A5B, NetCare Service Co., Ltd.
+0x001A5C, Euchner GmbH+Co. KG
+0x001A5D, Mobinnova Corp.
+0x001A5E, Thincom Technology Co.,Ltd
+0x001A5F, KitWorks.fi Ltd.
+0x001A60, Wave Electronics Co.,Ltd.
+0x001A61, PacStar Corp.
+0x001A62, Data Robotics, Incorporated
+0x001A63, Elster Solutions, LLC,
+0x001A64, IBM Corp
+0x001A65, Seluxit
+0x001A66, Motorola Mobility, Inc.
+0x001A67, Infinite QL Sdn Bhd
+0x001A68, Weltec Enterprise Co., Ltd.
+0x001A69, Wuhan Yangtze Optical Technology CO.,Ltd.
+0x001A6A, Tranzas, Inc.
+0x001A6B, Universal Global Scientific Industrial Co., Ltd.
+0x001A6C, CISCO SYSTEMS, INC.
+0x001A6D, CISCO SYSTEMS, INC.
+0x001A6E, Impro Technologies
+0x001A6F, MI.TEL s.r.l.
+0x001A70, Cisco-Linksys, LLC
+0x001A71, Diostech Co., Ltd.
+0x001A72, Mosart Semiconductor Corp.
+0x001A73, Gemtek Technology Co., Ltd.
+0x001A74, Procare International Co
+0x001A75, Sony Ericsson Mobile Communications
+0x001A76, SDT information Technology Co.,LTD.
+0x001A77, Motorola Mobility, Inc.
+0x001A78, ubtos
+0x001A79, TELECOMUNICATION TECHNOLOGIES LTD.
+0x001A7A, Lismore Instruments Limited
+0x001A7B, Teleco, Inc.
+0x001A7C, Hirschmann Multimedia B.V.
+0x001A7D, cyber-blue(HK)Ltd
+0x001A7E, LN Srithai Comm Ltd.
+0x001A7F, GCI Science&Technology Co.,Ltd.
+0x001A80, Sony Corporation
+0x001A81, Zelax
+0x001A82, PROBA Building Automation Co.,LTD
+0x001A83, Pegasus Technologies Inc.
+0x001A84, V One Multimedia Pte Ltd
+0x001A85, NV Michel Van de Wiele
+0x001A86, AdvancedIO Systems Inc
+0x001A87, Canhold International Limited
+0x001A88, Venergy,Co,Ltd
+0x001A89, Nokia Danmark A/S
+0x001A8A, Samsung Electronics Co., Ltd.
+0x001A8B, CHUNIL ELECTRIC IND., CO.
+0x001A8C, Astaro AG
+0x001A8D, AVECS Bergen GmbH
+0x001A8E, 3Way Networks Ltd
+0x001A8F, Nortel
+0x001A90, Trópico Sistemas e Telecomunicações da Amazônia LTDA.
+0x001A91, FusionDynamic Ltd.
+0x001A92, ASUSTek COMPUTER INC.
+0x001A93, ERCO Leuchten GmbH
+0x001A94, Votronic GmbH
+0x001A95, Hisense Mobile Communications Technoligy Co.,Ltd.
+0x001A96, ECLER S.A.
+0x001A97, fitivision technology Inc.
+0x001A98, Asotel Communication Limited Taiwan Branch
+0x001A99, Smarty (HZ) Information Electronics Co., Ltd
+0x001A9A, Skyworth Digital technology(shenzhen)co.ltd.
+0x001A9B, ADEC & Parter AG
+0x001A9C, RightHand Technologies, Inc.
+0x001A9D, Skipper Wireless, Inc.
+0x001A9E, ICON Digital International Limited
+0x001A9F, A-Link Ltd
+0x001AA0, Dell Inc
+0x001AA1, CISCO SYSTEMS, INC.
+0x001AA2, CISCO SYSTEMS, INC.
+0x001AA3, DELORME
+0x001AA4, Future University-Hakodate
+0x001AA5, BRN Phoenix
+0x001AA6, Telefunken Radio Communication Systems GmbH &CO.KG
+0x001AA7, Torian Wireless
+0x001AA8, Mamiya Digital Imaging Co., Ltd.
+0x001AA9, FUJIAN STAR-NET COMMUNICATION CO.,LTD
+0x001AAA, Analogic Corp.
+0x001AAB, eWings s.r.l.
+0x001AAC, Corelatus AB
+0x001AAD, Motorola Mobility, Inc.
+0x001AAE, Savant Systems LLC
+0x001AAF, BLUSENS TECHNOLOGY
+0x001AB0, Signal Networks Pvt. Ltd.,
+0x001AB1, Asia Pacific Satellite Industries Co., Ltd.
+0x001AB2, Cyber Solutions Inc.
+0x001AB3, VISIONITE INC.
+0x001AB4, FFEI Ltd.
+0x001AB5, Home Network System
+0x001AB6, Texas Instruments
+0x001AB7, Ethos Networks LTD.
+0x001AB8, Anseri Corporation
+0x001AB9, PMC
+0x001ABA, Caton Overseas Limited
+0x001ABB, Fontal Technology Incorporation
+0x001ABC, U4EA Technologies Ltd
+0x001ABD, Impatica Inc.
+0x001ABE, COMPUTER HI-TECH INC.
+0x001ABF, TRUMPF Laser Marking Systems AG
+0x001AC0, JOYBIEN TECHNOLOGIES CO., LTD.
+0x001AC1, 3Com Ltd
+0x001AC2, YEC Co.,Ltd.
+0x001AC3, Scientific-Atlanta, Inc
+0x001AC4, 2Wire, Inc
+0x001AC5, BreakingPoint Systems, Inc.
+0x001AC6, Micro Control Designs
+0x001AC7, UNIPOINT
+0x001AC8, ISL (Instrumentation Scientifique de Laboratoire)
+0x001AC9, SUZUKEN CO.,LTD
+0x001ACA, Tilera Corporation
+0x001ACB, Autocom Products Ltd
+0x001ACC, Celestial Semiconductor, Ltd
+0x001ACD, Tidel Engineering LP
+0x001ACE, YUPITERU CORPORATION
+0x001ACF, C.T. ELETTRONICA
+0x001AD0, Albis Technologies AG
+0x001AD1, FARGO CO., LTD.
+0x001AD2, Eletronica Nitron Ltda
+0x001AD3, Vamp Ltd.
+0x001AD4, iPOX Technology Co., Ltd.
+0x001AD5, KMC CHAIN INDUSTRIAL CO., LTD.
+0x001AD6, JIAGNSU AETNA ELECTRIC CO.,LTD
+0x001AD7, Christie Digital Systems, Inc.
+0x001AD8, AlsterAero GmbH
+0x001AD9, International Broadband Electric Communications, Inc.
+0x001ADA, Biz-2-Me Inc.
+0x001ADB, Motorola Mobility, Inc.
+0x001ADC, Nokia Danmark A/S
+0x001ADD, PePWave Ltd
+0x001ADE, Motorola Mobility, Inc.
+0x001ADF, Interactivetv Pty Limited
+0x001AE0, Mythology Tech Express Inc.
+0x001AE1, EDGE ACCESS INC
+0x001AE2, CISCO SYSTEMS, INC.
+0x001AE3, CISCO SYSTEMS, INC.
+0x001AE4, Medicis Technologies Corporation
+0x001AE5, Mvox Technologies Inc.
+0x001AE6, Atlanta Advanced Communications Holdings Limited
+0x001AE7, Aztek Networks, Inc.
+0x001AE8, Siemens Enterprise Communications GmbH & Co. KG
+0x001AE9, Nintendo Co., Ltd.
+0x001AEA, Radio Terminal Systems Pty Ltd
+0x001AEB, Allied Telesis K.K.
+0x001AEC, Keumbee Electronics Co.,Ltd.
+0x001AED, INCOTEC GmbH
+0x001AEE, Shenztech Ltd
+0x001AEF, Loopcomm Technology, Inc.
+0x001AF0, Alcatel - IPD
+0x001AF1, Embedded Artists AB
+0x001AF2, Dynavisions Schweiz AG
+0x001AF3, Samyoung Electronics
+0x001AF4, Handreamnet
+0x001AF5, PENTAONE. CO., LTD.
+0x001AF6, Woven Systems, Inc.
+0x001AF7, dataschalt e+a GmbH
+0x001AF8, Copley Controls Corporation
+0x001AF9, AeroVIronment (AV Inc)
+0x001AFA, Welch Allyn, Inc.
+0x001AFB, Joby Inc.
+0x001AFC, ModusLink Corporation
+0x001AFD, EVOLIS
+0x001AFE, SOFACREAL
+0x001AFF, Wizyoung Tech.
+0x001B00, Neopost Technologies
+0x001B01, Applied Radio Technologies
+0x001B02, ED Co.Ltd
+0x001B03, Action Technology (SZ) Co., Ltd
+0x001B04, Affinity International S.p.a
+0x001B05, YMC AG
+0x001B06, Ateliers R. LAUMONIER
+0x001B07, Mendocino Software
+0x001B08, Danfoss Drives A/S
+0x001B09, Matrix Telecom Pvt. Ltd.
+0x001B0A, Intelligent Distributed Controls Ltd
+0x001B0B, Phidgets Inc.
+0x001B0C, CISCO SYSTEMS, INC.
+0x001B0D, CISCO SYSTEMS, INC.
+0x001B0E, InoTec GmbH Organisationssysteme
+0x001B0F, Petratec
+0x001B10, ShenZhen Kang Hui Technology Co.,ltd
+0x001B11, D-Link Corporation
+0x001B12, Apprion
+0x001B13, Icron Technologies Corporation
+0x001B14, Carex Lighting Equipment Factory
+0x001B15, Voxtel, Inc.
+0x001B16, Celtro Ltd.
+0x001B17, Palo Alto Networks
+0x001B18, Tsuken Electric Ind. Co.,Ltd
+0x001B19, IEEE I&M Society TC9
+0x001B1A, e-trees Japan, Inc.
+0x001B1B, Siemens AG,
+0x001B1C, Coherent
+0x001B1D, Phoenix International Co., Ltd
+0x001B1E, HART Communication Foundation
+0x001B1F, DELTA - Danish Electronics, Light & Acoustics
+0x001B20, TPine Technology
+0x001B21, Intel Corporate
+0x001B22, Palit Microsystems ( H.K.) Ltd.
+0x001B23, SimpleComTools
+0x001B24, Quanta Computer Inc.
+0x001B25, Nortel
+0x001B26, RON-Telecom ZAO
+0x001B27, Merlin CSI
+0x001B28, POLYGON, JSC
+0x001B29, Avantis.Co.,Ltd
+0x001B2A, CISCO SYSTEMS, INC.
+0x001B2B, CISCO SYSTEMS, INC.
+0x001B2C, ATRON electronic GmbH
+0x001B2D, Med-Eng Systems Inc.
+0x001B2E, Sinkyo Electron Inc
+0x001B2F, NETGEAR Inc.
+0x001B30, Solitech Inc.
+0x001B31, Neural Image. Co. Ltd.
+0x001B32, QLogic Corporation
+0x001B33, Nokia Danmark A/S
+0x001B34, Focus System Inc.
+0x001B35, ChongQing JINOU Science & Technology Development CO.,Ltd
+0x001B36, Tsubata Engineering Co.,Ltd. (Head Office)
+0x001B37, Computec Oy
+0x001B38, COMPAL INFORMATION (KUNSHAN) CO., LTD.
+0x001B39, Proxicast
+0x001B3A, SIMS Corp.
+0x001B3B, Yi-Qing CO., LTD
+0x001B3C, Software Technologies Group,Inc.
+0x001B3D, EuroTel Spa
+0x001B3E, Curtis, Inc.
+0x001B3F, ProCurve Networking by HP
+0x001B40, Network Automation mxc AB
+0x001B41, General Infinity Co.,Ltd.
+0x001B42, Wise & Blue
+0x001B43, Beijing DG Telecommunications equipment Co.,Ltd
+0x001B44, SanDisk Corporation
+0x001B45, ABB AS, Division Automation Products
+0x001B46, Blueone Technology Co.,Ltd
+0x001B47, Futarque A/S
+0x001B48, Shenzhen Lantech Electronics Co., Ltd.
+0x001B49, Roberts Radio limited
+0x001B4A, W&W Communications, Inc.
+0x001B4B, SANION Co., Ltd.
+0x001B4C, Signtech
+0x001B4D, Areca Technology Corporation
+0x001B4E, Navman New Zealand
+0x001B4F, Avaya Inc.
+0x001B50, Nizhny Novgorod Factory named after M.Frunze, FSUE (NZiF)
+0x001B51, Vector Technology Corp.
+0x001B52, Motorola Mobility, Inc.
+0x001B53, CISCO SYSTEMS, INC.
+0x001B54, CISCO SYSTEMS, INC.
+0x001B55, Hurco Automation Ltd.
+0x001B56, Tehuti Networks Ltd.
+0x001B57, SEMINDIA SYSTEMS PRIVATE LIMITED
+0x001B58, ACE CAD Enterprise Co., Ltd.
+0x001B59, Sony Ericsson Mobile Communications AB
+0x001B5A, Apollo Imaging Technologies, Inc.
+0x001B5B, 2Wire, Inc.
+0x001B5C, Azuretec Co., Ltd.
+0x001B5D, Vololink Pty Ltd
+0x001B5E, BPL Limited
+0x001B5F, Alien Technology
+0x001B60, NAVIGON AG
+0x001B61, Digital Acoustics, LLC
+0x001B62, JHT Optoelectronics Co.,Ltd.
+0x001B63, Apple Computer Inc.
+0x001B64, IsaacLandKorea Co., Ltd,
+0x001B65, China Gridcom Co., Ltd
+0x001B66, Sennheiser electronic GmbH & Co. KG
+0x001B67, Ubiquisys Ltd
+0x001B68, Modnnet Co., Ltd
+0x001B69, Equaline Corporation
+0x001B6A, Powerwave Technologies Sweden AB
+0x001B6B, Swyx Solutions AG
+0x001B6C, LookX Digital Media BV
+0x001B6D, Midtronics, Inc.
+0x001B6E, Anue Systems, Inc.
+0x001B6F, Teletrak Ltd
+0x001B70, IRI Ubiteq, INC.
+0x001B71, Telular Corp.
+0x001B72, Sicep s.p.a.
+0x001B73, DTL Broadcast Ltd
+0x001B74, MiraLink Corporation
+0x001B75, Hypermedia Systems
+0x001B76, Ripcode, Inc.
+0x001B77, Intel Corporate
+0x001B78, Hewlett-Packard Company
+0x001B79, FAIVELEY TRANSPORT
+0x001B7A, Nintendo Co., Ltd.
+0x001B7B, The Tintometer Ltd
+0x001B7C, A & R Cambridge
+0x001B7D, CXR Anderson Jacobson
+0x001B7E, Beckmann GmbH
+0x001B7F, TMN Technologies Telecomunicacoes Ltda
+0x001B80, LORD Corporation
+0x001B81, DATAQ Instruments, Inc.
+0x001B82, Taiwan Semiconductor Co., Ltd.
+0x001B83, Finsoft Ltd
+0x001B84, Scan Engineering Telecom
+0x001B85, MAN Diesel SE
+0x001B86, Bosch Access Systems GmbH
+0x001B87, Deepsound Tech. Co., Ltd
+0x001B88, Divinet Access Technologies Ltd
+0x001B89, EMZA Visual Sense Ltd.
+0x001B8A, 2M Electronic A/S
+0x001B8B, NEC AccessTechnica, Ltd.
+0x001B8C, JMicron Technology Corp.
+0x001B8D, Electronic Computer Systems, Inc.
+0x001B8E, Hulu Sweden AB
+0x001B8F, CISCO SYSTEMS, INC.
+0x001B90, CISCO SYSTEMS, INC.
+0x001B91, EFKON AG
+0x001B92, l-acoustics
+0x001B93, JC Decaux SA DNT
+0x001B94, T.E.M.A. S.p.A.
+0x001B95, VIDEO SYSTEMS SRL
+0x001B96, General Sensing
+0x001B97, Violin Technologies
+0x001B98, Samsung Electronics Co., Ltd.
+0x001B99, KS System GmbH
+0x001B9A, Apollo Fire Detectors Ltd
+0x001B9B, Hose-McCann Communications
+0x001B9C, SATEL sp. z o.o.
+0x001B9D, Novus Security Sp. z o.o.
+0x001B9E, ASKEY COMPUTER CORP
+0x001B9F, Calyptech Pty Ltd
+0x001BA0, Awox
+0x001BA1, Åmic AB
+0x001BA2, IDS Imaging Development Systems GmbH
+0x001BA3, Flexit Group GmbH
+0x001BA4, S.A.E Afikim
+0x001BA5, MyungMin Systems, Inc.
+0x001BA6, intotech inc.
+0x001BA7, Lorica Solutions
+0x001BA8, UBI&MOBI,.Inc
+0x001BA9, BROTHER INDUSTRIES, LTD.
+0x001BAA, XenICs nv
+0x001BAB, Telchemy, Incorporated
+0x001BAC, Curtiss Wright Controls Embedded Computing
+0x001BAD, iControl Incorporated
+0x001BAE, Micro Control Systems, Inc
+0x001BAF, Nokia Danmark A/S
+0x001BB0, BHARAT ELECTRONICS
+0x001BB1, Wistron Neweb Corp.
+0x001BB2, Intellect International NV
+0x001BB3, Condalo GmbH
+0x001BB4, Airvod Limited
+0x001BB5, ZF Electronics GmbH
+0x001BB6, Bird Electronic Corp.
+0x001BB7, Alta Heights Technology Corp.
+0x001BB8, BLUEWAY ELECTRONIC CO;LTD
+0x001BB9, Elitegroup Computer System Co.
+0x001BBA, Nortel
+0x001BBB, RFTech Co.,Ltd
+0x001BBC, Silver Peak Systems, Inc.
+0x001BBD, FMC Kongsberg Subsea AS
+0x001BBE, ICOP Digital
+0x001BBF, SAGEM COMMUNICATION
+0x001BC0, Juniper Networks
+0x001BC1, HOLUX Technology, Inc.
+0x001BC2, Integrated Control Technology Limitied
+0x001BC3, Mobisolution Co.,Ltd
+0x001BC4, Ultratec, Inc.
+0x001BC5, IEEE Registration Authority
+0x001BC6, Strato Rechenzentrum AG
+0x001BC7, StarVedia Technology Inc.
+0x001BC8, MIURA CO.,LTD
+0x001BC9, FSN DISPLAY INC
+0x001BCA, Beijing Run Technology LTD. Company
+0x001BCB, PEMPEK SYSTEMS PTY LTD
+0x001BCC, KINGTEK CCTV ALLIANCE CO., LTD.
+0x001BCD, DAVISCOMMS (S) PTE LTD
+0x001BCE, Measurement Devices Ltd
+0x001BCF, Dataupia Corporation
+0x001BD0, IDENTEC SOLUTIONS
+0x001BD1, SOGESTMATIC
+0x001BD2, ULTRA-X ASIA PACIFIC Inc.
+0x001BD3, Matsushita Electric Panasonic AVC
+0x001BD4, CISCO SYSTEMS, INC.
+0x001BD5, CISCO SYSTEMS, INC.
+0x001BD6, Kelvin Hughes Ltd
+0x001BD7, Scientific Atlanta, A Cisco Company
+0x001BD8, DVTel LTD
+0x001BD9, Edgewater Computer Systems
+0x001BDA, UTStarcom Inc
+0x001BDB, Valeo VECS
+0x001BDC, Vencer Co., Ltd.
+0x001BDD, Motorola Mobility, Inc.
+0x001BDE, Renkus-Heinz, Inc.
+0x001BDF, Iskra MIS
+0x001BE0, TELENOT ELECTRONIC GmbH
+0x001BE1, ViaLogy
+0x001BE2, AhnLab,Inc.
+0x001BE3, Health Hero Network, Inc.
+0x001BE4, TOWNET SRL
+0x001BE5, 802automation Limited
+0x001BE6, VR AG
+0x001BE7, Postek Electronics Co., Ltd.
+0x001BE8, Ultratronik GmbH
+0x001BE9, Broadcom Corporation
+0x001BEA, Nintendo Co., Ltd.
+0x001BEB, DMP Electronics INC.
+0x001BEC, Netio Technologies Co., Ltd
+0x001BED, Brocade Communications Systems, Inc
+0x001BEE, Nokia Danmark A/S
+0x001BEF, Blossoms Digital Technology Co.,Ltd.
+0x001BF0, Value Platforms Limited
+0x001BF1, Nanjing SilverNet Software Co., Ltd.
+0x001BF2, KWORLD COMPUTER CO., LTD
+0x001BF3, TRANSRADIO SenderSysteme Berlin AG
+0x001BF4, KENWIN INDUSTRIAL(HK) LTD.
+0x001BF5, Tellink Sistemas de Telecomunicación S.L.
+0x001BF6, CONWISE Technology Corporation Ltd.
+0x001BF7, Lund IP Products AB
+0x001BF8, Digitrax Inc.
+0x001BF9, Intellitect Water Ltd
+0x001BFA, G.i.N. mbH
+0x001BFB, Alps Electric Co., Ltd
+0x001BFC, ASUSTek COMPUTER INC.
+0x001BFD, Dignsys Inc.
+0x001BFE, Zavio Inc.
+0x001BFF, Millennia Media inc.
+0x001C00, Entry Point, LLC
+0x001C01, ABB Oy Drives
+0x001C02, Pano Logic
+0x001C03, Betty TV Technology AG
+0x001C04, Airgain, Inc.
+0x001C05, Nonin Medical Inc.
+0x001C06, Siemens Numerical Control Ltd., Nanjing
+0x001C07, Cwlinux Limited
+0x001C08, Echo360, Inc.
+0x001C09, SAE Electronic Co.,Ltd.
+0x001C0A, Shenzhen AEE Technology Co.,Ltd.
+0x001C0B, SmartAnt Telecom
+0x001C0C, TANITA Corporation
+0x001C0D, G-Technology, Inc.
+0x001C0E, CISCO SYSTEMS, INC.
+0x001C0F, CISCO SYSTEMS, INC.
+0x001C10, Cisco-Linksys, LLC
+0x001C11, Motorola Mobility, Inc.
+0x001C12, Motorola Mobility, Inc.
+0x001C13, OPTSYS TECHNOLOGY CO., LTD.
+0x001C14, VMware, Inc
+0x001C15, TXP Corporation
+0x001C16, ThyssenKrupp Elevator
+0x001C17, Nortel
+0x001C18, Sicert S.r.L.
+0x001C19, secunet Security Networks AG
+0x001C1A, Thomas Instrumentation, Inc
+0x001C1B, Hyperstone GmbH
+0x001C1C, Center Communication Systems GmbH
+0x001C1D, CHENZHOU GOSPELL DIGITAL TECHNOLOGY CO.,LTD
+0x001C1E, emtrion GmbH
+0x001C1F, Quest Retail Technology Pty Ltd
+0x001C20, CLB Benelux
+0x001C21, Nucsafe Inc.
+0x001C22, Aeris Elettronica s.r.l.
+0x001C23, Dell Inc
+0x001C24, Formosa Wireless Systems Corp.
+0x001C25, Hon Hai Precision Ind. Co.,Ltd.
+0x001C26, Hon Hai Precision Ind. Co.,Ltd.
+0x001C27, Sunell Electronics Co.
+0x001C28, Sphairon Technologies GmbH
+0x001C29, CORE DIGITAL ELECTRONICS CO., LTD
+0x001C2A, Envisacor Technologies Inc.
+0x001C2B, Alertme.com Limited
+0x001C2C, Synapse
+0x001C2D, FlexRadio Systems
+0x001C2E, ProCurve Networking by HP
+0x001C2F, Pfister GmbH
+0x001C30, Mode Lighting (UK ) Ltd.
+0x001C31, Mobile XP Technology Co., LTD
+0x001C32, Telian Corporation
+0x001C33, Sutron
+0x001C34, HUEY CHIAO INTERNATIONAL CO., LTD.
+0x001C35, Nokia Danmark A/S
+0x001C36, iNEWiT NV
+0x001C37, Callpod, Inc.
+0x001C38, Bio-Rad Laboratories, Inc.
+0x001C39, S Netsystems Inc.
+0x001C3A, Element Labs, Inc.
+0x001C3B, AmRoad Technology Inc.
+0x001C3C, Seon Design Inc.
+0x001C3D, WaveStorm
+0x001C3E, ECKey Limited
+0x001C3F, International Police Technologies, Inc.
+0x001C40, VDG-Security bv
+0x001C41, scemtec Transponder Technology GmbH
+0x001C42, Parallels, Inc.
+0x001C43, Samsung Electronics Co.,Ltd
+0x001C44, Bosch Security Systems BV
+0x001C45, Chenbro Micom Co., Ltd.
+0x001C46, QTUM
+0x001C47, Hangzhou Hollysys Automation Co., Ltd
+0x001C48, WiDeFi, Inc.
+0x001C49, Zoltan Technology Inc.
+0x001C4A, AVM GmbH
+0x001C4B, Gener8, Inc.
+0x001C4C, Petrotest Instruments
+0x001C4D, Zeemote Technology Inc. (part of Aplix).
+0x001C4E, TASA International Limited
+0x001C4F, MACAB AB
+0x001C50, TCL Technoly Electronics(Huizhou)Co.,Ltd
+0x001C51, Celeno Communications
+0x001C52, VISIONEE SRL
+0x001C53, Synergy Lighting Controls
+0x001C54, Hillstone Networks Inc
+0x001C55, Shenzhen Kaifa Technology Co.
+0x001C56, Pado Systems, Inc.
+0x001C57, CISCO SYSTEMS, INC.
+0x001C58, CISCO SYSTEMS, INC.
+0x001C59, DEVON IT
+0x001C5A, Advanced Relay Corporation
+0x001C5B, Chubb Electronic Security Systems Ltd
+0x001C5C, Integrated Medical Systems, Inc.
+0x001C5D, Leica Microsystems
+0x001C5E, ASTON France
+0x001C5F, Winland Electronics, Inc.
+0x001C60, CSP Frontier Technologies,Inc.
+0x001C61, Galaxy Microsystems LImited
+0x001C62, LG Electronics Inc
+0x001C63, TRUEN
+0x001C64, Landis+Gyr
+0x001C65, JoeScan, Inc.
+0x001C66, UCAMP CO.,LTD
+0x001C67, Pumpkin Networks, Inc.
+0x001C68, Anhui Sun Create Electronics Co., Ltd
+0x001C69, Packet Vision Ltd
+0x001C6A, Weiss Engineering Ltd.
+0x001C6B, COVAX Co. Ltd
+0x001C6C, Jabil Circuit (Guangzhou) Limited
+0x001C6D, KYOHRITSU ELECTRONIC INDUSTRY CO., LTD.
+0x001C6E, Newbury Networks, Inc.
+0x001C6F, Emfit Ltd
+0x001C70, NOVACOMM LTDA
+0x001C71, Emergent Electronics
+0x001C72, Mayer & Cie GmbH & Co KG
+0x001C73, Arista Networks, Inc.
+0x001C74, Syswan Technologies Inc.
+0x001C75, RF Systems GmbH
+0x001C76, The Wandsworth Group Ltd
+0x001C77, Prodys
+0x001C78, WYPLAY SAS
+0x001C79, Cohesive Financial Technologies LLC
+0x001C7A, Perfectone Netware Company Ltd
+0x001C7B, Castlenet Technology Inc.
+0x001C7C, PERQ SYSTEMS CORPORATION
+0x001C7D, Excelpoint Manufacturing Pte Ltd
+0x001C7E, Toshiba
+0x001C7F, Check Point Software Technologies
+0x001C80, New Business Division/Rhea-Information CO., LTD.
+0x001C81, NextGen Venturi LTD
+0x001C82, Genew Technologies
+0x001C83, New Level Telecom Co., Ltd.
+0x001C84, STL Solution Co.,Ltd.
+0x001C85, Eunicorn
+0x001C86, Cranite Systems, Inc.
+0x001C87, Uriver Inc.
+0x001C88, TRANSYSTEM INC.
+0x001C89, Force Communications, Inc.
+0x001C8A, Cirrascale Corporation
+0x001C8B, MJ Innovations Ltd.
+0x001C8C, DIAL TECHNOLOGY LTD.
+0x001C8D, Mesa Imaging
+0x001C8E, Alcatel-Lucent IPD
+0x001C8F, Advanced Electronic Design, Inc.
+0x001C90, Empacket Corporation
+0x001C91, Gefen Inc.
+0x001C92, Tervela
+0x001C93, ExaDigm Inc
+0x001C94, LI-COR Biosciences
+0x001C95, Opticomm Corporation
+0x001C96, Linkwise Technology Pte Ltd
+0x001C97, Enzytek Technology Inc.,
+0x001C98, LUCKY TECHNOLOGY (HK) COMPANY LIMITED
+0x001C99, Shunra Software Ltd.
+0x001C9A, Nokia Danmark A/S
+0x001C9B, FEIG ELECTRONIC GmbH
+0x001C9C, Nortel
+0x001C9D, Liecthi AG
+0x001C9E, Dualtech IT AB
+0x001C9F, Razorstream, LLC
+0x001CA0, Production Resource Group, LLC
+0x001CA1, AKAMAI TECHNOLOGIES, INC.
+0x001CA2, ADB Broadband Italia
+0x001CA3, Terra
+0x001CA4, Sony Ericsson Mobile Communications
+0x001CA5, Zygo Corporation
+0x001CA6, Win4NET
+0x001CA7, International Quartz Limited
+0x001CA8, AirTies Wireless Networks
+0x001CA9, Audiomatica Srl
+0x001CAA, Bellon Pty Ltd
+0x001CAB, Meyer Sound Laboratories, Inc.
+0x001CAC, Qniq Technology Corp.
+0x001CAD, Wuhan Telecommunication Devices Co.,Ltd
+0x001CAE, WiChorus, Inc.
+0x001CAF, Plato Networks Inc.
+0x001CB0, CISCO SYSTEMS, INC.
+0x001CB1, CISCO SYSTEMS, INC.
+0x001CB2, BPT SPA
+0x001CB3, APPLE, INC
+0x001CB4, Iridium Satellite LLC
+0x001CB5, Neihua Network Technology Co.,LTD.(NHN)
+0x001CB6, Duzon CNT Co., Ltd.
+0x001CB7, USC DigiArk Corporation
+0x001CB8, CBC Co., Ltd
+0x001CB9, KWANG SUNG ELECTRONICS CO., LTD.
+0x001CBA, VerScient, Inc.
+0x001CBB, MusicianLink
+0x001CBC, CastGrabber, LLC
+0x001CBD, Ezze Mobile Tech., Inc.
+0x001CBE, Nintendo Co., Ltd.
+0x001CBF, Intel Corporate
+0x001CC0, Intel Corporate
+0x001CC1, Motorola Mobility, Inc.
+0x001CC2, Part II Research, Inc.
+0x001CC3, Pace plc
+0x001CC4, Hewlett-Packard Company
+0x001CC5, 3COM LTD
+0x001CC6, ProStor Systems
+0x001CC7, Rembrandt Technologies, LLC d/b/a REMSTREAM
+0x001CC8, INDUSTRONIC Industrie-Electronic GmbH & Co. KG
+0x001CC9, Kaise Electronic Technology Co., Ltd.
+0x001CCA, Shanghai Gaozhi Science & Technology Development Co.
+0x001CCB, Forth Corporation Public Company Limited
+0x001CCC, Research In Motion Limited
+0x001CCD, Alektrona Corporation
+0x001CCE, By Techdesign
+0x001CCF, LIMETEK
+0x001CD0, Circleone Co.,Ltd.
+0x001CD1, Waves Audio LTD
+0x001CD2, King Champion (Hong Kong) Limited
+0x001CD3, ZP Engineering SEL
+0x001CD4, Nokia Danmark A/S
+0x001CD5, ZeeVee, Inc.
+0x001CD6, Nokia Danmark A/S
+0x001CD7, Harman/Becker Automotive Systems GmbH
+0x001CD8, BlueAnt Wireless
+0x001CD9, GlobalTop Technology Inc.
+0x001CDA, Exegin Technologies Limited
+0x001CDB, CARPOINT CO.,LTD
+0x001CDC, Custom Computer Services, Inc.
+0x001CDD, COWBELL ENGINEERING CO., LTD.
+0x001CDE, Interactive Multimedia eXchange Inc.
+0x001CDF, Belkin International Inc.
+0x001CE0, DASAN TPS
+0x001CE1, INDRA SISTEMAS, S.A.
+0x001CE2, Attero Tech, LLC.
+0x001CE3, Optimedical Systems
+0x001CE4, EleSy JSC
+0x001CE5, MBS Electronic Systems GmbH
+0x001CE6, INNES
+0x001CE7, Rocon PLC Research Centre
+0x001CE8, Cummins Inc
+0x001CE9, Galaxy Technology Limited
+0x001CEA, Scientific-Atlanta, Inc
+0x001CEB, Nortel
+0x001CEC, Mobilesoft (Aust.) Pty Ltd
+0x001CED, ENVIRONNEMENT SA
+0x001CEE, SHARP Corporation
+0x001CEF, Primax Electronics LTD
+0x001CF0, D-Link Corporation
+0x001CF1, SUPoX Technology Co. , LTD.
+0x001CF2, Tenlon Technology Co.,Ltd.
+0x001CF3, EVS BROADCAST EQUIPMENT
+0x001CF4, Media Technology Systems Inc
+0x001CF5, Wiseblue Technology Limited
+0x001CF6, CISCO SYSTEMS, INC.
+0x001CF7, AudioScience
+0x001CF8, Parade Technologies, Ltd.
+0x001CF9, CISCO SYSTEMS, INC.
+0x001CFA, Alarm.com
+0x001CFB, Motorola Mobility, Inc.
+0x001CFC, Suminet Communication Technologies (Shanghai) Co., Ltd.
+0x001CFD, Universal Electronics
+0x001CFE, Quartics Inc
+0x001CFF, Napera Networks Inc
+0x001D00, Brivo Systems, LLC
+0x001D01, Neptune Digital
+0x001D02, Cybertech Telecom Development
+0x001D03, Design Solutions Inc.
+0x001D04, Zipit Wireless, Inc.
+0x001D05, iLight
+0x001D06, HM Electronics, Inc.
+0x001D07, Shenzhen Sang Fei Consumer Communications Co.,Ltd
+0x001D08, JIANGSU YINHE ELECTRONICS CO., LTD
+0x001D09, Dell Inc
+0x001D0A, Davis Instruments, Inc.
+0x001D0B, Power Standards Lab
+0x001D0C, MobileCompia
+0x001D0D, Sony Computer Entertainment inc.
+0x001D0E, Agapha Technology co., Ltd.
+0x001D0F, TP-LINK Technologies Co., Ltd.
+0x001D10, LightHaus Logic, Inc.
+0x001D11, Analogue & Micro Ltd
+0x001D12, ROHM CO., LTD.
+0x001D13, NextGTV
+0x001D14, SPERADTONE INFORMATION TECHNOLOGY LIMITED
+0x001D15, Shenzhen Dolphin Electronic Co., Ltd
+0x001D16, Efixo
+0x001D17, Digital Sky Corporation
+0x001D18, Power Innovation GmbH
+0x001D19, Arcadyan Technology Corporation
+0x001D1A, OvisLink S.A.
+0x001D1B, Sangean Electronics Inc.
+0x001D1C, Gennet s.a.
+0x001D1D, Inter-M Corporation
+0x001D1E, KYUSHU TEN CO.,LTD
+0x001D1F, Siauliu Tauro Televizoriai, JSC
+0x001D20, COMTREND CO.
+0x001D21, Alcad SL
+0x001D22, Foss Analytical A/S
+0x001D23, SENSUS
+0x001D24, Aclara Power-Line Systems Inc.
+0x001D25, Samsung Electronics Co.,Ltd
+0x001D26, Rockridgesound Technology Co.
+0x001D27, NAC-INTERCOM
+0x001D28, Sony Ericsson Mobile Communications AB
+0x001D29, Doro AB
+0x001D2A, SHENZHEN BUL-TECH CO.,LTD.
+0x001D2B, Wuhan Pont Technology CO. , LTD
+0x001D2C, Wavetrend Technologies (Pty) Limited
+0x001D2D, Pylone, Inc.
+0x001D2E, Ruckus Wireless
+0x001D2F, QuantumVision Corporation
+0x001D30, YX Wireless S.A.
+0x001D31, HIGHPRO INTERNATIONAL R&D CO,.LTD.
+0x001D32, Longkay Communication & Technology (Shanghai) Co. Ltd
+0x001D33, Maverick Systems Inc.
+0x001D34, SYRIS Technology Corp
+0x001D35, Viconics Electronics Inc.
+0x001D36, ELECTRONICS CORPORATION OF INDIA LIMITED
+0x001D37, Thales-Panda Transportation System
+0x001D38, Seagate Technology
+0x001D39, MOOHADIGITAL CO., LTD
+0x001D3A, mh acoustics LLC
+0x001D3B, Nokia Danmark A/S
+0x001D3C, Muscle Corporation
+0x001D3D, Avidyne Corporation
+0x001D3E, SAKA TECHNO SCIENCE CO.,LTD
+0x001D3F, Mitron Pty Ltd
+0x001D40, Living Independently Group, Inc.
+0x001D41, Hardy Instruments
+0x001D42, Nortel
+0x001D43, Shenzhen G-link Digital Technology Co., Ltd.
+0x001D44, Krohne
+0x001D45, CISCO SYSTEMS, INC.
+0x001D46, CISCO SYSTEMS, INC.
+0x001D47, Covote GmbH & Co KG
+0x001D48, Sensor-Technik Wiedemann GmbH
+0x001D49, Innovation Wireless Inc.
+0x001D4A, Carestream Health, Inc.
+0x001D4B, Grid Connect Inc.
+0x001D4C, Alcatel-Lucent
+0x001D4D, Adaptive Recognition Hungary, Inc
+0x001D4E, TCM Mobile LLC
+0x001D4F, Apple Computer Inc.
+0x001D50, SPINETIX SA
+0x001D51, Babcock & Wilcox Power Generation Group, Inc
+0x001D52, Defzone B.V.
+0x001D53, S&O Electronics (Malaysia) Sdn. Bhd.
+0x001D54, Sunnic Technology & Merchandise INC.
+0x001D55, ZANTAZ, Inc
+0x001D56, Kramer Electronics Ltd.
+0x001D57, CAETEC Messtechnik
+0x001D58, CQ Inc
+0x001D59, Mitra Energy & Infrastructure
+0x001D5A, 2Wire Inc.
+0x001D5B, Tecvan Informática Ltda
+0x001D5C, Tom Communication Industrial Co.,Ltd.
+0x001D5D, Control Dynamics Pty. Ltd.
+0x001D5E, COMING MEDIA CORP.
+0x001D5F, OverSpeed SARL
+0x001D60, ASUSTek COMPUTER INC.
+0x001D61, BIJ Corporation
+0x001D62, InPhase Technologies
+0x001D63, Miele & Cie. KG
+0x001D64, Adam Communications Systems Int Ltd
+0x001D65, Microwave Radio Communications
+0x001D66, Hyundai Telecom
+0x001D67, AMEC
+0x001D68, Thomson Telecom Belgium
+0x001D69, Knorr-Bremse AG
+0x001D6A, Alpha Networks Inc.
+0x001D6B, Motorola (formerly Netopia, Inc
+0x001D6C, ClariPhy Communications, Inc.
+0x001D6D, Confidant International LLC
+0x001D6E, Nokia Danmark A/S
+0x001D6F, Chainzone Technology Co., Ltd
+0x001D70, CISCO SYSTEMS, INC.
+0x001D71, CISCO SYSTEMS, INC.
+0x001D72, Wistron Corporation
+0x001D73, Buffalo Inc.
+0x001D74, Tianjin China-Silicon Microelectronics Co., Ltd.
+0x001D75, Radioscape PLC
+0x001D76, Eyeheight Ltd.
+0x001D77, NSGate
+0x001D78, Invengo Information Technology Co.,Ltd
+0x001D79, SIGNAMAX LLC
+0x001D7A, Wideband Semiconductor, Inc.
+0x001D7B, Ice Energy, Inc.
+0x001D7C, ABE Elettronica S.p.A.
+0x001D7D, GIGA-BYTE TECHNOLOGY CO.,LTD.
+0x001D7E, Cisco-Linksys, LLC
+0x001D7F, Tekron International Ltd
+0x001D80, Beijing Huahuan Eletronics Co.,Ltd
+0x001D81, GUANGZHOU GATEWAY ELECTRONICS CO., LTD
+0x001D82, GN A/S (GN Netcom A/S)
+0x001D83, Emitech Corporation
+0x001D84, Gateway, Inc.
+0x001D85, Call Direct Cellular Solutions
+0x001D86, Shinwa Industries(China) Ltd.
+0x001D87, VigTech Labs Sdn Bhd
+0x001D88, Clearwire
+0x001D89, VaultStor Corporation
+0x001D8A, TechTrex Inc
+0x001D8B, ADB Broadband Italia
+0x001D8C, La Crosse Technology LTD
+0x001D8D, Raytek GmbH
+0x001D8E, Alereon, Inc.
+0x001D8F, PureWave Networks
+0x001D90, EMCO Flow Systems
+0x001D91, Digitize, Inc
+0x001D92, MICRO-STAR INT'L CO.,LTD.
+0x001D93, Modacom
+0x001D94, Climax Technology Co., Ltd
+0x001D95, Flash, Inc.
+0x001D96, WatchGuard Video
+0x001D97, Alertus Technologies LLC
+0x001D98, Nokia Danmark A/S
+0x001D99, Cyan Optic, Inc.
+0x001D9A, GODEX INTERNATIONAL CO., LTD
+0x001D9B, Hokuyo Automatic Co., Ltd.
+0x001D9C, Rockwell Automation
+0x001D9D, ARTJOY INTERNATIONAL LIMITED
+0x001D9E, AXION TECHNOLOGIES
+0x001D9F, MATT R.P.Traczynscy Sp.J.
+0x001DA0, Heng Yu Electronic Manufacturing Company Limited
+0x001DA1, CISCO SYSTEMS, INC.
+0x001DA2, CISCO SYSTEMS, INC.
+0x001DA3, SabiOso
+0x001DA4, Hangzhou System Technology CO., LTD
+0x001DA5, WB Electronics
+0x001DA6, Media Numerics Limited
+0x001DA7, Seamless Internet
+0x001DA8, Takahata Electronics Co.,Ltd
+0x001DA9, Castles Technology, Co., LTD
+0x001DAA, DrayTek Corp.
+0x001DAB, SwissQual License AG
+0x001DAC, Gigamon Systems LLC
+0x001DAD, Sinotech Engineering Consultants, Inc. Geotechnical Enginee
+0x001DAE, CHANG TSENG TECHNOLOGY CO., LTD
+0x001DAF, Nortel
+0x001DB0, FuJian HengTong Information Technology Co.,Ltd
+0x001DB1, Crescendo Networks
+0x001DB2, HOKKAIDO ELECTRIC ENGINEERING CO.,LTD.
+0x001DB3, ProCurve Networking by HP
+0x001DB4, KUMHO ENG CO.,LTD
+0x001DB5, Juniper networks
+0x001DB6, BestComm Networks, Inc.
+0x001DB7, Tendril Networks, Inc.
+0x001DB8, Intoto Inc.
+0x001DB9, Wellspring Wireless
+0x001DBA, Sony Corporation
+0x001DBB, Dynamic System Electronics Corp.
+0x001DBC, Nintendo Co., Ltd.
+0x001DBD, Versamed Inc.
+0x001DBE, Motorola Mobility, Inc.
+0x001DBF, Radiient Technologies, Inc.
+0x001DC0, Enphase Energy
+0x001DC1, Audinate Pty L
+0x001DC2, XORTEC OY
+0x001DC3, RIKOR TV, Ltd
+0x001DC4, AIOI Systems Co., Ltd.
+0x001DC5, Beijing Jiaxun Feihong Electricial Co., Ltd.
+0x001DC6, SNR Inc.
+0x001DC7, L-3 Communications Geneva Aerospace
+0x001DC8, ScadaMetrcs, LLC.
+0x001DC9, GainSpan Corp.
+0x001DCA, PAV Electronics Limited
+0x001DCB, Exéns Development Oy
+0x001DCC, Hetra Secure Solutions
+0x001DCD, ARRIS Group, Inc.
+0x001DCE, ARRIS Group, Inc.
+0x001DCF, ARRIS Group, Inc.
+0x001DD0, ARRIS Group, Inc.
+0x001DD1, ARRIS Group, Inc.
+0x001DD2, ARRIS Group, Inc.
+0x001DD3, ARRIS Group, Inc.
+0x001DD4, ARRIS Group, Inc.
+0x001DD5, ARRIS Group, Inc.
+0x001DD6, ARRIS Group, Inc.
+0x001DD7, Algolith
+0x001DD8, Microsoft Corporation
+0x001DD9, Hon Hai Precision Ind.Co.,Ltd.
+0x001DDA, Mikroelektronika spol. s r. o.
+0x001DDB, C-BEL Corporation
+0x001DDC, HangZhou DeChangLong Tech&Info Co.,Ltd
+0x001DDD, DAT H.K. LIMITED
+0x001DDE, Zhejiang Broadcast&Television Technology Co.,Ltd.
+0x001DDF, Sunitec Enterprise Co., Ltd.
+0x001DE0, Intel Corporate
+0x001DE1, Intel Corporate
+0x001DE2, Radionor Communications
+0x001DE3, Intuicom
+0x001DE4, Visioneered Image Systems
+0x001DE5, CISCO SYSTEMS, INC.
+0x001DE6, CISCO SYSTEMS, INC.
+0x001DE7, Marine Sonic Technology, Ltd.
+0x001DE8, Nikko Denki Tsushin Company(NDTC)
+0x001DE9, Nokia Danmark A/S
+0x001DEA, Commtest Instruments Ltd
+0x001DEB, DINEC International
+0x001DEC, Marusys
+0x001DED, Grid Net, Inc.
+0x001DEE, NEXTVISION SISTEMAS DIGITAIS DE TELEVISÃO LTDA.
+0x001DEF, TRIMM, INC.
+0x001DF0, Vidient Systems, Inc.
+0x001DF1, Intego Systems, Inc.
+0x001DF2, Netflix, Inc.
+0x001DF3, SBS Science & Technology Co., Ltd
+0x001DF4, Magellan Technology Pty Limited
+0x001DF5, Sunshine Co,LTD
+0x001DF6, Samsung Electronics Co.,Ltd
+0x001DF7, R. STAHL Schaltgeräte GmbH
+0x001DF8, Webpro Vision Technology Corporation
+0x001DF9, Cybiotronics (Far East) Limited
+0x001DFA, Fujian LANDI Commercial Equipment Co.,Ltd
+0x001DFB, NETCLEUS Systems Corporation
+0x001DFC, KSIC
+0x001DFD, Nokia Danmark A/S
+0x001DFE, Palm, Inc
+0x001DFF, Network Critical Solutions Ltd
+0x001E00, Shantou Institute of Ultrasonic Instruments
+0x001E01, Renesas Technology Sales Co., Ltd.
+0x001E02, Sougou Keikaku Kougyou Co.,Ltd.
+0x001E03, LiComm Co., Ltd.
+0x001E04, Hanson Research Corporation
+0x001E05, Xseed Technologies & Computing
+0x001E06, WIBRAIN
+0x001E07, Winy Technology Co., Ltd.
+0x001E08, Centec Networks Inc
+0x001E09, ZEFATEK Co.,LTD
+0x001E0A, Syba Tech Limited
+0x001E0B, Hewlett-Packard Company
+0x001E0C, Sherwood Information Partners, Inc.
+0x001E0D, Micran Ltd.
+0x001E0E, MAXI VIEW HOLDINGS LIMITED
+0x001E0F, Briot International
+0x001E10, ShenZhen Huawei Communication Technologies Co.,Ltd.
+0x001E11, ELELUX INTERNATIONAL LTD
+0x001E12, Ecolab
+0x001E13, CISCO SYSTEMS, INC.
+0x001E14, CISCO SYSTEMS, INC.
+0x001E15, Beech Hill Electronics
+0x001E16, Keytronix
+0x001E17, STN BV
+0x001E18, Radio Activity srl
+0x001E19, GTRI
+0x001E1A, Best Source Taiwan Inc.
+0x001E1B, Digital Stream Technology, Inc.
+0x001E1C, SWS Australia Pty Limited
+0x001E1D, East Coast Datacom, Inc.
+0x001E1E, Honeywell Life Safety
+0x001E1F, Nortel
+0x001E20, Intertain Inc.
+0x001E21, Qisda Co.
+0x001E22, ARVOO Imaging Products BV
+0x001E23, Electronic Educational Devices, Inc
+0x001E24, Zhejiang Bell Technology Co.,ltd
+0x001E25, Intek Digital Inc
+0x001E26, Digifriends Co. Ltd
+0x001E27, SBN TECH Co.,Ltd.
+0x001E28, Lumexis Corporation
+0x001E29, Hypertherm Inc
+0x001E2A, Netgear Inc.
+0x001E2B, Radio Systems Design, Inc.
+0x001E2C, CyVerse Corporation
+0x001E2D, STIM
+0x001E2E, SIRTI S.p.A.
+0x001E2F, DiMoto Pty Ltd
+0x001E30, Shireen Inc
+0x001E31, INFOMARK CO.,LTD.
+0x001E32, Zensys
+0x001E33, Inventec Corporation
+0x001E34, CryptoMetrics
+0x001E35, Nintendo Co., Ltd.
+0x001E36, IPTE
+0x001E37, Universal Global Scientific Industrial Co., Ltd.
+0x001E38, Bluecard Software Technology Co., Ltd.
+0x001E39, Comsys Communication Ltd.
+0x001E3A, Nokia Danmark A/S
+0x001E3B, Nokia Danmark A/S
+0x001E3C, Lyngbox Media AB
+0x001E3D, Alps Electric Co., Ltd
+0x001E3E, KMW Inc.
+0x001E3F, TrellisWare Technologies, Inc.
+0x001E40, Shanghai DareGlobal Technologies Co.,Ltd.
+0x001E41, Microwave Communication & Component, Inc.
+0x001E42, Teltonika
+0x001E43, AISIN AW CO.,LTD.
+0x001E44, SANTEC
+0x001E45, Sony Ericsson Mobile Communications AB
+0x001E46, Motorola Mobility, Inc.
+0x001E47, PT. Hariff Daya Tunggal Engineering
+0x001E48, Wi-Links
+0x001E49, CISCO SYSTEMS, INC.
+0x001E4A, CISCO SYSTEMS, INC.
+0x001E4B, City Theatrical
+0x001E4C, Hon Hai Precision Ind.Co., Ltd.
+0x001E4D, Welkin Sciences, LLC
+0x001E4E, DAKO EDV-Ingenieur- und Systemhaus GmbH
+0x001E4F, Dell Inc.
+0x001E50, BATTISTONI RESEARCH
+0x001E51, Converter Industry Srl
+0x001E52, Apple Computer Inc
+0x001E53, Further Tech Co., LTD
+0x001E54, TOYO ELECTRIC Corporation
+0x001E55, COWON SYSTEMS,Inc.
+0x001E56, Bally Wulff Entertainment GmbH
+0x001E57, ALCOMA, spol. s r.o.
+0x001E58, D-Link Corporation
+0x001E59, Silicon Turnkey Express, LLC
+0x001E5A, Motorola Mobility, Inc.
+0x001E5B, Unitron Company, Inc.
+0x001E5C, RB GeneralEkonomik
+0x001E5D, Holosys d.o.o.
+0x001E5E, COmputime Ltd.
+0x001E5F, KwikByte, LLC
+0x001E60, Digital Lighting Systems, Inc
+0x001E61, ITEC GmbH
+0x001E62, Siemon
+0x001E63, Vibro-Meter SA
+0x001E64, Intel Corporate
+0x001E65, Intel Corporate
+0x001E66, RESOL Elektronische Regelungen GmbH
+0x001E67, Intel Corporate
+0x001E68, Quanta Computer
+0x001E69, Thomson Inc.
+0x001E6A, Beijing Bluexon Technology Co.,Ltd
+0x001E6B, Scientific Atlanta, A Cisco Company
+0x001E6C, Carbon Mountain LLC
+0x001E6D, IT R&D Center
+0x001E6E, Shenzhen First Mile Communications Ltd
+0x001E6F, Magna-Power Electronics, Inc.
+0x001E70, Cobham Defence Communications Ltd
+0x001E71, Igeacare Solutions Inc.
+0x001E72, PCS
+0x001E73, ZTE CORPORATION
+0x001E74, SAGEM COMMUNICATION
+0x001E75, LG Electronics
+0x001E76, Thermo Fisher Scientific
+0x001E77, Air2App
+0x001E78, Owitek Technology Ltd.,
+0x001E79, CISCO SYSTEMS, INC.
+0x001E7A, CISCO SYSTEMS, INC.
+0x001E7B, R.I.CO. S.r.l.
+0x001E7C, Taiwick Limited
+0x001E7D, Samsung Electronics Co.,Ltd
+0x001E7E, Nortel
+0x001E7F, CBM of America
+0x001E80, Last Mile Ltd.
+0x001E81, CNB Technology Inc.
+0x001E82, SanDisk Corporation
+0x001E83, LAN/MAN Standards Association (LMSC)
+0x001E84, Pika Technologies Inc.
+0x001E85, Lagotek Corporation
+0x001E86, MEL Co.,Ltd.
+0x001E87, Realease Limited
+0x001E88, ANDOR SYSTEM SUPPORT CO., LTD.
+0x001E89, CRFS Limited
+0x001E8A, eCopy, Inc
+0x001E8B, Infra Access Korea Co., Ltd.
+0x001E8C, ASUSTek COMPUTER INC.
+0x001E8D, Motorola Mobility, Inc.
+0x001E8E, Hunkeler AG
+0x001E8F, CANON INC.
+0x001E90, Elitegroup Computer Systems Co
+0x001E91, KIMIN Electronic Co., Ltd.
+0x001E92, JEULIN S.A.
+0x001E93, CiriTech Systems Inc
+0x001E94, SUPERCOM TECHNOLOGY CORPORATION
+0x001E95, SIGMALINK
+0x001E96, Sepura Plc
+0x001E97, Medium Link System Technology CO., LTD,
+0x001E98, GreenLine Communications
+0x001E99, Vantanol Industrial Corporation
+0x001E9A, HAMILTON Bonaduz AG
+0x001E9B, San-Eisha, Ltd.
+0x001E9C, Fidustron INC
+0x001E9D, Recall Technologies, Inc.
+0x001E9E, ddm hopt + schuler Gmbh + Co. KG
+0x001E9F, Visioneering Systems, Inc.
+0x001EA0, XLN-t
+0x001EA1, Brunata a/s
+0x001EA2, Symx Systems, Inc.
+0x001EA3, Nokia Danmark A/S
+0x001EA4, Nokia Danmark A/S
+0x001EA5, ROBOTOUS, Inc.
+0x001EA6, Best IT World (India) Pvt. Ltd.
+0x001EA7, ActionTec Electronics, Inc
+0x001EA8, Datang Mobile Communications Equipment CO.,LTD
+0x001EA9, Nintendo Co., Ltd.
+0x001EAA, E-Senza Technologies GmbH
+0x001EAB, TeleWell Oy
+0x001EAC, Armadeus Systems
+0x001EAD, Wingtech Group Limited
+0x001EAE, Continental Automotive Systems
+0x001EAF, Ophir Optronics Ltd
+0x001EB0, ImesD Electronica S.L.
+0x001EB1, Cryptsoft Pty Ltd
+0x001EB2, LG innotek
+0x001EB3, Primex Wireless
+0x001EB4, UNIFAT TECHNOLOGY LTD.
+0x001EB5, Ever Sparkle Technologies Ltd
+0x001EB6, TAG Heuer SA
+0x001EB7, TBTech, Co., Ltd.
+0x001EB8, Fortis, Inc.
+0x001EB9, Sing Fai Technology Limited
+0x001EBA, High Density Devices AS
+0x001EBB, BLUELIGHT TECHNOLOGY INC.
+0x001EBC, WINTECH AUTOMATION CO.,LTD.
+0x001EBD, CISCO SYSTEMS, INC.
+0x001EBE, CISCO SYSTEMS, INC.
+0x001EBF, Haas Automation Inc.
+0x001EC0, Microchip Technology Inc.
+0x001EC1, 3COM EUROPE LTD
+0x001EC2, Apple, Inc
+0x001EC3, Kozio, Inc.
+0x001EC4, Celio Corp
+0x001EC5, Middle Atlantic Products Inc
+0x001EC6, Obvius Holdings LLC
+0x001EC7, 2Wire
+0x001EC8, Rapid Mobile (Pty) Ltd
+0x001EC9, Dell Inc
+0x001ECA, Nortel
+0x001ECB, "RPC "Energoautomatika" Ltd
+0x001ECC, CDVI
+0x001ECD, KYLAND
+0x001ECE, BISA Technologies (Hong Kong) Limited
+0x001ECF, PHILIPS ELECTRONICS UK LTD
+0x001ED0, Ingespace
+0x001ED1, Keyprocessor B.V.
+0x001ED2, Ray Shine Video Technology Inc
+0x001ED3, Dot Technology Int'l Co., Ltd.
+0x001ED4, Doble Engineering
+0x001ED5, Tekon-Automatics
+0x001ED6, Alentec & Orion AB
+0x001ED7, H-Stream Wireless, Inc.
+0x001ED8, Digital United Inc.
+0x001ED9, Mitsubishi Precision Co.,LTd.
+0x001EDA, Wesemann Elektrotechniek B.V.
+0x001EDB, Giken Trastem Co., Ltd.
+0x001EDC, Sony Ericsson Mobile Communications AB
+0x001EDD, WASKO S.A.
+0x001EDE, BYD COMPANY LIMITED
+0x001EDF, Master Industrialization Center Kista
+0x001EE0, Urmet Domus SpA
+0x001EE1, Samsung Electronics Co.,Ltd
+0x001EE2, Samsung Electronics Co.,Ltd
+0x001EE3, T&W Electronics (ShenZhen) Co.,Ltd
+0x001EE4, ACS Solutions France
+0x001EE5, Cisco-Linksys, LLC
+0x001EE6, Shenzhen Advanced Video Info-Tech Co., Ltd.
+0x001EE7, Epic Systems Inc
+0x001EE8, Mytek
+0x001EE9, Stoneridge Electronics AB
+0x001EEA, Sensor Switch, Inc.
+0x001EEB, Talk-A-Phone Co.
+0x001EEC, COMPAL INFORMATION (KUNSHAN) CO., LTD.
+0x001EED, Adventiq Ltd.
+0x001EEE, ETL Systems Ltd
+0x001EEF, Cantronic International Limited
+0x001EF0, Gigafin Networks
+0x001EF1, Servimat
+0x001EF2, Micro Motion Inc
+0x001EF3, From2
+0x001EF4, L-3 Communications Display Systems
+0x001EF5, Hitek Automated Inc.
+0x001EF6, CISCO SYSTEMS, INC.
+0x001EF7, CISCO SYSTEMS, INC.
+0x001EF8, Emfinity Inc.
+0x001EF9, Pascom Kommunikations systeme GmbH.
+0x001EFA, PROTEI Ltd.
+0x001EFB, Trio Motion Technology Ltd
+0x001EFC, JSC "MASSA-K"
+0x001EFD, Microbit 2.0 AB
+0x001EFE, LEVEL s.r.o.
+0x001EFF, Mueller-Elektronik GmbH & Co. KG
+0x001F00, Nokia Danmark A/S
+0x001F01, Nokia Danmark A/S
+0x001F02, Pixelmetrix Corporation Pte Ltd
+0x001F03, NUM AG
+0x001F04, Granch Ltd.
+0x001F05, iTAS Technology Corp.
+0x001F06, Integrated Dispatch Solutions
+0x001F07, AZTEQ Mobile
+0x001F08, RISCO LTD
+0x001F09, JASTEC CO., LTD.
+0x001F0A, Nortel
+0x001F0B, Federal State Unitary Enterprise Industrial Union"Electropribor"
+0x001F0C, Intelligent Digital Services GmbH
+0x001F0D, L3 Communications - Telemetry West
+0x001F0E, Japan Kyastem Co., Ltd
+0x001F0F, Select Engineered Systems
+0x001F10, TOLEDO DO BRASIL INDUSTRIA DE BALANCAS LTDA
+0x001F11, OPENMOKO, INC.
+0x001F12, Juniper Networks
+0x001F13, S.& A.S. Ltd.
+0x001F14, NexG
+0x001F15, Bioscrypt Inc
+0x001F16, Wistron Corporation
+0x001F17, IDX Company, Ltd.
+0x001F18, Hakusan.Mfg.Co,.Ltd
+0x001F19, BEN-RI ELECTRONICA S.A.
+0x001F1A, Prominvest
+0x001F1B, RoyalTek Company Ltd.
+0x001F1C, KOBISHI ELECTRIC Co.,Ltd.
+0x001F1D, Atlas Material Testing Technology LLC
+0x001F1E, Astec Technology Co., Ltd
+0x001F1F, Edimax Technology Co. Ltd.
+0x001F20, Logitech Europe SA
+0x001F21, Inner Mongolia Yin An Science & Technology Development Co.,L
+0x001F22, Source Photonics, Inc.
+0x001F23, Interacoustics
+0x001F24, DIGITVIEW TECHNOLOGY CO., LTD.
+0x001F25, MBS GmbH
+0x001F26, CISCO SYSTEMS, INC.
+0x001F27, CISCO SYSTEMS, INC.
+0x001F28, ProCurve Networking by HP
+0x001F29, Hewlett-Packard Company
+0x001F2A, ACCM
+0x001F2B, Orange Logic
+0x001F2C, Starbridge Networks
+0x001F2D, Electro-Optical Imaging, Inc.
+0x001F2E, Triangle Research Int'l Pte Ltd
+0x001F2F, Berker GmbH & Co. KG
+0x001F30, Travelping
+0x001F31, Radiocomp
+0x001F32, Nintendo Co., Ltd.
+0x001F33, Netgear Inc.
+0x001F34, Lung Hwa Electronics Co., Ltd.
+0x001F35, AIR802 LLC
+0x001F36, Bellwin Information Co. Ltd.,
+0x001F37, Genesis I&C
+0x001F38, POSITRON
+0x001F39, Construcciones y Auxiliar de Ferrocarriles, S.A.
+0x001F3A, Hon Hai Precision Ind.Co., Ltd.
+0x001F3B, Intel Corporate
+0x001F3C, Intel Corporate
+0x001F3D, Qbit GmbH
+0x001F3E, RP-Technik e.K.
+0x001F3F, AVM GmbH
+0x001F40, Speakercraft Inc.
+0x001F41, Ruckus Wireless
+0x001F42, Etherstack Pty Ltd
+0x001F43, ENTES ELEKTRONIK
+0x001F44, GE Transportation Systems
+0x001F45, Enterasys
+0x001F46, Nortel
+0x001F47, MCS Logic Inc.
+0x001F48, Mojix Inc.
+0x001F49, Eurosat Distribution Ltd
+0x001F4A, Albentia Systems S.A.
+0x001F4B, Lineage Power
+0x001F4C, Roseman Engineering Ltd
+0x001F4D, Segnetics LLC
+0x001F4E, ConMed Linvatec
+0x001F4F, Thinkware Co. Ltd.
+0x001F50, Swissdis AG
+0x001F51, HD Communications Corp
+0x001F52, UVT Unternehmensberatung fur Verkehr und Technik GmbH
+0x001F53, GEMAC Gesellschaft für Mikroelektronikanwendung Chemnitz mbH
+0x001F54, Lorex Technology Inc.
+0x001F55, Honeywell Security (China) Co., Ltd.
+0x001F56, DIGITAL FORECAST
+0x001F57, Phonik Innovation Co.,LTD
+0x001F58, EMH Energiemesstechnik GmbH & co.KG
+0x001F59, Kronback Tracers
+0x001F5A, Beckwith Electric Co.
+0x001F5B, Apple, Inc.
+0x001F5C, Nokia Danmark A/S
+0x001F5D, Nokia Danmark A/S
+0x001F5E, Dyna Technology Co.,Ltd.
+0x001F5F, Blatand GmbH
+0x001F60, COMPASS SYSTEMS CORP.
+0x001F61, Talent Communication Networks Inc.
+0x001F62, JSC "Stilsoft"
+0x001F63, JSC Goodwin-Europa
+0x001F64, Beijing Autelan Technology Inc.
+0x001F65, KOREA ELECTRIC TERMINAL CO., LTD.
+0x001F66, PLANAR LLC
+0x001F67, Hitachi,Ltd.
+0x001F68, Martinsson Elektronik AB
+0x001F69, Pingood Technology Co., Ltd.
+0x001F6A, PacketFlux Technologies, Inc.
+0x001F6B, LG Electronics
+0x001F6C, CISCO SYSTEMS, INC.
+0x001F6D, CISCO SYSTEMS, INC.
+0x001F6E, Vtech Engineering Corporation
+0x001F6F, Fujian Sunnada Communication Co.,Ltd.
+0x001F70, Botik Technologies LTD
+0x001F71, xG Technology, Inc.
+0x001F72, QingDao Hiphone Technology Co,.Ltd
+0x001F73, Teraview Technology Co., Ltd.
+0x001F74, Eigen Development
+0x001F75, GiBahn Media
+0x001F76, AirLogic Systems Inc.
+0x001F77, HEOL DESIGN
+0x001F78, Blue Fox Porini Textile
+0x001F79, Lodam Electronics A/S
+0x001F7A, WiWide Inc.
+0x001F7B, TechNexion Ltd.
+0x001F7C, Witelcom AS
+0x001F7D, embedded wireless GmbH
+0x001F7E, Motorola Mobility, Inc.
+0x001F7F, Phabrix Limited
+0x001F80, Lucas Holding bv
+0x001F81, Accel Semiconductor Corp
+0x001F82, Cal-Comp Electronics & Communications Co., Ltd
+0x001F83, Teleplan Technology Services Sdn Bhd
+0x001F84, Gigle Semiconductor
+0x001F85, Apriva ISS, LLC
+0x001F86, digEcor
+0x001F87, Skydigital Inc.
+0x001F88, FMS Force Measuring Systems AG
+0x001F89, Signalion GmbH
+0x001F8A, Ellion Digital Inc.
+0x001F8B, Cache IQ
+0x001F8C, CCS Inc.
+0x001F8D, Ingenieurbuero Stark GmbH und Ko. KG
+0x001F8E, Metris USA Inc.
+0x001F8F, Shanghai Bellmann Digital Source Co.,Ltd.
+0x001F90, Actiontec Electronics, Inc
+0x001F91, DBS Lodging Technologies, LLC
+0x001F92, VideoIQ, Inc.
+0x001F93, Xiotech Corporation
+0x001F94, Lascar Electronics Ltd
+0x001F95, SAGEM COMMUNICATION
+0x001F96, APROTECH CO.LTD
+0x001F97, BERTANA SRL
+0x001F98, DAIICHI-DENTSU LTD.
+0x001F99, SERONICS co.ltd
+0x001F9A, Nortel Networks
+0x001F9B, POSBRO
+0x001F9C, LEDCO
+0x001F9D, CISCO SYSTEMS, INC.
+0x001F9E, CISCO SYSTEMS, INC.
+0x001F9F, Thomson Telecom Belgium
+0x001FA0, A10 Networks
+0x001FA1, Gtran Inc
+0x001FA2, Datron World Communications, Inc.
+0x001FA3, T&W Electronics(Shenzhen)Co.,Ltd.
+0x001FA4, ShenZhen Gongjin Electronics Co.,Ltd
+0x001FA5, Blue-White Industries
+0x001FA6, Stilo srl
+0x001FA7, Sony Computer Entertainment Inc.
+0x001FA8, Smart Energy Instruments Inc.
+0x001FA9, Atlanta DTH, Inc.
+0x001FAA, Taseon, Inc.
+0x001FAB, I.S HIGH TECH.INC
+0x001FAC, Goodmill Systems Ltd
+0x001FAD, Brown Innovations, Inc
+0x001FAE, Blick South Africa (Pty) Ltd
+0x001FAF, NextIO, Inc.
+0x001FB0, TimeIPS, Inc.
+0x001FB1, Cybertech Inc.
+0x001FB2, Sontheim Industrie Elektronik GmbH
+0x001FB3, 2Wire
+0x001FB4, SmartShare Systems
+0x001FB5, I/O Interconnect Inc.
+0x001FB6, Chi Lin Technology Co., Ltd.
+0x001FB7, WiMate Technologies Corp.
+0x001FB8, Universal Remote Control, Inc.
+0x001FB9, Paltronics
+0x001FBA, BoYoung Tech. & Marketing, Inc.
+0x001FBB, Xenatech Co.,LTD
+0x001FBC, EVGA Corporation
+0x001FBD, Kyocera Wireless Corp.
+0x001FBE, Shenzhen Mopnet Industrial Co.,Ltd
+0x001FBF, Fulhua Microelectronics Corp. Taiwan Branch
+0x001FC0, Control Express Finland Oy
+0x001FC1, Hanlong Technology Co.,LTD
+0x001FC2, Jow Tong Technology Co Ltd
+0x001FC3, SmartSynch, Inc
+0x001FC4, Motorola Mobility, Inc.
+0x001FC5, Nintendo Co., Ltd.
+0x001FC6, ASUSTek COMPUTER INC.
+0x001FC7, Casio Hitachi Mobile Comunications Co., Ltd.
+0x001FC8, Up-Today Industrial Co., Ltd.
+0x001FC9, CISCO SYSTEMS, INC.
+0x001FCA, CISCO SYSTEMS, INC.
+0x001FCB, NIW Solutions
+0x001FCC, Samsung Electronics Co.,Ltd
+0x001FCD, Samsung Electronics
+0x001FCE, QTECH LLC
+0x001FCF, MSI Technology GmbH
+0x001FD0, GIGA-BYTE TECHNOLOGY CO.,LTD.
+0x001FD1, OPTEX CO.,LTD.
+0x001FD2, COMMTECH TECHNOLOGY MACAO COMMERCIAL OFFSHORE LTD.
+0x001FD3, RIVA Networks Inc.
+0x001FD4, 4IPNET, INC.
+0x001FD5, MICRORISC s.r.o.
+0x001FD6, Shenzhen Allywll
+0x001FD7, TELERAD SA
+0x001FD8, A-TRUST COMPUTER CORPORATION
+0x001FD9, RSD Communications Ltd
+0x001FDA, Nortel Networks
+0x001FDB, Network Supply Corp.,
+0x001FDC, Mobile Safe Track Ltd
+0x001FDD, GDI LLC
+0x001FDE, Nokia Danmark A/S
+0x001FDF, Nokia Danmark A/S
+0x001FE0, EdgeVelocity Corp
+0x001FE1, Hon Hai Precision Ind. Co., Ltd.
+0x001FE2, Hon Hai Precision Ind. Co., Ltd.
+0x001FE3, LG Electronics
+0x001FE4, Sony Ericsson Mobile Communications
+0x001FE5, In-Circuit GmbH
+0x001FE6, Alphion Corporation
+0x001FE7, Simet
+0x001FE8, KURUSUGAWA Electronics Industry Inc,.
+0x001FE9, Printrex, Inc.
+0x001FEA, Applied Media Technologies Corporation
+0x001FEB, Trio Datacom Pty Ltd
+0x001FEC, Synapse Électronique
+0x001FED, Tecan Systems Inc.
+0x001FEE, ubisys technologies GmbH
+0x001FEF, SHINSEI INDUSTRIES CO.,LTD
+0x001FF0, Audio Partnership
+0x001FF1, Paradox Hellas S.A.
+0x001FF2, VIA Technologies, Inc.
+0x001FF3, Apple, Inc
+0x001FF4, Power Monitors, Inc.
+0x001FF5, Kongsberg Defence & Aerospace
+0x001FF6, PS Audio International
+0x001FF7, Nakajima All Precision Co., Ltd.
+0x001FF8, Siemens AG, Sector Industry, Drive Technologies, Motion Control Systems
+0x001FF9, Advanced Knowledge Associates
+0x001FFA, Coretree, Co, Ltd
+0x001FFB, Green Packet Bhd
+0x001FFC, Riccius+Sohn GmbH
+0x001FFD, Indigo Mobile Technologies Corp.
+0x001FFE, ProCurve Networking by HP
+0x001FFF, Respironics, Inc.
+0x002000, LEXMARK INTERNATIONAL, INC.
+0x002001, DSP SOLUTIONS, INC.
+0x002002, SERITECH ENTERPRISE CO., LTD.
+0x002003, PIXEL POWER LTD.
+0x002004, YAMATAKE-HONEYWELL CO., LTD.
+0x002005, SIMPLE TECHNOLOGY
+0x002006, GARRETT COMMUNICATIONS, INC.
+0x002007, SFA, INC.
+0x002008, CABLE & COMPUTER TECHNOLOGY
+0x002009, PACKARD BELL ELEC., INC.
+0x00200A, SOURCE-COMM CORP.
+0x00200B, OCTAGON SYSTEMS CORP.
+0x00200C, ADASTRA SYSTEMS CORP.
+0x00200D, CARL ZEISS
+0x00200E, SATELLITE TECHNOLOGY MGMT, INC
+0x00200F, TANBAC CO., LTD.
+0x002010, JEOL SYSTEM TECHNOLOGY CO. LTD
+0x002011, CANOPUS CO., LTD.
+0x002012, CAMTRONICS MEDICAL SYSTEMS
+0x002013, DIVERSIFIED TECHNOLOGY, INC.
+0x002014, GLOBAL VIEW CO., LTD.
+0x002015, ACTIS COMPUTER SA
+0x002016, SHOWA ELECTRIC WIRE & CABLE CO
+0x002017, ORBOTECH
+0x002018, CIS TECHNOLOGY INC.
+0x002019, OHLER GmbH
+0x00201A, MRV Communications, Inc.
+0x00201B, NORTHERN TELECOM/NETWORK
+0x00201C, EXCEL, INC.
+0x00201D, KATANA PRODUCTS
+0x00201E, NETQUEST CORPORATION
+0x00201F, BEST POWER TECHNOLOGY, INC.
+0x002020, MEGATRON COMPUTER INDUSTRIES PTY, LTD.
+0x002021, ALGORITHMS SOFTWARE PVT. LTD.
+0x002022, NMS Communications
+0x002023, T.C. TECHNOLOGIES PTY. LTD
+0x002024, PACIFIC COMMUNICATION SCIENCES
+0x002025, CONTROL TECHNOLOGY, INC.
+0x002026, AMKLY SYSTEMS, INC.
+0x002027, MING FORTUNE INDUSTRY CO., LTD
+0x002028, WEST EGG SYSTEMS, INC.
+0x002029, TELEPROCESSING PRODUCTS, INC.
+0x00202A, N.V. DZINE
+0x00202B, ADVANCED TELECOMMUNICATIONS MODULES, LTD.
+0x00202C, WELLTRONIX CO., LTD.
+0x00202D, TAIYO CORPORATION
+0x00202E, DAYSTAR DIGITAL
+0x00202F, ZETA COMMUNICATIONS, LTD.
+0x002030, ANALOG & DIGITAL SYSTEMS
+0x002031, Tattile SRL
+0x002032, ALCATEL TAISEL
+0x002033, SYNAPSE TECHNOLOGIES, INC.
+0x002034, ROTEC INDUSTRIEAUTOMATION GMBH
+0x002035, IBM Corp
+0x002036, BMC SOFTWARE
+0x002037, SEAGATE TECHNOLOGY
+0x002038, VME MICROSYSTEMS INTERNATIONAL CORPORATION
+0x002039, SCINETS
+0x00203A, DIGITAL BI0METRICS INC.
+0x00203B, WISDM LTD.
+0x00203C, EUROTIME AB
+0x00203D, Honeywell ECC
+0x00203E, LogiCan Technologies, Inc.
+0x00203F, JUKI CORPORATION
+0x002040, Motorola Broadband Communications Sector
+0x002041, DATA NET
+0x002042, DATAMETRICS CORP.
+0x002043, NEURON COMPANY LIMITED
+0x002044, GENITECH PTY LTD
+0x002045, ION Networks, Inc.
+0x002046, CIPRICO, INC.
+0x002047, STEINBRECHER CORP.
+0x002048, Marconi Communications
+0x002049, COMTRON, INC.
+0x00204A, PRONET GMBH
+0x00204B, AUTOCOMPUTER CO., LTD.
+0x00204C, MITRON COMPUTER PTE LTD.
+0x00204D, INOVIS GMBH
+0x00204E, NETWORK SECURITY SYSTEMS, INC.
+0x00204F, DEUTSCHE AEROSPACE AG
+0x002050, KOREA COMPUTER INC.
+0x002051, Verilink Corporation
+0x002052, RAGULA SYSTEMS
+0x002053, HUNTSVILLE MICROSYSTEMS, INC.
+0x002054, Sycamore Networks
+0x002055, ALTECH CO., LTD.
+0x002056, NEOPRODUCTS
+0x002057, TITZE DATENTECHNIK GmbH
+0x002058, ALLIED SIGNAL INC.
+0x002059, MIRO COMPUTER PRODUCTS AG
+0x00205A, COMPUTER IDENTICS
+0x00205B, Kentrox, LLC
+0x00205C, InterNet Systems of Florida, Inc.
+0x00205D, NANOMATIC OY
+0x00205E, CASTLE ROCK, INC.
+0x00205F, GAMMADATA COMPUTER GMBH
+0x002060, ALCATEL ITALIA S.p.A.
+0x002061, GarrettCom, Inc.
+0x002062, SCORPION LOGIC, LTD.
+0x002063, WIPRO INFOTECH LTD.
+0x002064, PROTEC MICROSYSTEMS, INC.
+0x002065, SUPERNET NETWORKING INC.
+0x002066, GENERAL MAGIC, INC.
+0x002067, PRIVATE
+0x002068, ISDYNE
+0x002069, ISDN SYSTEMS CORPORATION
+0x00206A, OSAKA COMPUTER CORP.
+0x00206B, KONICA MINOLTA HOLDINGS, INC.
+0x00206C, EVERGREEN TECHNOLOGY CORP.
+0x00206D, DATA RACE, INC.
+0x00206E, XACT, INC.
+0x00206F, FLOWPOINT CORPORATION
+0x002070, HYNET, LTD.
+0x002071, IBR GMBH
+0x002072, WORKLINK INNOVATIONS
+0x002073, FUSION SYSTEMS CORPORATION
+0x002074, SUNGWOON SYSTEMS
+0x002075, MOTOROLA COMMUNICATION ISRAEL
+0x002076, REUDO CORPORATION
+0x002077, KARDIOS SYSTEMS CORP.
+0x002078, RUNTOP, INC.
+0x002079, MIKRON GMBH
+0x00207A, WiSE Communications, Inc.
+0x00207B, Intel Corporation
+0x00207C, AUTEC GmbH
+0x00207D, ADVANCED COMPUTER APPLICATIONS
+0x00207E, FINECOM Co., Ltd.
+0x00207F, KYOEI SANGYO CO., LTD.
+0x002080, SYNERGY (UK) LTD.
+0x002081, TITAN ELECTRONICS
+0x002082, ONEAC CORPORATION
+0x002083, PRESTICOM INCORPORATED
+0x002084, OCE PRINTING SYSTEMS, GMBH
+0x002085, EXIDE ELECTRONICS
+0x002086, MICROTECH ELECTRONICS LIMITED
+0x002087, MEMOTEC, INC.
+0x002088, GLOBAL VILLAGE COMMUNICATION
+0x002089, T3PLUS NETWORKING, INC.
+0x00208A, SONIX COMMUNICATIONS, LTD.
+0x00208B, LAPIS TECHNOLOGIES, INC.
+0x00208C, GALAXY NETWORKS, INC.
+0x00208D, CMD TECHNOLOGY
+0x00208E, CHEVIN SOFTWARE ENG. LTD.
+0x00208F, ECI TELECOM LTD.
+0x002090, ADVANCED COMPRESSION TECHNOLOGY, INC.
+0x002091, J125, NATIONAL SECURITY AGENCY
+0x002092, CHESS ENGINEERING B.V.
+0x002093, LANDINGS TECHNOLOGY CORP.
+0x002094, CUBIX CORPORATION
+0x002095, RIVA ELECTRONICS
+0x002096, Invensys
+0x002097, APPLIED SIGNAL TECHNOLOGY
+0x002098, HECTRONIC AB
+0x002099, BON ELECTRIC CO., LTD.
+0x00209A, THE 3DO COMPANY
+0x00209B, ERSAT ELECTRONIC GMBH
+0x00209C, PRIMARY ACCESS CORP.
+0x00209D, LIPPERT AUTOMATIONSTECHNIK
+0x00209E, BROWN'S OPERATING SYSTEM SERVICES, LTD.
+0x00209F, MERCURY COMPUTER SYSTEMS, INC.
+0x0020A0, OA LABORATORY CO., LTD.
+0x0020A1, DOVATRON
+0x0020A2, GALCOM NETWORKING LTD.
+0x0020A3, Harmonic, Inc
+0x0020A4, MULTIPOINT NETWORKS
+0x0020A5, API ENGINEERING
+0x0020A6, Proxim Wireless
+0x0020A7, PAIRGAIN TECHNOLOGIES, INC.
+0x0020A8, SAST TECHNOLOGY CORP.
+0x0020A9, WHITE HORSE INDUSTRIAL
+0x0020AA, Ericsson Television Limited
+0x0020AB, MICRO INDUSTRIES CORP.
+0x0020AC, INTERFLEX DATENSYSTEME GMBH
+0x0020AD, LINQ SYSTEMS
+0x0020AE, ORNET DATA COMMUNICATION TECH.
+0x0020AF, 3COM CORPORATION
+0x0020B0, GATEWAY DEVICES, INC.
+0x0020B1, COMTECH RESEARCH INC.
+0x0020B2, GKD Gesellschaft Fur Kommunikation Und Datentechnik
+0x0020B3, Tattile SRL
+0x0020B4, TERMA ELEKTRONIK AS
+0x0020B5, YASKAWA ELECTRIC CORPORATION
+0x0020B6, AGILE NETWORKS, INC.
+0x0020B7, NAMAQUA COMPUTERWARE
+0x0020B8, PRIME OPTION, INC.
+0x0020B9, METRICOM, INC.
+0x0020BA, CENTER FOR HIGH PERFORMANCE
+0x0020BB, ZAX CORPORATION
+0x0020BC, Long Reach Networks Pty Ltd
+0x0020BD, NIOBRARA R & D CORPORATION
+0x0020BE, LAN ACCESS CORP.
+0x0020BF, AEHR TEST SYSTEMS
+0x0020C0, PULSE ELECTRONICS, INC.
+0x0020C1, SAXA, Inc.
+0x0020C2, TEXAS MEMORY SYSTEMS, INC.
+0x0020C3, COUNTER SOLUTIONS LTD.
+0x0020C4, INET,INC.
+0x0020C5, EAGLE TECHNOLOGY
+0x0020C6, NECTEC
+0x0020C7, AKAI Professional M.I. Corp.
+0x0020C8, LARSCOM INCORPORATED
+0x0020C9, VICTRON BV
+0x0020CA, DIGITAL OCEAN
+0x0020CB, PRETEC ELECTRONICS CORP.
+0x0020CC, DIGITAL SERVICES, LTD.
+0x0020CD, HYBRID NETWORKS, INC.
+0x0020CE, LOGICAL DESIGN GROUP, INC.
+0x0020CF, TEST & MEASUREMENT SYSTEMS INC
+0x0020D0, VERSALYNX CORPORATION
+0x0020D1, MICROCOMPUTER SYSTEMS (M) SDN.
+0x0020D2, RAD DATA COMMUNICATIONS, LTD.
+0x0020D3, OST (OUEST STANDARD TELEMATIQU
+0x0020D4, CABLETRON - ZEITTNET INC.
+0x0020D5, VIPA GMBH
+0x0020D6, BREEZECOM
+0x0020D7, JAPAN MINICOMPUTER SYSTEMS CO., Ltd.
+0x0020D8, Nortel Networks
+0x0020D9, PANASONIC TECHNOLOGIES, INC./MIECO-US
+0x0020DA, Alcatel North America ESD
+0x0020DB, XNET TECHNOLOGY, INC.
+0x0020DC, DENSITRON TAIWAN LTD.
+0x0020DD, Cybertec Pty Ltd
+0x0020DE, JAPAN DIGITAL LABORAT'Y CO.LTD
+0x0020DF, KYOSAN ELECTRIC MFG. CO., LTD.
+0x0020E0, Actiontec Electronics, Inc.
+0x0020E1, ALAMAR ELECTRONICS
+0x0020E2, INFORMATION RESOURCE ENGINEERING
+0x0020E3, MCD KENCOM CORPORATION
+0x0020E4, HSING TECH ENTERPRISE CO., LTD
+0x0020E5, APEX DATA, INC.
+0x0020E6, LIDKOPING MACHINE TOOLS AB
+0x0020E7, B&W NUCLEAR SERVICE COMPANY
+0x0020E8, DATATREK CORPORATION
+0x0020E9, DANTEL
+0x0020EA, EFFICIENT NETWORKS, INC.
+0x0020EB, CINCINNATI MICROWAVE, INC.
+0x0020EC, TECHWARE SYSTEMS CORP.
+0x0020ED, GIGA-BYTE TECHNOLOGY CO., LTD.
+0x0020EE, GTECH CORPORATION
+0x0020EF, USC CORPORATION
+0x0020F0, UNIVERSAL MICROELECTRONICS CO.
+0x0020F1, ALTOS INDIA LIMITED
+0x0020F2, Oracle Corporation
+0x0020F3, RAYNET CORPORATION
+0x0020F4, SPECTRIX CORPORATION
+0x0020F5, PANDATEL AG
+0x0020F6, NET TEK AND KARLNET, INC.
+0x0020F7, CYBERDATA CORPORATION
+0x0020F8, CARRERA COMPUTERS, INC.
+0x0020F9, PARALINK NETWORKS, INC.
+0x0020FA, GDE SYSTEMS, INC.
+0x0020FB, OCTEL COMMUNICATIONS CORP.
+0x0020FC, MATROX
+0x0020FD, ITV TECHNOLOGIES, INC.
+0x0020FE, TOPWARE INC. / GRAND COMPUTER
+0x0020FF, SYMMETRICAL TECHNOLOGIES
+0x002100, GemTek Technology Co., Ltd.
+0x002101, Aplicaciones Electronicas Quasar (AEQ)
+0x002102, UpdateLogic Inc.
+0x002103, GHI Electronics, LLC
+0x002104, Gigaset Communications GmbH
+0x002105, Alcatel-Lucent
+0x002106, RIM Testing Services
+0x002107, Seowonintech Co Ltd.
+0x002108, Nokia Danmark A/S
+0x002109, Nokia Danmark A/S
+0x00210A, byd:sign Corporation
+0x00210B, GEMINI TRAZE RFID PVT. LTD.
+0x00210C, Cymtec Systems, Inc.
+0x00210D, SAMSIN INNOTEC
+0x00210E, Orpak Systems L.T.D.
+0x00210F, Cernium Corp
+0x002110, Clearbox Systems
+0x002111, Uniphone Inc.
+0x002112, WISCOM SYSTEM CO.,LTD
+0x002113, Padtec S/A
+0x002114, Hylab Technology Inc.
+0x002115, PHYWE Systeme GmbH & Co. KG
+0x002116, Transcon Electronic Systems, spol. s r. o.
+0x002117, Tellord
+0x002118, Athena Tech, Inc.
+0x002119, Samsung Electro-Mechanics
+0x00211A, LInTech Corporation
+0x00211B, CISCO SYSTEMS, INC.
+0x00211C, CISCO SYSTEMS, INC.
+0x00211D, Dataline AB
+0x00211E, Motorola Mobility, Inc.
+0x00211F, SHINSUNG DELTATECH CO.,LTD.
+0x002120, Sequel Technologies
+0x002121, VRmagic GmbH
+0x002122, Chip-pro Ltd.
+0x002123, Aerosat Avionics
+0x002124, Optos Plc
+0x002125, KUK JE TONG SHIN Co.,LTD
+0x002126, Shenzhen Torch Equipment Co., Ltd.
+0x002127, TP-LINK Technology Co., Ltd.
+0x002128, Oracle Corporation
+0x002129, Cisco-Linksys, LLC
+0x00212A, Audiovox Corporation
+0x00212B, MSA Auer
+0x00212C, SemIndia System Private Limited
+0x00212D, SCIMOLEX CORPORATION
+0x00212E, dresden-elektronik
+0x00212F, Phoebe Micro Inc.
+0x002130, Keico Hightech Inc.
+0x002131, Blynke Inc.
+0x002132, Masterclock, Inc.
+0x002133, Building B, Inc
+0x002134, Brandywine Communications
+0x002135, ALCATEL-LUCENT
+0x002136, Motorola Mobility, Inc.
+0x002137, Bay Controls, LLC
+0x002138, Cepheid
+0x002139, Escherlogic Inc.
+0x00213A, Winchester Systems Inc.
+0x00213B, Berkshire Products, Inc
+0x00213C, AliphCom
+0x00213D, Cermetek Microelectronics, Inc.
+0x00213E, TomTom
+0x00213F, A-Team Technology Ltd.
+0x002140, EN Technologies Inc.
+0x002141, RADLIVE
+0x002142, Advanced Control Systems doo
+0x002143, Motorola Mobility, Inc.
+0x002144, SS Telecoms
+0x002145, Semptian Technologies Ltd.
+0x002146, SCI Technology
+0x002147, Nintendo Co., Ltd.
+0x002148, Kaco Solar Korea
+0x002149, China Daheng Group ,Inc.
+0x00214A, Pixel Velocity, Inc
+0x00214B, Shenzhen HAMP Science & Technology Co.,Ltd
+0x00214C, SAMSUNG ELECTRONICS CO., LTD.
+0x00214D, Guangzhou Skytone Transmission Technology Com. Ltd.
+0x00214E, GS Yuasa Power Supply Ltd.
+0x00214F, ALPS Electric Co., Ltd
+0x002150, EYEVIEW ELECTRONICS
+0x002151, Millinet Co., Ltd.
+0x002152, General Satellite Research & Development Limited
+0x002153, SeaMicro Inc.
+0x002154, D-TACQ Solutions Ltd
+0x002155, CISCO SYSTEMS, INC.
+0x002156, CISCO SYSTEMS, INC.
+0x002157, National Datacast, Inc.
+0x002158, Style Flying Technology Co.
+0x002159, Juniper Networks
+0x00215A, Hewlett-Packard Company
+0x00215B, Inotive
+0x00215C, Intel Corporate
+0x00215D, Intel Corporate
+0x00215E, IBM Corp
+0x00215F, IHSE GmbH
+0x002160, Hidea Solutions Co. Ltd.
+0x002161, Yournet Inc.
+0x002162, Nortel
+0x002163, ASKEY COMPUTER CORP
+0x002164, Special Design Bureau for Seismic Instrumentation
+0x002165, Presstek Inc.
+0x002166, NovAtel Inc.
+0x002167, HWA JIN T&I Corp.
+0x002168, iVeia, LLC
+0x002169, Prologix, LLC.
+0x00216A, Intel Corporate
+0x00216B, Intel Corporate
+0x00216C, ODVA
+0x00216D, Soltech Co., Ltd.
+0x00216E, Function ATI (Huizhou) Telecommunications Co., Ltd.
+0x00216F, SymCom, Inc.
+0x002170, Dell Inc
+0x002171, Wesung TNC Co., Ltd.
+0x002172, Seoultek Valley
+0x002173, Ion Torrent Systems, Inc.
+0x002174, AvaLAN Wireless
+0x002175, Pacific Satellite International Ltd.
+0x002176, YMax Telecom Ltd.
+0x002177, W. L. Gore & Associates
+0x002178, Matuschek Messtechnik GmbH
+0x002179, IOGEAR, Inc.
+0x00217A, Sejin Electron, Inc.
+0x00217B, Bastec AB
+0x00217C, 2Wire
+0x00217D, PYXIS S.R.L.
+0x00217E, Telit Communication s.p.a
+0x00217F, Intraco Technology Pte Ltd
+0x002180, Motorola Mobility, Inc.
+0x002181, Si2 Microsystems Limited
+0x002182, SandLinks Systems, Ltd.
+0x002183, VATECH HYDRO
+0x002184, POWERSOFT SRL
+0x002185, MICRO-STAR INT'L CO.,LTD.
+0x002186, Universal Global Scientific Industrial Co., Ltd
+0x002187, Imacs GmbH
+0x002188, EMC Corporation
+0x002189, AppTech, Inc.
+0x00218A, Electronic Design and Manufacturing Company
+0x00218B, Wescon Technology, Inc.
+0x00218C, TopControl GMBH
+0x00218D, AP Router Ind. Eletronica LTDA
+0x00218E, MEKICS CO., LTD.
+0x00218F, Avantgarde Acoustic Lautsprechersysteme GmbH
+0x002190, Goliath Solutions
+0x002191, D-Link Corporation
+0x002192, Baoding Galaxy Electronic Technology Co.,Ltd
+0x002193, Videofon MV
+0x002194, Ping Communication
+0x002195, GWD Media Limited
+0x002196, Telsey S.p.A.
+0x002197, ELITEGROUP COMPUTER SYSTEM
+0x002198, Thai Radio Co, LTD
+0x002199, Vacon Plc
+0x00219A, Cambridge Visual Networks Ltd
+0x00219B, Dell Inc
+0x00219C, Honeywld Technology Corp.
+0x00219D, Adesys BV
+0x00219E, Sony Ericsson Mobile Communications
+0x00219F, SATEL OY
+0x0021A0, CISCO SYSTEMS, INC.
+0x0021A1, CISCO SYSTEMS, INC.
+0x0021A2, EKE-Electronics Ltd.
+0x0021A3, Micromint
+0x0021A4, Dbii Networks
+0x0021A5, ERLPhase Power Technologies Ltd.
+0x0021A6, Videotec Spa
+0x0021A7, Hantle System Co., Ltd.
+0x0021A8, Telephonics Corporation
+0x0021A9, Mobilink Telecom Co.,Ltd
+0x0021AA, Nokia Danmark A/S
+0x0021AB, Nokia Danmark A/S
+0x0021AC, Infrared Integrated Systems Ltd
+0x0021AD, Nordic ID Oy
+0x0021AE, ALCATEL-LUCENT FRANCE - WTD
+0x0021AF, Radio Frequency Systems
+0x0021B0, Tyco Telecommunications
+0x0021B1, DIGITAL SOLUTIONS LTD
+0x0021B2, Fiberblaze A/S
+0x0021B3, Ross Controls
+0x0021B4, APRO MEDIA CO., LTD
+0x0021B5, Vyro Games Limited
+0x0021B6, Triacta Power Technologies Inc.
+0x0021B7, Lexmark International Inc.
+0x0021B8, Inphi Corporation
+0x0021B9, Universal Devices Inc.
+0x0021BA, Texas Instruments
+0x0021BB, Riken Keiki Co., Ltd.
+0x0021BC, ZALA COMPUTER
+0x0021BD, Nintendo Co., Ltd.
+0x0021BE, Cisco, Service Provider Video Technology Group
+0x0021BF, Hitachi High-Tech Control Systems Corporation
+0x0021C0, Mobile Appliance, Inc.
+0x0021C1, ABB Oy / Distribution Automation
+0x0021C2, GL Communications Inc
+0x0021C3, CORNELL Communications, Inc.
+0x0021C4, Consilium AB
+0x0021C5, 3DSP Corp
+0x0021C6, CSJ Global, Inc.
+0x0021C7, Russound
+0x0021C8, LOHUIS Networks
+0x0021C9, Wavecom Asia Pacific Limited
+0x0021CA, ART System Co., Ltd.
+0x0021CB, SMS TECNOLOGIA ELETRONICA LTDA
+0x0021CC, Flextronics International
+0x0021CD, LiveTV
+0x0021CE, NTC-Metrotek
+0x0021CF, The Crypto Group
+0x0021D0, Global Display Solutions Spa
+0x0021D1, Samsung Electronics Co.,Ltd
+0x0021D2, Samsung Electronics Co.,Ltd
+0x0021D3, BOCOM SECURITY(ASIA PACIFIC) LIMITED
+0x0021D4, Vollmer Werke GmbH
+0x0021D5, X2E GmbH
+0x0021D6, LXI Consortium
+0x0021D7, CISCO SYSTEMS, INC.
+0x0021D8, CISCO SYSTEMS, INC.
+0x0021D9, SEKONIC CORPORATION
+0x0021DA, Automation Products Group Inc.
+0x0021DB, Santachi Video Technology (Shenzhen) Co., Ltd.
+0x0021DC, TECNOALARM S.r.l.
+0x0021DD, Northstar Systems Corp
+0x0021DE, Firepro Wireless
+0x0021DF, Martin Christ GmbH
+0x0021E0, CommAgility Ltd
+0x0021E1, Nortel Networks
+0x0021E2, Creative Electronic GmbH
+0x0021E3, SerialTek LLC
+0x0021E4, I-WIN
+0x0021E5, Display Solution AG
+0x0021E6, Starlight Video Limited
+0x0021E7, Informatics Services Corporation
+0x0021E8, Murata Manufacturing Co., Ltd.
+0x0021E9, Apple, Inc
+0x0021EA, Bystronic Laser AG
+0x0021EB, ESP SYSTEMS, LLC
+0x0021EC, Solutronic GmbH
+0x0021ED, Telegesis
+0x0021EE, Full Spectrum Inc.
+0x0021EF, Kapsys
+0x0021F0, EW3 Technologies LLC
+0x0021F1, Tutus Data AB
+0x0021F2, EASY3CALL Technology Limited
+0x0021F3, Si14 SpA
+0x0021F4, INRange Systems, Inc
+0x0021F5, Western Engravers Supply, Inc.
+0x0021F6, Oracle Corporation
+0x0021F7, ProCurve Networking by HP
+0x0021F8, Enseo, Inc.
+0x0021F9, WIRECOM Technologies
+0x0021FA, A4SP Technologies Ltd.
+0x0021FB, LG Electronics
+0x0021FC, Nokia Danmark A/S
+0x0021FD, DSTA S.L.
+0x0021FE, Nokia Danmark A/S
+0x0021FF, Cyfrowy Polsat SA
+0x002200, IBM Corp
+0x002201, Aksys Networks Inc
+0x002202, Excito Elektronik i Skåne AB
+0x002203, Glensound Electronics Ltd
+0x002204, KORATEK
+0x002205, WeLink Solutions, Inc.
+0x002206, Cyberdyne Inc.
+0x002207, Inteno Broadband Technology AB
+0x002208, Certicom Corp
+0x002209, Omron Healthcare Co., Ltd
+0x00220A, OnLive, Inc
+0x00220B, National Source Coding Center
+0x00220C, CISCO SYSTEMS, INC.
+0x00220D, CISCO SYSTEMS, INC.
+0x00220E, Indigo Security Co., Ltd.
+0x00220F, MoCA (Multimedia over Coax Alliance)
+0x002210, Motorola Mobility, Inc.
+0x002211, Rohati Systems
+0x002212, CAI Networks, Inc.
+0x002213, PCI CORPORATION
+0x002214, RINNAI KOREA
+0x002215, ASUSTek COMPUTER INC.
+0x002216, SHIBAURA VENDING MACHINE CORPORATION
+0x002217, Neat Electronics
+0x002218, Verivue Inc.
+0x002219, Dell Inc
+0x00221A, Audio Precision
+0x00221B, Morega Systems
+0x00221C, PRIVATE
+0x00221D, Freegene Technology LTD
+0x00221E, Media Devices Co., Ltd.
+0x00221F, eSang Technologies Co., Ltd.
+0x002220, Mitac Technology Corp
+0x002221, ITOH DENKI CO,LTD.
+0x002222, Schaffner Deutschland GmbH
+0x002223, TimeKeeping Systems, Inc.
+0x002224, Good Will Instrument Co., Ltd.
+0x002225, Thales Avionics Ltd
+0x002226, Avaak, Inc.
+0x002227, uv-electronic GmbH
+0x002228, Breeze Innovations Ltd.
+0x002229, Compumedics Ltd
+0x00222A, SoundEar A/S
+0x00222B, Nucomm, Inc.
+0x00222C, Ceton Corp
+0x00222D, SMC Networks Inc.
+0x00222E, maintech GmbH
+0x00222F, Open Grid Computing, Inc.
+0x002230, FutureLogic Inc.
+0x002231, SMT&C Co., Ltd.
+0x002232, Design Design Technology Ltd
+0x002233, ADB Broadband Italia
+0x002234, Corventis Inc.
+0x002235, Strukton Systems bv
+0x002236, VECTOR SP. Z O.O.
+0x002237, Shinhint Group
+0x002238, LOGIPLUS
+0x002239, Indiana Life Sciences Incorporated
+0x00223A, Scientific Atlanta, Cisco SPVT Group
+0x00223B, Communication Networks, LLC
+0x00223C, RATIO Entwicklungen GmbH
+0x00223D, JumpGen Systems, LLC
+0x00223E, IRTrans GmbH
+0x00223F, Netgear Inc.
+0x002240, Universal Telecom S/A
+0x002241, Apple, Inc
+0x002242, Alacron Inc.
+0x002243, AzureWave Technologies, Inc.
+0x002244, Chengdu Linkon Communications Device Co., Ltd
+0x002245, Leine & Linde AB
+0x002246, Evoc Intelligent Technology Co.,Ltd.
+0x002247, DAC ENGINEERING CO., LTD.
+0x002248, Microsoft Corporation
+0x002249, HOME MULTIENERGY SL
+0x00224A, RAYLASE AG
+0x00224B, AIRTECH TECHNOLOGIES, INC.
+0x00224C, Nintendo Co., Ltd.
+0x00224D, MITAC INTERNATIONAL CORP.
+0x00224E, SEEnergy Corp.
+0x00224F, Byzoro Networks Ltd.
+0x002250, Point Six Wireless, LLC
+0x002251, Lumasense Technologies
+0x002252, ZOLL Lifecor Corporation
+0x002253, Entorian Technologies
+0x002254, Bigelow Aerospace
+0x002255, CISCO SYSTEMS, INC.
+0x002256, CISCO SYSTEMS, INC.
+0x002257, 3Com Europe Ltd
+0x002258, Taiyo Yuden Co., Ltd.
+0x002259, Guangzhou New Postcom Equipment Co.,Ltd.
+0x00225A, Garde Security AB
+0x00225B, Teradici Corporation
+0x00225C, Multimedia & Communication Technology
+0x00225D, Digicable Network India Pvt. Ltd.
+0x00225E, Uwin Technologies Co.,LTD
+0x00225F, Liteon Technology Corporation
+0x002260, AFREEY Inc.
+0x002261, Frontier Silicon Ltd
+0x002262, BEP Marine
+0x002263, Koos Technical Services, Inc.
+0x002264, Hewlett-Packard Company
+0x002265, Nokia Danmark A/S
+0x002266, Nokia Danmark A/S
+0x002267, Nortel Networks
+0x002268, Hon Hai Precision Ind. Co., Ltd.
+0x002269, Hon Hai Precision Ind. Co., Ltd.
+0x00226A, Honeywell
+0x00226B, Cisco-Linksys, LLC
+0x00226C, LinkSprite Technologies, Inc.
+0x00226D, Shenzhen GIEC Electronics Co., Ltd.
+0x00226E, Gowell Electronic Limited
+0x00226F, 3onedata Technology Co. Ltd.
+0x002270, ABK North America, LLC
+0x002271, Jäger Computergesteuerte Meßtechnik GmbH.
+0x002272, American Micro-Fuel Device Corp.
+0x002273, Techway
+0x002274, FamilyPhone AB
+0x002275, Belkin International Inc.
+0x002276, Triple EYE B.V.
+0x002277, NEC Australia Pty Ltd
+0x002278, Shenzhen Tongfang Multimedia Technology Co.,Ltd.
+0x002279, Nippon Conlux Co., Ltd.
+0x00227A, Telecom Design
+0x00227B, Apogee Labs, Inc.
+0x00227C, Woori SMT Co.,ltd
+0x00227D, YE DATA INC.
+0x00227E, Chengdu 30Kaitian Communication Industry Co.Ltd
+0x00227F, Ruckus Wireless
+0x002280, A2B Electronics AB
+0x002281, Daintree Networks Pty
+0x002282, 8086 Consultancy
+0x002283, Juniper Networks
+0x002284, DESAY A&V SCIENCE AND TECHNOLOGY CO.,LTD
+0x002285, NOMUS COMM SYSTEMS
+0x002286, ASTRON
+0x002287, Titan Wireless LLC
+0x002288, Sagrad, Inc.
+0x002289, Optosecurity Inc.
+0x00228A, Teratronik elektronische systeme gmbh
+0x00228B, Kensington Computer Products Group
+0x00228C, Photon Europe GmbH
+0x00228D, GBS Laboratories LLC
+0x00228E, TV-NUMERIC
+0x00228F, CNRS
+0x002290, CISCO SYSTEMS, INC.
+0x002291, CISCO SYSTEMS, INC.
+0x002292, Cinetal
+0x002293, ZTE Corporation
+0x002294, Kyocera Corporation
+0x002295, SGM Technology for lighting spa
+0x002296, LinoWave Corporation
+0x002297, XMOS Semiconductor
+0x002298, Sony Ericsson Mobile Communications
+0x002299, SeaMicro Inc.
+0x00229A, Lastar, Inc.
+0x00229B, AverLogic Technologies, Inc.
+0x00229C, Verismo Networks Inc
+0x00229D, PYUNG-HWA IND.CO.,LTD
+0x00229E, Social Aid Research Co., Ltd.
+0x00229F, Sensys Traffic AB
+0x0022A0, Delphi Corporation
+0x0022A1, Huawei Symantec Technologies Co.,Ltd.
+0x0022A2, Xtramus Technologies
+0x0022A3, California Eastern Laboratories
+0x0022A4, 2Wire
+0x0022A5, Texas Instruments
+0x0022A6, Sony Computer Entertainment America
+0x0022A7, Tyco Electronics AMP GmbH
+0x0022A8, Ouman Finland Oy
+0x0022A9, LG Electronics Inc
+0x0022AA, Nintendo Co., Ltd.
+0x0022AB, Shenzhen Turbosight Technology Ltd
+0x0022AC, Hangzhou Siyuan Tech. Co., Ltd
+0x0022AD, TELESIS TECHNOLOGIES, INC.
+0x0022AE, Mattel Inc.
+0x0022AF, Safety Vision
+0x0022B0, D-Link Corporation
+0x0022B1, Elbit Systems
+0x0022B2, 4RF Communications Ltd
+0x0022B3, Sei S.p.A.
+0x0022B4, Motorola Mobility, Inc.
+0x0022B5, NOVITA
+0x0022B6, Superflow Technologies Group
+0x0022B7, GSS Grundig SAT-Systems GmbH
+0x0022B8, Norcott
+0x0022B9, Analogix Seminconductor, Inc
+0x0022BA, HUTH Elektronik Systeme GmbH
+0x0022BB, beyerdynamic GmbH & Co. KG
+0x0022BC, JDSU France SAS
+0x0022BD, CISCO SYSTEMS, INC.
+0x0022BE, CISCO SYSTEMS, INC.
+0x0022BF, SieAmp Group of Companies
+0x0022C0, Shenzhen Forcelink Electronic Co, Ltd
+0x0022C1, Active Storage Inc.
+0x0022C2, Proview Eletrônica do Brasil LTDA
+0x0022C3, Zeeport Technology Inc.
+0x0022C4, epro GmbH
+0x0022C5, INFORSON Co,Ltd.
+0x0022C6, Sutus Inc
+0x0022C7, SEGGER Microcontroller GmbH & Co. KG
+0x0022C8, Applied Instruments B.V.
+0x0022C9, Lenord, Bauer & Co GmbH
+0x0022CA, Anviz Biometric Tech. Co., Ltd.
+0x0022CB, IONODES Inc.
+0x0022CC, SciLog, Inc.
+0x0022CD, Ared Technology Co., Ltd.
+0x0022CE, Cisco, Service Provider Video Technology Group
+0x0022CF, PLANEX Communications INC
+0x0022D0, Polar Electro Oy
+0x0022D1, Albrecht Jung GmbH & Co. KG
+0x0022D2, All Earth Comércio de Eletrônicos LTDA.
+0x0022D3, Hub-Tech
+0x0022D4, ComWorth Co., Ltd.
+0x0022D5, Eaton Corp. Electrical Group Data Center Solutions - Pulizzi
+0x0022D6, Cypak AB
+0x0022D7, Nintendo Co., Ltd.
+0x0022D8, Shenzhen GST Security and Safety Technology Limited
+0x0022D9, Fortex Industrial Ltd.
+0x0022DA, ANATEK, LLC
+0x0022DB, Translogic Corporation
+0x0022DC, Vigil Health Solutions Inc.
+0x0022DD, Protecta Electronics Ltd
+0x0022DE, OPPO Digital, Inc.
+0x0022DF, TAMUZ Monitors
+0x0022E0, Atlantic Software Technologies S.r.L.
+0x0022E1, ZORT Labs, LLC.
+0x0022E2, WABTEC Transit Division
+0x0022E3, Amerigon
+0x0022E4, APASS TECHNOLOGY CO., LTD.
+0x0022E5, Fisher-Rosemount Systems Inc.
+0x0022E6, Intelligent Data
+0x0022E7, WPS Parking Systems
+0x0022E8, Applition Co., Ltd.
+0x0022E9, ProVision Communications
+0x0022EA, Rustelcom Inc.
+0x0022EB, Data Respons A/S
+0x0022EC, IDEALBT TECHNOLOGY CORPORATION
+0x0022ED, TSI Power Corporation
+0x0022EE, Algo Communication Products Ltd
+0x0022EF, Ibis Tek, LLC
+0x0022F0, 3 Greens Aviation Limited
+0x0022F1, PRIVATE
+0x0022F2, SunPower Corp
+0x0022F3, SHARP CORPORATION
+0x0022F4, AMPAK Technology, Inc.
+0x0022F5, Advanced Realtime Tracking GmbH
+0x0022F6, Syracuse Research Corporation
+0x0022F7, Conceptronic
+0x0022F8, PIMA Electronic Systems Ltd.
+0x0022F9, Pollin Electronic GmbH
+0x0022FA, Intel Corporate
+0x0022FB, Intel Corporate
+0x0022FC, Nokia Danmark A/S
+0x0022FD, Nokia Danmark A/S
+0x0022FE, Microprocessor Designs Inc
+0x0022FF, NIVIS LLC
+0x002300, Cayee Computer Ltd.
+0x002301, Witron Technology Limited
+0x002302, Cobalt Digital, Inc.
+0x002303, LITE-ON IT Corporation
+0x002304, CISCO SYSTEMS, INC.
+0x002305, CISCO SYSTEMS, INC.
+0x002306, ALPS Electric Co., Ltd
+0x002307, FUTURE INNOVATION TECH CO.,LTD
+0x002308, Arcadyan Technology Corporation
+0x002309, Janam Technologies LLC
+0x00230A, ARBURG GmbH & Co KG
+0x00230B, Motorola Mobility, Inc.
+0x00230C, CLOVER ELECTRONICS CO.,LTD.
+0x00230D, Nortel Networks
+0x00230E, Gorba AG
+0x00230F, Hirsch Electronics Corporation
+0x002310, LNC Technology Co., Ltd.
+0x002311, Gloscom Co., Ltd.
+0x002312, Apple, Inc
+0x002313, Qool Technologies Ltd.
+0x002314, Intel Corporate
+0x002315, Intel Corporate
+0x002316, KISAN ELECTRONICS CO
+0x002317, Lasercraft Inc
+0x002318, Toshiba
+0x002319, Sielox LLC
+0x00231A, ITF Co., Ltd.
+0x00231B, Danaher Motion - Kollmorgen
+0x00231C, Fourier Systems Ltd.
+0x00231D, Deltacom Electronics Ltd
+0x00231E, Cezzer Multimedia Technologies
+0x00231F, Guangda Electronic & Telecommunication Technology Development Co., Ltd.
+0x002320, Nicira Networks
+0x002321, Avitech International Corp
+0x002322, KISS Teknical Solutions, Inc.
+0x002323, Zylin AS
+0x002324, G-PRO COMPUTER
+0x002325, IOLAN Holding
+0x002326, Fujitsu Limited
+0x002327, Shouyo Electronics CO., LTD
+0x002328, ALCON TELECOMMUNICATIONS CO., LTD.
+0x002329, DDRdrive LLC
+0x00232A, eonas IT-Beratung und -Entwicklung GmbH
+0x00232B, IRD A/S
+0x00232C, Senticare
+0x00232D, SandForce
+0x00232E, Kedah Electronics Engineering, LLC
+0x00232F, Advanced Card Systems Ltd.
+0x002330, DIZIPIA, INC.
+0x002331, Nintendo Co., Ltd.
+0x002332, Apple, Inc
+0x002333, CISCO SYSTEMS, INC.
+0x002334, CISCO SYSTEMS, INC.
+0x002335, Linkflex Co.,Ltd
+0x002336, METEL s.r.o.
+0x002337, Global Star Solutions ULC
+0x002338, OJ-Electronics A/S
+0x002339, Samsung Electronics
+0x00233A, Samsung Electronics Co.,Ltd
+0x00233B, C-Matic Systems Ltd
+0x00233C, Alflex
+0x00233D, Novero holding B.V.
+0x00233E, Alcatel-Lucent-IPD
+0x00233F, Purechoice Inc
+0x002340, MiX Telematics
+0x002341, Siemens AG, Infrastructure & Cities Sector, Building Technologies Division
+0x002342, Coffee Equipment Company
+0x002343, TEM AG
+0x002344, Objective Interface Systems
+0x002345, Sony Ericsson Mobile Communications
+0x002346, Vestac
+0x002347, ProCurve Networking by HP
+0x002348, SAGEM COMMUNICATION
+0x002349, Helmholtz Centre Berlin for Material and Energy
+0x00234A, PRIVATE
+0x00234B, Inyuan Technology Inc.
+0x00234C, KTC AB
+0x00234D, Hon Hai Precision Ind. Co., Ltd.
+0x00234E, Hon Hai Precision Ind. Co., Ltd.
+0x00234F, Luminous Power Technologies Pvt. Ltd.
+0x002350, LynTec
+0x002351, 2Wire
+0x002352, DATASENSOR S.p.A.
+0x002353, F E T Elettronica snc
+0x002354, ASUSTek COMPUTER INC.
+0x002355, Kinco Automation(Shanghai) Ltd.
+0x002356, Packet Forensics LLC
+0x002357, Pitronot Technologies and Engineering P.T.E. Ltd.
+0x002358, SYSTEL SA
+0x002359, Benchmark Electronics ( Thailand ) Public Company Limited
+0x00235A, COMPAL INFORMATION (KUNSHAN) CO., Ltd.
+0x00235B, Gulfstream
+0x00235C, Aprius, Inc.
+0x00235D, CISCO SYSTEMS, INC.
+0x00235E, CISCO SYSTEMS, INC.
+0x00235F, Silicon Micro Sensors GmbH
+0x002360, Lookit Technology Co., Ltd
+0x002361, Unigen Corporation
+0x002362, Goldline Controls
+0x002363, Zhuhai RaySharp Technology Co., Ltd.
+0x002364, Power Instruments Pte Ltd
+0x002365, ELKA-Elektronik GmbH
+0x002366, Beijing Siasun Electronic System Co.,Ltd.
+0x002367, UniControls a.s.
+0x002368, Motorola
+0x002369, Cisco-Linksys, LLC
+0x00236A, SmartRG Inc
+0x00236B, Xembedded, Inc.
+0x00236C, Apple, Inc
+0x00236D, ResMed Ltd
+0x00236E, Burster GmbH & Co KG
+0x00236F, DAQ System
+0x002370, Snell
+0x002371, SOAM Systel
+0x002372, MORE STAR INDUSTRIAL GROUP LIMITED
+0x002373, GridIron Systems, Inc.
+0x002374, Motorola Mobility, Inc.
+0x002375, Motorola Mobility, Inc.
+0x002376, HTC Corporation
+0x002377, Isotek Electronics Ltd
+0x002378, GN Netcom A/S
+0x002379, Union Business Machines Co. Ltd.
+0x00237A, RIM
+0x00237B, WHDI LLC
+0x00237C, NEOTION
+0x00237D, Hewlett-Packard Company
+0x00237E, ELSTER GMBH
+0x00237F, PLANTRONICS
+0x002380, Nanoteq
+0x002381, Lengda Technology(Xiamen) Co.,Ltd.
+0x002382, Lih Rong Electronic Enterprise Co., Ltd.
+0x002383, InMage Systems Inc
+0x002384, GGH Engineering s.r.l.
+0x002385, ANTIPODE
+0x002386, Tour & Andersson AB
+0x002387, ThinkFlood, Inc.
+0x002388, V.T. Telematica S.p.a.
+0x002389, HANGZHOU H3C Technologies Co., Ltd.
+0x00238A, Ciena Corporation
+0x00238B, Quanta Computer Inc.
+0x00238C, PRIVATE
+0x00238D, Techno Design Co., Ltd.
+0x00238E, ADB Broadband Italia
+0x00238F, NIDEC COPAL CORPORATION
+0x002390, Algolware Corporation
+0x002391, Maxian
+0x002392, Proteus Industries Inc.
+0x002393, AJINEXTEK
+0x002394, Samjeon
+0x002395, Motorola Mobility, Inc.
+0x002396, ANDES TECHNOLOGY CORPORATION
+0x002397, Westell Technologies Inc.
+0x002398, Sky Control
+0x002399, VD Division, Samsung Electronics Co.
+0x00239A, EasyData Hardware GmbH
+0x00239B, Elster Solutions, LLC
+0x00239C, Juniper Networks
+0x00239D, Mapower Electronics Co., Ltd
+0x00239E, Jiangsu Lemote Technology Corporation Limited
+0x00239F, Institut für Prüftechnik
+0x0023A0, Hana CNS Co., LTD.
+0x0023A1, Trend Electronics Ltd
+0x0023A2, Motorola Mobility, Inc.
+0x0023A3, Motorola Mobility, Inc.
+0x0023A4, New Concepts Development Corp.
+0x0023A5, SageTV, LLC
+0x0023A6, E-Mon
+0x0023A7, Redpine Signals, Inc.
+0x0023A8, Marshall Electronics
+0x0023A9, Beijing Detianquan Electromechanical Equipment Co., Ltd
+0x0023AA, HFR, Inc.
+0x0023AB, CISCO SYSTEMS, INC.
+0x0023AC, CISCO SYSTEMS, INC.
+0x0023AD, Xmark Corporation
+0x0023AE, Dell Inc.
+0x0023AF, Motorola Mobility, Inc.
+0x0023B0, COMXION Technology Inc.
+0x0023B1, Longcheer Technology (Singapore) Pte Ltd
+0x0023B2, Intelligent Mechatronic Systems Inc
+0x0023B3, Lyyn AB
+0x0023B4, Nokia Danmark A/S
+0x0023B5, ORTANA LTD
+0x0023B6, SECURITE COMMUNICATIONS / HONEYWELL
+0x0023B7, Q-Light Co., Ltd.
+0x0023B8, Sichuan Jiuzhou Electronic Technology Co.,Ltd
+0x0023B9, EADS Deutschland GmbH
+0x0023BA, Chroma
+0x0023BB, Schmitt Industries
+0x0023BC, EQ-SYS GmbH
+0x0023BD, Digital Ally, Inc.
+0x0023BE, Cisco SPVTG
+0x0023BF, Mainpine, Inc.
+0x0023C0, Broadway Networks
+0x0023C1, Securitas Direct AB
+0x0023C2, SAMSUNG Electronics. Co. LTD
+0x0023C3, LogMeIn, Inc.
+0x0023C4, Lux Lumen
+0x0023C5, Radiation Safety and Control Services Inc
+0x0023C6, SMC Corporation
+0x0023C7, AVSystem
+0x0023C8, TEAM-R
+0x0023C9, Sichuan Tianyi Information Science & Technology Stock CO.,LTD
+0x0023CA, Behind The Set, LLC
+0x0023CB, Shenzhen Full-join Technology Co.,Ltd
+0x0023CC, Nintendo Co., Ltd.
+0x0023CD, TP-LINK TECHNOLOGIES CO., LTD.
+0x0023CE, KITA DENSHI CORPORATION
+0x0023CF, CUMMINS-ALLISON CORP.
+0x0023D0, Uniloc USA Inc.
+0x0023D1, TRG
+0x0023D2, Inhand Electronics, Inc.
+0x0023D3, AirLink WiFi Networking Corp.
+0x0023D4, Texas Instruments
+0x0023D5, WAREMA electronic GmbH
+0x0023D6, Samsung Electronics Co.,LTD
+0x0023D7, Samsung Electronics
+0x0023D8, Ball-It Oy
+0x0023D9, Banner Engineering
+0x0023DA, Industrial Computer Source (Deutschland)GmbH
+0x0023DB, saxnet gmbh
+0x0023DC, Benein, Inc
+0x0023DD, ELGIN S.A.
+0x0023DE, Ansync Inc.
+0x0023DF, Apple, Inc
+0x0023E0, INO Therapeutics LLC
+0x0023E1, Cavena Image Products AB
+0x0023E2, SEA Signalisation
+0x0023E3, Microtronic AG
+0x0023E4, IPnect co. ltd.
+0x0023E5, IPaXiom Networks
+0x0023E6, Pirkus, Inc.
+0x0023E7, Hinke A/S
+0x0023E8, Demco Corp.
+0x0023E9, F5 Networks, Inc.
+0x0023EA, CISCO SYSTEMS, INC.
+0x0023EB, CISCO SYSTEMS, INC.
+0x0023EC, Algorithmix GmbH
+0x0023ED, Motorola CHS
+0x0023EE, Motorola Mobility, Inc.
+0x0023EF, Zuend Systemtechnik AG
+0x0023F0, Shanghai Jinghan Weighing Apparatus Co. Ltd.
+0x0023F1, Sony Ericsson Mobile Communications
+0x0023F2, TVLogic
+0x0023F3, Glocom, Inc.
+0x0023F4, Masternaut
+0x0023F5, WILO SE
+0x0023F6, Softwell Technology Co., Ltd.
+0x0023F7, PRIVATE
+0x0023F8, ZyXEL Communications Corporation
+0x0023F9, Double-Take Software, INC.
+0x0023FA, RG Nets, Inc.
+0x0023FB, IP Datatel, Inc.
+0x0023FC, Ultra Stereo Labs, Inc
+0x0023FD, AFT Atlas Fahrzeugtechnik GmbH
+0x0023FE, Biodevices, SA
+0x0023FF, Beijing HTTC Technology Ltd.
+0x002400, Nortel Networks
+0x002401, D-Link Corporation
+0x002402, Op-Tection GmbH
+0x002403, Nokia Danmark A/S
+0x002404, Nokia Danmark A/S
+0x002405, Dilog Nordic AB
+0x002406, Pointmobile
+0x002407, TELEM SAS
+0x002408, Pacific Biosciences
+0x002409, The Toro Company
+0x00240A, US Beverage Net
+0x00240B, Virtual Computer Inc.
+0x00240C, DELEC GmbH
+0x00240D, OnePath Networks LTD.
+0x00240E, Inventec Besta Co., Ltd.
+0x00240F, Ishii Tool & Engineering Corporation
+0x002410, NUETEQ Technology,Inc.
+0x002411, PharmaSmart LLC
+0x002412, Benign Technologies Co, Ltd.
+0x002413, CISCO SYSTEMS, INC.
+0x002414, CISCO SYSTEMS, INC.
+0x002415, Magnetic Autocontrol GmbH
+0x002416, Any Use
+0x002417, Thomson Telecom Belgium
+0x002418, Nextwave Semiconductor
+0x002419, PRIVATE
+0x00241A, Red Beetle Inc.
+0x00241B, iWOW Communications Pte Ltd
+0x00241C, FuGang Electronic (DG) Co.,Ltd
+0x00241D, GIGA-BYTE TECHNOLOGY CO.,LTD.
+0x00241E, Nintendo Co., Ltd.
+0x00241F, DCT-Delta GmbH
+0x002420, NetUP Inc.
+0x002421, MICRO-STAR INT'L CO., LTD.
+0x002422, Knapp Logistik Automation GmbH
+0x002423, AzureWave Technologies (Shanghai) Inc.
+0x002424, Axis Network Technology
+0x002425, Shenzhenshi chuangzhicheng Technology Co.,Ltd
+0x002426, NOHMI BOSAI LTD.
+0x002427, SSI COMPUTER CORP
+0x002428, EnergyICT
+0x002429, MK MASTER INC.
+0x00242A, Hittite Microwave Corporation
+0x00242B, Hon Hai Precision Ind.Co.,Ltd.
+0x00242C, Hon Hai Precision Ind. Co., Ltd.
+0x00242E, Datastrip Inc.
+0x00242F, VirtenSys Inc
+0x002430, Ruby Tech Corp.
+0x002431, Uni-v co.,ltd
+0x002432, Neostar Technology Co.,LTD
+0x002433, Alps Electric Co., Ltd
+0x002434, Lectrosonics, Inc.
+0x002435, WIDE CORPORATION
+0x002436, Apple, Inc
+0x002437, Motorola - BSG
+0x002438, Brocade Communications Systems, Inc
+0x002439, Essential Viewing Systems Limited
+0x00243A, Ludl Electronic Products
+0x00243B, CSSI (S) Pte Ltd
+0x00243C, S.A.A.A.
+0x00243D, Emerson Appliance Motors and Controls
+0x00243F, Storwize, Inc.
+0x002440, Halo Monitoring, Inc.
+0x002441, Wanzl Metallwarenfabrik GmbH
+0x002442, Axona Limited
+0x002443, Nortel Networks
+0x002444, Nintendo Co., Ltd.
+0x002445, LiquidxStream Systems Inc.
+0x002446, MMB Research Inc.
+0x002447, Kaztek Systems
+0x002448, SpiderCloud Wireless, Inc
+0x002449, Shen Zhen Lite Star Electronics Technology Co., Ltd
+0x00244A, Voyant International
+0x00244B, PERCEPTRON INC
+0x00244C, Solartron Metrology Ltd
+0x00244D, Hokkaido Electronics Corporation
+0x00244E, RadChips, Inc.
+0x00244F, Asantron Technologies Ltd.
+0x002450, CISCO SYSTEMS, INC.
+0x002451, CISCO SYSTEMS, INC.
+0x002452, Silicon Software GmbH
+0x002453, Initra d.o.o.
+0x002454, Samsung Electronics Co., LTD
+0x002455, MuLogic BV
+0x002456, 2Wire
+0x002458, PA Bastion CC
+0x002459, ABB STOTZ-KONTAKT GmbH
+0x00245A, Nanjing Panda Electronics Company Limited
+0x00245B, RAIDON TECHNOLOGY, INC.
+0x00245C, Design-Com Technologies Pty. Ltd.
+0x00245D, Terberg besturingstechniek B.V.
+0x00245E, Hivision Co.,ltd
+0x00245F, Vine Telecom CO.,Ltd.
+0x002460, Giaval Science Development Co. Ltd.
+0x002461, Shin Wang Tech.
+0x002462, Rayzone Corporation
+0x002463, Phybridge Inc
+0x002464, Bridge Technologies Co AS
+0x002465, Elentec
+0x002466, Unitron nv
+0x002467, AOC International (Europe) GmbH
+0x002468, Sumavision Technologies Co.,Ltd
+0x002469, Smart Doorphones
+0x00246A, Solid Year Co., Ltd.
+0x00246B, Covia, Inc.
+0x00246C, ARUBA NETWORKS, INC.
+0x00246D, Weinzierl Engineering GmbH
+0x00246E, Phihong USA Corp.
+0x00246F, Onda Communication spa
+0x002470, AUROTECH ultrasound AS.
+0x002471, Fusion MultiSystems dba Fusion-io
+0x002472, ReDriven Power Inc.
+0x002473, 3Com Europe Ltd
+0x002474, Autronica Fire And Securirty
+0x002475, Compass System(Embedded Dept.)
+0x002476, TAP.tv
+0x002477, Tibbo Technology
+0x002478, Mag Tech Electronics Co Limited
+0x002479, Optec Displays, Inc.
+0x00247A, FU YI CHENG Technology Co., Ltd.
+0x00247B, Actiontec Electronics, Inc
+0x00247C, Nokia Danmark A/S
+0x00247D, Nokia Danmark A/S
+0x00247E, Universal Global Scientific Industrial Co., Ltd
+0x00247F, Nortel Networks
+0x002480, Meteocontrol GmbH
+0x002481, Hewlett-Packard Company
+0x002482, Ruckus Wireless
+0x002483, LG Electronics
+0x002484, Bang and Olufsen Medicom a/s
+0x002485, ConteXtream Ltd
+0x002486, DesignArt Networks
+0x002487, Blackboard Inc.
+0x002488, Centre For Development Of Telematics
+0x002489, Vodafone Omnitel N.V.
+0x00248A, Kaga Electronics Co., Ltd.
+0x00248B, HYBUS CO., LTD.
+0x00248C, ASUSTek COMPUTER INC.
+0x00248D, Sony Computer Entertainment Inc.
+0x00248E, Infoware ZRt.
+0x00248F, DO-MONIX
+0x002490, Samsung Electronics Co.,LTD
+0x002491, Samsung Electronics
+0x002492, Motorola, Broadband Solutions Group
+0x002493, Motorola, Inc
+0x002494, Shenzhen Baoxin Tech CO., Ltd.
+0x002495, Motorola Mobility, Inc.
+0x002496, Ginzinger electronic systems
+0x002497, CISCO SYSTEMS, INC.
+0x002498, CISCO SYSTEMS, INC.
+0x002499, Aquila Technologies
+0x00249A, Beijing Zhongchuang Telecommunication Test Co., Ltd.
+0x00249B, Action Star Enterprise Co., Ltd.
+0x00249C, Bimeng Comunication System Co. Ltd
+0x00249D, NES Technology Inc.
+0x00249E, ADC-Elektronik GmbH
+0x00249F, RIM Testing Services
+0x0024A0, Motorola Mobility, Inc.
+0x0024A1, Motorola Mobility, Inc.
+0x0024A2, Hong Kong Middleware Technology Limited
+0x0024A3, Sonim Technologies Inc
+0x0024A4, Siklu Communication
+0x0024A5, Buffalo Inc.
+0x0024A6, TELESTAR DIGITAL GmbH
+0x0024A7, Advanced Video Communications Inc.
+0x0024A8, ProCurve Networking by HP
+0x0024A9, Ag Leader Technology
+0x0024AA, Dycor Technologies Ltd.
+0x0024AB, A7 Engineering, Inc.
+0x0024AC, Hangzhou DPtech Technologies Co., Ltd.
+0x0024AD, Adolf Thies Gmbh & Co. KG
+0x0024AE, Morpho
+0x0024AF, EchoStar Technologies
+0x0024B0, ESAB AB
+0x0024B1, Coulomb Technologies
+0x0024B2, Netgear
+0x0024B3, Graf-Syteco GmbH & Co. KG
+0x0024B4, ESCATRONIC GmbH
+0x0024B5, Nortel Networks
+0x0024B6, Seagate Technology
+0x0024B7, GridPoint, Inc.
+0x0024B8, free alliance sdn bhd
+0x0024B9, Wuhan Higheasy Electronic Technology Development Co.Ltd
+0x0024BA, Texas Instruments
+0x0024BB, CENTRAL Corporation
+0x0024BC, HuRob Co.,Ltd
+0x0024BD, Hainzl Industriesysteme GmbH
+0x0024BE, Sony Corporation
+0x0024BF, CIAT
+0x0024C0, NTI COMODO INC
+0x0024C1, Motorola Mobility, Inc.
+0x0024C2, Asumo Co.,Ltd.
+0x0024C3, CISCO SYSTEMS, INC.
+0x0024C4, CISCO SYSTEMS, INC.
+0x0024C5, Meridian Audio Limited
+0x0024C6, Hager Electro SAS
+0x0024C7, Mobilarm Ltd
+0x0024C8, Broadband Solutions Group
+0x0024C9, Broadband Solutions Group
+0x0024CA, Tobii Technology AB
+0x0024CB, Autonet Mobile
+0x0024CC, Fascinations Toys and Gifts, Inc.
+0x0024CD, Willow Garage, Inc.
+0x0024CE, Exeltech Inc
+0x0024CF, Inscape Data Corporation
+0x0024D0, Shenzhen SOGOOD Industry CO.,LTD.
+0x0024D1, Thomson Inc.
+0x0024D2, Askey Computer
+0x0024D3, QUALICA Inc.
+0x0024D4, FREEBOX SA
+0x0024D5, Winward Industrial Limited
+0x0024D6, Intel Corporate
+0x0024D7, Intel Corporate
+0x0024D8, IlSung Precision
+0x0024D9, BICOM, Inc.
+0x0024DA, Innovar Systems Limited
+0x0024DB, Alcohol Monitoring Systems
+0x0024DC, Juniper Networks
+0x0024DD, Centrak, Inc.
+0x0024DE, GLOBAL Technology Inc.
+0x0024DF, Digitalbox Europe GmbH
+0x0024E0, DS Tech, LLC
+0x0024E1, Convey Computer Corp.
+0x0024E2, HASEGAWA ELECTRIC CO.,LTD.
+0x0024E3, CAO Group
+0x0024E4, Withings
+0x0024E5, Seer Technology, Inc
+0x0024E6, In Motion Technology Inc.
+0x0024E7, Plaster Networks
+0x0024E8, Dell Inc.
+0x0024E9, Samsung Electronics Co., Ltd., Storage System Division
+0x0024EA, iris-GmbH infrared & intelligent sensors
+0x0024EB, ClearPath Networks, Inc.
+0x0024EC, United Information Technology Co.,Ltd.
+0x0024ED, YT Elec. Co,.Ltd.
+0x0024EE, Wynmax Inc.
+0x0024EF, Sony Ericsson Mobile Communications
+0x0024F0, Seanodes
+0x0024F1, Shenzhen Fanhai Sanjiang Electronics Co., Ltd.
+0x0024F2, Uniphone Telecommunication Co., Ltd.
+0x0024F3, Nintendo Co., Ltd.
+0x0024F4, Kaminario Technologies Ltd.
+0x0024F5, NDS Surgical Imaging
+0x0024F6, MIYOSHI ELECTRONICS CORPORATION
+0x0024F7, CISCO SYSTEMS, INC.
+0x0024F8, Technical Solutions Company Ltd.
+0x0024F9, CISCO SYSTEMS, INC.
+0x0024FA, Hilger u. Kern GMBH
+0x0024FB, PRIVATE
+0x0024FC, QuoPin Co., Ltd.
+0x0024FD, Accedian Networks Inc
+0x0024FE, AVM GmbH
+0x0024FF, QLogic Corporation
+0x002500, Apple, Inc
+0x002501, JSC "Supertel"
+0x002502, NaturalPoint
+0x002503, IBM Corp
+0x002504, Valiant Communications Limited
+0x002505, eks Engel GmbH & Co. KG
+0x002506, A.I. ANTITACCHEGGIO ITALIA SRL
+0x002507, ASTAK Inc.
+0x002508, Maquet Cardiopulmonary AG
+0x002509, SHARETRONIC Group LTD
+0x00250A, Security Expert Co. Ltd
+0x00250B, CENTROFACTOR INC
+0x00250C, Enertrac
+0x00250D, GZT Telkom-Telmor sp. z o.o.
+0x00250E, gt german telematics gmbh
+0x00250F, On-Ramp Wireless, Inc.
+0x002510, Pico-Tesla Magnetic Therapies
+0x002511, ELITEGROUP COMPUTER SYSTEM CO., LTD.
+0x002512, ZTE Corporation
+0x002513, CXP DIGITAL BV
+0x002514, PC Worth Int'l Co., Ltd.
+0x002515, SFR
+0x002516, Integrated Design Tools, Inc.
+0x002517, Venntis, LLC
+0x002518, Power PLUS Communications AG
+0x002519, Viaas Inc
+0x00251A, Psiber Data Systems Inc.
+0x00251B, Philips CareServant
+0x00251C, EDT
+0x00251D, DSA Encore, LLC
+0x00251E, ROTEL TECHNOLOGIES
+0x00251F, ZYNUS VISION INC.
+0x002520, SMA Railway Technology GmbH
+0x002521, Logitek Electronic Systems, Inc.
+0x002522, ASRock Incorporation
+0x002523, OCP Inc.
+0x002524, Lightcomm Technology Co., Ltd
+0x002525, CTERA Networks Ltd.
+0x002526, Genuine Technologies Co., Ltd.
+0x002527, Bitrode Corp.
+0x002528, Daido Signal Co., Ltd.
+0x002529, COMELIT GROUP S.P.A
+0x00252A, Chengdu GeeYa Technology Co.,LTD
+0x00252B, Stirling Energy Systems
+0x00252C, Entourage Systems, Inc.
+0x00252D, Kiryung Electronics
+0x00252E, Cisco SPVTG
+0x00252F, Energy, Inc.
+0x002530, Aetas Systems Inc.
+0x002531, Cloud Engines, Inc.
+0x002532, Digital Recorders
+0x002533, WITTENSTEIN AG
+0x002535, Minimax GmbH & Co KG
+0x002536, Oki Electric Industry Co., Ltd.
+0x002537, Runcom Technologies Ltd.
+0x002538, Samsung Electronics Co., Ltd., Memory Division
+0x002539, IfTA GmbH
+0x00253A, CEVA, Ltd.
+0x00253B, din Dietmar Nocker Facilitymanagement GmbH
+0x00253C, 2Wire
+0x00253D, DRS Consolidated Controls
+0x00253E, Sensus Metering Systems
+0x002540, Quasar Technologies, Inc.
+0x002541, Maquet Critical Care AB
+0x002542, Pittasoft
+0x002543, MONEYTECH
+0x002544, LoJack Corporation
+0x002545, CISCO SYSTEMS, INC.
+0x002546, CISCO SYSTEMS, INC.
+0x002547, Nokia Danmark A/S
+0x002548, Nokia Danmark A/S
+0x002549, Jeorich Tech. Co.,Ltd.
+0x00254A, RingCube Technologies, Inc.
+0x00254B, Apple, Inc
+0x00254C, Videon Central, Inc.
+0x00254D, Singapore Technologies Electronics Limited
+0x00254E, Vertex Wireless Co., Ltd.
+0x00254F, ELETTROLAB Srl
+0x002550, Riverbed Technology
+0x002551, SE-Elektronic GmbH
+0x002552, VXI CORPORATION
+0x002553, ADB Broadband Italia
+0x002554, Pixel8 Networks
+0x002555, Visonic Technologies 1993 Ltd
+0x002556, Hon Hai Precision Ind. Co., Ltd.
+0x002557, Research In Motion
+0x002558, MPEDIA
+0x002559, Syphan Technologies Ltd
+0x00255A, Tantalus Systems Corp.
+0x00255B, CoachComm, LLC
+0x00255C, NEC Corporation
+0x00255D, Morningstar Corporation
+0x00255E, Shanghai Dare Technologies Co.,Ltd.
+0x00255F, SenTec AG
+0x002560, Ibridge Networks & Communications Ltd.
+0x002561, ProCurve Networking by HP
+0x002562, interbro Co. Ltd.
+0x002563, Luxtera Inc
+0x002564, Dell Inc.
+0x002565, Vizimax Inc.
+0x002566, Samsung Electronics Co.,Ltd
+0x002567, Samsung Electronics
+0x002568, Shenzhen Huawei Communication Technologies Co., Ltd
+0x002569, SAGEM COMMUNICATION
+0x00256A, inIT - Institut Industrial IT
+0x00256B, ATENIX E.E. s.r.l.
+0x00256C, "Azimut" Production Association JSC
+0x00256D, Broadband Forum
+0x00256E, Van Breda B.V.
+0x00256F, Dantherm Power
+0x002570, Eastern Communications Company Limited
+0x002571, Zhejiang Tianle Digital Electric Co.,Ltd
+0x002572, Nemo-Q International AB
+0x002573, ST Electronics (Info-Security) Pte Ltd
+0x002574, KUNIMI MEDIA DEVICE Co., Ltd.
+0x002575, FiberPlex Inc
+0x002576, NELI TECHNOLOGIES
+0x002577, D-BOX Technologies
+0x002578, JSC "Concern "Sozvezdie"
+0x002579, J & F Labs
+0x00257A, CAMCO Produktions- und Vertriebs-GmbH für Beschallungs- und Beleuchtungsanlagen
+0x00257B, STJ ELECTRONICS PVT LTD
+0x00257C, Huachentel Technology Development Co., Ltd
+0x00257D, PointRed Telecom Private Ltd.
+0x00257E, NEW POS Technology Limited
+0x00257F, CallTechSolution Co.,Ltd
+0x002580, Equipson S.A.
+0x002581, x-star networks Inc.
+0x002582, Maksat Technologies (P) Ltd
+0x002583, CISCO SYSTEMS, INC.
+0x002584, CISCO SYSTEMS, INC.
+0x002585, KOKUYO S&T Co., Ltd.
+0x002586, TP-LINK Technologies Co., Ltd.
+0x002587, Vitality, Inc.
+0x002588, Genie Industries, Inc.
+0x002589, Hills Industries Limited
+0x00258A, Pole/Zero Corporation
+0x00258B, Mellanox Technologies Ltd
+0x00258C, ESUS ELEKTRONIK SAN. VE DIS. TIC. LTD. STI.
+0x00258D, Haier
+0x00258E, The Weather Channel
+0x00258F, Trident Microsystems, Inc.
+0x002590, Super Micro Computer, Inc.
+0x002591, NEXTEK, Inc.
+0x002592, Guangzhou Shirui Electronic Co., Ltd
+0x002593, DatNet Informatikai Kft.
+0x002594, Eurodesign BG LTD
+0x002595, Northwest Signal Supply, Inc
+0x002596, GIGAVISION srl
+0x002597, Kalki Communication Technologies
+0x002598, Zhong Shan City Litai Electronic Industrial Co. Ltd
+0x002599, Hedon e.d. B.V.
+0x00259A, CEStronics GmbH
+0x00259B, Beijing PKUNITY Microsystems Technology Co., Ltd
+0x00259C, Cisco-Linksys, LLC
+0x00259D, PRIVATE
+0x00259E, Huawei Technologies Co., Ltd.
+0x00259F, TechnoDigital Technologies GmbH
+0x0025A0, Nintendo Co., Ltd.
+0x0025A1, Enalasys
+0x0025A2, Alta Definicion LINCEO S.L.
+0x0025A3, Trimax Wireless, Inc.
+0x0025A4, EuroDesign embedded technologies GmbH
+0x0025A5, Walnut Media Network
+0x0025A6, Central Network Solution Co., Ltd.
+0x0025A7, Comverge, Inc.
+0x0025A8, Kontron (BeiJing) Technology Co.,Ltd
+0x0025A9, Shanghai Embedway Information Technologies Co.,Ltd
+0x0025AA, Beijing Soul Technology Co.,Ltd.
+0x0025AB, AIO LCD PC BU / TPV
+0x0025AC, I-Tech corporation
+0x0025AD, Manufacturing Resources International
+0x0025AE, Microsoft Corporation
+0x0025AF, COMFILE Technology
+0x0025B0, Schmartz Inc
+0x0025B1, Maya-Creation Corporation
+0x0025B2, LFK-Lenkflugkörpersysteme GmbH
+0x0025B3, Hewlett-Packard Company
+0x0025B4, CISCO SYSTEMS, INC.
+0x0025B5, CISCO SYSTEMS, INC.
+0x0025B6, Telecom FM
+0x0025B7, Costar electronics, inc.,
+0x0025B8, Agile Communications, Inc.
+0x0025B9, Agilink Systems Corp.
+0x0025BA, Alcatel-Lucent IPD
+0x0025BB, INNERINT Co., Ltd.
+0x0025BC, Apple, Inc
+0x0025BD, Italdata Ingegneria dell'Idea S.p.A.
+0x0025BE, Tektrap Systems Inc.
+0x0025BF, Wireless Cables Inc.
+0x0025C0, ZillionTV Corporation
+0x0025C1, Nawoo Korea Corp.
+0x0025C2, RingBell Co.,Ltd.
+0x0025C3, Nortel Networks
+0x0025C4, Ruckus Wireless
+0x0025C5, Star Link Communication Pvt. Ltd.
+0x0025C6, kasercorp, ltd
+0x0025C7, altek Corporation
+0x0025C8, S-Access GmbH
+0x0025C9, SHENZHEN HUAPU DIGITAL CO., LTD
+0x0025CA, LS Research, LLC
+0x0025CB, Reiner SCT
+0x0025CC, Mobile Communications Korea Incorporated
+0x0025CD, Skylane Optics
+0x0025CE, InnerSpace
+0x0025CF, Nokia Danmark A/S
+0x0025D0, Nokia Danmark A/S
+0x0025D1, Eastern Asia Technology Limited
+0x0025D2, InpegVision Co., Ltd
+0x0025D3, AzureWave Technologies, Inc
+0x0025D4, Fortress Technologies
+0x0025D5, Robonica (Pty) Ltd
+0x0025D6, The Kroger Co.
+0x0025D7, CEDO
+0x0025D8, KOREA MAINTENANCE
+0x0025D9, DataFab Systems Inc.
+0x0025DA, Secura Key
+0x0025DB, ATI Electronics(Shenzhen) Co., LTD
+0x0025DC, Sumitomo Electric Networks, Inc
+0x0025DD, SUNNYTEK INFORMATION CO., LTD.
+0x0025DE, Probits Co., LTD.
+0x0025DF, PRIVATE
+0x0025E0, CeedTec Sdn Bhd
+0x0025E1, SHANGHAI SEEYOO ELECTRONIC & TECHNOLOGY CO., LTD
+0x0025E2, Everspring Industry Co., Ltd.
+0x0025E3, Hanshinit Inc.
+0x0025E4, OMNI-WiFi, LLC
+0x0025E5, LG Electronics Inc
+0x0025E6, Belgian Monitoring Systems bvba
+0x0025E7, Sony Ericsson Mobile Communications
+0x0025E8, Idaho Technology
+0x0025E9, i-mate Development, Inc.
+0x0025EA, Iphion BV
+0x0025EB, Reutech Radar Systems (PTY) Ltd
+0x0025EC, Humanware
+0x0025ED, NuVo Technologies LLC
+0x0025EE, Avtex Ltd
+0x0025EF, I-TEC Co., Ltd.
+0x0025F0, Suga Electronics Limited
+0x0025F1, Motorola Mobility, Inc.
+0x0025F2, Motorola Mobility, Inc.
+0x0025F3, Nordwestdeutsche Zählerrevision
+0x0025F4, KoCo Connector AG
+0x0025F5, DVS Korea, Co., Ltd
+0x0025F6, netTALK.com, Inc.
+0x0025F7, Ansaldo STS USA
+0x0025F9, GMK electronic design GmbH
+0x0025FA, J&M Analytik AG
+0x0025FB, Tunstall Healthcare A/S
+0x0025FC, ENDA ENDUSTRIYEL ELEKTRONIK LTD. STI.
+0x0025FD, OBR Centrum Techniki Morskiej S.A.
+0x0025FE, Pilot Electronics Corporation
+0x0025FF, CreNova Multimedia Co., Ltd
+0x002600, TEAC Australia Pty Ltd.
+0x002601, Cutera Inc
+0x002602, SMART Temps LLC
+0x002603, Shenzhen Wistar Technology Co., Ltd
+0x002604, Audio Processing Technology Ltd
+0x002605, CC Systems AB
+0x002606, RAUMFELD GmbH
+0x002607, Enabling Technology Pty Ltd
+0x002608, Apple, Inc
+0x002609, Phyllis Co., Ltd.
+0x00260A, CISCO SYSTEMS, INC.
+0x00260B, CISCO SYSTEMS, INC.
+0x00260C, Dataram
+0x00260D, Micronetics, Inc.
+0x00260E, Ablaze Systems, LLC
+0x00260F, Linn Products Ltd
+0x002610, Apacewave Technologies
+0x002611, Licera AB
+0x002612, Space Exploration Technologies
+0x002613, Engel Axil S.L.
+0x002614, KTNF
+0x002615, Teracom Limited
+0x002616, Rosemount Inc.
+0x002617, OEM Worldwide
+0x002618, ASUSTek COMPUTER INC.
+0x002619, FRC
+0x00261A, Femtocomm System Technology Corp.
+0x00261B, LAUREL BANK MACHINES CO., LTD.
+0x00261C, NEOVIA INC.
+0x00261D, COP SECURITY SYSTEM CORP.
+0x00261E, QINGBANG ELEC(SZ) CO., LTD
+0x00261F, SAE Magnetics (H.K.) Ltd.
+0x002620, ISGUS GmbH
+0x002621, InteliCloud Technology Inc.
+0x002622, COMPAL INFORMATION (KUNSHAN) CO., LTD.
+0x002623, JRD Communication Inc
+0x002624, Thomson Inc.
+0x002625, MediaSputnik
+0x002626, Geophysical Survey Systems, Inc.
+0x002627, Truesell
+0x002628, companytec automação e controle ltda.
+0x002629, Juphoon System Software Inc.
+0x00262A, Proxense, LLC
+0x00262B, Wongs Electronics Co. Ltd.
+0x00262C, IKT Advanced Technologies s.r.o.
+0x00262D, Wistron Corporation
+0x00262E, Chengdu Jiuzhou Electronic Technology Inc
+0x00262F, HAMAMATSU TOA ELECTRONICS
+0x002630, ACOREL S.A.S
+0x002631, COMMTACT LTD
+0x002632, Instrumentation Technologies d.d.
+0x002633, MIR - Medical International Research
+0x002634, Infineta Systems, Inc
+0x002635, Bluetechnix GmbH
+0x002636, Motorola Mobility, Inc.
+0x002637, Samsung Electro-Mechanics
+0x002638, Xia Men Joyatech Co., Ltd.
+0x002639, T.M. Electronics, Inc.
+0x00263A, Digitec Systems
+0x00263B, Onbnetech
+0x00263C, Bachmann Technology GmbH & Co. KG
+0x00263D, MIA Corporation
+0x00263E, Trapeze Networks
+0x00263F, LIOS Technology GmbH
+0x002640, Baustem Broadband Technologies, Ltd.
+0x002641, Motorola, Inc
+0x002642, Motorola, Inc
+0x002643, Alps Electric Co., Ltd
+0x002644, Thomson Telecom Belgium
+0x002645, Circontrol S.A.
+0x002646, SHENYANG TONGFANG MULTIMEDIA TECHNOLOGY COMPANY LIMITED
+0x002647, WFE TECHNOLOGY CORP.
+0x002648, Emitech Corp.
+0x00264A, Apple, Inc
+0x00264C, Shanghai DigiVision Technology Co., Ltd.
+0x00264D, Arcadyan Technology Corporation
+0x00264E, Rail & Road Protec GmbH
+0x00264F, Krüger &Gothe GmbH
+0x002650, 2Wire
+0x002651, CISCO SYSTEMS, INC.
+0x002652, CISCO SYSTEMS, INC.
+0x002653, DaySequerra Corporation
+0x002654, 3Com Corporation
+0x002655, Hewlett-Packard Company
+0x002656, Sansonic Electronics USA
+0x002657, OOO NPP EKRA
+0x002658, T-Platforms (Cyprus) Limited
+0x002659, Nintendo Co., Ltd.
+0x00265A, D-Link Corporation
+0x00265B, Hitron Technologies. Inc
+0x00265C, Hon Hai Precision Ind. Co.,Ltd.
+0x00265D, Samsung Electronics
+0x00265E, Hon Hai Precision Ind. Co.,Ltd.
+0x00265F, Samsung Electronics Co.,Ltd
+0x002660, Logiways
+0x002661, Irumtek Co., Ltd.
+0x002662, Actiontec Electronics, Inc
+0x002663, Shenzhen Huitaiwei Tech. Ltd, co.
+0x002664, Core System Japan
+0x002665, ProtectedLogic Corporation
+0x002666, EFM Networks
+0x002667, CARECOM CO.,LTD.
+0x002668, Nokia Danmark A/S
+0x002669, Nokia Danmark A/S
+0x00266A, ESSENSIUM NV
+0x00266B, SHINE UNION ENTERPRISE LIMITED
+0x00266C, Inventec
+0x00266D, MobileAccess Networks
+0x00266E, Nissho-denki Co.,LTD.
+0x00266F, Coordiwise Technology Corp.
+0x002670, Cinch Connectors
+0x002671, AUTOVISION Co., Ltd
+0x002672, AAMP of America
+0x002673, RICOH COMPANY LTD.
+0x002674, Electronic Solutions, Inc.
+0x002675, Aztech Electronics Pte Ltd
+0x002676, COMMidt AS
+0x002677, DEIF A/S
+0x002678, Logic Instrument SA
+0x002679, Euphonic Technologies, Inc.
+0x00267A, wuhan hongxin telecommunication technologies co.,ltd
+0x00267B, GSI Helmholtzzentrum für Schwerionenforschung GmbH
+0x00267C, Metz-Werke GmbH & Co KG
+0x00267D, A-Max Technology Macao Commercial Offshore Company Limited
+0x00267E, Parrot SA
+0x00267F, Zenterio AB
+0x002680, Lockie Innovation Pty Ltd
+0x002681, Interspiro AB
+0x002682, Gemtek Technology Co., Ltd.
+0x002683, Ajoho Enterprise Co., Ltd.
+0x002684, KISAN SYSTEM
+0x002685, Digital Innovation
+0x002686, Quantenna Communcations, Inc.
+0x002687, ALLIED TELESIS, K.K corega division.
+0x002688, Juniper Networks
+0x002689, General Dynamics Robotic Systems
+0x00268A, Terrier SC Ltd
+0x00268B, Guangzhou Escene Computer Technology Limited
+0x00268C, StarLeaf Ltd.
+0x00268D, CellTel S.p.A.
+0x00268E, Alta Solutions, Inc.
+0x00268F, MTA SpA
+0x002690, I DO IT
+0x002691, SAGEM COMMUNICATION
+0x002692, Mitsubishi Electric Co.
+0x002693, QVidium Technologies, Inc.
+0x002694, Senscient Ltd
+0x002695, ZT Group Int'l Inc
+0x002696, NOOLIX Co., Ltd
+0x002697, Cheetah Technologies, L.P.
+0x002698, CISCO SYSTEMS, INC.
+0x002699, CISCO SYSTEMS, INC.
+0x00269A, Carina System Co., Ltd.
+0x00269B, SOKRAT Ltd.
+0x00269C, ITUS JAPAN CO. LTD
+0x00269D, M2Mnet Co., Ltd.
+0x00269E, Quanta Computer Inc
+0x00269F, PRIVATE
+0x0026A0, moblic
+0x0026A1, Megger
+0x0026A2, Instrumentation Technology Systems
+0x0026A3, FQ Ingenieria Electronica S.A.
+0x0026A4, Novus Produtos Eletronicos Ltda
+0x0026A5, MICROROBOT.CO.,LTD
+0x0026A6, TRIXELL
+0x0026A7, CONNECT SRL
+0x0026A8, DAEHAP HYPER-TECH
+0x0026A9, Strong Technologies Pty Ltd
+0x0026AA, Kenmec Mechanical Engineering Co., Ltd.
+0x0026AB, SEIKO EPSON CORPORATION
+0x0026AC, Shanghai LUSTER Teraband photonic Co., Ltd.
+0x0026AD, Arada Systems, Inc.
+0x0026AE, Wireless Measurement Ltd
+0x0026AF, Duelco A/S
+0x0026B0, Apple, Inc
+0x0026B1, Navis Auto Motive Systems, Inc.
+0x0026B2, Setrix AG
+0x0026B3, Thales Communications Inc
+0x0026B4, Ford Motor Company
+0x0026B5, ICOMM Tele Ltd
+0x0026B6, Askey Computer
+0x0026B7, Kingston Technology Company, Inc.
+0x0026B8, Actiontec Electronics, Inc
+0x0026B9, Dell Inc
+0x0026BA, Motorola Mobility, Inc.
+0x0026BB, Apple, Inc
+0x0026BC, General Jack Technology Ltd.
+0x0026BD, JTEC Card & Communication Co., Ltd.
+0x0026BE, Schoonderbeek Elektronica Systemen B.V.
+0x0026BF, ShenZhen Temobi Science&Tech Development Co.,Ltd
+0x0026C0, EnergyHub
+0x0026C1, ARTRAY CO., LTD.
+0x0026C2, SCDI Co. LTD
+0x0026C3, Insightek Corp.
+0x0026C4, Cadmos microsystems S.r.l.
+0x0026C5, Guangdong Gosun Telecommunications Co.,Ltd
+0x0026C6, Intel Corporate
+0x0026C7, Intel Corporate
+0x0026C8, System Sensor
+0x0026C9, Proventix Systems, Inc.
+0x0026CA, CISCO SYSTEMS, INC.
+0x0026CB, CISCO SYSTEMS, INC.
+0x0026CC, Nokia Danmark A/S
+0x0026CD, PurpleComm, Inc.
+0x0026CE, Kozumi USA Corp.
+0x0026CF, DEKA R&D
+0x0026D0, Semihalf
+0x0026D1, S Squared Innovations Inc.
+0x0026D2, Pcube Systems, Inc.
+0x0026D3, Zeno Information System
+0x0026D4, IRCA SpA
+0x0026D5, Ory Solucoes em Comercio de Informatica Ltda.
+0x0026D6, Ningbo Andy Optoelectronic Co., Ltd.
+0x0026D7, Xiamen BB Electron & Technology Co., Ltd.
+0x0026D8, Magic Point Inc.
+0x0026D9, Pace plc
+0x0026DA, Universal Media Corporation /Slovakia/ s.r.o.
+0x0026DB, Ionics EMS Inc.
+0x0026DC, Optical Systems Design
+0x0026DD, Fival Corporation
+0x0026DE, FDI MATELEC
+0x0026DF, TaiDoc Technology Corp.
+0x0026E0, ASITEQ
+0x0026E1, Stanford University, OpenFlow Group
+0x0026E2, LG Electronics
+0x0026E3, DTI
+0x0026E4, CANAL OVERSEAS
+0x0026E5, AEG Power Solutions
+0x0026E6, Visionhitech Co., Ltd.
+0x0026E7, Shanghai ONLAN Communication Tech. Co., Ltd.
+0x0026E8, Murata Manufacturing Co., Ltd.
+0x0026E9, SP Corp
+0x0026EA, Cheerchip Electronic Technology (ShangHai) Co., Ltd.
+0x0026EB, Advanced Spectrum Technology Co., Ltd.
+0x0026EC, Legrand Home Systems, Inc
+0x0026ED, zte corporation
+0x0026EE, TKM GmbH
+0x0026EF, Technology Advancement Group, Inc.
+0x0026F0, cTrixs International GmbH.
+0x0026F1, ProCurve Networking by HP
+0x0026F2, Netgear
+0x0026F3, SMC Networks
+0x0026F4, Nesslab
+0x0026F5, XRPLUS Inc.
+0x0026F6, Military Communication Institute
+0x0026F7, Infosys Technologies Ltd.
+0x0026F8, Golden Highway Industry Development Co., Ltd.
+0x0026F9, S.E.M. srl
+0x0026FA, BandRich Inc.
+0x0026FB, AirDio Wireless, Inc.
+0x0026FC, AcSiP Technology Corp.
+0x0026FD, Interactive Intelligence
+0x0026FE, MKD Technology Inc.
+0x0026FF, Research In Motion
+0x002700, Shenzhen Siglent Technology Co., Ltd.
+0x002701, INCOstartec GmbH
+0x002702, SolarEdge Technologies
+0x002703, Testech Electronics Pte Ltd
+0x002704, Accelerated Concepts, Inc
+0x002705, Sectronic
+0x002706, YOISYS
+0x002707, Lift Complex DS, JSC
+0x002708, Nordiag ASA
+0x002709, Nintendo Co., Ltd.
+0x00270A, IEE S.A.
+0x00270B, Adura Technologies
+0x00270C, CISCO SYSTEMS, INC.
+0x00270D, CISCO SYSTEMS, INC.
+0x00270E, Intel Corporate
+0x00270F, Envisionnovation Inc
+0x002710, Intel Corporate
+0x002711, LanPro Inc
+0x002712, MaxVision LLC
+0x002713, Universal Global Scientific Industrial Co., Ltd.
+0x002714, Grainmustards, Co,ltd.
+0x002715, Rebound Telecom. Co., Ltd
+0x002716, Adachi-Syokai Co., Ltd.
+0x002717, CE Digital(Zhenjiang)Co.,Ltd
+0x002718, Suzhou NEW SEAUNION Video Technology Co.,Ltd
+0x002719, TP-LINK TECHNOLOGIES CO., LTD.
+0x00271A, Geenovo Technology Ltd.
+0x00271B, Alec Sicherheitssysteme GmbH
+0x00271C, MERCURY CORPORATION
+0x00271D, Comba Telecom Systems (China) Ltd.
+0x00271E, Xagyl Communications
+0x00271F, MIPRO Electronics Co., Ltd
+0x002720, NEW-SOL COM
+0x002721, Shenzhen Baoan Fenda Industrial Co., Ltd
+0x002722, Ubiquiti Networks
+0x0027F8, Brocade Communications Systems, Inc.
+0x002A6A, CISCO SYSTEMS, INC.
+0x002AAF, LARsys-Automation GmbH
+0x002D76, TITECH GmbH
+0x003000, ALLWELL TECHNOLOGY CORP.
+0x003001, SMP
+0x003002, Expand Networks
+0x003003, Phasys Ltd.
+0x003004, LEADTEK RESEARCH INC.
+0x003005, Fujitsu Siemens Computers
+0x003006, SUPERPOWER COMPUTER
+0x003007, OPTI, INC.
+0x003008, AVIO DIGITAL, INC.
+0x003009, Tachion Networks, Inc.
+0x00300A, AZTECH Electronics Pte Ltd
+0x00300B, mPHASE Technologies, Inc.
+0x00300C, CONGRUENCY, LTD.
+0x00300D, MMC Technology, Inc.
+0x00300E, Klotz Digital AG
+0x00300F, IMT - Information Management T
+0x003010, VISIONETICS INTERNATIONAL
+0x003011, HMS Industrial Networks
+0x003012, DIGITAL ENGINEERING LTD.
+0x003013, NEC Corporation
+0x003014, DIVIO, INC.
+0x003015, CP CLARE CORP.
+0x003016, ISHIDA CO., LTD.
+0x003017, BlueArc UK Ltd
+0x003018, Jetway Information Co., Ltd.
+0x003019, CISCO SYSTEMS, INC.
+0x00301A, SMARTBRIDGES PTE. LTD.
+0x00301B, SHUTTLE, INC.
+0x00301C, ALTVATER AIRDATA SYSTEMS
+0x00301D, SKYSTREAM, INC.
+0x00301E, 3COM Europe Ltd.
+0x00301F, OPTICAL NETWORKS, INC.
+0x003020, TSI, Inc..
+0x003021, HSING TECH. ENTERPRISE CO.,LTD
+0x003022, Fong Kai Industrial Co., Ltd.
+0x003023, COGENT COMPUTER SYSTEMS, INC.
+0x003024, CISCO SYSTEMS, INC.
+0x003025, CHECKOUT COMPUTER SYSTEMS, LTD
+0x003026, HeiTel Digital Video GmbH
+0x003027, KERBANGO, INC.
+0x003028, FASE Saldatura srl
+0x003029, OPICOM
+0x00302A, SOUTHERN INFORMATION
+0x00302B, INALP NETWORKS, INC.
+0x00302C, SYLANTRO SYSTEMS CORPORATION
+0x00302D, QUANTUM BRIDGE COMMUNICATIONS
+0x00302E, Hoft & Wessel AG
+0x00302F, GE Aviation System
+0x003030, HARMONIX CORPORATION
+0x003031, LIGHTWAVE COMMUNICATIONS, INC.
+0x003032, MagicRam, Inc.
+0x003033, ORIENT TELECOM CO., LTD.
+0x003034, SET ENGINEERING
+0x003035, Corning Incorporated
+0x003036, RMP ELEKTRONIKSYSTEME GMBH
+0x003037, Packard Bell Nec Services
+0x003038, XCP, INC.
+0x003039, SOFTBOOK PRESS
+0x00303A, MAATEL
+0x00303B, PowerCom Technology
+0x00303C, ONNTO CORP.
+0x00303D, IVA CORPORATION
+0x00303E, Radcom Ltd.
+0x00303F, TurboComm Tech Inc.
+0x003040, CISCO SYSTEMS, INC.
+0x003041, SAEJIN T & M CO., LTD.
+0x003042, DeTeWe-Deutsche Telephonwerke
+0x003043, IDREAM TECHNOLOGIES, PTE. LTD.
+0x003044, CradlePoint, Inc
+0x003045, Village Networks, Inc. (VNI)
+0x003046, Controlled Electronic Manageme
+0x003047, NISSEI ELECTRIC CO., LTD.
+0x003048, Supermicro Computer, Inc.
+0x003049, BRYANT TECHNOLOGY, LTD.
+0x00304A, Fraunhofer IPMS
+0x00304B, ORBACOM SYSTEMS, INC.
+0x00304C, APPIAN COMMUNICATIONS, INC.
+0x00304D, ESI
+0x00304E, BUSTEC PRODUCTION LTD.
+0x00304F, PLANET Technology Corporation
+0x003050, Versa Technology
+0x003051, ORBIT AVIONIC & COMMUNICATION
+0x003052, ELASTIC NETWORKS
+0x003053, Basler AG
+0x003054, CASTLENET TECHNOLOGY, INC.
+0x003055, Renesas Technology America, Inc.
+0x003056, Beck IPC GmbH
+0x003057, QTelNet, Inc.
+0x003058, API MOTION
+0x003059, KONTRON COMPACT COMPUTERS AG
+0x00305A, TELGEN CORPORATION
+0x00305B, Toko Inc.
+0x00305C, SMAR Laboratories Corp.
+0x00305D, DIGITRA SYSTEMS, INC.
+0x00305E, Abelko Innovation
+0x00305F, Hasselblad
+0x003060, Powerfile, Inc.
+0x003061, MobyTEL
+0x003062, PATH 1 NETWORK TECHNOL'S INC.
+0x003063, SANTERA SYSTEMS, INC.
+0x003064, ADLINK TECHNOLOGY, INC.
+0x003065, APPLE COMPUTER, INC.
+0x003066, RFM
+0x003067, BIOSTAR MICROTECH INT'L CORP.
+0x003068, CYBERNETICS TECH. CO., LTD.
+0x003069, IMPACCT TECHNOLOGY CORP.
+0x00306A, PENTA MEDIA CO., LTD.
+0x00306B, CMOS SYSTEMS, INC.
+0x00306C, Hitex Holding GmbH
+0x00306D, LUCENT TECHNOLOGIES
+0x00306E, HEWLETT PACKARD
+0x00306F, SEYEON TECH. CO., LTD.
+0x003070, 1Net Corporation
+0x003071, CISCO SYSTEMS, INC.
+0x003072, Intellibyte Inc.
+0x003073, International Microsystems, In
+0x003074, EQUIINET LTD.
+0x003075, ADTECH
+0x003076, Akamba Corporation
+0x003077, ONPREM NETWORKS
+0x003078, CISCO SYSTEMS, INC.
+0x003079, CQOS, INC.
+0x00307A, Advanced Technology & Systems
+0x00307B, CISCO SYSTEMS, INC.
+0x00307C, ADID SA
+0x00307D, GRE AMERICA, INC.
+0x00307E, Redflex Communication Systems
+0x00307F, IRLAN LTD.
+0x003080, CISCO SYSTEMS, INC.
+0x003081, ALTOS C&C
+0x003082, TAIHAN ELECTRIC WIRE CO., LTD.
+0x003083, Ivron Systems
+0x003084, ALLIED TELESYN INTERNAIONAL
+0x003085, CISCO SYSTEMS, INC.
+0x003086, Transistor Devices, Inc.
+0x003087, VEGA GRIESHABER KG
+0x003088, Ericsson
+0x003089, Spectrapoint Wireless, LLC
+0x00308A, NICOTRA SISTEMI S.P.A
+0x00308B, Brix Networks
+0x00308C, Quantum Corporation
+0x00308D, Pinnacle Systems, Inc.
+0x00308E, CROSS MATCH TECHNOLOGIES, INC.
+0x00308F, MICRILOR, Inc.
+0x003090, CYRA TECHNOLOGIES, INC.
+0x003091, TAIWAN FIRST LINE ELEC. CORP.
+0x003092, ModuNORM GmbH
+0x003093, Sonnet Technologies, Inc
+0x003094, CISCO SYSTEMS, INC.
+0x003095, Procomp Informatics, Ltd.
+0x003096, CISCO SYSTEMS, INC.
+0x003097, AB Regin
+0x003098, Global Converging Technologies
+0x003099, BOENIG UND KALLENBACH OHG
+0x00309A, ASTRO TERRA CORP.
+0x00309B, Smartware
+0x00309C, Timing Applications, Inc.
+0x00309D, Nimble Microsystems, Inc.
+0x00309E, WORKBIT CORPORATION.
+0x00309F, AMBER NETWORKS
+0x0030A0, TYCO SUBMARINE SYSTEMS, LTD.
+0x0030A1, WEBGATE Inc.
+0x0030A2, Lightner Engineering
+0x0030A3, CISCO SYSTEMS, INC.
+0x0030A4, Woodwind Communications System
+0x0030A5, ACTIVE POWER
+0x0030A6, VIANET TECHNOLOGIES, LTD.
+0x0030A7, SCHWEITZER ENGINEERING
+0x0030A8, OL'E COMMUNICATIONS, INC.
+0x0030A9, Netiverse, Inc.
+0x0030AA, AXUS MICROSYSTEMS, INC.
+0x0030AB, DELTA NETWORKS, INC.
+0x0030AC, Systeme Lauer GmbH & Co., Ltd.
+0x0030AD, SHANGHAI COMMUNICATION
+0x0030AE, Times N System, Inc.
+0x0030AF, Honeywell GmbH
+0x0030B0, Convergenet Technologies
+0x0030B1, TrunkNet
+0x0030B2, L-3 Sonoma EO
+0x0030B3, San Valley Systems, Inc.
+0x0030B4, INTERSIL CORP.
+0x0030B5, Tadiran Microwave Networks
+0x0030B6, CISCO SYSTEMS, INC.
+0x0030B7, Teletrol Systems, Inc.
+0x0030B8, RiverDelta Networks
+0x0030B9, ECTEL
+0x0030BA, AC&T SYSTEM CO., LTD.
+0x0030BB, CacheFlow, Inc.
+0x0030BC, Optronic AG
+0x0030BD, BELKIN COMPONENTS
+0x0030BE, City-Net Technology, Inc.
+0x0030BF, MULTIDATA GMBH
+0x0030C0, Lara Technology, Inc.
+0x0030C1, HEWLETT-PACKARD
+0x0030C2, COMONE
+0x0030C3, FLUECKIGER ELEKTRONIK AG
+0x0030C4, Canon Imaging Systems Inc.
+0x0030C5, CADENCE DESIGN SYSTEMS
+0x0030C6, CONTROL SOLUTIONS, INC.
+0x0030C7, Macromate Corp.
+0x0030C8, GAD LINE, LTD.
+0x0030C9, LuxN, N
+0x0030CA, Discovery Com
+0x0030CB, OMNI FLOW COMPUTERS, INC.
+0x0030CC, Tenor Networks, Inc.
+0x0030CD, CONEXANT SYSTEMS, INC.
+0x0030CE, Zaffire
+0x0030CF, TWO TECHNOLOGIES, INC.
+0x0030D0, Tellabs
+0x0030D1, INOVA CORPORATION
+0x0030D2, WIN TECHNOLOGIES, CO., LTD.
+0x0030D3, Agilent Technologies
+0x0030D4, AAE Systems, Inc.
+0x0030D5, DResearch GmbH
+0x0030D6, MSC VERTRIEBS GMBH
+0x0030D7, Innovative Systems, L.L.C.
+0x0030D8, SITEK
+0x0030D9, DATACORE SOFTWARE CORP.
+0x0030DA, COMTREND CO.
+0x0030DB, Mindready Solutions, Inc.
+0x0030DC, RIGHTECH CORPORATION
+0x0030DD, INDIGITA CORPORATION
+0x0030DE, WAGO Kontakttechnik GmbH
+0x0030DF, KB/TEL TELECOMUNICACIONES
+0x0030E0, OXFORD SEMICONDUCTOR LTD.
+0x0030E1, Network Equipment Technologies, Inc.
+0x0030E2, GARNET SYSTEMS CO., LTD.
+0x0030E3, SEDONA NETWORKS CORP.
+0x0030E4, CHIYODA SYSTEM RIKEN
+0x0030E5, Amper Datos S.A.
+0x0030E6, Draeger Medical Systems, Inc.
+0x0030E7, CNF MOBILE SOLUTIONS, INC.
+0x0030E8, ENSIM CORP.
+0x0030E9, GMA COMMUNICATION MANUFACT'G
+0x0030EA, TeraForce Technology Corporation
+0x0030EB, TURBONET COMMUNICATIONS, INC.
+0x0030EC, BORGARDT
+0x0030ED, Expert Magnetics Corp.
+0x0030EE, DSG Technology, Inc.
+0x0030EF, NEON TECHNOLOGY, INC.
+0x0030F0, Uniform Industrial Corp.
+0x0030F1, Accton Technology Corp.
+0x0030F2, CISCO SYSTEMS, INC.
+0x0030F3, At Work Computers
+0x0030F4, STARDOT TECHNOLOGIES
+0x0030F5, Wild Lab. Ltd.
+0x0030F6, SECURELOGIX CORPORATION
+0x0030F7, RAMIX INC.
+0x0030F8, Dynapro Systems, Inc.
+0x0030F9, Sollae Systems Co., Ltd.
+0x0030FA, TELICA, INC.
+0x0030FB, AZS Technology AG
+0x0030FC, Terawave Communications, Inc.
+0x0030FD, INTEGRATED SYSTEMS DESIGN
+0x0030FE, DSA GmbH
+0x0030FF, DATAFAB SYSTEMS, INC.
+0x00336C, SynapSense Corporation
+0x0034F1, Radicom Research, Inc.
+0x003532, Electro-Metrics Corporation
+0x0036F8, Conti Temic microelectronic GmbH
+0x0036FE, SuperVision
+0x00376D, Murata Manufacturing Co., Ltd.
+0x003A98, CISCO SYSTEMS, INC.
+0x003A99, CISCO SYSTEMS, INC.
+0x003A9A, CISCO SYSTEMS, INC.
+0x003A9B, CISCO SYSTEMS, INC.
+0x003A9C, CISCO SYSTEMS, INC.
+0x003A9D, NEC AccessTechnica, Ltd.
+0x003AAF, BlueBit Ltd.
+0x003CC5, WONWOO Engineering Co., Ltd
+0x003D41, Hatteland Computer AS
+0x003EE1, Apple, Inc.
+0x004000, PCI COMPONENTES DA AMZONIA LTD
+0x004001, Zero One Technology Co. Ltd.
+0x004002, PERLE SYSTEMS LIMITED
+0x004003, Emerson Process Management Power & Water Solutions, Inc.
+0x004004, ICM CO. LTD.
+0x004005, ANI COMMUNICATIONS INC.
+0x004006, SAMPO TECHNOLOGY CORPORATION
+0x004007, TELMAT INFORMATIQUE
+0x004008, A PLUS INFO CORPORATION
+0x004009, TACHIBANA TECTRON CO., LTD.
+0x00400A, PIVOTAL TECHNOLOGIES, INC.
+0x00400B, CISCO SYSTEMS, INC.
+0x00400C, GENERAL MICRO SYSTEMS, INC.
+0x00400D, LANNET DATA COMMUNICATIONS,LTD
+0x00400E, MEMOTEC, INC.
+0x00400F, DATACOM TECHNOLOGIES
+0x004010, SONIC SYSTEMS, INC.
+0x004011, ANDOVER CONTROLS CORPORATION
+0x004012, WINDATA, INC.
+0x004013, NTT DATA COMM. SYSTEMS CORP.
+0x004014, COMSOFT GMBH
+0x004015, ASCOM INFRASYS AG
+0x004016, ADC - Global Connectivity Solutions Division
+0x004017, Silex Technology America
+0x004018, ADOBE SYSTEMS, INC.
+0x004019, AEON SYSTEMS, INC.
+0x00401A, FUJI ELECTRIC CO., LTD.
+0x00401B, PRINTER SYSTEMS CORP.
+0x00401C, AST RESEARCH, INC.
+0x00401D, INVISIBLE SOFTWARE, INC.
+0x00401E, ICC
+0x00401F, COLORGRAPH LTD
+0x004020, TE Connectivity Ltd.
+0x004021, RASTER GRAPHICS
+0x004022, KLEVER COMPUTERS, INC.
+0x004023, LOGIC CORPORATION
+0x004024, COMPAC INC.
+0x004025, MOLECULAR DYNAMICS
+0x004026, Buffalo, Inc
+0x004027, SMC MASSACHUSETTS, INC.
+0x004028, NETCOMM LIMITED
+0x004029, COMPEX
+0x00402A, CANOGA-PERKINS
+0x00402B, TRIGEM COMPUTER, INC.
+0x00402C, ISIS DISTRIBUTED SYSTEMS, INC.
+0x00402D, HARRIS ADACOM CORPORATION
+0x00402E, PRECISION SOFTWARE, INC.
+0x00402F, XLNT DESIGNS INC.
+0x004030, GK COMPUTER
+0x004031, KOKUSAI ELECTRIC CO., LTD
+0x004032, DIGITAL COMMUNICATIONS
+0x004033, ADDTRON TECHNOLOGY CO., LTD.
+0x004034, BUSTEK CORPORATION
+0x004035, OPCOM
+0x004036, TRIBE COMPUTER WORKS, INC.
+0x004037, SEA-ILAN, INC.
+0x004038, TALENT ELECTRIC INCORPORATED
+0x004039, OPTEC DAIICHI DENKO CO., LTD.
+0x00403A, IMPACT TECHNOLOGIES
+0x00403B, SYNERJET INTERNATIONAL CORP.
+0x00403C, FORKS, INC.
+0x00403D, Teradata Corporation
+0x00403E, RASTER OPS CORPORATION
+0x00403F, SSANGYONG COMPUTER SYSTEMS
+0x004040, RING ACCESS, INC.
+0x004041, FUJIKURA LTD.
+0x004042, N.A.T. GMBH
+0x004043, Nokia Siemens Networks GmbH & Co. KG.
+0x004044, QNIX COMPUTER CO., LTD.
+0x004045, TWINHEAD CORPORATION
+0x004046, UDC RESEARCH LIMITED
+0x004047, WIND RIVER SYSTEMS
+0x004048, SMD INFORMATICA S.A.
+0x004049, Roche Diagnostics Ltd.
+0x00404A, WEST AUSTRALIAN DEPARTMENT
+0x00404B, MAPLE COMPUTER SYSTEMS
+0x00404C, HYPERTEC PTY LTD.
+0x00404D, TELECOMMUNICATIONS TECHNIQUES
+0x00404E, FLUENT, INC.
+0x00404F, SPACE & NAVAL WARFARE SYSTEMS
+0x004050, IRONICS, INCORPORATED
+0x004051, GRACILIS, INC.
+0x004052, STAR TECHNOLOGIES, INC.
+0x004053, AMPRO COMPUTERS
+0x004054, CONNECTION MACHINES SERVICES
+0x004055, METRONIX GMBH
+0x004056, MCM JAPAN LTD.
+0x004057, LOCKHEED - SANDERS
+0x004058, KRONOS, INC.
+0x004059, YOSHIDA KOGYO K. K.
+0x00405A, GOLDSTAR INFORMATION & COMM.
+0x00405B, FUNASSET LIMITED
+0x00405C, FUTURE SYSTEMS, INC.
+0x00405D, STAR-TEK, INC.
+0x00405E, NORTH HILLS ISRAEL
+0x00405F, AFE COMPUTERS LTD.
+0x004060, COMENDEC LTD
+0x004061, DATATECH ENTERPRISES CO., LTD.
+0x004062, E-SYSTEMS, INC./GARLAND DIV.
+0x004063, VIA TECHNOLOGIES, INC.
+0x004064, KLA INSTRUMENTS CORPORATION
+0x004065, GTE SPACENET
+0x004066, HITACHI CABLE, LTD.
+0x004067, OMNIBYTE CORPORATION
+0x004068, EXTENDED SYSTEMS
+0x004069, LEMCOM SYSTEMS, INC.
+0x00406A, KENTEK INFORMATION SYSTEMS,INC
+0x00406B, SYSGEN
+0x00406C, COPERNIQUE
+0x00406D, LANCO, INC.
+0x00406E, COROLLARY, INC.
+0x00406F, SYNC RESEARCH INC.
+0x004070, INTERWARE CO., LTD.
+0x004071, ATM COMPUTER GMBH
+0x004072, Applied Innovation Inc.
+0x004073, BASS ASSOCIATES
+0x004074, CABLE AND WIRELESS
+0x004075, Tattile SRL
+0x004076, Sun Conversion Technologies
+0x004077, MAXTON TECHNOLOGY CORPORATION
+0x004078, WEARNES AUTOMATION PTE LTD
+0x004079, JUKO MANUFACTURE COMPANY, LTD.
+0x00407A, SOCIETE D'EXPLOITATION DU CNIT
+0x00407B, SCIENTIFIC ATLANTA
+0x00407C, QUME CORPORATION
+0x00407D, EXTENSION TECHNOLOGY CORP.
+0x00407E, EVERGREEN SYSTEMS, INC.
+0x00407F, FLIR Systems
+0x004080, ATHENIX CORPORATION
+0x004081, MANNESMANN SCANGRAPHIC GMBH
+0x004082, LABORATORY EQUIPMENT CORP.
+0x004083, TDA INDUSTRIA DE PRODUTOS
+0x004084, HONEYWELL ACS
+0x004085, SAAB INSTRUMENTS AB
+0x004086, MICHELS & KLEBERHOFF COMPUTER
+0x004087, UBITREX CORPORATION
+0x004088, MOBIUS TECHNOLOGIES, INC.
+0x004089, MEIDENSHA CORPORATION
+0x00408A, TPS TELEPROCESSING SYS. GMBH
+0x00408B, RAYLAN CORPORATION
+0x00408C, AXIS COMMUNICATIONS AB
+0x00408D, THE GOODYEAR TIRE & RUBBER CO.
+0x00408E, Tattile SRL
+0x00408F, WM-DATA MINFO AB
+0x004090, ANSEL COMMUNICATIONS
+0x004091, PROCOMP INDUSTRIA ELETRONICA
+0x004092, ASP COMPUTER PRODUCTS, INC.
+0x004093, PAXDATA NETWORKS LTD.
+0x004094, SHOGRAPHICS, INC.
+0x004095, R.P.T. INTERGROUPS INT'L LTD.
+0x004096, Cisco Systems
+0x004097, DATEX DIVISION OF
+0x004098, DRESSLER GMBH & CO.
+0x004099, NEWGEN SYSTEMS CORP.
+0x00409A, NETWORK EXPRESS, INC.
+0x00409B, HAL COMPUTER SYSTEMS INC.
+0x00409C, TRANSWARE
+0x00409D, DIGIBOARD, INC.
+0x00409E, CONCURRENT TECHNOLOGIES LTD.
+0x00409F, Telco Systems, Inc.
+0x0040A0, GOLDSTAR CO., LTD.
+0x0040A1, ERGO COMPUTING
+0x0040A2, KINGSTAR TECHNOLOGY INC.
+0x0040A3, MICROUNITY SYSTEMS ENGINEERING
+0x0040A4, ROSE ELECTRONICS
+0x0040A5, CLINICOMP INTL.
+0x0040A6, Cray, Inc.
+0x0040A7, ITAUTEC PHILCO S.A.
+0x0040A8, IMF INTERNATIONAL LTD.
+0x0040A9, DATACOM INC.
+0x0040AA, VALMET AUTOMATION INC.
+0x0040AB, ROLAND DG CORPORATION
+0x0040AC, SUPER WORKSTATION, INC.
+0x0040AD, SMA REGELSYSTEME GMBH
+0x0040AE, DELTA CONTROLS, INC.
+0x0040AF, DIGITAL PRODUCTS, INC.
+0x0040B0, BYTEX CORPORATION, ENGINEERING
+0x0040B1, CODONICS INC.
+0x0040B2, SYSTEMFORSCHUNG
+0x0040B3, ParTech Inc.
+0x0040B4, NEXTCOM K.K.
+0x0040B5, VIDEO TECHNOLOGY COMPUTERS LTD
+0x0040B6, COMPUTERM CORPORATION
+0x0040B7, STEALTH COMPUTER SYSTEMS
+0x0040B8, IDEA ASSOCIATES
+0x0040B9, MACQ ELECTRONIQUE SA
+0x0040BA, ALLIANT COMPUTER SYSTEMS CORP.
+0x0040BB, GOLDSTAR CABLE CO., LTD.
+0x0040BC, ALGORITHMICS LTD.
+0x0040BD, STARLIGHT NETWORKS, INC.
+0x0040BE, BOEING DEFENSE & SPACE
+0x0040BF, CHANNEL SYSTEMS INTERN'L INC.
+0x0040C0, VISTA CONTROLS CORPORATION
+0x0040C1, BIZERBA-WERKE WILHEIM KRAUT
+0x0040C2, APPLIED COMPUTING DEVICES
+0x0040C3, FISCHER AND PORTER CO.
+0x0040C4, KINKEI SYSTEM CORPORATION
+0x0040C5, MICOM COMMUNICATIONS INC.
+0x0040C6, FIBERNET RESEARCH, INC.
+0x0040C7, RUBY TECH CORPORATION
+0x0040C8, MILAN TECHNOLOGY CORPORATION
+0x0040C9, NCUBE
+0x0040CA, FIRST INTERNAT'L COMPUTER, INC
+0x0040CB, LANWAN TECHNOLOGIES
+0x0040CC, SILCOM MANUF'G TECHNOLOGY INC.
+0x0040CD, TERA MICROSYSTEMS, INC.
+0x0040CE, NET-SOURCE, INC.
+0x0040CF, STRAWBERRY TREE, INC.
+0x0040D0, MITAC INTERNATIONAL CORP.
+0x0040D1, FUKUDA DENSHI CO., LTD.
+0x0040D2, PAGINE CORPORATION
+0x0040D3, KIMPSION INTERNATIONAL CORP.
+0x0040D4, GAGE TALKER CORP.
+0x0040D5, Sartorius Mechatronics T&H GmbH
+0x0040D6, LOCAMATION B.V.
+0x0040D7, STUDIO GEN INC.
+0x0040D8, OCEAN OFFICE AUTOMATION LTD.
+0x0040D9, AMERICAN MEGATRENDS INC.
+0x0040DA, TELSPEC LTD
+0x0040DB, ADVANCED TECHNICAL SOLUTIONS
+0x0040DC, TRITEC ELECTRONIC GMBH
+0x0040DD, HONG TECHNOLOGIES
+0x0040DE, Elsag Datamat spa
+0x0040DF, DIGALOG SYSTEMS, INC.
+0x0040E0, ATOMWIDE LTD.
+0x0040E1, MARNER INTERNATIONAL, INC.
+0x0040E2, MESA RIDGE TECHNOLOGIES, INC.
+0x0040E3, QUIN SYSTEMS LTD
+0x0040E4, E-M TECHNOLOGY, INC.
+0x0040E5, SYBUS CORPORATION
+0x0040E6, C.A.E.N.
+0x0040E7, ARNOS INSTRUMENTS & COMPUTER
+0x0040E8, CHARLES RIVER DATA SYSTEMS,INC
+0x0040E9, ACCORD SYSTEMS, INC.
+0x0040EA, PLAIN TREE SYSTEMS INC
+0x0040EB, MARTIN MARIETTA CORPORATION
+0x0040EC, MIKASA SYSTEM ENGINEERING
+0x0040ED, NETWORK CONTROLS INT'NATL INC.
+0x0040EE, OPTIMEM
+0x0040EF, HYPERCOM, INC.
+0x0040F0, MicroBrain,Inc.
+0x0040F1, CHUO ELECTRONICS CO., LTD.
+0x0040F2, JANICH & KLASS COMPUTERTECHNIK
+0x0040F3, NETCOR
+0x0040F4, CAMEO COMMUNICATIONS, INC.
+0x0040F5, OEM ENGINES
+0x0040F6, KATRON COMPUTERS INC.
+0x0040F7, Polaroid Corporation
+0x0040F8, SYSTEMHAUS DISCOM
+0x0040F9, COMBINET
+0x0040FA, MICROBOARDS, INC.
+0x0040FB, CASCADE COMMUNICATIONS CORP.
+0x0040FC, IBR COMPUTER TECHNIK GMBH
+0x0040FD, LXE
+0x0040FE, SYMPLEX COMMUNICATIONS
+0x0040FF, TELEBIT CORPORATION
+0x0041B4, Wuxi Zhongxing Optoelectronics Technology Co.,Ltd.
+0x004252, RLX Technologies
+0x0043FF, KETRON S.R.L.
+0x004501, Versus Technology, Inc.
+0x00464B, HUAWEI TECHNOLOGIES CO.,LTD
+0x004D32, Andon Health Co.,Ltd.
+0x005000, NEXO COMMUNICATIONS, INC.
+0x005001, YAMASHITA SYSTEMS CORP.
+0x005002, OMNISEC AG
+0x005003, Xrite Inc
+0x005004, 3COM CORPORATION
+0x005006, TAC AB
+0x005007, SIEMENS TELECOMMUNICATION SYSTEMS LIMITED
+0x005008, TIVA MICROCOMPUTER CORP. (TMC)
+0x005009, PHILIPS BROADBAND NETWORKS
+0x00500A, IRIS TECHNOLOGIES, INC.
+0x00500B, CISCO SYSTEMS, INC.
+0x00500C, e-Tek Labs, Inc.
+0x00500D, SATORI ELECTORIC CO., LTD.
+0x00500E, CHROMATIS NETWORKS, INC.
+0x00500F, CISCO SYSTEMS, INC.
+0x005010, NovaNET Learning, Inc.
+0x005012, CBL - GMBH
+0x005013, Chaparral Network Storage
+0x005014, CISCO SYSTEMS, INC.
+0x005015, BRIGHT STAR ENGINEERING
+0x005016, SST/WOODHEAD INDUSTRIES
+0x005017, RSR S.R.L.
+0x005018, AMIT, Inc.
+0x005019, SPRING TIDE NETWORKS, INC.
+0x00501A, IQinVision
+0x00501B, ABL CANADA, INC.
+0x00501C, JATOM SYSTEMS, INC.
+0x00501E, Miranda Technologies, Inc.
+0x00501F, MRG SYSTEMS, LTD.
+0x005020, MEDIASTAR CO., LTD.
+0x005021, EIS INTERNATIONAL, INC.
+0x005022, ZONET TECHNOLOGY, INC.
+0x005023, PG DESIGN ELECTRONICS, INC.
+0x005024, NAVIC SYSTEMS, INC.
+0x005026, COSYSTEMS, INC.
+0x005027, GENICOM CORPORATION
+0x005028, AVAL COMMUNICATIONS
+0x005029, 1394 PRINTER WORKING GROUP
+0x00502A, CISCO SYSTEMS, INC.
+0x00502B, GENRAD LTD.
+0x00502C, SOYO COMPUTER, INC.
+0x00502D, ACCEL, INC.
+0x00502E, CAMBEX CORPORATION
+0x00502F, TollBridge Technologies, Inc.
+0x005030, FUTURE PLUS SYSTEMS
+0x005031, AEROFLEX LABORATORIES, INC.
+0x005032, PICAZO COMMUNICATIONS, INC.
+0x005033, MAYAN NETWORKS
+0x005036, NETCAM, LTD.
+0x005037, KOGA ELECTRONICS CO.
+0x005038, DAIN TELECOM CO., LTD.
+0x005039, MARINER NETWORKS
+0x00503A, DATONG ELECTRONICS LTD.
+0x00503B, MEDIAFIRE CORPORATION
+0x00503C, TSINGHUA NOVEL ELECTRONICS
+0x00503E, CISCO SYSTEMS, INC.
+0x00503F, ANCHOR GAMES
+0x005040, Panasonic Electric Works Co., Ltd.
+0x005041, Coretronic Corporation
+0x005042, SCI MANUFACTURING SINGAPORE PTE, LTD.
+0x005043, MARVELL SEMICONDUCTOR, INC.
+0x005044, ASACA CORPORATION
+0x005045, RIOWORKS SOLUTIONS, INC.
+0x005046, MENICX INTERNATIONAL CO., LTD.
+0x005047, PRIVATE
+0x005048, INFOLIBRIA
+0x005049, Arbor Networks Inc
+0x00504A, ELTECO A.S.
+0x00504B, BARCONET N.V.
+0x00504C, Galil Motion Control
+0x00504D, Tokyo Electron Device Limited
+0x00504E, SIERRA MONITOR CORP.
+0x00504F, OLENCOM ELECTRONICS
+0x005050, CISCO SYSTEMS, INC.
+0x005051, IWATSU ELECTRIC CO., LTD.
+0x005052, TIARA NETWORKS, INC.
+0x005053, CISCO SYSTEMS, INC.
+0x005054, CISCO SYSTEMS, INC.
+0x005055, DOMS A/S
+0x005056, VMware, Inc.
+0x005057, BROADBAND ACCESS SYSTEMS
+0x005058, VegaStream Group Limted
+0x005059, iBAHN
+0x00505A, NETWORK ALCHEMY, INC.
+0x00505B, KAWASAKI LSI U.S.A., INC.
+0x00505C, TUNDO CORPORATION
+0x00505E, DIGITEK MICROLOGIC S.A.
+0x00505F, BRAND INNOVATORS
+0x005060, TANDBERG TELECOM AS
+0x005062, KOUWELL ELECTRONICS CORP. **
+0x005063, OY COMSEL SYSTEM AB
+0x005064, CAE ELECTRONICS
+0x005065, TDK-Lambda Corporation
+0x005066, AtecoM GmbH advanced telecomunication modules
+0x005067, AEROCOMM, INC.
+0x005068, ELECTRONIC INDUSTRIES ASSOCIATION
+0x005069, PixStream Incorporated
+0x00506A, EDEVA, INC.
+0x00506B, SPX-ATEG
+0x00506C, Beijer Electronics Products AB
+0x00506D, VIDEOJET SYSTEMS
+0x00506E, CORDER ENGINEERING CORPORATION
+0x00506F, G-CONNECT
+0x005070, CHAINTECH COMPUTER CO., LTD.
+0x005071, AIWA CO., LTD.
+0x005072, CORVIS CORPORATION
+0x005073, CISCO SYSTEMS, INC.
+0x005074, ADVANCED HI-TECH CORP.
+0x005075, KESTREL SOLUTIONS
+0x005076, IBM Corp
+0x005077, PROLIFIC TECHNOLOGY, INC.
+0x005078, MEGATON HOUSE, LTD.
+0x005079, PRIVATE
+0x00507A, XPEED, INC.
+0x00507B, MERLOT COMMUNICATIONS
+0x00507C, VIDEOCON AG
+0x00507D, IFP
+0x00507E, NEWER TECHNOLOGY
+0x00507F, DrayTek Corp.
+0x005080, CISCO SYSTEMS, INC.
+0x005081, MURATA MACHINERY, LTD.
+0x005082, FORESSON CORPORATION
+0x005083, GILBARCO, INC.
+0x005084, ATL PRODUCTS
+0x005086, TELKOM SA, LTD.
+0x005087, TERASAKI ELECTRIC CO., LTD.
+0x005088, AMANO CORPORATION
+0x005089, SAFETY MANAGEMENT SYSTEMS
+0x00508B, Hewlett-Packard Company
+0x00508C, RSI SYSTEMS
+0x00508D, ABIT COMPUTER CORPORATION
+0x00508E, OPTIMATION, INC.
+0x00508F, ASITA TECHNOLOGIES INT'L LTD.
+0x005090, DCTRI
+0x005091, NETACCESS, INC.
+0x005092, RIGAKU INDUSTRIAL CORPORATION
+0x005093, BOEING
+0x005094, PACE plc
+0x005095, PERACOM NETWORKS
+0x005096, SALIX TECHNOLOGIES, INC.
+0x005097, MMC-EMBEDDED COMPUTERTECHNIK GmbH
+0x005098, GLOBALOOP, LTD.
+0x005099, 3COM EUROPE, LTD.
+0x00509A, TAG ELECTRONIC SYSTEMS
+0x00509B, SWITCHCORE AB
+0x00509C, BETA RESEARCH
+0x00509D, THE INDUSTREE B.V.
+0x00509E, Les Technologies SoftAcoustik Inc.
+0x00509F, HORIZON COMPUTER
+0x0050A0, DELTA COMPUTER SYSTEMS, INC.
+0x0050A1, CARLO GAVAZZI, INC.
+0x0050A2, CISCO SYSTEMS, INC.
+0x0050A3, TransMedia Communications, Inc.
+0x0050A4, IO TECH, INC.
+0x0050A5, CAPITOL BUSINESS SYSTEMS, LTD.
+0x0050A6, OPTRONICS
+0x0050A7, CISCO SYSTEMS, INC.
+0x0050A8, OpenCon Systems, Inc.
+0x0050A9, MOLDAT WIRELESS TECHNOLGIES
+0x0050AA, KONICA MINOLTA HOLDINGS, INC.
+0x0050AB, NALTEC, Inc.
+0x0050AC, MAPLE COMPUTER CORPORATION
+0x0050AD, CommUnique Wireless Corp.
+0x0050AE, FDK Co., Ltd
+0x0050AF, INTERGON, INC.
+0x0050B0, TECHNOLOGY ATLANTA CORPORATION
+0x0050B1, GIDDINGS & LEWIS
+0x0050B2, BRODEL GmbH
+0x0050B3, VOICEBOARD CORPORATION
+0x0050B4, SATCHWELL CONTROL SYSTEMS, LTD
+0x0050B5, FICHET-BAUCHE
+0x0050B6, GOOD WAY IND. CO., LTD.
+0x0050B7, BOSER TECHNOLOGY CO., LTD.
+0x0050B8, INOVA COMPUTERS GMBH & CO. KG
+0x0050B9, XITRON TECHNOLOGIES, INC.
+0x0050BA, D-LINK
+0x0050BB, CMS TECHNOLOGIES
+0x0050BC, HAMMER STORAGE SOLUTIONS
+0x0050BD, CISCO SYSTEMS, INC.
+0x0050BE, FAST MULTIMEDIA AG
+0x0050BF, Metalligence Technology Corp.
+0x0050C0, GATAN, INC.
+0x0050C1, GEMFLEX NETWORKS, LTD.
+0x0050C2, IEEE REGISTRATION AUTHORITY - Please see IAB public listing for more information.
+0x0050C4, IMD
+0x0050C5, ADS Technologies, Inc
+0x0050C6, LOOP TELECOMMUNICATION INTERNATIONAL, INC.
+0x0050C8, Addonics Technologies, Inc.
+0x0050C9, MASPRO DENKOH CORP.
+0x0050CA, NET TO NET TECHNOLOGIES
+0x0050CB, JETTER
+0x0050CC, XYRATEX
+0x0050CD, DIGIANSWER A/S
+0x0050CE, LG INTERNATIONAL CORP.
+0x0050CF, VANLINK COMMUNICATION TECHNOLOGY RESEARCH INSTITUTE
+0x0050D0, MINERVA SYSTEMS
+0x0050D1, CISCO SYSTEMS, INC.
+0x0050D2, CMC Electronics Inc
+0x0050D3, DIGITAL AUDIO PROCESSING PTY. LTD.
+0x0050D4, JOOHONG INFORMATION &
+0x0050D5, AD SYSTEMS CORP.
+0x0050D6, ATLAS COPCO TOOLS AB
+0x0050D7, TELSTRAT
+0x0050D8, UNICORN COMPUTER CORP.
+0x0050D9, ENGETRON-ENGENHARIA ELETRONICA IND. e COM. LTDA
+0x0050DA, 3COM CORPORATION
+0x0050DB, CONTEMPORARY CONTROL
+0x0050DC, TAS TELEFONBAU A. SCHWABE GMBH & CO. KG
+0x0050DD, SERRA SOLDADURA, S.A.
+0x0050DE, SIGNUM SYSTEMS CORP.
+0x0050DF, AirFiber, Inc.
+0x0050E1, NS TECH ELECTRONICS SDN BHD
+0x0050E2, CISCO SYSTEMS, INC.
+0x0050E3, Motorola, Inc.
+0x0050E4, APPLE COMPUTER, INC.
+0x0050E6, HAKUSAN CORPORATION
+0x0050E7, PARADISE INNOVATIONS (ASIA)
+0x0050E8, NOMADIX INC.
+0x0050EA, XEL COMMUNICATIONS, INC.
+0x0050EB, ALPHA-TOP CORPORATION
+0x0050EC, OLICOM A/S
+0x0050ED, ANDA NETWORKS
+0x0050EE, TEK DIGITEL CORPORATION
+0x0050EF, SPE Systemhaus GmbH
+0x0050F0, CISCO SYSTEMS, INC.
+0x0050F1, Intel Corporation
+0x0050F2, MICROSOFT CORP.
+0x0050F3, GLOBAL NET INFORMATION CO., Ltd.
+0x0050F4, SIGMATEK GMBH & CO. KG
+0x0050F6, PAN-INTERNATIONAL INDUSTRIAL CORP.
+0x0050F7, VENTURE MANUFACTURING (SINGAPORE) LTD.
+0x0050F8, ENTREGA TECHNOLOGIES, INC.
+0x0050F9, SENSORMATIC ACD
+0x0050FA, OXTEL, LTD.
+0x0050FB, VSK ELECTRONICS
+0x0050FC, EDIMAX TECHNOLOGY CO., LTD.
+0x0050FD, VISIONCOMM CO., LTD.
+0x0050FE, PCTVnet ASA
+0x0050FF, HAKKO ELECTRONICS CO., LTD.
+0x005218, Wuxi Keboda Electron Co.Ltd
+0x0054AF, Continental Automotive Systems Inc.
+0x005907, LenovoEMC Products USA, LLC
+0x005CB1, Gospell DIGITAL TECHNOLOGY CO., LTD
+0x005D03, Xilinx, Inc
+0x006000, XYCOM INC.
+0x006001, InnoSys, Inc.
+0x006002, SCREEN SUBTITLING SYSTEMS, LTD
+0x006003, TERAOKA WEIGH SYSTEM PTE, LTD.
+0x006004, COMPUTADORES MODULARES SA
+0x006005, FEEDBACK DATA LTD.
+0x006006, SOTEC CO., LTD
+0x006007, ACRES GAMING, INC.
+0x006008, 3COM CORPORATION
+0x006009, CISCO SYSTEMS, INC.
+0x00600A, SORD COMPUTER CORPORATION
+0x00600B, LOGWARE GmbH
+0x00600C, Eurotech Inc.
+0x00600D, Digital Logic GmbH
+0x00600E, WAVENET INTERNATIONAL, INC.
+0x00600F, WESTELL, INC.
+0x006010, NETWORK MACHINES, INC.
+0x006011, CRYSTAL SEMICONDUCTOR CORP.
+0x006012, POWER COMPUTING CORPORATION
+0x006013, NETSTAL MASCHINEN AG
+0x006014, EDEC CO., LTD.
+0x006015, NET2NET CORPORATION
+0x006016, CLARIION
+0x006017, TOKIMEC INC.
+0x006018, STELLAR ONE CORPORATION
+0x006019, Roche Diagnostics
+0x00601A, KEITHLEY INSTRUMENTS
+0x00601B, MESA ELECTRONICS
+0x00601C, TELXON CORPORATION
+0x00601D, LUCENT TECHNOLOGIES
+0x00601E, SOFTLAB, INC.
+0x00601F, STALLION TECHNOLOGIES
+0x006020, PIVOTAL NETWORKING, INC.
+0x006021, DSC CORPORATION
+0x006022, VICOM SYSTEMS, INC.
+0x006023, PERICOM SEMICONDUCTOR CORP.
+0x006024, GRADIENT TECHNOLOGIES, INC.
+0x006025, ACTIVE IMAGING PLC
+0x006026, VIKING Modular Solutions
+0x006027, Superior Modular Products
+0x006028, MACROVISION CORPORATION
+0x006029, CARY PERIPHERALS INC.
+0x00602A, SYMICRON COMPUTER COMMUNICATIONS, LTD.
+0x00602B, PEAK AUDIO
+0x00602C, LINX Data Terminals, Inc.
+0x00602D, ALERTON TECHNOLOGIES, INC.
+0x00602E, CYCLADES CORPORATION
+0x00602F, CISCO SYSTEMS, INC.
+0x006030, VILLAGE TRONIC ENTWICKLUNG
+0x006031, HRK SYSTEMS
+0x006032, I-CUBE, INC.
+0x006033, ACUITY IMAGING, INC.
+0x006034, ROBERT BOSCH GmbH
+0x006035, DALLAS SEMICONDUCTOR, INC.
+0x006036, AIT Austrian Institute of Technology GmbH
+0x006037, NXP Semiconductors
+0x006038, Nortel Networks
+0x006039, SanCom Technology, Inc.
+0x00603A, QUICK CONTROLS LTD.
+0x00603B, AMTEC spa
+0x00603C, HAGIWARA SYS-COM CO., LTD.
+0x00603D, 3CX
+0x00603E, CISCO SYSTEMS, INC.
+0x00603F, PATAPSCO DESIGNS
+0x006040, NETRO CORP.
+0x006041, Yokogawa Electric Corporation
+0x006042, TKS (USA), INC.
+0x006043, iDirect, INC.
+0x006044, LITTON/POLY-SCIENTIFIC
+0x006045, PATHLIGHT TECHNOLOGIES
+0x006046, VMETRO, INC.
+0x006047, CISCO SYSTEMS, INC.
+0x006048, EMC CORPORATION
+0x006049, VINA TECHNOLOGIES
+0x00604A, SAIC IDEAS GROUP
+0x00604B, Safe-com GmbH & Co. KG
+0x00604C, SAGEM COMMUNICATION
+0x00604D, MMC NETWORKS, INC.
+0x00604E, CYCLE COMPUTER CORPORATION, INC.
+0x00604F, Tattile SRL
+0x006050, INTERNIX INC.
+0x006051, QUALITY SEMICONDUCTOR
+0x006052, PERIPHERALS ENTERPRISE CO., Ltd.
+0x006053, TOYODA MACHINE WORKS, LTD.
+0x006054, CONTROLWARE GMBH
+0x006055, CORNELL UNIVERSITY
+0x006056, NETWORK TOOLS, INC.
+0x006057, MURATA MANUFACTURING CO., LTD.
+0x006058, COPPER MOUNTAIN COMMUNICATIONS, INC.
+0x006059, TECHNICAL COMMUNICATIONS CORP.
+0x00605A, CELCORE, INC.
+0x00605B, IntraServer Technology, Inc.
+0x00605C, CISCO SYSTEMS, INC.
+0x00605D, SCANIVALVE CORP.
+0x00605E, LIBERTY TECHNOLOGY NETWORKING
+0x00605F, NIPPON UNISOFT CORPORATION
+0x006060, DAWNING TECHNOLOGIES, INC.
+0x006061, WHISTLE COMMUNICATIONS CORP.
+0x006062, TELESYNC, INC.
+0x006063, PSION DACOM PLC.
+0x006064, NETCOMM LIMITED
+0x006065, BERNECKER & RAINER INDUSTRIE-ELEKTRONIC GmbH
+0x006066, LACROIX Trafic
+0x006067, ACER NETXUS INC.
+0x006068, Dialogic Corporation
+0x006069, Brocade Communications Systems, Inc.
+0x00606A, MITSUBISHI WIRELESS COMMUNICATIONS. INC.
+0x00606B, Synclayer Inc.
+0x00606C, ARESCOM
+0x00606D, DIGITAL EQUIPMENT CORP.
+0x00606E, DAVICOM SEMICONDUCTOR, INC.
+0x00606F, CLARION CORPORATION OF AMERICA
+0x006070, CISCO SYSTEMS, INC.
+0x006071, MIDAS LAB, INC.
+0x006072, VXL INSTRUMENTS, LIMITED
+0x006073, REDCREEK COMMUNICATIONS, INC.
+0x006074, QSC AUDIO PRODUCTS
+0x006075, PENTEK, INC.
+0x006076, SCHLUMBERGER TECHNOLOGIES RETAIL PETROLEUM SYSTEMS
+0x006077, PRISA NETWORKS
+0x006078, POWER MEASUREMENT LTD.
+0x006079, Mainstream Data, Inc.
+0x00607A, DVS GmbH
+0x00607B, FORE SYSTEMS, INC.
+0x00607C, WaveAccess, Ltd.
+0x00607D, SENTIENT NETWORKS INC.
+0x00607E, GIGALABS, INC.
+0x00607F, AURORA TECHNOLOGIES, INC.
+0x006080, MICROTRONIX DATACOM LTD.
+0x006081, TV/COM INTERNATIONAL
+0x006082, NOVALINK TECHNOLOGIES, INC.
+0x006083, CISCO SYSTEMS, INC.
+0x006084, DIGITAL VIDEO
+0x006085, Storage Concepts
+0x006086, LOGIC REPLACEMENT TECH. LTD.
+0x006087, KANSAI ELECTRIC CO., LTD.
+0x006088, WHITE MOUNTAIN DSP, INC.
+0x006089, XATA
+0x00608A, CITADEL COMPUTER
+0x00608B, ConferTech International
+0x00608C, 3COM CORPORATION
+0x00608D, UNIPULSE CORP.
+0x00608E, HE ELECTRONICS, TECHNOLOGIE & SYSTEMTECHNIK GmbH
+0x00608F, TEKRAM TECHNOLOGY CO., LTD.
+0x006090, Artiza Networks Inc
+0x006091, FIRST PACIFIC NETWORKS, INC.
+0x006092, MICRO/SYS, INC.
+0x006093, VARIAN
+0x006094, IBM Corp
+0x006095, ACCU-TIME SYSTEMS, INC.
+0x006096, T.S. MICROTECH INC.
+0x006097, 3COM CORPORATION
+0x006098, HT COMMUNICATIONS
+0x006099, SBE, Inc.
+0x00609A, NJK TECHNO CO.
+0x00609B, ASTRO-MED, INC.
+0x00609C, Perkin-Elmer Incorporated
+0x00609D, PMI FOOD EQUIPMENT GROUP
+0x00609E, ASC X3 - INFORMATION TECHNOLOGY STANDARDS SECRETARIATS
+0x00609F, PHAST CORPORATION
+0x0060A0, SWITCHED NETWORK TECHNOLOGIES, INC.
+0x0060A1, VPNet, Inc.
+0x0060A2, NIHON UNISYS LIMITED CO.
+0x0060A3, CONTINUUM TECHNOLOGY CORP.
+0x0060A4, GRINAKER SYSTEM TECHNOLOGIES
+0x0060A5, PERFORMANCE TELECOM CORP.
+0x0060A6, PARTICLE MEASURING SYSTEMS
+0x0060A7, MICROSENS GmbH & CO. KG
+0x0060A8, TIDOMAT AB
+0x0060A9, GESYTEC MbH
+0x0060AA, INTELLIGENT DEVICES INC. (IDI)
+0x0060AB, LARSCOM INCORPORATED
+0x0060AC, RESILIENCE CORPORATION
+0x0060AD, MegaChips Corporation
+0x0060AE, TRIO INFORMATION SYSTEMS AB
+0x0060AF, PACIFIC MICRO DATA, INC.
+0x0060B0, HEWLETT-PACKARD CO.
+0x0060B1, INPUT/OUTPUT, INC.
+0x0060B2, PROCESS CONTROL CORP.
+0x0060B3, Z-COM, INC.
+0x0060B4, GLENAYRE R&D INC.
+0x0060B5, KEBA GmbH
+0x0060B6, LAND COMPUTER CO., LTD.
+0x0060B7, CHANNELMATIC, INC.
+0x0060B8, CORELIS Inc.
+0x0060B9, NEC Infrontia Corporation
+0x0060BA, SAHARA NETWORKS, INC.
+0x0060BB, CABLETRON - NETLINK, INC.
+0x0060BC, KeunYoung Electronics & Communication Co., Ltd.
+0x0060BD, HUBBELL-PULSECOM
+0x0060BE, WEBTRONICS
+0x0060BF, MACRAIGOR SYSTEMS, INC.
+0x0060C0, Nera Networks AS
+0x0060C1, WaveSpan Corporation
+0x0060C2, MPL AG
+0x0060C3, NETVISION CORPORATION
+0x0060C4, SOLITON SYSTEMS K.K.
+0x0060C5, ANCOT CORP.
+0x0060C6, DCS AG
+0x0060C7, AMATI COMMUNICATIONS CORP.
+0x0060C8, KUKA WELDING SYSTEMS & ROBOTS
+0x0060C9, ControlNet, Inc.
+0x0060CA, HARMONIC SYSTEMS INCORPORATED
+0x0060CB, HITACHI ZOSEN CORPORATION
+0x0060CC, EMTRAK, INCORPORATED
+0x0060CD, VideoServer, Inc.
+0x0060CE, ACCLAIM COMMUNICATIONS
+0x0060CF, ALTEON NETWORKS, INC.
+0x0060D0, SNMP RESEARCH INCORPORATED
+0x0060D1, CASCADE COMMUNICATIONS
+0x0060D2, LUCENT TECHNOLOGIES TAIWAN TELECOMMUNICATIONS CO., LTD.
+0x0060D3, AT&T
+0x0060D4, ELDAT COMMUNICATION LTD.
+0x0060D5, MIYACHI TECHNOS CORP.
+0x0060D6, NovAtel Wireless Technologies Ltd.
+0x0060D7, ECOLE POLYTECHNIQUE FEDERALE DE LAUSANNE (EPFL)
+0x0060D8, ELMIC SYSTEMS, INC.
+0x0060D9, TRANSYS NETWORKS INC.
+0x0060DA, JBM ELECTRONICS CO.
+0x0060DB, NTP ELEKTRONIK A/S
+0x0060DC, Toyo Network Systems & System Integration Co. LTD
+0x0060DD, MYRICOM, INC.
+0x0060DE, Kayser-Threde GmbH
+0x0060DF, Brocade Communications Systems, Inc.
+0x0060E0, AXIOM TECHNOLOGY CO., LTD.
+0x0060E1, ORCKIT COMMUNICATIONS LTD.
+0x0060E2, QUEST ENGINEERING & DEVELOPMENT
+0x0060E3, ARBIN INSTRUMENTS
+0x0060E4, COMPUSERVE, INC.
+0x0060E5, FUJI AUTOMATION CO., LTD.
+0x0060E6, SHOMITI SYSTEMS INCORPORATED
+0x0060E7, RANDATA
+0x0060E8, HITACHI COMPUTER PRODUCTS (AMERICA), INC.
+0x0060E9, ATOP TECHNOLOGIES, INC.
+0x0060EA, StreamLogic
+0x0060EB, FOURTHTRACK SYSTEMS
+0x0060EC, HERMARY OPTO ELECTRONICS INC.
+0x0060ED, RICARDO TEST AUTOMATION LTD.
+0x0060EE, APOLLO
+0x0060EF, FLYTECH TECHNOLOGY CO., LTD.
+0x0060F0, JOHNSON & JOHNSON MEDICAL, INC
+0x0060F1, EXP COMPUTER, INC.
+0x0060F2, LASERGRAPHICS, INC.
+0x0060F3, Performance Analysis Broadband, Spirent plc
+0x0060F4, ADVANCED COMPUTER SOLUTIONS, Inc.
+0x0060F5, ICON WEST, INC.
+0x0060F6, NEXTEST COMMUNICATIONS PRODUCTS, INC.
+0x0060F7, DATAFUSION SYSTEMS
+0x0060F8, Loran International Technologies Inc.
+0x0060F9, DIAMOND LANE COMMUNICATIONS
+0x0060FA, EDUCATIONAL TECHNOLOGY RESOURCES, INC.
+0x0060FB, PACKETEER, INC.
+0x0060FC, CONSERVATION THROUGH INNOVATION LTD.
+0x0060FD, NetICs, Inc.
+0x0060FE, LYNX SYSTEM DEVELOPERS, INC.
+0x0060FF, QuVis, Inc.
+0x006440, CISCO SYSTEMS, INC.
+0x0064A6, Maquet CardioVascular
+0x00664B, Huawei Technologies Co., Ltd
+0x006B9E, VIZIO Inc
+0x006BA0, SHENZHEN UNIVERSAL INTELLISYS PTE LTD
+0x006DFB, Vutrix (UK) Ltd
+0x0070B0, M/A-COM INC. COMPANIES
+0x0070B3, DATA RECALL LTD.
+0x00789E, SAGEMCOM
+0x007F28, Actiontec Electronics, Inc
+0x008000, MULTITECH SYSTEMS, INC.
+0x008001, PERIPHONICS CORPORATION
+0x008002, SATELCOM (UK) LTD
+0x008003, HYTEC ELECTRONICS LTD.
+0x008004, ANTLOW COMMUNICATIONS, LTD.
+0x008005, CACTUS COMPUTER INC.
+0x008006, COMPUADD CORPORATION
+0x008007, DLOG NC-SYSTEME
+0x008008, DYNATECH COMPUTER SYSTEMS
+0x008009, JUPITER SYSTEMS, INC.
+0x00800A, JAPAN COMPUTER CORP.
+0x00800B, CSK CORPORATION
+0x00800C, VIDECOM LIMITED
+0x00800D, VOSSWINKEL F.U.
+0x00800E, ATLANTIX CORPORATION
+0x00800F, STANDARD MICROSYSTEMS
+0x008010, COMMODORE INTERNATIONAL
+0x008011, DIGITAL SYSTEMS INT'L. INC.
+0x008012, INTEGRATED MEASUREMENT SYSTEMS
+0x008013, THOMAS-CONRAD CORPORATION
+0x008014, ESPRIT SYSTEMS
+0x008015, SEIKO SYSTEMS, INC.
+0x008016, WANDEL AND GOLTERMANN
+0x008017, PFU LIMITED
+0x008018, KOBE STEEL, LTD.
+0x008019, DAYNA COMMUNICATIONS, INC.
+0x00801A, BELL ATLANTIC
+0x00801B, KODIAK TECHNOLOGY
+0x00801C, NEWPORT SYSTEMS SOLUTIONS
+0x00801D, INTEGRATED INFERENCE MACHINES
+0x00801E, XINETRON, INC.
+0x00801F, KRUPP ATLAS ELECTRONIK GMBH
+0x008020, NETWORK PRODUCTS
+0x008021, Alcatel Canada Inc.
+0x008022, SCAN-OPTICS
+0x008023, INTEGRATED BUSINESS NETWORKS
+0x008024, KALPANA, INC.
+0x008025, STOLLMANN GMBH
+0x008026, NETWORK PRODUCTS CORPORATION
+0x008027, ADAPTIVE SYSTEMS, INC.
+0x008028, TRADPOST (HK) LTD
+0x008029, EAGLE TECHNOLOGY, INC.
+0x00802A, TEST SYSTEMS & SIMULATIONS INC
+0x00802B, INTEGRATED MARKETING CO
+0x00802C, THE SAGE GROUP PLC
+0x00802D, XYLOGICS INC
+0x00802E, CASTLE ROCK COMPUTING
+0x00802F, NATIONAL INSTRUMENTS CORP.
+0x008030, NEXUS ELECTRONICS
+0x008031, BASYS, CORP.
+0x008032, ACCESS CO., LTD.
+0x008033, EMS Aviation, Inc.
+0x008034, SMT GOUPIL
+0x008035, TECHNOLOGY WORKS, INC.
+0x008036, REFLEX MANUFACTURING SYSTEMS
+0x008037, Ericsson Group
+0x008038, DATA RESEARCH & APPLICATIONS
+0x008039, ALCATEL STC AUSTRALIA
+0x00803A, VARITYPER, INC.
+0x00803B, APT COMMUNICATIONS, INC.
+0x00803C, TVS ELECTRONICS LTD
+0x00803D, SURIGIKEN CO., LTD.
+0x00803E, SYNERNETICS
+0x00803F, TATUNG COMPANY
+0x008040, JOHN FLUKE MANUFACTURING CO.
+0x008041, VEB KOMBINAT ROBOTRON
+0x008042, Emerson Network Power
+0x008043, NETWORLD, INC.
+0x008044, SYSTECH COMPUTER CORP.
+0x008045, MATSUSHITA ELECTRIC IND. CO
+0x008046, Tattile SRL
+0x008047, IN-NET CORP.
+0x008048, COMPEX INCORPORATED
+0x008049, NISSIN ELECTRIC CO., LTD.
+0x00804A, PRO-LOG
+0x00804B, EAGLE TECHNOLOGIES PTY.LTD.
+0x00804C, CONTEC CO., LTD.
+0x00804D, CYCLONE MICROSYSTEMS, INC.
+0x00804E, APEX COMPUTER COMPANY
+0x00804F, DAIKIN INDUSTRIES, LTD.
+0x008050, ZIATECH CORPORATION
+0x008051, FIBERMUX
+0x008052, TECHNICALLY ELITE CONCEPTS
+0x008053, INTELLICOM, INC.
+0x008054, FRONTIER TECHNOLOGIES CORP.
+0x008055, FERMILAB
+0x008056, SPHINX ELEKTRONIK GMBH
+0x008057, ADSOFT, LTD.
+0x008058, PRINTER SYSTEMS CORPORATION
+0x008059, STANLEY ELECTRIC CO., LTD
+0x00805A, TULIP COMPUTERS INTERNAT'L B.V
+0x00805B, CONDOR SYSTEMS, INC.
+0x00805C, AGILIS CORPORATION
+0x00805D, CANSTAR
+0x00805E, LSI LOGIC CORPORATION
+0x00805F, Hewlett-Packard Company
+0x008060, NETWORK INTERFACE CORPORATION
+0x008061, LITTON SYSTEMS, INC.
+0x008062, INTERFACE CO.
+0x008063, Hirschmann Automation and Control GmbH
+0x008064, Tattile SRL
+0x008065, CYBERGRAPHIC SYSTEMS PTY LTD.
+0x008066, ARCOM CONTROL SYSTEMS, LTD.
+0x008067, SQUARE D COMPANY
+0x008068, YAMATECH SCIENTIFIC LTD.
+0x008069, COMPUTONE SYSTEMS
+0x00806A, ERI (EMPAC RESEARCH INC.)
+0x00806B, SCHMID TELECOMMUNICATION
+0x00806C, CEGELEC PROJECTS LTD
+0x00806D, CENTURY SYSTEMS CORP.
+0x00806E, NIPPON STEEL CORPORATION
+0x00806F, ONELAN LTD.
+0x008070, COMPUTADORAS MICRON
+0x008071, SAI TECHNOLOGY
+0x008072, MICROPLEX SYSTEMS LTD.
+0x008073, DWB ASSOCIATES
+0x008074, FISHER CONTROLS
+0x008075, PARSYTEC GMBH
+0x008076, MCNC
+0x008077, BROTHER INDUSTRIES, LTD.
+0x008078, PRACTICAL PERIPHERALS, INC.
+0x008079, MICROBUS DESIGNS LTD.
+0x00807A, AITECH SYSTEMS LTD.
+0x00807B, ARTEL COMMUNICATIONS CORP.
+0x00807C, FIBERCOM, INC.
+0x00807D, EQUINOX SYSTEMS INC.
+0x00807E, SOUTHERN PACIFIC LTD.
+0x00807F, DY-4 INCORPORATED
+0x008080, DATAMEDIA CORPORATION
+0x008081, KENDALL SQUARE RESEARCH CORP.
+0x008082, PEP MODULAR COMPUTERS GMBH
+0x008083, AMDAHL
+0x008084, THE CLOUD INC.
+0x008085, H-THREE SYSTEMS CORPORATION
+0x008086, COMPUTER GENERATION INC.
+0x008087, OKI ELECTRIC INDUSTRY CO., LTD
+0x008088, VICTOR COMPANY OF JAPAN, LTD.
+0x008089, TECNETICS (PTY) LTD.
+0x00808A, SUMMIT MICROSYSTEMS CORP.
+0x00808B, DACOLL LIMITED
+0x00808C, NetScout Systems, Inc.
+0x00808D, WESTCOAST TECHNOLOGY B.V.
+0x00808E, RADSTONE TECHNOLOGY
+0x00808F, C. ITOH ELECTRONICS, INC.
+0x008090, MICROTEK INTERNATIONAL, INC.
+0x008091, TOKYO ELECTRIC CO.,LTD
+0x008092, Silex Technology, Inc.
+0x008093, XYRON CORPORATION
+0x008094, ALFA LAVAL AUTOMATION AB
+0x008095, BASIC MERTON HANDELSGES.M.B.H.
+0x008096, HUMAN DESIGNED SYSTEMS, INC.
+0x008097, CENTRALP AUTOMATISMES
+0x008098, TDK CORPORATION
+0x008099, Eaton Industries GmbH
+0x00809A, NOVUS NETWORKS LTD
+0x00809B, JUSTSYSTEM CORPORATION
+0x00809C, LUXCOM, INC.
+0x00809D, Commscraft Ltd.
+0x00809E, DATUS GMBH
+0x00809F, ALCATEL BUSINESS SYSTEMS
+0x0080A0, EDISA HEWLETT PACKARD S/A
+0x0080A1, MICROTEST, INC.
+0x0080A2, Tattile SRL
+0x0080A3, Lantronix
+0x0080A4, LIBERTY ELECTRONICS
+0x0080A5, SPEED INTERNATIONAL
+0x0080A6, REPUBLIC TECHNOLOGY, INC.
+0x0080A7, Honeywell International Inc
+0x0080A8, VITACOM CORPORATION
+0x0080A9, CLEARPOINT RESEARCH
+0x0080AA, MAXPEED
+0x0080AB, DUKANE NETWORK INTEGRATION
+0x0080AC, IMLOGIX, DIVISION OF GENESYS
+0x0080AD, CNET TECHNOLOGY, INC.
+0x0080AE, HUGHES NETWORK SYSTEMS
+0x0080AF, ALLUMER CO., LTD.
+0x0080B0, ADVANCED INFORMATION
+0x0080B1, SOFTCOM A/S
+0x0080B2, NETWORK EQUIPMENT TECHNOLOGIES
+0x0080B3, AVAL DATA CORPORATION
+0x0080B4, SOPHIA SYSTEMS
+0x0080B5, UNITED NETWORKS INC.
+0x0080B6, THEMIS COMPUTER
+0x0080B7, STELLAR COMPUTER
+0x0080B8, BUG, INCORPORATED
+0x0080B9, ARCHE TECHNOLIGIES INC.
+0x0080BA, SPECIALIX (ASIA) PTE, LTD
+0x0080BB, HUGHES LAN SYSTEMS
+0x0080BC, HITACHI ENGINEERING CO., LTD
+0x0080BD, THE FURUKAWA ELECTRIC CO., LTD
+0x0080BE, ARIES RESEARCH
+0x0080BF, TAKAOKA ELECTRIC MFG. CO. LTD.
+0x0080C0, PENRIL DATACOMM
+0x0080C1, LANEX CORPORATION
+0x0080C2, IEEE 802.1 COMMITTEE
+0x0080C3, BICC INFORMATION SYSTEMS & SVC
+0x0080C4, DOCUMENT TECHNOLOGIES, INC.
+0x0080C5, NOVELLCO DE MEXICO
+0x0080C6, NATIONAL DATACOMM CORPORATION
+0x0080C7, XIRCOM
+0x0080C8, D-LINK SYSTEMS, INC.
+0x0080C9, ALBERTA MICROELECTRONIC CENTRE
+0x0080CA, NETCOM RESEARCH INCORPORATED
+0x0080CB, FALCO DATA PRODUCTS
+0x0080CC, MICROWAVE BYPASS SYSTEMS
+0x0080CD, MICRONICS COMPUTER, INC.
+0x0080CE, BROADCAST TELEVISION SYSTEMS
+0x0080CF, EMBEDDED PERFORMANCE INC.
+0x0080D0, COMPUTER PERIPHERALS, INC.
+0x0080D1, KIMTRON CORPORATION
+0x0080D2, SHINNIHONDENKO CO., LTD.
+0x0080D3, SHIVA CORP.
+0x0080D4, CHASE RESEARCH LTD.
+0x0080D5, CADRE TECHNOLOGIES
+0x0080D6, NUVOTECH, INC.
+0x0080D7, Fantum Engineering
+0x0080D8, NETWORK PERIPHERALS INC.
+0x0080D9, EMK Elektronik GmbH & Co. KG
+0x0080DA, Bruel & Kjaer Sound & Vibration Measurement A/S
+0x0080DB, GRAPHON CORPORATION
+0x0080DC, PICKER INTERNATIONAL
+0x0080DD, GMX INC/GIMIX
+0x0080DE, GIPSI S.A.
+0x0080DF, ADC CODENOLL TECHNOLOGY CORP.
+0x0080E0, XTP SYSTEMS, INC.
+0x0080E1, STMICROELECTRONICS
+0x0080E2, T.D.I. CO., LTD.
+0x0080E3, CORAL NETWORK CORPORATION
+0x0080E4, NORTHWEST DIGITAL SYSTEMS, INC
+0x0080E5, LSI Logic Corporation
+0x0080E6, PEER NETWORKS, INC.
+0x0080E7, LYNWOOD SCIENTIFIC DEV. LTD.
+0x0080E8, CUMULUS CORPORATIION
+0x0080E9, Madge Ltd.
+0x0080EA, ADVA Optical Networking Ltd.
+0x0080EB, COMPCONTROL B.V.
+0x0080EC, SUPERCOMPUTING SOLUTIONS, INC.
+0x0080ED, IQ TECHNOLOGIES, INC.
+0x0080EE, THOMSON CSF
+0x0080EF, RATIONAL
+0x0080F0, Panasonic Communications Co., Ltd.
+0x0080F1, OPUS SYSTEMS
+0x0080F2, RAYCOM SYSTEMS INC
+0x0080F3, SUN ELECTRONICS CORP.
+0x0080F4, TELEMECANIQUE ELECTRIQUE
+0x0080F5, Quantel Ltd
+0x0080F6, SYNERGY MICROSYSTEMS
+0x0080F7, ZENITH ELECTRONICS
+0x0080F8, MIZAR, INC.
+0x0080F9, HEURIKON CORPORATION
+0x0080FA, RWT GMBH
+0x0080FB, BVM LIMITED
+0x0080FC, AVATAR CORPORATION
+0x0080FD, EXSCEED CORPRATION
+0x0080FE, AZURE TECHNOLOGIES, INC.
+0x0080FF, SOC. DE TELEINFORMATIQUE RTC
+0x008865, Apple
+0x008C10, Black Box Corp.
+0x008C54, ADB Broadband Italia
+0x008CFA, Inventec Corporation
+0x008D4E, CJSC NII STT
+0x008DDA, Link One Co., Ltd.
+0x008EF2, NETGEAR INC.,
+0x009000, DIAMOND MULTIMEDIA
+0x009001, NISHIMU ELECTRONICS INDUSTRIES CO., LTD.
+0x009002, ALLGON AB
+0x009003, APLIO
+0x009004, 3COM EUROPE LTD.
+0x009005, PROTECH SYSTEMS CO., LTD.
+0x009006, HAMAMATSU PHOTONICS K.K.
+0x009007, DOMEX TECHNOLOGY CORP.
+0x009008, HanA Systems Inc.
+0x009009, i Controls, Inc.
+0x00900A, PROTON ELECTRONIC INDUSTRIAL CO., LTD.
+0x00900B, LANNER ELECTRONICS, INC.
+0x00900C, CISCO SYSTEMS, INC.
+0x00900D, Overland Storage Inc.
+0x00900E, HANDLINK TECHNOLOGIES, INC.
+0x00900F, KAWASAKI HEAVY INDUSTRIES, LTD
+0x009010, SIMULATION LABORATORIES, INC.
+0x009011, WAVTrace, Inc.
+0x009012, GLOBESPAN SEMICONDUCTOR, INC.
+0x009013, SAMSAN CORP.
+0x009014, ROTORK INSTRUMENTS, LTD.
+0x009015, CENTIGRAM COMMUNICATIONS CORP.
+0x009016, ZAC
+0x009017, Zypcom, Inc
+0x009018, ITO ELECTRIC INDUSTRY CO, LTD.
+0x009019, HERMES ELECTRONICS CO., LTD.
+0x00901A, UNISPHERE SOLUTIONS
+0x00901B, DIGITAL CONTROLS
+0x00901C, mps Software Gmbh
+0x00901D, PEC (NZ) LTD.
+0x00901E, Selesta Ingegneria S.p.A.
+0x00901F, ADTEC PRODUCTIONS, INC.
+0x009020, PHILIPS ANALYTICAL X-RAY B.V.
+0x009021, CISCO SYSTEMS, INC.
+0x009022, IVEX
+0x009023, ZILOG INC.
+0x009024, PIPELINKS, INC.
+0x009025, BAE Systems Australia (Electronic Systems) Pty Ltd
+0x009026, ADVANCED SWITCHING COMMUNICATIONS, INC.
+0x009027, INTEL CORPORATION
+0x009028, NIPPON SIGNAL CO., LTD.
+0x009029, CRYPTO AG
+0x00902A, COMMUNICATION DEVICES, INC.
+0x00902B, CISCO SYSTEMS, INC.
+0x00902C, DATA & CONTROL EQUIPMENT LTD.
+0x00902D, DATA ELECTRONICS (AUST.) PTY, LTD.
+0x00902E, NAMCO LIMITED
+0x00902F, NETCORE SYSTEMS, INC.
+0x009030, HONEYWELL-DATING
+0x009031, MYSTICOM, LTD.
+0x009032, PELCOMBE GROUP LTD.
+0x009033, INNOVAPHONE AG
+0x009034, IMAGIC, INC.
+0x009035, ALPHA TELECOM, INC.
+0x009036, ens, inc.
+0x009037, ACUCOMM, INC.
+0x009038, FOUNTAIN TECHNOLOGIES, INC.
+0x009039, SHASTA NETWORKS
+0x00903A, NIHON MEDIA TOOL INC.
+0x00903B, TriEMS Research Lab, Inc.
+0x00903C, ATLANTIC NETWORK SYSTEMS
+0x00903D, BIOPAC SYSTEMS, INC.
+0x00903E, N.V. PHILIPS INDUSTRIAL ACTIVITIES
+0x00903F, AZTEC RADIOMEDIA
+0x009040, Siemens Network Convergence LLC
+0x009041, APPLIED DIGITAL ACCESS
+0x009042, ECCS, Inc.
+0x009043, Tattile SRL
+0x009044, ASSURED DIGITAL, INC.
+0x009045, Marconi Communications
+0x009046, DEXDYNE, LTD.
+0x009047, GIGA FAST E. LTD.
+0x009048, ZEAL CORPORATION
+0x009049, ENTRIDIA CORPORATION
+0x00904A, CONCUR SYSTEM TECHNOLOGIES
+0x00904B, GemTek Technology Co., Ltd.
+0x00904C, EPIGRAM, INC.
+0x00904D, SPEC S.A.
+0x00904E, DELEM BV
+0x00904F, ABB POWER T&D COMPANY, INC.
+0x009050, TELESTE OY
+0x009051, ULTIMATE TECHNOLOGY CORP.
+0x009052, SELCOM ELETTRONICA S.R.L.
+0x009053, DAEWOO ELECTRONICS CO., LTD.
+0x009054, INNOVATIVE SEMICONDUCTORS, INC
+0x009055, PARKER HANNIFIN CORPORATION COMPUMOTOR DIVISION
+0x009056, TELESTREAM, INC.
+0x009057, AANetcom, Inc.
+0x009058, Ultra Electronics Ltd., Command and Control Systems
+0x009059, TELECOM DEVICE K.K.
+0x00905A, DEARBORN GROUP, INC.
+0x00905B, RAYMOND AND LAE ENGINEERING
+0x00905C, EDMI
+0x00905D, NETCOM SICHERHEITSTECHNIK GmbH
+0x00905E, RAULAND-BORG CORPORATION
+0x00905F, CISCO SYSTEMS, INC.
+0x009060, SYSTEM CREATE CORP.
+0x009061, PACIFIC RESEARCH & ENGINEERING CORPORATION
+0x009062, ICP VORTEX COMPUTERSYSTEME GmbH
+0x009063, COHERENT COMMUNICATIONS SYSTEMS CORPORATION
+0x009064, Thomson Inc.
+0x009065, FINISAR CORPORATION
+0x009066, Troika Networks, Inc.
+0x009067, WalkAbout Computers, Inc.
+0x009068, DVT CORP.
+0x009069, JUNIPER NETWORKS, INC.
+0x00906A, TURNSTONE SYSTEMS, INC.
+0x00906B, APPLIED RESOURCES, INC.
+0x00906C, Sartorius Hamburg GmbH
+0x00906D, CISCO SYSTEMS, INC.
+0x00906E, PRAXON, INC.
+0x00906F, CISCO SYSTEMS, INC.
+0x009070, NEO NETWORKS, INC.
+0x009071, Applied Innovation Inc.
+0x009072, SIMRAD AS
+0x009073, GAIO TECHNOLOGY
+0x009074, ARGON NETWORKS, INC.
+0x009075, NEC DO BRASIL S.A.
+0x009076, FMT AIRCRAFT GATE SUPPORT SYSTEMS AB
+0x009077, ADVANCED FIBRE COMMUNICATIONS
+0x009078, MER TELEMANAGEMENT SOLUTIONS, LTD.
+0x009079, ClearOne, Inc.
+0x00907A, Polycom, Inc.
+0x00907B, E-TECH, INC.
+0x00907C, DIGITALCAST, INC.
+0x00907D, Lake Communications
+0x00907E, VETRONIX CORP.
+0x00907F, WatchGuard Technologies, Inc.
+0x009080, NOT LIMITED, INC.
+0x009081, ALOHA NETWORKS, INC.
+0x009082, FORCE INSTITUTE
+0x009083, TURBO COMMUNICATION, INC.
+0x009084, ATECH SYSTEM
+0x009085, GOLDEN ENTERPRISES, INC.
+0x009086, CISCO SYSTEMS, INC.
+0x009087, ITIS
+0x009088, BAXALL SECURITY LTD.
+0x009089, SOFTCOM MICROSYSTEMS, INC.
+0x00908A, BAYLY COMMUNICATIONS, INC.
+0x00908B, Tattile SRL
+0x00908C, ETREND ELECTRONICS, INC.
+0x00908D, VICKERS ELECTRONICS SYSTEMS
+0x00908E, Nortel Networks Broadband Access
+0x00908F, AUDIO CODES LTD.
+0x009090, I-BUS
+0x009091, DigitalScape, Inc.
+0x009092, CISCO SYSTEMS, INC.
+0x009093, NANAO CORPORATION
+0x009094, OSPREY TECHNOLOGIES, INC.
+0x009095, UNIVERSAL AVIONICS
+0x009096, ASKEY COMPUTER CORP.
+0x009097, Sycamore Networks
+0x009098, SBC DESIGNS, INC.
+0x009099, ALLIED TELESIS, K.K.
+0x00909A, ONE WORLD SYSTEMS, INC.
+0x00909B, IMAJE
+0x00909C, Motorola, Inc.
+0x00909D, NovaTech Process Solutions, LLC
+0x00909E, Critical IO, LLC
+0x00909F, DIGI-DATA CORPORATION
+0x0090A0, 8X8 INC.
+0x0090A1, Flying Pig Systems/High End Systems Inc.
+0x0090A2, CYBERTAN TECHNOLOGY, INC.
+0x0090A3, Corecess Inc.
+0x0090A4, ALTIGA NETWORKS
+0x0090A5, SPECTRA LOGIC
+0x0090A6, CISCO SYSTEMS, INC.
+0x0090A7, CLIENTEC CORPORATION
+0x0090A8, NineTiles Networks, Ltd.
+0x0090A9, WESTERN DIGITAL
+0x0090AA, INDIGO ACTIVE VISION SYSTEMS LIMITED
+0x0090AB, CISCO SYSTEMS, INC.
+0x0090AC, OPTIVISION, INC.
+0x0090AD, ASPECT ELECTRONICS, INC.
+0x0090AE, ITALTEL S.p.A.
+0x0090AF, J. MORITA MFG. CORP.
+0x0090B0, VADEM
+0x0090B1, CISCO SYSTEMS, INC.
+0x0090B2, AVICI SYSTEMS INC.
+0x0090B3, AGRANAT SYSTEMS
+0x0090B4, WILLOWBROOK TECHNOLOGIES
+0x0090B5, NIKON CORPORATION
+0x0090B6, FIBEX SYSTEMS
+0x0090B7, DIGITAL LIGHTWAVE, INC.
+0x0090B8, ROHDE & SCHWARZ GMBH & CO. KG
+0x0090B9, BERAN INSTRUMENTS LTD.
+0x0090BA, VALID NETWORKS, INC.
+0x0090BB, TAINET COMMUNICATION SYSTEM Corp.
+0x0090BC, TELEMANN CO., LTD.
+0x0090BD, OMNIA COMMUNICATIONS, INC.
+0x0090BE, IBC/INTEGRATED BUSINESS COMPUTERS
+0x0090BF, CISCO SYSTEMS, INC.
+0x0090C0, K.J. LAW ENGINEERS, INC.
+0x0090C1, Peco II, Inc.
+0x0090C2, JK microsystems, Inc.
+0x0090C3, TOPIC SEMICONDUCTOR CORP.
+0x0090C4, JAVELIN SYSTEMS, INC.
+0x0090C5, INTERNET MAGIC, INC.
+0x0090C6, OPTIM SYSTEMS, INC.
+0x0090C7, ICOM INC.
+0x0090C8, WAVERIDER COMMUNICATIONS (CANADA) INC.
+0x0090C9, DPAC Technologies
+0x0090CA, ACCORD VIDEO TELECOMMUNICATIONS, LTD.
+0x0090CB, Wireless OnLine, Inc.
+0x0090CC, Planex Communications
+0x0090CD, ENT-EMPRESA NACIONAL DE TELECOMMUNICACOES, S.A.
+0x0090CE, TETRA GmbH
+0x0090CF, NORTEL
+0x0090D0, Thomson Telecom Belgium
+0x0090D1, LEICHU ENTERPRISE CO., LTD.
+0x0090D2, ARTEL VIDEO SYSTEMS
+0x0090D3, GIESECKE & DEVRIENT GmbH
+0x0090D4, BindView Development Corp.
+0x0090D5, EUPHONIX, INC.
+0x0090D6, CRYSTAL GROUP
+0x0090D7, NetBoost Corp.
+0x0090D8, WHITECROSS SYSTEMS
+0x0090D9, CISCO SYSTEMS, INC.
+0x0090DA, DYNARC, INC.
+0x0090DB, NEXT LEVEL COMMUNICATIONS
+0x0090DC, TECO INFORMATION SYSTEMS
+0x0090DD, THE MIHARU COMMUNICATIONS CO., LTD.
+0x0090DE, CARDKEY SYSTEMS, INC.
+0x0090DF, MITSUBISHI CHEMICAL AMERICA, INC.
+0x0090E0, SYSTRAN CORP.
+0x0090E1, TELENA S.P.A.
+0x0090E2, DISTRIBUTED PROCESSING TECHNOLOGY
+0x0090E3, AVEX ELECTRONICS INC.
+0x0090E4, NEC AMERICA, INC.
+0x0090E5, TEKNEMA, INC.
+0x0090E6, ALi Corporation
+0x0090E7, HORSCH ELEKTRONIK AG
+0x0090E8, MOXA TECHNOLOGIES CORP., LTD.
+0x0090E9, JANZ COMPUTER AG
+0x0090EA, ALPHA TECHNOLOGIES, INC.
+0x0090EB, SENTRY TELECOM SYSTEMS
+0x0090EC, PYRESCOM
+0x0090ED, CENTRAL SYSTEM RESEARCH CO., LTD.
+0x0090EE, PERSONAL COMMUNICATIONS TECHNOLOGIES
+0x0090EF, INTEGRIX, INC.
+0x0090F0, Harmonic Video Systems Ltd.
+0x0090F1, DOT HILL SYSTEMS CORPORATION
+0x0090F2, CISCO SYSTEMS, INC.
+0x0090F3, ASPECT COMMUNICATIONS
+0x0090F4, LIGHTNING INSTRUMENTATION
+0x0090F5, CLEVO CO.
+0x0090F6, ESCALATE NETWORKS, INC.
+0x0090F7, NBASE COMMUNICATIONS LTD.
+0x0090F8, MEDIATRIX TELECOM
+0x0090F9, LEITCH
+0x0090FA, EMULEX Corp
+0x0090FB, PORTWELL, INC.
+0x0090FC, NETWORK COMPUTING DEVICES
+0x0090FD, CopperCom, Inc.
+0x0090FE, ELECOM CO., LTD. (LANEED DIV.)
+0x0090FF, TELLUS TECHNOLOGY INC.
+0x0091D6, Crystal Group, Inc.
+0x0091FA, Synapse Product Development
+0x009363, Uni-Link Technology Co., Ltd.
+0x009569, LSD Science and Technology Co.,Ltd.
+0x0097FF, Heimann Sensor GmbH
+0x009C02, Hewlett-Packard Company
+0x009D8E, CARDIAC RECORDERS, INC.
+0x00A000, CENTILLION NETWORKS, INC.
+0x00A001, DRS Signal Solutions
+0x00A002, LEEDS & NORTHRUP AUSTRALIA PTY LTD
+0x00A003, Siemens Switzerland Ltd., I B T HVP
+0x00A004, NETPOWER, INC.
+0x00A005, DANIEL INSTRUMENTS, LTD.
+0x00A006, IMAGE DATA PROCESSING SYSTEM GROUP
+0x00A007, APEXX TECHNOLOGY, INC.
+0x00A008, NETCORP
+0x00A009, WHITETREE NETWORK
+0x00A00A, Airspan
+0x00A00B, COMPUTEX CO., LTD.
+0x00A00C, KINGMAX TECHNOLOGY, INC.
+0x00A00D, THE PANDA PROJECT
+0x00A00E, VISUAL NETWORKS, INC.
+0x00A00F, Broadband Technologies
+0x00A010, SYSLOGIC DATENTECHNIK AG
+0x00A011, MUTOH INDUSTRIES LTD.
+0x00A012, Telco Systems, Inc.
+0x00A013, TELTREND LTD.
+0x00A014, CSIR
+0x00A015, WYLE
+0x00A016, MICROPOLIS CORP.
+0x00A017, J B M CORPORATION
+0x00A018, CREATIVE CONTROLLERS, INC.
+0x00A019, NEBULA CONSULTANTS, INC.
+0x00A01A, BINAR ELEKTRONIK AB
+0x00A01B, PREMISYS COMMUNICATIONS, INC.
+0x00A01C, NASCENT NETWORKS CORPORATION
+0x00A01D, SIXNET
+0x00A01E, EST CORPORATION
+0x00A01F, TRICORD SYSTEMS, INC.
+0x00A020, CITICORP/TTI
+0x00A021, General Dynamics
+0x00A022, CENTRE FOR DEVELOPMENT OF ADVANCED COMPUTING
+0x00A023, APPLIED CREATIVE TECHNOLOGY, INC.
+0x00A024, 3COM CORPORATION
+0x00A025, REDCOM LABS INC.
+0x00A026, TELDAT, S.A.
+0x00A027, FIREPOWER SYSTEMS, INC.
+0x00A028, CONNER PERIPHERALS
+0x00A029, COULTER CORPORATION
+0x00A02A, TRANCELL SYSTEMS
+0x00A02B, TRANSITIONS RESEARCH CORP.
+0x00A02C, interWAVE Communications
+0x00A02D, 1394 Trade Association
+0x00A02E, BRAND COMMUNICATIONS, LTD.
+0x00A02F, PIRELLI CAVI
+0x00A030, CAPTOR NV/SA
+0x00A031, HAZELTINE CORPORATION, MS 1-17
+0x00A032, GES SINGAPORE PTE. LTD.
+0x00A033, imc MeBsysteme GmbH
+0x00A034, AXEL
+0x00A035, CYLINK CORPORATION
+0x00A036, APPLIED NETWORK TECHNOLOGY
+0x00A037, Mindray DS USA, Inc.
+0x00A038, EMAIL ELECTRONICS
+0x00A039, ROSS TECHNOLOGY, INC.
+0x00A03A, KUBOTEK CORPORATION
+0x00A03B, TOSHIN ELECTRIC CO., LTD.
+0x00A03C, EG&G NUCLEAR INSTRUMENTS
+0x00A03D, OPTO-22
+0x00A03E, ATM FORUM
+0x00A03F, COMPUTER SOCIETY MICROPROCESSOR & MICROPROCESSOR STANDARDS C
+0x00A040, APPLE COMPUTER
+0x00A041, INFICON
+0x00A042, SPUR PRODUCTS CORP.
+0x00A043, AMERICAN TECHNOLOGY LABS, INC.
+0x00A044, NTT IT CO., LTD.
+0x00A045, PHOENIX CONTACT GMBH & CO.
+0x00A046, SCITEX CORP. LTD.
+0x00A047, INTEGRATED FITNESS CORP.
+0x00A048, QUESTECH, LTD.
+0x00A049, DIGITECH INDUSTRIES, INC.
+0x00A04A, NISSHIN ELECTRIC CO., LTD.
+0x00A04B, TFL LAN INC.
+0x00A04C, INNOVATIVE SYSTEMS & TECHNOLOGIES, INC.
+0x00A04D, EDA INSTRUMENTS, INC.
+0x00A04E, VOELKER TECHNOLOGIES, INC.
+0x00A04F, AMERITEC CORP.
+0x00A050, CYPRESS SEMICONDUCTOR
+0x00A051, ANGIA COMMUNICATIONS. INC.
+0x00A052, STANILITE ELECTRONICS PTY. LTD
+0x00A053, COMPACT DEVICES, INC.
+0x00A054, PRIVATE
+0x00A055, Data Device Corporation
+0x00A056, MICROPROSS
+0x00A057, LANCOM Systems GmbH
+0x00A058, GLORY, LTD.
+0x00A059, HAMILTON HALLMARK
+0x00A05A, KOFAX IMAGE PRODUCTS
+0x00A05B, MARQUIP, INC.
+0x00A05C, INVENTORY CONVERSION, INC./
+0x00A05D, CS COMPUTER SYSTEME GmbH
+0x00A05E, MYRIAD LOGIC INC.
+0x00A05F, BTG Electronics Design BV
+0x00A060, ACER PERIPHERALS, INC.
+0x00A061, PURITAN BENNETT
+0x00A062, AES PRODATA
+0x00A063, JRL SYSTEMS, INC.
+0x00A064, KVB/ANALECT
+0x00A065, Symantec Corporation
+0x00A066, ISA CO., LTD.
+0x00A067, NETWORK SERVICES GROUP
+0x00A068, BHP LIMITED
+0x00A069, Symmetricom, Inc.
+0x00A06A, Verilink Corporation
+0x00A06B, DMS DORSCH MIKROSYSTEM GMBH
+0x00A06C, SHINDENGEN ELECTRIC MFG. CO., LTD.
+0x00A06D, MANNESMANN TALLY CORPORATION
+0x00A06E, AUSTRON, INC.
+0x00A06F, THE APPCON GROUP, INC.
+0x00A070, COASTCOM
+0x00A071, VIDEO LOTTERY TECHNOLOGIES,INC
+0x00A072, OVATION SYSTEMS LTD.
+0x00A073, COM21, INC.
+0x00A074, PERCEPTION TECHNOLOGY
+0x00A075, MICRON TECHNOLOGY, INC.
+0x00A076, CARDWARE LAB, INC.
+0x00A077, FUJITSU NEXION, INC.
+0x00A078, Marconi Communications
+0x00A079, ALPS ELECTRIC (USA), INC.
+0x00A07A, ADVANCED PERIPHERALS TECHNOLOGIES, INC.
+0x00A07B, DAWN COMPUTER INCORPORATION
+0x00A07C, TONYANG NYLON CO., LTD.
+0x00A07D, SEEQ TECHNOLOGY, INC.
+0x00A07E, AVID TECHNOLOGY, INC.
+0x00A07F, GSM-SYNTEL, LTD.
+0x00A080, Tattile SRL
+0x00A081, ALCATEL DATA NETWORKS
+0x00A082, NKT ELEKTRONIK A/S
+0x00A083, ASIMMPHONY TURKEY
+0x00A084, Dataplex Pty Ltd
+0x00A085, PRIVATE
+0x00A086, AMBER WAVE SYSTEMS, INC.
+0x00A087, Zarlink Semiconductor Ltd.
+0x00A088, ESSENTIAL COMMUNICATIONS
+0x00A089, XPOINT TECHNOLOGIES, INC.
+0x00A08A, BROOKTROUT TECHNOLOGY, INC.
+0x00A08B, ASTON ELECTRONIC DESIGNS LTD.
+0x00A08C, MultiMedia LANs, Inc.
+0x00A08D, JACOMO CORPORATION
+0x00A08E, Check Point Software Technologies
+0x00A08F, DESKNET SYSTEMS, INC.
+0x00A090, TimeStep Corporation
+0x00A091, APPLICOM INTERNATIONAL
+0x00A092, H. BOLLMANN MANUFACTURERS, LTD
+0x00A093, B/E AEROSPACE, Inc.
+0x00A094, COMSAT CORPORATION
+0x00A095, ACACIA NETWORKS, INC.
+0x00A096, MITSUMI ELECTRIC CO., LTD.
+0x00A097, JC INFORMATION SYSTEMS
+0x00A098, NetApp
+0x00A099, K-NET LTD.
+0x00A09A, NIHON KOHDEN AMERICA
+0x00A09B, QPSX COMMUNICATIONS, LTD.
+0x00A09C, Xyplex, Inc.
+0x00A09D, JOHNATHON FREEMAN TECHNOLOGIES
+0x00A09E, ICTV
+0x00A09F, COMMVISION CORP.
+0x00A0A0, COMPACT DATA, LTD.
+0x00A0A1, EPIC DATA INC.
+0x00A0A2, DIGICOM S.P.A.
+0x00A0A3, RELIABLE POWER METERS
+0x00A0A4, MICROS SYSTEMS, INC.
+0x00A0A5, TEKNOR MICROSYSTEME, INC.
+0x00A0A6, M.I. SYSTEMS, K.K.
+0x00A0A7, VORAX CORPORATION
+0x00A0A8, RENEX CORPORATION
+0x00A0A9, NAVTEL COMMUNICATIONS INC.
+0x00A0AA, SPACELABS MEDICAL
+0x00A0AB, NETCS INFORMATIONSTECHNIK GMBH
+0x00A0AC, GILAT SATELLITE NETWORKS, LTD.
+0x00A0AD, MARCONI SPA
+0x00A0AE, NUCOM SYSTEMS, INC.
+0x00A0AF, WMS INDUSTRIES
+0x00A0B0, I-O DATA DEVICE, INC.
+0x00A0B1, FIRST VIRTUAL CORPORATION
+0x00A0B2, SHIMA SEIKI
+0x00A0B3, ZYKRONIX
+0x00A0B4, TEXAS MICROSYSTEMS, INC.
+0x00A0B5, 3H TECHNOLOGY
+0x00A0B6, SANRITZ AUTOMATION CO., LTD.
+0x00A0B7, CORDANT, INC.
+0x00A0B8, SYMBIOS LOGIC INC.
+0x00A0B9, EAGLE TECHNOLOGY, INC.
+0x00A0BA, PATTON ELECTRONICS CO.
+0x00A0BB, HILAN GMBH
+0x00A0BC, VIASAT, INCORPORATED
+0x00A0BD, I-TECH CORP.
+0x00A0BE, INTEGRATED CIRCUIT SYSTEMS, INC. COMMUNICATIONS GROUP
+0x00A0BF, WIRELESS DATA GROUP MOTOROLA
+0x00A0C0, DIGITAL LINK CORP.
+0x00A0C1, ORTIVUS MEDICAL AB
+0x00A0C2, R.A. SYSTEMS CO., LTD.
+0x00A0C3, UNICOMPUTER GMBH
+0x00A0C4, CRISTIE ELECTRONICS LTD.
+0x00A0C5, ZYXEL COMMUNICATION
+0x00A0C6, QUALCOMM INCORPORATED
+0x00A0C7, TADIRAN TELECOMMUNICATIONS
+0x00A0C8, ADTRAN INC.
+0x00A0C9, INTEL CORPORATION - HF1-06
+0x00A0CA, FUJITSU DENSO LTD.
+0x00A0CB, ARK TELECOMMUNICATIONS, INC.
+0x00A0CC, LITE-ON COMMUNICATIONS, INC.
+0x00A0CD, DR. JOHANNES HEIDENHAIN GmbH
+0x00A0CE, Ecessa
+0x00A0CF, SOTAS, INC.
+0x00A0D0, TEN X TECHNOLOGY, INC.
+0x00A0D1, INVENTEC CORPORATION
+0x00A0D2, ALLIED TELESIS INTERNATIONAL CORPORATION
+0x00A0D3, INSTEM COMPUTER SYSTEMS, LTD.
+0x00A0D4, RADIOLAN, INC.
+0x00A0D5, SIERRA WIRELESS INC.
+0x00A0D6, SBE, INC.
+0x00A0D7, KASTEN CHASE APPLIED RESEARCH
+0x00A0D8, SPECTRA - TEK
+0x00A0D9, CONVEX COMPUTER CORPORATION
+0x00A0DA, INTEGRATED SYSTEMS Technology, Inc.
+0x00A0DB, FISHER & PAYKEL PRODUCTION
+0x00A0DC, O.N. ELECTRONIC CO., LTD.
+0x00A0DD, AZONIX CORPORATION
+0x00A0DE, YAMAHA CORPORATION
+0x00A0DF, STS TECHNOLOGIES, INC.
+0x00A0E0, TENNYSON TECHNOLOGIES PTY LTD
+0x00A0E1, WESTPORT RESEARCH ASSOCIATES, INC.
+0x00A0E2, Keisokugiken Corporation
+0x00A0E3, XKL SYSTEMS CORP.
+0x00A0E4, OPTIQUEST
+0x00A0E5, NHC COMMUNICATIONS
+0x00A0E6, DIALOGIC CORPORATION
+0x00A0E7, CENTRAL DATA CORPORATION
+0x00A0E8, REUTERS HOLDINGS PLC
+0x00A0E9, ELECTRONIC RETAILING SYSTEMS INTERNATIONAL
+0x00A0EA, ETHERCOM CORP.
+0x00A0EB, Encore Networks, Inc.
+0x00A0EC, TRANSMITTON LTD.
+0x00A0ED, Brooks Automation, Inc.
+0x00A0EE, NASHOBA NETWORKS
+0x00A0EF, LUCIDATA LTD.
+0x00A0F0, TORONTO MICROELECTRONICS INC.
+0x00A0F1, MTI
+0x00A0F2, INFOTEK COMMUNICATIONS, INC.
+0x00A0F3, STAUBLI
+0x00A0F4, GE
+0x00A0F5, RADGUARD LTD.
+0x00A0F6, AutoGas Systems Inc.
+0x00A0F7, V.I COMPUTER CORP.
+0x00A0F8, SYMBOL TECHNOLOGIES, INC.
+0x00A0F9, BINTEC COMMUNICATIONS GMBH
+0x00A0FA, Marconi Communication GmbH
+0x00A0FB, TORAY ENGINEERING CO., LTD.
+0x00A0FC, IMAGE SCIENCES, INC.
+0x00A0FD, SCITEX DIGITAL PRINTING, INC.
+0x00A0FE, BOSTON TECHNOLOGY, INC.
+0x00A0FF, TELLABS OPERATIONS, INC.
+0x00A1DE, ShenZhen ShiHua Technology CO.,LTD
+0x00A2DA, INAT GmbH
+0x00AA00, INTEL CORPORATION
+0x00AA01, INTEL CORPORATION
+0x00AA02, INTEL CORPORATION
+0x00AA3C, OLIVETTI TELECOM SPA (OLTECO)
+0x00AA70, LG Electronics
+0x00B009, Grass Valley Group
+0x00B017, InfoGear Technology Corp.
+0x00B019, UTC CCS
+0x00B01C, Westport Technologies
+0x00B01E, Rantic Labs, Inc.
+0x00B02A, ORSYS GmbH
+0x00B02D, ViaGate Technologies, Inc.
+0x00B033, OAO "Izhevskiy radiozavod"
+0x00B03B, HiQ Networks
+0x00B048, Marconi Communications Inc.
+0x00B04A, CISCO SYSTEMS, INC.
+0x00B052, Atheros Communications
+0x00B064, CISCO SYSTEMS, INC.
+0x00B069, Honewell Oy
+0x00B06D, Jones Futurex Inc.
+0x00B080, Mannesmann Ipulsys B.V.
+0x00B086, LocSoft Limited
+0x00B08E, CISCO SYSTEMS, INC.
+0x00B091, Transmeta Corp.
+0x00B094, Alaris, Inc.
+0x00B09A, Morrow Technologies Corp.
+0x00B09D, Point Grey Research Inc.
+0x00B0AC, SIAE-Microelettronica S.p.A.
+0x00B0AE, Symmetricom
+0x00B0B3, Xstreamis PLC
+0x00B0C2, CISCO SYSTEMS, INC.
+0x00B0C7, Tellabs Operations, Inc.
+0x00B0CE, TECHNOLOGY RESCUE
+0x00B0D0, Dell Computer Corp.
+0x00B0DB, Nextcell, Inc.
+0x00B0DF, Starboard Storage Systems
+0x00B0E7, British Federal Ltd.
+0x00B0EC, EACEM
+0x00B0EE, Ajile Systems, Inc.
+0x00B0F0, CALY NETWORKS
+0x00B0F5, NetWorth Technologies, Inc.
+0x00B338, Kontron Design Manufacturing Services (M) Sdn. Bhd
+0x00B342, MacroSAN Technologies Co., Ltd.
+0x00B56D, David Electronics Co., LTD.
+0x00B5D6, Omnibit Inc.
+0x00B9F6, Shenzhen Super Rich Electronics Co.,Ltd
+0x00BAC0, Biometric Access Company
+0x00BB01, OCTOTHORPE CORP.
+0x00BB3A, PRIVATE
+0x00BB8E, HME Co., Ltd.
+0x00BBF0, UNGERMANN-BASS INC.
+0x00BD27, Exar Corp.
+0x00BD3A, Nokia Corporation
+0x00BF15, Genetec Inc.
+0x00C000, LANOPTICS, LTD.
+0x00C001, DIATEK PATIENT MANAGMENT
+0x00C002, SERCOMM CORPORATION
+0x00C003, GLOBALNET COMMUNICATIONS
+0x00C004, JAPAN BUSINESS COMPUTER CO.LTD
+0x00C005, LIVINGSTON ENTERPRISES, INC.
+0x00C006, NIPPON AVIONICS CO., LTD.
+0x00C007, PINNACLE DATA SYSTEMS, INC.
+0x00C008, SECO SRL
+0x00C009, KT TECHNOLOGY (S) PTE LTD
+0x00C00A, MICRO CRAFT
+0x00C00B, NORCONTROL A.S.
+0x00C00C, RELIA TECHNOLGIES
+0x00C00D, ADVANCED LOGIC RESEARCH, INC.
+0x00C00E, PSITECH, INC.
+0x00C00F, QUANTUM SOFTWARE SYSTEMS LTD.
+0x00C010, HIRAKAWA HEWTECH CORP.
+0x00C011, INTERACTIVE COMPUTING DEVICES
+0x00C012, NETSPAN CORPORATION
+0x00C013, NETRIX
+0x00C014, TELEMATICS CALABASAS INT'L,INC
+0x00C015, NEW MEDIA CORPORATION
+0x00C016, ELECTRONIC THEATRE CONTROLS
+0x00C017, Fluke Corporation
+0x00C018, LANART CORPORATION
+0x00C019, LEAP TECHNOLOGY, INC.
+0x00C01A, COROMETRICS MEDICAL SYSTEMS
+0x00C01B, SOCKET COMMUNICATIONS, INC.
+0x00C01C, INTERLINK COMMUNICATIONS LTD.
+0x00C01D, GRAND JUNCTION NETWORKS, INC.
+0x00C01E, LA FRANCAISE DES JEUX
+0x00C01F, S.E.R.C.E.L.
+0x00C020, ARCO ELECTRONIC, CONTROL LTD.
+0x00C021, NETEXPRESS
+0x00C022, LASERMASTER TECHNOLOGIES, INC.
+0x00C023, TUTANKHAMON ELECTRONICS
+0x00C024, EDEN SISTEMAS DE COMPUTACAO SA
+0x00C025, DATAPRODUCTS CORPORATION
+0x00C026, LANS TECHNOLOGY CO., LTD.
+0x00C027, CIPHER SYSTEMS, INC.
+0x00C028, JASCO CORPORATION
+0x00C029, Nexans Deutschland GmbH - ANS
+0x00C02A, OHKURA ELECTRIC CO., LTD.
+0x00C02B, GERLOFF GESELLSCHAFT FUR
+0x00C02C, CENTRUM COMMUNICATIONS, INC.
+0x00C02D, FUJI PHOTO FILM CO., LTD.
+0x00C02E, NETWIZ
+0x00C02F, OKUMA CORPORATION
+0x00C030, INTEGRATED ENGINEERING B. V.
+0x00C031, DESIGN RESEARCH SYSTEMS, INC.
+0x00C032, I-CUBED LIMITED
+0x00C033, TELEBIT COMMUNICATIONS APS
+0x00C034, TRANSACTION NETWORK
+0x00C035, QUINTAR COMPANY
+0x00C036, RAYTECH ELECTRONIC CORP.
+0x00C037, DYNATEM
+0x00C038, RASTER IMAGE PROCESSING SYSTEM
+0x00C039, Teridian Semiconductor Corporation
+0x00C03A, MEN-MIKRO ELEKTRONIK GMBH
+0x00C03B, MULTIACCESS COMPUTING CORP.
+0x00C03C, TOWER TECH S.R.L.
+0x00C03D, WIESEMANN & THEIS GMBH
+0x00C03E, FA. GEBR. HELLER GMBH
+0x00C03F, STORES AUTOMATED SYSTEMS, INC.
+0x00C040, ECCI
+0x00C041, DIGITAL TRANSMISSION SYSTEMS
+0x00C042, DATALUX CORP.
+0x00C043, STRATACOM
+0x00C044, EMCOM CORPORATION
+0x00C045, ISOLATION SYSTEMS, LTD.
+0x00C046, Blue Chip Technology Ltd
+0x00C047, UNIMICRO SYSTEMS, INC.
+0x00C048, BAY TECHNICAL ASSOCIATES
+0x00C049, U.S. ROBOTICS, INC.
+0x00C04A, GROUP 2000 AG
+0x00C04B, CREATIVE MICROSYSTEMS
+0x00C04C, DEPARTMENT OF FOREIGN AFFAIRS
+0x00C04D, MITEC, INC.
+0x00C04E, COMTROL CORPORATION
+0x00C04F, DELL COMPUTER CORPORATION
+0x00C050, TOYO DENKI SEIZO K.K.
+0x00C051, ADVANCED INTEGRATION RESEARCH
+0x00C052, BURR-BROWN
+0x00C053, Aspect Software Inc.
+0x00C054, NETWORK PERIPHERALS, LTD.
+0x00C055, MODULAR COMPUTING TECHNOLOGIES
+0x00C056, SOMELEC
+0x00C057, MYCO ELECTRONICS
+0x00C058, DATAEXPERT CORP.
+0x00C059, DENSO CORPORATION
+0x00C05A, SEMAPHORE COMMUNICATIONS CORP.
+0x00C05B, NETWORKS NORTHWEST, INC.
+0x00C05C, ELONEX PLC
+0x00C05D, L&N TECHNOLOGIES
+0x00C05E, VARI-LITE, INC.
+0x00C05F, FINE-PAL COMPANY LIMITED
+0x00C060, ID SCANDINAVIA AS
+0x00C061, SOLECTEK CORPORATION
+0x00C062, IMPULSE TECHNOLOGY
+0x00C063, MORNING STAR TECHNOLOGIES, INC
+0x00C064, GENERAL DATACOMM IND. INC.
+0x00C065, SCOPE COMMUNICATIONS, INC.
+0x00C066, DOCUPOINT, INC.
+0x00C067, UNITED BARCODE INDUSTRIES
+0x00C068, HME Clear-Com LTD.
+0x00C069, Axxcelera Broadband Wireless
+0x00C06A, ZAHNER-ELEKTRIK GMBH & CO. KG
+0x00C06B, OSI PLUS CORPORATION
+0x00C06C, SVEC COMPUTER CORP.
+0x00C06D, BOCA RESEARCH, INC.
+0x00C06E, HAFT TECHNOLOGY, INC.
+0x00C06F, KOMATSU LTD.
+0x00C070, SECTRA SECURE-TRANSMISSION AB
+0x00C071, AREANEX COMMUNICATIONS, INC.
+0x00C072, KNX LTD.
+0x00C073, XEDIA CORPORATION
+0x00C074, TOYODA AUTOMATIC LOOM
+0x00C075, XANTE CORPORATION
+0x00C076, I-DATA INTERNATIONAL A-S
+0x00C077, DAEWOO TELECOM LTD.
+0x00C078, COMPUTER SYSTEMS ENGINEERING
+0x00C079, FONSYS CO.,LTD.
+0x00C07A, PRIVA B.V.
+0x00C07B, ASCEND COMMUNICATIONS, INC.
+0x00C07C, HIGHTECH INFORMATION
+0x00C07D, RISC DEVELOPMENTS LTD.
+0x00C07E, KUBOTA CORPORATION ELECTRONIC
+0x00C07F, NUPON COMPUTING CORP.
+0x00C080, NETSTAR, INC.
+0x00C081, METRODATA LTD.
+0x00C082, MOORE PRODUCTS CO.
+0x00C083, TRACE MOUNTAIN PRODUCTS, INC.
+0x00C084, DATA LINK CORP. LTD.
+0x00C085, ELECTRONICS FOR IMAGING, INC.
+0x00C086, THE LYNK CORPORATION
+0x00C087, UUNET TECHNOLOGIES, INC.
+0x00C088, EKF ELEKTRONIK GMBH
+0x00C089, TELINDUS DISTRIBUTION
+0x00C08A, Lauterbach GmbH
+0x00C08B, RISQ MODULAR SYSTEMS, INC.
+0x00C08C, PERFORMANCE TECHNOLOGIES, INC.
+0x00C08D, TRONIX PRODUCT DEVELOPMENT
+0x00C08E, NETWORK INFORMATION TECHNOLOGY
+0x00C08F, Panasonic Electric Works Co., Ltd.
+0x00C090, PRAIM S.R.L.
+0x00C091, JABIL CIRCUIT, INC.
+0x00C092, MENNEN MEDICAL INC.
+0x00C093, ALTA RESEARCH CORP.
+0x00C094, VMX INC.
+0x00C095, ZNYX
+0x00C096, TAMURA CORPORATION
+0x00C097, ARCHIPEL SA
+0x00C098, CHUNTEX ELECTRONIC CO., LTD.
+0x00C099, YOSHIKI INDUSTRIAL CO.,LTD.
+0x00C09A, PHOTONICS CORPORATION
+0x00C09B, RELIANCE COMM/TEC, R-TEC
+0x00C09C, HIOKI E.E. CORPORATION
+0x00C09D, DISTRIBUTED SYSTEMS INT'L, INC
+0x00C09E, CACHE COMPUTERS, INC.
+0x00C09F, QUANTA COMPUTER, INC.
+0x00C0A0, ADVANCE MICRO RESEARCH, INC.
+0x00C0A1, TOKYO DENSHI SEKEI CO.
+0x00C0A2, INTERMEDIUM A/S
+0x00C0A3, DUAL ENTERPRISES CORPORATION
+0x00C0A4, UNIGRAF OY
+0x00C0A5, DICKENS DATA SYSTEMS
+0x00C0A6, EXICOM AUSTRALIA PTY. LTD
+0x00C0A7, SEEL LTD.
+0x00C0A8, GVC CORPORATION
+0x00C0A9, BARRON MCCANN LTD.
+0x00C0AA, SILICON VALLEY COMPUTER
+0x00C0AB, Telco Systems, Inc.
+0x00C0AC, GAMBIT COMPUTER COMMUNICATIONS
+0x00C0AD, MARBEN COMMUNICATION SYSTEMS
+0x00C0AE, TOWERCOM CO. INC. DBA PC HOUSE
+0x00C0AF, TEKLOGIX INC.
+0x00C0B0, GCC TECHNOLOGIES,INC.
+0x00C0B1, GENIUS NET CO.
+0x00C0B2, NORAND CORPORATION
+0x00C0B3, COMSTAT DATACOMM CORPORATION
+0x00C0B4, MYSON TECHNOLOGY, INC.
+0x00C0B5, CORPORATE NETWORK SYSTEMS,INC.
+0x00C0B6, Overland Storage, Inc.
+0x00C0B7, AMERICAN POWER CONVERSION CORP
+0x00C0B8, FRASER'S HILL LTD.
+0x00C0B9, FUNK SOFTWARE, INC.
+0x00C0BA, NETVANTAGE
+0x00C0BB, FORVAL CREATIVE, INC.
+0x00C0BC, TELECOM AUSTRALIA/CSSC
+0x00C0BD, INEX TECHNOLOGIES, INC.
+0x00C0BE, ALCATEL - SEL
+0x00C0BF, TECHNOLOGY CONCEPTS, LTD.
+0x00C0C0, SHORE MICROSYSTEMS, INC.
+0x00C0C1, QUAD/GRAPHICS, INC.
+0x00C0C2, INFINITE NETWORKS LTD.
+0x00C0C3, ACUSON COMPUTED SONOGRAPHY
+0x00C0C4, COMPUTER OPERATIONAL
+0x00C0C5, SID INFORMATICA
+0x00C0C6, PERSONAL MEDIA CORP.
+0x00C0C7, SPARKTRUM MICROSYSTEMS, INC.
+0x00C0C8, MICRO BYTE PTY. LTD.
+0x00C0C9, ELSAG BAILEY PROCESS
+0x00C0CA, ALFA, INC.
+0x00C0CB, CONTROL TECHNOLOGY CORPORATION
+0x00C0CC, TELESCIENCES CO SYSTEMS, INC.
+0x00C0CD, COMELTA, S.A.
+0x00C0CE, CEI SYSTEMS & ENGINEERING PTE
+0x00C0CF, IMATRAN VOIMA OY
+0x00C0D0, RATOC SYSTEM INC.
+0x00C0D1, COMTREE TECHNOLOGY CORPORATION
+0x00C0D2, SYNTELLECT, INC.
+0x00C0D3, OLYMPUS IMAGE SYSTEMS, INC.
+0x00C0D4, AXON NETWORKS, INC.
+0x00C0D5, Werbeagentur Jürgen Siebert
+0x00C0D6, J1 SYSTEMS, INC.
+0x00C0D7, TAIWAN TRADING CENTER DBA
+0x00C0D8, UNIVERSAL DATA SYSTEMS
+0x00C0D9, QUINTE NETWORK CONFIDENTIALITY
+0x00C0DA, NICE SYSTEMS LTD.
+0x00C0DB, IPC CORPORATION (PTE) LTD.
+0x00C0DC, EOS TECHNOLOGIES, INC.
+0x00C0DD, QLogic Corporation
+0x00C0DE, ZCOMM, INC.
+0x00C0DF, KYE Systems Corp.
+0x00C0E0, DSC COMMUNICATION CORP.
+0x00C0E1, SONIC SOLUTIONS
+0x00C0E2, CALCOMP, INC.
+0x00C0E3, OSITECH COMMUNICATIONS, INC.
+0x00C0E4, SIEMENS BUILDING
+0x00C0E5, GESPAC, S.A.
+0x00C0E6, Verilink Corporation
+0x00C0E7, FIBERDATA AB
+0x00C0E8, PLEXCOM, INC.
+0x00C0E9, OAK SOLUTIONS, LTD.
+0x00C0EA, ARRAY TECHNOLOGY LTD.
+0x00C0EB, SEH COMPUTERTECHNIK GMBH
+0x00C0EC, DAUPHIN TECHNOLOGY
+0x00C0ED, US ARMY ELECTRONIC
+0x00C0EE, KYOCERA CORPORATION
+0x00C0EF, ABIT CORPORATION
+0x00C0F0, KINGSTON TECHNOLOGY CORP.
+0x00C0F1, SHINKO ELECTRIC CO., LTD.
+0x00C0F2, TRANSITION NETWORKS
+0x00C0F3, NETWORK COMMUNICATIONS CORP.
+0x00C0F4, INTERLINK SYSTEM CO., LTD.
+0x00C0F5, METACOMP, INC.
+0x00C0F6, CELAN TECHNOLOGY INC.
+0x00C0F7, ENGAGE COMMUNICATION, INC.
+0x00C0F8, ABOUT COMPUTING INC.
+0x00C0F9, Emerson Network Power
+0x00C0FA, CANARY COMMUNICATIONS, INC.
+0x00C0FB, ADVANCED TECHNOLOGY LABS
+0x00C0FC, ELASTIC REALITY, INC.
+0x00C0FD, PROSUM
+0x00C0FE, APTEC COMPUTER SYSTEMS, INC.
+0x00C0FF, DOT HILL SYSTEMS CORPORATION
+0x00C14F, DDL Co,.ltd.
+0x00C2C6, Intel Corporate
+0x00C610, Apple, Inc.
+0x00CBBD, Cambridge Broadband Networks Ltd.
+0x00CD90, MAS Elektronik AG
+0x00CF1C, COMMUNICATION MACHINERY CORP.
+0x00D000, FERRAN SCIENTIFIC, INC.
+0x00D001, VST TECHNOLOGIES, INC.
+0x00D002, DITECH CORPORATION
+0x00D003, COMDA ENTERPRISES CORP.
+0x00D004, PENTACOM LTD.
+0x00D005, ZHS ZEITMANAGEMENTSYSTEME
+0x00D006, CISCO SYSTEMS, INC.
+0x00D007, MIC ASSOCIATES, INC.
+0x00D008, MACTELL CORPORATION
+0x00D009, HSING TECH. ENTERPRISE CO. LTD
+0x00D00A, LANACCESS TELECOM S.A.
+0x00D00B, RHK TECHNOLOGY, INC.
+0x00D00C, SNIJDER MICRO SYSTEMS
+0x00D00D, MICROMERITICS INSTRUMENT
+0x00D00E, PLURIS, INC.
+0x00D00F, SPEECH DESIGN GMBH
+0x00D010, CONVERGENT NETWORKS, INC.
+0x00D011, PRISM VIDEO, INC.
+0x00D012, GATEWORKS CORP.
+0x00D013, PRIMEX AEROSPACE COMPANY
+0x00D014, ROOT, INC.
+0x00D015, UNIVEX MICROTECHNOLOGY CORP.
+0x00D016, SCM MICROSYSTEMS, INC.
+0x00D017, SYNTECH INFORMATION CO., LTD.
+0x00D018, QWES. COM, INC.
+0x00D019, DAINIPPON SCREEN CORPORATE
+0x00D01A, URMET TLC S.P.A.
+0x00D01B, MIMAKI ENGINEERING CO., LTD.
+0x00D01C, SBS TECHNOLOGIES,
+0x00D01D, FURUNO ELECTRIC CO., LTD.
+0x00D01E, PINGTEL CORP.
+0x00D01F, CTAM PTY. LTD.
+0x00D020, AIM SYSTEM, INC.
+0x00D021, REGENT ELECTRONICS CORP.
+0x00D022, INCREDIBLE TECHNOLOGIES, INC.
+0x00D023, INFORTREND TECHNOLOGY, INC.
+0x00D024, Cognex Corporation
+0x00D025, XROSSTECH, INC.
+0x00D026, HIRSCHMANN AUSTRIA GMBH
+0x00D027, APPLIED AUTOMATION, INC.
+0x00D028, Harmonic, Inc
+0x00D029, WAKEFERN FOOD CORPORATION
+0x00D02A, Voxent Systems Ltd.
+0x00D02B, JETCELL, INC.
+0x00D02C, CAMPBELL SCIENTIFIC, INC.
+0x00D02D, ADEMCO
+0x00D02E, COMMUNICATION AUTOMATION CORP.
+0x00D02F, VLSI TECHNOLOGY INC.
+0x00D030, Safetran Systems Corp
+0x00D031, INDUSTRIAL LOGIC CORPORATION
+0x00D032, YANO ELECTRIC CO., LTD.
+0x00D033, DALIAN DAXIAN NETWORK
+0x00D034, ORMEC SYSTEMS CORP.
+0x00D035, BEHAVIOR TECH. COMPUTER CORP.
+0x00D036, TECHNOLOGY ATLANTA CORP.
+0x00D037, Pace France
+0x00D038, FIVEMERE, LTD.
+0x00D039, UTILICOM, INC.
+0x00D03A, ZONEWORX, INC.
+0x00D03B, VISION PRODUCTS PTY. LTD.
+0x00D03C, Vieo, Inc.
+0x00D03D, GALILEO TECHNOLOGY, LTD.
+0x00D03E, ROCKETCHIPS, INC.
+0x00D03F, AMERICAN COMMUNICATION
+0x00D040, SYSMATE CO., LTD.
+0x00D041, AMIGO TECHNOLOGY CO., LTD.
+0x00D042, MAHLO GMBH & CO. UG
+0x00D043, ZONAL RETAIL DATA SYSTEMS
+0x00D044, ALIDIAN NETWORKS, INC.
+0x00D045, KVASER AB
+0x00D046, DOLBY LABORATORIES, INC.
+0x00D047, XN TECHNOLOGIES
+0x00D048, ECTON, INC.
+0x00D049, IMPRESSTEK CO., LTD.
+0x00D04A, PRESENCE TECHNOLOGY GMBH
+0x00D04B, LA CIE GROUP S.A.
+0x00D04C, EUROTEL TELECOM LTD.
+0x00D04D, DIV OF RESEARCH & STATISTICS
+0x00D04E, LOGIBAG
+0x00D04F, BITRONICS, INC.
+0x00D050, ISKRATEL
+0x00D051, O2 MICRO, INC.
+0x00D052, ASCEND COMMUNICATIONS, INC.
+0x00D053, CONNECTED SYSTEMS
+0x00D054, SAS INSTITUTE INC.
+0x00D055, KATHREIN-WERKE KG
+0x00D056, SOMAT CORPORATION
+0x00D057, ULTRAK, INC.
+0x00D058, CISCO SYSTEMS, INC.
+0x00D059, AMBIT MICROSYSTEMS CORP.
+0x00D05A, SYMBIONICS, LTD.
+0x00D05B, ACROLOOP MOTION CONTROL
+0x00D05C, TECHNOTREND SYSTEMTECHNIK GMBH
+0x00D05D, INTELLIWORXX, INC.
+0x00D05E, STRATABEAM TECHNOLOGY, INC.
+0x00D05F, VALCOM, INC.
+0x00D060, Panasonic Europe Ltd.
+0x00D061, TREMON ENTERPRISES CO., LTD.
+0x00D062, DIGIGRAM
+0x00D063, CISCO SYSTEMS, INC.
+0x00D064, MULTITEL
+0x00D065, TOKO ELECTRIC
+0x00D066, WINTRISS ENGINEERING CORP.
+0x00D067, CAMPIO COMMUNICATIONS
+0x00D068, IWILL CORPORATION
+0x00D069, TECHNOLOGIC SYSTEMS
+0x00D06A, LINKUP SYSTEMS CORPORATION
+0x00D06B, SR TELECOM INC.
+0x00D06C, SHAREWAVE, INC.
+0x00D06D, ACRISON, INC.
+0x00D06E, TRENDVIEW RECORDERS LTD.
+0x00D06F, KMC CONTROLS
+0x00D070, LONG WELL ELECTRONICS CORP.
+0x00D071, ECHELON CORP.
+0x00D072, BROADLOGIC
+0x00D073, ACN ADVANCED COMMUNICATIONS
+0x00D074, TAQUA SYSTEMS, INC.
+0x00D075, ALARIS MEDICAL SYSTEMS, INC.
+0x00D076, Bank of America
+0x00D077, LUCENT TECHNOLOGIES
+0x00D078, Eltex of Sweden AB
+0x00D079, CISCO SYSTEMS, INC.
+0x00D07A, AMAQUEST COMPUTER CORP.
+0x00D07B, COMCAM INTERNATIONAL INC
+0x00D07C, KOYO ELECTRONICS INC. CO.,LTD.
+0x00D07D, COSINE COMMUNICATIONS
+0x00D07E, KEYCORP LTD.
+0x00D07F, STRATEGY & TECHNOLOGY, LIMITED
+0x00D080, EXABYTE CORPORATION
+0x00D081, RTD Embedded Technologies, Inc.
+0x00D082, IOWAVE INC.
+0x00D083, INVERTEX, INC.
+0x00D084, NEXCOMM SYSTEMS, INC.
+0x00D085, OTIS ELEVATOR COMPANY
+0x00D086, FOVEON, INC.
+0x00D087, MICROFIRST INC.
+0x00D088, Motorola, Inc.
+0x00D089, DYNACOLOR, INC.
+0x00D08A, PHOTRON USA
+0x00D08B, ADVA Optical Networking Ltd.
+0x00D08C, GENOA TECHNOLOGY, INC.
+0x00D08D, PHOENIX GROUP, INC.
+0x00D08E, NVISION INC.
+0x00D08F, ARDENT TECHNOLOGIES, INC.
+0x00D090, CISCO SYSTEMS, INC.
+0x00D091, SMARTSAN SYSTEMS, INC.
+0x00D092, GLENAYRE WESTERN MULTIPLEX
+0x00D093, TQ - COMPONENTS GMBH
+0x00D094, TIMELINE VISTA, INC.
+0x00D095, Alcatel-Lucent, Enterprise Business Group
+0x00D096, 3COM EUROPE LTD.
+0x00D097, CISCO SYSTEMS, INC.
+0x00D098, Photon Dynamics Canada Inc.
+0x00D099, Elcard Wireless Systems Oy
+0x00D09A, FILANET CORPORATION
+0x00D09B, SPECTEL LTD.
+0x00D09C, KAPADIA COMMUNICATIONS
+0x00D09D, VERIS INDUSTRIES
+0x00D09E, 2WIRE, INC.
+0x00D09F, NOVTEK TEST SYSTEMS
+0x00D0A0, MIPS DENMARK
+0x00D0A1, OSKAR VIERLING GMBH + CO. KG
+0x00D0A2, INTEGRATED DEVICE
+0x00D0A3, VOCAL DATA, INC.
+0x00D0A4, ALANTRO COMMUNICATIONS
+0x00D0A5, AMERICAN ARIUM
+0x00D0A6, LANBIRD TECHNOLOGY CO., LTD.
+0x00D0A7, TOKYO SOKKI KENKYUJO CO., LTD.
+0x00D0A8, NETWORK ENGINES, INC.
+0x00D0A9, SHINANO KENSHI CO., LTD.
+0x00D0AA, CHASE COMMUNICATIONS
+0x00D0AB, DELTAKABEL TELECOM CV
+0x00D0AC, GRAYSON WIRELESS
+0x00D0AD, TL INDUSTRIES
+0x00D0AE, ORESIS COMMUNICATIONS, INC.
+0x00D0AF, CUTLER-HAMMER, INC.
+0x00D0B0, BITSWITCH LTD.
+0x00D0B1, OMEGA ELECTRONICS SA
+0x00D0B2, XIOTECH CORPORATION
+0x00D0B3, DRS Technologies Canada Ltd
+0x00D0B4, KATSUJIMA CO., LTD.
+0x00D0B5, IPricot formerly DotCom
+0x00D0B6, CRESCENT NETWORKS, INC.
+0x00D0B7, INTEL CORPORATION
+0x00D0B8, Iomega Corporation
+0x00D0B9, MICROTEK INTERNATIONAL, INC.
+0x00D0BA, CISCO SYSTEMS, INC.
+0x00D0BB, CISCO SYSTEMS, INC.
+0x00D0BC, CISCO SYSTEMS, INC.
+0x00D0BD, Silicon Image GmbH
+0x00D0BE, EMUTEC INC.
+0x00D0BF, PIVOTAL TECHNOLOGIES
+0x00D0C0, CISCO SYSTEMS, INC.
+0x00D0C1, HARMONIC DATA SYSTEMS, LTD.
+0x00D0C2, BALTHAZAR TECHNOLOGY AB
+0x00D0C3, VIVID TECHNOLOGY PTE, LTD.
+0x00D0C4, TERATECH CORPORATION
+0x00D0C5, COMPUTATIONAL SYSTEMS, INC.
+0x00D0C6, THOMAS & BETTS CORP.
+0x00D0C7, PATHWAY, INC.
+0x00D0C8, Prevas A/S
+0x00D0C9, ADVANTECH CO., LTD.
+0x00D0CA, Intrinsyc Software International Inc.
+0x00D0CB, DASAN CO., LTD.
+0x00D0CC, TECHNOLOGIES LYRE INC.
+0x00D0CD, ATAN TECHNOLOGY INC.
+0x00D0CE, ASYST ELECTRONIC
+0x00D0CF, MORETON BAY
+0x00D0D0, ZHONGXING TELECOM LTD.
+0x00D0D1, Sycamore Networks
+0x00D0D2, EPILOG CORPORATION
+0x00D0D3, CISCO SYSTEMS, INC.
+0x00D0D4, V-BITS, INC.
+0x00D0D5, GRUNDIG AG
+0x00D0D6, AETHRA TELECOMUNICAZIONI
+0x00D0D7, B2C2, INC.
+0x00D0D8, 3Com Corporation
+0x00D0D9, DEDICATED MICROCOMPUTERS
+0x00D0DA, TAICOM DATA SYSTEMS CO., LTD.
+0x00D0DB, MCQUAY INTERNATIONAL
+0x00D0DC, MODULAR MINING SYSTEMS, INC.
+0x00D0DD, SUNRISE TELECOM, INC.
+0x00D0DE, PHILIPS MULTIMEDIA NETWORK
+0x00D0DF, KUZUMI ELECTRONICS, INC.
+0x00D0E0, DOOIN ELECTRONICS CO.
+0x00D0E1, AVIONITEK ISRAEL INC.
+0x00D0E2, MRT MICRO, INC.
+0x00D0E3, ELE-CHEM ENGINEERING CO., LTD.
+0x00D0E4, CISCO SYSTEMS, INC.
+0x00D0E5, SOLIDUM SYSTEMS CORP.
+0x00D0E6, IBOND INC.
+0x00D0E7, VCON TELECOMMUNICATION LTD.
+0x00D0E8, MAC SYSTEM CO., LTD.
+0x00D0E9, Advantage Century Telecommunication Corp.
+0x00D0EA, NEXTONE COMMUNICATIONS, INC.
+0x00D0EB, LIGHTERA NETWORKS, INC.
+0x00D0EC, NAKAYO TELECOMMUNICATIONS, INC
+0x00D0ED, XIOX
+0x00D0EE, DICTAPHONE CORPORATION
+0x00D0EF, IGT
+0x00D0F0, CONVISION TECHNOLOGY GMBH
+0x00D0F1, SEGA ENTERPRISES, LTD.
+0x00D0F2, MONTEREY NETWORKS
+0x00D0F3, SOLARI DI UDINE SPA
+0x00D0F4, CARINTHIAN TECH INSTITUTE
+0x00D0F5, ORANGE MICRO, INC.
+0x00D0F6, Alcatel Canada
+0x00D0F7, NEXT NETS CORPORATION
+0x00D0F8, FUJIAN STAR TERMINAL
+0x00D0F9, ACUTE COMMUNICATIONS CORP.
+0x00D0FA, Thales e-Security Ltd.
+0x00D0FB, TEK MICROSYSTEMS, INCORPORATED
+0x00D0FC, GRANITE MICROSYSTEMS
+0x00D0FD, OPTIMA TELE.COM, INC.
+0x00D0FE, ASTRAL POINT
+0x00D0FF, CISCO SYSTEMS, INC.
+0x00D11C, ACETEL
+0x00D38D, Hotel Technology Next Generation
+0x00D632, GE Energy
+0x00DB1E, Albedo Telecom SL
+0x00DB45, THAMWAY CO.,LTD.
+0x00DBDF, Intel Corporate
+0x00DD00, UNGERMANN-BASS INC.
+0x00DD01, UNGERMANN-BASS INC.
+0x00DD02, UNGERMANN-BASS INC.
+0x00DD03, UNGERMANN-BASS INC.
+0x00DD04, UNGERMANN-BASS INC.
+0x00DD05, UNGERMANN-BASS INC.
+0x00DD06, UNGERMANN-BASS INC.
+0x00DD07, UNGERMANN-BASS INC.
+0x00DD08, UNGERMANN-BASS INC.
+0x00DD09, UNGERMANN-BASS INC.
+0x00DD0A, UNGERMANN-BASS INC.
+0x00DD0B, UNGERMANN-BASS INC.
+0x00DD0C, UNGERMANN-BASS INC.
+0x00DD0D, UNGERMANN-BASS INC.
+0x00DD0E, UNGERMANN-BASS INC.
+0x00DD0F, UNGERMANN-BASS INC.
+0x00DEFB, CISCO SYSTEMS, INC.
+0x00E000, Fujitsu Limited
+0x00E001, STRAND LIGHTING LIMITED
+0x00E002, CROSSROADS SYSTEMS, INC.
+0x00E003, NOKIA WIRELESS BUSINESS COMMUN
+0x00E004, PMC-SIERRA, INC.
+0x00E005, TECHNICAL CORP.
+0x00E006, SILICON INTEGRATED SYS. CORP.
+0x00E007, Avaya ECS Ltd
+0x00E008, AMAZING CONTROLS! INC.
+0x00E009, MARATHON TECHNOLOGIES CORP.
+0x00E00A, DIBA, INC.
+0x00E00B, ROOFTOP COMMUNICATIONS CORP.
+0x00E00C, MOTOROLA
+0x00E00D, RADIANT SYSTEMS
+0x00E00E, AVALON IMAGING SYSTEMS, INC.
+0x00E00F, SHANGHAI BAUD DATA
+0x00E010, HESS SB-AUTOMATENBAU GmbH
+0x00E011, Uniden Corporation
+0x00E012, PLUTO TECHNOLOGIES INTERNATIONAL INC.
+0x00E013, EASTERN ELECTRONIC CO., LTD.
+0x00E014, CISCO SYSTEMS, INC.
+0x00E015, HEIWA CORPORATION
+0x00E016, RAPID CITY COMMUNICATIONS
+0x00E017, EXXACT GmbH
+0x00E018, ASUSTEK COMPUTER INC.
+0x00E019, ING. GIORDANO ELETTRONICA
+0x00E01A, COMTEC SYSTEMS. CO., LTD.
+0x00E01B, SPHERE COMMUNICATIONS, INC.
+0x00E01C, Cradlepoint, Inc
+0x00E01D, WebTV NETWORKS, INC.
+0x00E01E, CISCO SYSTEMS, INC.
+0x00E01F, AVIDIA Systems, Inc.
+0x00E020, TECNOMEN OY
+0x00E021, FREEGATE CORP.
+0x00E022, Analog Devices Inc.
+0x00E023, TELRAD
+0x00E024, GADZOOX NETWORKS
+0x00E025, dit Co., Ltd.
+0x00E026, Redlake MASD LLC
+0x00E027, DUX, INC.
+0x00E028, APTIX CORPORATION
+0x00E029, STANDARD MICROSYSTEMS CORP.
+0x00E02A, TANDBERG TELEVISION AS
+0x00E02B, EXTREME NETWORKS
+0x00E02C, AST COMPUTER
+0x00E02D, InnoMediaLogic, Inc.
+0x00E02E, SPC ELECTRONICS CORPORATION
+0x00E02F, MCNS HOLDINGS, L.P.
+0x00E030, MELITA INTERNATIONAL CORP.
+0x00E031, HAGIWARA ELECTRIC CO., LTD.
+0x00E032, MISYS FINANCIAL SYSTEMS, LTD.
+0x00E033, E.E.P.D. GmbH
+0x00E034, CISCO SYSTEMS, INC.
+0x00E035, Emerson Network Power
+0x00E036, PIONEER CORPORATION
+0x00E037, CENTURY CORPORATION
+0x00E038, PROXIMA CORPORATION
+0x00E039, PARADYNE CORP.
+0x00E03A, CABLETRON SYSTEMS, INC.
+0x00E03B, PROMINET CORPORATION
+0x00E03C, AdvanSys
+0x00E03D, FOCON ELECTRONIC SYSTEMS A/S
+0x00E03E, ALFATECH, INC.
+0x00E03F, JATON CORPORATION
+0x00E040, DeskStation Technology, Inc.
+0x00E041, CSPI
+0x00E042, Pacom Systems Ltd.
+0x00E043, VitalCom
+0x00E044, LSICS CORPORATION
+0x00E045, TOUCHWAVE, INC.
+0x00E046, BENTLY NEVADA CORP.
+0x00E047, InFocus Corporation
+0x00E048, SDL COMMUNICATIONS, INC.
+0x00E049, MICROWI ELECTRONIC GmbH
+0x00E04A, ENHANCED MESSAGING SYSTEMS, INC
+0x00E04B, JUMP INDUSTRIELLE COMPUTERTECHNIK GmbH
+0x00E04C, REALTEK SEMICONDUCTOR CORP.
+0x00E04D, INTERNET INITIATIVE JAPAN, INC
+0x00E04E, SANYO DENKI CO., LTD.
+0x00E04F, CISCO SYSTEMS, INC.
+0x00E050, EXECUTONE INFORMATION SYSTEMS, INC.
+0x00E051, TALX CORPORATION
+0x00E052, Brocade Communications Systems, Inc
+0x00E053, CELLPORT LABS, INC.
+0x00E054, KODAI HITEC CO., LTD.
+0x00E055, INGENIERIA ELECTRONICA COMERCIAL INELCOM S.A.
+0x00E056, HOLONTECH CORPORATION
+0x00E057, HAN MICROTELECOM. CO., LTD.
+0x00E058, PHASE ONE DENMARK A/S
+0x00E059, CONTROLLED ENVIRONMENTS, LTD.
+0x00E05A, GALEA NETWORK SECURITY
+0x00E05B, WEST END SYSTEMS CORP.
+0x00E05C, MATSUSHITA KOTOBUKI ELECTRONICS INDUSTRIES, LTD.
+0x00E05D, UNITEC CO., LTD.
+0x00E05E, JAPAN AVIATION ELECTRONICS INDUSTRY, LTD.
+0x00E05F, e-Net, Inc.
+0x00E060, SHERWOOD
+0x00E061, EdgePoint Networks, Inc.
+0x00E062, HOST ENGINEERING
+0x00E063, CABLETRON - YAGO SYSTEMS, INC.
+0x00E064, SAMSUNG ELECTRONICS
+0x00E065, OPTICAL ACCESS INTERNATIONAL
+0x00E066, ProMax Systems, Inc.
+0x00E067, eac AUTOMATION-CONSULTING GmbH
+0x00E068, MERRIMAC SYSTEMS INC.
+0x00E069, JAYCOR
+0x00E06A, KAPSCH AG
+0x00E06B, W&G SPECIAL PRODUCTS
+0x00E06C, AEP Systems International Ltd
+0x00E06D, COMPUWARE CORPORATION
+0x00E06E, FAR SYSTEMS S.p.A.
+0x00E06F, Motorola, Inc.
+0x00E070, DH TECHNOLOGY
+0x00E071, EPIS MICROCOMPUTER
+0x00E072, LYNK
+0x00E073, NATIONAL AMUSEMENT NETWORK, INC.
+0x00E074, TIERNAN COMMUNICATIONS, INC.
+0x00E075, Verilink Corporation
+0x00E076, DEVELOPMENT CONCEPTS, INC.
+0x00E077, WEBGEAR, INC.
+0x00E078, BERKELEY NETWORKS
+0x00E079, A.T.N.R.
+0x00E07A, MIKRODIDAKT AB
+0x00E07B, BAY NETWORKS
+0x00E07C, METTLER-TOLEDO, INC.
+0x00E07D, NETRONIX, INC.
+0x00E07E, WALT DISNEY IMAGINEERING
+0x00E07F, LOGISTISTEM s.r.l.
+0x00E080, CONTROL RESOURCES CORPORATION
+0x00E081, TYAN COMPUTER CORP.
+0x00E082, ANERMA
+0x00E083, JATO TECHNOLOGIES, INC.
+0x00E084, COMPULITE R&D
+0x00E085, GLOBAL MAINTECH, INC.
+0x00E086, Emerson Network Power, Avocent Division
+0x00E087, LeCroy - Networking Productions Division
+0x00E088, LTX CORPORATION
+0x00E089, ION Networks, Inc.
+0x00E08A, GEC AVERY, LTD.
+0x00E08B, QLogic Corp.
+0x00E08C, NEOPARADIGM LABS, INC.
+0x00E08D, PRESSURE SYSTEMS, INC.
+0x00E08E, UTSTARCOM
+0x00E08F, CISCO SYSTEMS, INC.
+0x00E090, BECKMAN LAB. AUTOMATION DIV.
+0x00E091, LG ELECTRONICS, INC.
+0x00E092, ADMTEK INCORPORATED
+0x00E093, ACKFIN NETWORKS
+0x00E094, OSAI SRL
+0x00E095, ADVANCED-VISION TECHNOLGIES CORP.
+0x00E096, SHIMADZU CORPORATION
+0x00E097, CARRIER ACCESS CORPORATION
+0x00E098, AboCom Systems, Inc.
+0x00E099, SAMSON AG
+0x00E09A, Positron Inc.
+0x00E09B, ENGAGE NETWORKS, INC.
+0x00E09C, MII
+0x00E09D, SARNOFF CORPORATION
+0x00E09E, QUANTUM CORPORATION
+0x00E09F, PIXEL VISION
+0x00E0A0, WILTRON CO.
+0x00E0A1, HIMA PAUL HILDEBRANDT GmbH Co. KG
+0x00E0A2, MICROSLATE INC.
+0x00E0A3, CISCO SYSTEMS, INC.
+0x00E0A4, ESAOTE S.p.A.
+0x00E0A5, ComCore Semiconductor, Inc.
+0x00E0A6, TELOGY NETWORKS, INC.
+0x00E0A7, IPC INFORMATION SYSTEMS, INC.
+0x00E0A8, SAT GmbH & Co.
+0x00E0A9, FUNAI ELECTRIC CO., LTD.
+0x00E0AA, ELECTROSONIC LTD.
+0x00E0AB, DIMAT S.A.
+0x00E0AC, MIDSCO, INC.
+0x00E0AD, EES TECHNOLOGY, LTD.
+0x00E0AE, XAQTI CORPORATION
+0x00E0AF, GENERAL DYNAMICS INFORMATION SYSTEMS
+0x00E0B0, CISCO SYSTEMS, INC.
+0x00E0B1, Alcatel-Lucent, Enterprise Business Group
+0x00E0B2, TELMAX COMMUNICATIONS CORP.
+0x00E0B3, EtherWAN Systems, Inc.
+0x00E0B4, TECHNO SCOPE CO., LTD.
+0x00E0B5, ARDENT COMMUNICATIONS CORP.
+0x00E0B6, Entrada Networks
+0x00E0B7, PI GROUP, LTD.
+0x00E0B8, GATEWAY 2000
+0x00E0B9, BYAS SYSTEMS
+0x00E0BA, BERGHOF AUTOMATIONSTECHNIK GmbH
+0x00E0BB, NBX CORPORATION
+0x00E0BC, SYMON COMMUNICATIONS, INC.
+0x00E0BD, INTERFACE SYSTEMS, INC.
+0x00E0BE, GENROCO INTERNATIONAL, INC.
+0x00E0BF, TORRENT NETWORKING TECHNOLOGIES CORP.
+0x00E0C0, SEIWA ELECTRIC MFG. CO., LTD.
+0x00E0C1, MEMOREX TELEX JAPAN, LTD.
+0x00E0C2, NECSY S.p.A.
+0x00E0C3, SAKAI SYSTEM DEVELOPMENT CORP.
+0x00E0C4, HORNER ELECTRIC, INC.
+0x00E0C5, BCOM ELECTRONICS INC.
+0x00E0C6, LINK2IT, L.L.C.
+0x00E0C7, EUROTECH SRL
+0x00E0C8, VIRTUAL ACCESS, LTD.
+0x00E0C9, AutomatedLogic Corporation
+0x00E0CA, BEST DATA PRODUCTS
+0x00E0CB, RESON, INC.
+0x00E0CC, HERO SYSTEMS, LTD.
+0x00E0CD, SENSIS CORPORATION
+0x00E0CE, ARN
+0x00E0CF, INTEGRATED DEVICE TECHNOLOGY, INC.
+0x00E0D0, NETSPEED, INC.
+0x00E0D1, TELSIS LIMITED
+0x00E0D2, VERSANET COMMUNICATIONS, INC.
+0x00E0D3, DATENTECHNIK GmbH
+0x00E0D4, EXCELLENT COMPUTER
+0x00E0D5, Emulex Corporation
+0x00E0D6, COMPUTER & COMMUNICATION RESEARCH LAB.
+0x00E0D7, SUNSHINE ELECTRONICS, INC.
+0x00E0D8, LANBit Computer, Inc.
+0x00E0D9, TAZMO CO., LTD.
+0x00E0DA, Alcatel North America ESD
+0x00E0DB, ViaVideo Communications, Inc.
+0x00E0DC, NEXWARE CORP.
+0x00E0DD, ZENITH ELECTRONICS CORPORATION
+0x00E0DE, DATAX NV
+0x00E0DF, KEYMILE GmbH
+0x00E0E0, SI ELECTRONICS, LTD.
+0x00E0E1, G2 NETWORKS, INC.
+0x00E0E2, INNOVA CORP.
+0x00E0E3, SK-ELEKTRONIK GmbH
+0x00E0E4, FANUC ROBOTICS NORTH AMERICA, Inc.
+0x00E0E5, CINCO NETWORKS, INC.
+0x00E0E6, INCAA DATACOM B.V.
+0x00E0E7, RAYTHEON E-SYSTEMS, INC.
+0x00E0E8, GRETACODER Data Systems AG
+0x00E0E9, DATA LABS, INC.
+0x00E0EA, INNOVAT COMMUNICATIONS, INC.
+0x00E0EB, DIGICOM SYSTEMS, INCORPORATED
+0x00E0EC, CELESTICA INC.
+0x00E0ED, SILICOM, LTD.
+0x00E0EE, MAREL HF
+0x00E0EF, DIONEX
+0x00E0F0, ABLER TECHNOLOGY, INC.
+0x00E0F1, THAT CORPORATION
+0x00E0F2, ARLOTTO COMNET, INC.
+0x00E0F3, WebSprint Communications, Inc.
+0x00E0F4, INSIDE Technology A/S
+0x00E0F5, TELES AG
+0x00E0F6, DECISION EUROPE
+0x00E0F7, CISCO SYSTEMS, INC.
+0x00E0F8, DICNA CONTROL AB
+0x00E0F9, CISCO SYSTEMS, INC.
+0x00E0FA, TRL TECHNOLOGY, LTD.
+0x00E0FB, LEIGHTRONIX, INC.
+0x00E0FC, HUAWEI TECHNOLOGIES CO., LTD.
+0x00E0FD, A-TREND TECHNOLOGY CO., LTD.
+0x00E0FE, CISCO SYSTEMS, INC.
+0x00E0FF, SECURITY DYNAMICS TECHNOLOGIES, Inc.
+0x00E175, AK-Systems Ltd
+0x00E666, ARIMA Communications Corp.
+0x00E6D3, NIXDORF COMPUTER CORP.
+0x00E8AB, Meggitt Training Systems, Inc.
+0x00EB2D, Sony Mobile Communications AB
+0x00F051, KWB Gmbh
+0x00F403, Orbis Systems Oy
+0x00F4B9, Apple, Inc.
+0x00F860, PT. Panggung Electric Citrabuana
+0x00FA3B, CLOOS ELECTRONIC GMBH
+0x00FC58, WebSilicon Ltd.
+0x00FC70, Intrepid Control Systems, Inc.
+0x00FD4C, NEVATEC
+0x020701, RACAL-DATACOM
+0x021C7C, PERQ SYSTEMS CORPORATION
+0x026086, LOGIC REPLACEMENT TECH. LTD.
+0x02608C, 3COM CORPORATION
+0x027001, RACAL-DATACOM
+0x0270B0, M/A-COM INC. COMPANIES
+0x0270B3, DATA RECALL LTD
+0x029D8E, CARDIAC RECORDERS INC.
+0x02AA3C, OLIVETTI TELECOMM SPA (OLTECO)
+0x02BB01, OCTOTHORPE CORP.
+0x02C08C, 3COM CORPORATION
+0x02CF1C, COMMUNICATION MACHINERY CORP.
+0x02E6D3, NIXDORF COMPUTER CORPORATION
+0x040A83, Alcatel-Lucent
+0x040AE0, XMIT AG COMPUTER NETWORKS
+0x040CCE, Apple, Inc.
+0x040EC2, ViewSonic Mobile China Limited
+0x041552, Apple
+0x04180F, Samsung Electronics Co.,Ltd
+0x0418B6, PRIVATE
+0x0418D6, Ubiquiti Networks
+0x041D10, Dream Ware Inc.
+0x041E64, Apple, Inc
+0x04209A, Panasonic AVC Networks Company
+0x042234, Wireless Standard Extensions
+0x042605, GFR Gesellschaft für Regelungstechnik und Energieeinsparung mbH
+0x042665, Apple
+0x042BBB, PicoCELA, Inc.
+0x042F56, ATOCS (Shenzhen) LTD
+0x0432F4, Partron
+0x043604, Gyeyoung I&T
+0x044665, Murata Manufacturing Co., Ltd.
+0x044A50, Ramaxel Technology (Shenzhen) limited company
+0x044BFF, GuangZhou Hedy Digital Technology Co., Ltd
+0x044CEF, Fujian Sanao Technology Co.,Ltd
+0x044FAA, Ruckus Wireless
+0x045453, Apple, Inc.
+0x0455CA, BriView (Xiamen) Corp.
+0x04586F, Sichuan Whayer information industry Co.,LTD
+0x045A95, Nokia Corporation
+0x045C06, Zmodo Technology Corporation
+0x045D56, camtron industrial inc.
+0x045FA7, Shenzhen Yichen Technology Development Co.,LTD
+0x0462D7, ALSTOM HYDRO FRANCE
+0x0463E0, Nome Oy
+0x046D42, Bryston Ltd.
+0x046E49, TaiYear Electronic Technology (Suzhou) Co., Ltd
+0x0470BC, Globalstar Inc.
+0x0474A1, Aligera Equipamentos Digitais Ltda
+0x0475F5, CSST
+0x04766E, ALPS Co,. Ltd.
+0x047D7B, Quanta Computer Inc.
+0x0481AE, Clack Corporation
+0x04888C, Eifelwerk Butler Systeme GmbH
+0x048A15, Avaya, Inc
+0x048B42, Skspruce Technology Limited
+0x0494A1, CATCH THE WIND INC
+0x0498F3, ALPS Electric Co,. Ltd.
+0x049C62, BMT Medical Technology s.r.o.
+0x049F06, Smobile Co., Ltd.
+0x049F81, Simena, LLC
+0x04A3F3, Emicon
+0x04A82A, Nokia Corporation
+0x04B3B6, Seamap (UK) Ltd
+0x04B466, BSP Co., Ltd.
+0x04BFA8, ISB Corporation
+0x04C05B, Tigo Energy
+0x04C06F, Huawei Device Co., Ltd
+0x04C1B9, Fiberhome Telecommunication Tech.Co.,Ltd.
+0x04C5A4, CISCO SYSTEMS, INC.
+0x04C880, Samtec Inc
+0x04CE14, Wilocity LTD.
+0x04D783, Y&H E&C Co.,LTD.
+0x04DAD2, Cisco
+0x04DD4C, IPBlaze
+0x04E0C4, TRIUMPH-ADLER AG
+0x04E1C8, IMS Soluções em Energia Ltda.
+0x04E2F8, AEP Ticketing solutions srl
+0x04E451, Texas Instruments
+0x04E548, Cohda Wireless Pty Ltd
+0x04E662, Acroname Inc.
+0x04E9E5, PJRC.COM, LLC
+0x04EE91, x-fabric GmbH
+0x04F021, Compex Systems Pte Ltd
+0x04F17D, Tarana Wireless
+0x04F4BC, Xena Networks
+0x04F7E4, Apple
+0x04F8C2, Flaircomm Microelectronics, Inc.
+0x04FE31, Samsung Electronics Co.,Ltd
+0x04FE7F, CISCO SYSTEMS, INC.
+0x04FF51, NOVAMEDIA INNOVISION SP. Z O.O.
+0x080001, COMPUTERVISION CORPORATION
+0x080002, BRIDGE COMMUNICATIONS INC.
+0x080003, ADVANCED COMPUTER COMM.
+0x080004, CROMEMCO INCORPORATED
+0x080005, SYMBOLICS INC.
+0x080006, SIEMENS AG
+0x080007, APPLE COMPUTER INC.
+0x080008, BOLT BERANEK AND NEWMAN INC.
+0x080009, HEWLETT PACKARD
+0x08000A, NESTAR SYSTEMS INCORPORATED
+0x08000B, UNISYS CORPORATION
+0x08000C, MIKLYN DEVELOPMENT CO.
+0x08000D, INTERNATIONAL COMPUTERS LTD.
+0x08000E, NCR CORPORATION
+0x08000F, MITEL CORPORATION
+0x080011, TEKTRONIX INC.
+0x080012, BELL ATLANTIC INTEGRATED SYST.
+0x080013, EXXON
+0x080014, EXCELAN
+0x080015, STC BUSINESS SYSTEMS
+0x080016, BARRISTER INFO SYS CORP
+0x080017, NATIONAL SEMICONDUCTOR
+0x080018, PIRELLI FOCOM NETWORKS
+0x080019, GENERAL ELECTRIC CORPORATION
+0x08001A, TIARA/ 10NET
+0x08001B, EMC Corporation
+0x08001C, KDD-KOKUSAI DEBNSIN DENWA CO.
+0x08001D, ABLE COMMUNICATIONS INC.
+0x08001E, APOLLO COMPUTER INC.
+0x08001F, SHARP CORPORATION
+0x080020, Oracle Corporation
+0x080021, 3M COMPANY
+0x080022, NBI INC.
+0x080023, Panasonic Communications Co., Ltd.
+0x080024, 10NET COMMUNICATIONS/DCA
+0x080025, CONTROL DATA
+0x080026, NORSK DATA A.S.
+0x080027, CADMUS COMPUTER SYSTEMS
+0x080028, Texas Instruments
+0x080029, MEGATEK CORPORATION
+0x08002A, MOSAIC TECHNOLOGIES INC.
+0x08002B, DIGITAL EQUIPMENT CORPORATION
+0x08002C, BRITTON LEE INC.
+0x08002D, LAN-TEC INC.
+0x08002E, METAPHOR COMPUTER SYSTEMS
+0x08002F, PRIME COMPUTER INC.
+0x080030, NETWORK RESEARCH CORPORATION
+0x080030, CERN
+0x080030, ROYAL MELBOURNE INST OF TECH
+0x080031, LITTLE MACHINES INC.
+0x080032, TIGAN INCORPORATED
+0x080033, BAUSCH & LOMB
+0x080034, FILENET CORPORATION
+0x080035, MICROFIVE CORPORATION
+0x080036, INTERGRAPH CORPORATION
+0x080037, FUJI-XEROX CO. LTD.
+0x080038, BULL S.A.S.
+0x080039, SPIDER SYSTEMS LIMITED
+0x08003A, ORCATECH INC.
+0x08003B, TORUS SYSTEMS LIMITED
+0x08003C, SCHLUMBERGER WELL SERVICES
+0x08003D, CADNETIX CORPORATIONS
+0x08003E, CODEX CORPORATION
+0x08003F, FRED KOSCHARA ENTERPRISES
+0x080040, FERRANTI COMPUTER SYS. LIMITED
+0x080041, RACAL-MILGO INFORMATION SYS..
+0x080042, JAPAN MACNICS CORP.
+0x080043, PIXEL COMPUTER INC.
+0x080044, DAVID SYSTEMS INC.
+0x080045, CONCURRENT COMPUTER CORP.
+0x080046, Sony Corporation
+0x080047, SEQUENT COMPUTER SYSTEMS INC.
+0x080048, EUROTHERM GAUGING SYSTEMS
+0x080049, UNIVATION
+0x08004A, BANYAN SYSTEMS INC.
+0x08004B, PLANNING RESEARCH CORP.
+0x08004C, HYDRA COMPUTER SYSTEMS INC.
+0x08004D, CORVUS SYSTEMS INC.
+0x08004E, 3COM EUROPE LTD.
+0x08004F, CYGNET SYSTEMS
+0x080050, DAISY SYSTEMS CORP.
+0x080051, EXPERDATA
+0x080052, INSYSTEC
+0x080053, MIDDLE EAST TECH. UNIVERSITY
+0x080055, STANFORD TELECOMM. INC.
+0x080056, STANFORD LINEAR ACCEL. CENTER
+0x080057, EVANS & SUTHERLAND
+0x080058, SYSTEMS CONCEPTS
+0x080059, A/S MYCRON
+0x08005A, IBM Corp
+0x08005B, VTA TECHNOLOGIES INC.
+0x08005C, FOUR PHASE SYSTEMS
+0x08005D, GOULD INC.
+0x08005E, COUNTERPOINT COMPUTER INC.
+0x08005F, SABER TECHNOLOGY CORP.
+0x080060, INDUSTRIAL NETWORKING INC.
+0x080061, JAROGATE LTD.
+0x080062, GENERAL DYNAMICS
+0x080063, PLESSEY
+0x080064, Sitasys AG
+0x080065, GENRAD INC.
+0x080066, AGFA CORPORATION
+0x080067, COMDESIGN
+0x080068, RIDGE COMPUTERS
+0x080069, SILICON GRAPHICS INC.
+0x08006A, ATT BELL LABORATORIES
+0x08006B, ACCEL TECHNOLOGIES INC.
+0x08006C, SUNTEK TECHNOLOGY INT'L
+0x08006D, WHITECHAPEL COMPUTER WORKS
+0x08006E, MASSCOMP
+0x08006F, PHILIPS APELDOORN B.V.
+0x080070, MITSUBISHI ELECTRIC CORP.
+0x080071, MATRA (DSIE)
+0x080072, XEROX CORP UNIV GRANT PROGRAM
+0x080073, TECMAR INC.
+0x080074, CASIO COMPUTER CO. LTD.
+0x080075, DANSK DATA ELECTRONIK
+0x080076, PC LAN TECHNOLOGIES
+0x080077, TSL COMMUNICATIONS LTD.
+0x080078, ACCELL CORPORATION
+0x080079, THE DROID WORKS
+0x08007A, INDATA
+0x08007B, SANYO ELECTRIC CO. LTD.
+0x08007C, VITALINK COMMUNICATIONS CORP.
+0x08007E, AMALGAMATED WIRELESS(AUS) LTD
+0x08007F, CARNEGIE-MELLON UNIVERSITY
+0x080080, AES DATA INC.
+0x080081, ,ASTECH INC.
+0x080082, VERITAS SOFTWARE
+0x080083, Seiko Instruments Inc.
+0x080084, TOMEN ELECTRONICS CORP.
+0x080085, ELXSI
+0x080086, KONICA MINOLTA HOLDINGS, INC.
+0x080087, XYPLEX
+0x080088, Brocade Communications Systems, Inc.
+0x080089, KINETICS
+0x08008A, PerfTech, Inc.
+0x08008B, PYRAMID TECHNOLOGY CORP.
+0x08008C, NETWORK RESEARCH CORPORATION
+0x08008D, XYVISION INC.
+0x08008E, TANDEM COMPUTERS
+0x08008F, CHIPCOM CORPORATION
+0x080090, SONOMA SYSTEMS
+0x0808C2, Samsung Electronics
+0x0808EA, AMSC
+0x080C0B, SysMik GmbH Dresden
+0x080CC9, Mission Technology Group, dba Magma
+0x080D84, GECO, Inc.
+0x080EA8, Velex s.r.l.
+0x080FFA, KSP INC.
+0x081196, Intel Corporate
+0x081443, UNIBRAIN S.A.
+0x081651, Shenzhen Sea Star Technology Co.,Ltd
+0x081735, CISCO SYSTEMS, INC.
+0x0817F4, IBM Corp
+0x08181A, zte corporation
+0x08184C, A. S. Thomas, Inc.
+0x0819A6, HUAWEI TECHNOLOGIES CO.,LTD
+0x081DFB, Shanghai Mexon Communication Technology Co.,Ltd
+0x081F3F, WondaLink Inc.
+0x081FF3, CISCO SYSTEMS, INC.
+0x082522, ADVANSEE
+0x082719, APS systems/electronic AG
+0x082AD0, SRD Innovations Inc.
+0x082E5F, Hewlett Packard
+0x08373D, Samsung Electronics Co.,Ltd
+0x08379C, Topaz Co. LTD.
+0x0838A5, Funkwerk plettac electronic GmbH
+0x083AB8, Shinoda Plasma Co., Ltd.
+0x083E8E, Hon Hai Precision Ind.Co.Ltd
+0x08482C, Raycore Taiwan Co., LTD.
+0x084E1C, H2A Systems, LLC
+0x084EBF, Broad Net Mux Corporation
+0x08512E, Orion Diagnostica Oy
+0x085B0E, Fortinet, Inc.
+0x08606E, ASUSTek COMPUTER INC.
+0x086361, Huawei Technologies Co., Ltd
+0x0868D0, Japan System Design
+0x0868EA, EITO ELECTRONICS CO., LTD.
+0x087572, Obelux Oy
+0x087618, ViE Technologies Sdn. Bhd.
+0x087695, Auto Industrial Co., Ltd.
+0x0876FF, Thomson Telecom Belgium
+0x087999, AIM GmbH
+0x087A4C, Huawei Technologies Co., Ltd
+0x087BAA, SVYAZKOMPLEKTSERVICE, LLC
+0x087CBE, Quintic Corp.
+0x087D21, Altasec technology corporation
+0x0881F4, Juniper Networks
+0x08863B, Belkin International, Inc.
+0x088DC8, Ryowa Electronics Co.,Ltd
+0x088F2C, Hills Sound Vision & Lighting
+0x089E01, QUANTA COMPUTER INC.
+0x089F97, LEROY AUTOMATION
+0x08A12B, ShenZhen EZL Technology Co., Ltd
+0x08A95A, Azurewave
+0x08ACA5, Benu Video, Inc.
+0x08AF78, Totus Solutions, Inc.
+0x08B4CF, Abicom International
+0x08B738, Lite-On Technogy Corp.
+0x08B7EC, Wireless Seismic
+0x08BBCC, AK-NORD EDV VERTRIEBSGES. mbH
+0x08BE09, Astrol Electronic AG
+0x08CC68, Cisco
+0x08D09F, CISCO SYSTEMS, INC.
+0x08D29A, Proformatique
+0x08D40C, Intel Corporate
+0x08D42B, Samsung Electronics
+0x08D5C0, Seers Technology Co., Ltd
+0x08E5DA, NANJING FUJITSU COMPUTER PRODUCTS CO.,LTD.
+0x08E672, JEBSEE ELECTRONICS CO.,LTD.
+0x08EA44, Aerohive Networks, Inc.
+0x08EB74, Humax
+0x08EBED, World Elite Technology Co.,LTD
+0x08EDB9, Hon Hai Precision Ind. Co.,Ltd.
+0x08F1B7, Towerstream Corpration
+0x08F2F4, Net One Partners Co.,Ltd.
+0x08F6F8, GET Engineering
+0x08FAE0, Fohhn Audio AG
+0x08FC52, OpenXS BV
+0x08FC88, Samsung Electronics Co.,Ltd
+0x0C0400, Jantar d.o.o.
+0x0C1105, Ringslink (Xiamen) Network Communication Technologies Co., Ltd
+0x0C130B, Uniqoteq Ltd.
+0x0C1420, Samsung Electronics Co.,Ltd
+0x0C15C5, SDTEC Co., Ltd.
+0x0C17F1, TELECSYS
+0x0C191F, Inform Electronik
+0x0C1DC2, SeAH Networks
+0x0C2755, Valuable Techologies Limited
+0x0C2A69, electric imp, incorporated
+0x0C2AE7, Beijing General Research Institute of Mining and Metallurgy
+0x0C37DC, Huawei Technologies Co., Ltd
+0x0C3956, Observator instruments
+0x0C3C65, Dome Imaging Inc
+0x0C469D, MS Sedco
+0x0C4C39, Mitrastar Technology
+0x0C51F7, CHAUVIN ARNOUX
+0x0C5521, Axiros GmbH
+0x0C565C, HyBroad Vision (Hong Kong) Technology Co Ltd
+0x0C57EB, Mueller Systems
+0x0C5A19, Axtion Sdn Bhd
+0x0C6076, Hon Hai Precision Ind. Co.,Ltd.
+0x0C6E4F, PrimeVOLT Co., Ltd.
+0x0C715D, Samsung Electronics Co.,Ltd
+0x0C722C, TP-LINK TECHNOLOGIES CO.,LTD.
+0x0C74C2, Apple, Inc.
+0x0C7523, BEIJING GEHUA CATV NETWORK CO.,LTD
+0x0C771A, Apple, Inc.
+0x0C7D7C, Kexiang Information Technology Co, Ltd.
+0x0C8112, PRIVATE
+0x0C8230, SHENZHEN MAGNUS TECHNOLOGIES CO.,LTD
+0x0C8268, TP-LINK TECHNOLOGIES CO.,LTD.
+0x0C826A, Wuhan Huagong Genuine Optics Technology Co., Ltd
+0x0C8411, A.O. Smith Water Products
+0x0C8484, Zenovia Electronics Inc.
+0x0C8525, CISCO SYSTEMS, INC.
+0x0C8BFD, Intel Corporate
+0x0C8CDC, Suunto Oy
+0x0C8D98, TOP EIGHT IND CORP
+0x0C924E, Rice Lake Weighing Systems
+0x0C93FB, BNS Solutions
+0x0C96BF, Huawei Technologies Co., Ltd
+0x0C9D56, Consort Controls Ltd
+0x0C9E91, Sankosha Corporation
+0x0CA138, Blinq Wireless Inc.
+0x0CA2F4, Chameleon Technology (UK) Limited
+0x0CA402, Alcatel Lucent IPD
+0x0CA42A, OB Telecom Electronic Technology Co., Ltd
+0x0CAF5A, GENUS POWER INFRASTRUCTURES LIMITED
+0x0CB4EF, Digience Co.,Ltd.
+0x0CBF15, Genetec
+0x0CC0C0, MAGNETI MARELLI SISTEMAS ELECTRONICOS MEXICO
+0x0CC3A7, Meritec
+0x0CC47E, EUCAST Co., Ltd.
+0x0CC655, Wuxi YSTen Technology Co.,Ltd.
+0x0CC66A, Nokia Corporation
+0x0CC6AC, DAGS
+0x0CC9C6, Samwin Hong Kong Limited
+0x0CCDD3, EASTRIVER TECHNOLOGY CO., LTD.
+0x0CCDFB, EDIC Systems Inc.
+0x0CD292, Intel Corporate
+0x0CD2B5, Binatone Telecommunication Pvt. Ltd
+0x0CD502, Westell
+0x0CD696, Amimon Ltd
+0x0CD7C2, Axium Technologies, Inc.
+0x0CD996, CISCO SYSTEMS, INC.
+0x0CD9C1, Johnson Controls-ASG
+0x0CDA41, Hangzhou H3C Technologies Co., Limited
+0x0CDCCC, Inala Technologies
+0x0CDDEF, Nokia Corporation
+0x0CDFA4, Samsung Electronics Co.,Ltd
+0x0CE5D3, DH electronics GmbH
+0x0CE709, Fox Crypto B.V.
+0x0CE82F, Bonfiglioli Vectron GmbH
+0x0CE936, ELIMOS srl
+0x0CEEE6, Hon Hai Precision Ind. Co.,Ltd.
+0x0CEF7C, AnaCom Inc
+0x0CF0B4, Globalsat International Technology Ltd
+0x0CF361, Java Information
+0x0CF3EE, EM Microelectronic
+0x0CF405, Beijing Signalway Technologies Co.,Ltd
+0x0CF893, ARRIS Group, Inc.
+0x0CFC83, Airoha Technology Corp.,
+0x100000, PRIVATE
+0x10005A, IBM Corp
+0x1000E8, NATIONAL SEMICONDUCTOR
+0x1000FD, LaonPeople
+0x10090C, Janome Sewing Machine Co., Ltd.
+0x100BA9, Intel Corporate
+0x100C24, pomdevices, LLC
+0x100D2F, Online Security Pty. Ltd.
+0x100D32, Embedian, Inc.
+0x100D7F, NETGEAR INC.,
+0x100E2B, NEC CASIO Mobile Communications
+0x1010B6, McCain Inc
+0x101212, Vivo International Corporation Pty Ltd
+0x101248, ITG, Inc.
+0x1013EE, Justec International Technology INC.
+0x10189E, Elmo Motion Control
+0x101B54, HUAWEI TECHNOLOGIES CO.,LTD
+0x101C0C, Apple
+0x101D51, ON-Q LLC dba ON-Q Mesh Networks
+0x101DC0, Samsung Electronics Co.,Ltd
+0x101F74, Hewlett-Packard Company
+0x102831, Morion Inc.
+0x102D96, Looxcie Inc.
+0x102EAF, Texas Instruments
+0x103711, Simlink AS
+0x103DEA, HFC Technology (Beijing) Ltd. Co.
+0x1040F3, Apple, Inc.
+0x104369, Soundmax Electronic Limited
+0x10445A, Shaanxi Hitech Electronic Co., LTD
+0x1045BE, Norphonic AS
+0x1045F8, LNT-Automation GmbH
+0x104780, HUAWEI TECHNOLOGIES CO.,LTD
+0x1048B1, Beijing Duokan Technology Limited
+0x104D77, Innovative Computer Engineering
+0x1056CA, Peplink International Ltd.
+0x105CBF, DuroByte Inc
+0x105F06, Actiontec Electronics, Inc
+0x105F49, Cisco SPVTG
+0x10604B, Hewlett Packard
+0x1062C9, Adatis GmbH & Co. KG
+0x1064E2, ADFweb.com s.r.l.
+0x1065A3, Panamax Inc.
+0x1065CF, IQSIM
+0x106682, NEC AccessTechnica, Ltd.
+0x10683F, LG Electronics
+0x106F3F, Buffalo Inc.
+0x106FEF, Ad-Sol Nissin Corp
+0x1071F9, Cloud Telecomputers, LLC
+0x10768A, EoCell
+0x1077B1, Samsung Electronics Co.,LTD
+0x1078D2, ELITEGROUP COMPUTER SYSTEM CO., LTD.
+0x1083D2, Microseven Systems, LLC
+0x10880F, Daruma Telecomunicações e Informática S.A.
+0x108CCF, CISCO SYSTEMS, INC.
+0x1093E9, Apple, Inc.
+0x109ADD, Apple, Inc.
+0x109FA9, Actiontec Electronics, Inc
+0x10A13B, FUJIKURA RUBBER LTD.
+0x10A743, SK Mtek Limited
+0x10A932, Beijing Cyber Cloud Technology Co. ,Ltd.
+0x10B7F6, Plastoform Industries Ltd.
+0x10B9FE, Lika srl
+0x10BAA5, GANA I&C CO., LTD
+0x10BD18, CISCO SYSTEMS, INC.
+0x10BF48, ASUSTEK COMPUTER INC.
+0x10C2BA, UTT Co., Ltd.
+0x10C586, BIO SOUND LAB CO., LTD.
+0x10C61F, Huawei Technologies Co., Ltd
+0x10C6FC, Garmin International
+0x10C73F, Midas Klark Teknik Ltd
+0x10CA81, PRECIA
+0x10CCDB, AXIMUM PRODUITS ELECTRONIQUES
+0x10D1DC, INSTAR Deutschland GmbH
+0x10D542, Samsung Electronics Co.,Ltd
+0x10DDB1, Apple
+0x10E2D5, Qi Hardware Inc.
+0x10E3C7, Seohwa Telecom
+0x10E4AF, APR, LLC
+0x10E6AE, Source Technologies, LLC
+0x10E8EE, PhaseSpace
+0x10EA59, Cisco SPVTG
+0x10EED9, Canoga Perkins Corporation
+0x10F311, Cisco
+0x10F3DB, Gridco Systems, Inc.
+0x10F49A, T3 Innovation
+0x10F96F, LG Electronics
+0x10F9EE, Nokia Corporation
+0x10FBF0, KangSheng LTD.
+0x10FC54, Shany Electronic Co., Ltd.
+0x10FEED, TP-LINK TECHNOLOGIES CO., LTD.
+0x1100AA, PRIVATE
+0x140708, PRIVATE
+0x1407E0, Abrantix AG
+0x140C76, FREEBOX SAS
+0x14109F, Apple Inc
+0x141330, Anakreon UK LLP
+0x14144B, FUJIAN STAR-NET COMMUNICATION CO.,LTD
+0x141A51, Treetech Sistemas Digitais
+0x141BBD, Volex Inc.
+0x141BF0, Intellimedia Systems Ltd
+0x1423D7, EUTRONIX CO., LTD.
+0x142DF5, Amphitech
+0x14307A, Avermetrics
+0x14358B, Mediabridge Products, LLC.
+0x1435B3, Future Designs, Inc.
+0x143605, Nokia Corporation
+0x14373B, PROCOM Systems
+0x143AEA, Dynapower Company LLC
+0x143E60, Alcatel-Lucent
+0x1441E2, Monaco Enterprises, Inc.
+0x144319, Creative&Link Technology Limited
+0x144978, Digital Control Incorporated
+0x144C1A, Max Communication GmbH
+0x145412, Entis Co., Ltd.
+0x145A05, Apple, Inc.
+0x145BD1, Motorola Mobility, Inc.
+0x146308, JABIL CIRCUIT (SHANGHAI) LTD.
+0x146A0B, Cypress Electronics Limited
+0x146E0A, PRIVATE
+0x147373, TUBITAK UEKAE
+0x147411, RIM
+0x147DB3, JOA TELECOM.CO.,LTD
+0x147DC5, Murata Manufacturing Co., Ltd.
+0x14825B, Hefei Radio Communication Technology Co., Ltd
+0x148692, TP-LINK TECHNOLOGIES CO.,LTD.
+0x1489FD, Samsung Electronics
+0x148A70, ADS GmbH
+0x148FC6, Apple, Inc.
+0x149090, KongTop industrial(shen zhen)CO.,LTD
+0x149448, BLU CASTLE S.A.
+0x149FE8, Lenovo Mobile Communication Technology Ltd.
+0x14A62C, S.M. Dezac S.A.
+0x14A86B, ShenZhen Telacom Science&Technology Co., Ltd
+0x14A9E3, MST CORPORATION
+0x14B1C8, InfiniWing, Inc.
+0x14B73D, ARCHEAN Technologies
+0x14C21D, Sabtech Industries
+0x14CF8D, OHSUNG ELECTRONICS CO., LTD.
+0x14CF92, TP-LINK TECHNOLOGIES CO., LTD.
+0x14D4FE, Pace plc
+0x14D64D, D-Link International
+0x14D76E, CONCH ELECTRONIC Co.,Ltd
+0x14DAE9, ASUSTek COMPUTER INC.
+0x14DB85, S NET MEDIA
+0x14E4EC, mLogic LLC
+0x14E6E4, TP-LINK TECHNOLOGIES CO., LTD.
+0x14EB33, BSMediasoft Co., Ltd.
+0x14EE9D, AirNav Systems LLC
+0x14F0C5, Xtremio Ltd.
+0x14F42A, Samsung Electronics
+0x14FEAF, SAGITTAR LIMITED
+0x14FEB5, Dell Inc
+0x18002D, Sony Mobile Communications AB
+0x1800DB, Fitbit Inc.
+0x1801E3, Elektrobit Wireless Communications Ltd
+0x180373, Dell Inc
+0x1803FA, IBT Interfaces
+0x180675, DILAX Intelcom GmbH
+0x180B52, Nanotron Technologies GmbH
+0x180C77, Westinghouse Electric Company, LLC
+0x180CAC, CANON INC.
+0x181420, TEB SAS
+0x181456, Nokia Corporation
+0x181714, DAEWOOIS
+0x181725, Cameo Communications, Inc.
+0x18193F, Tamtron Oy
+0x182032, Apple, Inc.
+0x182861, AirTies Wireless Networks
+0x182A7B, Nintendo Co., Ltd.
+0x182B05, 8D Technologies
+0x182C91, Concept Development, Inc.
+0x1832A2, LAON TECHNOLOGY CO., LTD.
+0x18339D, CISCO SYSTEMS, INC.
+0x183451, Apple, Inc.
+0x183825, Wuhan Lingjiu High-tech Co.,Ltd.
+0x183919, Unicoi Systems
+0x183BD2, BYD Precision Manufacture Company Ltd.
+0x183DA2, Intel Corporate
+0x183F47, Samsung Electronics Co.,Ltd
+0x18421D, PRIVATE
+0x18422F, Alcatel Lucent
+0x184617, Samsung Electronics
+0x1848D8, Fastback Networks
+0x184E94, MESSOA TECHNOLOGIES INC.
+0x185253, Pixord Corporation
+0x1853E0, Hanyang Digitech Co.Ltd
+0x18550F, Cisco SPVTG
+0x185933, Cisco SPVTG
+0x185AE8, Zenotech.Co.,Ltd
+0x1866E3, Veros Systems, Inc.
+0x18673F, Hanover Displays Limited
+0x186751, KOMEG Industrielle Messtechnik GmbH
+0x1867B0, Samsung Electronics Co.,LTD
+0x186D99, Adanis Inc.
+0x187A93, AMICCOM Electronics Corporation
+0x187C81, Valeo Vision Systems
+0x1880CE, Barberry Solutions Ltd
+0x1880F5, Alcatel-Lucent Shanghai Bell Co., Ltd
+0x188410, CoreTrust Inc.
+0x18863A, DIGITAL ART SYSTEM
+0x1886AC, Nokia Danmark A/S
+0x188796, HTC Corporation
+0x188ED5, Philips Innovative Application NV
+0x18922C, Virtual Instruments
+0x1897FF, TechFaith Wireless Technology Limited
+0x189A67, CSE-Servelec Limited
+0x189EFC, Apple Inc
+0x18A905, Hewlett-Packard Company
+0x18ABF5, Ultra Electronics - Electrics
+0x18AD4D, Polostar Technology Corporation
+0x18AEBB, Siemens Programm- und Systementwicklung GmbH&Co.KG
+0x18AF9F, DIGITRONIC Automationsanlagen GmbH
+0x18B209, Torrey Pines Logic, Inc
+0x18B3BA, Netlogic AB
+0x18B430, Nest Labs Inc.
+0x18B591, I-Storm
+0x18B79E, Invoxia
+0x18C086, Broadcom Corporation
+0x18C451, Tucson Embedded Systems
+0x18D071, DASAN SMC, Inc.
+0x18D66A, Inmarsat
+0x18D949, Qvis Labs, LLC
+0x18DC56, Yulong Computer Telecommunication Scientific(shenzhen)Co.,Lt
+0x18E288, STT Condigi
+0x18E2C2, Samsung Electronics
+0x18E7F4, Apple, Inc.
+0x18E80F, Viking Electronics Inc.
+0x18E8DD, MODULETEK
+0x18EF63, CISCO SYSTEMS, INC.
+0x18F46A, Hon Hai Precision Ind. Co.,Ltd.
+0x18F650, Multimedia Pacific Limited
+0x18F87A, i3 International Inc.
+0x18FA6F, ISC applied systems corp
+0x18FC9F, Changhe Electronics Co., Ltd.
+0x1C0656, IDY Corporation
+0x1C0B52, EPICOM S.A
+0x1C0FCF, Sypro Optics GmbH
+0x1C11E1, Wartsila Finland Oy
+0x1C129D, IEEE PES PSRC/SUB
+0x1C1448, Motorola Mobility, Inc.
+0x1C17D3, CISCO SYSTEMS, INC.
+0x1C184A, ShenZhen RicherLink Technologies Co.,LTD
+0x1C19DE, eyevis GmbH
+0x1C1D67, Huawei Device Co., Ltd
+0x1C334D, ITS Telecom
+0x1C3477, Innovation Wireless
+0x1C35F1, NEW Lift Neue Elektronische Wege Steuerungsbau GmbH
+0x1C37BF, Cloudium Systems Ltd.
+0x1C3A4F, AccuSpec Electronics, LLC
+0x1C3DE7, Sigma Koki Co.,Ltd.
+0x1C3E84, Hon Hai Precision Ind. Co.,Ltd.
+0x1C43EC, JAPAN CIRCUIT CO.,LTD
+0x1C4593, Texas Instruments
+0x1C4BD6, AzureWave
+0x1C51B5, Techaya LTD
+0x1C52D6, FLAT DISPLAY TECHNOLOGY CORPORATION
+0x1C5A3E, Samsung Eletronics Co., Ltd (Visual Display Divison)
+0x1C5A6B, Philips Electronics Nederland BV
+0x1C5C55, PRIMA Cinema, Inc
+0x1C5C60, Shenzhen Belzon Technology Co.,LTD.
+0x1C5FFF, Beijing Ereneben Information Technology Co.,Ltd Shenzhen Branch
+0x1C62B8, Samsung Electronics Co.,Ltd
+0x1C659D, Liteon Technology Corporation
+0x1C666D, Hon Hai Precision Ind.Co.Ltd
+0x1C66AA, Samsung Electronics
+0x1C69A5, Research In Motion
+0x1C6BCA, Mitsunami Co., Ltd.
+0x1C6F65, GIGA-BYTE TECHNOLOGY CO.,LTD.
+0x1C7508, COMPAL INFORMATION (KUNSHAN) CO., LTD.
+0x1C76CA, Terasic Technologies Inc.
+0x1C7C11, EID
+0x1C7C45, Vitek Industrial Video Products, Inc.
+0x1C7EE5, D-Link International
+0x1C83B0, Linked IP GmbH
+0x1C8464, FORMOSA WIRELESS COMMUNICATION CORP.
+0x1C8E8E, DB Communication & Systems Co., ltd.
+0x1C8F8A, Phase Motion Control SpA
+0x1C9179, Integrated System Technologies Ltd
+0x1C9492, RUAG Schweiz AG
+0x1C955D, I-LAX ELECTRONICS INC.
+0x1C959F, Veethree Electronics And Marine LLC
+0x1C973D, PRICOM Design
+0x1CAA07, CISCO SYSTEMS, INC.
+0x1CABA7, Apple, Inc.
+0x1CAFF7, D-LINK INTERNATIONAL PTE LIMITED
+0x1CB094, HTC Corporation
+0x1CB17F, NEC AccessTechnica, Ltd.
+0x1CB243, TDC A/S
+0x1CBA8C, Texas Instruments
+0x1CBBA8, OJSC "Ufimskiy Zavod "Promsvyaz"
+0x1CBD0E, Amplified Engineering Pty Ltd
+0x1CBDB9, D-LINK INTERNATIONAL PTE LIMITED
+0x1CC1DE, Hewlett-Packard Company
+0x1CC316, MileSight Technology Co., Ltd.
+0x1CC63C, Arcadyan Technology Corporation
+0x1CD40C, Kriwan Industrie-Elektronik GmbH
+0x1CDF0F, CISCO SYSTEMS, INC.
+0x1CE165, Marshal Corporation
+0x1CE192, Qisda Corporation
+0x1CE2CC, Texas Instruments
+0x1CE6C7, Cisco
+0x1CF061, SCAPS GmbH
+0x1CF4CA, PRIVATE
+0x1CF5E7, Turtle Industry Co., Ltd.
+0x1CFA68, TP-LINK TECHNOLOGIES CO.,LTD.
+0x1CFEA7, IDentytech Solutins Ltd.
+0x20014F, Linea Research Ltd
+0x2002AF, Murata Manufactuaring Co.,Ltd.
+0x200505, RADMAX COMMUNICATION PRIVATE LIMITED
+0x2005E8, OOO "InProMedia"
+0x200A5E, Xiangshan Giant Eagle Technology Developing co.,LTD
+0x20107A, Gemtek Technology Co., Ltd.
+0x201257, Most Lucky Trading Ltd
+0x2013E0, Samsung Electronics Co.,Ltd
+0x2016D8, Liteon Technology Corporation
+0x201A06, COMPAL INFORMATION (KUNSHAN) CO., LTD.
+0x2021A5, LG Electronics Inc
+0x202598, Teleview
+0x202BC1, Huawei Device Co., Ltd
+0x202CB7, Kong Yue Electronics & Information Industry (Xinhui) Ltd.
+0x203706, CISCO SYSTEMS, INC.
+0x2037BC, Kuipers Electronic Engineering BV
+0x203A07, Cisco
+0x204005, feno GmbH
+0x20415A, Smarteh d.o.o.
+0x20443A, Schneider Electric Asia Pacific Ltd
+0x2046A1, VECOW Co., Ltd
+0x2046F9, Advanced Network Devices (dba:AND)
+0x204AAA, Hanscan Spain S.A.
+0x204C6D, Hugo Brennenstuhl Gmbh & Co. KG.
+0x204E6B, Axxana(israel) ltd
+0x204E7F, NETGEAR
+0x205476, Sony Mobile Communications AB
+0x2059A0, Paragon Technologies Inc.
+0x205B2A, PRIVATE
+0x205B5E, Shenzhen Wonhe Technology Co., Ltd
+0x206432, SAMSUNG ELECTRO MECHANICS CO.,LTD.
+0x2067B1, Pluto inc.
+0x20689D, Liteon Technology Corporation
+0x206A8A, Wistron InfoComm Manufacturing(Kunshan)Co.,Ltd.
+0x206AFF, Atlas Elektronik UK Limited
+0x206FEC, Braemac CA LLC
+0x207355, ARRIS Group, Inc.
+0x2074CF, Shenzhen Voxtech Co.,Ltd
+0x207600, Actiontec Electronics, Inc
+0x207C8F, Quanta Microsystems,Inc.
+0x207D74, Apple
+0x20858C, Assa
+0x208984, COMPAL INFORMATION (KUNSHAN) CO., LTD
+0x20918A, PROFALUX
+0x2091D9, I'M SPA
+0x209BA5, JIAXING GLEAD Electronics Co.,Ltd
+0x20A2E7, Lee-Dickens Ltd
+0x20AA25, IP-NET LLC
+0x20AA4B, Cisco-Linksys, LLC
+0x20B0F7, Enclustra GmbH
+0x20B399, Enterasys
+0x20B5C6, Mimosa Networks
+0x20B7C0, Omicron electronics GmbH
+0x20BBC0, Cisco
+0x20BBC6, Jabil Circuit Hungary Ltd.
+0x20BFDB, DVL
+0x20C1AF, i Wit Digital Co., Limited
+0x20C8B3, SHENZHEN BUL-TECH CO.,LTD.
+0x20C9D0, Apple Inc
+0x20CF30, ASUSTek COMPUTER INC.
+0x20D5AB, Korea Infocom Co.,Ltd.
+0x20D5BF, Samsung Eletronics Co., Ltd
+0x20D607, Nokia Corporation
+0x20D906, Iota, Inc.
+0x20DC93, Cheetah Hi-Tech, Inc.
+0x20DCE6, TP-LINK TECHNOLOGIES CO., LTD.
+0x20E52A, NETGEAR INC.,
+0x20E564, Motorola Mobility, Inc.
+0x20EEC6, Elefirst Science & Tech Co ., ltd
+0x20F002, MTData Developments Pty. Ltd.
+0x20F3A3, Huawei Technologies Co., Ltd
+0x20F85E, Delta Electronics
+0x20FABB, Cambridge Executive Limited
+0x20FDF1, 3COM EUROPE LTD
+0x20FECD, System In Frontier Inc.
+0x20FEDB, M2M Solution S.A.S.
+0x2401C7, Cisco
+0x240917, Devlin Electronics Limited
+0x240A64, AzureWaveTechnologies,Inc
+0x240B2A, Viettel Group
+0x240BB1, KOSTAL Industrie Elektrik GmbH
+0x241064, Shenzhen Ecsino Tecnical Co. Ltd
+0x241125, Hutek Co., Ltd.
+0x2411D0, Chongqing Ehs Science and Technology Development Co.,Ltd.
+0x241A8C, Squarehead Technology AS
+0x241B13, Shanghai Nutshell Electronic Co., Ltd.
+0x241F2C, Calsys, Inc.
+0x2421AB, Sony Ericsson Mobile Communications
+0x242FFA, Toshiba Global Commerce Solutions
+0x24374C, Cisco SPVTG
+0x2437EF, EMC Electronic Media Communication SA
+0x243C20, Dynamode Group
+0x244597, GEMUE Gebr. Mueller Apparatebau
+0x24470E, PentronicAB
+0x24497B, Innovative Converged Devices Inc
+0x245FDF, KYOCERA Corporation
+0x246278, sysmocom - systems for mobile communications GmbH
+0x246511, AVM GmbH
+0x24694A, Jasmine Systems Inc.
+0x2469A5, Huawei Technologies Co., Ltd
+0x24767D, Cisco SPVTG
+0x247703, Intel Corporate
+0x2481AA, KSH International Co., Ltd.
+0x24828A, Prowave Technologies Ltd.
+0x2486F4, Ctek, Inc.
+0x248707, SEnergy Corporation
+0x249442, OPEN ROAD SOLUTIONS , INC.
+0x249504, SFR
+0x24A42C, KOUKAAM a.s.
+0x24A43C, Ubiquiti Networks, INC
+0x24A937, PURE Storage
+0x24AB81, Apple, Inc.
+0x24AF4A, Alcatel-Lucent-IPD
+0x24AF54, NEXGEN Mediatech Inc.
+0x24B657, CISCO SYSTEMS, INC.
+0x24B6B8, FRIEM SPA
+0x24B6FD, Dell Inc
+0x24B88C, Crenus Co.,Ltd.
+0x24B8D2, Opzoon Technology Co.,Ltd.
+0x24BA30, Technical Consumer Products, Inc.
+0x24BBC1, Absolute Analysis
+0x24BC82, Dali Wireless, Inc.
+0x24BE05, Hewlett Packard
+0x24BF74, PRIVATE
+0x24C0B3, RSF
+0x24C86E, Chaney Instrument Co.
+0x24C9DE, Genoray
+0x24CBE7, MYK, Inc.
+0x24CF21, Shenzhen State Micro Technology Co., Ltd
+0x24D2CC, SmartDrive Systems Inc.
+0x24D921, Avaya, Inc
+0x24DAB6, Sistemas de Gestión Energética S.A. de C.V
+0x24DBAC, Huawei Device Co., Ltd
+0x24DBAD, ShopperTrak RCT Corporation
+0x24DEC6, Aruba Networks
+0x24E6BA, JSC Zavod im. Kozitsky
+0x24EA40, Systeme Helmholz GmbH
+0x24EB65, SAET I.S. S.r.l.
+0x24EC99, Askey Computer Corp
+0x24EE3A, Chengdu Yingji Electronic Hi-tech Co Ltd
+0x24F0FF, GHT Co., Ltd.
+0x24F2DD, Radiant Zemax LLC
+0x2804E0, FERMAX ELECTRONICA S.A.U.
+0x28061E, NINGBO GLOBAL USEFUL ELECTRIC CO.,LTD
+0x28068D, ITL, LLC
+0x280CB8, Mikrosay Yazilim ve Elektronik A.S.
+0x280DFC, Sony Computer Entertainment Inc.
+0x28107B, D-Link International
+0x281471, Lantis co., LTD.
+0x28162E, 2Wire
+0x2817CE, Omnisense Ltd
+0x281878, Microsoft Corporation
+0x2818FD, Aditya Infotech Ltd.
+0x2826A6, PBR electronics GmbH
+0x2829D9, GlobalBeiMing technology (Beijing)Co. Ltd
+0x282CB2, TP-LINK TECHNOLOGIES CO.,LTD.
+0x283152, HUAWEI TECHNOLOGIES CO.,LTD
+0x283410, Enigma Diagnostics Limited
+0x283737, Apple, Inc.
+0x2838CF, Gen2wave
+0x2839E7, Preceno Technology Pte.Ltd.
+0x283CE4, Huawei Technologies Co., Ltd
+0x28401A, C8 MediSensors, Inc.
+0x284121, OptiSense Network, LLC
+0x284846, GridCentric Inc.
+0x284C53, Intune Networks
+0x285132, Shenzhen Prayfly Technology Co.,Ltd
+0x285FDB, Huawei Device Co., Ltd
+0x286046, Lantech Communications Global, Inc.
+0x286094, CAPELEC
+0x286AB8, Apple, Inc.
+0x286ABA, Apple, Inc.
+0x286ED4, HUAWEI TECHNOLOGIES CO.,LTD
+0x287184, Spire Payments
+0x2872C5, Smartmatic Corp
+0x2872F0, ATHENA
+0x28852D, Touch Networks
+0x288915, CashGuard Sverige AB
+0x2891D0, Stage Tec Entwicklungsgesellschaft für professionelle Audiotechnik mbH
+0x28924A, Hewlett Packard
+0x2893FE, CISCO SYSTEMS, INC.
+0x28940F, CISCO SYSTEMS, INC.
+0x28987B, Samsung Electronics Co.,Ltd
+0x289A4B, SteelSeries ApS
+0x289EDF, Danfoss Turbocor Compressors, Inc
+0x28A186, enblink
+0x28A192, GERP Solution
+0x28A574, Miller Electric Mfg. Co.
+0x28AF0A, Sirius XM Radio Inc
+0x28B0CC, Xenya d.o.o.
+0x28B2BD, Intel Corporate
+0x28B3AB, Genmark Automation
+0x28BA18, NextNav, LLC
+0x28BE9B, Technicolor USA Inc.
+0x28C0DA, Juniper Networks
+0x28C68E, NETGEAR INC.,
+0x28C718, Altierre
+0x28C914, Taimag Corporation
+0x28CBEB, One
+0x28CC01, Samsung Electronics Co.,Ltd
+0x28CCFF, Corporacion Empresarial Altra SL
+0x28CD1C, Espotel Oy
+0x28CD4C, Individual Computers GmbH
+0x28CD9C, Shenzhen Dynamax Software Development Co.,Ltd.
+0x28CFDA, Apple, Inc.
+0x28CFE9, Apple
+0x28D1AF, Nokia Corporation
+0x28D244, LCFC(HeFei) Electronics Technology Co., Ltd.
+0x28D576, Premier Wireless, Inc.
+0x28D997, Yuduan Mobile Co., Ltd.
+0x28E02C, Apple, Inc.
+0x28E297, Shanghai InfoTM Microelectronics Co.,Ltd.
+0x28E608, Tokheim
+0x28E794, Microtime Computer Inc.
+0x28E7CF, Apple, Inc.
+0x28ED58, JAG Jakob AG
+0x28EE2C, Frontline Test Equipment
+0x28EF01, PRIVATE
+0x28F358, 2C - Trifonov & Co
+0x28F606, Syes srl
+0x28FBD3, Shanghai RagenTek Communication Technology Co.,Ltd.
+0x2C002C, UNOWHY
+0x2C0033, EControls, LLC
+0x2C00F7, XOS
+0x2C0623, Win Leader Inc.
+0x2C10C1, Nintendo Co., Ltd.
+0x2C1984, IDN Telecom, Inc.
+0x2C1EEA, AERODEV
+0x2C2172, Juniper Networks
+0x2C245F, Babolat VS
+0x2C26C5, zte corporation
+0x2C27D7, Hewlett-Packard Company
+0x2C282D, BBK COMMUNICATIAO TECHNOLOGY CO.,LTD.
+0x2C2D48, bct electronic GesmbH
+0x2C3068, Pantech Co.,Ltd
+0x2C3427, ERCO & GENER
+0x2C3557, ELLIY Power CO..Ltd
+0x2C36A0, Capisco Limited
+0x2C36F8, CISCO SYSTEMS, INC.
+0x2C3996, SAGEMCOM
+0x2C3A28, Fagor Electrónica
+0x2C3BFD, Netstor Technology Co., Ltd.
+0x2C3F38, CISCO SYSTEMS, INC.
+0x2C3F3E, Alge-Timing GmbH
+0x2C4138, Hewlett-Packard Company
+0x2C4401, Samsung Electronics Co.,Ltd
+0x2C441B, Spectrum Medical Limited
+0x2C542D, CISCO SYSTEMS, INC.
+0x2C59E5, Hewlett Packard
+0x2C5AA3, PROMATE ELECTRONIC CO.LTD
+0x2C625A, Finest Security Systems Co., Ltd
+0x2C6289, Regenersis (Glenrothes) Ltd
+0x2C67FB, ShenZhen Zhengjili Electronics Co., LTD
+0x2C69BA, RF Controls, LLC
+0x2C6BF5, Juniper networks
+0x2C750F, Shanghai Dongzhou-Lawton Communication Technology Co. Ltd.
+0x2C768A, Hewlett-Packard Company
+0x2C7B5A, Milper Ltd
+0x2C7ECF, Onzo Ltd
+0x2C8065, HARTING Inc. of North America
+0x2C8158, Hon Hai Precision Ind. Co.,Ltd
+0x2C8BF2, Hitachi Metals America Ltd
+0x2C9127, Eintechno Corporation
+0x2C9717, I.C.Y. B.V.
+0x2C9E5F, Motorola Mobility, Inc.
+0x2C9EFC, CANON INC.
+0x2CA157, acromate, Inc.
+0x2CA780, True Technologies Inc.
+0x2CA835, RIM
+0x2CAB25, Shenzhen Gongjin Electronics Co.,Ltd
+0x2CB05D, NETGEAR
+0x2CB0DF, Soliton Technologies Pvt Ltd
+0x2CB43A, Apple
+0x2CB693, Radware
+0x2CB69D, RED Digital Cinema
+0x2CBE97, Ingenieurbuero Bickele und Buehler GmbH
+0x2CC260, Ravello Systems
+0x2CCD27, Precor Inc
+0x2CCD43, Summit Technology Group
+0x2CD05A, Liteon Technology Corporation
+0x2CD1DA, Sanjole, Inc.
+0x2CD2E7, Nokia Corporation
+0x2CD444, Fujitsu Limited
+0x2CDD0C, Discovergy GmbH
+0x2CE2A8, DeviceDesign
+0x2CE412, SAGEMCOM SAS
+0x2CE871, Alert Metalguard ApS
+0x2CEDEB, Alpheus Digital Company Limited
+0x2CEE26, Petroleum Geo-Services
+0x2CF203, EMKO ELEKTRONIK SAN VE TIC AS
+0x2CF4C5, Avaya, Inc
+0x30055C, Brother industries, LTD.
+0x300B9C, Delta Mobile Systems, Inc.
+0x300ED5, Hon Hai Precision Ind.Co.Ltd
+0x30142D, Piciorgros GmbH
+0x30144A, Wistron Neweb Corp.
+0x301518, Ubiquitous Communication Co. ltd.
+0x30168D, ProLon
+0x3017C8, Sony Ericsson Mobile Communications AB
+0x3018CF, DEOS control systems GmbH
+0x301A28, Mako Networks Ltd
+0x30215B, Shenzhen Ostar Display Electronic Co.,Ltd
+0x302DE8, JDA, LLC (JDA Systems)
+0x303294, W-IE-NE-R Plein & Baus GmbH
+0x3032D4, Hanilstm Co., Ltd.
+0x3037A6, CISCO SYSTEMS, INC.
+0x303855, Nokia Corporation
+0x303926, Sony Ericsson Mobile Communications AB
+0x303955, Shenzhen Jinhengjia Electronic Co., Ltd.
+0x3039F2, ADB Broadband Italia
+0x303D08, GLINTT TES S.A.
+0x304174, ALTEC LANSING LLC
+0x304449, PLATH GmbH
+0x30469A, NETGEAR
+0x30493B, Nanjing Z-Com Wireless Co.,Ltd
+0x304C7E, Panasonic Electric Works Automation Controls Techno Co.,Ltd.
+0x304EC3, Tianjin Techua Technology Co., Ltd.
+0x30525A, NST Co., LTD
+0x3055ED, Trex Network LLC
+0x3057AC, IRLAB LTD.
+0x305D38, Beissbarth
+0x306118, Paradom Inc.
+0x30688C, Reach Technology Inc.
+0x30694B, RIM
+0x306CBE, Skymotion Technology (HK) Limited
+0x306E5C, Validus Technologies
+0x3071B2, Hangzhou Prevail Optoelectronic Equipment Co.,LTD.
+0x3078C2, Innowireless, Co. Ltd.
+0x307C30, RIM
+0x307ECB, SFR
+0x3085A9, Asustek Computer Inc
+0x308730, Huawei Device Co., Ltd
+0x308999, Guangdong East Power Co.,
+0x308CFB, Dropcam
+0x3090AB, Apple
+0x3092F6, SHANGHAI SUNMON COMMUNICATION TECHNOGY CO.,LTD
+0x30AABD, Shanghai Reallytek Information Technology Co.,Ltd
+0x30AE7B, Deqing Dusun Electron CO., LTD
+0x30AEF6, Radio Mobile Access
+0x30B216, Hytec Geraetebau GmbH
+0x30B3A2, Shenzhen Heguang Measurement & Control Technology Co.,Ltd
+0x30C82A, Wi-Next s.r.l.
+0x30CDA7, Samsung Electronics ITS, Printer division
+0x30D357, Logosol, Inc.
+0x30D46A, Autosales Incorporated
+0x30DE86, Cedac Software S.r.l.
+0x30E48E, Vodafone UK
+0x30E4DB, CISCO SYSTEMS, INC.
+0x30EB25, INTEK DIGITAL
+0x30EFD1, Alstom Strongwish (Shenzhen) Co., Ltd.
+0x30F33A, +plugg srl
+0x30F70D, Cisco Systems
+0x30F7C5, Apple
+0x30F9ED, Sony Corporation
+0x30FD11, MACROTECH (USA) INC.
+0x3407FB, Ericsson AB
+0x340804, D-Link Corporation
+0x34159E, Apple, Inc
+0x342109, Jensen Scandinavia AS
+0x3423BA, Samsung Electro Mechanics co.,LTD.
+0x34255D, Shenzhen Loadcom Technology Co.,Ltd
+0x3429EA, MCD ELECTRONICS SP. Z O.O.
+0x342F6E, Anywire corporation
+0x3440B5, IBM
+0x344B3D, Fiberhome Telecommunication Tech.Co.,Ltd.
+0x344B50, ZTE Corporation
+0x344F69, EKINOPS SAS
+0x3451C9, Apple, Inc.
+0x345B11, EVI HEAT AB
+0x34684A, Teraworks Co., Ltd.
+0x346BD3, Huawei Technologies Co., Ltd
+0x346E8A, Ecosense
+0x346F92, White Rodgers Division
+0x3475C7, Avaya, Inc
+0x3476C5, I-O DATA DEVICE, INC.
+0x347877, O-NET Communications(Shenzhen) Limited
+0x347E39, Nokia Danmark A/S
+0x348137, UNICARD SA
+0x3482DE, Kayo Technology, Inc.
+0x348302, iForcom Co., Ltd
+0x348446, Ericsson AB
+0x34862A, Heinz Lackmann GmbH & Co KG
+0x3497FB, ADVANCED RF TECHNOLOGIES INC
+0x34996F, VPI Engineering
+0x3499D7, Universal Flow Monitors, Inc.
+0x349A0D, ZBD Displays Ltd
+0x34A183, AWare, Inc
+0x34A55D, TECHNOSOFT INTERNATIONAL SRL
+0x34A709, Trevil srl
+0x34A7BA, Fischer International Systems Corporation
+0x34A84E, Cisco
+0x34AA99, Alcatel-Lucent
+0x34AAEE, Mikrovisatos Servisas UAB
+0x34ADE4, Shanghai Chint Power Systems Co., Ltd.
+0x34AF2C, Nintendo Co., Ltd.
+0x34B1F7, Texas Instruments
+0x34B571, PLDS
+0x34BA51, Se-Kure Controls, Inc.
+0x34BA9A, Asiatelco Technologies Co.
+0x34BB1F, Research In Motion
+0x34BCA6, Beijing Ding Qing Technology, Ltd.
+0x34BDC8, Cisco Systems
+0x34BDF9, Shanghai WDK Industrial Co.,Ltd.
+0x34BDFA, Cisco SPVTG
+0x34C059, Apple
+0x34C3AC, Samsung Electronics
+0x34C69A, Enecsys Ltd
+0x34C731, ALPS Electric Co,. Ltd.
+0x34C803, Nokia Corporation
+0x34C99D, EIDOLON COMMUNICATIONS TECHNOLOGY CO. LTD.
+0x34CDBE, Huawei Technologies Co., Ltd
+0x34CE94, Parsec (Pty) Ltd
+0x34D09B, MobilMAX Technology Inc.
+0x34D2C4, RENA GmbH Print Systeme
+0x34D7B4, Tributary Systems, Inc.
+0x34DF2A, Fujikon Industrial Co.,Limited
+0x34E0CF, zte corporation
+0x34E0D7, DONGGUAN QISHENG ELECTRONICS INDUSTRIAL CO., LTD
+0x34EF44, 2Wire
+0x34EF8B, NTT Communications Corporation
+0x34F39B, WizLAN Ltd.
+0x34F62D, SHARP Corporation
+0x34F968, ATEK Products, LLC
+0x34FA40, Guangzhou Robustel Technologies Co., Limited
+0x34FC6F, ALCEA
+0x380197, Toshiba Samsung Storage Technolgoy Korea Corporation
+0x380A0A, Sky-City Communication and Electronics Limited Company
+0x380A94, Samsung Electronics Co.,Ltd
+0x380DD4, Primax Electronics LTD.
+0x380FE4, Dedicated Network Partners Oy
+0x3816D1, Samsung Electronics Co.,Ltd
+0x381766, PROMZAKAZ LTD.
+0x38192F, Nokia Corporation
+0x381C4A, SIMCom Wireless Solutions Co.,Ltd.
+0x38229D, ADB Broadband Italia
+0x3822D6, H3C Technologies Co., Limited
+0x3826CD, ANDTEK
+0x3828EA, Fujian Netcom Technology Co., LTD
+0x3831AC, WEG
+0x383F10, DBL Technology Ltd.
+0x384369, Patrol Products Consortium LLC
+0x38458C, MyCloud Technology corporation
+0x384608, ZTE Corporation
+0x38484C, Apple
+0x384FF0, Azurewave Technologies, Inc.
+0x38521A, Alcatel-Lucent 7705
+0x38580C, Panaccess Systems GmbH
+0x3859F9, Hon Hai Precision Ind. Co.,Ltd.
+0x385FC3, Yu Jeong System, Co.Ltd
+0x386077, PEGATRON CORPORATION
+0x3863F6, 3NOD MULTIMEDIA(SHENZHEN)CO.,LTD
+0x386645, OOSIC Technology CO.,Ltd
+0x386793, Asia Optical Co., Inc.
+0x386BBB, Motorola Mobility, Inc.
+0x386E21, Wasion Group Ltd.
+0x3872C0, COMTREND
+0x388345, TP-LINK TECHNOLOGIES CO., LTD.
+0x388AB7, ITC Networks
+0x388EE7, Fanhattan LLC
+0x3891FB, Xenox Holding BV
+0x389592, Beijing Tendyron Corporation
+0x389F83, OTN Systems N.V.
+0x38A5B6, SHENZHEN MEGMEET ELECTRICAL CO.,LTD
+0x38A851, Quickset International Inc
+0x38A86B, Orga BV
+0x38A95F, Actifio Inc
+0x38AA3C, SAMSUNG ELECTRO-MECHANICS
+0x38B12D, Sonotronic Nagel GmbH
+0x38B5BD, E.G.O. Elektro-Ger
+0x38BB23, OzVision America LLC
+0x38BC1A, Meizu technology co.,ltd
+0x38BF33, NEC CASIO Mobile Communications
+0x38C096, ALPS ELECTRIC CO.,LTD.
+0x38C7BA, CS Services Co.,Ltd.
+0x38C85C, Cisco SPVTG
+0x38D135, EasyIO Corporation Sdn. Bhd.
+0x38DE60, Mohlenhoff GmbH
+0x38E08E, Mitsubishi Electric Corporation
+0x38E595, Shenzhen Gongjin Electronics Co.,Ltd
+0x38E7D8, HTC Corporation
+0x38E8DF, b gmbh medien + datenbanken
+0x38E98C, Reco S.p.A.
+0x38EAA7, Hewlett Packard
+0x38ECE4, Samsung Electronics
+0x38EE9D, Anedo Ltd.
+0x38F597, home2net GmbH
+0x38F8B7, V2COM PARTICIPACOES S.A.
+0x38FEC5, Ellips B.V.
+0x3C02B1, Creation Technologies LP
+0x3C04BF, PRAVIS SYSTEMS Co.Ltd.,
+0x3C05AB, Product Creation Studio
+0x3C0754, Apple, Inc.
+0x3C0771, Sony Corporation
+0x3C081E, Beijing Yupont Electric Power Technology Co.,Ltd
+0x3C096D, Powerhouse Dynamics
+0x3C0FC1, KBC Networks
+0x3C106F, ALBAHITH TECHNOLOGIES
+0x3C1915, GFI Chrono Time
+0x3C197D, Ericsson AB
+0x3C1A79, Huayuan Technology CO.,LTD
+0x3C1CBE, JADAK LLC
+0x3C26D5, Sotera Wireless
+0x3C2763, SLE quality engineering GmbH & Co. KG
+0x3C2DB7, Texas Instruments
+0x3C2F3A, SFORZATO Corp.
+0x3C363D, Nokia Corporation
+0x3C3888, ConnectQuest, llc
+0x3C39C3, JW Electronics Co., Ltd.
+0x3C3A73, Avaya, Inc
+0x3C438E, Motorola Mobility, Inc.
+0x3C4A92, Hewlett-Packard Company
+0x3C4C69, Infinity System S.L.
+0x3C4E47, Etronic A/S
+0x3C57BD, Kessler Crane Inc.
+0x3C57D5, FiveCo
+0x3C5A37, Samsung Electronics
+0x3C5F01, Synerchip Co., Ltd.
+0x3C6200, Samsung electronics CO., LTD
+0x3C6278, SHENZHEN JETNET TECHNOLOGY CO.,LTD.
+0x3C672C, Sciovid Inc.
+0x3C6A7D, Niigata Power Systems Co., Ltd.
+0x3C6F45, Fiberpro Inc.
+0x3C6FF7, EnTek Systems, Inc.
+0x3C7059, MakerBot Industries
+0x3C7437, RIM
+0x3C754A, Motorola Mobility, Inc.
+0x3C7DB1, Texas Instruments
+0x3C81D8, SAGEMCOM SAS
+0x3C83B5, Advance Vision Electronics Co. Ltd.
+0x3C86A8, Sangshin elecom .co,, LTD
+0x3C8AE5, Tensun Information Technology(Hangzhou) Co.,LTD
+0x3C8BFE, Samsung Electronics
+0x3C9157, Hangzhou Yulong Conmunication Co.,Ltd
+0x3C9174, ALONG COMMUNICATION TECHNOLOGY
+0x3C94D5, Juniper Networks
+0x3C970E, Wistron InfoComm(Kunshan)Co.,Ltd.
+0x3C98BF, Quest Controls, Inc.
+0x3C99F7, Lansentechnology AB
+0x3C9F81, Shenzhen CATIC Bit Communications Technology Co.,Ltd
+0x3CA315, Bless Information & Communications Co., Ltd
+0x3CA72B, MRV Communications (Networks) LTD
+0x3CA9F4, Intel Corporate
+0x3CB15B, Avaya, Inc
+0x3CB17F, Wattwatchers Pty Ld
+0x3CB87A, PRIVATE
+0x3CB9A6, Belden Deutschland GmbH
+0x3CBDD8, LG ELECTRONICS INC
+0x3CC0C6, d&b audiotechnik GmbH
+0x3CC12C, AES Corporation
+0x3CC1F6, Melange Systems Pvt. Ltd.
+0x3CC243, Nokia Corporation
+0x3CC99E, Huiyang Technology Co., Ltd
+0x3CCE73, CISCO SYSTEMS, INC.
+0x3CD0F8, Apple, Inc.
+0x3CD16E, Telepower Communication Co., Ltd
+0x3CD7DA, SK Mtek microelectronics(shenzhen)limited
+0x3CD92B, Hewlett-Packard Company
+0x3CDF1E, CISCO SYSTEMS, INC.
+0x3CE072, Apple
+0x3CE5A6, Hangzhou H3C Technologies Co., Ltd.
+0x3CE5B4, KIDASEN INDUSTRIA E COMERCIO DE ANTENAS LTDA
+0x3CE624, LG Display
+0x3CEA4F, 2Wire
+0x3CEAFB, NSE AG
+0x3CF392, Virtualtek. Co. Ltd
+0x3CF52C, DSPECIALISTS GmbH
+0x3CF72A, Nokia Corporation
+0x3CFB96, Emcraft Systems LLC
+0x4001C6, 3COM EUROPE LTD
+0x40040C, A&T
+0x400E67, Tremol Ltd.
+0x4012E4, Compass-EOS
+0x4013D9, Global ES
+0x401597, Protect America, Inc.
+0x40169F, TP-LINK TECHNOLOGIES CO., LTD.
+0x4016FA, EKM Metering
+0x4018B1, Aerohive Networks Inc.
+0x4018D7, Wyle Telemetry and Data Systems
+0x401D59, Biometric Associates, LP
+0x4022ED, Digital Projection Ltd
+0x4025C2, Intel Corporate
+0x40270B, Mobileeco Co., Ltd
+0x402BA1, Sony Ericsson Mobile Communications AB
+0x402CF4, Universal Global Scientific Industrial Co., Ltd.
+0x403004, Apple, Inc.
+0x40336C, Godrej & Boyce Mfg. co. ltd
+0x4037AD, Macro Image Technology, Inc.
+0x403CFC, Apple, Inc.
+0x404022, ZIV
+0x40406B, Icomera
+0x404A03, ZyXEL Communications Corporation
+0x404D8E, Huawei Device Co., Ltd
+0x4050E0, Milton Security Group LLC
+0x40516C, Grandex International Corporation
+0x40520D, Pico Technology
+0x405539, CISCO SYSTEMS, INC.
+0x405A9B, ANOVO
+0x405FBE, RIM
+0x405FC2, Texas Instruments
+0x40605A, Hawkeye Tech Co. Ltd
+0x406186, MICRO-STAR INT'L CO.,LTD
+0x40618E, Stella-Green Co
+0x40667A, mediola - connected living AG
+0x406AAB, RIM
+0x406C8F, Apple, Inc.
+0x406F2A, Research In Motion
+0x40704A, Power Idea Technology Limited
+0x407074, Life Technology (China) Co., Ltd
+0x407B1B, Mettle Networks Inc.
+0x4083DE, Motorola
+0x408493, Clavister AB
+0x4088E0, Beijing Ereneben Information Technology Limited Shenzhen Branch
+0x408A9A, TITENG CO., Ltd.
+0x408B07, Actiontec Electronics, Inc
+0x408BF6, Shenzhen TCL New Technology Co; Ltd.
+0x409558, Aisino Corporation
+0x4097D1, BK Electronics cc
+0x40984C, Casacom Solutions AG
+0x40984E, Texas Instruments
+0x40987B, Aisino Corporation
+0x409FC7, BAEKCHUN I&C Co., Ltd.
+0x40A6A4, PassivSystems Ltd
+0x40A6D9, Apple, Inc.
+0x40AC8D, Data Management, Inc.
+0x40B0FA, LG Electronics
+0x40B2C8, Nortel Networks
+0x40B395, Apple
+0x40B3FC, Logital Co. Limited
+0x40B4F0, Juniper Networks
+0x40B7F3, Motorola Mobility, Inc.
+0x40BA61, Arima Communications Corp.
+0x40BC8B, itelio GmbH
+0x40BF17, Digistar Telecom. SA
+0x40C245, Shenzhen Hexicom Technology Co., Ltd.
+0x40C4D6, ChongQing Camyu Technology Development Co.,Ltd.
+0x40C7C9, Naviit Inc.
+0x40CBA8, Huawei Technologies Co., Ltd
+0x40CD3A, Z3 Technology
+0x40D32D, Apple, Inc
+0x40D40E, Biodata Ltd
+0x40D559, MICRO S.E.R.I.
+0x40D855, IEEE REGISTRATION AUTHORITY
+0x40E730, DEY Storage Systems, Inc.
+0x40E793, Shenzhen Siviton Technology Co.,Ltd
+0x40ECF8, Siemens AG
+0x40EF4C, Fihonest communication co.,Ltd
+0x40F14C, ISE Europe SPRL
+0x40F2E9, IBM
+0x40F407, Nintendo Co., Ltd.
+0x40F4EC, CISCO SYSTEMS, INC.
+0x40F52E, Leica Microsystems (Schweiz) AG
+0x40FC89, Motorola Mobility, Inc.
+0x4403A7, Cisco
+0x440CFD, NetMan Co., Ltd.
+0x441319, WKK TECHNOLOGY LTD.
+0x44184F, Fitview
+0x4419B6, Hangzhou Hikvision Digital Technology Co.,Ltd.
+0x441EA1, Hewlett-Packard Company
+0x4423AA, Farmage Co., Ltd.
+0x4425BB, Bamboo Entertainment Corporation
+0x442A60, Apple, Inc.
+0x442B03, CISCO SYSTEMS, INC.
+0x44322A, Avaya, Inc
+0x4432C8, Technicolor USA Inc.
+0x44334C, Shenzhen Bilian electronic CO.,LTD
+0x44348F, MXT INDUSTRIAL LTDA
+0x443719, 2 Save Energy Ltd
+0x44376F, Young Electric Sign Co
+0x4437E6, Hon Hai Precision Ind.Co.Ltd
+0x443839, Cumulus Networks, inc
+0x4439C4, Universal Global Scientific Industrial Co.,Ltd
+0x443D21, Nuvolt
+0x443EB2, DEOTRON Co., LTD.
+0x444C0C, Apple Inc
+0x444E1A, Samsung Electronics Co.,Ltd
+0x444F5E, Pan Studios Co.,Ltd.
+0x4451DB, Raytheon BBN Technologies
+0x4454C0, Thompson Aerospace
+0x44568D, PNC Technologies Co., Ltd.
+0x4456B7, Spawn Labs, Inc
+0x445829, Cisco SPVTG
+0x44599F, Criticare Systems, Inc
+0x445EF3, Tonalite Holding B.V.
+0x445F7A, Shihlin Electric & Engineering Corp.
+0x446132, ecobee inc
+0x44619C, FONsystem co. ltd.
+0x4468AB, JUIN COMPANY, LIMITED
+0x446C24, Reallin Electronic Co.,Ltd
+0x446D57, Liteon Technology Corporation
+0x447C7F, Innolight Technology Corporation
+0x447DA5, VTION INFORMATION TECHNOLOGY (FUJIAN) CO.,LTD
+0x447E95, Alpha and Omega, Inc
+0x448312, Star-Net
+0x448500, Intel Corporation
+0x4487FC, ELITEGROUP COMPUTER SYSTEM CO., LTD.
+0x448C52, KTIS CO., Ltd
+0x448E12, DT Research, Inc.
+0x448E81, VIG
+0x4491DB, Shanghai Huaqin Telecom Technology Co.,Ltd
+0x4494FC, NETGEAR INC.,
+0x4495FA, Qingdao Santong Digital Technology Co.Ltd
+0x449B78, The Now Factory
+0x449CB5, Alcomp, Inc
+0x44A42D, TCT Mobile Limited
+0x44A689, PROMAX ELECTRONICA SA
+0x44A7CF, Murata Manufacturing Co., Ltd.
+0x44A8C2, SEWOO TECH CO., LTD
+0x44AA27, udworks Co., Ltd.
+0x44AAE8, Nanotec Electronic GmbH & Co. KG
+0x44ADD9, Cisco
+0x44B382, Kuang-chi Institute of Advanced Technology
+0x44C15C, Texas Instruments
+0x44C233, Guangzhou Comet Technology Development Co.Ltd
+0x44C39B, OOO RUBEZH NPO
+0x44C9A2, Greenwald Industries
+0x44D15E, Shanghai Kingto Information Technology Ltd
+0x44D2CA, Anvia TV Oy
+0x44D3CA, CISCO SYSTEMS, INC.
+0x44D63D, Talari Networks
+0x44D832, Azurewave Technologies, Inc.
+0x44D884, Apple, Inc.
+0x44DC91, PLANEX COMMUNICATIONS INC.
+0x44DCCB, SEMINDIA SYSTEMS PVT LTD
+0x44E08E, Cisco SPVTG
+0x44E49A, OMNITRONICS PTY LTD
+0x44E4D9, CISCO SYSTEMS, INC.
+0x44E8A5, Myreka Technologies Sdn. Bhd.
+0x44ED57, Longicorn, inc.
+0x44F459, Samsung Electronics
+0x44F849, Union Pacific Railroad
+0x44FB42, Apple
+0x48022A, B-Link Electronic Limited
+0x480362, DESAY ELECTRONICS(HUIZHOU)CO.,LTD
+0x481249, Luxcom Technologies Inc.
+0x4813F3, BBK Electronics Corp., Ltd.
+0x48174C, MicroPower technologies
+0x481BD2, Intron Scientific co., ltd.
+0x48282F, ZTE Corporation
+0x482CEA, Motorola Inc Business Light Radios
+0x4833DD, ZENNIO AVANCE Y TECNOLOGIA, S.L.
+0x48343D, IEP GmbH
+0x484487, Cisco SPVTG
+0x4844F7, Samsung Electronics Co., LTD
+0x4846F1, Uros Oy
+0x485261, SOREEL
+0x485A3F, WISOL
+0x485B39, ASUSTek COMPUTER INC.
+0x485D60, Azurewave Technologies, Inc.
+0x4860BC, Apple, Inc.
+0x4861A3, Concern "Axion" JSC
+0x486B91, Fleetwood Group Inc.
+0x486FD2, StorSimple Inc
+0x487119, SGB GROUP LTD.
+0x488E42, DIGALOG GmbH
+0x489153, Weinmann Geräte für Medizin GmbH + Co. KG
+0x4891F6, Shenzhen Reach software technology CO.,LTD
+0x489BE2, SCI Innovations Ltd
+0x48A22D, Shenzhen Huaxuchang Telecom Technology Co.,Ltd
+0x48A6D2, GJsun Optical Science and Tech Co.,Ltd.
+0x48AA5D, Store Electronic Systems
+0x48B253, Marketaxess Corporation
+0x48B8DE, HOMEWINS TECHNOLOGY CO.,LTD.
+0x48B9C2, Teletics Inc.
+0x48BE2D, Symanitron
+0x48C1AC, PLANTRONICS, INC.
+0x48C862, Simo Wireless,Inc.
+0x48C8B6, SysTec GmbH
+0x48CB6E, Cello Electronics (UK) Ltd
+0x48D54C, Jeda Networks
+0x48D7FF, BLANKOM Antennentechnik GmbH
+0x48D8FE, ClarIDy Solutions, Inc.
+0x48DCFB, Nokia Corporation
+0x48DF1C, Wuhan NEC Fibre Optic Communications industry Co. Ltd
+0x48E1AF, Vity
+0x48EA63, Zhejiang Uniview Technologies Co., Ltd.
+0x48EB30, ETERNA TECHNOLOGY, INC.
+0x48ED80, daesung eltec
+0x48F230, Ubizcore Co.,LTD
+0x48F317, PRIVATE
+0x48F47D, TechVision Holding Internation Limited
+0x48F7F1, Alcatel-Lucent
+0x48F8B3, Cisco-Linksys, LLC
+0x48F8E1, Alcatel Lucent WT
+0x48F925, Maestronic
+0x48FCB8, Woodstream Corporation
+0x4C022E, CMR KOREA CO., LTD
+0x4C0289, LEX COMPUTECH CO., LTD
+0x4C068A, Basler Electric Company
+0x4C07C9, COMPUTER OFFICE Co.,Ltd.
+0x4C09B4, zte corporation
+0x4C0B3A, TCT Mobile Limited
+0x4C0F6E, Hon Hai Precision Ind. Co.,Ltd.
+0x4C0FC7, Earda Electronics Co.,Ltd
+0x4C1480, NOREGON SYSTEMS, INC
+0x4C17EB, SAGEMCOM
+0x4C1A3A, PRIMA Research And Production Enterprise Ltd.
+0x4C1A95, Novakon Co., Ltd.
+0x4C1FCC, HUAWEI TECHNOLOGIES CO.,LTD
+0x4C2258, cozybit, Inc.
+0x4C2578, Nokia Corporation
+0x4C2C80, Beijing Skyway Technologies Co.,Ltd
+0x4C2F9D, ICM Controls
+0x4C3089, Thales Transportation Systems GmbH
+0x4C322D, TELEDATA NETWORKS
+0x4C32D9, M Rutty Holdings Pty. Ltd.
+0x4C3910, Newtek Electronics co., Ltd.
+0x4C3B74, VOGTEC(H.K.) Co., Ltd
+0x4C4B68, Mobile Device, Inc.
+0x4C4E35, Cisco
+0x4C5427, Linepro Sp. z o.o.
+0x4C5499, Huawei Device Co., Ltd
+0x4C5585, Hamilton Systems
+0x4C5DCD, Oy Finnish Electric Vehicle Technologies Ltd
+0x4C5FD2, Alcatel-Lucent
+0x4C60D5, airPointe of New Hampshire
+0x4C60DE, NETGEAR
+0x4C6255, SANMINA-SCI SYSTEM DE MEXICO S.A. DE C.V.
+0x4C63EB, Application Solutions (Electronics and Vision) Ltd
+0x4C64D9, Guangdong Leawin Group Co., Ltd
+0x4C72B9, Pegatron Corporation
+0x4C7367, Genius Bytes Software Solutions GmbH
+0x4C73A5, KOVE
+0x4C774F, Embedded Wireless Labs
+0x4C7897, Arrowhead Alarm Products Ltd
+0x4C79BA, Intel Corporate
+0x4C804F, Armstrong Monitoring Corp
+0x4C8093, Intel Corporate
+0x4C82CF, Echostar Technologies
+0x4C8B55, Grupo Digicon
+0x4C8BEF, Huawei Technologies Co., Ltd
+0x4C8D79, Apple
+0x4C8FA5, Jastec
+0x4C98EF, Zeo
+0x4C9E80, KYOKKO ELECTRIC Co., Ltd.
+0x4C9EE4, Hanyang Navicom Co.,Ltd.
+0x4CA74B, Alcatel Lucent
+0x4CAA16, AzureWave Technologies (Shanghai) Inc.
+0x4CAB33, KST technology
+0x4CAC0A, ZTE Corporation
+0x4CB16C, HUAWEI TECHNOLOGIES CO.,LTD
+0x4CB199, Apple, Inc.
+0x4CB4EA, HRD (S) PTE., LTD.
+0x4CB9C8, CONET CO., LTD.
+0x4CBAA3, Bison Electronics Inc.
+0x4CBCA5, Samsung Electronics Co.,Ltd
+0x4CC452, Shang Hai Tyd. Electon Technology Ltd.
+0x4CC602, Radios, Inc.
+0x4CC94F, Alcatel-Lucent
+0x4CCA53, Skyera, Inc.
+0x4CCC34, Motorola Solutions Inc.
+0x4CE676, Buffalo Inc.
+0x4CEB42, Intel Corporate
+0x4CEDDE, Askey Computer Corp
+0x4CF737, SamJi Electronics Co., Ltd
+0x50008C, Hong Kong Telecommunications (HKT) Limited
+0x5001BB, Samsung Electronics
+0x50053D, CyWee Group Ltd
+0x500604, Cisco
+0x500B32, Foxda Technology Industrial(ShenZhen)Co.,LTD
+0x500E6D, TrafficCast International
+0x5011EB, SilverNet Ltd
+0x502267, PixeLINK
+0x50252B, Nethra Imaging Incorporated
+0x502690, Fujitsu Limited
+0x502A7E, Smart electronic GmbH
+0x502A8B, Telekom Research and Development Sdn Bhd
+0x502D1D, Nokia Corporation
+0x502DA2, Intel Corporate
+0x502DF4, Phytec Messtechnik GmbH
+0x502ECE, Asahi Electronics Co.,Ltd
+0x503275, Samsung Electronics Co.,Ltd
+0x503955, Cisco SPVTG
+0x503DE5, CISCO SYSTEMS, INC.
+0x503F56, Syncmold Enterprise Corp
+0x50465D, ASUSTek COMPUTER INC.
+0x5048EB, BEIJING HAIHEJINSHENG NETWORK TECHNOLOGY CO. LTD.
+0x504A5E, Masimo Corporation
+0x504F94, Loxone Electronics GmbH
+0x505663, Texas Instruments
+0x5057A8, CISCO SYSTEMS, INC.
+0x505AC6, GUANGDONG SUPER TELECOM CO.,LTD.
+0x506028, Xirrus Inc.
+0x5061D6, Indu-Sol GmbH
+0x506313, Hon Hai Precision Ind. Co.,Ltd.
+0x506441, Greenlee
+0x5067F0, ZyXEL Communications Corporation
+0x506F9A, Wi-Fi Alliance
+0x5070E5, He Shan World Fair Electronics Technology Limited
+0x50724D, BEG Brueck Electronic GmbH
+0x5076A6, Ecil Informatica Ind. Com. Ltda
+0x50795B, Interexport Telecomunicaciones S.A.
+0x507D02, BIODIT
+0x507E5D, Arcadyan Technology Corporation
+0x5087B8, Nuvyyo Inc
+0x508A42, Uptmate Technology Co., LTD
+0x508ACB, SHENZHEN MAXMADE TECHNOLOGY CO., LTD.
+0x508C77, DIRMEIER Schanktechnik GmbH &Co KG
+0x508D6F, CHAHOO Limited
+0x50934F, Gradual Tecnologia Ltda.
+0x509772, Westinghouse Digital
+0x509F27, Huawei Technologies Co., Ltd
+0x50A4C8, Samsung Electronics Co.,Ltd
+0x50A6E3, David Clark Company
+0x50A715, Aboundi, Inc.
+0x50A733, Ruckus Wireless
+0x50ABBF, Hoseo Telecom
+0x50AF73, Shenzhen Bitland Information Technology Co., Ltd.
+0x50B7C3, Samsung Electronics Co.,LTD
+0x50C58D, Juniper Networks
+0x50C971, GN Netcom A/S
+0x50CCF8, Samsung Electro Mechanics
+0x50CD32, NanJing Chaoran Science & Technology Co.,Ltd.
+0x50CE75, Measy Electronics Ltd
+0x50D274, Steffes Corporation
+0x50D6D7, Takahata Precision
+0x50E549, GIGA-BYTE TECHNOLOGY CO.,LTD.
+0x50EAD6, Apple, Inc.
+0x50EB1A, Brocade Communications Systems, Inc.
+0x50ED94, Egatel SL
+0x50F003, Open Stack, Inc.
+0x50F520, Samsung Electronics Co.,Ltd
+0x50F61A, Kunshan JADE Technologies co., Ltd.
+0x50FAAB, L-tek d.o.o.
+0x50FC30, Treehouse Labs
+0x5403F5, EBN Technology Corp.
+0x540496, Gigawave LTD
+0x5404A6, ASUSTek COMPUTER INC.
+0x54055F, Alcatel Lucent
+0x54115F, Atamo Pty Ltd
+0x541DFB, Freestyle Energy Ltd
+0x541FD5, Advantage Electronics
+0x542018, Tely Labs
+0x542696, Apple
+0x542A9C, LSY Defense, LLC.
+0x543131, Raster Vision Ltd
+0x5435DF, Symeo GmbH
+0x543968, Edgewater Networks Inc
+0x543D37, Ruckus Wireless
+0x544249, Sony Corporation
+0x54466B, Shenzhen CZTIC Electronic Technology Co., Ltd
+0x544A05, wenglor sensoric gmbh
+0x5453ED, Sony Corporation
+0x545414, Digital RF Corea, Inc
+0x545EBD, NL Technologies
+0x545FA9, Teracom Limited
+0x5461EA, Zaplox AB
+0x547398, Toyo Electronics Corporation
+0x5474E6, Webtech Wireless
+0x5475D0, CISCO SYSTEMS, INC.
+0x54781A, Cisco
+0x547975, Nokia Corporation
+0x547F54, INGENICO
+0x547FA8, TELCO systems, s.r.o.
+0x547FEE, CISCO SYSTEMS, INC.
+0x5481AD, Eagle Research Corporation
+0x54847B, Digital Devices GmbH
+0x548922, Zelfy Inc
+0x548998, HUAWEI TECHNOLOGIES CO.,LTD
+0x5492BE, Samsung Electronics Co.,Ltd
+0x549478, Silvershore Technology Partners
+0x549A16, Uzushio Electric Co.,Ltd.
+0x549B12, Samsung Electronics
+0x549D85, EnerAccess inc
+0x54A04F, t-mac Technologies Ltd
+0x54A51B, Huawei Device Co., Ltd
+0x54A9D4, Minibar Systems
+0x54B620, SUHDOL E&C Co.Ltd.
+0x54CDA7, Fujian Shenzhou Electronic Co.,Ltd
+0x54D0ED, AXIM Communications
+0x54D1B0, Universal Laser Systems, Inc
+0x54D46F, Cisco SPVTG
+0x54DF63, Intrakey technologies GmbH
+0x54E032, Juniper Networks
+0x54E63F, ShenZhen LingKeWeiEr Technology Co., Ltd.
+0x54E6FC, TP-LINK TECHNOLOGIES CO., LTD.
+0x54F5B6, ORIENTAL PACIFIC INTERNATIONAL LIMITED
+0x54F666, Berthold Technologies GmbH and Co.KG
+0x54FDBF, Scheidt & Bachmann GmbH
+0x580556, Elettronica GF S.r.L.
+0x5808FA, Fiber Optic & telecommunication INC.
+0x580943, PRIVATE
+0x5809E5, Kivic Inc.
+0x581243, AcSiP Technology Corp.
+0x581626, Avaya, Inc
+0x58170C, Sony Ericsson Mobile Communications AB
+0x581D91, Advanced Mobile Telecom co.,ltd.
+0x581FAA, Apple, Inc.
+0x581FEF, Tuttnaer LTD
+0x582EFE, Lighting Science Group
+0x582F42, Universal Electric Corporation
+0x58343B, Glovast Technology Ltd.
+0x5835D9, CISCO SYSTEMS, INC.
+0x583CC6, Omneality Ltd.
+0x5842E4, Sigma International General Medical Apparatus, LLC.
+0x5846E1, Baxter Healthcare
+0x5848C0, COFLEC
+0x5849BA, Chitai Electronic Corp.
+0x584C19, Chongqing Guohong Technology Development Company Limited
+0x584CEE, Digital One Technologies, Limited
+0x585076, Linear Equipamentos Eletronicos SA
+0x5850E6, Best Buy Corporation
+0x5855CA, Apple, Inc.
+0x58570D, Danfoss Solar Inverters
+0x5865E6, INFOMARK CO., LTD.
+0x5866BA, Hangzhou H3C Technologies Co., Limited
+0x58671A, BARNES&NOBLE.COM
+0x58677F, Clare Controls Inc.
+0x58696C, Fujian Ruijie Networks co, ltd
+0x5869F9, Fusion Transactive Ltd.
+0x586D8F, Cisco-Linksys, LLC
+0x586ED6, PRIVATE
+0x587521, CJSC RTSoft
+0x587675, Beijing ECHO Technologies Co.,Ltd
+0x587FC8, S2M
+0x5884E4, IP500 Alliance e.V.
+0x58874C, LITE-ON CLEAN ENERGY TECHNOLOGY CORP.
+0x5887E2, Shenzhen Coship Electronics Co., Ltd.
+0x588D09, CISCO SYSTEMS, INC.
+0x5891CF, Intel Corporate
+0x58920D, Kinetic Avionics Limited
+0x589396, Ruckus Wireless
+0x58946B, Intel Corporate
+0x5894CF, Vertex Standard LMR, Inc.
+0x58971E, Cisco
+0x589835, Technicolor
+0x58986F, Revolution Display
+0x58A76F, iD corporation
+0x58B035, Apple, Inc
+0x58B0D4, ZuniData Systems Inc.
+0x58B9E1, Crystalfontz America, Inc.
+0x58BC27, CISCO SYSTEMS, INC.
+0x58BDA3, Nintendo Co., Ltd.
+0x58BFEA, CISCO SYSTEMS, INC.
+0x58C232, NEC Corporation
+0x58C38B, Samsung Electronics
+0x58CF4B, Lufkin Industries
+0x58D071, BW Broadcast
+0x58D08F, IEEE 1904.1 Working Group
+0x58D6D3, Dairy Cheq Inc
+0x58DB8D, Fast Co., Ltd.
+0x58E476, CENTRON COMMUNICATIONS TECHNOLOGIES FUJIAN CO.,LTD
+0x58E636, EVRsafe Technologies
+0x58E747, Deltanet AG
+0x58E808, AUTONICS CORPORATION
+0x58EB14, Proteus Digital Health
+0x58ECE1, Newport Corporation
+0x58EECE, Icon Time Systems
+0x58F67B, Xia Men UnionCore Technology LTD.
+0x58F6BF, Kyoto University
+0x58F98E, SECUDOS GmbH
+0x58FD20, Bravida Sakerhet AB
+0x5C076F, Thought Creator
+0x5C0A5B, SAMSUNG ELECTRO-MECHANICS CO., LTD.
+0x5C0CBB, CELIZION Inc.
+0x5C0E8B, Motorola
+0x5C1437, Thyssenkrupp Aufzugswerke GmbH
+0x5C16C7, Big Switch Networks
+0x5C1737, I-View Now, LLC.
+0x5C17D3, LGE
+0x5C18B5, Talon Communications
+0x5C20D0, Asoni Communication Co., Ltd.
+0x5C22C4, DAE EUN ELETRONICS CO., LTD
+0x5C2479, Baltech AG
+0x5C260A, Dell Inc.
+0x5C338E, Alpha Networkc Inc.
+0x5C353B, Compal Broadband Networks Inc.
+0x5C35DA, There Corporation Oy
+0x5C38E0, Shanghai Super Electronics Technology Co.,LTD
+0x5C4058, Jefferson Audio Video Systems, Inc.
+0x5C43D2, HAZEMEYER
+0x5C4A26, Enguity Technology Corp
+0x5C4CA9, Huawei Device Co., Ltd
+0x5C5015, CISCO SYSTEMS, INC.
+0x5C514F, Intel Corporate
+0x5C56ED, 3pleplay Electronics Private Limited
+0x5C571A, ARRIS Group, Inc.
+0x5C57C8, Nokia Corporation
+0x5C5948, Apple, Inc.
+0x5C5EAB, Juniper Networks
+0x5C63BF, TP-LINK TECHNOLOGIES CO., LTD.
+0x5C6984, NUVICO
+0x5C6A7D, KENTKART EGE ELEKTRONIK SAN. VE TIC. LTD. STI.
+0x5C6B32, Texas Instruments
+0x5C6D20, Hon Hai Precision Ind. Co.,Ltd.
+0x5C6F4F, S.A. SISTEL
+0x5C7757, Haivision Network Video
+0x5C7D5E, Huawei Technologies Co., Ltd
+0x5C8486, Brightsource Industries Israel LTD
+0x5C864A, Secret Labs LLC
+0x5C8778, Cybertelbridge co.,ltd
+0x5C89D4, Beijing Banner Electric Co.,Ltd
+0x5C95AE, Apple Inc
+0x5C969D, Apple
+0x5C9AD8, Fujitsu Limited
+0x5CA39D, SAMSUNG ELECTRO-MECHANICS CO., LTD.
+0x5CAC4C, Hon Hai Precision Ind. Co.,Ltd.
+0x5CB524, Sony Ericsson Mobile Communications AB
+0x5CBD9E, HONGKONG MIRACLE EAGLE TECHNOLOGY(GROUP) LIMITED
+0x5CC213, Fr. Sauter AG
+0x5CC6D0, Skyworth Digital technology(shenzhen)co.ltd.
+0x5CC9D3, PALLADIUM ENERGY ELETRONICA DA AMAZONIA LTDA
+0x5CCA32, Theben AG
+0x5CCEAD, CDYNE Corporation
+0x5CD135, Xtreme Power Systems
+0x5CD2E4, Intel Corporate
+0x5CD41B, UCZOON Technology Co., LTD
+0x5CD4AB, Zektor
+0x5CD998, D-Link Corporation
+0x5CDAD4, Murata Manufacturing Co., Ltd.
+0x5CE0CA, FeiTian United (Beijing) System Technology Co., Ltd.
+0x5CE0F6, NIC.br- Nucleo de Informacao e Coordenacao do Ponto BR
+0x5CE223, Delphin Technology AG
+0x5CE286, Nortel Networks
+0x5CE2F4, AcSiP Technology Corp.
+0x5CE8EB, Samsung Electronics
+0x5CEB4E, R. STAHL HMI Systems GmbH
+0x5CEE79, Global Digitech Co LTD
+0x5CF207, Speco Technologies
+0x5CF370, CC&C Technologies, Inc
+0x5CF3FC, IBM Corp
+0x5CF6DC, Samsung Electronics Co.,LTD
+0x5CF8A1, Murata Manufactuaring Co.,Ltd.
+0x5CF9DD, Dell Inc
+0x5CFF35, Wistron Corporation
+0x6002B4, Wistron NeWeb Corp.
+0x600F77, SilverPlus, Inc
+0x601199, Siama Systems Inc
+0x601283, Soluciones Tecnologicas para la Salud y el Bienestar SA
+0x6015C7, IdaTech
+0x60190C, RRAMAC
+0x601929, VOLTRONIC POWER TECHNOLOGY(SHENZHEN) CORP.
+0x601D0F, Midnite Solar
+0x601E02, EltexAlatau
+0x6021C0, Murata Manufactuaring Co.,Ltd.
+0x602A54, CardioTek B.V.
+0x602AD0, Cisco SPVTG
+0x6032F0, Mplus technology
+0x60334B, Apple, Inc.
+0x603553, Buwon Technology
+0x6036DD, Intel Corporate
+0x60380E, Alps Electric Co.,
+0x60391F, ABB Ltd
+0x603FC5, COX CO., LTD
+0x6044F5, Easy Digital Ltd.
+0x60455E, Liptel s.r.o.
+0x6045BD, Microsoft
+0x604616, XIAMEN VANN INTELLIGENT CO., LTD
+0x604A1C, SUYIN Corporation
+0x6052D0, FACTS Engineering
+0x605464, Eyedro Green Solutions Inc.
+0x60601F, SZ DJI TECHNOLOGY CO.,LTD
+0x6063FD, Transcend Communication Beijing Co.,Ltd.
+0x606720, Intel Corporate
+0x606BBD, Samsung Electronics Co., LTD
+0x606C66, Intel Corporate
+0x60735C, Cisco
+0x60748D, Atmaca Elektronik
+0x607688, Velodyne
+0x6083B2, GkWare e.K.
+0x60843B, Soladigm, Inc.
+0x608645, Avery Weigh-Tronix, LLC
+0x60893C, Thermo Fisher Scientific P.O.A.
+0x6089B1, Key Digital Systems
+0x6089B7, KAEL MÜHENDİSLİK ELEKTRONİK TİCARET SANAYİ LİMİTED ŞİRKETİ
+0x608C2B, Hanson Technology
+0x608D17, Sentrus Government Systems Division, Inc
+0x609084, DSSD Inc
+0x609AA4, GVI SECURITY INC.
+0x609E64, Vivonic GmbH
+0x609F9D, CloudSwitch
+0x60A10A, Samsung Electronics Co.,Ltd
+0x60A44C, ASUSTek COMPUTER INC.
+0x60B185, ATH system
+0x60B3C4, Elber Srl
+0x60B606, Phorus
+0x60B933, Deutron Electronics Corp.
+0x60B982, RO.VE.R. Laboratories S.p.A.
+0x60BB0C, Beijing HuaqinWorld Technology Co,Ltd
+0x60BC4C, EWM Hightec Welding GmbH
+0x60BD91, Move Innovation
+0x60C547, Apple, Inc.
+0x60C5A8, Beijing LT Honway Technology Co.,Ltd
+0x60C980, Trymus
+0x60CBFB, AirScape Inc.
+0x60CDC5, Taiwan Carol Electronics., Ltd
+0x60D0A9, Samsung Electronics Co.,Ltd
+0x60D1AA, Vishal Telecommunications Pvt Ltd
+0x60D2B9, REALAND BIO CO., LTD.
+0x60D30A, Quatius Limited
+0x60D819, Hon Hai Precision Ind. Co.,Ltd.
+0x60DA23, Estech Co.,Ltd
+0x60DE44, HUAWEI TECHNOLOGIES CO.,LTD
+0x60E00E, SHINSEI ELECTRONICS CO LTD
+0x60E956, Ayla Networks, Inc
+0x60EB69, Quanta computer Inc.
+0x60F13D, JABLOCOM s.r.o.
+0x60F281, TRANWO TECHNOLOGY CO., LTD.
+0x60F2EF, VisionVera International Co., Ltd.
+0x60F3DA, Logic Way GmbH
+0x60F494, Hon Hai Precision Ind. Co.,Ltd.
+0x60F59C, CRU-Dataport
+0x60F673, TERUMO CORPORATION
+0x60FACD, Apple, Inc.
+0x60FB42, Apple, Inc
+0x60FEC5, Apple
+0x6400F1, CISCO SYSTEMS, INC.
+0x64094C, Beijing Superbee Wireless Technology Co.,Ltd
+0x640E36, TAZTAG
+0x640E94, Pluribus Networks, Inc.
+0x640F28, 2wire
+0x641084, HEXIUM Technical Development Co., Ltd.
+0x64168D, CISCO SYSTEMS, INC.
+0x6416F0, Shehzhen Huawei Communication Technologies Co., Ltd.
+0x641A22, Heliospectra/Woodhill Investments
+0x641C67, DIGIBRAS INDUSTRIA DO BRASILS/A
+0x641E81, Dowslake Microsystems
+0x64200C, Apple, Inc.
+0x642216, Shandong Taixin Electronic co.,Ltd
+0x642400, Xorcom Ltd.
+0x642737, Hon Hai Precision Ind. Co.,Ltd.
+0x642DB7, SEUNGIL ELECTRONICS
+0x643150, Hewlett-Packard Company
+0x64317E, Dexin Corporation
+0x643409, BITwave Pte Ltd
+0x644346, GuangDong Quick Network Computer CO.,LTD
+0x644BC3, Shanghai WOASiS Telecommunications Ltd., Co.
+0x644BF0, CalDigit, Inc
+0x644D70, dSPACE GmbH
+0x644F74, LENUS Co., Ltd.
+0x64517E, LONG BEN (DONGGUAN) ELECTRONIC TECHNOLOGY CO.,LTD.
+0x645299, Chamberlain
+0x64535D, Frauscher Sensortechnik
+0x645422, Equinox Payments
+0x645563, Intelight Inc.
+0x64557F, NSFOCUS Information Technology Co., Ltd.
+0x645A04, Chicony Electronics Co., Ltd.
+0x645DD7, Shenzhen Lifesense Medical Electronics Co., Ltd.
+0x645EBE, Yahoo! JAPAN
+0x645FFF, Nicolet Neuro
+0x646223, Cellient Co., Ltd.
+0x6465C0, Nuvon, Inc
+0x6466B3, TP-LINK TECHNOLOGIES CO., LTD.
+0x646707, Beijing Omnific Technology, Ltd.
+0x64680C, COMTREND
+0x6469BC, Hytera Communications Co .,ltd
+0x646E6C, Radio Datacom LLC
+0x647002, TP-LINK TECHNOLOGIES CO., LTD.
+0x6472D8, GooWi Technology Co.,Limited
+0x6473E2, Arbiter Systems, Inc.
+0x647657, Innovative Security Designs
+0x647791, Samsung Electronics Co.,Ltd
+0x647BD4, Texas Instruments
+0x647C34, Ubee Interactive Corp.
+0x647D81, YOKOTA INDUSTRIAL CO,.LTD
+0x647FDA, TEKTELIC Communications Inc.
+0x64808B, VG Controls, Inc.
+0x648099, Intel Corporation
+0x648125, Alphatron Marine BV
+0x648788, Juniper Networks
+0x6487D7, ADB Broadband Italia
+0x64995D, LGE
+0x649968, Elentec
+0x6499A0, AG Elektronik AB
+0x649B24, V Technology Co., Ltd.
+0x649C8E, Texas Instruments
+0x649EF3, CISCO SYSTEMS, INC.
+0x649FF7, Kone OYj
+0x64A0E7, CISCO SYSTEMS, INC.
+0x64A232, OOO Samlight
+0x64A341, Wonderlan (Beijing) Technology Co., Ltd.
+0x64A3CB, Apple
+0x64A769, HTC Corporation
+0x64A837, Juni Korea Co., Ltd
+0x64AE0C, CISCO SYSTEMS, INC.
+0x64AE88, Polytec GmbH
+0x64B310, Samsung Electronics Co.,Ltd
+0x64B64A, ViVOtech, Inc.
+0x64B9E8, Apple, Inc
+0x64BC11, CombiQ AB
+0x64C5AA, South African Broadcasting Corporation
+0x64C667, Barnes&Noble
+0x64C6AF, AXERRA Networks Ltd
+0x64C944, LARK Technologies, Inc
+0x64D02D, Next Generation Integration (NGI)
+0x64D1A3, Sitecom Europe BV
+0x64D241, Keith & Koep GmbH
+0x64D4DA, Intel Corporate
+0x64D814, CISCO SYSTEMS, INC.
+0x64D912, Solidica, Inc.
+0x64D989, CISCO SYSTEMS, INC.
+0x64DB18, OpenPattern
+0x64DC01, Static Systems Group PLC
+0x64DE1C, Kingnetic Pte Ltd
+0x64E161, DEP Corp.
+0x64E599, EFM Networks
+0x64E682, Apple, Inc.
+0x64E84F, Serialway Communication Technology Co. Ltd
+0x64E8E6, global moisture management system
+0x64ED57, Motorola Mobility, Inc.
+0x64ED62, WOORI SYSTEMS Co., Ltd
+0x64F242, Gerdes Aktiengesellschaft
+0x64F50E, Kinion Technology Company Limited
+0x64F970, Kenade Electronics Technology Co.,LTD.
+0x64F987, Avvasi Inc.
+0x64FC8C, Zonar Systems
+0x6805CA, Intel Corporation
+0x680927, Apple, Inc.
+0x68122D, Special Instrument Development Co., Ltd.
+0x6815D3, Zaklady Elektroniki i Mechaniki Precyzyjnej R&G S.A.
+0x681605, Systems And Electronic Development FZCO
+0x681729, Intel Corporate
+0x681AB2, zte corporation
+0x681CA2, Rosewill Inc.
+0x681E8B, InfoSight Corporation
+0x681FD8, Advanced Telemetry
+0x68234B, Nihon Dengyo Kousaku
+0x683B1E, Countwise LTD
+0x683EEC, ERECA
+0x684352, Bhuu Limited
+0x684B88, Galtronics Telemetry Inc.
+0x684CA8, Shenzhen Herotel Tech. Co., Ltd.
+0x6851B7, PowerCloud Systems, Inc.
+0x6854ED, Alcatel-Lucent - Nuage
+0x6854F5, enLighted Inc
+0x68597F, Alcatel Lucent
+0x685B35, Apple inc
+0x685B36, POWERTECH INDUSTRIAL CO., LTD.
+0x685D43, Intel Corporate
+0x685E6B, PowerRay Co., Ltd.
+0x686359, Advanced Digital Broadcast SA
+0x6869F2, ComAp s.r.o.
+0x686E23, Wi3 Inc.
+0x687251, Ubiquiti Networks
+0x68784C, Nortel Networks
+0x687924, ELS-GmbH & Co. KG
+0x6879ED, SHARP Corporation
+0x687CD5, Y Soft Corporation, a.s.
+0x687F74, Cisco-Linksys, LLC
+0x68831A, Pandora Mobility Corporation
+0x688470, eSSys Co.,Ltd
+0x688540, IGI Mobile, Inc.
+0x6886A7, Cisco
+0x6886E7, Orbotix, Inc.
+0x68876B, INQ Mobile Limited
+0x689234, Ruckus Wireless
+0x689423, Hon Hai Precision Ind. Co.,Ltd.
+0x68967B, Apple Inc
+0x68974B, Shenzhen Costar Electronics Co. Ltd.
+0x6897E8, Society of Motion Picture &amp; Television Engineers
+0x689C5E, AcSiP Technology Corp.
+0x68A1B7, Honghao Mingchuan Technology (Beijing) CO.,Ltd.
+0x68A3C4, Liteon Technology Corporation
+0x68A40E, BSH Bosch and Siemens Home Appliances GmbH
+0x68A86D, Apple, Inc.
+0x68AAD2, DATECS LTD.,
+0x68AB8A, RF IDeas
+0x68AF13, Futura Mobility
+0x68B094, INESA ELECTRON CO.,LTD
+0x68B43A, WaterFurnace International, Inc.
+0x68B599, Hewlett-Packard Company
+0x68B6FC, Hitron Technologies. Inc
+0x68B8D9, Act KDE, Inc.
+0x68BC0C, CISCO SYSTEMS, INC.
+0x68BDAB, CISCO SYSTEMS, INC.
+0x68CA00, Octopus Systems Limited
+0x68CC9C, Mine Site Technologies
+0x68CD0F, U Tek Company Limited
+0x68CE4E, L-3 Communications Infrared Products
+0x68D1FD, Shenzhen Trimax Technology Co.,Ltd
+0x68D925, ProSys Development Services
+0x68DB67, Nantong Coship Electronics Co., Ltd
+0x68DB96, OPWILL Technologies CO .,LTD
+0x68DCE8, PacketStorm Communications
+0x68E41F, Unglaube Identech GmbH
+0x68EBAE, Samsung Electronics Co.,Ltd
+0x68EBC5, Angstrem Telecom
+0x68EC62, YODO Technology Corp. Ltd.
+0x68ED43, Research In Motion
+0x68EFBD, CISCO SYSTEMS, INC.
+0x68F125, Data Controls Inc.
+0x68F895, Redflow Limited
+0x68FB95, Generalplus Technology Inc.
+0x6C0460, RBH Access Technologies Inc.
+0x6C0E0D, Sony Ericsson Mobile Communications AB
+0x6C0F6A, JDC Tech Co., Ltd.
+0x6C1811, Decatur Electronics
+0x6C2056, Cisco
+0x6C22AB, Ainsworth Game Technology
+0x6C23B9, Sony Ericsson Mobile Communications AB
+0x6C2995, Intel Corporate
+0x6C2E33, Accelink Technologies Co.,Ltd.
+0x6C2E85, SAGEMCOM
+0x6C32DE, Indieon Technologies Pvt. Ltd.
+0x6C33A9, Magicjack LP
+0x6C391D, Beijing ZhongHuaHun Network Information center
+0x6C3A84, Shenzhen Aero-Startech. Co.Ltd
+0x6C3BE5, Hewlett Packard
+0x6C3E6D, Apple Inc
+0x6C3E9C, KE Knestel Elektronik GmbH
+0x6C40C6, Nimbus Data Systems, Inc.
+0x6C504D, CISCO SYSTEMS, INC.
+0x6C5A34, Shenzhen Haitianxiong Electronic Co., Ltd.
+0x6C5CDE, SunReports, Inc.
+0x6C5D63, ShenZhen Rapoo Technology Co., Ltd.
+0x6C5E7A, Ubiquitous Internet Telecom Co., Ltd
+0x6C6126, Rinicom Holdings
+0x6C626D, Micro-Star INT'L CO., LTD
+0x6C6F18, Stereotaxis, Inc.
+0x6C7039, Novar GmbH
+0x6C71D9, AzureWave Technologies, Inc
+0x6C81FE, Mitsuba Corporation
+0x6C8336, Samsung Electronics Co.,Ltd
+0x6C8686, Technonia
+0x6C8814, Intel Corporate
+0x6C8B2F, zte corporation
+0x6C8CDB, Otus Technologies Ltd
+0x6C8D65, Wireless Glue Networks, Inc.
+0x6C92BF, Inspur Electronic Information Industry Co.,Ltd.
+0x6C9AC9, Valentine Research, Inc.
+0x6C9B02, Nokia Corporation
+0x6C9CE9, Nimble Storage
+0x6C9CED, CISCO SYSTEMS, INC.
+0x6CA682, EDAM information & communications
+0x6CA780, Nokia Corporation
+0x6CA906, Telefield Ltd
+0x6CA96F, TransPacket AS
+0x6CAB4D, Digital Payment Technologies
+0x6CAC60, Venetex Corp
+0x6CAD3F, Hubbell Building Automation, Inc.
+0x6CADEF, KZ Broadband Technologies, Ltd.
+0x6CAE8B, IBM Corporation
+0x6CB311, Shenzhen Lianrui Electronics Co.,Ltd
+0x6CBEE9, Alcatel-Lucent-IPD
+0x6CC1D2, Motorola Mobility, Inc.
+0x6CC26B, Apple, Inc.
+0x6CD032, LG Electronics
+0x6CD146, Smartek d.o.o.
+0x6CD68A, LG Electronics Inc
+0x6CDC6A, Promethean Limited
+0x6CE0B0, SOUND4
+0x6CE4CE, Villiger Security Solutions AG
+0x6CE873, TP-LINK TECHNOLOGIES CO., LTD.
+0x6CE907, Nokia Corporation
+0x6CE983, Gastron Co., LTD.
+0x6CF049, GIGA-BYTE TECHNOLOGY CO.,LTD.
+0x6CF373, Samsung Electronics Co.,Ltd
+0x6CF37F, Aruba Networks
+0x6CFA58, Avaya, Inc
+0x6CFDB9, Proware Technologies Co Ltd.
+0x6CFFBE, MPB Communications Inc.
+0x700258, 01DB-METRAVIB
+0x700514, LG Electronics
+0x700BC0, Dewav Technology Company
+0x70105C, Cisco
+0x701124, Apple
+0x701404, Limited Liability Company "Research Center "Bresler"
+0x701A04, Liteon Tech Corp.
+0x701AED, ADVAS CO., LTD.
+0x702393, fos4X GmbH
+0x702526, Alcatel-Lucent
+0x702559, CyberTAN Technology, Inc.
+0x702B1D, E-Domus International Limited
+0x702F4B, PolyVision Inc.
+0x702F97, Aava Mobile Oy
+0x703018, Avaya, Inc
+0x703187, ACX GmbH
+0x7032D5, Athena Wireless Communications Inc
+0x703811, Invensys Rail
+0x7038B4, Low Tech Solutions
+0x7038EE, Avaya, Inc
+0x703AD8, Shenzhen Afoundry Electronic Co., Ltd
+0x703C39, SEAWING Kft
+0x7041B7, Edwards Lifesciences LLC
+0x704642, CHYNG HONG ELECTRONIC CO., LTD.
+0x704AAE, Xstream Flow (Pty) Ltd
+0x704AE4, Rinstrum Pty Ltd
+0x7052C5, Avaya, Inc.
+0x7054D2, PEGATRON CORPORATION
+0x7054F5, HUAWEI TECHNOLOGIES CO.,LTD
+0x705681, Apple Inc
+0x705812, Panasonic AVC Networks Company
+0x705AB6, COMPAL INFORMATION (KUNSHAN) CO., LTD.
+0x705CAD, Konami Gaming Inc
+0x705EAA, Action Target, Inc.
+0x706417, ORBIS TECNOLOGIA ELECTRICA S.A.
+0x706582, Suzhou Hanming Technologies Co., Ltd.
+0x706F81, PRIVATE
+0x70704C, Purple Communications, Inc
+0x7071BC, PEGATRON CORPORATION
+0x70723C, Huawei Technologies Co., Ltd
+0x7072CF, EdgeCore Networks
+0x7073CB, Apple, Inc.
+0x7076DD, Oxyguard International A/S
+0x7076F0, LevelOne Communications (India) Private Limited
+0x707BE8, HUAWEI TECHNOLOGIES CO.,LTD
+0x707E43, Motorola Mobility, Inc.
+0x707EDE, NASTEC LTD.
+0x708105, CISCO SYSTEMS, INC.
+0x70820E, as electronics GmbH
+0x70828E, OleumTech Corporation
+0x708B78, citygrow technology co., ltd
+0x7093F8, Space Monkey, Inc.
+0x709756, Happyelectronics Co.,Ltd
+0x709A0B, Italian Institute of Technology
+0x709BA5, Shenzhen Y&D Electronics Co.,LTD.
+0x709E86, X6D Limited
+0x70A191, Trendsetter Medical, LLC
+0x70A41C, Advanced Wireless Dynamics S.L.
+0x70A66A, Prox Dynamics AS
+0x70AAB2, Research In Motion
+0x70B035, Shenzhen Zowee Technology Co., Ltd
+0x70B08C, Shenou Communication Equipment Co.,Ltd
+0x70B265, Hiltron s.r.l.
+0x70B599, Embedded Technologies s.r.o.
+0x70B921, FiberHome Telecommunication Technologies CO.,LTD
+0x70CA9B, CISCO SYSTEMS, INC.
+0x70CD60, Apple, Inc.
+0x70D4F2, RIM
+0x70D57E, Scalar Corporation
+0x70D5E7, Wellcore Corporation
+0x70D6B6, Metrum Technologies
+0x70D880, Upos System sp. z o.o.
+0x70DDA1, Tellabs
+0x70DEE2, Apple, Inc.
+0x70E139, 3view Ltd
+0x70E24C, SAE IT-systems GmbH & Co. KG
+0x70E843, Beijing C&W Optical Communication Technology Co.,Ltd.
+0x70EE50, Netatmo
+0x70F1A1, Liteon Technology Corporation
+0x70F1E5, Xetawave LLC
+0x70F395, Universal Global Scientific Industrial Co., Ltd.
+0x70F927, Samsung Electronics
+0x740ABC, JSJS Designs (Europe) Limited
+0x741489, SRT Wireless
+0x7415E2, Tri-Sen Systems Corporation
+0x741E93, Fiberhome Telecommunication Tech.Co.,Ltd.
+0x74258A, Hangzhou H3C Technologies Co., Limited
+0x74273C, ChangYang Technology (Nanjing) Co., LTD
+0x7427EA, Elitegroup Computer Systems Co., Ltd.
+0x742B0F, Infinidat Ltd.
+0x742D0A, Norfolk Elektronik AG
+0x742F68, Azurewave Technologies, Inc.
+0x743170, Arcadyan Technology Corporation
+0x743256, NT-ware Systemprg GmbH
+0x74372F, Tongfang Shenzhen Cloudcomputing Technology Co.,Ltd
+0x743889, ANNAX Anzeigesysteme GmbH
+0x744401, NETGEAR
+0x74458A, Samsung Electronics Co.,Ltd
+0x7446A0, Hewlett Packard
+0x744D79, Arrive Systems Inc.
+0x745327, COMMSEN CO., LIMITED
+0x745612, Motorola Mobility, Inc.
+0x745798, TRUMPF Laser GmbH + Co. KG
+0x745E1C, PIONEER CORPORATION
+0x745F00, Samsung Semiconductor Inc.
+0x745FAE, TSL PPL
+0x7463DF, VTS GmbH
+0x7465D1, Atlinks
+0x746A89, Rezolt Corporation
+0x746B82, MOVEK
+0x7472F2, Chipsip Technology Co., Ltd.
+0x747818, ServiceAssure
+0x747B7A, ETH Inc.
+0x747DB6, Aliwei Communications, Inc
+0x747E1A, Red Embedded Design Limited
+0x747E2D, Beijing Thomson CITIC Digital Technology Co. LTD.
+0x74867A, Dell Inc PCBA Test
+0x74888B, ADB Broadband Italia
+0x748EF8, Brocade Communications Systems, Inc.
+0x749050, Renesas Electronics Corporation
+0x74911A, Ruckus Wireless
+0x7493A4, Zebra Technologies Corp.
+0x74943D, Hemisphere GPS
+0x749975, IBM Corporation
+0x749DDC, 2Wire
+0x74A4A7, QRS Music Technologies, Inc.
+0x74A722, LG Electronics
+0x74AE76, iNovo Broadband, Inc.
+0x74B00C, Network Video Technologies, Inc
+0x74B9EB, Fujian JinQianMao Electronic Technology Co.,Ltd
+0x74BE08, ATEK Products, LLC
+0x74BFA1, HYUNTECK
+0x74CD0C, Smith Myers Communications Ltd.
+0x74CE56, Packet Force Technology Limited Company
+0x74D02B, ASUSTek COMPUTER INC.
+0x74D0DC, ERICSSON AB
+0x74D675, WYMA Tecnologia
+0x74D850, Evrisko Systems
+0x74DE2B, Liteon Technology Corporation
+0x74E06E, Ergophone GmbH
+0x74E1B6, Apple, Inc.
+0x74E2F5, Apple Inc
+0x74E424, APISTE CORPORATION
+0x74E50B, Intel Corporate
+0x74E537, RADSPIN
+0x74E543, Liteon Technology Corporation
+0x74E7C6, Motorola Mobility, Inc.
+0x74EA3A, TP-LINK Technologies Co.,Ltd.
+0x74ECF1, Acumen
+0x74F06D, AzureWave Technologies, Inc.
+0x74F07D, BnCOM Co.,Ltd
+0x74F102, Beijing HCHCOM Technology Co., Ltd
+0x74F612, Motorola Mobility, Inc.
+0x74F726, Neuron Robotics
+0x74FDA0, Compupal (Group) Corporation
+0x74FE48, ADVANTECH CO., LTD.
+0x74FF7D, Wren Sound Systems, LLC
+0x78028F, Adaptive Spectrum and Signal Alignment (ASSIA), Inc.
+0x780738, Z.U.K. Elzab S.A.
+0x781185, NBS Payment Solutions Inc.
+0x7812B8, ORANTEK LIMITED
+0x781881, AzureWave Technologies, Inc.
+0x78192E, NASCENT Technology
+0x7819F7, Juniper Networks
+0x781C5A, SHARP Corporation
+0x781DBA, HUAWEI TECHNOLOGIES CO.,LTD
+0x781DFD, Jabil Inc
+0x781FDB, Samsung Electronics Co.,Ltd
+0x78223D, Affirmed Networks
+0x782544, Omnima Limited
+0x7825AD, SAMSUNG ELECTRONICS CO., LTD.
+0x782BCB, Dell Inc
+0x782EEF, Nokia Corporation
+0x7830E1, UltraClenz, LLC
+0x78324F, Millennium Group, Inc.
+0x783CE3, Kai-EE
+0x783F15, EasySYNC Ltd.
+0x784405, FUJITU(HONG KONG) ELECTRONIC Co.,LTD.
+0x784476, Zioncom technology co.,ltd
+0x7845C4, Dell Inc
+0x7846C4, DAEHAP HYPER-TECH
+0x78471D, Samsung Electronics Co.,Ltd
+0x78510C, LiveU Ltd.
+0x78521A, Samsung Electronics Co.,Ltd
+0x785262, Shenzhen Hojy Software Co., Ltd.
+0x78542E, D-Link International
+0x785517, SankyuElectronics
+0x785712, Mobile Integration Workgroup
+0x78593E, RAFI GmbH & Co.KG
+0x78595E, Samsung Electronics Co.,Ltd
+0x785C72, Hioso Technology Co., Ltd.
+0x78617C, MITSUMI ELECTRIC CO.,LTD
+0x7866AE, ZTEC Instruments, Inc.
+0x786C1C, Apple
+0x787F62, GiK mbH
+0x78818F, Server Racks Australia Pty Ltd
+0x78843C, Sony Corporation
+0x7884EE, INDRA ESPACIO S.A.
+0x788973, CMC
+0x788C54, Enkom Technologies Ltd.
+0x78929C, Intel Corporate
+0x7898FD, Q9 Networks Inc.
+0x78995C, Nationz Technologies Inc
+0x789966, Musilab Electronics (DongGuan)Co.,Ltd.
+0x78998F, MEDILINE ITALIA SRL
+0x789ED0, Samsung Electronics
+0x789F87, Siemens AG I IA PP PRM
+0x78A051, iiNet Labs Pty Ltd
+0x78A106, TP-LINK TECHNOLOGIES CO.,LTD.
+0x78A183, Advidia
+0x78A2A0, Nintendo Co., Ltd.
+0x78A3E4, Apple, Inc.
+0x78A5DD, Shenzhen Smarteye Digital Electronics Co., Ltd
+0x78A683, Precidata
+0x78A6BD, DAEYEON Control&Instrument Co,.Ltd
+0x78A714, Amphenol
+0x78AB60, ABB Australia
+0x78ACC0, Hewlett-Packard Company
+0x78B6C1, AOBO Telecom Co.,Ltd
+0x78B81A, INTER SALES A/S
+0x78BAD0, Shinybow Technology Co. Ltd.
+0x78BEB6, Enhanced Vision
+0x78BEBD, STULZ GmbH
+0x78C40E, H&D Wireless
+0x78C4AB, Shenzhen Runsil Technology Co.,Ltd
+0x78C5E5, Texas Instruments
+0x78C6BB, Innovasic, Inc.
+0x78CA04, Nokia Corporation
+0x78CA39, Apple, Inc.
+0x78CD8E, SMC Networks Inc
+0x78D004, Neousys Technology Inc.
+0x78D129, Vicos
+0x78D34F, Pace-O-Matic, Inc.
+0x78D6F0, Samsung Electro Mechanics
+0x78DD08, Hon Hai Precision Ind. Co.,Ltd.
+0x78DDD6, c-scape
+0x78DEE4, Texas Instruments
+0x78E3B5, Hewlett-Packard Company
+0x78E400, Hon Hai Precision Ind. Co.,Ltd.
+0x78E7D1, Hewlett-Packard Company
+0x78EC22, Shanghai Qihui Telecom Technology Co., LTD
+0x78EF4C, Unetconvergence Co., Ltd.
+0x78F5FD, Huawei Technologies Co., Ltd
+0x78F7BE, Samsung Electronics Co.,Ltd
+0x78F7D0, Silverbrook Research
+0x78FE3D, Juniper Networks
+0x78FF57, Intel Corporate
+0x7C0187, Curtis Instruments, Inc.
+0x7C02BC, Hansung Electronics Co. LTD
+0x7C034C, SAGEMCOM
+0x7C03D8, SAGEMCOM SAS
+0x7C0507, PEGATRON CORPORATION
+0x7C051E, RAFAEL LTD.
+0x7C08D9, Shanghai Engineering Research Center for Broadband Technologies and Applications
+0x7C092B, Bekey A/S
+0x7C0A50, J-MEX Inc.
+0x7C11BE, Apple, Inc.
+0x7C1476, Damall Technologies SAS
+0x7C160D, Saia-Burgess Controls AG
+0x7C1E52, Microsoft
+0x7C1EB3, 2N TELEKOMUNIKACE a.s.
+0x7C2064, Alcatel Lucent IPD
+0x7C2CF3, Secure Electrans Ltd
+0x7C2E0D, Blackmagic Design
+0x7C2F80, Gigaset Communications GmbH
+0x7C336E, MEG Electronics Inc.
+0x7C386C, Real Time Logic
+0x7C3920, SSOMA SECURITY
+0x7C3BD5, Imago Group
+0x7C3E9D, PATECH
+0x7C438F, E-Band Communications Corp.
+0x7C4A82, Portsmith LLC
+0x7C4AA8, MindTree Wireless PVT Ltd
+0x7C4B78, Red Sun Synthesis Pte Ltd
+0x7C4C58, Scale Computing, Inc.
+0x7C4CA5, BSkyB Ltd
+0x7C4FB5, Arcadyan Technology Corporation
+0x7C55E7, YSI, Inc.
+0x7C6193, HTC Corporation
+0x7C6ADB, SafeTone Technology Co.,Ltd
+0x7C6B33, Tenyu Tech Co. Ltd.
+0x7C6B52, Tigaro Wireless
+0x7C6C39, PIXSYS SRL
+0x7C6C8F, AMS NEVE LTD
+0x7C6D62, Apple, Inc
+0x7C6F06, Caterpillar Trimble Control Technologies
+0x7C7673, ENMAS GmbH
+0x7C7A91, Intel Corporate
+0x7C7BE4, Z'SEDAI KENKYUSHO CORPORATION
+0x7C7D41, Jinmuyu Electronics Co., Ltd.
+0x7C822D, Nortec
+0x7C8EE4, Texas Instruments
+0x7C94B2, Philips Healthcare PCCI
+0x7C9A9B, VSE valencia smart energy
+0x7CA15D, GN ReSound A/S
+0x7CA29B, D.SignT GmbH & Co. KG
+0x7CA61D, MHL, LLC
+0x7CACB2, Bosch Software Innovations GmbH
+0x7CAD74, Cisco
+0x7CB03E, OSRAM AG
+0x7CB21B, Cisco SPVTG
+0x7CB232, TCL King High Frequency EI,Co.,LTD
+0x7CB542, ACES Technology
+0x7CBB6F, Cosco Electronics Co., Ltd.
+0x7CBFB1, Motorola Mobility, Inc.
+0x7CC3A1, Apple, Inc.
+0x7CC537, Apple, Inc.
+0x7CC8AB, Acro Associates, Inc.
+0x7CC8D0, TIANJIN YAAN TECHNOLOGY CO., LTD.
+0x7CC8D7, Damalisk
+0x7CCB0D, Antaira Technologies, LLC
+0x7CCFCF, Shanghai SEARI Intelligent System Co., Ltd
+0x7CD1C3, Apple Inc
+0x7CD762, Freestyle Technology Pty Ltd
+0x7CD844, Enmotus Inc
+0x7CD9FE, New Cosmos Electric Co., Ltd.
+0x7CDA84, Dongnian Networks Inc.
+0x7CDD11, Chongqing MAS SCI&TECH.Co.,Ltd
+0x7CDD20, IOXOS Technologies S.A.
+0x7CDD90, Shenzhen Ogemray Technology Co., Ltd.
+0x7CE044, NEON Inc
+0x7CE9D3, Hon Hai Precision Ind. Co.,Ltd.
+0x7CEBEA, ASCT
+0x7CED8D, MICROSOFT
+0x7CEF18, Creative Product Design Pty. Ltd.
+0x7CEF8A, Inhon International Ltd.
+0x7CF05F, Apple, Inc.
+0x7CF098, Bee Beans Technologies, Inc.
+0x7CF0BA, Linkwell Telesystems Pvt Ltd
+0x7CF429, NUUO Inc.
+0x7CFADF, Apple
+0x7CFE28, Salutron Inc.
+0x80000B, Intel Corporate
+0x800010, ATT BELL LABORATORIES
+0x8007A2, Esson Technology Inc.
+0x800A06, COMTEC co.,ltd
+0x801440, Sunlit System Technology Corp
+0x8016B7, Brunel University
+0x80177D, Nortel Networks
+0x8018A7, Samsung Eletronics Co., Ltd
+0x801DAA, Avaya Inc
+0x801F02, Edimax Technology Co. Ltd.
+0x8020AF, Trade FIDES, a.s.
+0x802275, Beijing Beny Wave Technology Co Ltd
+0x802AFA, Germaneers GmbH
+0x802DE1, Solarbridge Technologies
+0x802E14, azeti Networks AG
+0x802FDE, Zurich Instruments AG
+0x803457, OT Systems Limited
+0x8038FD, LeapFrog Enterprises, Inc.
+0x8039E5, PATLITE CORPORATION
+0x803B9A, ghe-ces electronic ag
+0x803F5D, Winstars Technology Ltd
+0x803FD6, bytes at work AG
+0x80427C, Adolf Tedsen GmbH & Co. KG
+0x804731, Packet Design, Inc.
+0x804971, Apple Inc
+0x804F58, ThinkEco, Inc.
+0x80501B, Nokia Corporation
+0x8058C5, NovaTec Kommunikationstechnik GmbH
+0x806007, RIM
+0x806459, Nimbus Inc.
+0x8065E9, BenQ Corporation
+0x806629, Prescope Technologies CO.,LTD.
+0x806CBC, NET New Electronic Technology GmbH
+0x80711F, Juniper Networks
+0x807693, Newag SA
+0x807A7F, ABB Genway Xiamen Electrical Equipment CO., LTD
+0x807B1E, Corsair Components
+0x807D1B, Neosystem Co. Ltd.
+0x807DE3, Chongqing Sichuan Instrument Microcircuit Co.LTD.
+0x8081A5, TONGQING COMMUNICATION EQUIPMENT (SHENZHEN) Co.,Ltd
+0x808287, ATCOM Technology Co.Ltd.
+0x808698, Netronics Technologies Inc.
+0x8086F2, Intel Corporate
+0x808B5C, Shenzhen Runhuicheng Technology Co., Ltd
+0x80912A, Lih Rong electronic Enterprise Co., Ltd.
+0x8091C0, AgileMesh, Inc.
+0x80929F, Apple
+0x809393, Xapt GmbH
+0x80946C, TOKYO RADAR CORPORATION
+0x8096B1, Motorola Mobility
+0x80971B, Altenergy Power System,Inc.
+0x809B20, Intel Corporate
+0x80A1D7, Shanghai DareGlobal Technologies Co.,Ltd
+0x80AAA4, USAG
+0x80B289, Forworld Electronics Ltd.
+0x80B32A, Alstom Grid
+0x80B686, Huawei Technologies Co., Ltd
+0x80B95C, ELFTECH Co., Ltd.
+0x80BAAC, TeleAdapt Ltd
+0x80C16E, Hewlett Packard
+0x80C63F, Remec Broadband Wireless , LLC
+0x80C6AB, Technicolor USA Inc.
+0x80C6CA, Endian s.r.l.
+0x80C862, Openpeak, Inc
+0x80CEB1, Theissen Training Systems GmbH
+0x80CF41, Lenovo Mobile Communication Technology Ltd.
+0x80D019, Embed, Inc
+0x80D18B, Hangzhou I'converge Technology Co.,Ltd
+0x80D733, QSR Automations, Inc.
+0x80DB31, Power Quotient International Co., Ltd.
+0x80EE73, Shuttle Inc.
+0x80F593, IRCO Sistemas de Telecomunicación S.A.
+0x80F62E, Hangzhou H3C Technologies Co., Limited
+0x80FA5B, CLEVO CO.
+0x80FB06, HUAWEI TECHNOLOGIES CO.,LTD
+0x80FFA8, UNIDIS
+0x8400D2, Sony Ericsson Mobile Communications AB
+0x840B2D, SAMSUNG ELECTRO-MECHANICS CO., LTD
+0x841715, GP Electronics (HK) Ltd.
+0x841888, Juniper Networks
+0x841B5E, NETGEAR
+0x842141, Shenzhen Ginwave Technologies Ltd.
+0x84248D, Motorola Solutions Inc
+0x8425DB, Samsung Electronics Co.,Ltd
+0x8427CE, Corporation of the Presiding Bishop of The Church of Jesus Christ of Latter-day Saints
+0x842914, EMPORIA TELECOM Produktions- und VertriebsgesmbH & Co KG
+0x842999, Apple Inc
+0x842B2B, Dell Inc.
+0x842B50, Huria Co.,Ltd.
+0x842BBC, Modelleisenbahn GmbH
+0x842F75, Innokas Group
+0x8430E5, SkyHawke Technologies, LLC
+0x843497, Hewlett Packard
+0x843611, hyungseul publishing networks
+0x843A4B, Intel Corporate
+0x843F4E, Tri-Tech Manufacturing, Inc.
+0x844823, WOXTER TECHNOLOGY Co. Ltd
+0x844915, vArmour Networks, Inc.
+0x844BF5, Hon Hai Precision Ind. Co.,Ltd.
+0x845181, Samsung Electronics Co.,Ltd
+0x845787, DVR C&C Co., Ltd.
+0x845DD7, Shenzhen Netcom Electronics Co.,Ltd
+0x846223, Shenzhen Coship Electronics Co., Ltd.
+0x8462A6, EuroCB (Phils), Inc.
+0x846AED, Wireless Tsukamoto.,co.LTD
+0x846EB1, Park Assist LLC
+0x84742A, zte corporation
+0x8478AC, Cisco
+0x847A88, HTC Corporation
+0x847E40, Texas Instruments
+0x8482F4, Beijing Huasun Unicreate Technology Co., Ltd
+0x848506, Apple Inc
+0x848D84, Rajant Corporation
+0x848E96, Embertec Pty Ltd
+0x848F69, Dell Inc.
+0x849000, Arnold & Richter Cine Technik
+0x8497B8, Memjet Inc.
+0x849CA6, Arcadyan Technology Corporation
+0x849DC5, Centera Photonics Inc.
+0x84A6C8, Intel Corporate
+0x84A8E4, Huawei Device Co., Ltd
+0x84A991, Cyber Trans Japan Co.,Ltd.
+0x84ACA4, Beijing Novel Super Digital TV Technology Co., Ltd
+0x84AF1F, Beat System Service Co,. Ltd.
+0x84C2E4, Jiangsu Qinheng Co., Ltd.
+0x84C727, Gnodal Ltd
+0x84C7A9, C3PO S.A.
+0x84C8B1, Incognito Software Inc.
+0x84C9B2, D-Link International
+0x84D32A, IEEE P1905.1
+0x84D9C8, Unipattern Co.,
+0x84DB2F, Sierra Wireless Inc
+0x84DD20, Texas Instruments
+0x84DE3D, Crystal Vision Ltd
+0x84DF0C, NET2GRID BV
+0x84E714, Liang Herng Enterprise,Co.Ltd.
+0x84EA99, Vieworks
+0x84ED33, BBMC Co.,Ltd
+0x84F493, OMS spol. s.r.o.
+0x84F64C, Cross Point BV
+0x84FCFE, Apple
+0x880905, MTMCommunications
+0x881036, Panodic(ShenZhen) Electronics Limted
+0x881544, Meraki, Inc.
+0x8818AE, Tamron Co., Ltd
+0x882012, LMI Technologies
+0x8821E3, Nebusens, S.L.
+0x8823FE, TTTech Computertechnik AG
+0x88252C, Arcadyan Technology Corporation
+0x882E5A, storONE
+0x88308A, Murata Manufactuaring Co.,Ltd.
+0x88329B, Samsung Electro Mechanics co.,LTD.
+0x883314, Texas Instruments
+0x8841C1, ORBISAT DA AMAZONIA IND E AEROL SA
+0x8843E1, CISCO SYSTEMS, INC.
+0x884B39, Siemens AG, Healthcare Sector
+0x8851FB, Hewlett Packard
+0x88532E, Intel Corporate
+0x885395, Apple
+0x8853D4, Huawei Technologies Co., Ltd
+0x885C4F, Alcatel Lucent
+0x88615A, Siano Mobile Silicon Ltd.
+0x88685C, Shenzhen ChuangDao & Perpetual Eternal Technology Co.,Ltd
+0x886B76, CHINA HOPEFUL GROUP HOPEFUL ELECTRIC CO.,LTD
+0x887556, Cisco
+0x8886A0, Simton Technologies, Ltd.
+0x888717, CANON INC.
+0x8887DD, DarbeeVision Inc.
+0x888964, GSI Electronics Inc.
+0x888B5D, Storage Appliance Corporation
+0x888C19, Brady Corp Asia Pacific Ltd
+0x8891DD, Racktivity
+0x8894F9, Gemicom Technology, Inc.
+0x8895B9, Unified Packet Systems Crop
+0x889676, TTC MARCONI s.r.o.
+0x8897DF, Entrypass Corporation Sdn. Bhd.
+0x889821, TERAON
+0x889FFA, Hon Hai Precision Ind. Co.,Ltd.
+0x88A3CC, Amatis Controls
+0x88A5BD, QPCOM INC.
+0x88ACC1, Generiton Co., Ltd.
+0x88AE1D, COMPAL INFORMATION(KUNSHAN)CO.,LTD
+0x88B168, Delta Control GmbH
+0x88B627, Gembird Europe BV
+0x88BA7F, Qfiednet Co., Ltd.
+0x88BFD5, Simple Audio Ltd
+0x88C36E, Beijing Ereneben lnformation Technology Limited
+0x88C663, Apple, Inc.
+0x88CB87, Apple
+0x88D7BC, DEP Company
+0x88DC96, SENAO Networks, Inc.
+0x88DD79, Voltaire
+0x88E0A0, Shenzhen VisionSTOR Technologies Co., Ltd
+0x88E0F3, Juniper Networks
+0x88E712, Whirlpool Corporation
+0x88E7A6, iKnowledge Integration Corp.
+0x88E917, Tamaggo
+0x88ED1C, Cudo Communication Co., Ltd.
+0x88F077, CISCO SYSTEMS, INC.
+0x88F488, cellon communications technology(shenzhen)Co.,Ltd.
+0x88F490, Jetmobile Pte Ltd
+0x88FD15, LINEEYE CO., LTD
+0x8C04FF, Technicolor USA Inc.
+0x8C078C, FLOW DATA INC
+0x8C0C90, Ruckus Wireless
+0x8C0CA3, Amper
+0x8C0EE3, GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD.
+0x8C11CB, ABUS Security-Center GmbH & Co. KG
+0x8C1F94, RF Surgical System Inc.
+0x8C210A, TP-LINK TECHNOLOGIES CO., LTD.
+0x8C271D, QuantHouse
+0x8C278A, Vocollect Inc
+0x8C2DAA, Apple Inc
+0x8C3330, EmFirst Co., Ltd.
+0x8C3C4A, NAKAYO TELECOMMUNICATIONS,INC.
+0x8C4435, Shanghai BroadMobi Communication Technology Co., Ltd.
+0x8C4AEE, GIGA TMS INC
+0x8C4CDC, PLANEX COMMUNICATIONS INC.
+0x8C4DEA, Cerio Corporation
+0x8C5105, Shenzhen ireadygo Information Technology CO.,LTD.
+0x8C53F7, A&D ENGINEERING CO., LTD.
+0x8C541D, LGE
+0x8C56C5, Nintendo Co., Ltd.
+0x8C57FD, LVX Western
+0x8C5877, Apple, Inc.
+0x8C598B, C Technologies AB
+0x8C5AF0, Exeltech Solar Products
+0x8C5CA1, d-broad,INC
+0x8C5FDF, Beijing Railway Signal Factory
+0x8C604F, CISCO SYSTEMS, INC.
+0x8C640B, Beyond Devices d.o.o.
+0x8C6422, Sony Ericsson Mobile Communications AB
+0x8C6878, Nortek-AS
+0x8C6AE4, Viogem Limited
+0x8C705A, Intel Corporate
+0x8C71F8, Samsung Electronics Co.,Ltd
+0x8C736E, Fujitsu Limited
+0x8C76C1, Goden Tech Limited
+0x8C7712, Samsung Electronics Co.,Ltd
+0x8C7716, LONGCHEER TELECOMMUNICATION LIMITED
+0x8C7B9D, Apple, Inc.
+0x8C7CB5, Hon Hai Precision Ind. Co.,Ltd.
+0x8C7CFF, Brocade Communications Systems, Inc.
+0x8C7EB3, Lytro, Inc.
+0x8C82A8, Insigma Technology Co.,Ltd
+0x8C8401, PRIVATE
+0x8C89A5, Micro-Star INT'L CO., LTD
+0x8C8A6E, ESTUN AUTOMATION TECHNOLOY CO., LTD
+0x8C8E76, taskit GmbH
+0x8C90D3, Alcatel Lucent
+0x8C9236, Aus.Linx Technology Co., Ltd.
+0x8C94CF, Encell Technology, Inc.
+0x8CA048, Beijing NeTopChip Technology Co.,LTD
+0x8CA982, Intel Corporate
+0x8CAE4C, Plugable Technologies
+0x8CB64F, CISCO SYSTEMS, INC.
+0x8CB82C, IPitomy Communications
+0x8CB864, AcSiP Technology Corp.
+0x8CC121, Panasonic AVC Networks Company
+0x8CC5E1, ShenZhen Konka Telecommunication Technology Co.,Ltd
+0x8CC7AA, Radinet Communications Inc.
+0x8CC7D0, zhejiang ebang communication co.,ltd
+0x8CC8CD, Samsung Electronics Co., LTD
+0x8CCDE8, Nintendo Co., Ltd.
+0x8CCF5C, BEFEGA GmbH
+0x8CD17B, CG Mobile
+0x8CD3A2, VisSim AS
+0x8CD628, Ikor Metering
+0x8CDB25, ESG Solutions
+0x8CDD8D, Wifly-City System Inc.
+0x8CDE52, ISSC Technologies Corp.
+0x8CE081, zte corporation
+0x8CE748, PRIVATE
+0x8CE7B3, Sonardyne International Ltd
+0x8CEEC6, Precepscion Pty. Ltd.
+0x8CF9C9, MESADA Technology Co.,Ltd.
+0x8CFABA, Apple Inc
+0x8CFDF0, QUALCOMM Incorporated
+0x90004E, Hon Hai Precision Ind. Co.,Ltd.
+0x90013B, SAGEMCOM
+0x9002A9, ZHEJIANG DAHUA TECHNOLOGY CO.,LTD
+0x9003B7, PARROT
+0x900917, Far-sighted mobile
+0x900A3A, PSG Plastic Service GmbH
+0x900D66, Digimore Electronics Co., Ltd
+0x900DCB, ARRIS Group, Inc.
+0x90185E, Apex Tool Group GmbH & Co OHG
+0x90187C, Samsung Electro Mechanics co., LTD.
+0x9018AE, Shanghai Meridian Technologies, Co. Ltd.
+0x901900, SCS SA
+0x901B0E, Fujitsu Technology Solutions GmbH
+0x901D27, zte corporation
+0x901EDD, GREAT COMPUTER CORPORATION
+0x902155, HTC Corporation
+0x9027E4, Apple, Inc.
+0x902B34, GIGA-BYTE TECHNOLOGY CO.,LTD.
+0x902E87, LabJack
+0x90342B, Gatekeeper Systems, Inc.
+0x9034FC, Hon Hai Precision Ind. Co.,Ltd.
+0x9038DF, Changzhou Tiannengbo System Co. Ltd.
+0x903AA0, Alcatel-Lucent
+0x903CAE, Yunnan KSEC Digital Technology Co.,Ltd.
+0x903D5A, Shenzhen Wision Technology Holding Limited
+0x903D6B, Zicon Technology Corp.
+0x904716, RORZE CORPORATION
+0x904CE5, Hon Hai Precision Ind. Co.,Ltd.
+0x90507B, Advanced PANMOBIL Systems GmbH & Co. KG
+0x90513F, Elettronica Santerno
+0x905446, TES ELECTRONIC SOLUTIONS
+0x9055AE, Ericsson, EAB/RWI/K
+0x905682, Lenbrook Industries Limited
+0x905692, Autotalks Ltd.
+0x9059AF, Texas Instruments
+0x905F2E, TCT Mobile Limited
+0x905F8D, modas GmbH
+0x90610C, Fida International (S) Pte Ltd
+0x9067B5, Alcatel-Lucent
+0x9067F3, Alcatel Lucent
+0x906DC8, DLG Automação Industrial Ltda
+0x906EBB, Hon Hai Precision Ind. Co.,Ltd.
+0x907025, Garea Microsys Co.,Ltd.
+0x907AF1, SNUPI Technologies
+0x907F61, Chicony Electronics Co., Ltd.
+0x908260, IEEE 1904.1 Working Group
+0x90840D, Apple, Inc
+0x9088A2, IONICS TECHNOLOGY ME LTDA
+0x908D1D, GH Technologies
+0x908FCF, UNO System Co., Ltd
+0x90903C, TRISON TECHNOLOGY CORPORATION
+0x909060, RSI VIDEO TECHNOLOGIES
+0x9092B4, Diehl BGT Defence GmbH & Co. KG
+0x9094E4, D-Link International
+0x909DE0, Newland Design + Assoc. Inc.
+0x90A2DA, GHEO SA
+0x90A4DE, Wistron Neweb Corp.
+0x90A783, JSW PACIFIC CORPORATION
+0x90A7C1, Pakedge Device and Software Inc.
+0x90AC3F, BrightSign LLC
+0x90B11C, Dell Inc.
+0x90B134, Motorola Mobility, Inc.
+0x90B8D0, Joyent, Inc.
+0x90B97D, Johnson Outdoors Marine Electronics d/b/a Minnkota
+0x90C115, Sony Ericsson Mobile Communications AB
+0x90CC24, Synaptics, Inc
+0x90CF15, Nokia Corporation
+0x90CF6F, Dlogixs Co Ltd
+0x90CF7D, Qingdao Hisense Electric Co.,Ltd.
+0x90D11B, Palomar Medical Technologies
+0x90D74F, Bookeen
+0x90D7EB, Texas Instruments
+0x90D852, Comtec Co., Ltd.
+0x90D92C, HUG-WITSCHI AG
+0x90DA4E, AVANU
+0x90E0F0, IEEE P1722
+0x90E2BA, Intel Corporation
+0x90E6BA, ASUSTek COMPUTER INC.
+0x90EA60, SPI Lasers Ltd
+0x90F278, Radius Gateway
+0x90F4C1, Rand McNally
+0x90F652, TP-LINK TECHNOLOGIES CO., LTD.
+0x90F72F, Phillips Machine & Welding Co., Inc.
+0x90FB5B, Avaya, Inc
+0x90FBA6, Hon Hai Precision Ind.Co.Ltd
+0x90FF79, Metro Ethernet Forum
+0x940070, Nokia Corporation
+0x940149, AutoHotBox
+0x940B2D, NetView Technologies(Shenzhen) Co., Ltd
+0x940C6D, TP-LINK Technologies Co.,Ltd.
+0x9411DA, ITF Fröschl GmbH
+0x941673, Point Core SARL
+0x941D1C, TLab West Systems AB
+0x942053, Nokia Corporation
+0x942197, Stalmart Technology Limited
+0x94236E, Shenzhen Junlan Electronic Ltd
+0x942E17, Schneider Electric Canada Inc
+0x942E63, Finsécur
+0x94319B, Alphatronics BV
+0x9433DD, Taco Electronic Solutions, Inc.
+0x9439E5, Hon Hai Precision Ind. Co.,Ltd.
+0x943AF0, Nokia Corporation
+0x944444, LG Innotek
+0x944452, Belkin International Inc.
+0x944696, BaudTec Corporation
+0x944A09, BitWise Controls
+0x945103, Samsung Electronics
+0x94592D, EKE Building Technology Systems Ltd
+0x945B7E, TRILOBIT LTDA.
+0x946124, Pason Systems
+0x9463D1, Samsung Electronics Co.,Ltd
+0x9471AC, TCT Mobile Limited
+0x94756E, QinetiQ North America
+0x9481A4, Azuray Technologies
+0x94857A, Evantage Industries Corp
+0x948854, Texas Instruments
+0x948B03, EAGET Innovation and Technology Co., Ltd.
+0x948D50, Beamex Oy Ab
+0x948FEE, Hughes Telematics, Inc.
+0x949426, Apple
+0x9498A2, Shanghai LISTEN TECH.LTD
+0x949BFD, Trans New Technology, Inc.
+0x949C55, Alta Data Technologies
+0x94A7BC, BodyMedia, Inc.
+0x94AAB8, Joview(Beijing) Technology Co. Ltd.
+0x94ACCA, trivum technologies GmbH
+0x94AE61, Alcatel Lucent
+0x94BA31, Visiontec da Amazônia Ltda.
+0x94C4E9, PowerLayer Microsystems HongKong Limited
+0x94C6EB, NOVA electronics, Inc.
+0x94C7AF, Raylios Technology
+0x94C962, Teseq AG
+0x94CA0F, Honeywell Analytics
+0x94CCB9, Motorola Mobility, Inc.
+0x94CDAC, Creowave Oy
+0x94CE2C, Sony Mobile Communications AB
+0x94D019, Cydle Corp.
+0x94D723, Shanghai DareGlobal Technologies Co., Ltd
+0x94D93C, ENELPS
+0x94DB49, SITCORP
+0x94DBC9, Azurewave
+0x94DD3F, A+V Link Technologies, Corp.
+0x94DE0E, SmartOptics AS
+0x94DE80, GIGA-BYTE TECHNOLOGY CO.,LTD.
+0x94DF58, IJ Electron CO.,Ltd.
+0x94E0D0, HealthStream Taiwan Inc.
+0x94E226, D. ORtiz Consulting, LLC
+0x94E711, Xirka Dama Persada PT
+0x94E848, FYLDE MICRO LTD
+0x94EBCD, Research In Motion Limited
+0x94F692, Geminico co.,Ltd.
+0x94F720, Tianjin Deviser Electronics Instrument Co., Ltd
+0x94FAE8, Shenzhen Eycom Technology Co., Ltd
+0x94FD1D, WhereWhen Corp
+0x94FD2E, Shanghai Uniscope Technologies Co.,Ltd
+0x94FEF4, SAGEMCOM
+0x980284, Theobroma Systems GmbH
+0x9803A0, ABB n.v. Power Quality Products
+0x9803D8, Apple, Inc.
+0x980C82, Samsung Electro Mechanics
+0x980D2E, HTC Corporation
+0x980EE4, PRIVATE
+0x981094, Shenzhen Vsun communication technology Co.,ltd
+0x98208E, Definium Technologies
+0x98262A, Applied Research Associates, Inc
+0x98291D, Jaguar de Mexico, SA de CV
+0x98293F, Fujian Start Computer Equipment Co.,Ltd
+0x982CBE, 2Wire
+0x982D56, Resolution Audio
+0x983000, Beijing KEMACOM Technologies Co., Ltd.
+0x983071, DAIKYUNG VASCOM
+0x983571, Sub10 Systems Ltd
+0x9835B8, Assembled Products Corporation
+0x983F9F, China SSJ (Suzhou) Network Technology Inc.
+0x984246, SOL INDUSTRY PTE., LTD
+0x98473C, SHANGHAI SUNMON COMMUNICATION TECHNOGY CO.,LTD
+0x984A47, CHG Hospital Beds
+0x984B4A, Motorola Mobility Inc.
+0x984BE1, Hewlett-Packard Company
+0x984C04, Zhangzhou Keneng Electrical Equipment Co Ltd
+0x984CD3, Mantis Deposition
+0x984E97, Starlight Marketing (H. K.) Ltd.
+0x984FEE, Intel Corporate
+0x9852B1, Samsung Electronics
+0x9857D3, HON HAI-CCPBG PRECISION IND.CO.,LTD.
+0x98588A, SYSGRATION Ltd.
+0x985945, Texas Instruments
+0x985C93, SBG Systems SAS
+0x985E1B, ConversDigital Co., Ltd.
+0x986022, EMW Co., Ltd.
+0x9866EA, Industrial Control Communications, Inc.
+0x986DC8, TOSHIBA MITSUBISHI-ELECTRIC INDUSTRIAL SYSTEMS CORPORATION
+0x9873C4, Sage Electronic Engineering LLC
+0x988217, Disruptive Ltd
+0x9886B1, Flyaudio corporation (China)
+0x9889ED, Anadem Information Inc.
+0x988B5D, SAGEM COMMUNICATION
+0x988BAD, Corintech Ltd.
+0x988E34, ZHEJIANG BOXSAM ELECTRONIC CO.,LTD
+0x988EDD, TE Connectivity Limerick
+0x989080, Linkpower Network System Inc Ltd.
+0x9893CC, LG Electronics Inc.
+0x989449, Skyworth Wireless Technology Ltd.
+0x98A7B0, MCST ZAO
+0x98AAD7, BLUE WAVE NETWORKING CO LTD
+0x98B8E3, Apple
+0x98BC57, SVA TECHNOLOGIES CO.LTD
+0x98BC99, Edeltech Co.,Ltd.
+0x98C845, PacketAccess
+0x98D686, Chyi Lee industry Co., ltd.
+0x98D6BB, Apple, Inc.
+0x98D6F7, LG Electronics
+0x98D88C, Nortel Networks
+0x98DCD9, UNITEC Co., Ltd.
+0x98E165, Accutome
+0x98E79A, Foxconn(NanJing) Communication Co.,Ltd.
+0x98EC65, Cosesy ApS
+0x98F537, zte corporation
+0x98F8DB, Marini Impianti Industriali s.r.l.
+0x98FC11, Cisco-Linksys, LLC
+0x98FE03, Ericsson - North America
+0x98FE94, Apple Inc
+0x9C0111, Shenzhen Newabel Electronic Co., Ltd.
+0x9C0298, Samsung Electronics Co.,Ltd
+0x9C0473, Tecmobile (International) Ltd.
+0x9C04EB, Apple
+0x9C066E, Hytera Communications Corporation Limited
+0x9C0DAC, Tymphany HK Limited
+0x9C1874, Nokia Danmark A/S
+0x9C1C12, Aruba Networks
+0x9C1FDD, Accupix Inc.
+0x9C207B, Apple Inc
+0x9C220E, TASCAN Service GmbH
+0x9C28BF, Continental Automotive Czech Republic s.r.o.
+0x9C2A70, Hon Hai Precision Ind. Co.,Ltd.
+0x9C3178, Foshan Huadian Intelligent Communications Teachnologies Co.,Ltd
+0x9C31B6, Kulite Semiconductor Products Inc
+0x9C3AAF, Samsung Electronics Co.,Ltd
+0x9C417C, Hame Technology Co., Limited
+0x9C4563, DIMEP Sistemas
+0x9C4A7B, Nokia Corporation
+0x9C4CAE, Mesa Labs
+0x9C4E20, CISCO SYSTEMS, INC.
+0x9C4E36, Intel Corporate
+0x9C4E8E, ALT Systems Ltd
+0x9C53CD, ENGICAM s.r.l.
+0x9C541C, Shenzhen My-power Technology Co.,Ltd
+0x9C54CA, Zhengzhou VCOM Science and Technology Co.,Ltd
+0x9C55B4, I.S.E. S.r.l.
+0x9C5711, Feitian Xunda(Beijing) Aeronautical Information Technology Co., Ltd.
+0x9C5B96, NMR Corporation
+0x9C5C8D, FIREMAX INDÚSTRIA E COMÉRCIO DE PRODUTOS ELETRÔNICOS LTDA
+0x9C5D12, Aerohive Networks Inc
+0x9C5D95, VTC Electronics Corp.
+0x9C5E73, Calibre UK Ltd
+0x9C611D, Omni-ID USA, Inc.
+0x9C645E, Harman Consumer Group
+0x9C6650, Glodio Technolies Co.,Ltd Tianjin Branch
+0x9C6ABE, QEES ApS.
+0x9C7514, Wildix srl
+0x9C77AA, NADASNV
+0x9C7BD2, NEOLAB Convergence
+0x9C807D, SYSCABLE Korea Inc.
+0x9C8BF1, The Warehouse Limited
+0x9C8D1A, INTEG process group inc
+0x9C8E99, Hewlett-Packard Company
+0x9C8EDC, Teracom Limited
+0x9C934E, Xerox Corporation
+0x9C95F8, SmartDoor Systems, LLC
+0x9C9726, Technicolor
+0x9C9811, Guangzhou Sunrise Electronics Development Co., Ltd
+0x9C9C1D, Starkey Labs Inc.
+0x9CA134, Nike, Inc.
+0x9CA3BA, SAKURA Internet Inc.
+0x9CA577, Osorno Enterprises Inc.
+0x9CADEF, Obihai Technology, Inc.
+0x9CAFCA, CISCO SYSTEMS, INC.
+0x9CB008, Ubiquitous Computing Technology Corporation
+0x9CB206, PROCENTEC
+0x9CB70D, Liteon Technology Corporation
+0x9CC077, PrintCounts, LLC
+0x9CC0D2, Conductix-Wampfler AG
+0x9CC7A6, AVM GmbH
+0x9CC7D1, SHARP Corporation
+0x9CCAD9, Nokia Corporation
+0x9CCD82, CHENG UEI PRECISION INDUSTRY CO.,LTD
+0x9CD24B, zte corporation
+0x9CD36D, NETGEAR INC.,
+0x9CDF03, Harman/Becker Automotive Systems GmbH
+0x9CE10E, NCTech Ltd
+0x9CE1D6, Junger Audio-Studiotechnik GmbH
+0x9CE635, Nintendo Co., Ltd.
+0x9CE6E7, Samsung Electronics Co.,Ltd
+0x9CEBE8, BizLink (Kunshan) Co.,Ltd
+0x9CF61A, UTC Fire and Security
+0x9CF67D, Ricardo Prague, s.r.o.
+0x9CF938, AREVA NP GmbH
+0x9CFFBE, OTSL Inc.
+0xA00363, Robert Bosch Healthcare GmbH
+0xA00798, Samsung Electronics
+0xA007B6, Advanced Technical Support, Inc.
+0xA00ABF, Wieson Technologies Co., Ltd.
+0xA00BBA, SAMSUNG ELECTRO-MECHANICS
+0xA00CA1, SKTB "SKiT"
+0xA0133B, Copyright © HiTi Digital, Inc.
+0xA0165C, TangoTec Ltd.
+0xA01859, Shenzhen Yidashi Electronics Co Ltd
+0xA01917, Bertel S.p.a.
+0xA01C05, NIMAX TELECOM CO.,LTD.
+0xA02195, Samsung Electronics Digital Imaging
+0xA021B7, NETGEAR
+0xA0231B, TeleComp R&D Corp.
+0xA02EF3, United Integrated Services Co., Led.
+0xA0369F, Intel Corporation
+0xA036F0, Comprehensive Power
+0xA036FA, Ettus Research LLC
+0xA03A75, PSS Belgium N.V.
+0xA04025, Actioncable, Inc.
+0xA04041, SAMWONFA Co.,Ltd.
+0xA041A7, NL Ministry of Defense
+0xA0423F, Tyan Computer Corp
+0xA04CC1, Helixtech Corp.
+0xA04E04, Nokia Corporation
+0xA051C6, Avaya, Inc
+0xA055DE, Pace plc
+0xA0593A, V.D.S. Video Display Systems srl
+0xA05AA4, Grand Products Nevada, Inc.
+0xA05DC1, TMCT Co., LTD.
+0xA05DE7, DIRECTV, Inc.
+0xA05E6B, MELPER Co., Ltd.
+0xA06986, Wellav Technologies Ltd
+0xA06A00, Verilink Corporation
+0xA06CEC, RIM
+0xA06D09, Intelcan Technosystems Inc.
+0xA06E50, Nanotek Elektronik Sistemler Ltd. Sti.
+0xA071A9, Nokia Corporation
+0xA07332, Cashmaster International Limited
+0xA073FC, Rancore Technologies Private Limited
+0xA07591, Samsung Electronics Co.,Ltd
+0xA078BA, Pantech Co., Ltd.
+0xA0821F, Samsung Electronics Co.,Ltd
+0xA082C7, P.T.I Co.,LTD
+0xA0861D, Chengdu Fuhuaxin Technology co.,Ltd
+0xA086EC, SAEHAN HITEC Co., Ltd
+0xA08869, Intel Corporate
+0xA088B4, Intel Corporate
+0xA08A87, HuiZhou KaiYue Electronic Co.,Ltd
+0xA08C15, Gerhard D. Wempe KG
+0xA08C9B, Xtreme Technologies Corp
+0xA090DE, VEEDIMS,LLC
+0xA09805, OpenVox Communication Co Ltd
+0xA098ED, Shandong Intelligent Optical Communication Development Co., Ltd.
+0xA09A5A, Time Domain
+0xA0A130, DLI Taiwan Branch office
+0xA0A763, Polytron Vertrieb GmbH
+0xA0AAFD, EraThink Technologies Corp.
+0xA0B3CC, Hewlett Packard
+0xA0B5DA, HongKong THTF Co., Ltd
+0xA0B662, Acutvista Innovation Co., Ltd.
+0xA0B9ED, Skytap
+0xA0BAB8, Pixon Imaging
+0xA0BFA5, CORESYS
+0xA0C3DE, Triton Electronic Systems Ltd.
+0xA0CF5B, CISCO SYSTEMS, INC.
+0xA0DC04, Becker-Antriebe GmbH
+0xA0DD97, PolarLink Technologies, Ltd
+0xA0DDE5, SHARP CORPORATION
+0xA0DE05, JSC "Irbis-T"
+0xA0E201, AVTrace Ltd.(China)
+0xA0E25A, Amicus SK, s.r.o.
+0xA0E295, DAT System Co.,Ltd
+0xA0E534, Stratec Biomedical AG
+0xA0E9DB, Ningbo FreeWings Technologies Co.,Ltd
+0xA0EB76, AirCUVE Inc.
+0xA0EF84, Seine Image Int'l Co., Ltd
+0xA0F217, GE Medical System(China) Co., Ltd.
+0xA0F3C1, TP-LINK TECHNOLOGIES CO., LTD.
+0xA0F3E4, Alcatel Lucent IPD
+0xA0F419, Nokia Corporation
+0xA0F450, HTC Corporation
+0xA0FE91, AVAT Automation GmbH
+0xA40130, ABIsystems Co., LTD
+0xA40BED, Carry Technology Co.,Ltd
+0xA40CC3, CISCO SYSTEMS, INC.
+0xA4134E, Luxul
+0xA41731, Hon Hai Precision Ind. Co.,Ltd.
+0xA41875, CISCO SYSTEMS, INC.
+0xA41BC0, Fastec Imaging Corporation
+0xA41F72, Dell Inc.
+0xA4218A, Nortel Networks
+0xA424B3, FlatFrog Laboratories AB
+0xA429B7, bluesky
+0xA42C08, Masterwork Automodules
+0xA433D1, Fibrlink Communications Co.,Ltd.
+0xA438FC, Plastic Logic
+0xA4466B, EOC Technology
+0xA446FA, AmTRAN Video Corporation
+0xA44B15, Sun Cupid Technology (HK) LTD
+0xA44C11, CISCO SYSTEMS, INC.
+0xA44E2D, Adaptive Wireless Solutions, LLC
+0xA44E31, Intel Corporate
+0xA45055, busware.de
+0xA4526F, ADB Broadband Italia
+0xA4561B, MCOT Corporation
+0xA45630, CISCO SYSTEMS, INC.
+0xA45A1C, smart-electronic GmbH
+0xA45C27, Nintendo Co., Ltd.
+0xA46706, Apple, Inc.
+0xA46E79, DFT System Co.Ltd
+0xA479E4, KLINFO Corp
+0xA47AA4, Motorola Mobility, Inc.
+0xA47ACF, VIBICOM COMMUNICATIONS INC.
+0xA47C14, ChargeStorm AB
+0xA47C1F, Global Microwave Systems Inc.
+0xA4856B, Q Electronics Ltd
+0xA49005, CHINA GREATWALL COMPUTER SHENZHEN CO.,LTD
+0xA4934C, CISCO SYSTEMS, INC.
+0xA497BB, Hitachi Industrial Equipment Systems Co.,Ltd
+0xA49947, Huawei Technologies Co., Ltd
+0xA49981, FuJian Elite Power Tech CO.,LTD.
+0xA49B13, Burroughs Payment Systems, Inc.
+0xA49EDB, AutoCrib, Inc.
+0xA4A24A, Cisco SPVTG
+0xA4A80F, Shenzhen Coship Electronics Co., Ltd.
+0xA4AD00, Ragsdale Technology
+0xA4ADB8, Vitec Group, Camera Dynamics Ltd
+0xA4AE9A, Maestro Wireless Solutions ltd.
+0xA4B121, Arantia 2010 S.L.
+0xA4B197, Apple, Inc.
+0xA4B1E9, Technicolor
+0xA4B1EE, H. ZANDER GmbH & Co. KG
+0xA4B2A7, Adaxys Solutions AG
+0xA4B36A, JSC SDO Chromatec
+0xA4B818, PENTA Gesellschaft für elektronische Industriedatenverarbeitung mbH
+0xA4B980, Parking BOXX Inc.
+0xA4BADB, Dell Inc.
+0xA4BE61, EutroVision System, Inc.
+0xA4C0E1, Nintendo Co., Ltd.
+0xA4C2AB, Hangzhou LEAD-IT Information & Technology Co.,Ltd
+0xA4D18F, Shenzhen Skyee Optical Fiber Communication Technology Ltd.
+0xA4D1D1, ECOtality North America
+0xA4D1D2, Apple, Inc.
+0xA4D3B5, GLITEL Stropkov, s.r.o.
+0xA4D856, Qualcomm Labs Inc.
+0xA4DA3F, Bionics Corp.
+0xA4DB2E, Kingspan Environmental Ltd
+0xA4DE50, Total Walther GmbH
+0xA4E0E6, FILIZOLA S.A. PESAGEM E AUTOMACAO
+0xA4E32E, Silicon & Software Systems Ltd.
+0xA4E391, DENY FONTAINE
+0xA4E731, Nokia Corporation
+0xA4E7E4, Connex GmbH
+0xA4E991, SISTEMAS AUDIOVISUALES ITELSIS S.L.
+0xA4EBD3, Samsung Electronics Co.,Ltd
+0xA4ED4E, Motorola Mobility, Inc.
+0xA4EE57, SEIKO EPSON CORPORATION
+0xA4EF52, Telewave Co., Ltd.
+0xA4F3C1, Open Source Robotics Foundation, Inc.
+0xA4F7D0, LAN Accessories Co., Ltd.
+0xA80180, IMAGO Technologies GmbH
+0xA80600, Samsung Electronics Co.,Ltd
+0xA8154D, TP-LINK TECHNOLOGIES CO.,LTD.
+0xA816B2, LG Electronics
+0xA81758, Elektronik System i Umeå AB
+0xA81B18, XTS CORP
+0xA81FAF, KRYPTON POLSKA
+0xA82066, Apple Inc
+0xA826D9, HTC Corporation
+0xA8294C, Precision Optical Transceivers, Inc.
+0xA82BD6, Shina System Co., Ltd
+0xA830AD, Wei Fang Goertek Electronics Co.,Ltd
+0xA83944, Actiontec Electronics, Inc
+0xA84041, Dragino Technology Co., Limited
+0xA84481, Nokia Corporation
+0xA845E9, Firich Enterprises CO., LTD.
+0xA849A5, Lisantech Co., Ltd.
+0xA854B2, Wistron Neweb Corp.
+0xA8556A, Pocketnet Technology Inc.
+0xA85BB0, Shenzhen Dehoo Technology Co.,Ltd
+0xA85BF3, Audivo GmbH
+0xA861AA, Cloudview Limited
+0xA862A2, JIWUMEDIA CO., LTD.
+0xA863DF, DISPLAIRE CORPORATION
+0xA863F2, Texas Instruments
+0xA865B2, DONGGUAN YISHANG ELECTRONIC TECHNOLOGY CO., LIMITED
+0xA86A6F, RIM
+0xA870A5, UniComm Inc.
+0xA875D6, FreeTek International Co., Ltd.
+0xA8776F, Zonoff
+0xA87B39, Nokia Corporation
+0xA87E33, Nokia Danmark A/S
+0xA88792, Broadband Antenna Tracking Systems
+0xA887ED, ARC Wireless LLC
+0xA88CEE, MicroMade Galka i Drozdz sp.j.
+0xA8922C, LG Electronics
+0xA893E6, JIANGXI JINGGANGSHAN CKING COMMUNICATION TECHNOLOGY CO.,LTD
+0xA895B0, Aker Subsea Ltd
+0xA8968A, Apple
+0xA898C6, Shinbo Co., Ltd.
+0xA8995C, aizo ag
+0xA89B10, inMotion Ltd.
+0xA8AD3D, Alcatel-Lucent Shanghai Bell Co., Ltd
+0xA8B0AE, LEONI
+0xA8B1D4, CISCO SYSTEMS, INC.
+0xA8BD1A, Honey Bee (Hong Kong) Limited
+0xA8C222, TM-Research Inc.
+0xA8CB95, EAST BEST CO., LTD.
+0xA8CE90, CVC
+0xA8D0E5, Juniper Networks
+0xA8D3C8, Wachendorff Elektronik GmbH & Co. KG
+0xA8E018, Nokia Corporation
+0xA8E3EE, Sony Computer Entertainment Inc.
+0xA8EF26, Tritonwave
+0xA8F274, Samsung Electronics
+0xA8F470, Fujian Newland Communication Science Technologies Co.,Ltd.
+0xA8F94B, Eltex Enterprise Ltd.
+0xA8FAD8, Apple
+0xA8FCB7, Consolidated Resource Imaging
+0xAA0000, DIGITAL EQUIPMENT CORPORATION
+0xAA0001, DIGITAL EQUIPMENT CORPORATION
+0xAA0002, DIGITAL EQUIPMENT CORPORATION
+0xAA0003, DIGITAL EQUIPMENT CORPORATION
+0xAA0004, DIGITAL EQUIPMENT CORPORATION
+0xAC0142, Uriel Technologies SIA
+0xAC02CF, RW Tecnologia Industria e Comercio Ltda
+0xAC02EF, Comsis
+0xAC0613, Senselogix Ltd
+0xAC0A61, Labor S.r.L.
+0xAC0DFE, Ekon GmbH - myGEKKO
+0xAC1461, ATAW Co., Ltd.
+0xAC14D2, wi-daq, inc.
+0xAC162D, Hewlett Packard
+0xAC1702, Fibar Group sp. z o.o.
+0xAC1826, SEIKO EPSON CORPORATION
+0xAC199F, SUNGROW POWER SUPPLY CO.,LTD.
+0xAC20AA, DMATEK Co., Ltd.
+0xAC2FA8, Humannix Co.,Ltd.
+0xAC319D, Shenzhen TG-NET Botone Technology Co.,Ltd.
+0xAC34CB, Shanhai GBCOM Communication Technology Co. Ltd
+0xAC3C0B, Apple
+0xAC3CB4, Nilan A/S
+0xAC3D05, Instorescreen Aisa
+0xAC3D75, HANGZHOU ZHIWAY TECHNOLOGIES CO.,LTD.
+0xAC3FA4, TAIYO YUDEN CO.,LTD
+0xAC40EA, C&T Solution Inc.
+0xAC4122, Eclipse Electronic Systems Inc.
+0xAC44F2, Revolabs Inc
+0xAC4723, Genelec
+0xAC4AFE, Hisense Broadband Multimedia Technology Co.,Ltd.
+0xAC4BC8, Juniper Networks
+0xAC4FFC, SVS-VISTEK GmbH
+0xAC5135, MPI TECH
+0xAC51EE, Cambridge Communication Systems Ltd
+0xAC54EC, IEEE P1823 Standards Working Group
+0xAC583B, Human Assembler, Inc.
+0xAC5D10, Pace Americas
+0xAC5E8C, Utillink
+0xAC6123, Drivven, Inc.
+0xAC6706, Ruckus Wireless
+0xAC6E1A, Shenzhen Gongjin Electronics Co.,Ltd
+0xAC6F4F, Enspert Inc
+0xAC6FBB, TATUNG Technology Inc.
+0xAC6FD9, Valueplus Inc.
+0xAC7236, Lexking Technology Co., Ltd.
+0xAC7289, Intel Corporate
+0xAC7A42, iConnectivity
+0xAC7BA1, Intel Corporate
+0xAC80D6, Hexatronic AB
+0xAC8112, Gemtek Technology Co., Ltd.
+0xAC81F3, Nokia Corporation
+0xAC8317, Shenzhen Furtunetel Communication Co., Ltd
+0xAC83F0, Magenta Video Networks
+0xAC8674, Open Mesh, Inc.
+0xAC867E, Create New Technology (HK) Limited Company
+0xAC8ACD, ROGER D.Wensker, G.Wensker sp.j.
+0xAC8D14, Smartrove Inc
+0xAC932F, Nokia Corporation
+0xAC9403, Envision Peripherals Inc
+0xAC9A96, Lantiq Deutschland GmbH
+0xAC9B84, Smak Tecnologia e Automacao
+0xAC9CE4, Alcatel-Lucent Shanghai Bell Co., Ltd
+0xACA016, CISCO SYSTEMS, INC.
+0xACA22C, Baycity Technologies Ltd
+0xACA430, Peerless AV
+0xACAB8D, Lyngso Marine A/S
+0xACBD0B, IMAC CO.,LTD
+0xACBE75, Ufine Technologies Co.,Ltd.
+0xACBEB6, Visualedge Technology Co., Ltd.
+0xACC2EC, CLT INT'L IND. CORP.
+0xACC698, Kohzu Precision Co., Ltd.
+0xACC935, Ness Corporation
+0xACCA54, Telldus Technologies AB
+0xACCABA, Midokura Co., Ltd.
+0xACCB09, Hefcom Metering (Pty) Ltd
+0xACCC8E, Axis Communications AB
+0xACCE8F, HWA YAO TECHNOLOGIES CO., LTD
+0xACCF23, Hi-flying electronics technology Co.,Ltd
+0xACD180, Crexendo Business Solutions, Inc.
+0xACD364, ABB SPA, ABB SACE DIV.
+0xACD9D6, tci GmbH
+0xACDBDA, Shenzhen Geniatech Inc, Ltd
+0xACDE48, PRIVATE
+0xACE215, Huawei Technologies Co., Ltd
+0xACE348, MadgeTech, Inc
+0xACE64B, Shenzhen Baojia Battery Technology Co., Ltd.
+0xACE87B, Huawei Technologies Co., Ltd
+0xACE87E, Bytemark Computer Consulting Ltd
+0xACE97F, IoT Tech Limited
+0xACE9AA, Hay Systems Ltd
+0xACEA6A, GENIX INFOCOMM CO., LTD.
+0xACEE3B, 6harmonics Inc
+0xACF0B2, Becker Electronics Taiwan Ltd.
+0xACF1DF, D-Link International
+0xACF2C5, Cisco
+0xACF7F3, XIAOMI CORPORATION
+0xACF97E, ELESYS INC.
+0xB01203, Dynamics Hong Kong Limited
+0xB01266, Futaba-Kikaku
+0xB01408, LIGHTSPEED INTERNATIONAL CO.
+0xB01743, EDISON GLOBAL CIRCUITS LLC
+0xB01B7C, Ontrol A.S.
+0xB01C91, Elim Co
+0xB0358D, Nokia Corporation
+0xB03829, Siliconware Precision Industries Co., Ltd.
+0xB03850, Nanjing CAS-ZDC IOT SYSTEM CO.,LTD
+0xB0435D, NuLEDs, Inc.
+0xB046FC, MitraStar Technology Corp.
+0xB0487A, TP-LINK TECHNOLOGIES CO., LTD.
+0xB0518E, Holl technology CO.Ltd.
+0xB058C4, Broadcast Microwave Services, Inc
+0xB05B1F, THERMO FISHER SCIENTIFIC S.P.A.
+0xB05CE5, Nokia Corporation
+0xB06563, Shanghai Railway Communication Factory
+0xB065BD, Apple Inc
+0xB06CBF, 3ality Digital Systems GmbH
+0xB0750C, QA Cafe
+0xB075D5, ZTE Corporation
+0xB077AC, Motorola Mobility, Inc.
+0xB07994, Motorola Mobility LLC
+0xB07D62, Dipl.-Ing. H. Horstmann GmbH
+0xB081D8, I-sys Corp
+0xB08807, Strata Worldwide
+0xB08991, LGE
+0xB08E1A, URadio Systems Co., Ltd
+0xB09074, Fulan Electronics Limited
+0xB09134, Taleo
+0xB0973A, E-Fuel Corporation
+0xB09928, Fujitsu Limited
+0xB09AE2, STEMMER IMAGING GmbH
+0xB09BD4, GNH Software India Private Limited
+0xB0A10A, Pivotal Systems Corporation
+0xB0A72A, Ensemble Designs, Inc.
+0xB0A86E, Juniper Networks
+0xB0AA36, GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD.
+0xB0ACFA, Fujitsu Limited
+0xB0B2DC, Zyxel Communications Corporation
+0xB0B32B, Slican Sp. z o.o.
+0xB0B448, Texas Instruments
+0xB0B8D5, Nanjing Nengrui Auto Equipment CO.,Ltd
+0xB0BD6D, Echostreams Innovative Solutions
+0xB0BDA1, ZAKLAD ELEKTRONICZNY SIMS
+0xB0BF99, WIZITDONGDO
+0xB0C4E7, Samsung Electronics
+0xB0C69A, Juniper Networks
+0xB0C745, Buffalo Inc.
+0xB0C83F, Jiangsu Cynray IOT Co., Ltd.
+0xB0C8AD, People Power Company
+0xB0C95B, Beijing Symtech CO.,LTD
+0xB0CF4D, MI-Zone Technology Ireland
+0xB0D09C, Samsung Electronics Co.,Ltd
+0xB0D2F5, Vello Systems, Inc.
+0xB0E39D, CAT SYSTEM CO.,LTD.
+0xB0E50E, NRG SYSTEMS INC
+0xB0E754, 2Wire
+0xB0E892, SEIKO EPSON CORPORATION
+0xB0E97E, Advanced Micro Peripherals
+0xB0EC71, Samsung Electronics Co.,Ltd
+0xB0EE45, AzureWave Technologies, Inc.
+0xB0F1BC, Dhemax Ingenieros Ltda
+0xB0FAEB, Cisco
+0xB4009C, CableWorld Ltd.
+0xB40142, GCI Science & Technology Co.,LTD
+0xB40418, Smartchip Integrated Inc.
+0xB407F9, SAMSUNG ELECTRO-MECHANICS
+0xB40832, TC Communications
+0xB40B7A, Brusa Elektronik AG
+0xB40C25, Palo Alto Networks
+0xB40E96, HERAN
+0xB40EDC, LG-Ericsson Co.,Ltd.
+0xB41489, CISCO SYSTEMS, INC.
+0xB41DEF, Internet Laboratories, Inc.
+0xB4211D, Beijing GuangXin Technology Co., Ltd
+0xB4218A, Dog Hunter LLC
+0xB428F1, E-Prime Co., Ltd.
+0xB42A39, ORBIT MERRET, spol. s r. o.
+0xB42CBE, Direct Payment Solutions Limited
+0xB431B8, Aviwest
+0xB43564, Fujian Tian Cheng Electron Science & Technical Development Co.,Ltd.
+0xB435F7, Zhejiang Pearmain Electronics Co.ltd.
+0xB43741, Consert, Inc.
+0xB439D6, ProCurve Networking by HP
+0xB43DB2, Degreane Horizon
+0xB4417A, ShenZhen Gongjin Electronics Co.,Ltd
+0xB44CC2, NR ELECTRIC CO., LTD
+0xB451F9, NB Software
+0xB45253, Seagate Technology
+0xB45570, Borea
+0xB45861, CRemote, LLC
+0xB45CA4, Thing-talk Wireless Communication Technologies Corporation Limited
+0xB461FF, Lumigon A/S
+0xB46238, Exablox
+0xB46293, Samsung Electronics Co.,Ltd
+0xB467E9, Qingdao GoerTek Technology Co., Ltd.
+0xB4749F, askey computer corp
+0xB47F5E, Foresight Manufacture (S) Pte Ltd
+0xB48255, Research Products Corporation
+0xB482C5, Relay2, Inc.
+0xB482FE, Askey Computer Corp
+0xB48910, Coster T.E. S.P.A.
+0xB4944E, WeTelecom Co., Ltd.
+0xB49842, zte corporation
+0xB499BA, Hewlett-Packard Company
+0xB49DB4, Axion Technologies Inc.
+0xB49EE6, SHENZHEN TECHNOLOGY CO LTD
+0xB4A4B5, Zen Eye Co.,Ltd
+0xB4A4E3, CISCO SYSTEMS, INC.
+0xB4A5A9, MODI GmbH
+0xB4AA4D, Ensequence, Inc.
+0xB4AB2C, MtM Technology Corporation
+0xB4B017, Avaya, Inc
+0xB4B362, ZTE Corporation
+0xB4B52F, Hewlett Packard
+0xB4B5AF, Minsung Electronics
+0xB4B676, Intel Corporate
+0xB4B88D, Thuh Company
+0xB4C44E, VXL eTech Pvt Ltd
+0xB4C799, Motorola Solutions Inc.
+0xB4C810, UMPI Elettronica
+0xB4CFDB, Shenzhen Jiuzhou Electric Co.,LTD
+0xB4D8A9, BetterBots
+0xB4D8DE, iota Computing, Inc.
+0xB4DD15, ControlThings Oy Ab
+0xB4DF3B, Chromlech
+0xB4DFFA, Litemax Electronics Inc.
+0xB4E0CD, IO Turbine, Inc.
+0xB4E1EB, PRIVATE
+0xB4E9B0, Cisco
+0xB4ED19, Pie Digital, Inc.
+0xB4ED54, Wohler Technologies
+0xB4EED4, Texas Instruments
+0xB4F0AB, Apple
+0xB4F2E8, Pace plc
+0xB4F323, PETATEL INC.
+0xB4FC75, SEMA Electronics(HK) CO.,LTD
+0xB4FE8C, Centro Sicurezza Italia SpA
+0xB80305, Intel Corporate
+0xB80415, Bayan Audio
+0xB80B9D, ROPEX Industrie-Elektronik GmbH
+0xB81413, Keen High Holding(HK) Ltd.
+0xB81619, Motorola Mobility, Inc.
+0xB817C2, Apple, Inc.
+0xB81999, Nesys
+0xB820E7, Guangzhou Horizontal Information & Network Integration Co. Ltd
+0xB82410, Magneti Marelli Slovakia s.r.o.
+0xB826D4, Furukawa Industrial S.A. Produtos Elétricos
+0xB827EB, Raspberry Pi Foundation
+0xB8288B, Parker Hannifin
+0xB829F7, Blaster Tech
+0xB82ADC, EFR Europäische Funk-Rundsteuerung GmbH
+0xB82CA0, Honeywell HomMed
+0xB838CA, Kyokko Tsushin System CO.,LTD
+0xB83A7B, Worldplay (Canada) Inc.
+0xB83D4E, Shenzhen Cultraview Digital Technology Co.,Ltd Shanghai Branch
+0xB83E59, Roku, Inc
+0xB8415F, ASP AG
+0xB85510, Zioncom Electronics (Shenzhen) Ltd.
+0xB85810, NUMERA, INC.
+0xB85AF7, Ouya, Inc
+0xB85AFE, Handaer Communication Technology (Beijing) Co., Ltd
+0xB86091, Onnet Technologies and Innovations LLC
+0xB8616F, Accton Wireless Broadband(AWB), Corp.
+0xB8621F, CISCO SYSTEMS, INC.
+0xB863BC, ROBOTIS, Co, Ltd
+0xB86491, CK Telecom Ltd
+0xB8653B, Bolymin, Inc.
+0xB86B23, Toshiba
+0xB870F4, COMPAL INFORMATION (KUNSHAN) CO., LTD.
+0xB87424, Viessmann Elektronik GmbH
+0xB87447, Convergence Technologies
+0xB8763F, Hon Hai Precision Ind. Co.,Ltd.
+0xB877C3, Decagon Devices, Inc.
+0xB8782E, Apple
+0xB8797E, Secure Meters (UK) Limited
+0xB8871E, Good Mind Industries Co., Ltd.
+0xB888E3, COMPAL INFORMATION (KUNSHAN) CO., LTD
+0xB889CA, ILJIN ELECTRIC Co., Ltd.
+0xB88A60, Intel Corporate
+0xB88D12, Apple, Inc.
+0xB88E3A, Infinite Technologies JLT
+0xB88F14, Analytica GmbH
+0xB8921D, BG T&A
+0xB894D2, Retail Innovation HTT AB
+0xB89674, AllDSP GmbH & Co. KG
+0xB8975A, BIOSTAR Microtech Int'l Corp.
+0xB898B0, Atlona Inc.
+0xB89AED, OceanServer Technology, Inc
+0xB89BC9, SMC Networks Inc
+0xB8A386, D-Link International
+0xB8A3E0, BenRui Technology Co.,Ltd
+0xB8A8AF, Logic S.p.A.
+0xB8AC6F, Dell Inc
+0xB8AE6E, Nintendo Co., Ltd.
+0xB8AF67, Hewlett-Packard Company
+0xB8B1C7, BT&COM CO.,LTD
+0xB8B42E, Gionee Communication Equipment Co,Ltd.ShenZhen
+0xB8B7D7, 2GIG Technologies
+0xB8B94E, Shenzhen iBaby Labs, Inc.
+0xB8BA68, Xi'an Jizhong Digital Communication Co.,Ltd
+0xB8BA72, Cynove
+0xB8BB6D, ENERES Co.,Ltd.
+0xB8BEBF, CISCO SYSTEMS, INC.
+0xB8C46F, PRIMMCON INDUSTRIES INC
+0xB8C68E, Samsung Electronics Co.,Ltd
+0xB8C716, Fiberhome Telecommunication Technologies Co.,LTD
+0xB8C75D, Apple, Inc.
+0xB8CA3A, Dell PCBA Test
+0xB8CDA7, Maxeler Technologies Ltd.
+0xB8D06F, GUANGZHOU HKUST FOK YING TUNG RESEARCH INSTITUTE
+0xB8D49D, M Seven System Ltd.
+0xB8D9CE, Samsung Electronics
+0xB8DAF1, Strahlenschutz- Entwicklungs- und Ausruestungsgesellschaft mbH
+0xB8DAF7, Advanced Photonics, Inc.
+0xB8E589, Payter BV
+0xB8E625, 2Wire
+0xB8E779, 9Solutions Oy
+0xB8E937, Sonos, Inc.
+0xB8EE79, YWire Technologies, Inc.
+0xB8F4D0, Herrmann Ultraschalltechnik GmbH & Co. Kg
+0xB8F5E7, WayTools, LLC
+0xB8F6B1, Apple, Inc.
+0xB8F732, Aryaka Networks Inc
+0xB8F934, Sony Ericsson Mobile Communications AB
+0xB8FD32, Zhejiang ROICX Microelectronics
+0xB8FF61, Apple, Inc.
+0xB8FF6F, Shanghai Typrotech Technology Co.Ltd
+0xB8FFFE, Texas Instruments
+0xBC0200, Stewart Audio
+0xBC0543, AVM GmbH
+0xBC0DA5, Texas Instruments
+0xBC0F2B, FORTUNE TECHGROUP CO.,LTD
+0xBC125E, Beijing WisVideo INC.
+0xBC1401, Hitron Technologies. Inc
+0xBC15A6, Taiwan Jantek Electronics,Ltd.
+0xBC1665, Cisco
+0xBC20A4, Samsung Electronics
+0xBC20BA, Inspur (Shandong) Electronic Information Co., Ltd
+0xBC261D, HONG KONG TECON TECHNOLOGY
+0xBC2846, NextBIT Computing Pvt. Ltd.
+0xBC28D6, Rowley Associates Limited
+0xBC2C55, Bear Flag Design, Inc.
+0xBC305B, Dell Inc.
+0xBC35E5, Hydro Systems Company
+0xBC38D2, Pandachip Limited
+0xBC39A6, CSUN System Technology Co.,LTD
+0xBC3BAF, Apple
+0xBC3E13, Accordance Systems Inc.
+0xBC4377, Hang Zhou Huite Technology Co.,ltd.
+0xBC4760, Samsung Electronics Co.,Ltd
+0xBC4B79, SensingTek
+0xBC4E3C, CORE STAFF CO., LTD.
+0xBC51FE, Swann Communications Pty Ltd
+0xBC52B7, Apple Inc
+0xBC5FF4, ASRock Incorporation
+0xBC629F, Telenet Systems P. Ltd.
+0xBC6778, Apple Inc
+0xBC6784, Environics Oy
+0xBC6A16, tdvine
+0xBC6A29, Texas Instruments
+0xBC6E76, Green Energy Options Ltd
+0xBC71C1, XTrillion, Inc.
+0xBC72B1, Samsung Electronics Co.,Ltd
+0xBC764E, Rackspace US, Inc.
+0xBC7670, Huawei Device Co., Ltd
+0xBC7737, Intel Corporate
+0xBC779F, SBM Co., Ltd.
+0xBC7DD1, Radio Data Comms
+0xBC811F, Ingate Systems
+0xBC8199, BASIC Co.,Ltd.
+0xBC83A7, SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LT
+0xBC851F, Samsung Electronics
+0xBC8B55, NPP ELIKS America Inc. DBA T&M Atlantic
+0xBC926B, Apple
+0xBC99BC, FonSee Technology Inc.
+0xBC9DA5, DASCOM Europe GmbH
+0xBCA4E1, Nabto
+0xBCA9D6, Cyber-Rain, Inc.
+0xBCAEC5, ASUSTek COMPUTER INC.
+0xBCB181, SHARP CORPORATION
+0xBCB1F3, Samsung Electronics
+0xBCB852, Cybera, Inc.
+0xBCBAE1, AREC Inc.
+0xBCBBC9, Kellendonk Elektronik GmbH
+0xBCC168, DinBox Sverige AB
+0xBCC23A, Thomson Video Networks
+0xBCC61A, SPECTRA EMBEDDED SYSTEMS
+0xBCC6DB, Nokia Corporation
+0xBCC810, Cisco SPVTG
+0xBCCD45, VOISMART
+0xBCCFCC, HTC Corporation
+0xBCD177, TP-LINK TECHNOLOGIES CO.,LTD.
+0xBCD5B6, d2d technologies
+0xBCD940, ASR Co,.Ltd.
+0xBCE09D, Eoslink
+0xBCE59F, WATERWORLD Technology Co.,LTD
+0xBCEA2B, CityCom GmbH
+0xBCF2AF, devolo AG
+0xBCF685, D-Link International
+0xBCFE8C, Altronic, LLC
+0xBCFFAC, TOPCON CORPORATION
+0xC00D7E, Additech, Inc.
+0xC011A6, Fort-Telecom ltd.
+0xC01242, Alpha Security Products
+0xC0143D, Hon Hai Precision Ind. Co.,Ltd.
+0xC01885, Hon Hai Precision Ind. Co.,Ltd.
+0xC01E9B, Pixavi AS
+0xC02250, PRIVATE
+0xC02506, AVM GmbH
+0xC027B9, Beijing National Railway Research & Design Institute of Signal & Communication Co., Ltd.
+0xC02973, Audyssey Laboratories Inc.
+0xC029F3, XySystem
+0xC02BFC, iNES. applied informatics GmbH
+0xC02C7A, Shen Zhen Horn audio Co., Ltd.
+0xC035BD, Velocytech Aps
+0xC038F9, Nokia Danmark A/S
+0xC03B8F, Minicom Digital Signage
+0xC03F0E, NETGEAR
+0xC03F2A, Biscotti, Inc.
+0xC041F6, LG Electronics Inc
+0xC04301, Epec Oy
+0xC044E3, Shenzhen Sinkna Electronics Co., LTD
+0xC0493D, MAITRISE TECHNOLOGIQUE
+0xC04A00, TP-LINK TECHNOLOGIES CO.,LTD.
+0xC04DF7, SERELEC
+0xC058A7, Pico Systems Co., Ltd.
+0xC05E6F, V. Stonkaus firma "Kodinis Raktas"
+0xC05E79, SHENZHEN HUAXUN ARK TECHNOLOGIES CO.,LTD
+0xC0626B, CISCO SYSTEMS, INC.
+0xC06C0F, Dobbs Stanford
+0xC07E40, SHENZHEN XDK COMMUNICATION EQUIPMENT CO.,LTD
+0xC08170, Effigis GeoSolutions
+0xC0830A, 2Wire
+0xC0847A, Apple, Inc.
+0xC0885B, SnD Tech Co., Ltd.
+0xC08ADE, Ruckus Wireless
+0xC08B6F, S I Sistemas Inteligentes Eletrônicos Ltda
+0xC09132, Patriot Memory
+0xC09134, ProCurve Networking by HP
+0xC09C92, COBY
+0xC09F42, Apple Inc
+0xC0A0C7, FAIRFIELD INDUSTRIES
+0xC0A0DE, Multi Touch Oy
+0xC0A0E2, Eden Innovations
+0xC0A26D, Abbott Point of Care
+0xC0A364, 3D Systems Massachusetts
+0xC0AA68, OSASI Technos Inc.
+0xC0AC54, SAGEMCOM
+0xC0B339, Comigo Ltd.
+0xC0B357, Yoshiki Electronics Industry Ltd.
+0xC0B8B1, BitBox Ltd
+0xC0BAE6, Application Solutions (Safety and Security) Ltd
+0xC0BD42, ZPA Smart Energy a.s.
+0xC0C1C0, Cisco-Linksys, LLC
+0xC0C3B6, Automatic Systems
+0xC0C520, Ruckus Wireless
+0xC0C946, MITSUYA LABORATORIES INC.
+0xC0CB38, Hon Hai Precision Ind. Co.,Ltd.
+0xC0CFA3, Creative Electronics & Software, Inc.
+0xC0D044, SAGEMCOM
+0xC0D962, Askey Computer Corp.
+0xC0DF77, Conrad Electronic SE
+0xC0E422, Texas Instruments
+0xC0E54E, DENX Computer Systems GmbH
+0xC0EAE4, Sonicwall
+0xC0F8DA, Hon Hai Precision Ind. Co.,Ltd.
+0xC40142, MaxMedia Technology Limited
+0xC4017C, Ruckus Wireless
+0xC401B1, SeekTech INC
+0xC40ACB, CISCO SYSTEMS, INC.
+0xC40F09, Hermes electronic GmbH
+0xC4108A, Ruckus Wireless
+0xC416FA, Prysm Inc
+0xC417FE, Hon Hai Precision Ind. Co.,Ltd.
+0xC4198B, Dominion Voting Systems Corporation
+0xC41ECE, HMI Sources Ltd.
+0xC4237A, WhizNets Inc.
+0xC4242E, Galvanic Applied Sciences Inc
+0xC42628, Airo Wireless
+0xC42C03, Apple, Inc.
+0xC436DA, Rusteletech Ltd.
+0xC438D3, TAGATEC CO.,LTD
+0xC4393A, SMC Networks Inc
+0xC43A9F, Siconix Inc.
+0xC43C3C, CYBELEC SA
+0xC43DC7, NETGEAR
+0xC44567, SAMBON PRECISON and ELECTRONICS
+0xC44619, Hon Hai Precision Ind. Co.,Ltd.
+0xC44AD0, FIREFLIES RTLS
+0xC44B44, Omniprint Inc.
+0xC44EAC, Shenzhen Shiningworth Technology Co., Ltd.
+0xC455A6, Cadac Holdings Ltd
+0xC455C2, Bach-Simpson
+0xC45600, Galleon Embedded Computing
+0xC458C2, Shenzhen TATFOOK Technology Co., Ltd.
+0xC45976, Fugoo
+0xC45DD8, HDMI Forum
+0xC46044, Everex Electronics Limited
+0xC46354, U-Raku, Inc.
+0xC46413, CISCO SYSTEMS, INC.
+0xC467B5, Libratone A/S
+0xC46AB7, Xiaomi Technology,Inc.
+0xC46DF1, DataGravity
+0xC47130, Fon Technology S.L.
+0xC471FE, CISCO SYSTEMS, INC.
+0xC4731E, Samsung Eletronics Co., Ltd
+0xC47B2F, Beijing JoinHope Image Technology Ltd.
+0xC47BA3, NAVIS Inc.
+0xC47D4F, CISCO SYSTEMS, INC.
+0xC47DCC, Motorola Solutions Inc.
+0xC4823F, Fujian Newland Auto-ID Tech. Co,.Ltd.
+0xC48508, Intel Corporation
+0xC488E5, Samsung Electronics Co.,Ltd
+0xC49300, 8Devices
+0xC49313, 100fio networks technology llc
+0xC495A2, SHENZHEN WEIJIU INDUSTRY AND TRADE DEVELOPMENT CO., LTD
+0xC49805, Minieum Networks, Inc
+0xC4AAA1, SUMMIT DEVELOPMENT, spol.s r.o.
+0xC4AD21, MEDIAEDGE Corporation
+0xC4B512, General Electric Digital Energy
+0xC4BA99, I+ME Actia Informatik und Mikro-Elektronik GmbH
+0xC4C19F, National Oilwell Varco Instrumentation, Monitoring, and Optimization (NOV IMO)
+0xC4CAD9, Hangzhou H3C Technologies Co., Limited
+0xC4CD45, Beijing Boomsense Technology CO.,LTD.
+0xC4D489, JiangSu Joyque Information Industry Co.,Ltd
+0xC4D987, Intel Corporate
+0xC4DA26, NOBLEX SA
+0xC4E032, IEEE 1904.1 Working Group
+0xC4E17C, U2S co.
+0xC4E7BE, SCSpro Co.,Ltd
+0xC4EBE3, RRCN SAS
+0xC4EDBA, Texas Instruments
+0xC4EEAE, VSS Monitoring
+0xC4EEF5, Oclaro, Inc.
+0xC4F464, Spica international
+0xC4F57C, Brocade Communications Systems, Inc.
+0xC4FCE4, DishTV NZ Ltd
+0xC802A6, Beijing Newmine Technology
+0xC80718, TDSi
+0xC80AA9, Quanta Computer Inc.
+0xC80E77, Le Shi Zhi Xin Electronic Technology (Tianjin) Co.,Ltd
+0xC80E95, OmniLync Inc.
+0xC819F7, Samsung Electronics Co.,Ltd
+0xC81AFE, DLOGIC GmbH
+0xC81E8E, ADV Security (S) Pte Ltd
+0xC8208E, Storagedata
+0xC8292A, Barun Electronics
+0xC82A14, Apple, Inc
+0xC82E94, Halfa Enterprise Co., Ltd.
+0xC83232, Hunting Innova
+0xC8334B, Apple, Inc.
+0xC835B8, Ericsson, EAB/RWI/K
+0xC83A35, Tenda Technology Co., Ltd.
+0xC83B45, JRI-Maxant
+0xC83D97, Nokia Corporation
+0xC83E99, Texas Instruments
+0xC83EA7, KUNBUS GmbH
+0xC84529, IMK Networks Co.,Ltd
+0xC84544, Shanghai Enlogic Electric Technology Co., Ltd.
+0xC848F5, MEDISON Xray Co., Ltd
+0xC84C75, CISCO SYSTEMS, INC.
+0xC85645, Intermas France
+0xC86000, ASUSTek COMPUTER INC.
+0xC864C7, zte corporation
+0xC86C1E, Display Systems Ltd
+0xC86C87, Zyxel Communications Corp
+0xC86CB6, Optcom Co., Ltd.
+0xC86F1D, Apple
+0xC87248, Aplicom Oy
+0xC87B5B, zte corporation
+0xC87CBC, Valink Co., Ltd.
+0xC87D77, Shenzhen Kingtech Communication Equipment Co.,Ltd
+0xC87E75, Samsung Electronics Co.,Ltd
+0xC88439, Sunrise Technologies
+0xC88447, Beautiful Enterprise Co., Ltd
+0xC8873B, Net Optics
+0xC88A83, Dongguan HuaHong Electronics Co.,Ltd
+0xC88B47, Nolangroup S.P.A con Socio Unico
+0xC8903E, Pakton Technologies
+0xC89346, MXCHIP Company Limited
+0xC89383, Embedded Automation, Inc.
+0xC894D2, Jiangsu Datang Electronic Products Co., Ltd
+0xC8979F, Nokia Corporation
+0xC89C1D, CISCO SYSTEMS, INC.
+0xC89CDC, ELITEGROUP COMPUTER SYSTEM CO., LTD.
+0xC89F42, VDII Innovation AB
+0xC8A030, Texas Instruments
+0xC8A1B6, Shenzhen Longway Technologies Co., Ltd
+0xC8A1BA, Neul Ltd
+0xC8A620, Nebula, Inc
+0xC8A70A, Verizon Business
+0xC8A729, SYStronics Co., Ltd.
+0xC8AA21, Motorola Mobility, Inc.
+0xC8AACC, PRIVATE
+0xC8AE9C, Shanghai TYD Elecronic Technology Co. Ltd
+0xC8AF40, marco Systemanalyse und Entwicklung GmbH
+0xC8B373, Cisco-Linksys, LLC
+0xC8BBD3, Embrane
+0xC8BCC8, Apple, Inc.
+0xC8BE19, D-Link International
+0xC8C126, ZPM Industria e Comercio Ltda
+0xC8C13C, RuggedTek Hangzhou Co., Ltd
+0xC8C791, Zero1.tv GmbH
+0xC8CBB8, Hewlett Packard
+0xC8CD72, SAGEMCOM
+0xC8D15E, Huawei Technologies Co., Ltd
+0xC8D1D1, AGAiT Technology Corporation
+0xC8D2C1, Jetlun (Shenzhen) Corporation
+0xC8D3A3, D-Link International
+0xC8D5FE, Shenzhen Zowee Technology Co., Ltd
+0xC8D719, Cisco Consumer Products, LLC
+0xC8DDC9, Lenovo Mobile Communication Technology Ltd.
+0xC8DE51, Integra Networks, Inc.
+0xC8DF7C, Nokia Corporation
+0xC8E1A7, Vertu Corporation Limited
+0xC8EE08, TANGTOP TECHNOLOGY CO.,LTD
+0xC8EEA6, Shenzhen SHX Technology Co., Ltd
+0xC8EF2E, Beijing Gefei Tech. Co., Ltd
+0xC8F406, Avaya, Inc
+0xC8F704, Building Block Video
+0xC8F733, Intel Corporate
+0xC8F981, Seneca s.r.l.
+0xC8F9F9, CISCO SYSTEMS, INC.
+0xC8FB26, Cisco SPVTG
+0xC8FE30, Bejing DAYO Mobile Communication Technology Ltd.
+0xCC0080, TRUST SYSTEM Co.,
+0xCC047C, G-WAY Microwave
+0xCC051B, Samsung Electronics Co.,Ltd
+0xCC08E0, Apple, Inc.
+0xCC09C8, IMAQLIQ LTD
+0xCC0CDA, Miljovakt AS
+0xCC0DEC, Cisco SPVTG
+0xCC14A6, Yichun MyEnergy Domain, Inc
+0xCC187B, Manzanita Systems, Inc.
+0xCC1AFA, zte corporation
+0xCC1EFF, Metrological Group BV
+0xCC2218, InnoDigital Co., Ltd.
+0xCC262D, Verifi, LLC
+0xCC2D8C, LG ELECTRONICS INC
+0xCC34D7, GEWISS S.P.A.
+0xCC3A61, SAMSUNG ELECTRO MECHANICS CO., LTD.
+0xCC3C3F, SA.S.S. Datentechnik AG
+0xCC3E5F, Hewlett Packard
+0xCC43E3, Trump s.a.
+0xCC4BFB, Hellberg Safety AB
+0xCC4E24, Brocade Communications Systems, Inc.
+0xCC501C, KVH Industries, Inc.
+0xCC5076, Ocom Communications, Inc.
+0xCC52AF, Universal Global Scientific Industrial Co., Ltd.
+0xCC53B5, HUAWEI TECHNOLOGIES CO.,LTD
+0xCC5459, OnTime Networks AS
+0xCC55AD, RIM
+0xCC593E, TOUMAZ LTD
+0xCC5C75, Weightech Com. Imp. Exp. Equip. Pesagem Ltda
+0xCC5D4E, ZyXEL Communications Corporation
+0xCC5D57, Information System Research Institute,Inc.
+0xCC60BB, Empower RF Systems
+0xCC69B0, Global Traffic Technologies, LLC
+0xCC6B98, Minetec Wireless Technologies
+0xCC6BF1, Sound Masking Inc.
+0xCC6DA0, Roku, Inc.
+0xCC6DEF, TJK Tietolaite Oy
+0xCC7669, SEETECH
+0xCC785F, Apple
+0xCC7A30, CMAX Wireless Co., Ltd.
+0xCC7D37, Motorola Mobility, Inc.
+0xCC7EE7, Panasonic AVC Networks Company
+0xCC8CE3, Texas Instruments
+0xCC9093, Hansong Tehnologies
+0xCC912B, TE Connectivity Touch Solutions
+0xCC944A, Pfeiffer Vacuum GmbH
+0xCC96A0, Huawei Device Co., Ltd
+0xCC9E00, Nintendo Co., Ltd.
+0xCCA374, Guangdong Guanglian Electronic Technology Co.Ltd
+0xCCA462, ARRIS Group, Inc.
+0xCCAF78, Hon Hai Precision Ind. Co.,Ltd.
+0xCCB255, D-Link International
+0xCCB3F8, FUJITSU ISOTEC LIMITED
+0xCCB55A, Fraunhofer ITWM
+0xCCB888, AnB Securite s.a.
+0xCCB8F1, EAGLE KINGDOM TECHNOLOGIES LIMITED
+0xCCBE71, OptiLogix BV
+0xCCC104, Applied Technical Systems
+0xCCC50A, SHENZHEN DAJIAHAO TECHNOLOGY CO.,LTD
+0xCCC62B, Tri-Systems Corporation
+0xCCC8D7, CIAS Elettronica srl
+0xCCCC4E, Sun Fountainhead USA. Corp
+0xCCCC81, HUAWEI TECHNOLOGIES CO.,LTD
+0xCCCD64, SM-Electronic GmbH
+0xCCCE40, Janteq Corp
+0xCCD539, Cisco
+0xCCD811, Aiconn Technology Corporation
+0xCCD9E9, SCR Engineers Ltd.
+0xCCE798, My Social Stuff
+0xCCE7DF, American Magnetics, Inc.
+0xCCEA1C, DCONWORKS Co., Ltd
+0xCCEED9, Deto Mechatronic GmbH
+0xCCEF48, CISCO SYSTEMS, INC.
+0xCCF3A5, Chi Mei Communication Systems, Inc
+0xCCF67A, Ayecka Communication Systems LTD
+0xCCF841, Lumewave
+0xCCF8F0, Xi'an HISU Multimedia Technology Co.,Ltd.
+0xCCF954, Avaya, Inc
+0xCCF9E8, Samsung Electronics Co.,Ltd
+0xCCFC6D, RIZ TRANSMITTERS
+0xCCFCB1, Wireless Technology, Inc.
+0xCCFE3C, Samsung Electronics
+0xD00790, Texas Instruments
+0xD0131E, Sunrex Technology Corp
+0xD0154A, zte corporation
+0xD0176A, Samsung Electronics Co.,Ltd
+0xD01AA7, UniPrint
+0xD01CBB, Beijing Ctimes Digital Technology Co., Ltd.
+0xD023DB, Apple, Inc.
+0xD02788, Hon Hai Precision Ind.Co.Ltd
+0xD02DB3, Huawei Technologies Co., Ltd
+0xD03110, Ingenic Semiconductor Co.,Ltd
+0xD03761, Texas Instruments
+0xD046DC, Southwest Research Institute
+0xD04CC1, SINTRONES Technology Corp.
+0xD05099, ASRock Incorporation
+0xD05162, Sony Mobile Communications AB
+0xD052A8, Physical Graph Corporation
+0xD0542D, Cambridge Industries(Group) Co.,Ltd.
+0xD0574C, CISCO SYSTEMS, INC.
+0xD05785, Pantech Co., Ltd.
+0xD05875, Active Control Technology Inc.
+0xD059C3, CeraMicro Technology Corporation
+0xD05A0F, I-BT DIGITAL CO.,LTD
+0xD05FCE, Hitachi Data Systems
+0xD063B4, SolidRun Ltd.
+0xD0667B, Samsung Electronics Co., LTD
+0xD067E5, Dell Inc
+0xD0699E, LUMINEX Lighting Control Equipment
+0xD0738E, DONG OH PRECISION CO., LTD.
+0xD073D5, LIFI LABS MANAGEMENT PTY LTD
+0xD075BE, Reno A&E
+0xD07DE5, Forward Pay Systems, Inc.
+0xD07E28, Hewlett Packard
+0xD08999, APCON, Inc.
+0xD08B7E, Passif Semiconductor
+0xD08CB5, Texas Instruments
+0xD08CFF, UPWIS AB
+0xD093F8, Stonestreet One LLC
+0xD09B05, Emtronix
+0xD0A311, Neuberger Gebäudeautomation GmbH
+0xD0AEEC, Alpha Networks Inc.
+0xD0AFB6, Linktop Technology Co., LTD
+0xD0B33F, SHENZHEN TINNO MOBILE TECHNOLOGY CO.,LTD.
+0xD0B498, Robert Bosch LLC Automotive Electronics
+0xD0B53D, SEPRO ROBOTIQUE
+0xD0BB80, SHL Telemedicine International Ltd.
+0xD0BE2C, CNSLink Co., Ltd.
+0xD0C1B1, Samsung Electronics Co.,Ltd
+0xD0C282, CISCO SYSTEMS, INC.
+0xD0CDE1, Scientech Electronics
+0xD0CF5E, Energy Micro AS
+0xD0D0FD, CISCO SYSTEMS, INC.
+0xD0D212, K2NET Co.,Ltd.
+0xD0D286, Beckman Coulter K.K.
+0xD0D3FC, Mios, Ltd.
+0xD0D471, MVTECH co., Ltd
+0xD0D6CC, Wintop
+0xD0DB32, Nokia Corporation
+0xD0DF9A, Liteon Technology Corporation
+0xD0DFB2, Genie Networks Limited
+0xD0DFC7, Samsung Electronics Co.,Ltd
+0xD0E347, Yoga
+0xD0E40B, Wearable Inc.
+0xD0E54D, Pace plc
+0xD0E782, Azurewave Technologies, Inc.
+0xD0EB03, Zhehua technology limited
+0xD0EB9E, Seowoo Inc.
+0xD0F0DB, Ericsson
+0xD0F27F, SteadyServ Technoligies, LLC
+0xD0F73B, Helmut Mauell GmbH
+0xD4000D, Phoenix Broadband Technologies, LLC.
+0xD40057, MC Technologies GmbH
+0xD40129, Broadcom Corporation
+0xD4016D, TP-LINK TECHNOLOGIES CO.,LTD.
+0xD4024A, Delphian Systems LLC
+0xD40FB2, Applied Micro Electronics AME bv
+0xD410CF, Huanshun Network Science and Technology Co., Ltd.
+0xD411D6, ShotSpotter, Inc.
+0xD41296, Anobit Technologies Ltd.
+0xD412BB, Quadrant Components Inc. Ltd
+0xD4136F, Asia Pacific Brands
+0xD41C1C, RCF S.P.A.
+0xD41E35, TOHO Electronics INC.
+0xD41F0C, TVI Vision Oy
+0xD4206D, HTC Corporation
+0xD4223F, Lenovo Mobile Communication Technology Ltd.
+0xD42751, Infopia Co., Ltd
+0xD428B2, ioBridge, Inc.
+0xD429EA, Zimory GmbH
+0xD42C3D, Sky Light Digital Limited
+0xD43A65, IGRS Engineering Lab Ltd.
+0xD43AE9, DONGGUAN ipt INDUSTRIAL CO., LTD
+0xD43D67, Carma Industries Inc.
+0xD43D7E, Micro-Star Int'l Co, Ltd
+0xD443A8, Changzhou Haojie Electric Co., Ltd.
+0xD44B5E, TAIYO YUDEN CO., LTD.
+0xD44C24, Vuppalamritha Magnetic Components LTD
+0xD44CA7, Informtekhnika & Communication, LLC
+0xD44F80, Kemper Digital GmbH
+0xD4507A, CEIVA Logic, Inc
+0xD45251, IBT Ingenieurbureau Broennimann Thun
+0xD45297, nSTREAMS Technologies, Inc.
+0xD453AF, VIGO System S.A.
+0xD45AB2, Galleon Systems
+0xD45C70, Wireless Gigabit Alliance
+0xD45D42, Nokia Corporation
+0xD464F7, CHENGDU USEE DIGITAL TECHNOLOGY CO., LTD
+0xD466A8, Riedo Networks GmbH
+0xD46CBF, Goodrich ISR
+0xD46CDA, CSM GmbH
+0xD46E5C, Huawei Technologies Co., Ltd
+0xD46F42, WAXESS USA Inc
+0xD479C3, Cameronet GmbH & Co. KG
+0xD47B75, HARTING Electronics GmbH & Co. KG
+0xD4823E, Argosy Technologies, Ltd.
+0xD48564, Hewlett-Packard Company
+0xD487D8, Samsung Electronics
+0xD48890, Samsung Electronics Co.,Ltd
+0xD48CB5, CISCO SYSTEMS, INC.
+0xD48FAA, Sogecam Industrial, S.A.
+0xD491AF, Electroacustica General Iberica, S.A.
+0xD493A0, Fidelix Oy
+0xD4945A, COSMO CO., LTD
+0xD494A1, Texas Instruments
+0xD49524, Clover Network, Inc.
+0xD496DF, SUNGJIN C&T CO.,LTD
+0xD49A20, Apple, Inc
+0xD49C28, JayBird Gear LLC
+0xD49C8E, University of FUKUI
+0xD49E6D, Wuhan Zhongyuan Huadian Science & Technology Co.,
+0xD4A02A, CISCO SYSTEMS, INC.
+0xD4A425, SMAX Technology Co., Ltd.
+0xD4A499, InView Technology Corporation
+0xD4A928, GreenWave Reality Inc
+0xD4AAFF, MICRO WORLD
+0xD4AC4E, BODi rS, LLC
+0xD4AE52, Dell Inc
+0xD4BED9, Dell Inc
+0xD4BF2D, SE Controls Asia Pacific Ltd
+0xD4BF7F, UPVEL
+0xD4C1FC, Nokia Corporation
+0xD4C766, Acentic GmbH
+0xD4C9EF, Hewlett Packard
+0xD4CA6D, Routerboard.com
+0xD4CA6E, u-blox AG
+0xD4CBAF, Nokia Corporation
+0xD4CEB8, Enatel LTD
+0xD4D184, ADB Broadband Italia
+0xD4D249, Power Ethernet
+0xD4D748, CISCO SYSTEMS, INC.
+0xD4D898, Korea CNO Tech Co., Ltd
+0xD4DF57, Alpinion Medical Systems
+0xD4E32C, S. Siedle & Sohne
+0xD4E33F, Alcatel-Lucent
+0xD4E8B2, Samsung Electronics
+0xD4EA0E, Avaya, Inc
+0xD4EC0C, Harley-Davidson Motor Company
+0xD4EE07, HIWIFI Co., Ltd.
+0xD4F027, Navetas Energy Management
+0xD4F0B4, Napco Security Technologies
+0xD4F143, IPROAD.,Inc
+0xD4F63F, IEA S.R.L.
+0xD8004D, Apple
+0xD8052E, Skyviia Corporation
+0xD806D1, Honeywell Fire System (Shanghai) Co,. Ltd.
+0xD808F5, Arcadia Networks Co. Ltd.
+0xD809C3, Cercacor Labs
+0xD80DE3, FXI TECHNOLOGIES AS
+0xD8160A, Nippon Electro-Sensory Devices
+0xD8182B, Conti Temic Microelectronic GmbH
+0xD819CE, Telesquare
+0xD81BFE, TWINLINX CORPORATION
+0xD81C14, Compacta International, Ltd.
+0xD81EDE, B&W Group Ltd
+0xD824BD, CISCO SYSTEMS, INC.
+0xD826B9, Guangdong Coagent Electronics S &T Co., Ltd.
+0xD828C9, General Electric Consumer and Industrial
+0xD82916, Ascent Communication Technology
+0xD82986, Best Wish Technology LTD
+0xD82A7E, Nokia Corporation
+0xD82DE1, Tricascade Inc.
+0xD83062, Apple, Inc
+0xD831CF, Samsung Electronics Co.,Ltd
+0xD8337F, Office FA.com Co.,Ltd.
+0xD842AC, FreeComm Data Communication Co.,Ltd.
+0xD84606, Silicon Valley Global Marketing
+0xD84B2A, Cognitas Technologies, Inc.
+0xD8543A, Texas Instruments
+0xD857EF, Samsung Electronics
+0xD85D4C, TP-LINK Technologies Co.,Ltd.
+0xD85D84, CAx soft GmbH
+0xD867D9, CISCO SYSTEMS, INC.
+0xD86BF7, Nintendo Co., Ltd.
+0xD86CE9, SAGEMCOM SAS
+0xD87157, Lenovo Mobile Communication Technology Ltd.
+0xD87533, Nokia Corporation
+0xD8760A, Escort, Inc.
+0xD878E5, KUHN SA
+0xD87988, Hon Hai Precision Ind. Co., Ltd.
+0xD88A3B, UNIT-EM
+0xD8952F, Texas Instruments
+0xD89685, GoPro
+0xD8973B, Emerson Network Power Embedded Power
+0xD89760, C2 Development, Inc.
+0xD89D67, Hewlett Packard
+0xD89DB9, eMegatech International Corp.
+0xD89E3F, Apple, Inc.
+0xD8A25E, Apple, Inc.
+0xD8AE90, Itibia Technologies
+0xD8AF3B, Hangzhou Bigbright Integrated communications system Co.,Ltd
+0xD8AFF1, Panasonic Appliances Company
+0xD8B02E, Guangzhou Zonerich Business Machine Co., Ltd
+0xD8B12A, Panasonic Mobile Communications Co., Ltd.
+0xD8B377, HTC Corporation
+0xD8B6C1, NetworkAccountant, Inc.
+0xD8B8F6, Nantworks
+0xD8B90E, Triple Domain Vision Co.,Ltd.
+0xD8BF4C, Victory Concept Electronics Limited
+0xD8C068, Netgenetech.co.,ltd.
+0xD8C3FB, DETRACOM
+0xD8C691, Hichan Technology Corp.
+0xD8C7C8, Aruba Networks
+0xD8C99D, EA DISPLAY LIMITED
+0xD8D1CB, Apple
+0xD8D27C, JEMA ENERGY, SA
+0xD8D385, Hewlett-Packard Company
+0xD8D5B9, Rainforest Automation, Inc.
+0xD8D67E, GSK CNC EQUIPMENT CO.,LTD
+0xD8DF0D, beroNet GmbH
+0xD8E3AE, CIRTEC MEDICAL SYSTEMS
+0xD8E72B, OnPATH Technologies
+0xD8E743, Wush, Inc
+0xD8E952, KEOPSYS
+0xD8EB97, TRENDnet, Inc.
+0xD8F0F2, Zeebo Inc
+0xD8FE8F, IDFone Co., Ltd.
+0xDC0265, Meditech Kft
+0xDC028E, zte corporation
+0xDC05ED, Nabtesco Corporation
+0xDC07C1, HangZhou QiYang Technology Co.,Ltd.
+0xDC0B1A, ADB Broadband Italia
+0xDC0EA1, COMPAL INFORMATION (KUNSHAN) CO., LTD
+0xDC16A2, Medtronic Diabetes
+0xDC175A, Hitachi High-Technologies Corporation
+0xDC1D9F, U & B tech
+0xDC1DD4, Microstep-MIS spol. s r.o.
+0xDC1EA3, Accensus LLC
+0xDC2008, ASD Electronics Ltd
+0xDC2A14, Shanghai Longjing Technology Co.
+0xDC2B61, Apple, Inc.
+0xDC2B66, Infoblock
+0xDC2BCA, Zera GmbH
+0xDC2C26, Iton Technology Limited
+0xDC2E6A, HCT. Co., Ltd.
+0xDC309C, SAY Systems Limited
+0xDC3350, TechSAT GmbH
+0xDC37D2, Hunan HKT Electronic Technology Co., Ltd
+0xDC3A5E, Roku, Inc
+0xDC3C2E, Manufacturing System Insights, Inc.
+0xDC3C84, Ticom Geomatics, Inc.
+0xDC3E51, Solberg & Andersen AS
+0xDC4517, Motorola Mobility, Inc.
+0xDC49C9, CASCO SIGNAL LTD
+0xDC4EDE, SHINYEI TECHNOLOGY CO., LTD.
+0xDC5726, Power-One
+0xDC647C, C.R.S. iiMotion GmbH
+0xDC6F08, Bay Storage Technology
+0xDC7144, Samsung Electro Mechanics
+0xDC7B94, CISCO SYSTEMS, INC.
+0xDC825B, JANUS, spol. s r.o.
+0xDC85DE, Azurewave Technologies., inc.
+0xDC9B1E, Intercom, Inc.
+0xDC9C52, Sapphire Technology Limited.
+0xDC9FA4, Nokia Corporation
+0xDC9FDB, Ubiquiti Networks, Inc.
+0xDCA6BD, Beijing Lanbo Technology Co., Ltd.
+0xDCA7D9, Compressor Controls Corp
+0xDCA8CF, New Spin Golf, LLC.
+0xDCA971, Intel Corporate
+0xDCA989, MACANDC
+0xDCB058, Burkert Werke GmbH
+0xDCB4C4, Microsoft XCG
+0xDCBF90, HUIZHOU QIAOXING TELECOMMUNICATION INDUSTRY CO.,LTD.
+0xDCC0DB, Shenzhen Kaiboer Technology Co., Ltd.
+0xDCC101, SOLiD Technologies, Inc.
+0xDCCBA8, Explora Technologies Inc
+0xDCCE41, FE GLOBAL HONG KONG LIMITED
+0xDCCF94, Beijing Rongcheng Hutong Technology Co., Ltd.
+0xDCD0F7, Bentek Systems Ltd.
+0xDCD2FC, HUAWEI TECHNOLOGIES CO.,LTD
+0xDCD321, HUMAX co.,tld
+0xDCD87F, Shenzhen JoinCyber Telecom Equipment Ltd
+0xDCDECA, Akyllor
+0xDCE2AC, Lumens Digital Optics Inc.
+0xDCE71C, AUG Elektronik GmbH
+0xDCF05D, Letta Teknoloji
+0xDCF858, Lorent Networks, Inc.
+0xDCFAD5, STRONG Ges.m.b.H.
+0xE005C5, TP-LINK Technologies Co.,Ltd.
+0xE006E6, Hon Hai Precision Ind. Co.,Ltd.
+0xE00B28, Inovonics
+0xE00C7F, Nintendo Co., Ltd.
+0xE0143E, Modoosis Inc.
+0xE01877, Fujitsu Limited
+0xE01C41, Aerohive Networks Inc.
+0xE01CEE, Bravo Tech, Inc.
+0xE01D3B, Cambridge Industries(Group) Co.,Ltd
+0xE01E07, Anite Telecoms US. Inc
+0xE01F0A, Xslent Energy Technologies. LLC
+0xE0247F, HUAWEI TECHNOLOGIES CO.,LTD
+0xE02538, Titan Pet Products
+0xE02630, Intrigue Technologies, Inc.
+0xE02636, Nortel Networks
+0xE0271A, TTC Next-generation Home Network System WG
+0xE02A82, Universal Global Scientific Industrial Co., Ltd.
+0xE02F6D, Cisco
+0xE03005, Alcatel-Lucent Shanghai Bell Co., Ltd
+0xE039D7, Plexxi, Inc.
+0xE03C5B, SHENZHEN JIAXINJIE ELECTRON CO.,LTD
+0xE03E7D, data-complex GmbH
+0xE0469A, NETGEAR
+0xE05597, Emergent Vision Technologies Inc.
+0xE0589E, Laerdal Medical
+0xE05B70, Innovid, Co., Ltd.
+0xE05DA6, Detlef Fink Elektronik & Softwareentwicklung
+0xE05FB9, CISCO SYSTEMS, INC.
+0xE061B2, HANGZHOU ZENOINTEL TECHNOLOGY CO., LTD
+0xE06290, Jinan Jovision Science & Technology Co., Ltd.
+0xE063E5, Sony Mobile Communications AB
+0xE064BB, DigiView S.r.l.
+0xE06995, PEGATRON CORPORATION
+0xE0757D, Motorola Mobility LLC
+0xE07C62, Whistle Labs, Inc.
+0xE08177, GreenBytes, Inc.
+0xE087B1, Nata-Info Ltd.
+0xE08A7E, Exponent
+0xE08FEC, REPOTEC CO., LTD.
+0xE09153, XAVi Technologies Corp.
+0xE091F5, NETGEAR
+0xE09467, Intel Corporate
+0xE09579, ORTHOsoft inc, d/b/a Zimmer CAS
+0xE09D31, Intel Corporate
+0xE09DB8, PLANEX COMMUNICATIONS INC.
+0xE0A1D7, SFR
+0xE0A30F, Pevco
+0xE0A670, Nokia Corporation
+0xE0AAB0, GENERAL VISION ELECTRONICS CO. LTD.
+0xE0ABFE, Orb Networks, Inc.
+0xE0AE5E, ALPS Electric Co,. Ltd.
+0xE0AEED, LOENK
+0xE0B7B1, Pace plc
+0xE0B9A5, Azurewave
+0xE0B9BA, Apple, Inc.
+0xE0BC43, C2 Microsystems, Inc.
+0xE0C286, Aisai Communication Technology Co., Ltd.
+0xE0C2B7, Masimo Corporation
+0xE0C3F3, ZTE Corporation
+0xE0C6B3, MilDef AB
+0xE0C79D, Texas Instruments
+0xE0C922, Jireh Energy Tech., Ltd.
+0xE0C97A, Apple Inc
+0xE0CA4D, Shenzhen Unistar Communication Co.,LTD
+0xE0CA94, Askey Computer
+0xE0CB1D, PRIVATE
+0xE0CB4E, ASUSTek COMPUTER INC.
+0xE0CEC3, ASKEY COMPUTER CORP
+0xE0CF2D, Gemintek Corporation
+0xE0D10A, Katoudenkikougyousyo co ltd
+0xE0D7BA, Texas Instruments
+0xE0D9A2, Hippih aps
+0xE0DADC, JVC KENWOOD Corporation
+0xE0DB55, Dell Inc
+0xE0E751, Nintendo Co., Ltd.
+0xE0E8E8, Olive Telecommunication Pvt. Ltd
+0xE0ED1A, vastriver Technology Co., Ltd
+0xE0EDC7, Shenzhen Friendcom Technology Development Co., Ltd
+0xE0EE1B, Panasonic Automotive Systems Company of America
+0xE0EF25, Lintes Technology Co., Ltd.
+0xE0F211, Digitalwatt
+0xE0F379, Vaddio
+0xE0F5C6, Apple Inc
+0xE0F5CA, CHENG UEI PRECISION INDUSTRY CO.,LTD.
+0xE0F847, Apple, Inc.
+0xE0F9BE, Cloudena Corp.
+0xE4115B, Hewlett Packard
+0xE41289, topsystem Systemhaus GmbH
+0xE41C4B, V2 TECHNOLOGY, INC.
+0xE41F13, IBM Corp
+0xE425E7, Apple
+0xE425E9, Color-Chip
+0xE42771, Smartlabs
+0xE42AD3, Magneti Marelli S.p.A. Powertrain
+0xE42C56, Lilee Systems, Ltd.
+0xE42F26, Fiberhome Telecommunication Tech.Co.,Ltd.
+0xE42FF6, Unicore communication Inc.
+0xE43593, Hangzhou GoTo technology Co.Ltd
+0xE435FB, Sabre Technology (Hull) Ltd
+0xE437D7, HENRI DEPAEPE S.A.S.
+0xE43FA2, Wuxi DSP Technologies Inc.
+0xE441E6, Ottec Technology GmbH
+0xE446BD, C&C TECHNIC TAIWAN CO., LTD.
+0xE448C7, Cisco SPVTG
+0xE44E18, Gardasoft VisionLimited
+0xE44F29, MA Lighting Technology GmbH
+0xE44F5F, EDS Elektronik Destek San.Tic.Ltd.Sti
+0xE455EA, Dedicated Computing
+0xE45614, Suttle Apparatus
+0xE457A8, Stuart Manufacturing, Inc.
+0xE46449, Motorola Mobility, Inc.
+0xE467BA, Danish Interpretation Systems A/S
+0xE468A3, HUAWEI TECHNOLOGIES CO.,LTD
+0xE46C21, messMa GmbH
+0xE47185, Securifi Ltd
+0xE4751E, Getinge Sterilization AB
+0xE477D4, Minrray Industry Co.,Ltd
+0xE47CF9, Samsung Electronics Co., LTD
+0xE47D5A, Beijing Hanbang Technology Corp.
+0xE48399, Motorola Mobility, Inc.
+0xE48AD5, RF WINDOW CO., LTD.
+0xE48B7F, Apple
+0xE49069, Rockwell Automation
+0xE492E7, Gridlink Tech. Co.,Ltd.
+0xE496AE, ALTOGRAPHICS Inc.
+0xE497F0, Shanghai VLC Technologies Ltd. Co.
+0xE4A5EF, TRON LINK ELECTRONICS CO., LTD.
+0xE4A7FD, Cellco Partnership
+0xE4AB46, UAB Selteka
+0xE4AD7D, SCL Elements
+0xE4AFA1, HES-SO
+0xE4B021, Samsung Electronics Co.,Ltd
+0xE4C146, Objetivos y Servicios de Valor A
+0xE4C6E6, Mophie, LLC
+0xE4C806, Ceiec Electric Technology Inc.
+0xE4CE8F, Apple, Inc.
+0xE4D3F1, Cisco
+0xE4D53D, Hon Hai Precision Ind. Co.,Ltd.
+0xE4D71D, Oraya Therapeutics
+0xE4DD79, En-Vision America, Inc.
+0xE4E0C5, Samsung Electronics Co., LTD
+0xE4E409, LEIFHEIT AG
+0xE4EC10, Nokia Corporation
+0xE4EEFD, MR&D Manufacturing
+0xE4F365, Time-O-Matic, Inc.
+0xE4F7A1, Datafox GmbH
+0xE4FA1D, PAD Peripheral Advanced Design Inc.
+0xE4FFDD, ELECTRON INDIA
+0xE8039A, Samsung Electronics Co.,LTD
+0xE8040B, Apple, Inc.
+0xE80462, CISCO SYSTEMS, INC.
+0xE804F3, Throughtek Co., Ltd.
+0xE8056D, Nortel Networks
+0xE80688, Apple, Inc.
+0xE80B13, Akib Systems Taiwan, INC
+0xE80C38, DAEYOUNG INFORMATION SYSTEM CO., LTD
+0xE80C75, Syncbak, Inc.
+0xE8102E, Really Simple Software, Inc
+0xE81132, Samsung Electronics Co.,LTD
+0xE81324, GuangZhou Bonsoninfo System CO.,LTD
+0xE82877, TMY Co., Ltd.
+0xE828D5, Cots Technology
+0xE82AEA, Intel Corporate
+0xE82E24, Out of the Fog Research LLC
+0xE83935, Hewlett Packard
+0xE839DF, Askey Computer
+0xE83A97, OCZ Technology Group
+0xE83EB6, RIM
+0xE83EFB, GEODESIC LTD.
+0xE83EFC, ARRIS Group, Inc.
+0xE84040, CISCO SYSTEMS, INC.
+0xE840F2, PEGATRON CORPORATION
+0xE843B6, QNAP Systems, Inc.
+0xE84E06, EDUP INTERNATIONAL (HK) CO., LTD
+0xE84ECE, Nintendo Co., Ltd.
+0xE85484, NEO INFORMATION SYSTEMS CO., LTD.
+0xE856D6, NCTech Ltd
+0xE85AA7, LLC Emzior
+0xE85B5B, LG ELECTRONICS INC
+0xE85BF0, Imaging Diagnostics
+0xE85E53, Infratec Datentechnik GmbH
+0xE86CDA, Supercomputers and Neurocomputers Research Center
+0xE86D52, Motorola Mobility, Inc.
+0xE86D54, Digit Mobile Inc
+0xE86D6E, Control & Display Systems Ltd t/a CDSRail
+0xE8718D, Elsys Equipamentos Eletronicos Ltda
+0xE8757F, FIRS Technologies(Shenzhen) Co., Ltd
+0xE878A1, BEOVIEW INTERCOM DOO
+0xE87AF3, S5 Tech S.r.l.
+0xE8892C, ARRIS Group, Inc.
+0xE88D28, Apple
+0xE88DF5, ZNYX Networks, Inc.
+0xE892A4, LG Electronics
+0xE8944C, Cogent Healthcare Systems Ltd
+0xE894F6, TP-LINK TECHNOLOGIES CO.,LTD.
+0xE8995A, PiiGAB, Processinformation i Goteborg AB
+0xE899C4, HTC Corporation
+0xE89A8F, Quanta Computer Inc.
+0xE89AFF, Fujian Landi Commercial Equipment Co.,Ltd
+0xE89D87, Toshiba
+0xE8A364, Signal Path International / Peachtree Audio
+0xE8A4C1, Deep Sea Electronics PLC
+0xE8ABFA, Shenzhen Reecam Tech.Ltd.
+0xE8B4AE, Shenzhen C&D Electronics Co.,Ltd
+0xE8B748, CISCO SYSTEMS, INC.
+0xE8BA70, CISCO SYSTEMS, INC.
+0xE8BE81, SAGEMCOM
+0xE8C229, H-Displays (MSC) Bhd
+0xE8C320, Austco Communication Systems Pty Ltd
+0xE8CBA1, Nokia Corporation
+0xE8CC32, Micronet LTD
+0xE8CD2D, Huawei Technologies Co., Ltd
+0xE8D0FA, MKS Instruments Deutschland GmbH
+0xE8D483, ULTIMATE Europe Transportation Equipment GmbH
+0xE8DA96, Zhuhai Tianrui Electrical Power Tech. Co., Ltd.
+0xE8DAAA, VideoHome Technology Corp.
+0xE8DE27, TP-LINK TECHNOLOGIES CO.,LTD.
+0xE8DFF2, PRF Co., Ltd.
+0xE8E08F, GRAVOTECH MARKING SAS
+0xE8E0B7, Toshiba
+0xE8E1E2, Energotest
+0xE8E5D6, Samsung Electronics Co.,Ltd
+0xE8E732, Alcatel-Lucent
+0xE8E776, Shenzhen Kootion Technology Co., Ltd
+0xE8E875, iS5 Communications Inc.
+0xE8F1B0, SAGEMCOM SAS
+0xE8F928, RFTECH SRL
+0xEC0ED6, ITECH INSTRUMENTS SAS
+0xEC1120, FloDesign Wind Turbine Corporation
+0xEC14F6, BioControl AS
+0xEC172F, TP-LINK TECHNOLOGIES CO., LTD.
+0xEC1A59, Belkin International Inc.
+0xEC233D, Huawei Technologies Co., Ltd
+0xEC2368, IntelliVoice Co.,Ltd.
+0xEC2C49, University of Tokyo
+0xEC3091, CISCO SYSTEMS, INC.
+0xEC3586, Apple`
+0xEC3BF0, NovelSat
+0xEC3F05, Institute 706, The Second Academy China Aerospace Science & Industry Corp
+0xEC42F0, ADL Embedded Solutions, Inc.
+0xEC43E6, AWCER Ltd.
+0xEC43F6, ZyXEL Communications Corporation
+0xEC4476, CISCO SYSTEMS, INC.
+0xEC4644, TTK SAS
+0xEC4670, Meinberg Funkuhren GmbH & Co. KG
+0xEC473C, Redwire, LLC
+0xEC4993, Qihan Technology Co., Ltd
+0xEC4C4D, ZAO NPK RoTeK
+0xEC542E, Shanghai XiMei Electronic Technology Co. Ltd
+0xEC55F9, Hon Hai Precision Ind. Co.,Ltd.
+0xEC5C69, MITSUBISHI HEAVY INDUSTRIES MECHATRONICS SYSTEMS,LTD.
+0xEC6264, Global411 Internet Services, LLC
+0xEC63E5, ePBoard Design LLC
+0xEC66D1, B&W Group LTD
+0xEC6C9F, Chengdu Volans Technology CO.,LTD
+0xEC7C74, Justone Technologies Co., Ltd.
+0xEC7D9D, MEI
+0xEC836C, RM Tech Co., Ltd.
+0xEC852F, Apple, Inc.
+0xEC888F, TP-LINK TECHNOLOGIES CO., LTD.
+0xEC89F5, Lenovo Mobile Communication Technology Ltd.
+0xEC8EAD, DLX
+0xEC9233, Eddyfi NDT Inc
+0xEC9327, MEMMERT GmbH + Co. KG
+0xEC9681, 2276427 Ontario Inc
+0xEC986C, Lufft Mess- und Regeltechnik GmbH
+0xEC98C1, Beijing Risbo Network Technology Co.,Ltd
+0xEC9A74, Hewlett Packard
+0xEC9B5B, Nokia Corporation
+0xEC9ECD, Emerson Network Power and Embedded Computing
+0xECA29B, Kemppi Oy
+0xECA86B, ELITEGROUP COMPUTER SYSTEMS CO., LTD.
+0xECB106, Acuro Networks, Inc
+0xECB541, SHINANO E and E Co.Ltd.
+0xECBBAE, Digivoice Tecnologia em Eletronica Ltda
+0xECBD09, FUSION Electronics Ltd
+0xECC38A, Accuenergy (CANADA) Inc
+0xECC882, CISCO SYSTEMS, INC.
+0xECCD6D, Allied Telesis, Inc.
+0xECD00E, MiraeRecognition Co., Ltd.
+0xECD040, GEA Farm Technologies GmbH
+0xECD19A, Zhuhai Liming Industries Co., Ltd
+0xECD925, RAMI
+0xECD950, IRT SA
+0xECDE3D, Lamprey Networks, Inc.
+0xECE09B, Samsung electronics CO., LTD
+0xECE555, Hirschmann Automation
+0xECE744, Omntec mfg. inc
+0xECE90B, SISTEMA SOLUCOES ELETRONICAS LTDA - EASYTECH
+0xECE915, STI Ltd
+0xECE9F8, Guang Zhou TRI-SUN Electronics Technology Co., Ltd
+0xECEA03, DARFON LIGHTING CORP
+0xECF00E, Abocom
+0xECF236, NEOMONTANA ELECTRONICS
+0xECFAAA, The IMS Company
+0xECFC55, A. Eberle GmbH & Co. KG
+0xECFE7E, BlueRadios, Inc.
+0xF0007F, Janz - Contadores de Energia, SA
+0xF0022B, Chrontel
+0xF00248, SmarteBuilding
+0xF00786, Shandong Bittel Electronics Co., Ltd
+0xF008F1, Samsung Electronics Co.,Ltd
+0xF013C3, SHENZHEN FENDA TECHNOLOGY CO., LTD
+0xF01C13, LG Electronics
+0xF0219D, Cal-Comp Electronics & Communications Company Ltd.
+0xF02329, SHOWA DENKI CO.,LTD.
+0xF02408, Talaris (Sweden) AB
+0xF02572, CISCO SYSTEMS, INC.
+0xF0264C, Dr. Sigrist AG
+0xF02929, Cisco
+0xF02A61, Waldo Networks, Inc.
+0xF02FD8, Bi2-Vision
+0xF03A55, Omega Elektronik AS
+0xF04335, DVN(Shanghai)Ltd.
+0xF04A2B, PYRAMID Computer GmbH
+0xF04B6A, Scientific Production Association Siberian Arsenal, Ltd.
+0xF04BF2, JTECH Communications, Inc.
+0xF04DA2, Dell Inc.
+0xF04F7C, PRIVATE
+0xF05849, CareView Communications
+0xF05A09, Samsung Electronics Co.,Ltd
+0xF05D89, Dycon Limited
+0xF05DC8, Duracell Powermat
+0xF05F5A, Getriebebau NORD GmbH and Co. KG
+0xF0620D, Shenzhen Egreat Tech Corp.,Ltd
+0xF06281, ProCurve Networking by HP
+0xF065DD, Primax Electronics Ltd.
+0xF06853, Integrated Corporation
+0xF06BCA, Samsung Electronics Co.,Ltd
+0xF073AE, PEAK-System Technik
+0xF07765, Sourcefire, Inc
+0xF077D0, Xcellen
+0xF07BCB, Hon Hai Precision Ind. Co.,Ltd.
+0xF07D68, D-Link Corporation
+0xF07F0C, Leopold Kostal GmbH &Co. KG
+0xF081AF, IRZ AUTOMATION TECHNOLOGIES LTD
+0xF084C9, zte corporation
+0xF08BFE, COSTEL.,CO.LTD
+0xF0933A, NxtConect
+0xF093C5, Garland Technology
+0xF09CBB, RaonThink Inc.
+0xF09CE9, Aerohive Networks Inc
+0xF0A225, PRIVATE
+0xF0A764, GST Co., Ltd.
+0xF0ACA4, HBC-radiomatic
+0xF0AD4E, Globalscale Technologies, Inc.
+0xF0AE51, Xi3 Corp
+0xF0B479, Apple, Inc.
+0xF0B6EB, Poslab Technology Co., Ltd.
+0xF0BCC8, MaxID (Pty) Ltd
+0xF0BDF1, Sipod Inc.
+0xF0BF97, Sony Corporation
+0xF0C24C, Zhejiang FeiYue Digital Technology Co., Ltd
+0xF0C27C, Mianyang Netop Telecom Equipment Co.,Ltd.
+0xF0C88C, LeddarTech Inc.
+0xF0CBA1, Apple, Inc.
+0xF0D14F, LINEAR LLC
+0xF0D1A9, Apple
+0xF0D3E7, Sensometrix SA
+0xF0D767, Axema Passagekontroll AB
+0xF0DA7C, RLH INDUSTRIES,INC.
+0xF0DB30, Yottabyte
+0xF0DCE2, Apple Inc
+0xF0DE71, Shanghai EDO Technologies Co.,Ltd.
+0xF0DEB9, ShangHai Y&Y Electronics Co., Ltd
+0xF0DEF1, Wistron InfoComm (Kunshan)Co
+0xF0E5C3, Drägerwerk AG & Co. KG aA
+0xF0E77E, Samsung Electronics Co.,Ltd
+0xF0EC39, Essec
+0xF0ED1E, Bilkon Bilgisayar Kontrollu Cih. Im.Ltd.
+0xF0EEBB, VIPAR GmbH
+0xF0F002, Hon Hai Precision Ind. Co.,Ltd.
+0xF0F260, Mobitec AB
+0xF0F644, Whitesky Science & Technology Co.,Ltd.
+0xF0F669, Motion Analysis Corporation
+0xF0F755, CISCO SYSTEMS, INC.
+0xF0F7B3, Phorm
+0xF0F842, KEEBOX, Inc.
+0xF0F9F7, IES GmbH & Co. KG
+0xF0FDA0, Acurix Networks LP
+0xF40321, BeNeXt B.V.
+0xF4044C, ValenceTech Limited
+0xF40B93, Research In Motion
+0xF40F9B, WAVELINK
+0xF41BA1, Apple
+0xF41E26, Simon-Kaloi Engineering
+0xF41F0B, YAMABISHI Corporation
+0xF41FC2, Cisco
+0xF436E1, Abilis Systems SARL
+0xF43814, Shanghai Howell Electronic Co.,Ltd
+0xF43D80, FAG Industrial Services GmbH
+0xF43E61, Shenzhen Gongjin Electronics Co., Ltd
+0xF43E9D, Benu Networks, Inc.
+0xF44227, S & S Research Inc.
+0xF44450, BND Co., Ltd.
+0xF445ED, Portable Innovation Technology Ltd.
+0xF4472A, Nanjing Rousing Sci. and Tech. Industrial Co., Ltd
+0xF44848, Amscreen Group Ltd
+0xF44EFD, Actions Semiconductor Co.,Ltd.(Cayman Islands)
+0xF450EB, Telechips Inc
+0xF45214, Mellanox Technologies, Inc.
+0xF45433, Rockwell Automation
+0xF45595, HENGBAO Corporation LTD.
+0xF4559C, Huawei Technologies Co., Ltd
+0xF455E0, Niceway CNC Technology Co.,Ltd.Hunan Province
+0xF45842, Boxx TV Ltd
+0xF45FD4, Cisco SPVTG
+0xF45FF7, DQ Technology Inc.
+0xF4600D, Panoptic Technology, Inc
+0xF46349, Diffon Corporation
+0xF46D04, ASUSTek COMPUTER INC.
+0xF46DE2, zte corporation
+0xF473CA, Conversion Sound Inc.
+0xF47626, Viltechmeda UAB
+0xF47ACC, SolidFire, Inc.
+0xF47B5E, Samsung Eletronics Co., Ltd
+0xF47F35, CISCO SYSTEMS, INC.
+0xF48771, Infoblox
+0xF48E09, Nokia Corporation
+0xF490EA, Deciso B.V.
+0xF49461, NexGen Storage
+0xF49466, CountMax, ltd
+0xF499AC, WEBER Schraubautomaten GmbH
+0xF49F54, Samsung Electronics
+0xF4A52A, Hawa Technologies Inc
+0xF4ACC1, CISCO SYSTEMS, INC.
+0xF4B164, Lightning Telecommunications Technology Co. Ltd
+0xF4B381, WindowMaster A/S
+0xF4B549, Yeastar Technology Co., Ltd.
+0xF4B72A, TIME INTERCONNECT LTD
+0xF4B7E2, Hon Hai Precision Ind. Co.,Ltd.
+0xF4C6D7, blackned GmbH
+0xF4C714, Huawei Device Co., Ltd
+0xF4C795, WEY Elektronik AG
+0xF4CAE5, FREEBOX SA
+0xF4CE46, Hewlett-Packard Company
+0xF4D9FB, Samsung Electronics CO., LTD
+0xF4DC4D, Beijing CCD Digital Technology Co., Ltd
+0xF4DCDA, Zhuhai Jiahe Communication Technology Co., limited
+0xF4E142, Delta Elektronika BV
+0xF4E6D7, Solar Power Technologies, Inc.
+0xF4EA67, CISCO SYSTEMS, INC.
+0xF4EC38, TP-LINK TECHNOLOGIES CO., LTD.
+0xF4F15A, Apple
+0xF4FC32, Texas Instruments
+0xF80113, Huawei Technologies Co., Ltd
+0xF80332, Khomp
+0xF8051C, DRS Imaging and Targeting Solutions
+0xF80BBE, Motorola Mobility, Inc.
+0xF80BD0, Datang Telecom communication terminal (Tianjin) Co., Ltd.
+0xF80CF3, LG Electronics
+0xF80DEA, ZyCast Technology Inc.
+0xF80F41, Wistron InfoComm(ZhongShan) Corporation
+0xF80F84, Natural Security SAS
+0xF81037, Atopia Systems, LP
+0xF81A67, TP-LINK TECHNOLOGIES CO., LTD.
+0xF81D93, Longdhua(Beijing) Controls Technology Co.,Ltd
+0xF81EDF, Apple, Inc
+0xF82285, Cypress Technology CO., LTD.
+0xF82EDB, RTW GmbH & Co. KG
+0xF82F5B, eGauge Systems LLC
+0xF82FA8, Hon Hai Precision Ind. Co.,Ltd.
+0xF83094, Alcatel-Lucent Telecom Limited
+0xF8313E, endeavour GmbH
+0xF83376, Good Mind Innovation Co., Ltd.
+0xF83553, Magenta Research Ltd.
+0xF83DFF, Huawei Technologies Co., Ltd
+0xF8462D, SYNTEC Incorporation
+0xF8472D, X2gen Digital Corp. Ltd
+0xF84897, Hitachi, Ltd.
+0xF85063, Verathon
+0xF852DF, VNL Europe AB
+0xF85F2A, Nokia Corporation
+0xF866F2, CISCO SYSTEMS, INC.
+0xF86971, Seibu Electric Co.,
+0xF86ECF, Arcx Inc
+0xF871FE, The Goldman Sachs Group, Inc.
+0xF8769B, Neopis Co., Ltd.
+0xF87B62, FASTWEL INTERNATIONAL CO., LTD. Taiwan Branch
+0xF87B7A, Motorola Mobility, Inc.
+0xF87B8C, Amped Wireless
+0xF8811A, OVERKIZ
+0xF88C1C, KAISHUN ELECTRONIC TECHNOLOGY CO., LTD. BEIJING
+0xF88DEF, Tenebraex
+0xF88E85, COMTREND CORPORATION
+0xF88FCA, Google Fiber, Inc
+0xF8912A, GLP German Light Products GmbH
+0xF893F3, VOLANS
+0xF897CF, DAESHIN-INFORMATION TECHNOLOGY CO., LTD.
+0xF89955, Fortress Technology Inc
+0xF89D0D, Control Technology Inc.
+0xF8A03D, Dinstar Technologies Co., Ltd.
+0xF8A9DE, PUISSANCE PLUS
+0xF8AA8A, Axview Technology (Shenzhen) Co.,Ltd
+0xF8AC6D, Deltenna Ltd
+0xF8B599, Guangzhou CHNAVS Digital Technology Co.,Ltd
+0xF8C001, Juniper Networks
+0xF8C091, Highgates Technology
+0xF8C678, Carefusion
+0xF8D0AC, Sony Computer Entertainment Inc.
+0xF8D0BD, Samsung Electronics Co.,Ltd
+0xF8D111, TP-LINK TECHNOLOGIES CO., LTD.
+0xF8D3A9, AXAN Networks
+0xF8D462, Pumatronix Equipamentos Eletronicos Ltda.
+0xF8D756, Simm Tronic Limited
+0xF8D7BF, REV Ritter GmbH
+0xF8DADF, EcoTech, Inc.
+0xF8DAE2, Beta LaserMike
+0xF8DAF4, Taishan Online Technology Co., Ltd.
+0xF8DB4C, PNY Technologies, INC.
+0xF8DB7F, HTC Corporation
+0xF8DC7A, Variscite LTD
+0xF8DFA8, ZTE Corporation
+0xF8E4FB, Actiontec Electronics, Inc
+0xF8E7B5, µTech Engenharia e Automação LTDA
+0xF8E968, Egker Kft.
+0xF8EA0A, Dipl.-Math. Michael Rauch
+0xF8EDA5, ARRIS Group, Inc.
+0xF8F014, RackWare Inc.
+0xF8F082, NAG LLC
+0xF8F25A, G-Lab GmbH
+0xF8F7D3, International Communications Corporation
+0xF8F7FF, SYN-TECH SYSTEMS INC
+0xF8FB2F, Santur Corporation
+0xF8FE5C, Reciprocal Labs Corp
+0xF8FEA8, Technico Japan Corporation
+0xFC0012, Toshiba Samsung Storage Technolgoy Korea Corporation
+0xFC01CD, FUNDACION TEKNIKER
+0xFC0647, Cortland Research, LLC
+0xFC0877, Prentke Romich Company
+0xFC0A81, Motorola Solutions Inc.
+0xFC0FE6, Sony Computer Entertainment Inc.
+0xFC10BD, Control Sistematizado S.A.
+0xFC1186, Logic3 plc
+0xFC1794, InterCreative Co., Ltd
+0xFC1D59, I Smart Cities HK Ltd
+0xFC1F19, SAMSUNG ELECTRO-MECHANICS CO., LTD.
+0xFC1FC0, EURECAM
+0xFC229C, Han Kyung I Net Co.,Ltd.
+0xFC253F, Apple, Inc.
+0xFC2A54, Connected Data, Inc.
+0xFC2E2D, Lorom Industrial Co.LTD.
+0xFC2F40, Calxeda, Inc.
+0xFC3598, Favite Inc.
+0xFC4463, Universal Audio
+0xFC4499, Swarco LEA d.o.o.
+0xFC455F, JIANGXI SHANSHUI OPTOELECTRONIC TECHNOLOGY CO.,LTD
+0xFC48EF, HUAWEI TECHNOLOGIES CO.,LTD
+0xFC4DD4, Universal Global Scientific Industrial Co., Ltd.
+0xFC5090, SIMEX Sp. z o.o.
+0xFC52CE, Control iD
+0xFC58FA, Shen Zhen Shi Xin Zhong Xin Technology Co.,Ltd.
+0xFC5B24, Weibel Scientific A/S
+0xFC5B26, MikroBits
+0xFC6198, NEC Personal Products, Ltd
+0xFC626E, Beijing MDC Telecom
+0xFC683E, Directed Perception, Inc
+0xFC6C31, LXinstruments GmbH
+0xFC7516, D-Link International
+0xFC75E6, Handreamnet
+0xFC7CE7, FCI USA LLC
+0xFC8329, Trei technics
+0xFC8399, Avaya, Inc
+0xFC8B97, Shenzhen Gongjin Electronics Co.,Ltd
+0xFC8E7E, Pace plc
+0xFC8FC4, Intelligent Technology Inc.
+0xFC946C, UBIVELOX
+0xFC94E3, Technicolor USA Inc.
+0xFC9947, Cisco
+0xFC9FAE, Fidus Systems Inc
+0xFCA13E, Samsung Electronics
+0xFCA841, Avaya, Inc
+0xFCA9B0, MIARTECH (SHANGHAI),INC.
+0xFCAD0F, QTS NETWORKS
+0xFCAF6A, Conemtech AB
+0xFCC23D, Atmel Corporation
+0xFCC734, Samsung Electronics Co.,Ltd
+0xFCC897, ZTE Corporation
+0xFCCCE4, Ascon Ltd.
+0xFCCF62, IBM Corp
+0xFCD4F2, The Coca Cola Company
+0xFCD4F6, Messana Air.Ray Conditioning s.r.l.
+0xFCD6BD, Robert Bosch GmbH
+0xFCDB96, ENERVALLEY CO., LTD
+0xFCDD55, Shenzhen WeWins wireless Co.,Ltd
+0xFCE192, Sichuan Jinwangtong Electronic Science&Technology Co,.Ltd
+0xFCE23F, CLAY PAKY SPA
+0xFCE557, Nokia Corporation
+0xFCE892, Hangzhou Lancable Technology Co.,Ltd
+0xFCEDB9, Arrayent
+0xFCF1CD, OPTEX-FA CO.,LTD.
+0xFCF528, ZyXEL Communications Corporation
+0xFCF8AE, Intel Corporate
+0xFCFAF7, Shanghai Baud Data Communication Co.,Ltd.
+0xFCFBFB, CISCO SYSTEMS, INC.
diff --git a/configs/stddef.h b/configs/stddef.h
new file mode 100644
index 0000000..13688a6
--- /dev/null
+++ b/configs/stddef.h
@@ -0,0 +1,197 @@
+/* Taken from Linux kernel, GPL, version 2.0 */
+
+#define ETH_ALEN 6 /* Octets in one ethernet addr */
+#define ETH_HLEN 14 /* Total octets in header. */
+#define ETH_ZLEN 60 /* Min. octets in frame sans FCS */
+#define ETH_DATA_LEN 1500 /* Max. octets in payload */
+#define ETH_FRAME_LEN 1514 /* Max. octets in frame sans FCS */
+#define ETH_FCS_LEN 4 /* Octets in the FCS */
+
+#define ETH_SRC_RAND drnd(ETH_ALEN)
+#define ETH_DST_RAND drnd(ETH_ALEN)
+
+#define ETH_P_LOOP 0x0060 /* Ethernet Loopback packet */
+#define ETH_P_PUP 0x0200 /* Xerox PUP packet */
+#define ETH_P_PUPAT 0x0201 /* Xerox PUP Addr Trans packet */
+#define ETH_P_IP 0x0800 /* Internet Protocol packet */
+#define ETH_P_X25 0x0805 /* CCITT X.25 */
+#define ETH_P_ARP 0x0806 /* Address Resolution packet */
+#define ETH_P_BPQ 0x08FF /* G8BPQ AX.25 Ethernet Packet [ NOT AN OFFICIALLY REGISTERED ID ] */
+#define ETH_P_IEEEPUP 0x0a00 /* Xerox IEEE802.3 PUP packet */
+#define ETH_P_IEEEPUPAT 0x0a01 /* Xerox IEEE802.3 PUP Addr Trans packet */
+#define ETH_P_BATMAN 0x4305 /* B.A.T.M.A.N.-Advanced packet [ NOT AN OFFICIALLY REGISTERED ID ] */
+#define ETH_P_DEC 0x6000 /* DEC Assigned proto */
+#define ETH_P_DNA_DL 0x6001 /* DEC DNA Dump/Load */
+#define ETH_P_DNA_RC 0x6002 /* DEC DNA Remote Console */
+#define ETH_P_DNA_RT 0x6003 /* DEC DNA Routing */
+#define ETH_P_LAT 0x6004 /* DEC LAT */
+#define ETH_P_DIAG 0x6005 /* DEC Diagnostics */
+#define ETH_P_CUST 0x6006 /* DEC Customer use */
+#define ETH_P_SCA 0x6007 /* DEC Systems Comms Arch */
+#define ETH_P_TEB 0x6558 /* Trans Ether Bridging */
+#define ETH_P_RARP 0x8035 /* Reverse Addr Res packet */
+#define ETH_P_ATALK 0x809B /* Appletalk DDP */
+#define ETH_P_AARP 0x80F3 /* Appletalk AARP */
+#define ETH_P_8021Q 0x8100 /* 802.1Q VLAN Extended Header */
+#define ETH_P_IPX 0x8137 /* IPX over DIX */
+#define ETH_P_IPV6 0x86DD /* IPv6 over bluebook */
+#define ETH_P_PAUSE 0x8808 /* IEEE Pause frames. See 802.3 31B */
+#define ETH_P_SLOW 0x8809 /* Slow Protocol. See 802.3ad 43B */
+#define ETH_P_WCCP 0x883E /* Web-cache coordination protocol defined in draft-wilson-wrec-wccp-v2-00.txt */
+#define ETH_P_PPP_DISC 0x8863 /* PPPoE discovery messages */
+#define ETH_P_PPP_SES 0x8864 /* PPPoE session messages */
+#define ETH_P_MPLS_UC 0x8847 /* MPLS Unicast traffic */
+#define ETH_P_MPLS_MC 0x8848 /* MPLS Multicast traffic */
+#define ETH_P_ATMMPOA 0x884c /* MultiProtocol Over ATM */
+#define ETH_P_LINK_CTL 0x886c /* HPNA, wlan link local tunnel */
+#define ETH_P_ATMFATE 0x8884 /* Frame-based ATM Transport over Ethernet */
+#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */
+#define ETH_P_AOE 0x88A2 /* ATA over Ethernet */
+#define ETH_P_8021AD 0x88A8 /* 802.1ad Service VLAN */
+#define ETH_P_802_EX1 0x88B5 /* 802.1 Local Experimental 1. */
+#define ETH_P_TIPC 0x88CA /* TIPC */
+#define ETH_P_8021AH 0x88E7 /* 802.1ah Backbone Service Tag */
+#define ETH_P_1588 0x88F7 /* IEEE 1588 Timesync */
+#define ETH_P_FCOE 0x8906 /* Fibre Channel over Ethernet */
+#define ETH_P_TDLS 0x890D /* TDLS */
+#define ETH_P_FIP 0x8914 /* FCoE Initialization Protocol */
+#define ETH_P_QINQ1 0x9100 /* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */
+#define ETH_P_QINQ2 0x9200 /* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */
+#define ETH_P_QINQ3 0x9300 /* deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ] */
+#define ETH_P_EDSA 0xDADA /* Ethertype DSA [ NOT AN OFFICIALLY REGISTERED ID ] */
+#define ETH_P_AF_IUCV 0xFBFB /* IBM af_iucv [ NOT AN OFFICIALLY REGISTERED ID ] */
+#define ETH_P_802_3 0x0001 /* Dummy type for 802.3 frames */
+#define ETH_P_AX25 0x0002 /* Dummy protocol id for AX.25 */
+#define ETH_P_802_2 0x0004 /* 802.2 frames */
+#define ETH_P_SNAP 0x0005 /* Internal only */
+#define ETH_P_DDCMP 0x0006 /* DEC DDCMP: Internal only */
+#define ETH_P_WAN_PPP 0x0007 /* Dummy type for WAN PPP frames*/
+#define ETH_P_PPP_MP 0x0008 /* Dummy type for PPP MP frames */
+#define ETH_P_LOCALTALK 0x0009 /* Localtalk pseudo type */
+#define ETH_P_CAN 0x000C /* CAN: Controller Area Network */
+#define ETH_P_CANFD 0x000D /* CANFD: CAN flexible data rate */
+#define ETH_P_PPPTALK 0x0010 /* Dummy type for Atalk over PPP */
+#define ETH_P_TR_802_2 0x0011 /* 802.2 frames */
+#define ETH_P_MOBITEX 0x0015 /* Mobitex (kaz@cafe.net) */
+#define ETH_P_CONTROL 0x0016 /* Card specific control frames */
+#define ETH_P_IRDA 0x0017 /* Linux-IrDA */
+#define ETH_P_ECONET 0x0018 /* Acorn Econet */
+#define ETH_P_HDLC 0x0019 /* HDLC frames */
+#define ETH_P_ARCNET 0x001A /* 1A for ArcNet :-) */
+#define ETH_P_DSA 0x001B /* Distributed Switch Arch. */
+#define ETH_P_TRAILER 0x001C /* Trailer switch tagging */
+#define ETH_P_PHONET 0x00F5 /* Nokia Phonet frames */
+#define ETH_P_IEEE802154 0x00F6 /* IEEE802.15.4 frames */
+#define ETH_P_CAIF 0x00F7 /* ST-Ericsson CAIF protocol */
+
+#define INADDR_BROADCAST 0xffffffff /* 255.255.255.255 */
+#define INADDR_LOOPBACK 0x7f000001 /* 127.0.0.1 */
+#define INADDR_UNSPEC_GROUP 0xe0000000 /* 224.0.0.0 */
+#define INADDR_ALLHOSTS_GROUP 0xe0000001 /* 224.0.0.1 */
+#define INADDR_ALLRTRS_GROUP 0xe0000002 /* 224.0.0.2 */
+#define INADDR_MAX_LOCAL_GROUP 0xe00000ff /* 224.0.0.255 */
+
+#define IPPROTO_ICMP 1 /* Internet Control Message Protocol */
+#define IPPROTO_IGMP 2 /* Internet Group Management Protocol */
+#define IPPROTO_IPIP 4 /* IPIP tunnels (older KA9Q tunnels use 94) */
+#define IPPROTO_TCP 6 /* Transmission Control Protocol */
+#define IPPROTO_EGP 8 /* Exterior Gateway Protocol */
+#define IPPROTO_PUP 12 /* PUP protocol */
+#define IPPROTO_UDP 17 /* User Datagram Protocol */
+#define IPPROTO_IDP 22 /* XNS IDP protocol */
+#define IPPROTO_DCCP 33 /* Datagram Congestion Control Protocol */
+#define IPPROTO_RSVP 46 /* RSVP protocol */
+#define IPPROTO_GRE 47 /* Cisco GRE tunnels (rfc 1701,1702) */
+#define IPPROTO_IPV6 41 /* IPv6-in-IPv4 tunnelling */
+#define IPPROTO_ESP 50 /* Encapsulation Security Payload protocol */
+#define IPPROTO_AH 51 /* Authentication Header protocol */
+#define IPPROTO_BEETPH 94 /* IP option pseudo header for BEET */
+#define IPPROTO_PIM 103 /* Protocol Independent Multicast */
+#define IPPROTO_COMP 108 /* Compression Header protocol */
+#define IPPROTO_SCTP 132 /* Stream Control Transport Protocol */
+#define IPPROTO_UDPLITE 136 /* UDP-Lite (RFC 3828) */
+
+#define IP_ALEN 4
+#define IP_VERSION 4
+#define IP_TTL_DEFAULT 64
+#define IP_HDR_OFF_DEFAULT 14
+#define IP_SRC_RAND drnd(IP_ALEN)
+#define IP_DST_RAND drnd(IP_ALEN)
+#define IP_ID_RAND drnd(2)
+#define IP_CSUM_DEFAULT csumip(IP_HDR_OFF_DEFAULT, 33) /* IP-hdr offset from, to */
+
+#define ICMP_ECHOREPLY 0 /* Echo Reply */
+#define ICMP_DEST_UNREACH 3 /* Destination Unreachable */
+#define ICMP_SOURCE_QUENCH 4 /* Source Quench */
+#define ICMP_REDIRECT 5 /* Redirect (change route) */
+#define ICMP_ECHO 8 /* Echo Request */
+#define ICMP_TIME_EXCEEDED 11 /* Time Exceeded */
+#define ICMP_PARAMETERPROB 12 /* Parameter Problem */
+#define ICMP_TIMESTAMP 13 /* Timestamp Request */
+#define ICMP_TIMESTAMPREPLY 14 /* Timestamp Reply */
+#define ICMP_INFO_REQUEST 15 /* Information Request */
+#define ICMP_INFO_REPLY 16 /* Information Reply */
+#define ICMP_ADDRESS 17 /* Address Mask Request */
+#define ICMP_ADDRESSREPLY 18 /* Address Mask Reply */
+
+/* Codes for UNREACH. */
+#define ICMP_NET_UNREACH 0 /* Network Unreachable */
+#define ICMP_HOST_UNREACH 1 /* Host Unreachable */
+#define ICMP_PROT_UNREACH 2 /* Protocol Unreachable */
+#define ICMP_PORT_UNREACH 3 /* Port Unreachable */
+#define ICMP_FRAG_NEEDED 4 /* Fragmentation Needed/DF set */
+#define ICMP_SR_FAILED 5 /* Source Route failed */
+#define ICMP_NET_UNKNOWN 6
+#define ICMP_HOST_UNKNOWN 7
+#define ICMP_HOST_ISOLATED 8
+#define ICMP_NET_ANO 9
+#define ICMP_HOST_ANO 10
+#define ICMP_NET_UNR_TOS 11
+#define ICMP_HOST_UNR_TOS 12
+#define ICMP_PKT_FILTERED 13 /* Packet filtered */
+#define ICMP_PREC_VIOLATION 14 /* Precedence violation */
+#define ICMP_PREC_CUTOFF 15 /* Precedence cut off */
+#define NR_ICMP_UNREACH 15 /* instead of hardcoding immediate value */
+
+/* Codes for REDIRECT. */
+#define ICMP_REDIR_NET 0 /* Redirect Net */
+#define ICMP_REDIR_HOST 1 /* Redirect Host */
+#define ICMP_REDIR_NETTOS 2 /* Redirect Net for TOS */
+#define ICMP_REDIR_HOSTTOS 3 /* Redirect Host for TOS */
+
+/* Codes for TIME_EXCEEDED. */
+#define ICMP_EXC_TTL 0 /* TTL count exceeded */
+#define ICMP_EXC_FRAGTIME 1 /* Fragment Reass time exceeded */
+
+#define TCP_SEQ_RAND drnd(4)
+#define TCP_ACK_RAND drnd(4)
+#define TCP_SRC_RAND drnd(2)
+#define TCP_DST_RAND drnd(2)
+#define TCP_CSUM_DEFAULT csumtcp(IP_HDR_OFF_DEFAULT, 34) /* Offset IP, offset TCP */
+
+#define TCP_FLAG_CWR (1 << 7)
+#define TCP_FLAG_ECE (1 << 6)
+#define TCP_FLAG_URG (1 << 5)
+#define TCP_FLAG_ACK (1 << 4)
+#define TCP_FLAG_PSH (1 << 3)
+#define TCP_FLAG_RST (1 << 2)
+#define TCP_FLAG_SYN (1 << 1)
+#define TCP_FLAG_FIN (1 << 0)
+
+#define TCP_RESERVED_BITS 0x0F00
+#define TCP_DATA_OFFSET 0xF000
+
+/* Misc things */
+#define JOIN(x, y) x ## y
+
+#define IF_0(x)
+#define IF_1(x) x
+#define IF(bit, x) JOIN(IF_, bit)(x)
+
+#define IF_ELSE_0(x, y) y
+#define IF_ELSE_1(x, y) x
+#define IF_ELSE(bit, x, y) JOIN(IF_ELSE_, bit)(x, y)
+
+#define be16(x) c16(x)
+#define be32(x) c32(x)
+#define be64(x) c64(x)
diff --git a/configs/tcp.conf b/configs/tcp.conf
new file mode 100644
index 0000000..4eafa41
--- /dev/null
+++ b/configs/tcp.conf
@@ -0,0 +1,1100 @@
+1, tcpmux
+2, compressnet
+3, compressnet
+7, echo
+9, discard
+11, systat
+13, daytime
+15, netstat
+17, qotd
+19, chargen
+20, ftp-data
+21, ftp
+22, ssh
+23, telnet
+24, priv-mail
+25, smtp
+26, rsftp
+27, nsw-fe
+29, msg-icp
+31, msg-auth
+33, dsp
+35, priv-print
+37, time
+38, rap
+42, nameserver
+43, whois
+44, mpm-flags
+45, mpm
+47, ni-ftp
+48, auditd
+49, tacacs
+50, re-mail-ck
+51, la-maint
+52, xns-time
+53, domain
+54, xns-ch
+55, isi-gl
+56, xns-auth
+57, priv-term
+58, xns-mail
+59, priv-file
+65, tacacs-ds
+66, sqlnet
+67, dhcps
+68, dhcpc
+69, tftp
+70, gopher
+71, netrjs-1
+72, netrjs-2
+73, netrjs-3
+74, netrjs-4
+75, priv-dial
+76, deos
+77, priv-rje
+78, vettcp
+79, finger
+80, http
+81, hosts2-ns
+82, xfer
+83, mit-ml-dev
+84, ctf
+85, mit-ml-dev
+86, mfcobol
+87, priv-term-l
+88, kerberos-sec
+89, su-mit-tg
+90, dnsix
+91, mit-dov
+92, npp
+93, dcp
+94, objcall
+95, supdup
+96, dixie
+97, swift-rvf
+98, linuxconf
+99, metagram
+100, newacct
+101, hostname
+102, iso-tsap
+103, gppitnp
+104, acr-nema
+106, pop3pw
+108, snagas
+109, pop2
+110, pop3
+111, rpcbind
+112, mcidas
+113, auth
+114, audionews
+115, sftp
+116, ansanotify
+117, uucp-path
+118, sqlserv
+119, nntp
+120, cfdptkt
+122, smakynet
+123, ntp
+124, ansatrader
+125, locus-map
+127, locus-con
+128, gss-xlicen
+129, pwdgen
+130, cisco-fna
+132, cisco-sys
+133, statsrv
+135, msrpc
+136, profile
+137, netbios-ns
+138, netbios-dgm
+139, netbios-ssn
+141, emfis-cntl
+142, bl-idm
+143, imap
+144, news
+146, iso-tp0
+148, cronus
+149, aed-512
+150, sql-net
+151, hems
+157, knet-cmp
+158, pcmail-srv
+161, snmp
+162, snmptrap
+163, cmip-man
+168, rsvd
+173, xyplex-mux
+174, mailq
+176, genrad-mux
+177, xdmcp
+179, bgp
+180, ris
+181, unify
+182, audit
+184, ocserver
+185, remote-kis
+189, qft
+190, gacp
+191, prospero
+192, osu-nms
+193, srmp
+194, irc
+196, dn6-smm-red
+199, smux
+200, src
+201, at-rtmp
+202, at-nbp
+204, at-echo
+205, at-5
+206, at-zis
+209, tam
+210, z39.50
+211, 914c-g
+212, anet
+213, ipx
+214, vmpwscs
+216, atls
+217, dbase
+219, uarps
+220, imap3
+221, fln-spx
+222, rsh-spx
+223, cdc
+248, bhfhs
+256, fw1-secureremote
+257, fw1-mc-fwmodule
+258, fw1-mc-gui
+259, esro-gen
+260, openport
+261, nsiiops
+262, arcisdms
+264, bgmp
+265, maybe-fw1
+280, http-mgmt
+308, novastorbakcup
+311, asip-webadmin
+315, dpsi
+316, decauth
+346, zserv
+350, matip-type-a
+351, matip-type-b
+352, dtag-ste-sb
+353, ndsauth
+355, datex-asn
+358, shrinkwrap
+360, scoi2odialog
+361, semantix
+362, srssend
+364, aurora-cmgr
+366, odmr
+369, rpc2portmap
+370, codaauth2
+373, legent-1
+380, is99s
+383, hp-alarm-mgr
+388, unidata-ldm
+389, ldap
+391, synotics-relay
+392, synotics-broker
+395, netcp
+397, mptn
+399, iso-tsap-c2
+400, work-sol
+401, ups
+402, genie
+403, decap
+404, nced
+406, imsp
+407, timbuktu
+408, prm-sm
+410, decladebug
+411, rmt
+412, synoptics-trap
+413, smsp
+414, infoseek
+415, bnet
+416, silverplatter
+417, onmux
+418, hyper-g
+419, ariel1
+420, smpte
+422, ariel3
+423, opc-job-start
+425, icad-el
+427, svrloc
+428, ocs_cmu
+432, iasd
+434, mobileip-agent
+435, mobilip-mn
+437, comscm
+438, dsfgw
+439, dasp
+440, sgcp
+441, decvms-sysmgt
+442, cvc_hostd
+443, https
+444, snpp
+445, microsoft-ds
+446, ddm-rdb
+447, ddm-dfm
+448, ddm-ssl
+449, as-servermap
+450, tserver
+451, sfs-smp-net
+452, sfs-config
+453, creativeserver
+454, contentserver
+456, macon
+457, scohelp
+458, appleqtc
+460, skronk
+462, datasurfsrvsec
+464, kpasswd5
+465, smtps
+466, digital-vrc
+470, scx-proxy
+472, ljk-login
+473, hybrid-pop
+475, tcpnethaspsrv
+475, tcpnethaspsrv
+479, iafserver
+480, loadsrv
+481, dvs
+485, powerburst
+486, sstats
+487, saft
+491, go-login
+492, ticf-1
+493, ticf-2
+496, pim-rp-disc
+497, retrospect
+500, isakmp
+501, stmf
+502, asa-appl-proto
+505, mailbox-lm
+507, crs
+509, snare
+510, fcp
+511, passgo
+512, exec
+513, login
+514, shell
+515, printer
+516, videotex
+518, ntalk
+522, ulp
+523, ibm-db2
+524, ncp
+525, timed
+526, tempo
+528, custix
+530, courier
+533, netwall
+535, iiop
+536, opalis-rdv
+538, gdomap
+540, uucp
+541, uucp-rlogin
+542, commerce
+543, klogin
+544, kshell
+545, ekshell
+548, afp
+552, deviceshare
+553, pirp
+554, rtsp
+555, dsf
+556, remotefs
+557, openvms-sysipc
+560, rmonitor
+561, monitor
+563, snews
+564, 9pfs
+568, ms-shuttle
+569, ms-rome
+570, meter
+571, umeter
+572, sonar
+577, vnas
+578, ipdd
+582, scc-security
+583, philips-vc
+587, submission
+591, http-alt
+593, http-rpc-epmap
+596, smsd
+598, sco-websrvrmg3
+599, acp
+600, ipcserver
+603, mnotes
+606, urm
+607, nqs
+608, sift-uft
+609, npmp-trap
+610, npmp-local
+611, npmp-gui
+617, sco-dtmgr
+625, apple-xsrvr-admin
+626, apple-imap-admin
+628, qmqp
+631, ipp
+634, ginad
+636, ldapssl
+637, lanserver
+646, ldp
+660, mac-srvr-admin
+664, secure-aux-bus
+666, doom
+674, acap
+683, corba-iiop
+691, resvc
+704, elcsd
+706, silc
+709, entrustmanager
+709, entrustmanager
+723, omfs
+729, netviewdm1
+730, netviewdm2
+730, netviewdm2
+731, netviewdm3
+731, netviewdm3
+740, netcp
+740, netcp
+741, netgw
+742, netrcs
+744, flexlm
+747, fujitsu-dev
+748, ris-cm
+749, kerberos-adm
+750, kerberos
+751, kerberos_master
+752, qrh
+753, rrh
+754, krb_prop
+758, nlogin
+759, con
+760, krbupdate
+761, kpasswd
+762, quotad
+763, cycleserv
+764, omserv
+765, webster
+767, phonebook
+769, vid
+770, cadlock
+771, rtip
+773, submit
+774, rpasswd
+775, entomb
+776, wpages
+780, wpgs
+781, hp-collector
+782, hp-managed-node
+783, spamassassin
+786, concert
+787, qsc
+799, controlit
+800, mdbs_daemon
+801, device
+808, ccproxy-http
+871, supfilesrv
+873, rsync
+888, accessbuilder
+898, sun-manageconsole
+901, samba-swat
+902, iss-realsecure
+903, iss-console-mgr
+950, oftep-rpc
+953, rndc
+975, securenetpro-sensor
+989, ftps-data
+990, ftps
+992, telnets
+993, imaps
+994, ircs
+995, pop3s
+996, xtreelic
+997, maitrd
+998, busboy
+999, garcon
+1000, cadlock
+1002, windows-icfw
+1008, ufsd
+1023, netvenuechat
+1024, kdm
+1025, NFS-or-IIS
+1026, LSA-or-nterm
+1027, IIS
+1029, ms-lsa
+1030, iad1
+1031, iad2
+1032, iad3
+1033, netinfo
+1034, zincite-a
+1035, multidropper
+1040, netsaint
+1043, boinc
+1050, java-or-OTGfileshare
+1051, optima-vnet
+1052, ddt
+1055, ansyslmd
+1058, nim
+1059, nimreg
+1060, polestar
+1062, veracity
+1066, fpo-fns
+1067, instl_boots
+1068, instl_bootc
+1069, cognex-insight
+1076, sns_credit
+1080, socks
+1083, ansoft-lm-1
+1084, ansoft-lm-2
+1103, xaudio
+1109, kpop
+1110, nfsd-status
+1112, msql
+1127, supfiledbg
+1139, cce3x
+1158, lsnr
+1167, cisco-ipsla
+1178, skkserv
+1212, lupa
+1214, fasttrack
+1218, aeroflight-ads
+1220, quicktime
+1222, nerv
+1234, hotline
+1241, nessus
+1248, hermes
+1270, ssserver
+1311, rxmon
+1337, waste
+1346, alta-ana-lm
+1347, bbn-mmc
+1348, bbn-mmx
+1349, sbook
+1350, editbench
+1351, equationbuilder
+1352, lotusnotes
+1353, relief
+1354, rightbrain
+1355, intuitive-edge
+1356, cuillamartin
+1357, pegboard
+1358, connlcli
+1359, ftsrv
+1360, mimer
+1361, linx
+1362, timeflies
+1363, ndm-requester
+1364, ndm-server
+1365, adapt-sna
+1366, netware-csp
+1367, dcs
+1368, screencast
+1369, gv-us
+1370, us-gv
+1371, fc-cli
+1372, fc-ser
+1373, chromagrafx
+1374, molly
+1376, ibm-pps
+1379, dbreporter
+1381, apple-licman
+1383, gwha
+1384, os-licman
+1385, atex_elmd
+1386, checksum
+1387, cadsi-lm
+1388, objective-dbc
+1389, iclpv-dm
+1390, iclpv-sc
+1391, iclpv-sas
+1393, iclpv-nls
+1394, iclpv-nlc
+1395, iclpv-wsm
+1396, dvl-activemail
+1397, audio-activmail
+1398, video-activmail
+1399, cadkey-licman
+1400, cadkey-tablet
+1401, goldleaf-licman
+1402, prm-sm-np
+1403, prm-nm-np
+1404, igi-lm
+1405, ibm-res
+1407, dbsa-lm
+1408, sophia-lm
+1409, here-lm
+1410, hiq
+1411, af
+1412, innosys
+1413, innosys-acl
+1414, ibm-mqseries
+1416, novell-lu6.2
+1417, timbuktu-srv1
+1418, timbuktu-srv2
+1419, timbuktu-srv3
+1420, timbuktu-srv4
+1422, autodesk-lm
+1423, essbase
+1424, hybrid
+1426, sas-1
+1427, mloadd
+1429, nms
+1430, tpdu
+1432, blueberry-lm
+1433, ms-sql-s
+1434, ms-sql-m
+1435, ibm-cics
+1436, sas-2
+1437, tabula
+1438, eicon-server
+1439, eicon-x25
+1440, eicon-slp
+1441, cadis-1
+1442, cadis-2
+1443, ies-lm
+1444, marcam-lm
+1445, proxima-lm
+1446, ora-lm
+1448, oc-lm
+1449, peport
+1451, infoman
+1453, genie-lm
+1454, interhdl_elmd
+1455, esl-lm
+1456, dca
+1457, valisys-lm
+1458, nrcabq-lm
+1459, proshare1
+1461, ibm_wrless_lan
+1462, world-lm
+1464, msl_lmd
+1465, pipes
+1466, oceansoft-lm
+1467, csdmbase
+1469, aal-lm
+1470, uaiact
+1472, csdm
+1473, openmath
+1474, telefinder
+1475, taligent-lm
+1476, clvm-cfg
+1479, dberegister
+1480, pacerforum
+1482, miteksys-lm
+1483, afs
+1484, confluent
+1486, nms_topo_serv
+1488, docstor
+1491, anynetgateway
+1492, stone-design-1
+1493, netmap_lm
+1494, citrix-ica
+1495, cvc
+1496, liberty-lm
+1497, rfx-lm
+1498, watcom-sql
+1499, fhc
+1500, vlsi-lm
+1501, sas-3
+1502, shivadiscovery
+1503, imtc-mcs
+1505, funkproxy
+1507, symplex
+1508, diagmond
+1509, robcad-lm
+1510, mvx-lm
+1511, 3l-l1
+1513, fujitsu-dtc
+1515, ifor-protocol
+1516, vpad
+1517, vpac
+1518, vpvd
+1519, vpvc
+1521, oracle
+1522, rna-lm
+1523, cichild-lm
+1524, ingreslock
+1525, orasrv
+1526, pdap-np
+1527, tlisrv
+1528, mciautoreg
+1529, support
+1531, rap-listen
+1532, miroconnect
+1533, virtual-places
+1535, ampr-info
+1537, sdsc-lm
+1538, 3ds-lm
+1539, intellistor-lm
+1540, rds
+1541, rds2
+1542, gridgen-elmd
+1543, simba-cs
+1544, aspeclmd
+1545, vistium-share
+1547, laplink
+1548, axon-lm
+1549, shivahose
+1550, 3m-image-lm
+1551, hecmtl-db
+1552, pciarray
+1600, issd
+1650, nkd
+1651, shiva_confsrvr
+1652, xnmp
+1661, netview-aix-1
+1662, netview-aix-2
+1663, netview-aix-3
+1664, netview-aix-4
+1666, netview-aix-6
+1667, netview-aix-7
+1668, netview-aix-8
+1670, netview-aix-10
+1671, netview-aix-11
+1672, netview-aix-12
+1680, CarbonCopy
+1700, mps-raft
+1717, fj-hdnet
+1720, H.323/Q.931
+1723, pptp
+1755, wms
+1761, landesk-rc
+1762, landesk-rc
+1763, landesk-rc
+1782, hp-hcip
+1827, pcm
+1863, msnp
+1864, paradym-31
+1900, upnp
+1935, rtmp
+1984, bigbrother
+1986, licensedaemon
+1987, tr-rsrb-p1
+1988, tr-rsrb-p2
+1989, tr-rsrb-p3
+1990, stun-p1
+1991, stun-p2
+1992, stun-p3
+1993, snmp-tcp-port
+1993, snmp-tcp-port
+1994, stun-port
+1995, perf-port
+1996, tr-rsrb-port
+1997, gdp-port
+1998, x25-svc-port
+1999, tcp-id-port
+1999, tcp-id-port
+2000, cisco-sccp
+2001, dc
+2002, globe
+2003, finger
+2004, mailbox
+2005, deslogin
+2006, invokator
+2007, dectalk
+2008, conf
+2009, news
+2010, search
+2011, raid-cc
+2012, ttyinfo
+2013, raid-am
+2014, troff
+2015, cypress
+2016, bootserver
+2018, terminaldb
+2019, whosockami
+2020, xinupageserver
+2021, servexec
+2022, down
+2023, xinuexpansion3
+2024, xinuexpansion4
+2025, ellpack
+2026, scrabble
+2027, shadowserver
+2028, submitserver
+2030, device2
+2033, glogger
+2034, scoremgr
+2035, imsldoc
+2038, objectmanager
+2040, lam
+2041, interbase
+2042, isis
+2043, isis-bcast
+2044, rimsl
+2045, cdfunc
+2046, sdfunc
+2047, dls
+2048, dls-monitor
+2049, nfs
+2053, knetd
+2064, dnet-keyproxy
+2065, dlsrpn
+2067, dlswpn
+2068, advocentkvm
+2103, zephyr-clt
+2105, eklogin
+2106, ekshell
+2108, rkinit
+2111, kx
+2112, kip
+2120, kauth
+2121, ccproxy-ftp
+2148, veritas-ucl
+2161, apc-agent
+2201, ats
+2232, ivs-video
+2241, ivsd
+2301, compaqdiag
+2307, pehelp
+2383, ms-olap4
+2401, cvspserver
+2430, venus
+2431, venus-se
+2432, codasrv
+2433, codasrv-se
+2500, rtsserv
+2501, rtsclient
+2564, hp-3000-telnet
+2600, zebrasrv
+2601, zebra
+2602, ripd
+2604, ospfd
+2605, bgpd
+2627, webster
+2628, dict
+2638, sybase
+2701, sms-rcinfo
+2702, sms-xfer
+2766, listen
+2809, corbaloc
+2903, extensisportfolio
+2967, symantec-av
+2998, iss-realsec
+3000, ppp
+3001, nessus
+3005, deslogin
+3006, deslogind
+3025, slnp
+3045, slnp
+3049, cfs
+3052, powerchute
+3064, dnet-tstproxy
+3086, sj3
+3128, squid-http
+3141, vmodem
+3260, iscsi
+3264, ccmail
+3268, globalcatLDAP
+3269, globalcatLDAPssl
+3283, netassistant
+3292, meetingmaker
+3299, saprouter
+3306, mysql
+3333, dec-notes
+3372, msdtc
+3389, ms-term-serv
+3397, saposs
+3398, sapcomm
+3399, sapeps
+3421, bmap
+3456, vat
+3457, vat-control
+3531, peerenabler
+3632, distccd
+3689, rendezvous
+3690, svn
+3863, asap-tcp
+3868, diameter
+3900, udt_os
+3905, mupdate
+3984, mapper-nodemgr
+3985, mapper-mapethd
+3986, mapper-ws_ethd
+3999, remoteanything
+4000, remoteanything
+4002, mlchat-proxy
+4008, netcheque
+4045, lockd
+4125, rww
+4132, nuts_dem
+4133, nuts_bootp
+4144, wincim
+4190, sieve
+4199, eims-admin
+4224, xtell
+4321, rwhois
+4333, msql
+4343, unicall
+4443, pharos
+4444, krb524
+4480, proxy-plus
+4500, sae-urn
+4557, fax
+4559, hylafax
+4660, mosmig
+4662, edonkey
+4672, rfa
+4827, squid-htcp
+4899, radmin
+4987, maybe-veritas
+4998, maybe-veritas
+5000, upnp
+5001, commplex-link
+5002, rfe
+5003, filemaker
+5009, airport-admin
+5010, telelpathstart
+5011, telelpathattack
+5050, mmcc
+5051, ida-agent
+5060, sip
+5061, sip-tls
+5100, admd
+5101, admdog
+5102, admeng
+5145, rmonitor_secure
+5190, aol
+5191, aol-1
+5193, aol-3
+5222, xmpp
+5232, sgi-dgl
+5300, hacl-hb
+5301, hacl-gs
+5302, hacl-cfg
+5303, hacl-probe
+5308, cfengine
+5400, pcduo-old
+5405, pcduo
+5431, park-agent
+5432, postgresql
+5490, connect-proxy
+5500, hotline
+5510, secureidprop
+5520, sdlog
+5530, sdserv
+5550, sdadmind
+5555, freeciv
+5560, isqlplus
+5631, pcanywheredata
+5632, pcanywherestat
+5666, nrpe
+5672, amqp
+5679, activesync
+5680, canna
+5713, proshareaudio
+5714, prosharevideo
+5717, prosharenotify
+5800, vnc-http
+5801, vnc-http-1
+5802, vnc-http-2
+5803, vnc-http-3
+5900, vnc
+5901, vnc-1
+5902, vnc-2
+5903, vnc-3
+5977, ncd-pref-tcp
+5978, ncd-diag-tcp
+5997, ncd-pref
+5998, ncd-diag
+5999, ncd-conf
+6000, X11
+6001, X11:1
+6002, X11:2
+6003, X11:3
+6004, X11:4
+6005, X11:5
+6006, X11:6
+6007, X11:7
+6008, X11:8
+6009, X11:9
+6017, xmail-ctrl
+6050, arcserve
+6059, X11:59
+6101, backupexec
+6103, RETS-or-BackupExec
+6105, isdninfo
+6106, isdninfo
+6110, softcm
+6111, spc
+6112, dtspc
+6141, meta-corp
+6142, aspentec-lm
+6143, watershed-lm
+6145, statsci2-lm
+6146, lonewolf-lm
+6147, montage-lm
+6222, radmind
+6346, gnutella
+6347, gnutella2
+6400, crystalreports
+6401, crystalenterprise
+6502, netop-rc
+6543, mythtv
+6544, mythtv
+6547, powerchuteplus
+6548, powerchuteplus
+6588, analogx
+6662, radmind
+6665, irc
+6666, irc
+6667, irc
+6668, irc
+6669, irc
+6670, irc
+6697, sirc
+6699, napster
+6700, carracho
+6701, carracho
+6789, ibm-db2-admin
+6881, bittorrent-tracker
+6969, acmsoda
+7000, afs3-fileserver
+7001, afs3-callback
+7002, afs3-prserver
+7003, afs3-vlserver
+7004, afs3-kaserver
+7005, afs3-volser
+7006, afs3-errors
+7007, afs3-bos
+7008, afs3-update
+7009, afs3-rmtsys
+7010, ups-onlinet
+7070, realserver
+7100, font-service
+7200, fodms
+7201, dlip
+7273, openmanage
+7326, icb
+7464, pythonds
+7597, qaz
+7634, hddtemp
+7937, nsrexecd
+7938, lgtomapper
+8000, http-alt
+8002, teradataordbms
+8007, ajp12
+8008, http
+8009, ajp13
+8010, xmpp
+8021, ftp-proxy
+8076, slnp
+8080, http-proxy
+8081, blackice-icecap
+8082, blackice-alerts
+8118, privoxy
+8123, polipo
+8192, sophos
+8193, sophos
+8194, sophos
+8443, https-alt
+8471, pim-port
+8770, apple-iphoto
+8888, sun-answerbook
+8892, seosload
+9000, cslistener
+9001, tor-orport
+9040, tor-trans
+9050, tor-socks
+9051, tor-control
+9084, aurora
+9090, zeus-admin
+9100, jetdirect
+9101, jetdirect
+9102, jetdirect
+9103, jetdirect
+9104, jetdirect
+9105, jetdirect
+9106, jetdirect
+9107, jetdirect
+9111, DragonIDSConsole
+9152, ms-sql2000
+9200, wap-wsp
+9418, git
+9535, man
+9594, msgsys
+9595, pds
+9876, sd
+9900, iua
+9991, issa
+9992, issc
+9999, abyss
+10000, snet-sensor-mgmt
+10005, stel
+10082, amandaidx
+10083, amidxtape
+11371, pksd
+12000, cce4x
+12345, netbus
+12346, netbus
+13701, netbackup
+13713, netbackup
+13714, netbackup
+13715, netbackup
+13718, netbackup
+13720, netbackup
+13721, netbackup
+13722, netbackup
+13782, netbackup
+13783, netbackup
+14001, sua
+14141, bo2k
+15000, hydap
+15151, bo2k
+16080, osxwebadmin
+16444, overnet
+17007, isode-dua
+17300, kuang2
+18000, biimenu
+18181, opsec-cvp
+18182, opsec-ufp
+18183, opsec-sam
+18184, opsec-lea
+18187, opsec-ela
+19150, gkrellm
+20005, btx
+22273, wnn6
+26208, wnn6_DS
+27000, flexlm0
+27001, flexlm1
+27002, flexlm2
+27003, flexlm3
+27005, flexlm5
+27007, flexlm7
+27009, flexlm9
+27010, flexlm10
+27374, subseven
+27665, Trinoo_Master
+31337, Elite
+31416, boinc
+32770, sometimes-rpc3
+32771, sometimes-rpc5
+32772, sometimes-rpc7
+32773, sometimes-rpc9
+32774, sometimes-rpc11
+32775, sometimes-rpc13
+32776, sometimes-rpc15
+32777, sometimes-rpc17
+32778, sometimes-rpc19
+32779, sometimes-rpc21
+32780, sometimes-rpc23
+32786, sometimes-rpc25
+32787, sometimes-rpc27
+38037, landesk-cba
+38292, landesk-cba
+43188, reachout
+44334, tinyfw
+44442, coldfusion-auth
+44443, coldfusion-auth
+47557, dbbrowse
+49400, compaqdiag
+50000, iiimsf
+50002, iiimsf
+54320, bo2k
+58500, utorrent
+62078, iphone-sync
+65301, pcanywhere
diff --git a/configs/udp.conf b/configs/udp.conf
new file mode 100644
index 0000000..a0c57c3
--- /dev/null
+++ b/configs/udp.conf
@@ -0,0 +1,1056 @@
+1, tcpmux
+2, compressnet
+3, compressnet
+5, rje
+7, echo
+9, discard
+11, systat
+13, daytime
+17, qotd
+18, msp
+19, chargen
+20, ftp-data
+21, ftp
+22, ssh
+23, telnet
+24, priv-mail
+25, smtp
+27, nsw-fe
+29, msg-icp
+31, msg-auth
+33, dsp
+35, priv-print
+37, time
+38, rap
+39, rlp
+41, graphics
+42, nameserver
+43, whois
+44, mpm-flags
+45, mpm
+46, mpm-snd
+47, ni-ftp
+48, auditd
+49, tacacs
+50, re-mail-ck
+51, la-maint
+52, xns-time
+53, domain
+54, xns-ch
+55, isi-gl
+56, xns-auth
+57, priv-term
+58, xns-mail
+59, priv-file
+61, ni-mail
+62, acas
+63, via-ftp
+64, covia
+65, tacacs-ds
+66, sqlnet
+67, dhcps
+68, dhcpc
+69, tftp
+70, gopher
+71, netrjs-1
+72, netrjs-2
+73, netrjs-3
+74, netrjs-4
+75, priv-dial
+76, deos
+77, priv-rje
+78, vettcp
+79, finger
+80, http
+81, hosts2-ns
+82, xfer
+83, mit-ml-dev
+84, ctf
+85, mit-ml-dev
+86, mfcobol
+88, kerberos-sec
+89, su-mit-tg
+90, dnsix
+91, mit-dov
+92, npp
+93, dcp
+94, objcall
+95, supdup
+96, dixie
+97, swift-rvf
+98, tacnews
+99, metagram
+101, hostname
+102, iso-tsap
+103, gppitnp
+104, acr-nema
+105, csnet-ns
+106, 3com-tsmux
+107, rtelnet
+108, snagas
+109, pop2
+110, pop3
+111, rpcbind
+112, mcidas
+113, auth
+114, audionews
+115, sftp
+116, ansanotify
+117, uucp-path
+118, sqlserv
+119, nntp
+120, cfdptkt
+121, erpc
+122, smakynet
+123, ntp
+124, ansatrader
+125, locus-map
+126, unitary
+127, locus-con
+128, gss-xlicen
+129, pwdgen
+130, cisco-fna
+131, cisco-tna
+132, cisco-sys
+133, statsrv
+134, ingres-net
+135, msrpc
+136, profile
+137, netbios-ns
+138, netbios-dgm
+139, netbios-ssn
+140, emfis-data
+141, emfis-cntl
+142, bl-idm
+143, imap
+144, news
+145, uaac
+146, iso-tp0
+147, iso-ip
+148, cronus
+149, aed-512
+150, sql-net
+151, hems
+152, bftp
+153, sgmp
+154, netsc-prod
+155, netsc-dev
+156, sqlsrv
+157, knet-cmp
+158, pcmail-srv
+159, nss-routing
+160, sgmp-traps
+161, snmp
+162, snmptrap
+163, cmip-man
+164, smip-agent
+165, xns-courier
+166, s-net
+167, namp
+168, rsvd
+169, send
+170, print-srv
+171, multiplex
+172, cl-1
+173, xyplex-mux
+174, mailq
+175, vmnet
+176, genrad-mux
+177, xdmcp
+178, nextstep
+179, bgp
+180, ris
+181, unify
+182, audit
+183, ocbinder
+184, ocserver
+185, remote-kis
+186, kis
+187, aci
+188, mumps
+189, qft
+190, cacp
+191, prospero
+192, osu-nms
+193, srmp
+194, irc
+195, dn6-nlm-aud
+196, dn6-smm-red
+197, dls
+198, dls-mon
+199, smux
+200, src
+201, at-rtmp
+202, at-nbp
+203, at-3
+204, at-echo
+205, at-5
+206, at-zis
+207, at-7
+208, at-8
+209, tam
+210, z39.50
+211, 914c-g
+212, anet
+213, ipx
+214, vmpwscs
+215, softpc
+216, atls
+217, dbase
+218, mpp
+219, uarps
+220, imap3
+221, fln-spx
+222, rsh-spx
+223, cdc
+242, direct
+243, sur-meas
+244, dayna
+245, link
+246, dsp3270
+247, subntbcst_tftp
+248, bhfhs
+256, rap
+257, set
+258, yak-chat
+259, firewall1-rdp
+260, openport
+261, nsiiops
+262, arcisdms
+263, hdap
+264, fw1-or-bgmp
+280, http-mgmt
+281, personal-link
+282, cableport-ax
+308, novastorbakcup
+309, entrusttime
+310, bhmds
+311, asip-webadmin
+312, vslmp
+313, magenta-logic
+314, opalis-robot
+315, dpsi
+316, decauth
+317, zannet
+321, pip
+344, pdap
+345, pawserv
+346, zserv
+347, fatserv
+348, csi-sgwp
+349, mftp
+350, matip-type-a
+351, matip-type-b
+352, dtag-ste-sb
+353, ndsauth
+354, bh611
+355, datex-asn
+356, cloanto-net-1
+357, bhevent
+358, shrinkwrap
+359, tenebris_nts
+360, scoi2odialog
+361, semantix
+362, srssend
+363, rsvp_tunnel
+364, aurora-cmgr
+365, dtk
+366, odmr
+367, mortgageware
+368, qbikgdp
+369, rpc2portmap
+370, codaauth2
+371, clearcase
+372, ulistserv
+373, legent-1
+374, legent-2
+375, hassle
+376, nip
+377, tnETOS
+378, dsETOS
+379, is99c
+380, is99s
+381, hp-collector
+382, hp-managed-node
+383, hp-alarm-mgr
+384, arns
+385, ibm-app
+386, asa
+387, aurp
+388, unidata-ldm
+389, ldap
+390, uis
+391, synotics-relay
+392, synotics-broker
+393, dis
+394, embl-ndt
+395, netcp
+396, netware-ip
+397, mptn
+398, kryptolan
+399, iso-tsap-c2
+400, work-sol
+401, ups
+402, genie
+403, decap
+404, nced
+405, ncld
+406, imsp
+407, timbuktu
+408, prm-sm
+409, prm-nm
+410, decladebug
+411, rmt
+412, synoptics-trap
+413, smsp
+414, infoseek
+415, bnet
+416, silverplatter
+417, onmux
+418, hyper-g
+419, ariel1
+420, smpte
+421, ariel2
+422, ariel3
+423, opc-job-start
+424, opc-job-track
+425, icad-el
+426, smartsdp
+427, svrloc
+428, ocs_cmu
+429, ocs_amu
+430, utmpsd
+431, utmpcd
+432, iasd
+433, nnsp
+434, mobileip-agent
+435, mobilip-mn
+436, dna-cml
+437, comscm
+438, dsfgw
+439, dasp
+440, sgcp
+441, decvms-sysmgt
+442, cvc_hostd
+443, https
+444, snpp
+445, microsoft-ds
+446, ddm-rdb
+447, ddm-dfm
+448, ddm-ssl
+449, as-servermap
+450, tserver
+451, sfs-smp-net
+452, sfs-config
+453, creativeserver
+454, contentserver
+455, creativepartnr
+456, macon
+457, scohelp
+458, appleqtc
+459, ampr-rcmd
+460, skronk
+461, datasurfsrv
+462, datasurfsrvsec
+463, alpes
+464, kpasswd5
+465, smtps
+466, digital-vrc
+467, mylex-mapd
+468, photuris
+469, rcp
+470, scx-proxy
+471, mondex
+472, ljk-login
+473, hybrid-pop
+474, tn-tl-w2
+475, tcpnethaspsrv
+476, tn-tl-fd1
+477, ss7ns
+478, spsc
+479, iafserver
+480, iafdbase
+481, ph
+482, xlog
+483, ulpnet
+484, integra-sme
+485, powerburst
+486, avian
+487, saft
+488, gss-http
+489, nest-protocol
+490, micom-pfs
+491, go-login
+492, ticf-1
+493, ticf-2
+494, pov-ray
+495, intecourier
+496, pim-rp-disc
+497, retrospect
+498, siam
+499, iso-ill
+500, isakmp
+501, stmf
+502, asa-appl-proto
+503, intrinsa
+504, citadel
+505, mailbox-lm
+506, ohimsrv
+507, crs
+508, xvttp
+509, snare
+510, fcp
+511, passgo
+512, biff
+513, who
+514, syslog
+515, printer
+516, videotex
+517, talk
+518, ntalk
+519, utime
+520, route
+521, ripng
+522, ulp
+523, ibm-db2
+524, ncp
+525, timed
+526, tempo
+527, stx
+528, custix
+529, irc
+530, courier
+531, conference
+532, netnews
+533, netwall
+534, mm-admin
+535, iiop
+536, opalis-rdv
+537, nmsp
+538, gdomap
+539, apertus-ldp
+540, uucp
+541, uucp-rlogin
+542, commerce
+543, klogin
+544, kshell
+545, appleqtcsrvr
+546, dhcpv6-client
+547, dhcpv6-server
+548, afp
+549, idfp
+550, new-rwho
+551, cybercash
+552, deviceshare
+553, pirp
+554, rtsp
+555, dsf
+556, remotefs
+557, openvms-sysipc
+558, sdnskmp
+559, teedtap
+560, rmonitor
+561, monitor
+562, chshell
+563, snews
+564, 9pfs
+565, whoami
+567, banyan-rpc
+568, ms-shuttle
+569, ms-rome
+570, meter
+571, umeter
+572, sonar
+573, banyan-vip
+574, ftp-agent
+575, vemmi
+576, ipcd
+577, vnas
+578, ipdd
+579, decbsrv
+580, sntp-heartbeat
+581, bdp
+582, scc-security
+583, philips-vc
+584, keyserver
+585, imap4-ssl
+586, password-chg
+587, submission
+588, cal
+589, eyelink
+590, tns-cml
+591, http-alt
+592, eudora-set
+593, http-rpc-epmap
+594, tpip
+595, cab-protocol
+596, smsd
+597, ptcnameservice
+598, sco-websrvrmg3
+599, acp
+600, ipcserver
+606, urm
+607, nqs
+608, sift-uft
+609, npmp-trap
+610, npmp-local
+611, npmp-gui
+617, sco-dtmgr
+623, asf-rmcp
+626, serialnumberd
+631, ipp
+634, ginad
+635, mount
+637, lanserver
+640, pcnfs
+650, bwnfs
+660, mac-srvr-admin
+664, secure-aux-bus
+666, doom
+683, corba-iiop
+704, elcsd
+709, entrustmanager
+729, netviewdm1
+730, netviewdm2
+731, netviewdm3
+737, sometimes-rpc2
+740, netcp
+741, netgw
+742, netrcs
+744, flexlm
+747, fujitsu-dev
+748, ris-cm
+749, kerberos-adm
+750, kerberos
+751, kerberos_master
+752, qrh
+753, rrh
+758, nlogin
+759, con
+760, ns
+761, rxe
+762, quotad
+763, cycleserv
+764, omserv
+765, webster
+767, phonebook
+769, vid
+770, cadlock
+771, rtip
+772, cycleserv2
+773, notify
+774, acmaint_dbd
+775, acmaint_transd
+776, wpages
+780, wpgs
+781, hp-collector
+782, hp-managed-node
+786, concert
+800, mdbs_daemon
+801, device
+888, accessbuilder
+989, ftps-data
+990, ftps
+996, vsinet
+997, maitrd
+998, puparp
+999, applix
+1000, ock
+1008, ufsd
+1012, sometimes-rpc1
+1025, blackjack
+1026, win-rpc
+1028, ms-lsa
+1030, iad1
+1031, iad2
+1032, iad3
+1034, activesync-notify
+1043, boinc
+1051, optima-vnet
+1052, ddt
+1055, ansyslmd
+1058, nim
+1059, nimreg
+1060, polestar
+1062, veracity
+1066, fpo-fns
+1067, instl_boots
+1068, instl_bootc
+1069, cognex-insight
+1080, socks
+1083, ansoft-lm-1
+1084, ansoft-lm-2
+1110, nfsd-keepalive
+1155, nfa
+1167, cisco-ipsla
+1212, lupa
+1214, fasttrack
+1222, nerv
+1248, hermes
+1346, alta-ana-lm
+1347, bbn-mmc
+1348, bbn-mmx
+1349, sbook
+1350, editbench
+1351, equationbuilder
+1352, lotusnotes
+1353, relief
+1354, rightbrain
+1355, intuitive-edge
+1356, cuillamartin
+1357, pegboard
+1358, connlcli
+1359, ftsrv
+1360, mimer
+1361, linx
+1362, timeflies
+1363, ndm-requester
+1364, ndm-server
+1365, adapt-sna
+1366, netware-csp
+1367, dcs
+1368, screencast
+1369, gv-us
+1370, us-gv
+1371, fc-cli
+1372, fc-ser
+1373, chromagrafx
+1374, molly
+1375, bytex
+1376, ibm-pps
+1377, cichlid
+1378, elan
+1379, dbreporter
+1380, telesis-licman
+1381, apple-licman
+1383, gwha
+1384, os-licman
+1385, atex_elmd
+1386, checksum
+1387, cadsi-lm
+1388, objective-dbc
+1389, iclpv-dm
+1390, iclpv-sc
+1391, iclpv-sas
+1392, iclpv-pm
+1393, iclpv-nls
+1394, iclpv-nlc
+1395, iclpv-wsm
+1396, dvl-activemail
+1397, audio-activmail
+1398, video-activmail
+1399, cadkey-licman
+1400, cadkey-tablet
+1401, goldleaf-licman
+1402, prm-sm-np
+1403, prm-nm-np
+1404, igi-lm
+1405, ibm-res
+1406, netlabs-lm
+1407, dbsa-lm
+1408, sophia-lm
+1409, here-lm
+1410, hiq
+1411, af
+1412, innosys
+1413, innosys-acl
+1414, ibm-mqseries
+1415, dbstar
+1416, novell-lu6.2
+1417, timbuktu-srv1
+1418, timbuktu-srv2
+1419, timbuktu-srv3
+1420, timbuktu-srv4
+1421, gandalf-lm
+1422, autodesk-lm
+1423, essbase
+1424, hybrid
+1425, zion-lm
+1426, sas-1
+1427, mloadd
+1428, informatik-lm
+1429, nms
+1430, tpdu
+1431, rgtp
+1432, blueberry-lm
+1433, ms-sql-s
+1434, ms-sql-m
+1435, ibm-cics
+1436, sas-2
+1437, tabula
+1438, eicon-server
+1439, eicon-x25
+1440, eicon-slp
+1441, cadis-1
+1442, cadis-2
+1443, ies-lm
+1444, marcam-lm
+1445, proxima-lm
+1446, ora-lm
+1447, apri-lm
+1448, oc-lm
+1449, peport
+1450, dwf
+1451, infoman
+1452, gtegsc-lm
+1453, genie-lm
+1454, interhdl_elmd
+1455, esl-lm
+1456, dca
+1457, valisys-lm
+1458, nrcabq-lm
+1459, proshare1
+1460, proshare2
+1461, ibm_wrless_lan
+1462, world-lm
+1463, nucleus
+1464, msl_lmd
+1465, pipes
+1466, oceansoft-lm
+1467, csdmbase
+1468, csdm
+1469, aal-lm
+1470, uaiact
+1471, csdmbase
+1472, csdm
+1473, openmath
+1474, telefinder
+1475, taligent-lm
+1476, clvm-cfg
+1477, ms-sna-server
+1478, ms-sna-base
+1479, dberegister
+1480, pacerforum
+1481, airs
+1482, miteksys-lm
+1483, afs
+1484, confluent
+1485, lansource
+1486, nms_topo_serv
+1487, localinfosrvr
+1488, docstor
+1489, dmdocbroker
+1490, insitu-conf
+1491, anynetgateway
+1492, stone-design-1
+1493, netmap_lm
+1494, citrix-ica
+1495, cvc
+1496, liberty-lm
+1497, rfx-lm
+1498, watcom-sql
+1499, fhc
+1500, vlsi-lm
+1501, sas-3
+1502, shivadiscovery
+1503, imtc-mcs
+1504, evb-elm
+1505, funkproxy
+1506, utcd
+1507, symplex
+1508, diagmond
+1509, robcad-lm
+1510, mvx-lm
+1511, 3l-l1
+1512, wins
+1513, fujitsu-dtc
+1514, fujitsu-dtcns
+1515, ifor-protocol
+1516, vpad
+1517, vpac
+1518, vpvd
+1519, vpvc
+1520, atm-zip-office
+1521, ncube-lm
+1522, rna-lm
+1523, cichild-lm
+1524, ingreslock
+1525, oracle
+1526, pdap-np
+1527, tlisrv
+1528, mciautoreg
+1529, coauthor
+1530, rap-service
+1531, rap-listen
+1532, miroconnect
+1533, virtual-places
+1534, micromuse-lm
+1535, ampr-info
+1536, ampr-inter
+1537, sdsc-lm
+1538, 3ds-lm
+1539, intellistor-lm
+1540, rds
+1541, rds2
+1542, gridgen-elmd
+1543, simba-cs
+1544, aspeclmd
+1545, vistium-share
+1546, abbaccuray
+1547, laplink
+1548, axon-lm
+1549, shivasound
+1550, 3m-image-lm
+1551, hecmtl-db
+1552, pciarray
+1600, issd
+1645, radius
+1646, radacct
+1650, nkd
+1651, shiva_confsrvr
+1652, xnmp
+1661, netview-aix-1
+1662, netview-aix-2
+1663, netview-aix-3
+1664, netview-aix-4
+1665, netview-aix-5
+1666, netview-aix-6
+1667, netview-aix-7
+1668, netview-aix-8
+1669, netview-aix-9
+1670, netview-aix-10
+1671, netview-aix-11
+1672, netview-aix-12
+1701, L2TP
+1718, h225gatedisc
+1719, h323gatestat
+1782, hp-hcip
+1812, radius
+1813, radacct
+1900, upnp
+1986, licensedaemon
+1987, tr-rsrb-p1
+1988, tr-rsrb-p2
+1989, tr-rsrb-p3
+1990, stun-p1
+1991, stun-p2
+1992, stun-p3
+1993, snmp-tcp-port
+1994, stun-port
+1995, perf-port
+1996, tr-rsrb-port
+1997, gdp-port
+1998, x25-svc-port
+1999, tcp-id-port
+2000, cisco-sccp
+2001, wizard
+2002, globe
+2004, emce
+2005, oracle
+2006, raid-cc
+2007, raid-am
+2008, terminaldb
+2009, whosockami
+2010, pipe_server
+2011, servserv
+2012, raid-ac
+2013, raid-cd
+2014, raid-sf
+2015, raid-cs
+2016, bootserver
+2017, bootclient
+2018, rellpack
+2019, about
+2020, xinupageserver
+2021, xinuexpansion1
+2022, xinuexpansion2
+2023, xinuexpansion3
+2024, xinuexpansion4
+2025, xribs
+2026, scrabble
+2027, shadowserver
+2028, submitserver
+2030, device2
+2032, blackboard
+2033, glogger
+2034, scoremgr
+2035, imsldoc
+2038, objectmanager
+2040, lam
+2041, interbase
+2042, isis
+2043, isis-bcast
+2044, rimsl
+2045, cdfunc
+2046, sdfunc
+2047, dls
+2048, dls-monitor
+2049, nfs
+2065, dlsrpn
+2067, dlswpn
+2103, zephyr-clt
+2104, zephyr-hm
+2105, eklogin
+2106, ekshell
+2108, rkinit
+2148, veritas-ucl
+2201, ats
+2222, msantipiracy
+2232, ivs-video
+2241, ivsd
+2307, pehelp
+2401, cvspserver
+2430, venus
+2431, venus-se
+2432, codasrv
+2433, codasrv-se
+2500, rtsserv
+2501, rtsclient
+2627, webster
+2784, www-dev
+2904, m2ua
+2944, megaco-h248
+2948, wap-push
+2967, symantec-av
+3049, cfs
+3130, squid-ipc
+3141, vmodem
+3246, kademlia
+3264, ccmail
+3283, netassistant
+3333, dec-notes
+3389, ms-term-serv
+3401, squid-snmp
+3421, bmap
+3455, prsvp
+3456, IISrpc-or-vat
+3457, vat-control
+3531, peerenabler
+3900, udt_os
+3984, mapper-nodemgr
+3985, mapper-mapethd
+3986, mapper-ws_ethd
+3996, remoteanything
+3997, remoteanything
+3998, remoteanything
+4000, icq
+4008, netcheque
+4045, lockd
+4132, nuts_dem
+4133, nuts_bootp
+4321, rwhois
+4343, unicall
+4444, krb524
+4500, nat-t-ike
+4666, edonkey
+4672, rfa
+4827, squid-htcp
+5000, upnp
+5001, commplex-link
+5002, rfe
+5003, filemaker
+5010, telelpathstart
+5011, telelpathattack
+5050, mmcc
+5060, sip
+5061, sip-tls
+5145, rmonitor_secure
+5190, aol
+5191, aol-1
+5192, aol-2
+5193, aol-3
+5222, xmpp
+5236, padl2sim
+5300, hacl-hb
+5301, hacl-gs
+5302, hacl-cfg
+5303, hacl-probe
+5304, hacl-local
+5305, hacl-test
+5308, cfengine
+5353, zeroconf
+5428, omid
+5500, securid
+5540, sdxauthd
+5555, rplay
+5632, pcanywherestat
+5713, proshareaudio
+5714, prosharevideo
+5715, prosharedata
+5716, prosharerequest
+5717, prosharenotify
+6000, X11
+6001, X11:1
+6002, X11:2
+6004, X11:4
+6110, softcm
+6111, spc
+6141, meta-corp
+6142, aspentec-lm
+6143, watershed-lm
+6144, statsci1-lm
+6145, statsci2-lm
+6146, lonewolf-lm
+6147, montage-lm
+6148, ricardo-lm
+6346, gnutella
+6347, gnutella2
+6502, netop-rc
+6549, powerchuteplus
+6558, xdsxdm
+6969, acmsoda
+7000, afs3-fileserver
+7001, afs3-callback
+7002, afs3-prserver
+7003, afs3-vlserver
+7004, afs3-kaserver
+7005, afs3-volser
+7006, afs3-errors
+7007, afs3-bos
+7008, afs3-update
+7009, afs3-rmtsys
+7010, ups-onlinet
+7100, font-service
+7200, fodms
+7201, dlip
+7648, cucme-1
+7649, cucme-2
+7650, cucme-3
+7651, cucme-4
+8193, sophos
+8471, pim-port
+9000, cslistener
+9200, wap-wsp
+9418, git
+9535, man
+9595, pds
+9876, sd
+10080, amanda
+16444, overnet
+17007, isode-dua
+17185, wdbrpc
+17500, dropbox
+18000, biimenu
+20031, bakbonenetvault
+22370, hpnpd
+26000, quake
+26900, hexen2
+27015, halflife
+27444, Trinoo_Bcast
+27500, quakeworld
+27910, quake2
+27960, quake3
+28910, heretic2
+31335, Trinoo_Register
+31337, BackOrifice
+32768, omad
+32770, sometimes-rpc4
+32771, sometimes-rpc6
+32772, sometimes-rpc8
+32773, sometimes-rpc10
+32774, sometimes-rpc12
+32775, sometimes-rpc14
+32776, sometimes-rpc16
+32777, sometimes-rpc18
+32778, sometimes-rpc20
+32779, sometimes-rpc22
+32780, sometimes-rpc24
+32786, sometimes-rpc26
+32787, sometimes-rpc28
+38037, landesk-cba
+38293, landesk-cba
+39213, sygatefw
+45000, ciscopop
+47557, dbbrowse
+54321, bo2k
+58500, utorrent
diff --git a/cpusched.c b/cpusched.c
new file mode 100644
index 0000000..13ed9a7
--- /dev/null
+++ b/cpusched.c
@@ -0,0 +1,180 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2011 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#define _GNU_SOURCE
+#include <search.h>
+#include <limits.h>
+#include <errno.h>
+#include <string.h>
+
+#include "locking.h"
+#include "cpusched.h"
+#include "xmalloc.h"
+#include "hash.h"
+
+struct map_entry {
+ int fd;
+ unsigned int cpu;
+ struct map_entry *next;
+};
+
+static struct hash_table mapper;
+
+static unsigned int *cpu_assigned = NULL;
+
+static unsigned int cpu_len = 0;
+
+static struct rwlock map_lock;
+
+void init_cpusched(unsigned int cpus)
+{
+ rwlock_init(&map_lock);
+ rwlock_wr_lock(&map_lock);
+
+ cpu_len = cpus;
+ cpu_assigned = xzmalloc(cpus * sizeof(*cpu_assigned));
+
+ memset(&mapper, 0, sizeof(mapper));
+ init_hash(&mapper);
+
+ rwlock_unlock(&map_lock);
+}
+
+static int get_appropriate_cpu(void)
+{
+ int i, cpu = 0;
+ int work = INT_MAX;
+
+ for (i = 0; i < cpu_len; ++i) {
+ if (cpu_assigned[i] < work) {
+ work = cpu_assigned[i];
+ cpu = i;
+ }
+ }
+
+ return cpu;
+}
+
+unsigned int socket_to_cpu(int fd)
+{
+ int cpu = 0;
+ struct map_entry *entry;
+
+ errno = 0;
+
+ rwlock_rd_lock(&map_lock);
+
+ entry = lookup_hash(fd, &mapper);
+ while (entry && fd != entry->fd)
+ entry = entry->next;
+ if (entry && fd == entry->fd)
+ cpu = entry->cpu;
+ else
+ errno = ENOENT;
+
+ rwlock_unlock(&map_lock);
+
+ return cpu;
+}
+
+unsigned int register_socket(int fd)
+{
+ void **pos;
+ struct map_entry *entry;
+
+ rwlock_wr_lock(&map_lock);
+
+ entry = xzmalloc(sizeof(*entry));
+ entry->fd = fd;
+ entry->cpu = get_appropriate_cpu();
+
+ cpu_assigned[entry->cpu]++;
+
+ pos = insert_hash(entry->fd, entry, &mapper);
+ if (pos) {
+ entry->next = (*pos);
+ (*pos) = entry;
+ }
+
+ rwlock_unlock(&map_lock);
+
+ return entry->cpu;
+}
+
+static struct map_entry *socket_to_map_entry(int fd)
+{
+ struct map_entry *entry, *ret = NULL;
+
+ errno = 0;
+
+ rwlock_rd_lock(&map_lock);
+
+ entry = lookup_hash(fd, &mapper);
+ while (entry && fd != entry->fd)
+ entry = entry->next;
+ if (entry && fd == entry->fd)
+ ret = entry;
+ else
+ errno = ENOENT;
+
+ rwlock_unlock(&map_lock);
+
+ return ret;
+}
+
+void unregister_socket(int fd)
+{
+ struct map_entry *pos;
+ struct map_entry *entry = socket_to_map_entry(fd);
+
+ if (!entry == 0 && errno == ENOENT)
+ return;
+
+ rwlock_wr_lock(&map_lock);
+
+ cpu_assigned[entry->cpu]--;
+
+ pos = remove_hash(entry->fd, entry, entry->next, &mapper);
+ while (pos && pos->next && pos->next != entry)
+ pos = pos->next;
+ if (pos && pos->next && pos->next == entry)
+ pos->next = entry->next;
+
+ entry->next = NULL;
+ xfree(entry);
+
+ rwlock_unlock(&map_lock);
+}
+
+static int cleanup_batch(void *ptr)
+{
+ struct map_entry *next;
+ struct map_entry *e = ptr;
+
+ if (!e)
+ return 0;
+ while ((next = e->next)) {
+ e->next = NULL;
+ xfree(e);
+ e = next;
+ }
+
+ xfree(e);
+ return 0;
+}
+
+void destroy_cpusched(void)
+{
+ rwlock_wr_lock(&map_lock);
+
+ xfree(cpu_assigned);
+ cpu_len = 0;
+ for_each_hash(&mapper, cleanup_batch);
+ free_hash(&mapper);
+
+ rwlock_unlock(&map_lock);
+ rwlock_destroy(&map_lock);
+}
diff --git a/cpusched.h b/cpusched.h
new file mode 100644
index 0000000..a7c26ce
--- /dev/null
+++ b/cpusched.h
@@ -0,0 +1,16 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2011 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef CPUSCHED_H
+#define CPUSCHED_H
+
+extern void init_cpusched(unsigned int cpus);
+extern unsigned int socket_to_cpu(int fd);
+extern unsigned int register_socket(int fd);
+extern void unregister_socket(int fd);
+extern void destroy_cpusched(void);
+
+#endif /* CPUSCHED_H */
diff --git a/csum.h b/csum.h
new file mode 100644
index 0000000..212faae
--- /dev/null
+++ b/csum.h
@@ -0,0 +1,179 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2010 Emmanuel Roullit.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef CSUM_H
+#define CSUM_H
+
+#include <netinet/in.h>
+#include <netinet/ip.h>
+
+#include "built_in.h"
+
+static inline unsigned short csum(unsigned short *buf, int nwords)
+{
+ unsigned long sum;
+
+ for (sum = 0; nwords > 0; nwords--)
+ sum += *buf++;
+ sum = (sum >> 16) + (sum & 0xffff);
+ sum += (sum >> 16);
+
+ return ~sum;
+}
+
+static inline uint16_t calc_csum(void *addr, size_t len, int ccsum)
+{
+ return csum(addr, len >> 1);
+}
+
+static inline uint16_t csum_expected(uint16_t sum, uint16_t computed_sum)
+{
+ uint32_t shouldbe;
+
+ shouldbe = sum;
+ shouldbe += ntohs(computed_sum);
+ shouldbe = (shouldbe & 0xFFFF) + (shouldbe >> 16);
+ shouldbe = (shouldbe & 0xFFFF) + (shouldbe >> 16);
+
+ return shouldbe;
+}
+
+/* Taken and modified from tcpdump, Copyright belongs to them! */
+
+struct cksum_vec {
+ const u8 *ptr;
+ int len;
+};
+
+#define ADDCARRY(x) \
+ do { if ((x) > 65535) \
+ (x) -= 65535; \
+ } while (0)
+
+#define REDUCE \
+ do { \
+ l_util.l = sum; \
+ sum = l_util.s[0] + l_util.s[1]; \
+ ADDCARRY(sum); \
+ } while (0)
+
+static inline u16 __in_cksum(const struct cksum_vec *vec, int veclen)
+{
+ const u16 *w;
+ int sum = 0, mlen = 0;
+ int byte_swapped = 0;
+ union {
+ u8 c[2];
+ u16 s;
+ } s_util;
+ union {
+ u16 s[2];
+ u32 l;
+ } l_util;
+
+ for (; veclen != 0; vec++, veclen--) {
+ if (vec->len == 0)
+ continue;
+
+ w = (const u16 *) (void *) vec->ptr;
+
+ if (mlen == -1) {
+ s_util.c[1] = *(const u8 *) w;
+ sum += s_util.s;
+ w = (const u16 *) (void *) ((const u8 *) w + 1);
+ mlen = vec->len - 1;
+ } else
+ mlen = vec->len;
+
+ if ((1 & (unsigned long) w) && (mlen > 0)) {
+ REDUCE;
+ sum <<= 8;
+ s_util.c[0] = *(const u8 *) w;
+ w = (const u16 *) (void *) ((const u8 *) w + 1);
+ mlen--;
+ byte_swapped = 1;
+ }
+
+ while ((mlen -= 32) >= 0) {
+ sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3];
+ sum += w[4]; sum += w[5]; sum += w[6]; sum += w[7];
+ sum += w[8]; sum += w[9]; sum += w[10]; sum += w[11];
+ sum += w[12]; sum += w[13]; sum += w[14]; sum += w[15];
+ w += 16;
+ }
+
+ mlen += 32;
+
+ while ((mlen -= 8) >= 0) {
+ sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3];
+ w += 4;
+ }
+
+ mlen += 8;
+
+ if (mlen == 0 && byte_swapped == 0)
+ continue;
+
+ REDUCE;
+
+ while ((mlen -= 2) >= 0) {
+ sum += *w++;
+ }
+
+ if (byte_swapped) {
+ REDUCE;
+ sum <<= 8;
+ byte_swapped = 0;
+
+ if (mlen == -1) {
+ s_util.c[1] = *(const u8 *) w;
+ sum += s_util.s;
+ mlen = 0;
+ } else
+ mlen = -1;
+ } else if (mlen == -1)
+ s_util.c[0] = *(const u8 *) w;
+ }
+
+ if (mlen == -1) {
+ s_util.c[1] = 0;
+ sum += s_util.s;
+ }
+
+ REDUCE;
+
+ return (~sum & 0xffff);
+}
+
+static inline u16 p4_csum(const struct ip *ip, const u8 *data, u16 len,
+ u8 next_proto)
+{
+ struct cksum_vec vec[2];
+ struct pseudo_hdr {
+ u32 src;
+ u32 dst;
+ u8 mbz;
+ u8 proto;
+ u16 len;
+ } ph;
+
+ memset(&ph, 0, sizeof(ph));
+ ph.len = htons(len);
+ ph.mbz = 0;
+ ph.proto = next_proto;
+ ph.src = ip->ip_src.s_addr;
+ ph.dst = ip->ip_dst.s_addr;
+
+ vec[0].ptr = (const u8 *) (void *) &ph;
+ vec[0].len = sizeof(ph);
+
+ vec[1].ptr = data;
+ vec[1].len = len;
+
+ return __in_cksum(vec, 2);
+}
+
+#endif /* CSUM_H */
diff --git a/ct_client.c b/ct_client.c
new file mode 100644
index 0000000..dbf07c5
--- /dev/null
+++ b/ct_client.c
@@ -0,0 +1,440 @@
+/*
+ * curvetun - the cipherspace wormhole creator
+ * Part of the netsniff-ng project
+ * Copyright 2011 Daniel Borkmann <daniel@netsniff-ng.org>,
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <netdb.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <syslog.h>
+#include <limits.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/poll.h>
+#include <netinet/tcp.h>
+#include <netinet/udp.h>
+#include <linux/if_tun.h>
+
+#include "built_in.h"
+#include "die.h"
+#include "xio.h"
+#include "xutils.h"
+#include "curve.h"
+#include "xmalloc.h"
+#include "curvetun.h"
+#include "ct_servmgmt.h"
+#include "ct_usermgmt.h"
+#include "crypto_auth_hmacsha512256.h"
+
+extern volatile sig_atomic_t sigint;
+static volatile sig_atomic_t closed_by_server = 0;
+
+static void handler_udp_tun_to_net(int sfd, int dfd, struct curve25519_proto *p,
+ struct curve25519_struct *c, char *buff,
+ size_t len)
+{
+ char *cbuff;
+ ssize_t rlen, clen;
+ struct ct_proto *hdr;
+ size_t off = sizeof(struct ct_proto) + crypto_box_zerobytes;
+
+ if (!buff || len <= off)
+ return;
+
+ memset(buff, 0, len);
+ while ((rlen = read(sfd, buff + off, len - off)) > 0) {
+ hdr = (struct ct_proto *) buff;
+
+ memset(hdr, 0, sizeof(*hdr));
+ hdr->flags = 0;
+
+ clen = curve25519_encode(c, p, (unsigned char *) (buff + off -
+ crypto_box_zerobytes), (rlen +
+ crypto_box_zerobytes), (unsigned char **)
+ &cbuff);
+ if (unlikely(clen <= 0))
+ goto close;
+
+ hdr->payload = htons((uint16_t) clen);
+
+ set_udp_cork(dfd);
+
+ write_exact(dfd, hdr, sizeof(struct ct_proto), 0);
+ write_exact(dfd, cbuff, clen, 0);
+
+ set_udp_uncork(dfd);
+
+ memset(buff, 0, len);
+ }
+
+ return;
+close:
+ closed_by_server = 1;
+}
+
+static void handler_udp_net_to_tun(int sfd, int dfd, struct curve25519_proto *p,
+ struct curve25519_struct *c, char *buff,
+ size_t len)
+{
+ char *cbuff;
+ ssize_t rlen, clen;
+ struct ct_proto *hdr;
+ struct sockaddr_storage naddr;
+
+ socklen_t nlen = sizeof(naddr);
+
+ if (!buff || !len)
+ return;
+
+ memset(&naddr, 0, sizeof(naddr));
+ while ((rlen = recvfrom(sfd, buff, len, 0, (struct sockaddr *) &naddr,
+ &nlen)) > 0) {
+ hdr = (struct ct_proto *) buff;
+
+ if (unlikely(rlen < sizeof(struct ct_proto)))
+ goto close;
+ if (unlikely(rlen - sizeof(*hdr) != ntohs(hdr->payload)))
+ goto close;
+ if (unlikely(ntohs(hdr->payload) == 0))
+ goto close;
+ if (hdr->flags & PROTO_FLAG_EXIT)
+ goto close;
+
+ clen = curve25519_decode(c, p, (unsigned char *) buff +
+ sizeof(struct ct_proto),
+ rlen - sizeof(struct ct_proto),
+ (unsigned char **) &cbuff, NULL);
+ if (unlikely(clen <= 0))
+ goto close;
+
+ cbuff += crypto_box_zerobytes;
+ clen -= crypto_box_zerobytes;
+
+ if (write(dfd, cbuff, clen)) { ; }
+ }
+
+ return;
+close:
+ closed_by_server = 1;
+}
+
+static void handler_tcp_tun_to_net(int sfd, int dfd, struct curve25519_proto *p,
+ struct curve25519_struct *c, char *buff,
+ size_t len)
+{
+ char *cbuff;
+ ssize_t rlen, clen;
+ struct ct_proto *hdr;
+ size_t off = sizeof(struct ct_proto) + crypto_box_zerobytes;
+
+ if (!buff || len <= off)
+ return;
+
+ memset(buff, 0, len);
+ while ((rlen = read(sfd, buff + off, len - off)) > 0) {
+ hdr = (struct ct_proto *) buff;
+
+ memset(hdr, 0, sizeof(*hdr));
+ hdr->flags = 0;
+
+ clen = curve25519_encode(c, p, (unsigned char *) (buff + off -
+ crypto_box_zerobytes), (rlen +
+ crypto_box_zerobytes), (unsigned char **)
+ &cbuff);
+ if (unlikely(clen <= 0))
+ goto close;
+
+ hdr->payload = htons((uint16_t) clen);
+
+ set_tcp_cork(dfd);
+
+ write_exact(dfd, hdr, sizeof(struct ct_proto), 0);
+ write_exact(dfd, cbuff, clen, 0);
+
+ set_tcp_uncork(dfd);
+
+ memset(buff, 0, len);
+ }
+
+ return;
+close:
+ closed_by_server = 1;
+}
+
+extern ssize_t handler_tcp_read(int fd, char *buff, size_t len);
+
+static void handler_tcp_net_to_tun(int sfd, int dfd, struct curve25519_proto *p,
+ struct curve25519_struct *c, char *buff,
+ size_t len)
+{
+ char *cbuff;
+ ssize_t rlen, clen;
+ struct ct_proto *hdr;
+
+ if (!buff || !len)
+ return;
+
+ while ((rlen = handler_tcp_read(sfd, buff, len)) > 0) {
+ hdr = (struct ct_proto *) buff;
+
+ if (unlikely(rlen < sizeof(struct ct_proto)))
+ goto close;
+ if (unlikely(rlen - sizeof(*hdr) != ntohs(hdr->payload)))
+ goto close;
+ if (unlikely(ntohs(hdr->payload) == 0))
+ goto close;
+ if (hdr->flags & PROTO_FLAG_EXIT)
+ goto close;
+
+ clen = curve25519_decode(c, p, (unsigned char *) buff +
+ sizeof(struct ct_proto),
+ rlen - sizeof(struct ct_proto),
+ (unsigned char **) &cbuff, NULL);
+ if (unlikely(clen <= 0))
+ goto close;
+
+ cbuff += crypto_box_zerobytes;
+ clen -= crypto_box_zerobytes;
+
+ if (write(dfd, cbuff, clen)) { ; }
+ }
+
+ return;
+close:
+ closed_by_server = 1;
+}
+
+static void notify_init(int fd, int udp, struct curve25519_proto *p,
+ struct curve25519_struct *c, char *home)
+{
+ int fd2, i;
+ ssize_t err, clen;
+ size_t us_len, msg_len, pad;
+ struct ct_proto hdr;
+ char username[256], path[PATH_MAX], *us, *cbuff, *msg;
+ unsigned char auth[crypto_auth_hmacsha512256_BYTES], *token;
+
+ memset(&hdr, 0, sizeof(hdr));
+ hdr.flags |= PROTO_FLAG_INIT;
+
+ memset(path, 0, sizeof(path));
+ slprintf(path, sizeof(path), "%s/%s", home, FILE_USERNAM);
+
+ fd2 = open_or_die(path, O_RDONLY);
+
+ memset(username, 0, sizeof(username));
+ err = read(fd2, username, sizeof(username));
+ username[sizeof(username) - 1] = 0;
+
+ close(fd2);
+
+ token = get_serv_store_entry_auth_token();
+ if (!token)
+ syslog_panic("Cannot find auth token for server!\n");
+
+ us_len = sizeof(struct username_struct) + crypto_box_zerobytes;
+ us = xzmalloc(us_len);
+
+ err = username_msg(username, strlen(username) + 1,
+ us + crypto_box_zerobytes,
+ us_len - crypto_box_zerobytes);
+ if (unlikely(err))
+ syslog_panic("Cannot create init message!\n");
+
+ clen = curve25519_encode(c, p, (unsigned char *) us, us_len,
+ (unsigned char **) &cbuff);
+ if (unlikely(clen <= 0))
+ syslog_panic("Init encrypt error!\n");
+
+ err = crypto_auth_hmacsha512256(auth, (unsigned char *) cbuff, clen, token);
+ if (unlikely(err))
+ syslog_panic("Cannot create init hmac message!\n");
+
+ pad = ((uint32_t) secrand()) % 200;
+ msg_len = clen + sizeof(auth) + pad;
+
+ msg = xzmalloc(msg_len);
+ memcpy(msg, auth, sizeof(auth));
+ memcpy(msg + sizeof(auth), cbuff, clen);
+
+ for (i = sizeof(auth) + clen; i < msg_len; ++i)
+ msg[i] = (uint8_t) secrand();
+
+ hdr.payload = htons((uint16_t) msg_len);
+
+ set_sock_cork(fd, udp);
+
+ write_exact(fd, &hdr, sizeof(struct ct_proto), 0);
+ write_exact(fd, msg, msg_len, 0);
+
+ set_sock_uncork(fd, udp);
+
+ xfree(msg);
+ xfree(us);
+}
+
+static void notify_close(int fd)
+{
+ struct ct_proto hdr;
+
+ memset(&hdr, 0, sizeof(hdr));
+
+ hdr.flags |= PROTO_FLAG_EXIT;
+ hdr.payload = 0;
+
+ write_exact(fd, &hdr, sizeof(hdr), 0);
+}
+
+int client_main(char *home, char *dev, char *host, char *port, int udp)
+{
+ int fd = -1, tunfd = 0, retry_server = 0;
+ int ret, try = 1, i;
+ struct addrinfo hints, *ahead, *ai;
+ struct pollfd fds[2];
+ struct curve25519_proto *p;
+ struct curve25519_struct *c;
+ char *buff;
+ size_t blen = TUNBUFF_SIZ; //FIXME
+
+retry:
+ if (!retry_server) {
+ openlog("curvetun", LOG_PID | LOG_CONS | LOG_NDELAY, LOG_DAEMON);
+ syslog(LOG_INFO, "curvetun client booting!\n");
+ }
+
+ c = xmalloc(sizeof(struct curve25519_struct));
+
+ curve25519_alloc_or_maybe_die(c);
+
+ p = get_serv_store_entry_proto_inf();
+ if (!p)
+ syslog_panic("Cannot proto!\n");
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = PF_UNSPEC;
+ hints.ai_socktype = udp ? SOCK_DGRAM : SOCK_STREAM;
+ hints.ai_protocol = udp ? IPPROTO_UDP : IPPROTO_TCP;
+ hints.ai_flags = AI_NUMERICSERV;
+
+ ret = getaddrinfo(host, port, &hints, &ahead);
+ if (ret < 0) {
+ syslog(LOG_ERR, "Cannot get address info! Retry!\n");
+ curve25519_free(c);
+ xfree(c);
+ fd = -1;
+ retry_server = 1;
+ closed_by_server = 0;
+ sleep(1);
+ goto retry;
+ }
+
+ for (ai = ahead; ai != NULL && fd < 0; ai = ai->ai_next) {
+ fd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
+ if (fd < 0)
+ continue;
+ ret = connect(fd, ai->ai_addr, ai->ai_addrlen);
+ if (ret < 0) {
+ syslog(LOG_ERR, "Cannot connect to remote, try %d: %s!\n",
+ try++, strerror(errno));
+ close(fd);
+ fd = -1;
+ continue;
+ }
+
+ set_socket_keepalive(fd);
+ set_mtu_disc_dont(fd);
+ if (!udp)
+ set_tcp_nodelay(fd);
+ }
+
+ freeaddrinfo(ahead);
+
+ if (fd < 0) {
+ syslog(LOG_ERR, "Cannot create socket! Retry!\n");
+ curve25519_free(c);
+ xfree(c);
+ fd = -1;
+ retry_server = 1;
+ closed_by_server = 0;
+ sleep(1);
+ goto retry;
+ }
+
+ if (!retry_server)
+ tunfd = tun_open_or_die(dev ? dev : DEVNAME_CLIENT,
+ IFF_TUN | IFF_NO_PI);
+
+ set_nonblocking_sloppy(fd);
+ set_nonblocking_sloppy(tunfd);
+
+ memset(fds, 0, sizeof(fds));
+ fds[0].fd = fd;
+ fds[1].fd = tunfd;
+ fds[0].events = POLLIN;
+ fds[1].events = POLLIN;
+
+ buff = xmalloc_aligned(blen, 64);
+
+ notify_init(fd, udp, p, c, home);
+
+ syslog(LOG_INFO, "curvetun client ready!\n");
+
+ while (likely(!sigint && !closed_by_server)) {
+ poll(fds, 2, -1);
+ for (i = 0; i < 2; ++i) {
+ if ((fds[i].revents & POLLIN) != POLLIN)
+ continue;
+ if (fds[i].fd == tunfd) {
+ if (udp)
+ handler_udp_tun_to_net(tunfd, fd, p, c,
+ buff, blen);
+ else
+ handler_tcp_tun_to_net(tunfd, fd, p, c,
+ buff, blen);
+ } else if (fds[i].fd == fd) {
+ if (udp)
+ handler_udp_net_to_tun(fd, tunfd, p, c,
+ buff, blen);
+ else
+ handler_tcp_net_to_tun(fd, tunfd, p, c,
+ buff, blen);
+ }
+ }
+ }
+
+ syslog(LOG_INFO, "curvetun client prepare shut down!\n");
+
+ if (!closed_by_server)
+ notify_close(fd);
+
+ xfree(buff);
+ close(fd);
+ curve25519_free(c);
+ xfree(c);
+
+ /* tundev still active */
+ if (closed_by_server && !sigint) {
+ syslog(LOG_ERR, "curvetun connection retry attempt!\n");
+ fd = -1;
+ retry_server = 1;
+ closed_by_server = 0;
+ sleep(1);
+ goto retry;
+ }
+
+ close(tunfd);
+ syslog(LOG_INFO, "curvetun client shut down!\n");
+ closelog();
+
+ return 0;
+}
diff --git a/ct_server.c b/ct_server.c
new file mode 100644
index 0000000..045472e
--- /dev/null
+++ b/ct_server.c
@@ -0,0 +1,811 @@
+/*
+ * curvetun - the cipherspace wormhole creator
+ * Part of the netsniff-ng project
+ * Copyright 2011 Daniel Borkmann <daniel@netsniff-ng.org>,
+ * Subject to the GPL, version 2.
+ */
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <syslog.h>
+#include <signal.h>
+#include <netdb.h>
+#include <stdint.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <netinet/udp.h>
+#include <sys/poll.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/wait.h>
+#include <sys/epoll.h>
+#include <arpa/inet.h>
+#include <linux/if_tun.h>
+
+#include "die.h"
+#include "xutils.h"
+#include "xio.h"
+#include "xmalloc.h"
+#include "curvetun.h"
+#include "curve.h"
+#include "built_in.h"
+#include "ct_usermgmt.h"
+#include "cpusched.h"
+#include "trie.h"
+
+struct parent_info {
+ int efd;
+ int refd;
+ int tunfd;
+ int ipv4;
+ int udp;
+};
+
+struct worker_struct {
+ pthread_t trid;
+ int efd[2];
+ unsigned int cpu;
+ struct parent_info parent;
+ int (*handler)(int fd, const struct worker_struct *ws,
+ char *buff, size_t len);
+ struct curve25519_struct *c;
+};
+
+static struct worker_struct *threadpool = NULL;
+
+static int auth_log = 1;
+
+extern volatile sig_atomic_t sigint;
+
+static int handler_udp_tun_to_net(int fd, const struct worker_struct *ws,
+ char *buff, size_t len) __pure;
+static int handler_udp_net_to_tun(int fd, const struct worker_struct *ws,
+ char *buff, size_t len) __pure;
+static int handler_udp(int fd, const struct worker_struct *ws,
+ char *buff, size_t len) __pure;
+static int handler_tcp_tun_to_net(int fd, const struct worker_struct *ws,
+ char *buff, size_t len) __pure;
+static int handler_tcp_net_to_tun(int fd, const struct worker_struct *ws,
+ char *buff, size_t len) __pure;
+static int handler_tcp(int fd, const struct worker_struct *ws,
+ char *buff, size_t len) __pure;
+ssize_t handler_tcp_read(int fd, char *buff, size_t len);
+static void *worker(void *self) __pure;
+
+static int handler_udp_tun_to_net(int fd, const struct worker_struct *ws,
+ char *buff, size_t len)
+{
+ int dfd, keep = 1;
+ char *cbuff;
+ ssize_t rlen, err, clen;
+ struct ct_proto *hdr;
+ struct curve25519_proto *p;
+ struct sockaddr_storage naddr;
+ socklen_t nlen;
+ size_t off = sizeof(struct ct_proto) + crypto_box_zerobytes;
+
+ if (!buff || len <= off)
+ return 0;
+
+ memset(buff, 0, len);
+ while ((rlen = read(fd, buff + off, len - off)) > 0) {
+ dfd = -1; nlen = 0; p = NULL;
+
+ memset(&naddr, 0, sizeof(naddr));
+
+ hdr = (struct ct_proto *) buff;
+ memset(hdr, 0, sizeof(*hdr));
+ hdr->flags = 0;
+
+ trie_addr_lookup(buff + off, rlen, ws->parent.ipv4, &dfd, &naddr,
+ (size_t *) &nlen);
+ if (unlikely(dfd < 0 || nlen == 0)) {
+ memset(buff, 0, len);
+ continue;
+ }
+
+ err = get_user_by_sockaddr(&naddr, nlen, &p);
+ if (unlikely(err || !p)) {
+ memset(buff, 0, len);
+ continue;
+ }
+
+ clen = curve25519_encode(ws->c, p, (unsigned char *) (buff + off -
+ crypto_box_zerobytes), (rlen +
+ crypto_box_zerobytes), (unsigned char **)
+ &cbuff);
+ if (unlikely(clen <= 0)) {
+ memset(buff, 0, len);
+ continue;
+ }
+
+ hdr->payload = htons((uint16_t) clen);
+
+ set_udp_cork(dfd);
+
+ sendto(dfd, hdr, sizeof(struct ct_proto), 0, (struct sockaddr *)
+ &naddr, nlen);
+ sendto(dfd, cbuff, clen, 0, (struct sockaddr *) &naddr, nlen);
+
+ set_udp_uncork(dfd);
+
+ memset(buff, 0, len);
+ }
+
+ return keep;
+}
+
+static void handler_udp_notify_close(int fd, struct sockaddr_storage *addr)
+{
+ struct ct_proto hdr;
+
+ memset(&hdr, 0, sizeof(hdr));
+ hdr.flags |= PROTO_FLAG_EXIT;
+ hdr.payload = 0;
+
+ sendto(fd, &hdr, sizeof(hdr), 0, (struct sockaddr *) addr,
+ sizeof(*addr));
+}
+
+static int handler_udp_net_to_tun(int fd, const struct worker_struct *ws,
+ char *buff, size_t len)
+{
+ int keep = 1;
+ char *cbuff;
+ ssize_t rlen, err, clen;
+ struct ct_proto *hdr;
+ struct curve25519_proto *p;
+ struct sockaddr_storage naddr;
+ socklen_t nlen = sizeof(naddr);
+
+ if (!buff || !len)
+ return 0;
+
+ memset(&naddr, 0, sizeof(naddr));
+ while ((rlen = recvfrom(fd, buff, len, 0, (struct sockaddr *) &naddr,
+ &nlen)) > 0) {
+ p = NULL;
+
+ hdr = (struct ct_proto *) buff;
+
+ if (unlikely(rlen < sizeof(struct ct_proto)))
+ goto close;
+ if (unlikely(rlen - sizeof(*hdr) != ntohs(hdr->payload)))
+ goto close;
+ if (unlikely(ntohs(hdr->payload) == 0))
+ goto close;
+ if (hdr->flags & PROTO_FLAG_EXIT) {
+close:
+ remove_user_by_sockaddr(&naddr, nlen);
+ trie_addr_remove_addr(&naddr, nlen);
+ handler_udp_notify_close(fd, &naddr);
+
+ return keep;
+ }
+ if (hdr->flags & PROTO_FLAG_INIT) {
+ syslog_maybe(auth_log, LOG_INFO, "Got initial userhash "
+ "from remote end!\n");
+
+ if (unlikely(rlen - sizeof(*hdr) <
+ sizeof(struct username_struct)))
+ goto close;
+
+ err = try_register_user_by_sockaddr(ws->c,
+ buff + sizeof(struct ct_proto),
+ rlen - sizeof(struct ct_proto),
+ &naddr, nlen, auth_log);
+ if (unlikely(err))
+ goto close;
+
+ goto next;
+ }
+
+ err = get_user_by_sockaddr(&naddr, nlen, &p);
+ if (unlikely(err || !p))
+ goto close;
+
+ clen = curve25519_decode(ws->c, p, (unsigned char *) buff +
+ sizeof(struct ct_proto),
+ rlen - sizeof(struct ct_proto),
+ (unsigned char **) &cbuff, NULL);
+ if (unlikely(clen <= 0))
+ goto close;
+
+ cbuff += crypto_box_zerobytes;
+ clen -= crypto_box_zerobytes;
+
+ err = trie_addr_maybe_update(cbuff, clen, ws->parent.ipv4,
+ fd, &naddr, nlen);
+ if (unlikely(err))
+ goto next;
+
+ err = write(ws->parent.tunfd, cbuff, clen);
+next:
+ nlen = sizeof(naddr);
+ memset(&naddr, 0, sizeof(naddr));
+ }
+
+ return keep;
+}
+
+static int handler_udp(int fd, const struct worker_struct *ws,
+ char *buff, size_t len)
+{
+ int ret = 0;
+
+ if (fd == ws->parent.tunfd)
+ ret = handler_udp_tun_to_net(fd, ws, buff, len);
+ else
+ ret = handler_udp_net_to_tun(fd, ws, buff, len);
+
+ return ret;
+}
+
+static int handler_tcp_tun_to_net(int fd, const struct worker_struct *ws,
+ char *buff, size_t len)
+{
+ int dfd, keep = 1;
+ char *cbuff;
+ ssize_t rlen, err, clen;
+ struct ct_proto *hdr;
+ struct curve25519_proto *p;
+ socklen_t nlen;
+ size_t off = sizeof(struct ct_proto) + crypto_box_zerobytes;
+
+ if (!buff || len <= off)
+ return 0;
+
+ memset(buff, 0, len);
+ while ((rlen = read(fd, buff + off, len - off)) > 0) {
+ dfd = -1; p = NULL;
+
+ hdr = (struct ct_proto *) buff;
+ memset(hdr, 0, sizeof(*hdr));
+ hdr->flags = 0;
+
+ trie_addr_lookup(buff + off, rlen, ws->parent.ipv4, &dfd, NULL,
+ (size_t *) &nlen);
+ if (unlikely(dfd < 0)) {
+ memset(buff, 0, len);
+ continue;
+ }
+
+ err = get_user_by_socket(dfd, &p);
+ if (unlikely(err || !p)) {
+ memset(buff, 0, len);
+ continue;
+ }
+
+ clen = curve25519_encode(ws->c, p, (unsigned char *) (buff + off -
+ crypto_box_zerobytes), (rlen +
+ crypto_box_zerobytes), (unsigned char **)
+ &cbuff);
+ if (unlikely(clen <= 0)) {
+ memset(buff, 0, len);
+ continue;
+ }
+
+ hdr->payload = htons((uint16_t) clen);
+
+ set_tcp_cork(dfd);
+
+ write_exact(dfd, hdr, sizeof(struct ct_proto), 0);
+ write_exact(dfd, cbuff, clen, 0);
+
+ set_tcp_uncork(dfd);
+
+ memset(buff, 0, len);
+ }
+
+ return keep;
+}
+
+ssize_t handler_tcp_read(int fd, char *buff, size_t len)
+{
+ ssize_t rlen;
+ struct ct_proto *hdr = (struct ct_proto *) buff;
+
+ if (!buff || !len)
+ return 0;
+
+ /* May exit on EAGAIN if 0 Byte read */
+ rlen = read_exact(fd, buff, sizeof(struct ct_proto), 1);
+ if (rlen < 0)
+ return rlen;
+ if (unlikely(ntohs(hdr->payload) > len - sizeof(struct ct_proto))) {
+ errno = ENOMEM;
+ return 1; /* Force server to close connection */
+ }
+
+ /* May not exit on EAGAIN if 0 Byte read */
+ rlen = read_exact(fd, buff + sizeof(struct ct_proto),
+ ntohs(hdr->payload), 0);
+ if (rlen < 0)
+ return rlen;
+
+ return sizeof(struct ct_proto) + rlen;
+}
+
+static void handler_tcp_notify_close(int fd)
+{
+ struct ct_proto hdr;
+
+ memset(&hdr, 0, sizeof(hdr));
+ hdr.flags |= PROTO_FLAG_EXIT;
+ hdr.payload = 0;
+
+ if (write(fd, &hdr, sizeof(hdr))) { ; }
+}
+
+static int handler_tcp_net_to_tun(int fd, const struct worker_struct *ws,
+ char *buff, size_t len)
+{
+ int keep = 1, count = 0;
+ char *cbuff;
+ ssize_t rlen, err, clen;
+ struct ct_proto *hdr;
+ struct curve25519_proto *p;
+
+ if (!buff || !len)
+ return 0;
+
+ while ((rlen = handler_tcp_read(fd, buff, len)) > 0) {
+ p = NULL;
+
+ hdr = (struct ct_proto *) buff;
+
+ if (unlikely(rlen < sizeof(struct ct_proto)))
+ goto close;
+ if (unlikely(rlen - sizeof(*hdr) != ntohs(hdr->payload)))
+ goto close;
+ if (unlikely(ntohs(hdr->payload) == 0))
+ goto close;
+ if (hdr->flags & PROTO_FLAG_EXIT) {
+close:
+ remove_user_by_socket(fd);
+ trie_addr_remove(fd);
+ handler_tcp_notify_close(fd);
+ rlen = write(ws->parent.efd, &fd, sizeof(fd));
+
+ keep = 0;
+ return keep;
+ }
+ if (hdr->flags & PROTO_FLAG_INIT) {
+ syslog_maybe(auth_log, LOG_INFO, "Got initial userhash "
+ "from remote end!\n");
+
+ if (unlikely(rlen - sizeof(*hdr) <
+ sizeof(struct username_struct)))
+ goto close;
+
+ err = try_register_user_by_socket(ws->c,
+ buff + sizeof(struct ct_proto),
+ rlen - sizeof(struct ct_proto),
+ fd, auth_log);
+ if (unlikely(err))
+ goto close;
+
+ continue;
+ }
+
+ err = get_user_by_socket(fd, &p);
+ if (unlikely(err || !p))
+ continue;
+
+ clen = curve25519_decode(ws->c, p, (unsigned char *) buff +
+ sizeof(struct ct_proto),
+ rlen - sizeof(struct ct_proto),
+ (unsigned char **) &cbuff, NULL);
+ if (unlikely(clen <= 0))
+ continue;
+
+ cbuff += crypto_box_zerobytes;
+ clen -= crypto_box_zerobytes;
+
+ err = trie_addr_maybe_update(cbuff, clen, ws->parent.ipv4,
+ fd, NULL, 0);
+ if (unlikely(err))
+ continue;
+
+ err = write(ws->parent.tunfd, cbuff, clen);
+
+ count++;
+ if (count == 10) {
+ write_exact(ws->efd[1], &fd, sizeof(fd), 1);
+ /* Read later next data and let others process */
+ return keep;
+ }
+ }
+
+ return keep;
+}
+
+static int handler_tcp(int fd, const struct worker_struct *ws,
+ char *buff, size_t len)
+{
+ int ret = 0;
+
+ if (fd == ws->parent.tunfd)
+ ret = handler_tcp_tun_to_net(fd, ws, buff, len);
+ else
+ ret = handler_tcp_net_to_tun(fd, ws, buff, len);
+
+ return ret;
+}
+
+static void *worker(void *self)
+{
+ int fd, old_state;
+ ssize_t ret;
+ size_t blen = TUNBUFF_SIZ; //FIXME
+ const struct worker_struct *ws = self;
+ struct pollfd fds;
+ char *buff;
+
+ fds.fd = ws->efd[0];
+ fds.events = POLLIN;
+
+ curve25519_alloc_or_maybe_die(ws->c);
+
+ buff = xmalloc_aligned(blen, 64);
+
+ syslog(LOG_INFO, "curvetun thread on CPU%u up!\n", ws->cpu);
+
+ pthread_cleanup_push(xfree_func, ws->c);
+ pthread_cleanup_push(curve25519_free, ws->c);
+ pthread_cleanup_push(xfree_func, buff);
+
+ while (likely(!sigint)) {
+ poll(&fds, 1, -1);
+ if ((fds.revents & POLLIN) != POLLIN)
+ continue;
+
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_state);
+
+ while ((ret = read_exact(ws->efd[0], &fd, sizeof(fd), 1)) > 0) {
+ if (ret != sizeof(fd)) {
+ sched_yield();
+ continue;
+ }
+
+ ret = ws->handler(fd, ws, buff, blen);
+ if (ret)
+ write_exact(ws->parent.refd, &fd, sizeof(fd), 1);
+ }
+
+ pthread_setcancelstate(old_state, NULL);
+ }
+
+ syslog(LOG_INFO, "curvetun thread on CPU%u down!\n", ws->cpu);
+
+ pthread_cleanup_pop(1);
+ pthread_cleanup_pop(1);
+ pthread_cleanup_pop(1);
+
+ pthread_exit((void *) ((long) ws->cpu));
+}
+
+static void thread_spawn_or_panic(unsigned int cpus, int efd, int refd,
+ int tunfd, int ipv4, int udp)
+{
+ int i, ret;
+ cpu_set_t cpuset;
+ unsigned int threads;
+
+ threads = cpus * THREADS_PER_CPU;
+
+ for (i = 0; i < threads; ++i) {
+ CPU_ZERO(&cpuset);
+ threadpool[i].cpu = i % cpus;
+ CPU_SET(threadpool[i].cpu, &cpuset);
+
+ ret = pipe2(threadpool[i].efd, O_NONBLOCK);
+ if (ret < 0)
+ syslog_panic("Cannot create event socket!\n");
+
+ threadpool[i].c = xmalloc_aligned(sizeof(*threadpool[i].c), 64);
+ threadpool[i].parent.efd = efd;
+ threadpool[i].parent.refd = refd;
+ threadpool[i].parent.tunfd = tunfd;
+ threadpool[i].parent.ipv4 = ipv4;
+ threadpool[i].parent.udp = udp;
+ threadpool[i].handler = udp ? handler_udp : handler_tcp;
+
+ ret = pthread_create(&threadpool[i].trid, NULL,
+ worker, &threadpool[i]);
+ if (ret < 0)
+ syslog_panic("Thread creation failed!\n");
+
+ ret = pthread_setaffinity_np(threadpool[i].trid,
+ sizeof(cpuset), &cpuset);
+ if (ret < 0)
+ syslog_panic("Thread CPU migration failed!\n");
+
+ pthread_detach(threadpool[i].trid);
+ }
+
+ sleep(1);
+}
+
+static void thread_finish(unsigned int cpus)
+{
+ int i;
+ unsigned int threads;
+
+ threads = cpus * THREADS_PER_CPU;
+
+ for (i = 0; i < threads; ++i) {
+ while (pthread_join(threadpool[i].trid, NULL) < 0)
+ ;
+
+ close(threadpool[i].efd[0]);
+ close(threadpool[i].efd[1]);
+ }
+}
+
+int server_main(char *home, char *dev, char *port, int udp, int ipv4, int log)
+{
+ int lfd = -1, kdpfd, nfds, nfd, curfds, efd[2], refd[2], tunfd, i;
+ unsigned int cpus = 0, threads, udp_cpu = 0;
+ ssize_t ret;
+ struct epoll_event *events;
+ struct addrinfo hints, *ahead, *ai;
+
+ auth_log = !!log;
+ openlog("curvetun", LOG_PID | LOG_CONS | LOG_NDELAY, LOG_DAEMON);
+
+ syslog(LOG_INFO, "curvetun server booting!\n");
+ syslog_maybe(!auth_log, LOG_INFO, "curvetun user logging disabled!\n");
+
+ parse_userfile_and_generate_user_store_or_die(home);
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = PF_UNSPEC;
+ hints.ai_socktype = udp ? SOCK_DGRAM : SOCK_STREAM;
+ hints.ai_protocol = udp ? IPPROTO_UDP : IPPROTO_TCP;
+ hints.ai_flags = AI_PASSIVE;
+
+ ret = getaddrinfo(NULL, port, &hints, &ahead);
+ if (ret < 0)
+ syslog_panic("Cannot get address info!\n");
+
+ for (ai = ahead; ai != NULL && lfd < 0; ai = ai->ai_next) {
+ lfd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
+ if (lfd < 0)
+ continue;
+ if (ai->ai_family == AF_INET6) {
+#ifdef IPV6_V6ONLY
+ ret = set_ipv6_only(lfd);
+ if (ret < 0) {
+ close(lfd);
+ lfd = -1;
+ continue;
+ }
+#else
+ close(lfd);
+ lfd = -1;
+ continue;
+#endif /* IPV6_V6ONLY */
+ }
+
+ set_reuseaddr(lfd);
+ set_mtu_disc_dont(lfd);
+
+ ret = bind(lfd, ai->ai_addr, ai->ai_addrlen);
+ if (ret < 0) {
+ close(lfd);
+ lfd = -1;
+ continue;
+ }
+
+ if (!udp) {
+ ret = listen(lfd, 5);
+ if (ret < 0) {
+ close(lfd);
+ lfd = -1;
+ continue;
+ }
+ }
+
+ if (ipv4 == -1) {
+ ipv4 = (ai->ai_family == AF_INET6 ? 0 :
+ (ai->ai_family == AF_INET ? 1 : -1));
+ }
+
+ syslog_maybe(auth_log, LOG_INFO, "curvetun on IPv%d via %s "
+ "on port %s!\n", ai->ai_family == AF_INET ? 4 : 6,
+ udp ? "UDP" : "TCP", port);
+ syslog_maybe(auth_log, LOG_INFO, "Allowed overlay proto is "
+ "IPv%d!\n", ipv4 ? 4 : 6);
+ }
+
+ freeaddrinfo(ahead);
+
+ if (lfd < 0 || ipv4 < 0)
+ syslog_panic("Cannot create socket!\n");
+
+ tunfd = tun_open_or_die(dev ? dev : DEVNAME_SERVER, IFF_TUN | IFF_NO_PI);
+
+ pipe_or_die(efd, O_NONBLOCK);
+ pipe_or_die(refd, O_NONBLOCK);
+
+ set_nonblocking(lfd);
+
+ events = xzmalloc(MAX_EPOLL_SIZE * sizeof(*events));
+ for (i = 0; i < MAX_EPOLL_SIZE; ++i)
+ events[i].data.fd = -1;
+
+ kdpfd = epoll_create(MAX_EPOLL_SIZE);
+ if (kdpfd < 0)
+ syslog_panic("Cannot create socket!\n");
+
+ set_epoll_descriptor(kdpfd, EPOLL_CTL_ADD, lfd,
+ udp ? EPOLLIN | EPOLLET | EPOLLONESHOT : EPOLLIN);
+ set_epoll_descriptor(kdpfd, EPOLL_CTL_ADD, efd[0], EPOLLIN);
+ set_epoll_descriptor(kdpfd, EPOLL_CTL_ADD, refd[0], EPOLLIN);
+ set_epoll_descriptor(kdpfd, EPOLL_CTL_ADD, tunfd,
+ EPOLLIN | EPOLLET | EPOLLONESHOT);
+ curfds = 4;
+
+ trie_init();
+
+ cpus = get_number_cpus_online();
+ threads = cpus * THREADS_PER_CPU;
+ if (!ispow2(threads))
+ syslog_panic("Thread number not power of two!\n");
+
+ threadpool = xzmalloc(sizeof(*threadpool) * threads);
+ thread_spawn_or_panic(cpus, efd[1], refd[1], tunfd, ipv4, udp);
+
+ init_cpusched(threads);
+
+ register_socket(tunfd);
+ register_socket(lfd);
+
+ syslog(LOG_INFO, "curvetun up and running!\n");
+
+ while (likely(!sigint)) {
+ nfds = epoll_wait(kdpfd, events, curfds, -1);
+ if (nfds < 0) {
+ syslog(LOG_ERR, "epoll_wait error: %s\n",
+ strerror(errno));
+ break;
+ }
+
+ for (i = 0; i < nfds; ++i) {
+ if (unlikely(events[i].data.fd < 0))
+ continue;
+
+ if (events[i].data.fd == lfd && !udp) {
+ int ncpu;
+ char hbuff[256], sbuff[256];
+ struct sockaddr_storage taddr;
+ socklen_t tlen;
+
+ tlen = sizeof(taddr);
+ nfd = accept(lfd, (struct sockaddr *) &taddr,
+ &tlen);
+ if (nfd < 0) {
+ syslog(LOG_ERR, "accept error: %s\n",
+ strerror(errno));
+ continue;
+ }
+
+ if (curfds + 1 > MAX_EPOLL_SIZE) {
+ close(nfd);
+ continue;
+ }
+
+ curfds++;
+
+ ncpu = register_socket(nfd);
+
+ memset(hbuff, 0, sizeof(hbuff));
+ memset(sbuff, 0, sizeof(sbuff));
+ getnameinfo((struct sockaddr *) &taddr, tlen,
+ hbuff, sizeof(hbuff),
+ sbuff, sizeof(sbuff),
+ NI_NUMERICHOST | NI_NUMERICSERV);
+
+ syslog_maybe(auth_log, LOG_INFO, "New connection "
+ "from %s:%s (%d active client connections) - id %d on CPU%d",
+ hbuff, sbuff, curfds-4, nfd, ncpu);
+
+ set_nonblocking(nfd);
+ set_socket_keepalive(nfd);
+ set_tcp_nodelay(nfd);
+ ret = set_epoll_descriptor2(kdpfd, EPOLL_CTL_ADD,
+ nfd, EPOLLIN | EPOLLET | EPOLLONESHOT);
+ if (ret < 0) {
+ close(nfd);
+ curfds--;
+ continue;
+ }
+ } else if (events[i].data.fd == refd[0]) {
+ int fd_one;
+
+ ret = read_exact(refd[0], &fd_one,
+ sizeof(fd_one), 1);
+ if (ret != sizeof(fd_one) || fd_one <= 0)
+ continue;
+
+ ret = set_epoll_descriptor2(kdpfd, EPOLL_CTL_MOD,
+ fd_one, EPOLLIN | EPOLLET | EPOLLONESHOT);
+ if (ret < 0) {
+ close(fd_one);
+ continue;
+ }
+ } else if (events[i].data.fd == efd[0]) {
+ int fd_del, test;
+
+ ret = read_exact(efd[0], &fd_del,
+ sizeof(fd_del), 1);
+ if (ret != sizeof(fd_del) || fd_del <= 0)
+ continue;
+
+ ret = read(fd_del, &test, sizeof(test));
+ if (ret < 0 && errno == EBADF)
+ continue;
+
+ ret = set_epoll_descriptor2(kdpfd, EPOLL_CTL_DEL,
+ fd_del, 0);
+ if (ret < 0) {
+ close(fd_del);
+ continue;
+ }
+
+ close(fd_del);
+ curfds--;
+ unregister_socket(fd_del);
+
+ syslog_maybe(auth_log, LOG_INFO, "Closed connection "
+ "with id %d (%d active client connections remain)\n", fd_del,
+ curfds-4);
+ } else {
+ int cpu, fd_work = events[i].data.fd;
+
+ if (!udp)
+ cpu = socket_to_cpu(fd_work);
+ else
+ udp_cpu = (udp_cpu + 1) & (threads - 1);
+
+ write_exact(threadpool[udp ? udp_cpu : cpu].efd[1],
+ &fd_work, sizeof(fd_work), 1);
+ }
+ }
+ }
+
+ syslog(LOG_INFO, "curvetun prepare shut down!\n");
+
+ close(lfd);
+ close(efd[0]);
+ close(efd[1]);
+ close(refd[0]);
+ close(refd[1]);
+ close(tunfd);
+
+ thread_finish(cpus);
+
+ xfree(threadpool);
+ xfree(events);
+
+ unregister_socket(lfd);
+ unregister_socket(tunfd);
+
+ destroy_cpusched();
+
+ trie_cleanup();
+
+ destroy_user_store();
+
+ syslog(LOG_INFO, "curvetun shut down!\n");
+ closelog();
+
+ return 0;
+}
diff --git a/ct_servmgmt.c b/ct_servmgmt.c
new file mode 100644
index 0000000..a63eb57
--- /dev/null
+++ b/ct_servmgmt.c
@@ -0,0 +1,278 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2011 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <syslog.h>
+
+#include "die.h"
+#include "built_in.h"
+#include "locking.h"
+#include "xmalloc.h"
+#include "curvetun.h"
+#include "xutils.h"
+#include "curve.h"
+#include "ct_servmgmt.h"
+#include "crypto_box_curve25519xsalsa20poly1305.h"
+#include "crypto_auth_hmacsha512256.h"
+
+#define crypto_box_pub_key_size crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES
+
+/* Config line format: alias;serverip|servername;port;udp|tcp;pubkey\n */
+
+struct server_store {
+ int udp;
+ char alias[256];
+ char host[256];
+ char port[6]; /* 5 + \0 */
+ unsigned char publickey[crypto_box_pub_key_size];
+ struct curve25519_proto proto_inf;
+ unsigned char auth_token[crypto_auth_hmacsha512256_KEYBYTES];
+ struct server_store *next;
+};
+
+static struct server_store *store = NULL;
+static struct server_store *selected = NULL;
+static struct rwlock store_lock;
+
+static struct server_store *server_store_alloc(void)
+{
+ return xzmalloc(sizeof(struct server_store));
+}
+
+static void server_store_free(struct server_store *ss)
+{
+ if (!ss)
+ return;
+ memset(ss, 0, sizeof(struct server_store));
+ xfree(ss);
+}
+
+enum parse_states {
+ PARSE_ALIAS,
+ PARSE_SERVER,
+ PARSE_PORT,
+ PARSE_CARRIER,
+ PARSE_PUBKEY,
+ PARSE_DONE,
+};
+
+static int parse_line(char *line, char *homedir)
+{
+ int ret;
+ char *str;
+ enum parse_states s = PARSE_ALIAS;
+ struct server_store *elem;
+ unsigned char pkey[crypto_box_pub_key_size];
+
+ elem = server_store_alloc();
+ elem->next = store;
+
+ str = strtok(line, ";");
+ for (; str != NULL;) {
+ switch (s) {
+ case PARSE_ALIAS:
+ strlcpy(elem->alias, str, sizeof(elem->alias));
+ s = PARSE_SERVER;
+ break;
+ case PARSE_SERVER:
+ strlcpy(elem->host, str, sizeof(elem->host));
+ s = PARSE_PORT;
+ break;
+ case PARSE_PORT:
+ strlcpy(elem->port, str, sizeof(elem->port));
+ s = PARSE_CARRIER;
+ break;
+ case PARSE_CARRIER:
+ if (!strncmp("udp", str, strlen("udp")))
+ elem->udp = 1;
+ else if (!strncmp("tcp", str, strlen("tcp")))
+ elem->udp = 0;
+ else {
+ syslog(LOG_ERR, "Incorrect carrier type !(udp|tcp) in server spec.\n");
+ return -EIO;
+ }
+ s = PARSE_PUBKEY;
+ break;
+ case PARSE_PUBKEY:
+ if (!curve25519_pubkey_hexparse_32(pkey, sizeof(pkey),
+ str, strlen(str)))
+ return -EINVAL;
+ memcpy(elem->publickey, pkey, sizeof(elem->publickey));
+ memcpy(elem->auth_token, pkey, sizeof(elem->auth_token));
+ ret = curve25519_proto_init(&elem->proto_inf,
+ elem->publickey,
+ sizeof(elem->publickey),
+ homedir, 1);
+ if (ret)
+ return -EIO;
+ s = PARSE_DONE;
+ break;
+ case PARSE_DONE:
+ break;
+ default:
+ return -EIO;
+ }
+
+ str = strtok(NULL, ";");
+ }
+
+ store = elem;
+ return s == PARSE_DONE ? 0 : -EIO;
+}
+
+void parse_userfile_and_generate_serv_store_or_die(char *homedir)
+{
+ FILE *fp;
+ char path[PATH_MAX], buff[1024];
+ int line = 1, ret;
+
+ memset(path, 0, sizeof(path));
+ slprintf(path, sizeof(path), "%s/%s", homedir, FILE_SERVERS);
+
+ rwlock_init(&store_lock);
+ rwlock_wr_lock(&store_lock);
+
+ fp = fopen(path, "r");
+ if (!fp)
+ panic("Cannot open server file!\n");
+
+ memset(buff, 0, sizeof(buff));
+ while (fgets(buff, sizeof(buff), fp) != NULL) {
+ buff[sizeof(buff) - 1] = 0;
+ /* A comment. Skip this line */
+ if (buff[0] == '#' || buff[0] == '\n') {
+ memset(buff, 0, sizeof(buff));
+ line++;
+ continue;
+ }
+
+ ret = parse_line(buff, homedir);
+ if (ret < 0)
+ panic("Cannot parse line %d from clients!\n", line);
+ line++;
+ memset(buff, 0, sizeof(buff));
+ }
+
+ fclose(fp);
+
+ if (store == NULL)
+ panic("No registered servers found!\n");
+
+ rwlock_unlock(&store_lock);
+}
+
+void dump_serv_store(void)
+{
+ int i;
+ struct server_store *elem;
+
+ rwlock_rd_lock(&store_lock);
+ elem = store;
+ while (elem) {
+ printf("[%s] -> %s:%s via %s -> ", elem->alias,
+ elem->host, elem->port,
+ elem->udp ? "udp" : "tcp");
+ for (i = 0; i < sizeof(elem->publickey); ++i)
+ if (i == (sizeof(elem->publickey) - 1))
+ printf("%02x\n", (unsigned char)
+ elem->publickey[i]);
+ else
+ printf("%02x:", (unsigned char)
+ elem->publickey[i]);
+ elem = elem->next;
+ }
+ rwlock_unlock(&store_lock);
+}
+
+void destroy_serv_store(void)
+{
+ struct server_store *elem, *nelem = NULL;
+
+ rwlock_wr_lock(&store_lock);
+ selected = NULL;
+ elem = store;
+ while (elem) {
+ nelem = elem->next;
+ elem->next = NULL;
+ server_store_free(elem);
+ elem = nelem;
+ }
+ rwlock_unlock(&store_lock);
+ rwlock_destroy(&store_lock);
+}
+
+void get_serv_store_entry_by_alias(char *alias, size_t len,
+ char **host, char **port, int *udp)
+{
+ struct server_store *elem;
+
+ rwlock_rd_lock(&store_lock);
+ elem = store;
+ if (!alias) {
+ while (elem && elem->next)
+ elem = elem->next;
+ if (elem) {
+ (*host) = elem->host;
+ (*port) = elem->port;
+ (*udp) = elem->udp;
+ selected = elem;
+ } else {
+ rwlock_unlock(&store_lock);
+ goto nothing;
+ }
+ } else {
+ while (elem) {
+ if (!strncmp(elem->alias, alias,
+ min(len, strlen(elem->alias) + 1)))
+ break;
+ elem = elem->next;
+ }
+ if (elem) {
+ (*host) = elem->host;
+ (*port) = elem->port;
+ (*udp) = elem->udp;
+ selected = elem;
+ } else {
+ rwlock_unlock(&store_lock);
+ goto nothing;
+ }
+ }
+ rwlock_unlock(&store_lock);
+
+ return;
+nothing:
+ (*host) = NULL;
+ (*port) = NULL;
+ (*udp) = -1;
+}
+
+struct curve25519_proto *get_serv_store_entry_proto_inf(void)
+{
+ struct curve25519_proto *ret = NULL;
+
+ rwlock_rd_lock(&store_lock);
+ if (selected)
+ ret = &selected->proto_inf;
+ rwlock_unlock(&store_lock);
+
+ return ret;
+}
+
+unsigned char *get_serv_store_entry_auth_token(void)
+{
+ unsigned char *ret = NULL;
+
+ rwlock_rd_lock(&store_lock);
+ if (selected)
+ ret = selected->auth_token;
+ rwlock_unlock(&store_lock);
+
+ return ret;
+}
diff --git a/ct_servmgmt.h b/ct_servmgmt.h
new file mode 100644
index 0000000..228a08a
--- /dev/null
+++ b/ct_servmgmt.h
@@ -0,0 +1,21 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2011 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef CT_SERVMGMT_H
+#define CT_SERVMGMT_H
+
+#include <stdio.h>
+#include "curve.h"
+
+extern void parse_userfile_and_generate_serv_store_or_die(char *homedir);
+extern void dump_serv_store(void);
+extern void get_serv_store_entry_by_alias(char *alias, size_t len,
+ char **host, char **port, int *udp);
+extern struct curve25519_proto *get_serv_store_entry_proto_inf(void);
+extern unsigned char *get_serv_store_entry_auth_token(void);
+extern void destroy_serv_store(void);
+
+#endif /* CT_SERVMGMT_H */
diff --git a/ct_usermgmt.c b/ct_usermgmt.c
new file mode 100644
index 0000000..0c80dc7
--- /dev/null
+++ b/ct_usermgmt.c
@@ -0,0 +1,772 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2011 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <syslog.h>
+#include <limits.h>
+#include <arpa/inet.h>
+
+#include "die.h"
+#include "ct_usermgmt.h"
+#include "locking.h"
+#include "xmalloc.h"
+#include "xio.h"
+#include "curvetun.h"
+#include "xutils.h"
+#include "curve.h"
+#include "hash.h"
+#include "crypto_verify_32.h"
+#include "crypto_hash_sha512.h"
+#include "crypto_box_curve25519xsalsa20poly1305.h"
+#include "crypto_auth_hmacsha512256.h"
+
+#define crypto_box_pub_key_size crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES
+
+/* Config line format: username;pubkey\n */
+
+struct user_store {
+ char username[256];
+ unsigned char publickey[crypto_box_pub_key_size];
+ struct curve25519_proto proto_inf;
+ struct user_store *next;
+};
+
+struct sock_map_entry {
+ int fd;
+ struct curve25519_proto *proto;
+ struct sock_map_entry *next;
+};
+
+struct sockaddr_map_entry {
+ struct sockaddr_storage *sa;
+ size_t sa_len;
+ struct curve25519_proto *proto;
+ struct sockaddr_map_entry *next;
+};
+
+static struct user_store *store = NULL;
+static struct rwlock store_lock;
+
+static struct hash_table sock_mapper;
+static struct rwlock sock_map_lock;
+
+static struct hash_table sockaddr_mapper;
+static struct rwlock sockaddr_map_lock;
+
+static unsigned char token[crypto_auth_hmacsha512256_KEYBYTES];
+
+static void init_sock_mapper(void)
+{
+ rwlock_init(&sock_map_lock);
+
+ rwlock_wr_lock(&sock_map_lock);
+
+ memset(&sock_mapper, 0, sizeof(sock_mapper));
+ init_hash(&sock_mapper);
+
+ rwlock_unlock(&sock_map_lock);
+}
+
+static void init_sockaddr_mapper(void)
+{
+ rwlock_init(&sockaddr_map_lock);
+ rwlock_wr_lock(&sockaddr_map_lock);
+
+ memset(&sockaddr_mapper, 0, sizeof(sockaddr_mapper));
+ init_hash(&sockaddr_mapper);
+
+ rwlock_unlock(&sockaddr_map_lock);
+}
+
+static int cleanup_batch_sock_mapper(void *ptr)
+{
+ struct sock_map_entry *next;
+ struct sock_map_entry *e = ptr;
+
+ if (!e)
+ return 0;
+
+ while ((next = e->next)) {
+ e->next = NULL;
+ xfree(e);
+ e = next;
+ }
+
+ xfree(e);
+
+ return 0;
+}
+
+static void destroy_sock_mapper(void)
+{
+ rwlock_wr_lock(&sock_map_lock);
+ for_each_hash(&sock_mapper, cleanup_batch_sock_mapper);
+ free_hash(&sock_mapper);
+ rwlock_unlock(&sock_map_lock);
+
+ rwlock_destroy(&sock_map_lock);
+}
+
+static int cleanup_batch_sockaddr_mapper(void *ptr)
+{
+ struct sockaddr_map_entry *next;
+ struct sockaddr_map_entry *e = ptr;
+
+ if (!e)
+ return 0;
+
+ while ((next = e->next)) {
+ e->next = NULL;
+ xfree(e);
+ e = next;
+ }
+
+ xfree(e);
+ return 0;
+}
+
+static void destroy_sockaddr_mapper(void)
+{
+ rwlock_wr_lock(&sockaddr_map_lock);
+ for_each_hash(&sockaddr_mapper, cleanup_batch_sockaddr_mapper);
+ free_hash(&sockaddr_mapper);
+ rwlock_unlock(&sockaddr_map_lock);
+
+ rwlock_destroy(&sockaddr_map_lock);
+}
+
+static struct user_store *user_store_alloc(void)
+{
+ return xzmalloc(sizeof(struct user_store));
+}
+
+static void user_store_free(struct user_store *us)
+{
+ if (!us)
+ return;
+ memset(us, 0, sizeof(struct user_store));
+ xfree(us);
+}
+
+/* already in lock */
+static int __check_duplicate_username(char *username, size_t len)
+{
+ int duplicate = 0;
+ struct user_store *elem = store;
+
+ while (elem) {
+ if (!memcmp(elem->username, username,
+ strlen(elem->username) + 1)) {
+ duplicate = 1;
+ break;
+ }
+ elem = elem->next;
+ }
+
+ return duplicate;
+}
+
+/* already in lock */
+static int __check_duplicate_pubkey(unsigned char *pubkey, size_t len)
+{
+ int duplicate = 0;
+ struct user_store *elem = store;
+
+ while (elem) {
+ if (!memcmp(elem->publickey, pubkey,
+ sizeof(elem->publickey))) {
+ duplicate = 1;
+ break;
+ }
+ elem = elem->next;
+ }
+
+ return duplicate;
+}
+
+enum parse_states {
+ PARSE_USERNAME,
+ PARSE_PUBKEY,
+ PARSE_DONE,
+};
+
+static int parse_line(char *line, char *homedir)
+{
+ int ret;
+ char *str;
+ enum parse_states s = PARSE_USERNAME;
+ struct user_store *elem;
+ unsigned char pkey[crypto_box_pub_key_size];
+
+ elem = user_store_alloc();
+ elem->next = store;
+
+ str = strtok(line, ";");
+ for (; str != NULL;) {
+ switch (s) {
+ case PARSE_USERNAME:
+ if (__check_duplicate_username(str, strlen(str) + 1))
+ return -EINVAL;
+ strlcpy(elem->username, str, sizeof(elem->username));
+ s = PARSE_PUBKEY;
+ break;
+ case PARSE_PUBKEY:
+ if (!curve25519_pubkey_hexparse_32(pkey, sizeof(pkey),
+ str, strlen(str)))
+ return -EINVAL;
+ if (__check_duplicate_pubkey(pkey, sizeof(pkey)))
+ return -EINVAL;
+ memcpy(elem->publickey, pkey, sizeof(elem->publickey));
+ ret = curve25519_proto_init(&elem->proto_inf,
+ elem->publickey,
+ sizeof(elem->publickey),
+ homedir, 1);
+ if (ret)
+ return -EIO;
+ s = PARSE_DONE;
+ break;
+ case PARSE_DONE:
+ break;
+ default:
+ return -EIO;
+ }
+
+ str = strtok(NULL, ";");
+ }
+
+ store = elem;
+ return s == PARSE_DONE ? 0 : -EIO;
+}
+
+void parse_userfile_and_generate_user_store_or_die(char *homedir)
+{
+ FILE *fp;
+ char path[PATH_MAX], buff[512];
+ int line = 1, ret, fd;
+
+ memset(path, 0, sizeof(path));
+ slprintf(path, sizeof(path), "%s/%s", homedir, FILE_CLIENTS);
+
+ rwlock_init(&store_lock);
+ rwlock_wr_lock(&store_lock);
+
+ fp = fopen(path, "r");
+ if (!fp)
+ panic("Cannot open client file!\n");
+
+ memset(buff, 0, sizeof(buff));
+ while (fgets(buff, sizeof(buff), fp) != NULL) {
+ buff[sizeof(buff) - 1] = 0;
+ /* A comment. Skip this line */
+ if (buff[0] == '#' || buff[0] == '\n') {
+ memset(buff, 0, sizeof(buff));
+ line++;
+ continue;
+ }
+
+ ret = parse_line(buff, homedir);
+ if (ret < 0)
+ panic("Cannot parse line %d from clients!\n", line);
+ line++;
+ memset(buff, 0, sizeof(buff));
+ }
+
+ fclose(fp);
+
+ if (store == NULL)
+ panic("No registered clients found!\n");
+
+ rwlock_unlock(&store_lock);
+
+ init_sock_mapper();
+ init_sockaddr_mapper();
+
+ /*
+ * Pubkey is also used as a hmac of the initial packet to check
+ * the integrity of the packet, so that we know if it's just random
+ * garbage or a 'valid' packet. Again, just for the integrity!
+ */
+
+ memset(path, 0, sizeof(path));
+ slprintf(path, sizeof(path), "%s/%s", homedir, FILE_PUBKEY);
+
+ fd = open_or_die(path, O_RDONLY);
+ ret = read(fd, token, sizeof(token));
+ if (ret != crypto_auth_hmacsha512256_KEYBYTES)
+ panic("Cannot read public key!\n");
+ close(fd);
+}
+
+void dump_user_store(void)
+{
+ int i;
+ struct user_store *elem;
+
+ rwlock_rd_lock(&store_lock);
+
+ elem = store;
+ while (elem) {
+ printf("%s -> ", elem->username);
+ for (i = 0; i < sizeof(elem->publickey); ++i)
+ if (i == (sizeof(elem->publickey) - 1))
+ printf("%02x\n", (unsigned char)
+ elem->publickey[i]);
+ else
+ printf("%02x:", (unsigned char)
+ elem->publickey[i]);
+ elem = elem->next;
+ }
+
+ rwlock_unlock(&store_lock);
+}
+
+void destroy_user_store(void)
+{
+ struct user_store *elem, *nelem = NULL;
+
+ rwlock_wr_lock(&store_lock);
+
+ elem = store;
+ while (elem) {
+ nelem = elem->next;
+ elem->next = NULL;
+ user_store_free(elem);
+ elem = nelem;
+ }
+ rwlock_unlock(&store_lock);
+
+ rwlock_destroy(&store_lock);
+
+ destroy_sock_mapper();
+ destroy_sockaddr_mapper();
+}
+
+int username_msg(char *username, size_t len, char *dst, size_t dlen)
+{
+ int fd;
+ ssize_t ret;
+ uint32_t salt;
+ unsigned char h[crypto_hash_sha512_BYTES];
+ struct username_struct *us = (struct username_struct *) dst;
+ char *uname;
+ size_t uname_len;
+
+ if (dlen < sizeof(struct username_struct))
+ return -ENOMEM;
+
+ uname_len = 512;
+ uname = xzmalloc(uname_len);
+
+ fd = open_or_die("/dev/random", O_RDONLY);
+ ret = read_exact(fd, &salt, sizeof(salt), 0);
+ if (ret != sizeof(salt))
+ panic("Cannot read from /dev/random!\n");
+ close(fd);
+
+ slprintf(uname, uname_len, "%s%u", username, salt);
+ crypto_hash_sha512(h, (unsigned char *) uname, strlen(uname));
+
+ us->salt = htonl(salt);
+ memcpy(us->hash, h, sizeof(us->hash));
+
+ xfree(uname);
+ return 0;
+}
+
+enum is_user_enum username_msg_is_user(char *src, size_t slen, char *username,
+ size_t len)
+{
+ char *uname;
+ size_t uname_len;
+ uint32_t salt;
+ struct username_struct *us = (struct username_struct *) src;
+ unsigned char h[crypto_hash_sha512_BYTES];
+
+ if (slen < sizeof(struct username_struct)) {
+ errno = ENOMEM;
+ return USERNAMES_ERR;
+ }
+
+ uname_len = 512;
+ uname = xzmalloc(uname_len);
+
+ salt = ntohl(us->salt);
+
+ slprintf(uname, uname_len, "%s%u", username, salt);
+ crypto_hash_sha512(h, (unsigned char *) uname, strlen(uname));
+ xfree(uname);
+
+ if (!crypto_verify_32(&h[0], &us->hash[0]) &&
+ !crypto_verify_32(&h[32], &us->hash[32]))
+ return USERNAMES_OK;
+ else
+ return USERNAMES_NE;
+}
+
+static int register_user_by_socket(int fd, struct curve25519_proto *proto)
+{
+ void **pos;
+ struct sock_map_entry *entry;
+
+ rwlock_wr_lock(&sock_map_lock);
+
+ entry = xzmalloc(sizeof(*entry));
+ entry->fd = fd;
+ entry->proto = proto;
+
+ pos = insert_hash(entry->fd, entry, &sock_mapper);
+ if (pos) {
+ entry->next = (*pos);
+ (*pos) = entry;
+ }
+
+ rwlock_unlock(&sock_map_lock);
+
+ return 0;
+}
+
+static int register_user_by_sockaddr(struct sockaddr_storage *sa,
+ size_t sa_len,
+ struct curve25519_proto *proto)
+{
+ void **pos;
+ struct sockaddr_map_entry *entry;
+ unsigned int hash = hash_name((char *) sa, sa_len);
+
+ rwlock_wr_lock(&sockaddr_map_lock);
+
+ entry = xzmalloc(sizeof(*entry));
+ entry->sa = xmemdupz(sa, sa_len);
+ entry->sa_len = sa_len;
+ entry->proto = proto;
+
+ pos = insert_hash(hash, entry, &sockaddr_mapper);
+ if (pos) {
+ entry->next = (*pos);
+ (*pos) = entry;
+ }
+
+ rwlock_unlock(&sockaddr_map_lock);
+
+ return 0;
+}
+
+int try_register_user_by_socket(struct curve25519_struct *c,
+ char *src, size_t slen, int sock, int log)
+{
+ int ret = -1;
+ char *cbuff = NULL;
+ size_t real_len = 132;
+ ssize_t clen;
+ struct user_store *elem;
+ enum is_user_enum err;
+ unsigned char auth[crypto_auth_hmacsha512256_BYTES];
+ struct taia arrival_taia;
+
+ /* assert(132 == clen + sizeof(auth)); */
+ /*
+ * Check hmac first, if malicious, drop immediately before we
+ * investigate more efforts.
+ */
+ if (slen < real_len)
+ return -1;
+
+ taia_now(&arrival_taia);
+
+ memcpy(auth, src, sizeof(auth));
+
+ src += sizeof(auth);
+ real_len -= sizeof(auth);
+
+ if (crypto_auth_hmacsha512256_verify(auth, (unsigned char *) src,
+ real_len, token)) {
+ syslog(LOG_ERR, "Bad packet hmac for id %d! Dropping!\n", sock);
+ return -1;
+ } else {
+ if (log)
+ syslog(LOG_INFO, "Good packet hmac for id %d!\n", sock);
+ }
+
+ rwlock_rd_lock(&store_lock);
+
+ elem = store;
+ while (elem) {
+ clen = curve25519_decode(c, &elem->proto_inf,
+ (unsigned char *) src, real_len,
+ (unsigned char **) &cbuff,
+ &arrival_taia);
+ if (clen <= 0) {
+ elem = elem->next;
+ continue;
+ }
+
+ cbuff += crypto_box_zerobytes;
+ clen -= crypto_box_zerobytes;
+
+ if (log)
+ syslog(LOG_INFO, "Packet decoded sucessfully for id %d!\n", sock);
+
+ err = username_msg_is_user(cbuff, clen, elem->username,
+ strlen(elem->username) + 1);
+ if (err == USERNAMES_OK) {
+ if (log)
+ syslog(LOG_INFO, "Found user %s for id %d! Registering ...\n",
+ elem->username, sock);
+ ret = register_user_by_socket(sock, &elem->proto_inf);
+ break;
+ }
+
+ elem = elem->next;
+ }
+
+ rwlock_unlock(&store_lock);
+
+ if (ret == -1)
+ syslog(LOG_ERR, "User not found! Dropping connection!\n");
+
+ return ret;
+}
+
+int try_register_user_by_sockaddr(struct curve25519_struct *c,
+ char *src, size_t slen,
+ struct sockaddr_storage *sa,
+ size_t sa_len, int log)
+{
+ int ret = -1;
+ char *cbuff = NULL;
+ struct user_store *elem;
+ ssize_t clen;
+ size_t real_len = 132;
+ enum is_user_enum err;
+ unsigned char auth[crypto_auth_hmacsha512256_BYTES];
+ struct taia arrival_taia;
+
+ /* assert(132 == clen + sizeof(auth)); */
+ /*
+ * Check hmac first, if malicious, drop immediately before we
+ * investigate more efforts.
+ */
+ if (slen < real_len)
+ return -1;
+
+ taia_now(&arrival_taia);
+
+ memcpy(auth, src, sizeof(auth));
+
+ src += sizeof(auth);
+ real_len -= sizeof(auth);
+
+ if (crypto_auth_hmacsha512256_verify(auth, (unsigned char *) src,
+ real_len, token)) {
+ syslog(LOG_ERR, "Got bad packet hmac! Dropping!\n");
+ return -1;
+ } else {
+ if (log)
+ syslog(LOG_INFO, "Got good packet hmac!\n");
+ }
+
+ rwlock_rd_lock(&store_lock);
+
+ elem = store;
+ while (elem) {
+ clen = curve25519_decode(c, &elem->proto_inf,
+ (unsigned char *) src, real_len,
+ (unsigned char **) &cbuff,
+ &arrival_taia);
+ if (clen <= 0) {
+ elem = elem->next;
+ continue;
+ }
+
+ cbuff += crypto_box_zerobytes;
+ clen -= crypto_box_zerobytes;
+
+ if (log)
+ syslog(LOG_INFO, "Packet decoded sucessfully!\n");
+
+ err = username_msg_is_user(cbuff, clen, elem->username,
+ strlen(elem->username) + 1);
+ if (err == USERNAMES_OK) {
+ if (log)
+ syslog(LOG_INFO, "Found user %s! Registering ...\n",
+ elem->username);
+ ret = register_user_by_sockaddr(sa, sa_len,
+ &elem->proto_inf);
+ break;
+ }
+
+ elem = elem->next;
+ }
+
+ rwlock_unlock(&store_lock);
+
+ if (ret == -1)
+ syslog(LOG_ERR, "User not found! Dropping connection!\n");
+
+ return ret;
+}
+
+int get_user_by_socket(int fd, struct curve25519_proto **proto)
+{
+ int ret = -1;
+ struct sock_map_entry *entry;
+
+ errno = 0;
+
+ rwlock_rd_lock(&sock_map_lock);
+
+ entry = lookup_hash(fd, &sock_mapper);
+ while (entry && fd != entry->fd)
+ entry = entry->next;
+ if (entry && fd == entry->fd) {
+ (*proto) = entry->proto;
+ ret = 0;
+ } else {
+ (*proto) = NULL;
+ errno = ENOENT;
+ }
+
+ rwlock_unlock(&sock_map_lock);
+
+ return ret;
+}
+
+int get_user_by_sockaddr(struct sockaddr_storage *sa, size_t sa_len,
+ struct curve25519_proto **proto)
+{
+ int ret = -1;
+ struct sockaddr_map_entry *entry;
+ unsigned int hash = hash_name((char *) sa, sa_len);
+
+ errno = 0;
+
+ rwlock_rd_lock(&sockaddr_map_lock);
+
+ entry = lookup_hash(hash, &sockaddr_mapper);
+ while (entry && entry->sa_len == sa_len &&
+ memcmp(sa, entry->sa, entry->sa_len))
+ entry = entry->next;
+ if (entry && entry->sa_len == sa_len &&
+ !memcmp(sa, entry->sa, entry->sa_len)) {
+ (*proto) = entry->proto;
+ ret = 0;
+ } else {
+ (*proto) = NULL;
+ errno = ENOENT;
+ }
+
+ rwlock_unlock(&sockaddr_map_lock);
+
+ return ret;
+}
+
+static struct sock_map_entry *socket_to_sock_map_entry(int fd)
+{
+ struct sock_map_entry *entry, *ret = NULL;
+
+ errno = 0;
+
+ rwlock_rd_lock(&sock_map_lock);
+
+ entry = lookup_hash(fd, &sock_mapper);
+ while (entry && fd != entry->fd)
+ entry = entry->next;
+ if (entry && fd == entry->fd)
+ ret = entry;
+ else
+ errno = ENOENT;
+
+ rwlock_unlock(&sock_map_lock);
+
+ return ret;
+}
+
+void remove_user_by_socket(int fd)
+{
+ struct sock_map_entry *pos;
+ struct sock_map_entry *entry = socket_to_sock_map_entry(fd);
+
+ if (!entry)
+ return;
+
+ rwlock_wr_lock(&sock_map_lock);
+
+ pos = remove_hash(entry->fd, entry, entry->next, &sock_mapper);
+ while (pos && pos->next && pos->next != entry)
+ pos = pos->next;
+ if (pos && pos->next && pos->next == entry)
+ pos->next = entry->next;
+
+ memset(entry->proto->enonce, 0, sizeof(entry->proto->enonce));
+ memset(entry->proto->dnonce, 0, sizeof(entry->proto->dnonce));
+
+ entry->proto = NULL;
+ entry->next = NULL;
+
+ xfree(entry);
+
+ rwlock_unlock(&sock_map_lock);
+}
+
+static struct sockaddr_map_entry *
+sockaddr_to_sockaddr_map_entry(struct sockaddr_storage *sa, size_t sa_len)
+{
+ struct sockaddr_map_entry *entry, *ret = NULL;
+ unsigned int hash = hash_name((char *) sa, sa_len);
+
+ errno = 0;
+
+ rwlock_rd_lock(&sockaddr_map_lock);
+
+ entry = lookup_hash(hash, &sockaddr_mapper);
+ while (entry && entry->sa_len == sa_len &&
+ memcmp(sa, entry->sa, entry->sa_len))
+ entry = entry->next;
+ if (entry && entry->sa_len == sa_len &&
+ !memcmp(sa, entry->sa, entry->sa_len))
+ ret = entry;
+ else
+ errno = ENOENT;
+
+ rwlock_unlock(&sockaddr_map_lock);
+
+ return ret;
+}
+
+void remove_user_by_sockaddr(struct sockaddr_storage *sa, size_t sa_len)
+{
+ struct sockaddr_map_entry *pos;
+ struct sockaddr_map_entry *entry;
+ unsigned int hash = hash_name((char *) sa, sa_len);
+
+ entry = sockaddr_to_sockaddr_map_entry(sa, sa_len);
+ if (!entry)
+ return;
+
+ rwlock_wr_lock(&sockaddr_map_lock);
+
+ pos = remove_hash(hash, entry, entry->next, &sockaddr_mapper);
+ while (pos && pos->next && pos->next != entry)
+ pos = pos->next;
+ if (pos && pos->next && pos->next == entry)
+ pos->next = entry->next;
+
+ memset(entry->proto->enonce, 0, sizeof(entry->proto->enonce));
+ memset(entry->proto->dnonce, 0, sizeof(entry->proto->dnonce));
+
+ entry->proto = NULL;
+ entry->next = NULL;
+
+ xfree(entry->sa);
+ xfree(entry);
+
+ rwlock_unlock(&sockaddr_map_lock);
+}
diff --git a/ct_usermgmt.h b/ct_usermgmt.h
new file mode 100644
index 0000000..d7caae0
--- /dev/null
+++ b/ct_usermgmt.h
@@ -0,0 +1,49 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2011 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef CT_USERMGMT_H
+#define CT_USERMGMT_H
+
+#include <stdint.h>
+
+#include "curve.h"
+#include "crypto_hash_sha512.h"
+
+enum is_user_enum {
+ USERNAMES_OK = 0, /* Usernames match, valid 'token' */
+ USERNAMES_NE, /* Usernames do not match */
+ USERNAMES_TS, /* Usernames match, but 'token' invalid,
+ Drop connection here */
+ USERNAMES_ERR,
+};
+
+struct username_struct {
+ uint32_t salt;
+ uint8_t hash[crypto_hash_sha512_BYTES];
+};
+
+extern int username_msg(char *username, size_t len, char *dst, size_t dlen);
+extern enum is_user_enum username_msg_is_user(char *src, size_t slen,
+ char *username, size_t len);
+extern void parse_userfile_and_generate_user_store_or_die(char *homedir);
+extern void dump_user_store(void);
+extern void destroy_user_store(void);
+
+extern int get_user_by_socket(int sock, struct curve25519_proto **proto);
+extern int get_user_by_sockaddr(struct sockaddr_storage *sa, size_t sa_len,
+ struct curve25519_proto **proto);
+extern int try_register_user_by_socket(struct curve25519_struct *c,
+ char *src, size_t slen, int sock,
+ int log);
+extern int try_register_user_by_sockaddr(struct curve25519_struct *c,
+ char *src, size_t slen,
+ struct sockaddr_storage *sa,
+ size_t sa_len, int log);
+extern void remove_user_by_socket(int sock);
+extern void remove_user_by_sockaddr(struct sockaddr_storage *sa,
+ size_t sa_len);
+
+#endif /* CT_USERMGMT_H */
diff --git a/curve.c b/curve.c
new file mode 100644
index 0000000..229cd76
--- /dev/null
+++ b/curve.c
@@ -0,0 +1,281 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2011 - 2013 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <syslog.h>
+#include <limits.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+
+#include "built_in.h"
+#include "xmalloc.h"
+#include "curve.h"
+#include "xutils.h"
+#include "xio.h"
+#include "die.h"
+#include "curvetun.h"
+#include "locking.h"
+#include "crypto_verify_32.h"
+#include "crypto_box_curve25519xsalsa20poly1305.h"
+#include "crypto_scalarmult_curve25519.h"
+
+#define crypto_box_beforenm crypto_box_curve25519xsalsa20poly1305_beforenm
+#define crypto_box_afternm crypto_box_curve25519xsalsa20poly1305_afternm
+#define crypto_box_open_afternm crypto_box_curve25519xsalsa20poly1305_open_afternm
+
+#define NONCE_LENGTH (sizeof(struct taia))
+#define NONCE_OFFSET (crypto_box_curve25519xsalsa20poly1305_NONCEBYTES - NONCE_LENGTH)
+
+void curve25519_selftest(void)
+{
+ int i;
+ unsigned char alicesk[32] = {
+ 0x77, 0x07, 0x6d, 0x0a, 0x73, 0x18, 0xa5, 0x7d,
+ 0x3c, 0x16, 0xc1, 0x72, 0x51, 0xb2, 0x66, 0x45,
+ 0xdf, 0x4c, 0x2f, 0x87, 0xeb, 0xc0, 0x99, 0x2a,
+ 0xb1, 0x77, 0xfb, 0xa5, 0x1d, 0xb9, 0x2c, 0x2a
+ };
+ unsigned char bobpk[32] = {
+ 0xde, 0x9e, 0xdb, 0x7d, 0x7b, 0x7d, 0xc1, 0xb4,
+ 0xd3, 0x5b, 0x61, 0xc2, 0xec, 0xe4, 0x35, 0x37,
+ 0x3f, 0x83, 0x43, 0xc8, 0x5b, 0x78, 0x67, 0x4d,
+ 0xad, 0xfc, 0x7e, 0x14, 0x6f, 0x88, 0x2b, 0x4f
+ };
+ unsigned char nonce[24] = {
+ 0x69, 0x69, 0x6e, 0xe9, 0x55, 0xb6, 0x2b, 0x73,
+ 0xcd, 0x62, 0xbd, 0xa8, 0x75, 0xfc, 0x73, 0xd6,
+ 0x82, 0x19, 0xe0, 0x03, 0x6b, 0x7a, 0x0b, 0x37
+ };
+ unsigned char m[163] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xbe, 0x07, 0x5f, 0xc5, 0x3c, 0x81, 0xf2, 0xd5,
+ 0xcf, 0x14, 0x13, 0x16, 0xeb, 0xeb, 0x0c, 0x7b,
+ 0x52, 0x28, 0xc5, 0x2a, 0x4c, 0x62, 0xcb, 0xd4,
+ 0x4b, 0x66, 0x84, 0x9b, 0x64, 0x24, 0x4f, 0xfc,
+ 0xe5, 0xec, 0xba, 0xaf, 0x33, 0xbd, 0x75, 0x1a,
+ 0x1a, 0xc7, 0x28, 0xd4, 0x5e, 0x6c, 0x61, 0x29,
+ 0x6c, 0xdc, 0x3c, 0x01, 0x23, 0x35, 0x61, 0xf4,
+ 0x1d, 0xb6, 0x6c, 0xce, 0x31, 0x4a, 0xdb, 0x31,
+ 0x0e, 0x3b, 0xe8, 0x25, 0x0c, 0x46, 0xf0, 0x6d,
+ 0xce, 0xea, 0x3a, 0x7f, 0xa1, 0x34, 0x80, 0x57,
+ 0xe2, 0xf6, 0x55, 0x6a, 0xd6, 0xb1, 0x31, 0x8a,
+ 0x02, 0x4a, 0x83, 0x8f, 0x21, 0xaf, 0x1f, 0xde,
+ 0x04, 0x89, 0x77, 0xeb, 0x48, 0xf5, 0x9f, 0xfd,
+ 0x49, 0x24, 0xca, 0x1c, 0x60, 0x90, 0x2e, 0x52,
+ 0xf0, 0xa0, 0x89, 0xbc, 0x76, 0x89, 0x70, 0x40,
+ 0xe0, 0x82, 0xf9, 0x37, 0x76, 0x38, 0x48, 0x64,
+ 0x5e, 0x07, 0x05
+ };
+ unsigned char c[163];
+ unsigned char result[147] = {
+ 0xf3, 0xff, 0xc7, 0x70, 0x3f, 0x94, 0x00, 0xe5,
+ 0x2a, 0x7d, 0xfb, 0x4b, 0x3d, 0x33, 0x05, 0xd9,
+ 0x8e, 0x99, 0x3b, 0x9f, 0x48, 0x68, 0x12, 0x73,
+ 0xc2, 0x96, 0x50, 0xba, 0x32, 0xfc, 0x76, 0xce,
+ 0x48, 0x33, 0x2e, 0xa7, 0x16, 0x4d, 0x96, 0xa4,
+ 0x47, 0x6f, 0xb8, 0xc5, 0x31, 0xa1, 0x18, 0x6a,
+ 0xc0, 0xdf, 0xc1, 0x7c, 0x98, 0xdc, 0xe8, 0x7b,
+ 0x4d, 0xa7, 0xf0, 0x11, 0xec, 0x48, 0xc9, 0x72,
+ 0x71, 0xd2, 0xc2, 0x0f, 0x9b, 0x92, 0x8f, 0xe2,
+ 0x27, 0x0d, 0x6f, 0xb8, 0x63, 0xd5, 0x17, 0x38,
+ 0xb4, 0x8e, 0xee, 0xe3, 0x14, 0xa7, 0xcc, 0x8a,
+ 0xb9, 0x32, 0x16, 0x45, 0x48, 0xe5, 0x26, 0xae,
+ 0x90, 0x22, 0x43, 0x68, 0x51, 0x7a, 0xcf, 0xea,
+ 0xbd, 0x6b, 0xb3, 0x73, 0x2b, 0xc0, 0xe9, 0xda,
+ 0x99, 0x83, 0x2b, 0x61, 0xca, 0x01, 0xb6, 0xde,
+ 0x56, 0x24, 0x4a, 0x9e, 0x88, 0xd5, 0xf9, 0xb3,
+ 0x79, 0x73, 0xf6, 0x22, 0xa4, 0x3d, 0x14, 0xa6,
+ 0x59, 0x9b, 0x1f, 0x65, 0x4c, 0xb4, 0x5a, 0x74,
+ 0xe3, 0x55, 0xa5
+ };
+
+ bug_on(NONCE_LENGTH != 16);
+
+ crypto_box_curve25519xsalsa20poly1305(c, m, 163, nonce, bobpk, alicesk);
+
+ for (i = 16; i < 163; ++i) {
+ if (c[i] != result[i - 16])
+ panic("Crypto selftest failed! :-(\n");
+ }
+}
+
+int curve25519_pubkey_hexparse_32(unsigned char *bin, size_t blen,
+ const char *ascii, size_t alen)
+{
+ int ret = sscanf(ascii,
+ "%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:"
+ "%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:"
+ "%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:"
+ "%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx",
+ &bin[0], &bin[1], &bin[2], &bin[3], &bin[4],
+ &bin[5], &bin[6], &bin[7], &bin[8], &bin[9],
+ &bin[10], &bin[11], &bin[12], &bin[13], &bin[14],
+ &bin[15], &bin[16], &bin[17], &bin[18], &bin[19],
+ &bin[20], &bin[21], &bin[22], &bin[23], &bin[24],
+ &bin[25], &bin[26], &bin[27], &bin[28], &bin[29],
+ &bin[30], &bin[31]);
+ return ret == 32;
+}
+
+void curve25519_alloc_or_maybe_die(struct curve25519_struct *curve)
+{
+ curve->enc_buf_size = curve->dec_buf_size = TUNBUFF_SIZ;
+
+ curve->enc_buf = xmalloc_aligned(curve->enc_buf_size, 16);
+ curve->dec_buf = xmalloc_aligned(curve->dec_buf_size, 16);
+
+ spinlock_init(&curve->enc_lock);
+ spinlock_init(&curve->dec_lock);
+}
+
+void curve25519_free(void *curvep)
+{
+ struct curve25519_struct *curve = curvep;
+
+ memset(curve->enc_buf, 0, curve->enc_buf_size);
+ memset(curve->dec_buf, 0, curve->dec_buf_size);
+
+ xfree(curve->enc_buf);
+ xfree(curve->dec_buf);
+
+ spinlock_destroy(&curve->enc_lock);
+ spinlock_destroy(&curve->dec_lock);
+}
+
+int curve25519_proto_init(struct curve25519_proto *proto, unsigned char *pubkey_remote,
+ size_t len, char *home, int server)
+{
+ int fd;
+ ssize_t ret;
+ char path[PATH_MAX];
+ unsigned char secretkey_own[crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES];
+ unsigned char publickey_own[crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES];
+
+ fmemset(secretkey_own, 0, sizeof(secretkey_own));
+ fmemset(publickey_own, 0, sizeof(publickey_own));
+
+ if (!pubkey_remote || len != sizeof(publickey_own))
+ return -EINVAL;
+
+ slprintf(path, sizeof(path), "%s/%s", home, FILE_PRIVKEY);
+ fd = open_or_die(path, O_RDONLY);
+
+ ret = read(fd, secretkey_own, sizeof(secretkey_own));
+ if (ret != sizeof(secretkey_own)) {
+ xmemset(secretkey_own, 0, sizeof(secretkey_own));
+ panic("Cannot read private key!\n");
+ }
+
+ close(fd);
+
+ crypto_scalarmult_curve25519_base(publickey_own, secretkey_own);
+
+ if (!crypto_verify_32(publickey_own, pubkey_remote)) {
+ xmemset(secretkey_own, 0, sizeof(secretkey_own));
+ xmemset(publickey_own, 0, sizeof(publickey_own));
+ panic("PANIC: remote end has same public key as you have!!!\n");
+ }
+
+ crypto_box_beforenm(proto->key, pubkey_remote, secretkey_own);
+
+ xmemset(proto->enonce, 0, sizeof(proto->enonce));
+ xmemset(proto->dnonce, 0, sizeof(proto->dnonce));
+
+ xmemset(secretkey_own, 0, sizeof(secretkey_own));
+ xmemset(publickey_own, 0, sizeof(publickey_own));
+
+ return 0;
+}
+
+ssize_t curve25519_encode(struct curve25519_struct *curve, struct curve25519_proto *proto,
+ unsigned char *plaintext, size_t size, unsigned char **chipertext)
+{
+ int ret, i;
+ ssize_t done = size;
+ struct taia packet_taia;
+
+ spinlock_lock(&curve->enc_lock);
+
+ if (unlikely(size > curve->enc_buf_size)) {
+ done = -ENOMEM;
+ goto out;
+ }
+
+ taia_now(&packet_taia);
+ taia_pack(proto->enonce + NONCE_OFFSET, &packet_taia);
+
+ memset(curve->enc_buf, 0, curve->enc_buf_size);
+ ret = crypto_box_afternm(curve->enc_buf, plaintext, size, proto->enonce, proto->key);
+ if (unlikely(ret)) {
+ done = -EIO;
+ goto out;
+ }
+
+ fmemcpy(curve->enc_buf + crypto_box_boxzerobytes - NONCE_LENGTH,
+ proto->enonce + NONCE_OFFSET, NONCE_LENGTH);
+
+ for (i = 0; i < crypto_box_boxzerobytes - NONCE_LENGTH; ++i)
+ curve->enc_buf[i] = (uint8_t) secrand();
+
+ (*chipertext) = curve->enc_buf;
+out:
+ spinlock_unlock(&curve->enc_lock);
+ return done;
+}
+
+ssize_t curve25519_decode(struct curve25519_struct *curve, struct curve25519_proto *proto,
+ unsigned char *chipertext, size_t size, unsigned char **plaintext,
+ struct taia *arrival_taia)
+{
+ int ret;
+ ssize_t done = size;
+ struct taia packet_taia, arrival_taia2;
+
+ spinlock_lock(&curve->dec_lock);
+
+ if (unlikely(size > curve->dec_buf_size)) {
+ done = -ENOMEM;
+ goto out;
+ }
+ if (unlikely(size < crypto_box_boxzerobytes + NONCE_LENGTH)) {
+ done = 0;
+ goto out;
+ }
+ if (arrival_taia == NULL) {
+ taia_now(&arrival_taia2);
+ arrival_taia = &arrival_taia2;
+ }
+
+ taia_unpack(chipertext + crypto_box_boxzerobytes - NONCE_LENGTH, &packet_taia);
+ if (is_good_taia(arrival_taia, &packet_taia) == 0) {
+ syslog(LOG_ERR, "Bad packet time! Dropping connection!\n");
+ done = 0;
+ goto out;
+ }
+
+ memcpy(proto->dnonce + NONCE_OFFSET, chipertext + crypto_box_boxzerobytes - NONCE_LENGTH, NONCE_LENGTH);
+ memset(curve->dec_buf, 0, curve->dec_buf_size);
+
+ ret = crypto_box_open_afternm(curve->dec_buf, chipertext, size, proto->dnonce, proto->key);
+ if (unlikely(ret)) {
+ done = -EIO;
+ goto out;
+ }
+
+ (*plaintext) = curve->dec_buf;
+out:
+ spinlock_unlock(&curve->dec_lock);
+ return done;
+}
diff --git a/curve.h b/curve.h
new file mode 100644
index 0000000..85c6e61
--- /dev/null
+++ b/curve.h
@@ -0,0 +1,218 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2011 - 2013 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef CURVE_H
+#define CURVE_H
+
+#include <stdint.h>
+#include <sys/time.h>
+
+#include "locking.h"
+#include "built_in.h"
+#include "xio.h"
+#include "crypto_box_curve25519xsalsa20poly1305.h"
+
+struct tai {
+ uint64_t x;
+};
+
+struct taia {
+ struct tai sec;
+ uint32_t nano;
+ uint32_t atto;
+};
+
+static struct taia tolerance_taia = {
+ .sec.x = 0,
+ .nano = 700000000ULL,
+ .atto = 0,
+};
+
+#define crypto_box_zerobytes crypto_box_curve25519xsalsa20poly1305_ZEROBYTES
+#define crypto_box_boxzerobytes crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES
+
+#define crypto_box_noncebytes crypto_box_curve25519xsalsa20poly1305_NONCEBYTES
+#define crypto_box_beforenmbytes crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES
+
+struct curve25519_proto {
+ unsigned char enonce[crypto_box_noncebytes] __aligned_16;
+ unsigned char dnonce[crypto_box_noncebytes] __aligned_16;
+ unsigned char key[crypto_box_noncebytes] __aligned_16;
+};
+
+struct curve25519_struct {
+ unsigned char *enc_buf;
+ unsigned char *dec_buf;
+ size_t enc_buf_size;
+ size_t dec_buf_size;
+ struct spinlock enc_lock;
+ struct spinlock dec_lock;
+};
+
+extern void curve25519_selftest(void);
+extern void curve25519_alloc_or_maybe_die(struct curve25519_struct *curve);
+extern void curve25519_free(void *curve);
+extern int curve25519_pubkey_hexparse_32(unsigned char *bin, size_t blen, const char *ascii, size_t alen);
+extern int curve25519_proto_init(struct curve25519_proto *proto, unsigned char *pubkey_remote, size_t len,
+ char *home, int server);
+extern ssize_t curve25519_encode(struct curve25519_struct *curve, struct curve25519_proto *proto,
+ unsigned char *plaintext, size_t size, unsigned char **chipertext);
+extern ssize_t curve25519_decode(struct curve25519_struct *curve, struct curve25519_proto *proto,
+ unsigned char *chipertext, size_t size, unsigned char **plaintext,
+ struct taia *arrival_taia);
+
+static inline void tai_pack(unsigned char *s, struct tai *t)
+{
+ uint64_t x;
+
+ x = t->x;
+ s[7] = x & 255; x >>= 8;
+ s[6] = x & 255; x >>= 8;
+ s[5] = x & 255; x >>= 8;
+ s[4] = x & 255; x >>= 8;
+ s[3] = x & 255; x >>= 8;
+ s[2] = x & 255; x >>= 8;
+ s[1] = x & 255; x >>= 8;
+ s[0] = x;
+}
+
+static inline void tai_unpack(unsigned char *s, struct tai *t)
+{
+ uint64_t x;
+
+ x = (unsigned char) s[0];
+ x <<= 8; x += (unsigned char) s[1];
+ x <<= 8; x += (unsigned char) s[2];
+ x <<= 8; x += (unsigned char) s[3];
+ x <<= 8; x += (unsigned char) s[4];
+ x <<= 8; x += (unsigned char) s[5];
+ x <<= 8; x += (unsigned char) s[6];
+ x <<= 8; x += (unsigned char) s[7];
+ t->x = x;
+}
+
+static inline void taia_pack(unsigned char *s, struct taia *t)
+{
+ unsigned long x;
+
+ tai_pack(s, &t->sec);
+ s += 8;
+ x = t->atto;
+ s[7] = x & 255; x >>= 8;
+ s[6] = x & 255; x >>= 8;
+ s[5] = x & 255; x >>= 8;
+ s[4] = x;
+ x = t->nano;
+ s[3] = x & 255; x >>= 8;
+ s[2] = x & 255; x >>= 8;
+ s[1] = x & 255; x >>= 8;
+ s[0] = x;
+}
+
+static inline void taia_unpack(unsigned char *s, struct taia *t)
+{
+ unsigned long x;
+
+ tai_unpack(s, &t->sec);
+ s += 8;
+ x = (unsigned char) s[4];
+ x <<= 8; x += (unsigned char) s[5];
+ x <<= 8; x += (unsigned char) s[6];
+ x <<= 8; x += (unsigned char) s[7];
+ t->atto = x;
+ x = (unsigned char) s[0];
+ x <<= 8; x += (unsigned char) s[1];
+ x <<= 8; x += (unsigned char) s[2];
+ x <<= 8; x += (unsigned char) s[3];
+ t->nano = x;
+}
+
+#define tai_unix(t, u) ((void) ((t)->x = 4611686018427387914ULL + (uint64_t) (u)))
+
+static inline void taia_now(struct taia *t)
+{
+ struct timeval now;
+
+ gettimeofday(&now, NULL);
+
+ tai_unix(&t->sec, now.tv_sec);
+ t->nano = 1000 * now.tv_usec + 500;
+ t->atto = secrand();
+}
+
+static inline void taia_sub(struct taia *res, const struct taia *u, const struct taia *v)
+{
+ unsigned long unano = u->nano;
+ unsigned long uatto = u->atto;
+
+ res->sec.x = u->sec.x - v->sec.x;
+ res->nano = unano - v->nano;
+ res->atto = uatto - v->atto;
+
+ if (res->atto > uatto) {
+ res->atto += 1000000000UL;
+ --res->nano;
+ }
+
+ if (res->nano > unano) {
+ res->nano += 1000000000UL;
+ --res->sec.x;
+ }
+}
+
+static inline void taia_add(struct taia *res, const struct taia *u, const struct taia *v)
+{
+ res->sec.x = u->sec.x + v->sec.x;
+ res->nano = u->nano + v->nano;
+ res->atto = u->atto + v->atto;
+
+ if (res->atto > 999999999UL) {
+ res->atto -= 1000000000UL;
+ ++res->nano;
+ }
+
+ if (res->nano > 999999999UL) {
+ res->nano -= 1000000000UL;
+ ++res->sec.x;
+ }
+}
+
+static inline int taia_less(const struct taia *t, const struct taia *u)
+{
+ if (t->sec.x < u->sec.x)
+ return 1;
+ if (t->sec.x > u->sec.x)
+ return 0;
+ if (t->nano < u->nano)
+ return 1;
+ if (t->nano > u->nano)
+ return 0;
+ return t->atto < u->atto;
+}
+
+static inline int is_good_taia(struct taia *arrival_taia, struct taia *packet_taia)
+{
+ int is_ts_good = 0;
+ struct taia sub_res;
+
+ if (taia_less(arrival_taia, packet_taia)) {
+ taia_sub(&sub_res, packet_taia, arrival_taia);
+ if (taia_less(&sub_res, &tolerance_taia))
+ is_ts_good = 1;
+ else
+ is_ts_good = 0;
+ } else {
+ taia_sub(&sub_res, arrival_taia, packet_taia);
+ if (taia_less(&sub_res, &tolerance_taia))
+ is_ts_good = 1;
+ else
+ is_ts_good = 0;
+ }
+
+ return is_ts_good;
+}
+
+#endif /* CURVE_H */
diff --git a/curvetun.c b/curvetun.c
new file mode 100644
index 0000000..3e7bdb4
--- /dev/null
+++ b/curvetun.c
@@ -0,0 +1,692 @@
+/*
+ * curvetun - the cipherspace wormhole creator
+ * Part of the netsniff-ng project
+ * Copyright 2011 Daniel Borkmann <dborkma@tik.ee.ethz.ch>,
+ * Copyright 2011 Emmanuel Roullit.
+ * Subject to the GPL, version 2.
+ */
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <string.h>
+#include <ctype.h>
+#include <getopt.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <limits.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/socket.h>
+#include <sys/ptrace.h>
+#include <sys/fsuid.h>
+#include <netinet/in.h>
+#include <unistd.h>
+#include <signal.h>
+
+#include "xutils.h"
+#include "die.h"
+#include "xmalloc.h"
+#include "curvetun.h"
+#include "curve.h"
+#include "ct_usermgmt.h"
+#include "ct_servmgmt.h"
+#include "xio.h"
+#include "tprintf.h"
+#include "crypto_verify_32.h"
+#include "crypto_box_curve25519xsalsa20poly1305.h"
+#include "crypto_scalarmult_curve25519.h"
+#include "crypto_auth_hmacsha512256.h"
+
+#define CURVETUN_ENTROPY_SOURCE "/dev/random"
+
+extern void print_stun_probe(char *server, uint16_t sport, uint16_t tunport);
+
+enum working_mode {
+ MODE_UNKNOW,
+ MODE_KEYGEN,
+ MODE_EXPORT,
+ MODE_DUMPC,
+ MODE_DUMPS,
+ MODE_CLIENT,
+ MODE_SERVER,
+};
+
+volatile sig_atomic_t sigint = 0;
+
+static const char *short_options = "kxc::svhp:t:d:uCS46DN";
+static const struct option long_options[] = {
+ {"client", optional_argument, NULL, 'c'},
+ {"dev", required_argument, NULL, 'd'},
+ {"port", required_argument, NULL, 'p'},
+ {"stun", required_argument, NULL, 't'},
+ {"keygen", no_argument, NULL, 'k'},
+ {"export", no_argument, NULL, 'x'},
+ {"dumpc", no_argument, NULL, 'C'},
+ {"dumps", no_argument, NULL, 'S'},
+ {"no-logging", no_argument, NULL, 'N'},
+ {"server", no_argument, NULL, 's'},
+ {"udp", no_argument, NULL, 'u'},
+ {"ipv4", no_argument, NULL, '4'},
+ {"ipv6", no_argument, NULL, '6'},
+ {"nofork", no_argument, NULL, 'D'},
+ {"version", no_argument, NULL, 'v'},
+ {"help", no_argument, NULL, 'h'},
+ {NULL, 0, NULL, 0}
+};
+
+static void signal_handler(int number)
+{
+ switch (number) {
+ case SIGINT:
+ case SIGTERM:
+ sigint = 1;
+ break;
+ default:
+ break;
+ }
+}
+
+static void help(void)
+{
+ printf("\ncurvetun %s, lightweight curve25519-based VPN/IP tunnel\n", VERSION_STRING);
+ puts("http://www.netsniff-ng.org\n\n"
+ "Usage: curvetun [options]\n"
+ "Options, general:\n"
+ " -d|--dev <tun> Networking tunnel device, e.g. tun0\n"
+ " -p|--port <num> Server port number (mandatory)\n"
+ " -t|--stun <server> Show public IP/Port mapping via STUN\n"
+ " -c|--client[=alias] Client mode, server alias optional\n"
+ " -k|--keygen Generate public/private keypair\n"
+ " -x|--export Export your public data for remote servers\n"
+ " -C|--dumpc Dump parsed clients\n"
+ " -S|--dumps Dump parsed servers\n"
+ " -D|--nofork Do not daemonize\n"
+ " -s|--server Server mode, options follow below\n"
+ " -N|--no-logging Disable server logging (for better anonymity)\n"
+ " -u|--udp Use UDP as carrier instead of TCP\n"
+ " -4|--ipv4 Tunnel devices are IPv4\n"
+ " -6|--ipv6 Tunnel devices are IPv6\n"
+ " -v|--version Print version\n"
+ " -h|--help Print this help\n\n"
+ "Example:\n"
+ " See Documentation/Curvetun for a configuration example.\n"
+ " curvetun --server -4 -u -N --port 6666 --stun stunserver.org\n"
+ " curvetun --client=ethz\n\n"
+ " curvetun --keygen\n"
+ " curvetun --export\n"
+ "Note:\n"
+ " There is no default port specified, so that you are forced\n"
+ " to select your own! For client/server status messages see syslog!\n"
+ " This software is an experimental prototype intended for researchers.\n\n"
+ "Secret ingredient: 7647-14-5\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("\ncurvetun %s, lightweight curve25519-based VPN/IP tunnel\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 check_file_or_die(char *home, char *file, int maybeempty)
+{
+ char path[PATH_MAX];
+ struct stat st;
+
+ memset(path, 0, sizeof(path));
+ slprintf(path, sizeof(path), "%s/%s", home, file);
+
+ if (stat(path, &st))
+ panic("No such file %s! Type --help for further information\n",
+ path);
+
+ if (!S_ISREG(st.st_mode))
+ panic("%s is not a regular file!\n", path);
+
+ if ((st.st_mode & ~S_IFREG) != (S_IRUSR | S_IWUSR))
+ panic("You have set too many permissions on %s (%o)!\n",
+ path, st.st_mode);
+
+ if (maybeempty == 0 && st.st_size == 0)
+ panic("%s is empty!\n", path);
+}
+
+static void check_config_exists_or_die(char *home)
+{
+ if (!home)
+ panic("No home dir specified!\n");
+
+ check_file_or_die(home, FILE_CLIENTS, 1);
+ check_file_or_die(home, FILE_SERVERS, 1);
+ check_file_or_die(home, FILE_PRIVKEY, 0);
+ check_file_or_die(home, FILE_PUBKEY, 0);
+ check_file_or_die(home, FILE_USERNAM, 0);
+}
+
+static char *fetch_home_dir(void)
+{
+ char *home = getenv("HOME");
+ if (!home)
+ panic("No HOME defined!\n");
+ return home;
+}
+
+static void write_username(char *home)
+{
+ int fd, ret;
+ char path[PATH_MAX];
+ char user[512];
+
+ memset(path, 0, sizeof(path));
+ slprintf(path, sizeof(path), "%s/%s", home, FILE_USERNAM);
+
+ printf("Username: [%s] ", getenv("USER"));
+ fflush(stdout);
+
+ memset(user, 0, sizeof(user));
+ if (fgets(user, sizeof(user), stdin) == NULL)
+ panic("Could not read from stdin!\n");
+ user[sizeof(user) - 1] = 0;
+ user[strlen(user) - 1] = 0; /* omit last \n */
+ if (strlen(user) == 0)
+ strlcpy(user, getenv("USER"), sizeof(user));
+
+ fd = open_or_die_m(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
+
+ ret = write(fd, user, strlen(user));
+ if (ret != strlen(user))
+ panic("Could not write username!\n");
+
+ close(fd);
+
+ printf("Username written to %s!\n", path);
+}
+
+static void create_curvedir(char *home)
+{
+ int ret;
+ char path[PATH_MAX];
+
+ memset(path, 0, sizeof(path));
+ slprintf(path, sizeof(path), "%s/%s", home, ".curvetun/");
+
+ errno = 0;
+
+ ret = mkdir(path, S_IRWXU);
+ if (ret < 0 && errno != EEXIST)
+ panic("Cannot create curvetun dir!\n");
+
+ printf("curvetun directory %s created!\n", path);
+ /* We also create empty files for clients and servers! */
+
+ memset(path, 0, sizeof(path));
+ slprintf(path, sizeof(path), "%s/%s", home, FILE_CLIENTS);
+
+ create_or_die(path, S_IRUSR | S_IWUSR);
+
+ printf("Empty client file written to %s!\n", path);
+
+ memset(path, 0, sizeof(path));
+ slprintf(path, sizeof(path), "%s/%s", home, FILE_SERVERS);
+
+ create_or_die(path, S_IRUSR | S_IWUSR);
+
+ printf("Empty server file written to %s!\n", path);
+}
+
+static void create_keypair(char *home)
+{
+ int fd, err = 0;
+ ssize_t ret;
+ unsigned char publickey[crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES] = { 0 };
+ unsigned char secretkey[crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES] = { 0 };
+ char path[PATH_MAX];
+ const char * errstr = NULL;
+
+ printf("Reading from %s (this may take a while) ...\n", CURVETUN_ENTROPY_SOURCE);
+
+ fd = open_or_die(CURVETUN_ENTROPY_SOURCE, O_RDONLY);
+
+ ret = read_exact(fd, secretkey, sizeof(secretkey), 0);
+ if (ret != sizeof(secretkey)) {
+ err = EIO;
+ errstr = "Cannot read from "CURVETUN_ENTROPY_SOURCE"!\n";
+ goto out;
+ }
+
+ close(fd);
+
+ crypto_scalarmult_curve25519_base(publickey, secretkey);
+
+ memset(path, 0, sizeof(path));
+ slprintf(path, sizeof(path), "%s/%s", home, FILE_PUBKEY);
+
+ fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
+ if (fd < 0) {
+ err = EIO;
+ errstr = "Cannot open pubkey file!\n";
+ goto out;
+ }
+
+ ret = write(fd, publickey, sizeof(publickey));
+ if (ret != sizeof(publickey)) {
+ err = EIO;
+ errstr = "Cannot write public key!\n";
+ goto out;
+ }
+
+ close(fd);
+
+ printf("Public key written to %s!\n", path);
+
+ memset(path, 0, sizeof(path));
+ slprintf(path, sizeof(path), "%s/%s", home, FILE_PRIVKEY);
+
+ fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
+ if (fd < 0) {
+ err = EIO;
+ errstr = "Cannot open privkey file!\n";
+ goto out;
+ }
+
+ ret = write(fd, secretkey, sizeof(secretkey));
+ if (ret != sizeof(secretkey)) {
+ err = EIO;
+ errstr = "Cannot write private key!\n";
+ goto out;
+ }
+out:
+ close(fd);
+
+ xmemset(publickey, 0, sizeof(publickey));
+ xmemset(secretkey, 0, sizeof(secretkey));
+
+ if (err)
+ panic("%s: %s", errstr, strerror(errno));
+ else
+ printf("Private key written to %s!\n", path);
+}
+
+static void check_config_keypair_or_die(char *home)
+{
+ int fd, err;
+ ssize_t ret;
+ const char * errstr = NULL;
+ unsigned char publickey[crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES];
+ unsigned char publicres[crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES];
+ unsigned char secretkey[crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES];
+ char path[PATH_MAX];
+
+ memset(path, 0, sizeof(path));
+ slprintf(path, sizeof(path), "%s/%s", home, FILE_PRIVKEY);
+
+ fd = open(path, O_RDONLY);
+ if (fd < 0) {
+ err = EIO;
+ errstr = "Cannot open privkey file!\n";
+ goto out;
+ }
+
+ ret = read(fd, secretkey, sizeof(secretkey));
+ if (ret != sizeof(secretkey)) {
+ err = EIO;
+ errstr = "Cannot read private key!\n";
+ goto out;
+ }
+
+ close(fd);
+
+ memset(path, 0, sizeof(path));
+ slprintf(path, sizeof(path), "%s/%s", home, FILE_PUBKEY);
+
+ fd = open(path, O_RDONLY);
+ if (fd < 0) {
+ err = EIO;
+ errstr = "Cannot open pubkey file!\n";
+ goto out;
+ }
+
+ ret = read(fd, publickey, sizeof(publickey));
+ if (ret != sizeof(publickey)) {
+ err = EIO;
+ errstr = "Cannot read public key!\n";
+ goto out;
+ }
+
+ crypto_scalarmult_curve25519_base(publicres, secretkey);
+
+ err = crypto_verify_32(publicres, publickey);
+ if (err) {
+ err = EINVAL;
+ errstr = "WARNING: your keypair is corrupted!!! You need to "
+ "generate new keys!!!\n";
+ goto out;
+ }
+out:
+ close(fd);
+
+ xmemset(publickey, 0, sizeof(publickey));
+ xmemset(publicres, 0, sizeof(publicres));
+ xmemset(secretkey, 0, sizeof(secretkey));
+
+ if (err)
+ panic("%s: %s\n", errstr, strerror(errno));
+}
+
+static int main_keygen(char *home)
+{
+ create_curvedir(home);
+ write_username(home);
+ create_keypair(home);
+ check_config_keypair_or_die(home);
+
+ return 0;
+}
+
+static int main_export(char *home)
+{
+ int fd, i;
+ ssize_t ret;
+ char path[PATH_MAX], tmp[64];
+
+ check_config_exists_or_die(home);
+ check_config_keypair_or_die(home);
+
+ printf("Your exported public information:\n\n");
+
+ memset(path, 0, sizeof(path));
+ slprintf(path, sizeof(path), "%s/%s", home, FILE_USERNAM);
+
+ fd = open_or_die(path, O_RDONLY);
+
+ while ((ret = read(fd, tmp, sizeof(tmp))) > 0) {
+ ret = write(STDOUT_FILENO, tmp, ret);
+ }
+
+ close(fd);
+
+ printf(";");
+
+ memset(path, 0, sizeof(path));
+ slprintf(path, sizeof(path), "%s/%s", home, FILE_PUBKEY);
+
+ fd = open_or_die(path, O_RDONLY);
+
+ ret = read(fd, tmp, sizeof(tmp));
+ if (ret != crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES)
+ panic("Cannot read public key!\n");
+
+ for (i = 0; i < ret; ++i)
+ if (i == ret - 1)
+ printf("%02x\n\n", (unsigned char) tmp[i]);
+ else
+ printf("%02x:", (unsigned char) tmp[i]);
+
+ close(fd);
+ fflush(stdout);
+
+ return 0;
+}
+
+static int main_dumpc(char *home)
+{
+ check_config_exists_or_die(home);
+ check_config_keypair_or_die(home);
+
+ printf("Your clients:\n\n");
+
+ parse_userfile_and_generate_user_store_or_die(home);
+
+ dump_user_store();
+
+ destroy_user_store();
+
+ printf("\n");
+ die();
+ return 0;
+}
+
+static int main_dumps(char *home)
+{
+ check_config_exists_or_die(home);
+ check_config_keypair_or_die(home);
+
+ printf("Your servers:\n\n");
+
+ parse_userfile_and_generate_serv_store_or_die(home);
+
+ dump_serv_store();
+
+ destroy_serv_store();
+
+ printf("\n");
+ die();
+ return 0;
+}
+
+static void daemonize(const char *lockfile)
+{
+ char pidstr[8];
+ mode_t lperm = S_IRWXU | S_IRGRP | S_IXGRP; /* 0750 */
+ int lfp;
+
+ if (getppid() == 1)
+ return;
+
+ if (daemon(0, 1))
+ panic("Cannot daemonize: %s", strerror(errno));
+
+ to_std_log(&stdout);
+ to_std_log(&stderr);
+
+ umask(lperm);
+ if (lockfile) {
+ lfp = open(lockfile, O_RDWR | O_CREAT | O_EXCL,
+ S_IRUSR | S_IWUSR | S_IRGRP);
+ if (lfp < 0)
+ syslog_panic("Cannot create lockfile at %s! "
+ "curvetun server already running?\n",
+ lockfile);
+
+ slprintf(pidstr, sizeof(pidstr), "%u", getpid());
+ if (write(lfp, pidstr, strlen(pidstr)) <= 0)
+ syslog_panic("Could not write pid to pidfile %s",
+ lockfile);
+
+ close(lfp);
+ }
+}
+
+static int main_client(char *home, char *dev, char *alias, int daemon)
+{
+ int ret, udp;
+ char *host, *port;
+
+ check_config_exists_or_die(home);
+ check_config_keypair_or_die(home);
+
+ parse_userfile_and_generate_serv_store_or_die(home);
+
+ get_serv_store_entry_by_alias(alias, alias ? strlen(alias) + 1 : 0,
+ &host, &port, &udp);
+ if (!host || !port || udp < 0)
+ panic("Did not find alias/entry in configuration!\n");
+
+ printf("Using [%s] -> %s:%s via %s as endpoint!\n",
+ alias ? : "default", host, port, udp ? "udp" : "tcp");
+ if (daemon)
+ daemonize(NULL);
+
+ ret = client_main(home, dev, host, port, udp);
+
+ destroy_serv_store();
+
+ return ret;
+}
+
+static int main_server(char *home, char *dev, char *port, int udp,
+ int ipv4, int daemon, int log)
+{
+ int ret;
+
+ check_config_exists_or_die(home);
+ check_config_keypair_or_die(home);
+
+ if (daemon)
+ daemonize(LOCKFILE);
+
+ ret = server_main(home, dev, port, udp, ipv4, log);
+
+ unlink(LOCKFILE);
+
+ return ret;
+}
+
+int main(int argc, char **argv)
+{
+ int ret = 0, c, opt_index, udp = 0, ipv4 = -1, daemon = 1, log = 1;
+ char *port = NULL, *stun = NULL, *dev = NULL, *home = NULL, *alias = NULL;
+ enum working_mode wmode = MODE_UNKNOW;
+
+ setfsuid(getuid());
+ setfsgid(getgid());
+
+ home = fetch_home_dir();
+
+ while ((c = getopt_long(argc, argv, short_options, long_options,
+ &opt_index)) != EOF) {
+ switch (c) {
+ case 'h':
+ help();
+ break;
+ case 'v':
+ version();
+ break;
+ case 'D':
+ daemon = 0;
+ break;
+ case 'N':
+ log = 0;
+ break;
+ case 'C':
+ wmode = MODE_DUMPC;
+ break;
+ case 'S':
+ wmode = MODE_DUMPS;
+ break;
+ case 'c':
+ wmode = MODE_CLIENT;
+ if (optarg) {
+ if (*optarg == '=')
+ optarg++;
+ alias = xstrdup(optarg);
+ }
+ break;
+ case 'd':
+ dev = xstrdup(optarg);
+ break;
+ case 'k':
+ wmode = MODE_KEYGEN;
+ break;
+ case '4':
+ ipv4 = 1;
+ break;
+ case '6':
+ ipv4 = 0;
+ break;
+ case 'x':
+ wmode = MODE_EXPORT;
+ break;
+ case 's':
+ wmode = MODE_SERVER;
+ break;
+ case 'u':
+ udp = 1;
+ break;
+ case 't':
+ stun = xstrdup(optarg);
+ break;
+ case 'p':
+ port = xstrdup(optarg);
+ break;
+ case '?':
+ switch (optopt) {
+ case 't':
+ case 'd':
+ case 'u':
+ case 'p':
+ 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)
+ help();
+
+ register_signal(SIGINT, signal_handler);
+ register_signal(SIGHUP, signal_handler);
+ register_signal(SIGTERM, signal_handler);
+ register_signal(SIGPIPE, signal_handler);
+
+ curve25519_selftest();
+
+ switch (wmode) {
+ case MODE_KEYGEN:
+ ret = main_keygen(home);
+ break;
+ case MODE_EXPORT:
+ ret = main_export(home);
+ break;
+ case MODE_DUMPC:
+ ret = main_dumpc(home);
+ break;
+ case MODE_DUMPS:
+ ret = main_dumps(home);
+ break;
+ case MODE_CLIENT:
+ ret = main_client(home, dev, alias, daemon);
+ break;
+ case MODE_SERVER:
+ if (!port)
+ panic("No port specified!\n");
+ if (stun)
+ print_stun_probe(stun, 3478, strtoul(port, NULL, 10));
+ ret = main_server(home, dev, port, udp, ipv4, daemon, log);
+ break;
+ default:
+ die();
+ }
+
+ if (dev)
+ xfree(dev);
+ if (stun)
+ xfree(stun);
+ if (port)
+ xfree(port);
+ if (alias)
+ xfree(alias);
+
+ return ret;
+}
diff --git a/curvetun.h b/curvetun.h
new file mode 100644
index 0000000..76b2a8f
--- /dev/null
+++ b/curvetun.h
@@ -0,0 +1,42 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2011 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef CURVETUN_H
+#define CURVETUN_H
+
+#include <unistd.h>
+
+#define FILE_CLIENTS ".curvetun/clients"
+#define FILE_SERVERS ".curvetun/servers"
+#define FILE_PRIVKEY ".curvetun/priv.key"
+#define FILE_PUBKEY ".curvetun/pub.key"
+#define FILE_USERNAM ".curvetun/username"
+
+#define LOCKFILE "/var/run/curvetun.pid"
+
+#define DEFAULT_KEY_LEN 64
+
+#define PROTO_FLAG_EXIT (1 << 0)
+#define PROTO_FLAG_INIT (1 << 1)
+
+struct ct_proto {
+ uint16_t payload;
+ uint8_t flags;
+} __attribute__((packed));
+
+/* FIXME: think up sth better */
+#define TUNBUFF_SIZ (3 * getpagesize())
+#define MAX_EPOLL_SIZE 10000
+#define THREADS_PER_CPU 2
+
+extern int server_main(char *home, char *dev, char *port, int udp,
+ int ipv4, int log);
+extern int client_main(char *home, char *dev, char *host, char *port, int udp);
+
+#define DEVNAME_SERVER "curves0"
+#define DEVNAME_CLIENT "curvec0"
+
+#endif /* CURVETUN_H */
diff --git a/curvetun/.gitignore b/curvetun/.gitignore
new file mode 100644
index 0000000..d834aa2
--- /dev/null
+++ b/curvetun/.gitignore
@@ -0,0 +1,7 @@
+*.*
+
+!.gitignore
+!Makefile
+!abiname.c
+!build_nacl.sh
+!nacl_path.sh
diff --git a/curvetun/Makefile b/curvetun/Makefile
new file mode 100644
index 0000000..954a865
--- /dev/null
+++ b/curvetun/Makefile
@@ -0,0 +1,17 @@
+curvetun-libs = -lnacl \
+ -lpthread
+
+curvetun-objs = xmalloc.o \
+ xio.o \
+ xutils.o \
+ stun.o \
+ patricia.o \
+ trie.o \
+ hash.o \
+ curve.o \
+ cpusched.o \
+ ct_usermgmt.o \
+ ct_servmgmt.o \
+ ct_server.o \
+ ct_client.o \
+ curvetun.o
diff --git a/curvetun/abiname.c b/curvetun/abiname.c
new file mode 100644
index 0000000..976db15
--- /dev/null
+++ b/curvetun/abiname.c
@@ -0,0 +1,46 @@
+#include <stdio.h>
+
+const char *abi(void)
+{
+#if defined(__amd64__) || defined(__x86_64__) || defined(__AMD64__) || defined(_M_X64) || defined(__amd64)
+ return "amd64";
+#elif defined(__i386__) || defined(__x86__) || defined(__X86__) || defined(_M_IX86) || defined(__i386)
+ return "x86";
+#elif defined(__ia64__) || defined(__IA64__) || defined(__M_IA64)
+ return "ia64";
+#elif defined(__SPU__)
+ return "cellspu";
+#elif defined(__powerpc64__) || defined(__ppc64__) || defined(__PPC64__) || defined(_ARCH_PPC64)
+ return "ppc64";
+#elif defined(__powerpc__) || defined(__ppc__) || defined(__PPC__) || defined(_ARCH_PPC)
+ return "ppc32";
+#elif defined(__sparcv9__) || defined(__sparcv9)
+ return "sparcv9";
+#elif defined(__sparc_v8__)
+ return "sparcv8";
+#elif defined(__sparc__) || defined(__sparc)
+ if (sizeof(long) == 4)
+ return "sparcv8";
+ return "sparcv9";
+#elif defined(__ARM_EABI__)
+ return "armeabi";
+#elif defined(__arm__)
+ return "arm";
+#elif defined(__mips__) || defined(__mips) || defined(__MIPS__)
+# if defined(_ABIO32)
+ return "mipso32";
+# elif defined(_ABIN32)
+ return "mips32";
+# else
+ return "mips64";
+# endif
+#else
+ return "default";
+#endif
+}
+
+int main(void)
+{
+ printf("%s\n", abi());
+ return 0;
+}
diff --git a/curvetun/build_nacl.sh b/curvetun/build_nacl.sh
new file mode 100755
index 0000000..7a97302
--- /dev/null
+++ b/curvetun/build_nacl.sh
@@ -0,0 +1,46 @@
+#!/bin/bash
+
+# netsniff-ng - the packet sniffing beast
+# By Emmanuel Roullit <emmanuel@netsniff-ng.org>
+# Copyright 2009, 2011 Emmanuel Roullit.
+# Subject to the GPL, version 2.
+
+cc="gcc"
+nacl_dir="/tmp"
+nacl_version="nacl-20110221"
+nacl_suffix="tar.bz2"
+nacl_base_url="http://hyperelliptic.org/nacl"
+nacl_path="$nacl_dir/$nacl_version.$nacl_suffix"
+nacl_build_dir="$1"
+
+if test -z "$nacl_build_dir"; then
+ echo "Please input the path where NaCl should be build"
+ exit 1
+fi
+
+if ! test -d "$nacl_build_dir"; then
+ mkdir "$nacl_build_dir"
+fi
+
+wget -O "$nacl_path" "$nacl_base_url/$nacl_version.$nacl_suffix"
+tar xjf "$nacl_path" -C "$nacl_build_dir"
+
+$cc -Wall -O2 ./abiname.c -o ./abiname
+arch="`./abiname`"
+shorthostname=$(hostname | sed 's/\..*//' | tr -cd '[a-z][A-Z][0-9]')
+
+echo "Building NaCl for arch $arch on host $shorthostname (grab a coffee, this takes a while) ..."
+
+cd "$nacl_build_dir"/"$nacl_version"
+./do
+cd - > /dev/null
+
+nacl_lib_path="$nacl_build_dir/$nacl_version/build/$shorthostname/lib/$arch"
+nacl_include_path="$nacl_build_dir/$nacl_version/build/$shorthostname/include/$arch"
+
+echo "NaCl lib path $nacl_lib_path"
+echo "NaCl include path $nacl_include_path"
+
+./nacl_path.sh "$nacl_include_path" "$nacl_lib_path"
+
+echo "Done!"
diff --git a/curvetun/nacl_path.sh b/curvetun/nacl_path.sh
new file mode 100755
index 0000000..1afc6d2
--- /dev/null
+++ b/curvetun/nacl_path.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+# netsniff-ng - the packet sniffing beast
+# By Emmanuel Roullit <emmanuel@netsniff-ng.org>
+# Copyright 2009, 2011 Emmanuel Roullit.
+# Subject to the GPL, version 2.
+
+nacl_include_path="$1"
+nacl_lib_path="$2"
+
+if test -z $nacl_include_path || test -z $nacl_lib_path; then
+ echo "Please input the path where NaCl is like the following:"
+ echo "./$0.sh <include_path> <lib_path>"
+ exit 1
+fi
+
+echo "export NACL_INC_DIR=$nacl_include_path" >> ~/.bashrc
+echo "export NACL_LIB_DIR=$nacl_lib_path" >> ~/.bashrc
diff --git a/die.h b/die.h
new file mode 100644
index 0000000..95d1338
--- /dev/null
+++ b/die.h
@@ -0,0 +1,69 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef DIE_H
+#define DIE_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <syslog.h>
+
+#include "built_in.h"
+
+static inline void panic(const char *format, ...) __check_format_printf(1, 2);
+static inline void syslog_panic(const char *format,
+ ...) __check_format_printf(1, 2);
+static inline void syslog_maybe(int may, int priority,
+ const char *format, ...) __check_format_printf(3, 4);
+
+static inline void die(void)
+{
+ exit(EXIT_FAILURE);
+}
+
+static inline void _die(void)
+{
+ _exit(EXIT_FAILURE);
+}
+
+static inline void panic(const char *format, ...)
+{
+ va_list vl;
+
+ va_start(vl, format);
+ vfprintf(stderr, format, vl);
+ va_end(vl);
+
+ die();
+}
+
+static inline void syslog_panic(const char *format, ...)
+{
+ va_list vl;
+
+ va_start(vl, format);
+ vsyslog(LOG_ERR, format, vl);
+ va_end(vl);
+
+ die();
+}
+
+static inline void syslog_maybe(int maybe, int priority, const char *format, ...)
+{
+ if (!!maybe) {
+ va_list vl;
+
+ va_start(vl, format);
+ vsyslog(priority, format, vl);
+ va_end(vl);
+ }
+}
+
+#endif /* DIE_H */
diff --git a/dissector.c b/dissector.c
new file mode 100644
index 0000000..167d946
--- /dev/null
+++ b/dissector.c
@@ -0,0 +1,115 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010, 2011, 2012 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "built_in.h"
+#include "tprintf.h"
+#include "pkt_buff.h"
+#include "proto.h"
+#include "protos.h"
+#include "dissector.h"
+#include "dissector_eth.h"
+#include "dissector_80211.h"
+
+int dissector_set_print_type(void *ptr, int type)
+{
+ struct protocol *proto;
+
+ for (proto = ptr; proto; proto = proto->next) {
+ switch (type) {
+ case PRINT_NORM:
+ proto->process = proto->print_full;
+ break;
+ case PRINT_LESS:
+ proto->process = proto->print_less;
+ break;
+ default:
+ proto->process = NULL;
+ break;
+ }
+ }
+
+ return 0;
+}
+
+static void dissector_main(struct pkt_buff *pkt, struct protocol *start,
+ struct protocol *end)
+{
+ struct protocol *proto;
+
+ if (!start)
+ return;
+
+ for (pkt->proto = start; pkt->proto; ) {
+ if (unlikely(!pkt->proto->process))
+ break;
+
+ proto = pkt->proto;
+ pkt->proto = NULL;
+ proto->process(pkt);
+ }
+
+ if (end && likely(end->process))
+ end->process(pkt);
+}
+
+void dissector_entry_point(uint8_t *packet, size_t len, int linktype, int mode)
+{
+ struct protocol *proto_start, *proto_end;
+ struct pkt_buff *pkt = NULL;
+
+ if (mode == PRINT_NONE)
+ return;
+
+ pkt = pkt_alloc(packet, len);
+
+ switch (linktype) {
+ case LINKTYPE_EN10MB:
+ case ___constant_swab32(LINKTYPE_EN10MB):
+ proto_start = dissector_get_ethernet_entry_point();
+ proto_end = dissector_get_ethernet_exit_point();
+ break;
+ case LINKTYPE_IEEE802_11:
+ case ___constant_swab32(LINKTYPE_IEEE802_11):
+ proto_start = dissector_get_ieee80211_entry_point();
+ proto_end = dissector_get_ieee80211_exit_point();
+ break;
+ default:
+ panic("Linktype not supported!\n");
+ };
+
+ dissector_main(pkt, proto_start, proto_end);
+
+ switch (mode) {
+ case PRINT_HEX:
+ hex(pkt);
+ break;
+ case PRINT_ASCII:
+ ascii(pkt);
+ break;
+ case PRINT_HEX_ASCII:
+ hex_ascii(pkt);
+ break;
+ }
+
+ tprintf_flush();
+ pkt_free(pkt);
+}
+
+void dissector_init_all(int fnttype)
+{
+ dissector_init_ethernet(fnttype);
+ dissector_init_ieee80211(fnttype);
+}
+
+void dissector_cleanup_all(void)
+{
+ dissector_cleanup_ethernet();
+ dissector_cleanup_ieee80211();
+}
diff --git a/dissector.h b/dissector.h
new file mode 100644
index 0000000..fc2cd5a
--- /dev/null
+++ b/dissector.h
@@ -0,0 +1,64 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009 - 2013 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef DISSECTOR_H
+#define DISSECTOR_H
+
+#include <stdlib.h>
+#include <stdint.h>
+
+#include "ring.h"
+#include "tprintf.h"
+#include "pcap_io.h"
+
+#define PRINT_NORM 0
+#define PRINT_LESS 1
+#define PRINT_HEX 2
+#define PRINT_ASCII 3
+#define PRINT_HEX_ASCII 4
+#define PRINT_NONE 5
+
+static const char * const packet_types[256]={
+ "<", /* Incoming */
+ "B", /* Broadcast */
+ "M", /* Multicast */
+ "P", /* Promisc */
+ ">", /* Outgoing */
+ "?", /* Unknown */
+};
+
+extern char *if_indextoname(unsigned ifindex, char *ifname);
+
+static inline void show_frame_hdr(struct frame_map *hdr, int mode)
+{
+ char tmp[IFNAMSIZ];
+
+ if (mode == PRINT_NONE)
+ return;
+
+ switch (mode) {
+ case PRINT_LESS:
+ tprintf("%s %s %u",
+ packet_types[hdr->s_ll.sll_pkttype] ? : "?",
+ if_indextoname(hdr->s_ll.sll_ifindex, tmp) ? : "?",
+ hdr->tp_h.tp_len);
+ break;
+ default:
+ tprintf("%s %s %u %us.%uns\n",
+ packet_types[hdr->s_ll.sll_pkttype] ? : "?",
+ if_indextoname(hdr->s_ll.sll_ifindex, tmp) ? : "?",
+ hdr->tp_h.tp_len, hdr->tp_h.tp_sec,
+ hdr->tp_h.tp_nsec);
+ break;
+ }
+}
+
+extern void dissector_init_all(int fnttype);
+extern void dissector_entry_point(uint8_t *packet, size_t len, int linktype, int mode);
+extern void dissector_cleanup_all(void);
+extern int dissector_set_print_type(void *ptr, int type);
+
+#endif /* DISSECTOR_H */
diff --git a/dissector_80211.c b/dissector_80211.c
new file mode 100644
index 0000000..f3d8b62
--- /dev/null
+++ b/dissector_80211.c
@@ -0,0 +1,54 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdint.h>
+
+#include "hash.h"
+#include "protos.h"
+#include "pkt_buff.h"
+#include "dissector.h"
+#include "dissector_80211.h"
+#include "xmalloc.h"
+#include "oui.h"
+
+struct hash_table ieee80211_lay2;
+
+#ifdef __WITH_PROTOS
+static inline void dissector_init_entry(int type)
+{
+ dissector_set_print_type(&ieee80211_ops, type);
+}
+
+static inline void dissector_init_exit(int type)
+{
+ dissector_set_print_type(&none_ops, type);
+}
+
+static void dissector_init_layer_2(int type)
+{
+ init_hash(&ieee80211_lay2);
+// INSERT_HASH_PROTOS(blubber_ops, ieee80211_lay2);
+ for_each_hash_int(&ieee80211_lay2, dissector_set_print_type, type);
+}
+#else
+static inline void dissector_init_entry(int type) {}
+static inline void dissector_init_exit(int type) {}
+static void dissector_init_layer_2(int type) {}
+#endif /* __WITH_PROTOS */
+
+void dissector_init_ieee80211(int fnttype)
+{
+ dissector_init_entry(fnttype);
+ dissector_init_layer_2(fnttype);
+ dissector_init_exit(fnttype);
+ dissector_init_oui();
+}
+
+void dissector_cleanup_ieee80211(void)
+{
+ free_hash(&ieee80211_lay2);
+ dissector_cleanup_oui();
+}
diff --git a/dissector_80211.h b/dissector_80211.h
new file mode 100644
index 0000000..8c22356
--- /dev/null
+++ b/dissector_80211.h
@@ -0,0 +1,43 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef DISSECTOR_80211_H
+#define DISSECTOR_80211_H
+
+#include "hash.h"
+#include "proto.h"
+#include "protos.h"
+#include "tprintf.h"
+#include "xutils.h"
+#include "oui.h"
+
+extern struct hash_table ieee80211_lay2;
+
+extern void dissector_init_ieee80211(int fnttype);
+extern void dissector_cleanup_ieee80211(void);
+
+#ifdef __WITH_PROTOS
+static inline struct protocol *dissector_get_ieee80211_entry_point(void)
+{
+ return &ieee80211_ops;
+}
+
+static inline struct protocol *dissector_get_ieee80211_exit_point(void)
+{
+ return &none_ops;
+}
+#else
+static inline struct protocol *dissector_get_ieee80211_entry_point(void)
+{
+ return NULL;
+}
+
+static inline struct protocol *dissector_get_ieee80211_exit_point(void)
+{
+ return NULL;
+}
+#endif /* __WITH_PROTOS */
+#endif /* DISSECTOR_80211_H */
diff --git a/dissector_eth.c b/dissector_eth.c
new file mode 100644
index 0000000..f352645
--- /dev/null
+++ b/dissector_eth.c
@@ -0,0 +1,219 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdint.h>
+
+#include "hash.h"
+#include "oui.h"
+#include "protos.h"
+#include "pkt_buff.h"
+#include "dissector.h"
+#include "dissector_eth.h"
+#include "xmalloc.h"
+
+struct hash_table eth_lay2;
+struct hash_table eth_lay3;
+
+static struct hash_table eth_ether_types;
+static struct hash_table eth_ports_udp;
+static struct hash_table eth_ports_tcp;
+
+struct port {
+ unsigned int id;
+ char *port;
+ struct port *next;
+};
+
+#define __do_lookup_inline(id, struct_name, hash_ptr, struct_member) \
+ ({ \
+ struct struct_name *entry = lookup_hash(id, hash_ptr); \
+ \
+ while (entry && id != entry->id) \
+ entry = entry->next; \
+ \
+ (entry && id == entry->id ? entry->struct_member : 0); \
+ })
+
+char *lookup_port_udp(unsigned int id)
+{
+ return __do_lookup_inline(id, port, &eth_ports_udp, port);
+}
+
+char *lookup_port_tcp(unsigned int id)
+{
+ return __do_lookup_inline(id, port, &eth_ports_tcp, port);
+}
+
+char *lookup_ether_type(unsigned int id)
+{
+ return __do_lookup_inline(id, port, &eth_ether_types, port);
+}
+
+#ifdef __WITH_PROTOS
+static inline void dissector_init_entry(int type)
+{
+ dissector_set_print_type(&ethernet_ops, type);
+}
+
+static inline void dissector_init_exit(int type)
+{
+ dissector_set_print_type(&none_ops, type);
+}
+
+static void dissector_init_layer_2(int type)
+{
+ init_hash(&eth_lay2);
+ INSERT_HASH_PROTOS(arp_ops, eth_lay2);
+ INSERT_HASH_PROTOS(lldp_ops, eth_lay2);
+ INSERT_HASH_PROTOS(vlan_ops, eth_lay2);
+ INSERT_HASH_PROTOS(ipv4_ops, eth_lay2);
+ INSERT_HASH_PROTOS(ipv6_ops, eth_lay2);
+ INSERT_HASH_PROTOS(QinQ_ops, eth_lay2);
+ INSERT_HASH_PROTOS(mpls_uc_ops, eth_lay2);
+ for_each_hash_int(&eth_lay2, dissector_set_print_type, type);
+}
+
+static void dissector_init_layer_3(int type)
+{
+ init_hash(&eth_lay3);
+ INSERT_HASH_PROTOS(icmpv4_ops, eth_lay3);
+ INSERT_HASH_PROTOS(icmpv6_ops, eth_lay3);
+ INSERT_HASH_PROTOS(igmp_ops, eth_lay3);
+ INSERT_HASH_PROTOS(ip_auth_ops, eth_lay3);
+ INSERT_HASH_PROTOS(ip_esp_ops, eth_lay3);
+ INSERT_HASH_PROTOS(ipv6_dest_opts_ops, eth_lay3);
+ INSERT_HASH_PROTOS(ipv6_fragm_ops, eth_lay3);
+ INSERT_HASH_PROTOS(ipv6_hop_by_hop_ops, eth_lay3);
+ INSERT_HASH_PROTOS(ipv6_in_ipv4_ops, eth_lay3);
+ INSERT_HASH_PROTOS(ipv6_mobility_ops, eth_lay3);
+ INSERT_HASH_PROTOS(ipv6_no_next_header_ops, eth_lay3);
+ INSERT_HASH_PROTOS(ipv6_routing_ops, eth_lay3);
+ INSERT_HASH_PROTOS(tcp_ops, eth_lay3);
+ INSERT_HASH_PROTOS(udp_ops, eth_lay3);
+ for_each_hash_int(&eth_lay3, dissector_set_print_type, type);
+}
+#else
+static inline void dissector_init_entry(int type) {}
+static inline void dissector_init_exit(int type) {}
+static void dissector_init_layer_2(int type) {}
+static void dissector_init_layer_3(int type) {}
+#endif /* __WITH_PROTOS */
+
+enum ports {
+ PORTS_UDP,
+ PORTS_TCP,
+ PORTS_ETHER,
+};
+
+static void dissector_init_ports(enum ports which)
+{
+ FILE *fp;
+ char buff[128], *ptr, *file;
+ struct hash_table *table;
+ struct port *p;
+ void **pos;
+
+ switch (which) {
+ case PORTS_UDP:
+ file = "/etc/netsniff-ng/udp.conf";
+ table = &eth_ports_udp;
+ break;
+ case PORTS_TCP:
+ file = "/etc/netsniff-ng/tcp.conf";
+ table = &eth_ports_tcp;
+ break;
+ case PORTS_ETHER:
+ file = "/etc/netsniff-ng/ether.conf";
+ table = &eth_ether_types;
+ break;
+ default:
+ bug();
+ }
+
+ fp = fopen(file, "r");
+ if (!fp)
+ panic("No %s found!\n", file);
+
+ memset(buff, 0, sizeof(buff));
+
+ while (fgets(buff, sizeof(buff), fp) != NULL) {
+ buff[sizeof(buff) - 1] = 0;
+ ptr = buff;
+
+ p = xmalloc(sizeof(*p));
+ p->id = strtol(ptr, &ptr, 0);
+
+ if ((ptr = strstr(buff, ", ")))
+ ptr += strlen(", ");
+ ptr = strtrim_right(ptr, '\n');
+ ptr = strtrim_right(ptr, ' ');
+
+ p->port = xstrdup(ptr);
+ p->next = NULL;
+
+ pos = insert_hash(p->id, p, table);
+ if (pos) {
+ p->next = *pos;
+ *pos = p;
+ }
+
+ memset(buff, 0, sizeof(buff));
+ }
+
+ fclose(fp);
+}
+
+static int dissector_cleanup_ports(void *ptr)
+{
+ struct port *tmp, *p = ptr;
+
+ if (!ptr)
+ return 0;
+
+ while ((tmp = p->next)) {
+ xfree(p->port);
+ xfree(p);
+ p = tmp;
+ }
+
+ xfree(p->port);
+ xfree(p);
+
+ return 0;
+}
+
+void dissector_init_ethernet(int fnttype)
+{
+ dissector_init_entry(fnttype);
+ dissector_init_layer_2(fnttype);
+ dissector_init_layer_3(fnttype);
+ dissector_init_exit(fnttype);
+
+#ifdef __WITH_PROTOS
+ dissector_init_oui();
+#endif
+ dissector_init_ports(PORTS_UDP);
+ dissector_init_ports(PORTS_TCP);
+ dissector_init_ports(PORTS_ETHER);
+}
+
+void dissector_cleanup_ethernet(void)
+{
+ free_hash(&eth_lay2);
+ free_hash(&eth_lay3);
+
+ for_each_hash(&eth_ether_types, dissector_cleanup_ports);
+ for_each_hash(&eth_ports_udp, dissector_cleanup_ports);
+ for_each_hash(&eth_ports_tcp, dissector_cleanup_ports);
+
+ free_hash(&eth_ether_types);
+ free_hash(&eth_ports_udp);
+ free_hash(&eth_ports_tcp);
+
+#ifdef __WITH_PROTOS
+ dissector_cleanup_oui();
+#endif
+}
diff --git a/dissector_eth.h b/dissector_eth.h
new file mode 100644
index 0000000..4c49f28
--- /dev/null
+++ b/dissector_eth.h
@@ -0,0 +1,48 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef DISSECTOR_ETH_H
+#define DISSECTOR_ETH_H
+
+#include "hash.h"
+#include "proto.h"
+#include "protos.h"
+#include "tprintf.h"
+#include "xutils.h"
+#include "oui.h"
+
+extern struct hash_table eth_lay2;
+extern struct hash_table eth_lay3;
+
+extern void dissector_init_ethernet(int fnttype);
+extern void dissector_cleanup_ethernet(void);
+
+extern char *lookup_port_udp(unsigned int id);
+extern char *lookup_port_tcp(unsigned int id);
+extern char *lookup_ether_type(unsigned int id);
+
+#ifdef __WITH_PROTOS
+static inline struct protocol *dissector_get_ethernet_entry_point(void)
+{
+ return &ethernet_ops;
+}
+
+static inline struct protocol *dissector_get_ethernet_exit_point(void)
+{
+ return &none_ops;
+}
+#else
+static inline struct protocol *dissector_get_ethernet_entry_point(void)
+{
+ return NULL;
+}
+
+static inline struct protocol *dissector_get_ethernet_exit_point(void)
+{
+ return NULL;
+}
+#endif /* __WITH_PROTOS */
+#endif /* DISSECTOR_ETH_H */
diff --git a/flowtop.c b/flowtop.c
new file mode 100644
index 0000000..5418aaf
--- /dev/null
+++ b/flowtop.c
@@ -0,0 +1,1208 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2011 - 2013 Daniel Borkmann.
+ * Copyright 2011 Emmanuel Roullit.
+ * Subject to the GPL, version 2.
+ */
+
+#define _LGPL_SOURCE
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <getopt.h>
+#include <pthread.h>
+#include <signal.h>
+#include <netdb.h>
+#include <ctype.h>
+#include <libnetfilter_conntrack/libnetfilter_conntrack.h>
+#include <libnetfilter_conntrack/libnetfilter_conntrack_tcp.h>
+#include <libnetfilter_conntrack/libnetfilter_conntrack_dccp.h>
+#include <libnetfilter_conntrack/libnetfilter_conntrack_sctp.h>
+#include <netinet/in.h>
+#include <curses.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include <sys/fsuid.h>
+#include <urcu.h>
+#include <libgen.h>
+
+#include "die.h"
+#include "xmalloc.h"
+#include "xio.h"
+#include "geoip.h"
+#include "xutils.h"
+#include "built_in.h"
+#include "locking.h"
+#include "dissector_eth.h"
+#include "pkt_buff.h"
+
+struct flow_entry {
+ uint32_t flow_id, use, status;
+ uint8_t l3_proto, l4_proto;
+ uint32_t ip4_src_addr, ip4_dst_addr;
+ uint32_t ip6_src_addr[4], ip6_dst_addr[4];
+ uint16_t port_src, port_dst;
+ uint8_t tcp_state, tcp_flags, sctp_state, dccp_state;
+ uint64_t counter_pkts, counter_bytes;
+ uint64_t timestamp_start, timestamp_stop;
+ char country_src[128], country_dst[128];
+ char city_src[128], city_dst[128];
+ char rev_dns_src[256], rev_dns_dst[256];
+ char cmdline[256];
+ struct flow_entry *next;
+ int procnum, inode;
+};
+
+struct flow_list {
+ struct flow_entry *head;
+ struct spinlock lock;
+};
+
+#ifndef ATTR_TIMESTAMP_START
+# define ATTR_TIMESTAMP_START 63
+#endif
+#ifndef ATTR_TIMESTAMP_STOP
+# define ATTR_TIMESTAMP_STOP 64
+#endif
+
+#define SCROLL_MAX 1000
+
+#define INCLUDE_IPV4 (1 << 0)
+#define INCLUDE_IPV6 (1 << 1)
+#define INCLUDE_UDP (1 << 2)
+#define INCLUDE_TCP (1 << 3)
+#define INCLUDE_DCCP (1 << 4)
+#define INCLUDE_ICMP (1 << 5)
+#define INCLUDE_SCTP (1 << 6)
+
+volatile sig_atomic_t sigint = 0;
+
+static int what = INCLUDE_IPV4 | INCLUDE_IPV6 | INCLUDE_TCP, show_src = 0;
+
+static struct flow_list flow_list;
+
+static const char *short_options = "vhTUsDIS46u";
+static const struct option long_options[] = {
+ {"ipv4", no_argument, NULL, '4'},
+ {"ipv6", no_argument, NULL, '6'},
+ {"tcp", no_argument, NULL, 'T'},
+ {"udp", no_argument, NULL, 'U'},
+ {"dccp", no_argument, NULL, 'D'},
+ {"icmp", no_argument, NULL, 'I'},
+ {"sctp", no_argument, NULL, 'S'},
+ {"show-src", no_argument, NULL, 's'},
+ {"update", no_argument, NULL, 'u'},
+ {"version", no_argument, NULL, 'v'},
+ {"help", no_argument, NULL, 'h'},
+ {NULL, 0, NULL, 0}
+};
+
+static const char *const l3proto2str[AF_MAX] = {
+ [AF_INET] = "ipv4",
+ [AF_INET6] = "ipv6",
+};
+
+static const char *const l4proto2str[IPPROTO_MAX] = {
+ [IPPROTO_TCP] = "tcp",
+ [IPPROTO_UDP] = "udp",
+ [IPPROTO_UDPLITE] = "udplite",
+ [IPPROTO_ICMP] = "icmp",
+ [IPPROTO_ICMPV6] = "icmpv6",
+ [IPPROTO_SCTP] = "sctp",
+ [IPPROTO_GRE] = "gre",
+ [IPPROTO_DCCP] = "dccp",
+ [IPPROTO_IGMP] = "igmp",
+ [IPPROTO_IPIP] = "ipip",
+ [IPPROTO_EGP] = "egp",
+ [IPPROTO_PUP] = "pup",
+ [IPPROTO_IDP] = "idp",
+ [IPPROTO_RSVP] = "rsvp",
+ [IPPROTO_IPV6] = "ip6tun",
+ [IPPROTO_ESP] = "esp",
+ [IPPROTO_AH] = "ah",
+ [IPPROTO_PIM] = "pim",
+ [IPPROTO_COMP] = "comp",
+};
+
+static const char *const tcp_state2str[TCP_CONNTRACK_MAX] = {
+ [TCP_CONNTRACK_NONE] = "NOSTATE",
+ [TCP_CONNTRACK_SYN_SENT] = "SYN_SENT",
+ [TCP_CONNTRACK_SYN_RECV] = "SYN_RECV",
+ [TCP_CONNTRACK_ESTABLISHED] = "ESTABLISHED",
+ [TCP_CONNTRACK_FIN_WAIT] = "FIN_WAIT",
+ [TCP_CONNTRACK_CLOSE_WAIT] = "CLOSE_WAIT",
+ [TCP_CONNTRACK_LAST_ACK] = "LAST_ACK",
+ [TCP_CONNTRACK_TIME_WAIT] = "TIME_WAIT",
+ [TCP_CONNTRACK_CLOSE] = "CLOSE",
+ [TCP_CONNTRACK_SYN_SENT2] = "SYN_SENT2",
+};
+
+static const uint8_t tcp_states[] = {
+ TCP_CONNTRACK_SYN_SENT,
+ TCP_CONNTRACK_SYN_RECV,
+ TCP_CONNTRACK_ESTABLISHED,
+ TCP_CONNTRACK_FIN_WAIT,
+ TCP_CONNTRACK_CLOSE_WAIT,
+ TCP_CONNTRACK_LAST_ACK,
+ TCP_CONNTRACK_TIME_WAIT,
+ TCP_CONNTRACK_CLOSE,
+ TCP_CONNTRACK_SYN_SENT2,
+ TCP_CONNTRACK_NONE,
+};
+
+static const char *const dccp_state2str[DCCP_CONNTRACK_MAX] = {
+ [DCCP_CONNTRACK_NONE] = "NOSTATE",
+ [DCCP_CONNTRACK_REQUEST] = "REQUEST",
+ [DCCP_CONNTRACK_RESPOND] = "RESPOND",
+ [DCCP_CONNTRACK_PARTOPEN] = "PARTOPEN",
+ [DCCP_CONNTRACK_OPEN] = "OPEN",
+ [DCCP_CONNTRACK_CLOSEREQ] = "CLOSEREQ",
+ [DCCP_CONNTRACK_CLOSING] = "CLOSING",
+ [DCCP_CONNTRACK_TIMEWAIT] = "TIMEWAIT",
+ [DCCP_CONNTRACK_IGNORE] = "IGNORE",
+ [DCCP_CONNTRACK_INVALID] = "INVALID",
+};
+
+static const uint8_t dccp_states[] = {
+ DCCP_CONNTRACK_NONE,
+ DCCP_CONNTRACK_REQUEST,
+ DCCP_CONNTRACK_RESPOND,
+ DCCP_CONNTRACK_PARTOPEN,
+ DCCP_CONNTRACK_OPEN,
+ DCCP_CONNTRACK_CLOSEREQ,
+ DCCP_CONNTRACK_CLOSING,
+ DCCP_CONNTRACK_TIMEWAIT,
+ DCCP_CONNTRACK_IGNORE,
+ DCCP_CONNTRACK_INVALID,
+};
+
+static const char *const sctp_state2str[SCTP_CONNTRACK_MAX] = {
+ [SCTP_CONNTRACK_NONE] = "NOSTATE",
+ [SCTP_CONNTRACK_CLOSED] = "CLOSED",
+ [SCTP_CONNTRACK_COOKIE_WAIT] = "COOKIE_WAIT",
+ [SCTP_CONNTRACK_COOKIE_ECHOED] = "COOKIE_ECHOED",
+ [SCTP_CONNTRACK_ESTABLISHED] = "ESTABLISHED",
+ [SCTP_CONNTRACK_SHUTDOWN_SENT] = "SHUTDOWN_SENT",
+ [SCTP_CONNTRACK_SHUTDOWN_RECD] = "SHUTDOWN_RECD",
+ [SCTP_CONNTRACK_SHUTDOWN_ACK_SENT] = "SHUTDOWN_ACK_SENT",
+};
+
+static const uint8_t sctp_states[] = {
+ SCTP_CONNTRACK_NONE,
+ SCTP_CONNTRACK_CLOSED,
+ SCTP_CONNTRACK_COOKIE_WAIT,
+ SCTP_CONNTRACK_COOKIE_ECHOED,
+ SCTP_CONNTRACK_ESTABLISHED,
+ SCTP_CONNTRACK_SHUTDOWN_SENT,
+ SCTP_CONNTRACK_SHUTDOWN_RECD,
+ SCTP_CONNTRACK_SHUTDOWN_ACK_SENT,
+};
+
+static const struct nfct_filter_ipv4 filter_ipv4 = {
+ .addr = __constant_htonl(INADDR_LOOPBACK),
+ .mask = 0xffffffff,
+};
+
+static const struct nfct_filter_ipv6 filter_ipv6 = {
+ .addr = { 0x0, 0x0, 0x0, 0x1 },
+ .mask = { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff },
+};
+
+static void signal_handler(int number)
+{
+ switch (number) {
+ case SIGINT:
+ sigint = 1;
+ break;
+ case SIGHUP:
+ default:
+ break;
+ }
+}
+
+static void flow_entry_from_ct(struct flow_entry *n, struct nf_conntrack *ct);
+static void flow_entry_get_extended(struct flow_entry *n);
+
+static void help(void)
+{
+ printf("\nflowtop %s, top-like netfilter TCP/UDP flow tracking\n",
+ VERSION_STRING);
+ puts("http://www.netsniff-ng.org\n\n"
+ "Usage: flowtop [options]\n"
+ "Options:\n"
+ " -4|--ipv4 Show only IPv4 flows (default)\n"
+ " -6|--ipv6 Show only IPv6 flows (default)\n"
+ " -T|--tcp Show only TCP flows (default)\n"
+ " -U|--udp Show only UDP flows\n"
+ " -D|--dccp Show only DCCP flows\n"
+ " -I|--icmp Show only ICMP/ICMPv6 flows\n"
+ " -S|--sctp Show only SCTP flows\n"
+ " -s|--show-src Also show source, not only dest\n"
+ " -u|--update Update GeoIP databases\n"
+ " -v|--version Print version\n"
+ " -h|--help Print this help\n\n"
+ "Examples:\n"
+ " flowtop\n"
+ " flowtop -46UTDISs\n\n"
+ "Note:\n"
+ " If netfilter is not running, you can activate it with e.g.:\n"
+ " iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT\n"
+ " iptables -A OUTPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT\n\n"
+ "Please report bugs to <bugs@netsniff-ng.org>\n"
+ "Copyright (C) 2011-2013 Daniel Borkmann <dborkma@tik.ee.ethz.ch>\n"
+ "Copyright (C) 2011-2012 Emmanuel Roullit <emmanuel.roullit@gmail.com>\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("\nflowtop %s, top-like netfilter TCP/UDP flow tracking\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"
+ "Copyright (C) 2011-2012 Emmanuel Roullit <emmanuel.roullit@gmail.com>\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 inline struct flow_entry *flow_entry_xalloc(void)
+{
+ return xzmalloc(sizeof(struct flow_entry));
+}
+
+static inline void flow_entry_xfree(struct flow_entry *n)
+{
+ xfree(n);
+}
+
+static inline void flow_list_init(struct flow_list *fl)
+{
+ fl->head = NULL;
+ spinlock_init(&fl->lock);
+}
+
+static void flow_list_new_entry(struct flow_list *fl, struct nf_conntrack *ct)
+{
+ struct flow_entry *n = flow_entry_xalloc();
+
+ flow_entry_from_ct(n, ct);
+ flow_entry_get_extended(n);
+
+ rcu_assign_pointer(n->next, fl->head);
+ rcu_assign_pointer(fl->head, n);
+}
+
+static struct flow_entry *flow_list_find_id(struct flow_list *fl,
+ uint32_t id)
+{
+ struct flow_entry *n = rcu_dereference(fl->head);
+
+ while (n != NULL) {
+ if (n->flow_id == id)
+ return n;
+
+ n = rcu_dereference(n->next);
+ }
+
+ return NULL;
+}
+
+static struct flow_entry *flow_list_find_prev_id(struct flow_list *fl,
+ uint32_t id)
+{
+ struct flow_entry *n = rcu_dereference(fl->head), *tmp;
+
+ if (n->flow_id == id)
+ return NULL;
+
+ while ((tmp = rcu_dereference(n->next)) != NULL) {
+ if (tmp->flow_id == id)
+ return n;
+
+ n = tmp;
+ }
+
+ return NULL;
+}
+
+static void flow_list_update_entry(struct flow_list *fl,
+ struct nf_conntrack *ct)
+{
+ int do_ext = 0;
+ struct flow_entry *n;
+
+ n = flow_list_find_id(fl, nfct_get_attr_u32(ct, ATTR_ID));
+ if (n == NULL) {
+ n = flow_entry_xalloc();
+ do_ext = 1;
+ }
+
+ flow_entry_from_ct(n, ct);
+ if (do_ext) {
+ flow_entry_get_extended(n);
+
+ rcu_assign_pointer(n->next, fl->head);
+ rcu_assign_pointer(fl->head, n);
+ }
+}
+
+static void flow_list_destroy_entry(struct flow_list *fl,
+ struct nf_conntrack *ct)
+{
+ struct flow_entry *n1, *n2;
+ uint32_t id = nfct_get_attr_u32(ct, ATTR_ID);
+
+ n1 = flow_list_find_id(fl, id);
+ if (n1) {
+ n2 = flow_list_find_prev_id(fl, id);
+ if (n2) {
+ rcu_assign_pointer(n2->next, n1->next);
+ rcu_assign_pointer(n1->next, NULL);
+
+ flow_entry_xfree(n1);
+ } else {
+ flow_entry_xfree(fl->head);
+
+ rcu_assign_pointer(fl->head, NULL);
+ }
+ }
+}
+
+static void flow_list_destroy(struct flow_list *fl)
+{
+ struct flow_entry *n;
+
+ while (fl->head != NULL) {
+ n = rcu_dereference(fl->head->next);
+ rcu_assign_pointer(fl->head->next, NULL);
+
+ flow_entry_xfree(fl->head);
+ rcu_assign_pointer(fl->head, n);
+ }
+
+ synchronize_rcu();
+ spinlock_destroy(&fl->lock);
+}
+
+static int walk_process(char *process, struct flow_entry *n)
+{
+ int ret;
+ DIR *dir;
+ struct dirent *ent;
+ char path[1024];
+
+ if (snprintf(path, sizeof(path), "/proc/%s/fd", process) == -1)
+ panic("giant process name! %s\n", process);
+
+ dir = opendir(path);
+ if (!dir)
+ return 0;
+
+ while ((ent = readdir(dir))) {
+ struct stat statbuf;
+
+ if (snprintf(path, sizeof(path), "/proc/%s/fd/%s",
+ process, ent->d_name) < 0)
+ continue;
+
+ if (stat(path, &statbuf) < 0)
+ continue;
+
+ if (S_ISSOCK(statbuf.st_mode) && n->inode == statbuf.st_ino) {
+ memset(n->cmdline, 0, sizeof(n->cmdline));
+
+ snprintf(path, sizeof(path), "/proc/%s/exe", process);
+
+ ret = readlink(path, n->cmdline,
+ sizeof(n->cmdline) - 1);
+ if (ret < 0)
+ panic("readlink error: %s\n", strerror(errno));
+
+ n->procnum = atoi(process);
+ return 1;
+ }
+ }
+
+ closedir(dir);
+ return 0;
+}
+
+static void walk_processes(struct flow_entry *n)
+{
+ int ret;
+ DIR *dir;
+ struct dirent *ent;
+
+ /* n->inode must be set */
+ if (n->inode <= 0) {
+ memset(n->cmdline, 0, sizeof(n->cmdline));
+ return;
+ }
+
+ dir = opendir("/proc");
+ if (!dir)
+ panic("Cannot open /proc!\n");
+
+ while ((ent = readdir(dir))) {
+ if (strspn(ent->d_name, "0123456789") == strlen(ent->d_name)) {
+ ret = walk_process(ent->d_name, n);
+ if (ret > 0)
+ break;
+ }
+ }
+
+ closedir(dir);
+}
+
+static int get_port_inode(uint16_t port, int proto, int is_ip6)
+{
+ int ret = -ENOENT;
+ char path[128], buff[1024];
+ FILE *proc;
+
+ memset(path, 0, sizeof(path));
+ snprintf(path, sizeof(path), "/proc/net/%s%s",
+ l4proto2str[proto], is_ip6 ? "6" : "");
+
+ proc = fopen(path, "r");
+ if (!proc)
+ return -EIO;
+
+ memset(buff, 0, sizeof(buff));
+
+ while (fgets(buff, sizeof(buff), proc) != NULL) {
+ int inode = 0;
+ unsigned int lport = 0;
+
+ buff[sizeof(buff) - 1] = 0;
+ if (sscanf(buff, "%*u: %*X:%X %*X:%*X %*X %*X:%*X %*X:%*X "
+ "%*X %*u %*u %u", &lport, &inode) == 2) {
+ if ((uint16_t) lport == port) {
+ ret = inode;
+ break;
+ }
+ }
+
+ memset(buff, 0, sizeof(buff));
+ }
+
+ fclose(proc);
+ return ret;
+}
+
+#define CP_NFCT(elem, attr, x) \
+ do { n->elem = nfct_get_attr_u##x(ct,(attr)); } while (0)
+#define CP_NFCT_BUFF(elem, attr) do { \
+ const uint8_t *buff = nfct_get_attr(ct,(attr)); \
+ if (buff != NULL) \
+ memcpy(n->elem, buff, sizeof(n->elem)); \
+} while (0)
+
+static void flow_entry_from_ct(struct flow_entry *n, struct nf_conntrack *ct)
+{
+ CP_NFCT(l3_proto, ATTR_ORIG_L3PROTO, 8);
+ CP_NFCT(l4_proto, ATTR_ORIG_L4PROTO, 8);
+
+ CP_NFCT(ip4_src_addr, ATTR_ORIG_IPV4_SRC, 32);
+ CP_NFCT(ip4_dst_addr, ATTR_ORIG_IPV4_DST, 32);
+
+ CP_NFCT(port_src, ATTR_ORIG_PORT_SRC, 16);
+ CP_NFCT(port_dst, ATTR_ORIG_PORT_DST, 16);
+
+ CP_NFCT(status, ATTR_STATUS, 32);
+
+ CP_NFCT(tcp_state, ATTR_TCP_STATE, 8);
+ CP_NFCT(tcp_flags, ATTR_TCP_FLAGS_ORIG, 8);
+ CP_NFCT(sctp_state, ATTR_SCTP_STATE, 8);
+ CP_NFCT(dccp_state, ATTR_DCCP_STATE, 8);
+
+ CP_NFCT(counter_pkts, ATTR_ORIG_COUNTER_PACKETS, 64);
+ CP_NFCT(counter_bytes, ATTR_ORIG_COUNTER_BYTES, 64);
+
+ CP_NFCT(timestamp_start, ATTR_TIMESTAMP_START, 64);
+ CP_NFCT(timestamp_stop, ATTR_TIMESTAMP_STOP, 64);
+
+ CP_NFCT(flow_id, ATTR_ID, 32);
+ CP_NFCT(use, ATTR_USE, 32);
+
+ CP_NFCT_BUFF(ip6_src_addr, ATTR_ORIG_IPV6_SRC);
+ CP_NFCT_BUFF(ip6_dst_addr, ATTR_ORIG_IPV6_DST);
+
+ n->port_src = ntohs(n->port_src);
+ n->port_dst = ntohs(n->port_dst);
+
+ n->ip4_src_addr = ntohl(n->ip4_src_addr);
+ n->ip4_dst_addr = ntohl(n->ip4_dst_addr);
+}
+
+enum flow_entry_direction {
+ flow_entry_src,
+ flow_entry_dst,
+};
+
+static inline int flow_entry_get_extended_is_dns(struct flow_entry *n)
+{
+ /* We don't want to analyze / display DNS itself, since we
+ * use it to resolve reverse dns.
+ */
+ return n->port_src == 53 || n->port_dst == 53;
+}
+
+#define SELFLD(dir,src_member,dst_member) \
+ (((dir) == flow_entry_src) ? n->src_member : n->dst_member)
+
+static struct sockaddr_in *
+flow_entry_get_sain4_obj(struct flow_entry *n, enum flow_entry_direction dir,
+ struct sockaddr_in *sa)
+{
+ memset(sa, 0, sizeof(*sa));
+ sa->sin_family = PF_INET;
+ sa->sin_addr.s_addr = htonl(SELFLD(dir, ip4_src_addr, ip4_dst_addr));
+
+ return sa;
+}
+
+static struct sockaddr_in6 *
+flow_entry_get_sain6_obj(struct flow_entry *n, enum flow_entry_direction dir,
+ struct sockaddr_in6 *sa)
+{
+ memset(sa, 0, sizeof(*sa));
+ sa->sin6_family = PF_INET6;
+
+ memcpy(&sa->sin6_addr, SELFLD(dir, ip6_src_addr, ip6_dst_addr),
+ sizeof(SELFLD(dir, ip6_src_addr, ip6_dst_addr)));
+
+ return sa;
+}
+
+static void
+flow_entry_geo_city_lookup_generic(struct flow_entry *n,
+ enum flow_entry_direction dir)
+{
+ struct sockaddr_in sa4;
+ struct sockaddr_in6 sa6;
+ const char *city = NULL;
+
+ switch (n->l3_proto) {
+ default:
+ bug();
+
+ case AF_INET:
+ flow_entry_get_sain4_obj(n, dir, &sa4);
+ city = geoip4_city_name(sa4);
+ break;
+
+ case AF_INET6:
+ flow_entry_get_sain6_obj(n, dir, &sa6);
+ city = geoip6_city_name(sa6);
+ break;
+ }
+
+ bug_on(sizeof(n->city_src) != sizeof(n->city_dst));
+
+ if (city) {
+ memcpy(SELFLD(dir, city_src, city_dst), city,
+ min(sizeof(n->city_src), strlen(city)));
+ } else {
+ memset(SELFLD(dir, city_src, city_dst), 0,
+ sizeof(n->city_src));
+ }
+}
+
+static void
+flow_entry_geo_country_lookup_generic(struct flow_entry *n,
+ enum flow_entry_direction dir)
+{
+ struct sockaddr_in sa4;
+ struct sockaddr_in6 sa6;
+ const char *country = NULL;
+
+ switch (n->l3_proto) {
+ default:
+ bug();
+
+ case AF_INET:
+ flow_entry_get_sain4_obj(n, dir, &sa4);
+ country = geoip4_country_name(sa4);
+ break;
+
+ case AF_INET6:
+ flow_entry_get_sain6_obj(n, dir, &sa6);
+ country = geoip6_country_name(sa6);
+ break;
+ }
+
+ bug_on(sizeof(n->country_src) != sizeof(n->country_dst));
+
+ if (country) {
+ memcpy(SELFLD(dir, country_src, country_dst), country,
+ min(sizeof(n->country_src), strlen(country)));
+ } else {
+ memset(SELFLD(dir, country_src, country_dst), 0,
+ sizeof(n->country_src));
+ }
+}
+
+static void flow_entry_get_extended_geo(struct flow_entry *n,
+ enum flow_entry_direction dir)
+{
+ flow_entry_geo_city_lookup_generic(n, dir);
+ flow_entry_geo_country_lookup_generic(n, dir);
+}
+
+static void flow_entry_get_extended_revdns(struct flow_entry *n,
+ enum flow_entry_direction dir)
+{
+ size_t sa_len;
+ struct sockaddr_in sa4;
+ struct sockaddr_in6 sa6;
+ struct sockaddr *sa;
+ struct hostent *hent;
+
+ switch (n->l3_proto) {
+ default:
+ bug();
+
+ case AF_INET:
+ flow_entry_get_sain4_obj(n, dir, &sa4);
+ sa = (struct sockaddr *) &sa4;
+ sa_len = sizeof(sa4);
+ hent = gethostbyaddr(&sa4.sin_addr, sizeof(sa4.sin_addr), AF_INET);
+ break;
+
+ case AF_INET6:
+ flow_entry_get_sain6_obj(n, dir, &sa6);
+ sa = (struct sockaddr *) &sa6;
+ sa_len = sizeof(sa6);
+ hent = gethostbyaddr(&sa6.sin6_addr, sizeof(sa6.sin6_addr), AF_INET6);
+ break;
+ }
+
+ bug_on(sizeof(n->rev_dns_src) != sizeof(n->rev_dns_dst));
+ getnameinfo(sa, sa_len, SELFLD(dir, rev_dns_src, rev_dns_dst),
+ sizeof(n->rev_dns_src), NULL, 0, NI_NUMERICHOST);
+
+ if (hent) {
+ memset(n->rev_dns_dst, 0, sizeof(n->rev_dns_dst));
+ memcpy(SELFLD(dir, rev_dns_src, rev_dns_dst),
+ hent->h_name, min(sizeof(n->rev_dns_src),
+ strlen(hent->h_name)));
+ }
+}
+
+static void flow_entry_get_extended(struct flow_entry *n)
+{
+ if (n->flow_id == 0 || flow_entry_get_extended_is_dns(n))
+ return;
+
+ flow_entry_get_extended_revdns(n, flow_entry_src);
+ flow_entry_get_extended_geo(n, flow_entry_src);
+
+ flow_entry_get_extended_revdns(n, flow_entry_dst);
+ flow_entry_get_extended_geo(n, flow_entry_dst);
+
+ /* Lookup application */
+ n->inode = get_port_inode(n->port_src, n->l4_proto,
+ n->l3_proto == AF_INET6);
+ if (n->inode > 0)
+ walk_processes(n);
+}
+
+static uint16_t presenter_get_port(uint16_t src, uint16_t dst, int tcp)
+{
+ if (src < dst && src < 1024) {
+ return src;
+ } else if (dst < src && dst < 1024) {
+ return dst;
+ } else {
+ const char *tmp1, *tmp2;
+ if (tcp) {
+ tmp1 = lookup_port_tcp(src);
+ tmp2 = lookup_port_tcp(dst);
+ } else {
+ tmp1 = lookup_port_udp(src);
+ tmp2 = lookup_port_udp(dst);
+ }
+ if (tmp1 && !tmp2) {
+ return src;
+ } else if (!tmp1 && tmp2) {
+ return dst;
+ } else {
+ if (src < dst)
+ return src;
+ else
+ return dst;
+ }
+ }
+}
+
+static void presenter_screen_init(WINDOW **screen)
+{
+ (*screen) = initscr();
+ noecho();
+ cbreak();
+ keypad(stdscr, TRUE);
+ nodelay(*screen, TRUE);
+ refresh();
+ wrefresh(*screen);
+}
+
+static void presenter_screen_do_line(WINDOW *screen, struct flow_entry *n,
+ unsigned int *line)
+{
+ char tmp[128], *pname = NULL;
+ uint16_t port;
+
+ mvwprintw(screen, *line, 2, "");
+
+ /* PID, application name */
+ if (n->procnum > 0) {
+ slprintf(tmp, sizeof(tmp), "%s(%u)", basename(n->cmdline),
+ n->procnum);
+
+ printw("[");
+ attron(COLOR_PAIR(3));
+ printw("%s", tmp);
+ attroff(COLOR_PAIR(3));
+ printw("]:");
+ }
+
+ /* L3 protocol, L4 protocol, states */
+ printw("%s:%s", l3proto2str[n->l3_proto], l4proto2str[n->l4_proto]);
+ printw("[");
+ attron(COLOR_PAIR(3));
+ switch (n->l4_proto) {
+ case IPPROTO_TCP:
+ printw("%s", tcp_state2str[n->tcp_state]);
+ break;
+ case IPPROTO_SCTP:
+ printw("%s", sctp_state2str[n->sctp_state]);
+ break;
+ case IPPROTO_DCCP:
+ printw("%s", dccp_state2str[n->dccp_state]);
+ break;
+ case IPPROTO_UDP:
+ case IPPROTO_UDPLITE:
+ case IPPROTO_ICMP:
+ case IPPROTO_ICMPV6:
+ printw("NOSTATE");
+ break;
+ }
+ attroff(COLOR_PAIR(3));
+ printw("]");
+
+ /* Guess application port */
+ switch (n->l4_proto) {
+ case IPPROTO_TCP:
+ port = presenter_get_port(n->port_src, n->port_dst, 1);
+ pname = lookup_port_tcp(port);
+ break;
+ case IPPROTO_UDP:
+ case IPPROTO_UDPLITE:
+ port = presenter_get_port(n->port_src, n->port_dst, 0);
+ pname = lookup_port_udp(port);
+ break;
+ }
+ if (pname) {
+ attron(A_BOLD);
+ printw(":%s", pname);
+ attroff(A_BOLD);
+ }
+ printw(" ->");
+
+ /* Number packets, bytes */
+ if (n->counter_pkts > 0 && n->counter_bytes > 0)
+ printw(" (%llu pkts, %llu bytes) ->",
+ n->counter_pkts, n->counter_bytes);
+
+ /* Show source information: reverse DNS, port, country, city */
+ if (show_src) {
+ attron(COLOR_PAIR(1));
+ mvwprintw(screen, ++(*line), 8, "src: %s", n->rev_dns_src);
+ attroff(COLOR_PAIR(1));
+
+ printw(":%u", n->port_src);
+
+ if (n->country_src[0]) {
+ printw(" (");
+
+ attron(COLOR_PAIR(4));
+ printw("%s", n->country_src);
+ attroff(COLOR_PAIR(4));
+
+ if (n->city_src[0])
+ printw(", %s", n->city_src);
+
+ printw(")");
+ }
+
+ printw(" => ");
+ }
+
+ /* Show dest information: reverse DNS, port, country, city */
+ attron(COLOR_PAIR(2));
+ mvwprintw(screen, ++(*line), 8, "dst: %s", n->rev_dns_dst);
+ attroff(COLOR_PAIR(2));
+
+ printw(":%u", n->port_dst);
+
+ if (n->country_dst[0]) {
+ printw(" (");
+
+ attron(COLOR_PAIR(4));
+ printw("%s", n->country_dst);
+ attroff(COLOR_PAIR(4));
+
+ if (n->city_dst[0])
+ printw(", %s", n->city_dst);
+
+ printw(")");
+ }
+}
+
+static inline int presenter_flow_wrong_state(struct flow_entry *n, int state)
+{
+ int ret = 1;
+
+ switch (n->l4_proto) {
+ case IPPROTO_TCP:
+ if (n->tcp_state == state)
+ ret = 0;
+ break;
+ case IPPROTO_SCTP:
+ if (n->sctp_state == state)
+ ret = 0;
+ break;
+ case IPPROTO_DCCP:
+ if (n->dccp_state == state)
+ ret = 0;
+ break;
+ case IPPROTO_UDP:
+ case IPPROTO_UDPLITE:
+ case IPPROTO_ICMP:
+ case IPPROTO_ICMPV6:
+ ret = 0;
+ break;
+ }
+
+ return ret;
+}
+
+static void presenter_screen_update(WINDOW *screen, struct flow_list *fl,
+ int skip_lines)
+{
+ int i, j, maxy;
+ unsigned int line = 3;
+ struct flow_entry *n;
+ uint8_t protocols[] = {
+ IPPROTO_TCP,
+ IPPROTO_DCCP,
+ IPPROTO_SCTP,
+ IPPROTO_UDP,
+ IPPROTO_UDPLITE,
+ IPPROTO_ICMP,
+ IPPROTO_ICMPV6,
+ };
+ size_t protocol_state_size[] = {
+ [IPPROTO_TCP] = array_size(tcp_states),
+ [IPPROTO_DCCP] = array_size(dccp_states),
+ [IPPROTO_SCTP] = array_size(sctp_states),
+ [IPPROTO_UDP] = 1,
+ [IPPROTO_UDPLITE] = 1,
+ [IPPROTO_ICMP] = 1,
+ [IPPROTO_ICMPV6] = 1,
+ };
+
+ curs_set(0);
+
+ maxy = getmaxy(screen);
+ maxy -= 6;
+
+ start_color();
+ init_pair(1, COLOR_RED, COLOR_BLACK);
+ init_pair(2, COLOR_BLUE, COLOR_BLACK);
+ init_pair(3, COLOR_YELLOW, COLOR_BLACK);
+ init_pair(4, COLOR_GREEN, COLOR_BLACK);
+
+ wclear(screen);
+ clear();
+
+ mvwprintw(screen, 1, 2, "Kernel netfilter flows for %s%s%s%s%s%s"
+ "[+%d]", what & INCLUDE_TCP ? "TCP, " : "" ,
+ what & INCLUDE_UDP ? "UDP, " : "",
+ what & INCLUDE_SCTP ? "SCTP, " : "",
+ what & INCLUDE_DCCP ? "DCCP, " : "",
+ what & INCLUDE_ICMP && what & INCLUDE_IPV4 ? "ICMP, " : "",
+ what & INCLUDE_ICMP && what & INCLUDE_IPV6 ? "ICMP6, " : "",
+ skip_lines);
+
+ rcu_read_lock();
+
+ if (rcu_dereference(fl->head) == NULL)
+ mvwprintw(screen, line, 2, "(No active sessions! "
+ "Is netfilter running?)");
+
+ for (i = 0; i < array_size(protocols); i++) {
+ for (j = 0; j < protocol_state_size[protocols[i]]; j++) {
+ n = rcu_dereference(fl->head);
+ while (n && maxy > 0) {
+ int skip_entry = 0;
+
+ if (n->l4_proto != protocols[i])
+ skip_entry = 1;
+ if (presenter_flow_wrong_state(n, j))
+ skip_entry = 1;
+ if (presenter_get_port(n->port_src,
+ n->port_dst, 0) == 53)
+ skip_entry = 1;
+ if (skip_entry) {
+ n = rcu_dereference(n->next);
+ continue;
+ }
+ if (skip_lines > 0) {
+ n = rcu_dereference(n->next);
+ skip_lines--;
+ continue;
+ }
+
+ presenter_screen_do_line(screen, n, &line);
+
+ line++;
+ maxy -= (2 + 1 * show_src);
+ n = rcu_dereference(n->next);
+ }
+ }
+ }
+
+ rcu_read_unlock();
+
+ wrefresh(screen);
+ refresh();
+}
+
+static inline void presenter_screen_end(void)
+{
+ endwin();
+}
+
+static void presenter(void)
+{
+ int skip_lines = 0;
+ WINDOW *screen = NULL;
+
+ dissector_init_ethernet(0);
+ presenter_screen_init(&screen);
+
+ rcu_register_thread();
+ while (!sigint) {
+ switch (getch()) {
+ case 'q':
+ sigint = 1;
+ break;
+ case KEY_UP:
+ case 'u':
+ case 'k':
+ skip_lines--;
+ if (skip_lines < 0)
+ skip_lines = 0;
+ break;
+ case KEY_DOWN:
+ case 'd':
+ case 'j':
+ skip_lines++;
+ if (skip_lines > SCROLL_MAX)
+ skip_lines = SCROLL_MAX;
+ break;
+ default:
+ fflush(stdin);
+ break;
+ }
+
+ presenter_screen_update(screen, &flow_list, skip_lines);
+ usleep(100000);
+ }
+ rcu_unregister_thread();
+
+ presenter_screen_end();
+ dissector_cleanup_ethernet();
+}
+
+static int collector_cb(enum nf_conntrack_msg_type type,
+ struct nf_conntrack *ct, void *data)
+{
+ if (sigint)
+ return NFCT_CB_STOP;
+
+ synchronize_rcu();
+ spinlock_lock(&flow_list.lock);
+
+ switch (type) {
+ case NFCT_T_NEW:
+ flow_list_new_entry(&flow_list, ct);
+ break;
+ case NFCT_T_UPDATE:
+ flow_list_update_entry(&flow_list, ct);
+ break;
+ case NFCT_T_DESTROY:
+ flow_list_destroy_entry(&flow_list, ct);
+ break;
+ default:
+ break;
+ }
+
+ spinlock_unlock(&flow_list.lock);
+
+ return NFCT_CB_CONTINUE;
+}
+
+static inline void collector_flush(struct nfct_handle *handle, uint8_t family)
+{
+ nfct_query(handle, NFCT_Q_FLUSH, &family);
+}
+
+static void *collector(void *null)
+{
+ int ret;
+ struct nfct_handle *handle;
+ struct nfct_filter *filter;
+
+ handle = nfct_open(CONNTRACK, NF_NETLINK_CONNTRACK_NEW |
+ NF_NETLINK_CONNTRACK_UPDATE |
+ NF_NETLINK_CONNTRACK_DESTROY);
+ if (!handle)
+ panic("Cannot create a nfct handle!\n");
+
+ collector_flush(handle, AF_INET);
+ collector_flush(handle, AF_INET6);
+
+ filter = nfct_filter_create();
+ if (!filter)
+ panic("Cannot create a nfct filter!\n");
+
+ ret = nfct_filter_attach(nfct_fd(handle), filter);
+ if (ret < 0)
+ panic("Cannot attach filter to handle!\n");
+
+ if (what & INCLUDE_UDP) {
+ nfct_filter_add_attr_u32(filter, NFCT_FILTER_L4PROTO, IPPROTO_UDP);
+ nfct_filter_add_attr_u32(filter, NFCT_FILTER_L4PROTO, IPPROTO_UDPLITE);
+ }
+ if (what & INCLUDE_TCP)
+ nfct_filter_add_attr_u32(filter, NFCT_FILTER_L4PROTO, IPPROTO_TCP);
+ if (what & INCLUDE_DCCP)
+ nfct_filter_add_attr_u32(filter, NFCT_FILTER_L4PROTO, IPPROTO_DCCP);
+ if (what & INCLUDE_SCTP)
+ nfct_filter_add_attr_u32(filter, NFCT_FILTER_L4PROTO, IPPROTO_SCTP);
+ if (what & INCLUDE_ICMP && what & INCLUDE_IPV4)
+ nfct_filter_add_attr_u32(filter, NFCT_FILTER_L4PROTO, IPPROTO_ICMP);
+ if (what & INCLUDE_ICMP && what & INCLUDE_IPV6)
+ nfct_filter_add_attr_u32(filter, NFCT_FILTER_L4PROTO, IPPROTO_ICMPV6);
+ if (what & INCLUDE_IPV4) {
+ nfct_filter_set_logic(filter, NFCT_FILTER_SRC_IPV4, NFCT_FILTER_LOGIC_NEGATIVE);
+ nfct_filter_add_attr(filter, NFCT_FILTER_SRC_IPV4, &filter_ipv4);
+ }
+ if (what & INCLUDE_IPV6) {
+ nfct_filter_set_logic(filter, NFCT_FILTER_SRC_IPV6, NFCT_FILTER_LOGIC_NEGATIVE);
+ nfct_filter_add_attr(filter, NFCT_FILTER_SRC_IPV6, &filter_ipv6);
+ }
+
+ ret = nfct_filter_attach(nfct_fd(handle), filter);
+ if (ret < 0)
+ panic("Cannot attach filter to handle!\n");
+
+ nfct_callback_register(handle, NFCT_T_ALL, collector_cb, NULL);
+ nfct_filter_destroy(filter);
+ flow_list_init(&flow_list);
+
+ rcu_register_thread();
+
+ while (!sigint && ret >= 0)
+ ret = nfct_catch(handle);
+
+ rcu_unregister_thread();
+
+ flow_list_destroy(&flow_list);
+ nfct_close(handle);
+
+ pthread_exit(0);
+}
+
+int main(int argc, char **argv)
+{
+ pthread_t tid;
+ int ret, c, opt_index, what_cmd = 0;
+
+ setfsuid(getuid());
+ setfsgid(getgid());
+
+ while ((c = getopt_long(argc, argv, short_options, long_options,
+ &opt_index)) != EOF) {
+ switch (c) {
+ case '4':
+ what_cmd |= INCLUDE_IPV4;
+ break;
+ case '6':
+ what_cmd |= INCLUDE_IPV6;
+ break;
+ case 'T':
+ what_cmd |= INCLUDE_TCP;
+ break;
+ case 'U':
+ what_cmd |= INCLUDE_UDP;
+ break;
+ case 'D':
+ what_cmd |= INCLUDE_DCCP;
+ break;
+ case 'I':
+ what_cmd |= INCLUDE_ICMP;
+ break;
+ case 'S':
+ what_cmd |= INCLUDE_SCTP;
+ break;
+ case 's':
+ show_src = 1;
+ break;
+ case 'u':
+ update_geoip();
+ die();
+ break;
+ case 'h':
+ help();
+ break;
+ case 'v':
+ version();
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (what_cmd > 0)
+ what = what_cmd;
+
+ rcu_init();
+
+ register_signal(SIGINT, signal_handler);
+ register_signal(SIGHUP, signal_handler);
+
+ init_geoip(1);
+
+ ret = pthread_create(&tid, NULL, collector, NULL);
+ if (ret < 0)
+ panic("Cannot create phthread!\n");
+
+ presenter();
+
+ destroy_geoip();
+
+ return 0;
+}
diff --git a/flowtop/.gitignore b/flowtop/.gitignore
new file mode 100644
index 0000000..32aad4d
--- /dev/null
+++ b/flowtop/.gitignore
@@ -0,0 +1,4 @@
+*.*
+
+!.gitignore
+!Makefile
diff --git a/flowtop/Makefile b/flowtop/Makefile
new file mode 100644
index 0000000..f518f07
--- /dev/null
+++ b/flowtop/Makefile
@@ -0,0 +1,19 @@
+flowtop-libs = -lGeoIP \
+ -lurcu \
+ -lnetfilter_conntrack \
+ -lncurses \
+ -lpthread \
+ -lz
+
+flowtop-objs = xmalloc.o \
+ xio.o \
+ xutils.o \
+ oui.o \
+ hash.o \
+ dissector_eth.o \
+ dissector_80211.o \
+ dissector.o \
+ proto_none.o \
+ tprintf.o \
+ geoip.o \
+ flowtop.o
diff --git a/geoip.c b/geoip.c
new file mode 100644
index 0000000..fc61184
--- /dev/null
+++ b/geoip.c
@@ -0,0 +1,595 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2013 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <GeoIP.h>
+#include <GeoIPCity.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "built_in.h"
+#include "die.h"
+#include "xutils.h"
+#include "xio.h"
+#include "xmalloc.h"
+#include "zlib.h"
+#include "geoip.h"
+
+struct file {
+ const char *desc, *local;
+ const char *remote, *possible_prefix;
+};
+
+#define PRE "/download/geoip/database"
+static const struct file files[] = {
+ [GEOIP_CITY_EDITION_REV1] = {
+ .desc = "City IPv4",
+ .local = "/etc/netsniff-ng/city4.dat",
+ .remote = "/GeoLiteCity.dat.gz",
+ .possible_prefix = PRE,
+ },
+ [GEOIP_CITY_EDITION_REV1_V6] = {
+ .desc = "City IPv6",
+ .local = "/etc/netsniff-ng/city6.dat",
+ .remote = "/GeoLiteCityv6.dat.gz",
+ .possible_prefix = PRE "/GeoLiteCityv6-beta",
+ },
+ [GEOIP_COUNTRY_EDITION] = {
+ .desc = "Country IPv4",
+ .local = "/etc/netsniff-ng/country4.dat",
+ .remote = "/GeoIP.dat.gz",
+ .possible_prefix = PRE "/GeoLiteCountry",
+ },
+ [GEOIP_COUNTRY_EDITION_V6] = {
+ .desc = "Country IPv6",
+ .local = "/etc/netsniff-ng/country6.dat",
+ .remote = "/GeoIPv6.dat.gz",
+ .possible_prefix = PRE,
+ },
+ [GEOIP_ASNUM_EDITION] = {
+ .desc = "AS Numbers IPv4",
+ .local = "/etc/netsniff-ng/asname4.dat",
+ .remote = "/GeoIPASNum.dat.gz",
+ .possible_prefix = PRE "/asnum",
+ },
+ [GEOIP_ASNUM_EDITION_V6] = {
+ .desc = "AS Numbers IPv6",
+ .local = "/etc/netsniff-ng/asname6.dat",
+ .remote = "/GeoIPASNumv6.dat.gz",
+ .possible_prefix = PRE "/asnum",
+ },
+};
+
+static GeoIP *gi4_asname = NULL, *gi6_asname = NULL;
+static GeoIP *gi4_country = NULL, *gi6_country = NULL;
+static GeoIP *gi4_city = NULL, *gi6_city = NULL;
+
+static GeoIPRecord empty = { 0 };
+
+static char *servers[16] = { 0 };
+
+#define CITYV4 (1 << 0)
+#define CITYV6 (1 << 1)
+#define COUNTRYV4 (1 << 2)
+#define COUNTRYV6 (1 << 3)
+#define ASNAMV4 (1 << 4)
+#define ASNAMV6 (1 << 5)
+
+#define HAVEALL (CITYV4 | CITYV6 | COUNTRYV4 | COUNTRYV6 | ASNAMV4 | ASNAMV6)
+
+static int geoip_db_present = 0;
+
+int geoip_working(void)
+{
+ return geoip_db_present == HAVEALL;
+}
+
+static int geoip_get_remote_fd(const char *server, const char *port)
+{
+ int ret, fd = -1;
+ struct addrinfo hints, *ahead, *ai;
+
+ bug_on(!server || !port);
+
+ 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(server, port, &hints, &ahead);
+ if (ret != 0)
+ return -EIO;
+
+ for (ai = ahead; ai != NULL && fd < 0; ai = ai->ai_next) {
+ fd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
+ if (fd < 0)
+ continue;
+
+ ret = connect(fd, ai->ai_addr, ai->ai_addrlen);
+ if (ret < 0) {
+ close(fd);
+ fd = -1;
+ continue;
+ }
+
+ break;
+ }
+
+ freeaddrinfo(ahead);
+
+ return fd;
+}
+
+static void geoip_inflate(int which)
+{
+ int ret, ret2 = 1;
+ gzFile fpi;
+ FILE *fpo;
+ char zfile[128], raw[4096];
+
+ slprintf(zfile, sizeof(zfile), "%s.gz", files[which].local);
+ fpi = gzopen(zfile, "rb");
+ if (fpi == NULL)
+ panic("No %s file!\n", zfile);
+
+ fpo = fopen(files[which].local, "wb");
+ if (fpo == NULL)
+ panic("Cannot create %s!\n", files[which].local);
+
+ while ((ret = gzread(fpi, raw, sizeof(raw))) && ret2)
+ ret2 = fwrite(raw, ret, 1, fpo);
+
+ gzclose(fpi);
+ fclose(fpo);
+}
+
+static int geoip_get_database(const char *host, int which)
+{
+ int found, sock, fd, i, good, retry = 0;
+ ssize_t ret, len, rtotlen = 0, totlen = 0;
+ char raw[4096], *ptr, zfile[128];
+ size_t lenl = strlen("Content-Length: ");
+ size_t lent = strlen("HTTP/1.1 200 OK");
+ size_t lenc = strlen("\r\n\r\n");
+
+again:
+ found = good = 0;
+ ptr = NULL;
+ len = 0;
+
+ sock = geoip_get_remote_fd(host, "80");
+ if (sock < 0)
+ return -EIO;
+
+ slprintf(raw, sizeof(raw), "GET %s%s HTTP/1.1\nHost: %s\r\n\r\n",
+ retry ? files[which].possible_prefix : "",
+ files[which].remote, host);
+
+ ret = write(sock, raw, strlen(raw));
+ if (ret <= 0)
+ return -EIO;
+
+ shutdown(sock, SHUT_WR);
+
+ slprintf(zfile, sizeof(zfile), "%s.gz", files[which].local);
+ fd = open_or_die_m(zfile, O_WRONLY | O_CREAT | O_TRUNC, DEFFILEMODE);
+
+ memset(raw, 0, sizeof(raw));
+ ret = read(sock, raw, sizeof(raw));
+ if (ret <= 0)
+ return -EIO;
+
+ for (i = 0; i < ret; i++) {
+ if (!strncmp(raw + i, "Content-Length: ", min(ret - i, lenl))) {
+ ptr = raw + i + lenl;
+ rtotlen = strtoul(ptr, NULL, 10);
+ }
+
+ if (!strncmp(raw + i, "HTTP/1.1 200 OK", min(ret - i, lent)))
+ good = 1;
+
+ if (!strncmp(raw + i, "\r\n\r\n", min(ret - i, lenc))) {
+ ptr = raw + i + lenc;
+ len = ret - i - lenc;
+ found = 1;
+ break;
+ }
+ }
+
+ if (!found || ptr >= raw + ret || len < 0 || rtotlen == 0 || good == 0) {
+ if (retry == 0) {
+ retry = 1;
+ close(fd);
+ close(sock);
+ goto again;
+ }
+
+ return -ENOENT;
+ }
+
+ do {
+ write_or_die(fd, ptr, len);
+ totlen += len;
+ printf("\r%s [%.2f%%, %zd/%zd, %s]", files[which].desc,
+ 100.f * totlen / rtotlen, totlen, rtotlen, host);
+ fflush(stdout);
+
+ memset(raw, 0, sizeof(raw));
+ ret = read(sock, raw, sizeof(raw));
+
+ ptr = raw;
+ len = ret;
+ } while(ret > 0);
+
+ printf("\n");
+
+ if (totlen != rtotlen) {
+ unlink(files[which].local);
+ return -EIO;
+ }
+
+ close(fd);
+ close(sock);
+
+ geoip_inflate(which);
+
+ unlink(zfile);
+
+ return 0;
+}
+
+static GeoIPRecord *geoip4_get_record(struct sockaddr_in sa)
+{
+ bug_on(gi4_city == NULL);
+
+ return GeoIP_record_by_ipnum(gi4_city, ntohl(sa.sin_addr.s_addr)) ? : &empty;
+}
+
+static GeoIPRecord *geoip6_get_record(struct sockaddr_in6 sa)
+{
+ bug_on(gi6_city == NULL);
+
+ return GeoIP_record_by_ipnum_v6(gi6_city, sa.sin6_addr) ? : &empty;
+}
+
+const char *geoip4_as_name(struct sockaddr_in sa)
+{
+ bug_on(gi4_asname == NULL);
+
+ return GeoIP_name_by_ipnum(gi4_asname, ntohl(sa.sin_addr.s_addr));
+}
+
+const char *geoip6_as_name(struct sockaddr_in6 sa)
+{
+ bug_on(gi6_asname == NULL);
+
+ return GeoIP_name_by_ipnum_v6(gi6_asname, sa.sin6_addr);
+}
+
+float geoip4_longitude(struct sockaddr_in sa)
+{
+ return geoip4_get_record(sa)->longitude;
+}
+
+float geoip4_latitude(struct sockaddr_in sa)
+{
+ return geoip4_get_record(sa)->latitude;
+}
+
+float geoip6_longitude(struct sockaddr_in6 sa)
+{
+ return geoip6_get_record(sa)->longitude;
+}
+
+float geoip6_latitude(struct sockaddr_in6 sa)
+{
+ return geoip6_get_record(sa)->latitude;
+}
+
+const char *geoip4_city_name(struct sockaddr_in sa)
+{
+ return geoip4_get_record(sa)->city;
+}
+
+const char *geoip6_city_name(struct sockaddr_in6 sa)
+{
+ return geoip6_get_record(sa)->city;
+}
+
+const char *geoip4_region_name(struct sockaddr_in sa)
+{
+ return geoip4_get_record(sa)->region;
+}
+
+const char *geoip6_region_name(struct sockaddr_in6 sa)
+{
+ return geoip6_get_record(sa)->region;
+}
+
+const char *geoip4_country_name(struct sockaddr_in sa)
+{
+ bug_on(gi4_country == NULL);
+
+ return GeoIP_country_name_by_ipnum(gi4_country, ntohl(sa.sin_addr.s_addr));
+}
+
+const char *geoip6_country_name(struct sockaddr_in6 sa)
+{
+ bug_on(gi6_country == NULL);
+
+ return GeoIP_country_name_by_ipnum_v6(gi6_country, sa.sin6_addr);
+}
+
+static int fdout, fderr;
+
+/* GeoIP people were too stupid to come to the idea that you could set
+ * errno appropriately and return NULL instead of printing stuff from
+ * the library directly that noone can turn off.
+ */
+
+static void geoip_open_prepare(void)
+{
+ fflush(stdout);
+ fdout = dup(1);
+
+ fflush(stderr);
+ fderr = dup(2);
+
+ close(1);
+ close(2);
+}
+
+static void geoip_open_restore(void)
+{
+ dup2(fdout, 1);
+ dup2(fderr, 2);
+
+ close(fdout);
+ close(fderr);
+}
+
+static GeoIP *geoip_open_type(int type, int flags)
+{
+ GeoIP *ret;
+
+ geoip_open_prepare();
+ ret = GeoIP_open_type(type, flags);
+ geoip_open_restore();
+
+ return ret;
+}
+
+static GeoIP *geoip_open(const char *filename, int flags)
+{
+ GeoIP *ret;
+
+ geoip_open_prepare();
+ ret = GeoIP_open(filename, flags);
+ geoip_open_restore();
+
+ return ret;
+}
+
+static void init_geoip_city_open4(int enforce)
+{
+ gi4_city = geoip_open(files[GEOIP_CITY_EDITION_REV1].local, GEOIP_MMAP_CACHE);
+ if (gi4_city == NULL) {
+ gi4_city = geoip_open_type(GEOIP_CITY_EDITION_REV1, GEOIP_MMAP_CACHE);
+ if (gi4_city == NULL)
+ if (enforce)
+ panic("Cannot open GeoIP4 city database, try --update!\n");
+ }
+
+ if (gi4_city) {
+ GeoIP_set_charset(gi4_city, GEOIP_CHARSET_UTF8);
+ geoip_db_present |= CITYV4;
+ }
+}
+
+static void init_geoip_city_open6(int enforce)
+{
+ gi6_city = geoip_open(files[GEOIP_CITY_EDITION_REV1_V6].local, GEOIP_MMAP_CACHE);
+ if (gi6_city == NULL) {
+ gi6_city = geoip_open_type(GEOIP_CITY_EDITION_REV1_V6, GEOIP_MMAP_CACHE);
+ if (gi6_city == NULL)
+ if (enforce)
+ panic("Cannot open GeoIP6 city database, try --update!\n");
+ }
+
+ if (gi6_city) {
+ GeoIP_set_charset(gi6_city, GEOIP_CHARSET_UTF8);
+ geoip_db_present |= CITYV6;
+ }
+}
+
+static void init_geoip_city(int enforce)
+{
+ init_geoip_city_open4(enforce);
+ init_geoip_city_open6(enforce);
+}
+
+static void destroy_geoip_city(void)
+{
+ GeoIP_delete(gi4_city);
+ GeoIP_delete(gi6_city);
+}
+
+static void init_geoip_country_open4(int enforce)
+{
+ gi4_country = geoip_open(files[GEOIP_COUNTRY_EDITION].local, GEOIP_MMAP_CACHE);
+ if (gi4_country == NULL) {
+ gi4_country = geoip_open_type(GEOIP_COUNTRY_EDITION, GEOIP_MMAP_CACHE);
+ if (gi4_country == NULL)
+ if (enforce)
+ panic("Cannot open GeoIP4 country database, try --update!\n");
+ }
+
+ if (gi4_country) {
+ GeoIP_set_charset(gi4_country, GEOIP_CHARSET_UTF8);
+ geoip_db_present |= COUNTRYV4;
+ }
+}
+
+static void init_geoip_country_open6(int enforce)
+{
+ gi6_country = geoip_open(files[GEOIP_COUNTRY_EDITION_V6].local, GEOIP_MMAP_CACHE);
+ if (gi6_country == NULL) {
+ gi6_country = geoip_open_type(GEOIP_COUNTRY_EDITION_V6, GEOIP_MMAP_CACHE);
+ if (gi6_country == NULL)
+ if (enforce)
+ panic("Cannot open GeoIP6 country database, try --update!\n");
+ }
+
+ if (gi6_country) {
+ GeoIP_set_charset(gi6_country, GEOIP_CHARSET_UTF8);
+ geoip_db_present |= COUNTRYV6;
+ }
+}
+
+static void init_geoip_country(int enforce)
+{
+ init_geoip_country_open4(enforce);
+ init_geoip_country_open6(enforce);
+}
+
+static void destroy_geoip_country(void)
+{
+ GeoIP_delete(gi4_country);
+ GeoIP_delete(gi6_country);
+}
+
+static void init_geoip_asname_open4(int enforce)
+{
+ gi4_asname = geoip_open(files[GEOIP_ASNUM_EDITION].local, GEOIP_MMAP_CACHE);
+ if (gi4_asname == NULL) {
+ gi4_asname = geoip_open_type(GEOIP_ASNUM_EDITION, GEOIP_MMAP_CACHE);
+ if (gi4_asname == NULL)
+ if (enforce)
+ panic("Cannot open GeoIP4 AS database, try --update!\n");
+ }
+
+ if (gi4_asname) {
+ GeoIP_set_charset(gi4_asname, GEOIP_CHARSET_UTF8);
+ geoip_db_present |= ASNAMV4;
+ }
+}
+
+static void init_geoip_asname_open6(int enforce)
+{
+ gi6_asname = geoip_open(files[GEOIP_ASNUM_EDITION_V6].local, GEOIP_MMAP_CACHE);
+ if (gi6_asname == NULL) {
+ gi6_asname = geoip_open_type(GEOIP_ASNUM_EDITION_V6, GEOIP_MMAP_CACHE);
+ if (gi6_asname == NULL)
+ if (enforce)
+ panic("Cannot open GeoIP6 AS database, try --update!\n");
+ }
+
+ if (gi6_asname) {
+ GeoIP_set_charset(gi6_asname, GEOIP_CHARSET_UTF8);
+ geoip_db_present |= ASNAMV6;
+ }
+}
+
+static void init_geoip_asname(int enforce)
+{
+ init_geoip_asname_open4(enforce);
+ init_geoip_asname_open6(enforce);
+}
+
+static void destroy_geoip_asname(void)
+{
+ GeoIP_delete(gi4_asname);
+ GeoIP_delete(gi6_asname);
+}
+
+static void init_mirrors(void)
+{
+ int i = 0;
+ FILE *fp;
+ char buff[256];
+
+ fp = fopen("/etc/netsniff-ng/geoip.conf", "r");
+ if (!fp)
+ panic("Cannot open geoip.conf!\n");
+
+ fmemset(buff, 0, sizeof(buff));
+ while (fgets(buff, sizeof(buff), fp) != NULL &&
+ i < array_size(servers)) {
+ buff[sizeof(buff) - 1] = 0;
+ buff[strlen(buff) - 1] = 0;
+
+ if (buff[0] == '#') {
+ fmemset(buff, 0, sizeof(buff));
+ continue;
+ }
+
+ servers[i++] = xstrdup(buff);
+ fmemset(buff, 0, sizeof(buff));
+ }
+
+ fclose(fp);
+}
+
+static void destroy_mirrors(void)
+{
+ int i;
+
+ for (i = 0; i < array_size(servers); ++i)
+ free(servers[i]);
+}
+
+void init_geoip(int enforce)
+{
+ init_geoip_city(enforce);
+ init_geoip_country(enforce);
+ init_geoip_asname(enforce);
+}
+
+void update_geoip(void)
+{
+ int i, j, ret, good = 0;
+
+ init_mirrors();
+
+ for (i = 0; i < array_size(files); ++i) {
+ if (files[i].local && files[i].remote) {
+ good = 0;
+
+ for (j = 0; j < array_size(servers); ++j) {
+ if (servers[j] == NULL)
+ continue;
+ ret = geoip_get_database(servers[j], i);
+ if (!ret) {
+ good = 1;
+ break;
+ }
+ }
+
+ if (good == 0)
+ panic("Cannot get %s from mirrors!\n",
+ files[i].remote);
+ }
+ }
+
+ destroy_mirrors();
+}
+
+void destroy_geoip(void)
+{
+ destroy_geoip_city();
+ destroy_geoip_country();
+ destroy_geoip_asname();
+
+ geoip_db_present = 0;
+}
diff --git a/geoip.h b/geoip.h
new file mode 100644
index 0000000..2098ef8
--- /dev/null
+++ b/geoip.h
@@ -0,0 +1,29 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2013 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef GEOIPH_H
+#define GEOIPH_H
+
+#include <netinet/in.h>
+
+extern void init_geoip(int enforce);
+extern void update_geoip(void);
+extern int geoip_working(void);
+extern const char *geoip4_city_name(struct sockaddr_in sa);
+extern const char *geoip6_city_name(struct sockaddr_in6 sa);
+extern const char *geoip4_region_name(struct sockaddr_in sa);
+extern const char *geoip6_region_name(struct sockaddr_in6 sa);
+extern const char *geoip4_country_name(struct sockaddr_in sa);
+extern const char *geoip6_country_name(struct sockaddr_in6 sa);
+extern float geoip4_longitude(struct sockaddr_in sa);
+extern float geoip4_latitude(struct sockaddr_in sa);
+extern float geoip6_longitude(struct sockaddr_in6 sa);
+extern float geoip6_latitude(struct sockaddr_in6 sa);
+extern const char *geoip4_as_name(struct sockaddr_in sa);
+extern const char *geoip6_as_name(struct sockaddr_in6 sa);
+extern void destroy_geoip(void);
+
+#endif /* GEOIPH_H */
diff --git a/hash.c b/hash.c
new file mode 100644
index 0000000..6e27233
--- /dev/null
+++ b/hash.c
@@ -0,0 +1,169 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#include "hash.h"
+#include "xmalloc.h"
+
+/* Hash table implementation from the GIT project. */
+/* Copyright 2008 (C) Linus Torvalds, GPL version 2 */
+
+/*
+ * Look up a hash entry in the hash table. Return the pointer to
+ * the existing entry, or the empty slot if none existed. The caller
+ * can then look at the (*ptr) to see whether it existed or not.
+ */
+static struct hash_table_entry *lookup_hash_entry(unsigned int hash,
+ const struct hash_table
+ *table)
+{
+ unsigned int size = table->size, nr = hash % size;
+ struct hash_table_entry *array = table->array;
+ while (array[nr].ptr) {
+ if (array[nr].hash == hash)
+ break;
+ nr++;
+ if (nr >= size)
+ nr = 0;
+ }
+ return array + nr;
+}
+
+
+/*
+ * Insert a new hash entry pointer into the table.
+ *
+ * If that hash entry already existed, return the pointer to
+ * the existing entry (and the caller can create a list of the
+ * pointers or do anything else). If it didn't exist, return
+ * NULL (and the caller knows the pointer has been inserted).
+ */
+static void **insert_hash_entry(unsigned int hash, void *ptr,
+ struct hash_table *table)
+{
+ struct hash_table_entry *entry = lookup_hash_entry(hash, table);
+ if (!entry->ptr) {
+ entry->ptr = ptr;
+ entry->hash = hash;
+ table->nr++;
+ return NULL;
+ }
+ return &entry->ptr;
+}
+
+/*
+ * Removes a hash entry pointer from the table.
+ *
+ * If that hash does not exist, NULL is returned, or, if that hash
+ * exists and is the first entry, ptr_next will be set to that entry
+ * and NULL is returned. Otherwise the caller must maintain the
+ * remaining list.
+ */
+static void *remove_hash_entry(unsigned int hash, void *ptr, void *ptr_next,
+ struct hash_table *table)
+{
+ struct hash_table_entry *entry = lookup_hash_entry(hash, table);
+ if (!entry->ptr)
+ return NULL;
+ else if (entry->ptr == ptr) {
+ entry->ptr = ptr_next;
+ entry->hash = hash;
+ if (!ptr_next)
+ table->nr--;
+ return NULL;
+ } else
+ return entry->ptr;
+}
+
+static void grow_hash_table(struct hash_table *table)
+{
+ unsigned int i;
+ unsigned int old_size = table->size, new_size;
+ struct hash_table_entry *old_array = table->array, *new_array;
+ new_size = alloc_nr(old_size);
+ new_array = xzmalloc(sizeof(struct hash_table_entry) * new_size);
+ table->size = new_size;
+ table->array = new_array;
+ table->nr = 0;
+ for (i = 0; i < old_size; i++) {
+ unsigned int hash = old_array[i].hash;
+ void *ptr = old_array[i].ptr;
+ if (ptr)
+ insert_hash_entry(hash, ptr, table);
+ }
+ if (old_array)
+ xfree(old_array);
+}
+
+void *lookup_hash(unsigned int hash, const struct hash_table *table)
+{
+ if (!table->array)
+ return NULL;
+ return lookup_hash_entry(hash, table)->ptr;
+}
+
+void *remove_hash(unsigned int hash, void *ptr, void *ptr_next,
+ struct hash_table *table)
+{
+ if (!table->array)
+ return NULL;
+ return remove_hash_entry(hash, ptr, ptr_next, table);
+}
+
+void **insert_hash(unsigned int hash, void *ptr, struct hash_table *table)
+{
+ unsigned int nr = table->nr;
+ if (nr >= table->size/2)
+ grow_hash_table(table);
+ return insert_hash_entry(hash, ptr, table);
+}
+
+int for_each_hash(const struct hash_table *table, int (*fn)(void *))
+{
+ int sum = 0;
+ unsigned int i;
+ unsigned int size = table->size;
+ struct hash_table_entry *array = table->array;
+ for (i = 0; i < size; i++) {
+ void *ptr = array->ptr;
+ array++;
+ if (ptr) {
+ int val = fn(ptr);
+ if (val < 0)
+ return val;
+ sum += val;
+ }
+ }
+ return sum;
+}
+
+int for_each_hash_int(const struct hash_table *table, int (*fn)(void *, int),
+ int arg)
+{
+ int sum = 0;
+ unsigned int i;
+ unsigned int size = table->size;
+ struct hash_table_entry *array = table->array;
+ for (i = 0; i < size; i++) {
+ void *ptr = array->ptr;
+ array++;
+ if (ptr) {
+ int val = fn(ptr, arg);
+ if (val < 0)
+ return val;
+ sum += val;
+ }
+ }
+ return sum;
+}
+
+void free_hash(struct hash_table *table)
+{
+ if (table->array)
+ xfree(table->array);
+ table->array = NULL;
+ table->size = 0;
+ table->nr = 0;
+}
diff --git a/hash.h b/hash.h
new file mode 100644
index 0000000..8e26174
--- /dev/null
+++ b/hash.h
@@ -0,0 +1,86 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef HASH_H
+#define HASH_H
+
+/* Hash table implementation from the GIT project. */
+/* Copyright 2008 (C) Linus Torvalds, GPL version 2 */
+/*
+ * These are some simple generic hash table helper functions.
+ * Not necessarily suitable for all users, but good for things
+ * where you want to just keep track of a list of things, and
+ * have a good hash to use on them.
+ *
+ * It keeps the hash table at roughly 50-75% free, so the memory
+ * cost of the hash table itself is roughly
+ *
+ * 3 * 2*sizeof(void *) * nr_of_objects
+ *
+ * bytes.
+ *
+ * FIXME: on 64-bit architectures, we waste memory. It would be
+ * good to have just 32-bit pointers, requiring a special allocator
+ * for hashed entries or something.
+ */
+
+#include <stdio.h>
+
+#define alloc_nr(x) (((x) + 16) * 3 / 2)
+#define INSERT_HASH_PROTOS(ops, table) \
+ do { \
+ void **pos = insert_hash((ops).key, &(ops), &(table)); \
+ /* We already had an entry there? */ \
+ if (pos) { \
+ (ops).next = *pos; \
+ *pos = &(ops); \
+ } \
+ } while (0)
+
+struct hash_table_entry {
+ unsigned int hash;
+ void *ptr;
+};
+
+struct hash_table {
+ unsigned int size, nr;
+ struct hash_table_entry *array;
+};
+
+extern void *lookup_hash(unsigned int hash, const struct hash_table *table);
+extern void **insert_hash(unsigned int hash, void *ptr,
+ struct hash_table *table);
+extern void *remove_hash(unsigned int hash, void *ptr, void *ptr_next,
+ struct hash_table *table);
+extern int for_each_hash(const struct hash_table *table, int (*fn)(void *));
+extern int for_each_hash_int(const struct hash_table *table,
+ int (*fn)(void *, int), int arg);
+extern void free_hash(struct hash_table *table);
+
+static inline void init_hash(struct hash_table *table)
+{
+ table->size = 0;
+ table->nr = 0;
+ table->array = NULL;
+}
+
+static inline unsigned char icase_hash(unsigned char c)
+{
+ return c & ~((c & 0x40) >> 1);
+}
+
+static inline unsigned int hash_name(const char *name, int namelen)
+{
+ unsigned int hash = 0x123;
+ do {
+ unsigned char c = *name++;
+ c = icase_hash(c);
+ hash = hash * 101 + c;
+ } while (--namelen);
+ return hash;
+}
+
+#endif
diff --git a/ifpps.c b/ifpps.c
new file mode 100644
index 0000000..517ee23
--- /dev/null
+++ b/ifpps.c
@@ -0,0 +1,949 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009 - 2013 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <curses.h>
+#include <getopt.h>
+#include <ctype.h>
+#include <sys/socket.h>
+#include <sys/fsuid.h>
+#include <signal.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <time.h>
+
+#include "die.h"
+#include "xmalloc.h"
+#include "xutils.h"
+#include "xio.h"
+#include "built_in.h"
+
+struct wifi_stat {
+ uint32_t bitrate;
+ int16_t link_qual, link_qual_max;
+ int signal_level /*, noise_level*/;
+};
+
+struct ifstat {
+ long long unsigned int rx_bytes, rx_packets, rx_drops, rx_errors;
+ long long unsigned int rx_fifo, rx_frame, rx_multi;
+ long long unsigned int tx_bytes, tx_packets, tx_drops, tx_errors;
+ long long unsigned int tx_fifo, tx_colls, tx_carrier;
+ long long unsigned int irqs[MAX_CPUS], irqs_srx[MAX_CPUS], irqs_stx[MAX_CPUS];
+ int64_t cpu_user[MAX_CPUS], cpu_nice[MAX_CPUS], cpu_sys[MAX_CPUS];
+ int64_t cpu_idle[MAX_CPUS], cpu_iow[MAX_CPUS], mem_free, mem_total;
+ uint32_t irq_nr, procs_run, procs_iow, cswitch, forks;
+ struct wifi_stat wifi;
+};
+
+volatile sig_atomic_t sigint = 0;
+
+static struct ifstat stats_old, stats_new, stats_delta;
+
+static int stats_loop = 0;
+
+static WINDOW *stats_screen = NULL;
+
+static const char *short_options = "d:t:vhclp";
+static const struct option long_options[] = {
+ {"dev", required_argument, NULL, 'd'},
+ {"interval", required_argument, NULL, 't'},
+ {"promisc", no_argument, NULL, 'p'},
+ {"csv", no_argument, NULL, 'c'},
+ {"loop", no_argument, NULL, 'l'},
+ {"version", no_argument, NULL, 'v'},
+ {"help", no_argument, NULL, 'h'},
+ {NULL, 0, NULL, 0}
+};
+
+static void signal_handler(int number)
+{
+ switch (number) {
+ case SIGINT:
+ sigint = 1;
+ break;
+ case SIGHUP:
+ default:
+ break;
+ }
+}
+
+static inline char *snr_to_str(int level)
+{
+ if (level > 40)
+ return "very good signal";
+ if (level > 25 && level <= 40)
+ return "good signal";
+ if (level > 15 && level <= 25)
+ return "poor signal";
+ if (level > 10 && level <= 15)
+ return "very poor signal";
+ if (level <= 10)
+ return "no signal";
+
+ return "unknown";
+}
+
+static inline int iswireless(const struct ifstat *stats)
+{
+ return stats->wifi.bitrate > 0;
+}
+
+static void help(void)
+{
+ printf("\nifpps %s, top-like kernel networking and system statistics\n",
+ VERSION_STRING);
+ puts("http://www.netsniff-ng.org\n\n"
+ "Usage: ifpps [options] || ifpps <netdev>\n"
+ "Options:\n"
+ " -d|--dev <netdev> Device to fetch statistics for e.g., eth0\n"
+ " -t|--interval <time> Refresh time in ms (default 1000 ms)\n"
+ " -p|--promisc Promiscuous mode\n"
+ " -c|--csv Output to terminal as Gnuplot-ready data\n"
+ " -l|--loop Continuous CSV output\n"
+ " -v|--version Print version\n"
+ " -h|--help Print this help\n\n"
+ "Examples:\n"
+ " ifpps eth0\n"
+ " ifpps -pd eth0\n"
+ " ifpps -lpcd wlan0 > plot.dat\n\n"
+ "Note:\n"
+ " On 10G cards, RX/TX statistics are usually accumulated each > 1sec.\n"
+ " Thus, in those situations, it's good to use a -t of 10sec.\n\n"
+ "Please report bugs to <bugs@netsniff-ng.org>\n"
+ "Copyright (C) 2009-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("\nifpps %s, top-like kernel networking and system statistics\n",
+ VERSION_STRING);
+ puts("http://www.netsniff-ng.org\n\n"
+ "Please report bugs to <bugs@netsniff-ng.org>\n"
+ "Copyright (C) 2009-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 int stats_proc_net_dev(const char *ifname, struct ifstat *stats)
+{
+ int ret = -EINVAL;
+ char buff[256];
+ FILE *fp;
+
+ fp = fopen("/proc/net/dev", "r");
+ if (!fp)
+ panic("Cannot open /proc/net/dev!\n");
+
+ if (fgets(buff, sizeof(buff), fp)) { ; }
+ if (fgets(buff, sizeof(buff), fp)) { ; }
+
+ memset(buff, 0, sizeof(buff));
+
+ while (fgets(buff, sizeof(buff), fp) != NULL) {
+ buff[sizeof(buff) -1] = 0;
+
+ if (strstr(buff, ifname) == NULL)
+ continue;
+
+ if (sscanf(buff, "%*[a-z0-9 .-]:%llu%llu%llu%llu%llu%llu"
+ "%llu%*u%llu%llu%llu%llu%llu%llu%llu",
+ &stats->rx_bytes, &stats->rx_packets,
+ &stats->rx_errors, &stats->rx_drops,
+ &stats->rx_fifo, &stats->rx_frame,
+ &stats->rx_multi, &stats->tx_bytes,
+ &stats->tx_packets, &stats->tx_errors,
+ &stats->tx_drops, &stats->tx_fifo,
+ &stats->tx_colls, &stats->tx_carrier) == 14) {
+ ret = 0;
+ break;
+ }
+
+ memset(buff, 0, sizeof(buff));
+ }
+
+ fclose(fp);
+ return ret;
+}
+
+static int stats_proc_interrupts(char *ifname, struct ifstat *stats)
+{
+ int ret = -EINVAL, i, cpus, try = 0;
+ char *ptr, buff[256];
+ struct ethtool_drvinfo drvinf;
+ FILE *fp;
+
+ fp = fopen("/proc/interrupts", "r");
+ if (!fp)
+ panic("Cannot open /proc/interrupts!\n");
+
+ cpus = get_number_cpus();
+ bug_on(cpus > MAX_CPUS);
+retry:
+ fseek(fp, 0, SEEK_SET);
+ memset(buff, 0, sizeof(buff));
+
+ while (fgets(buff, sizeof(buff), fp) != NULL) {
+ buff[sizeof(buff) - 1] = 0;
+ ptr = buff;
+
+ if (strstr(buff, ifname) == NULL)
+ continue;
+
+ stats->irq_nr = strtol(ptr, &ptr, 10);
+ bug_on(stats->irq_nr == 0);
+
+ if (ptr)
+ ptr++;
+ for (i = 0; i < cpus && ptr; ++i) {
+ stats->irqs[i] = strtol(ptr, &ptr, 10);
+ if (i == cpus - 1) {
+ ret = 0;
+ goto done;
+ }
+ }
+
+ memset(buff, 0, sizeof(buff));
+ }
+
+ if (ret == -EINVAL && try == 0) {
+ memset(&drvinf, 0, sizeof(drvinf));
+ if (ethtool_drvinf(ifname, &drvinf) < 0)
+ goto done;
+
+ ifname = drvinf.driver;
+ try++;
+
+ goto retry;
+ }
+done:
+ fclose(fp);
+ return ret;
+}
+
+static int stats_proc_softirqs(struct ifstat *stats)
+{
+ int i, cpus;
+ char *ptr, buff[256];
+ FILE *fp;
+ enum {
+ softirqs_net_rx,
+ softirqs_net_tx,
+ softirqs_net_none,
+ } net_type = softirqs_net_none;
+
+ fp = fopen("/proc/softirqs", "r");
+ if (!fp)
+ panic("Cannot open /proc/softirqs!\n");
+
+ cpus = get_number_cpus();
+ bug_on(cpus > MAX_CPUS);
+
+ memset(buff, 0, sizeof(buff));
+
+ while (fgets(buff, sizeof(buff), fp) != NULL) {
+ buff[sizeof(buff) - 1] = 0;
+
+ if ((ptr = strstr(buff, "NET_TX:")))
+ net_type = softirqs_net_tx;
+ else if ((ptr = strstr(buff, "NET_RX:")))
+ net_type = softirqs_net_rx;
+ else
+ continue;
+
+ for (ptr += strlen("NET_xX:"), i = 0; i < cpus; ++i) {
+ switch (net_type) {
+ case softirqs_net_tx:
+ stats->irqs_stx[i] = strtol(ptr, &ptr, 10);
+ break;
+ case softirqs_net_rx:
+ stats->irqs_srx[i] = strtol(ptr, &ptr, 10);
+ break;
+ default:
+ bug();
+ }
+ }
+
+ memset(buff, 0, sizeof(buff));
+ }
+
+ fclose(fp);
+ return 0;
+}
+
+static int stats_proc_memory(struct ifstat *stats)
+{
+ char *ptr, buff[256];
+ FILE *fp;
+
+ fp = fopen("/proc/meminfo", "r");
+ if (!fp)
+ panic("Cannot open /proc/meminfo!\n");
+
+ memset(buff, 0, sizeof(buff));
+
+ while (fgets(buff, sizeof(buff), fp) != NULL) {
+ buff[sizeof(buff) - 1] = 0;
+
+ if ((ptr = strstr(buff, "MemTotal:"))) {
+ ptr += strlen("MemTotal:");
+ stats->mem_total = strtol(ptr, &ptr, 10);
+ } else if ((ptr = strstr(buff, "MemFree:"))) {
+ ptr += strlen("MemFree:");
+ stats->mem_free = strtol(ptr, &ptr, 10);
+ }
+
+ memset(buff, 0, sizeof(buff));
+ }
+
+ fclose(fp);
+ return 0;
+}
+
+static int stats_proc_system(struct ifstat *stats)
+{
+ int cpu, cpus;
+ char *ptr, buff[256];
+ FILE *fp;
+
+ fp = fopen("/proc/stat", "r");
+ if (!fp)
+ panic("Cannot open /proc/stat!\n");
+
+ cpus = get_number_cpus();
+ bug_on(cpus > MAX_CPUS);
+
+ memset(buff, 0, sizeof(buff));
+
+ while (fgets(buff, sizeof(buff), fp) != NULL) {
+ buff[sizeof(buff) - 1] = 0;
+
+ if ((ptr = strstr(buff, "cpu"))) {
+ ptr += strlen("cpu");
+ if (isblank(*ptr))
+ goto next;
+
+ cpu = strtol(ptr, &ptr, 10);
+ bug_on(cpu > cpus);
+
+ if (sscanf(ptr, "%lu%lu%lu%lu%lu",
+ &stats->cpu_user[cpu],
+ &stats->cpu_nice[cpu],
+ &stats->cpu_sys[cpu],
+ &stats->cpu_idle[cpu],
+ &stats->cpu_iow[cpu]) != 5)
+ goto next;
+ } else if ((ptr = strstr(buff, "ctxt"))) {
+ ptr += strlen("ctxt");
+ stats->cswitch = strtoul(ptr, &ptr, 10);
+ } else if ((ptr = strstr(buff, "processes"))) {
+ ptr += strlen("processes");
+ stats->forks = strtoul(ptr, &ptr, 10);
+ } else if ((ptr = strstr(buff, "procs_running"))) {
+ ptr += strlen("procs_running");
+ stats->procs_run = strtoul(ptr, &ptr, 10);
+ } else if ((ptr = strstr(buff, "procs_blocked"))) {
+ ptr += strlen("procs_blocked");
+ stats->procs_iow = strtoul(ptr, &ptr, 10);
+ }
+next:
+ memset(buff, 0, sizeof(buff));
+ }
+
+ fclose(fp);
+ return 0;
+}
+
+static int adjust_dbm_level(int in_dbm, int dbm_val)
+{
+ if (!in_dbm)
+ return dbm_val;
+
+ return dbm_val - 0x100;
+}
+
+static int stats_wireless(const char *ifname, struct ifstat *stats)
+{
+ int ret;
+ struct iw_statistics ws;
+
+ ret = wireless_sigqual(ifname, &ws);
+ if (ret != 0) {
+ stats->wifi.bitrate = 0;
+ return -EINVAL;
+ }
+
+ stats->wifi.bitrate = wireless_bitrate(ifname);
+
+ stats->wifi.signal_level =
+ adjust_dbm_level(ws.qual.updated & IW_QUAL_DBM, ws.qual.level);
+
+ stats->wifi.link_qual = ws.qual.qual;
+ stats->wifi.link_qual_max = wireless_rangemax_sigqual(ifname);
+
+ return ret;
+}
+
+#define DIFF1(member) do { diff->member = new->member - old->member; } while (0)
+#define DIFF(member) do { \
+ if (sizeof(diff->member) != sizeof(new->member) || \
+ sizeof(diff->member) != sizeof(old->member)) \
+ bug(); \
+ bug_on((new->member - old->member) > (new->member)); \
+ DIFF1(member); \
+ } while (0)
+
+static void stats_diff(struct ifstat *old, struct ifstat *new,
+ struct ifstat *diff)
+{
+ int cpus, i;
+
+ DIFF(rx_bytes);
+ DIFF(rx_packets);
+ DIFF(rx_drops);
+ DIFF(rx_errors);
+ DIFF(rx_fifo);
+ DIFF(rx_frame);
+ DIFF(rx_multi);
+
+ DIFF(tx_bytes);
+ DIFF(tx_bytes);
+ DIFF(tx_packets);
+ DIFF(tx_drops);
+ DIFF(tx_errors);
+ DIFF(tx_fifo);
+ DIFF(tx_colls);
+ DIFF(tx_carrier);
+
+ DIFF1(procs_run);
+ DIFF1(procs_iow);
+
+ DIFF1(wifi.signal_level);
+ DIFF1(wifi.link_qual);
+
+ DIFF1(cswitch);
+ DIFF1(forks);
+
+ cpus = get_number_cpus();
+ bug_on(cpus > MAX_CPUS);
+
+ for (i = 0; i < cpus; ++i) {
+ DIFF(irqs[i]);
+ DIFF(irqs_srx[i]);
+ DIFF(irqs_stx[i]);
+
+ DIFF1(cpu_user[i]);
+ DIFF1(cpu_nice[i]);
+ DIFF1(cpu_sys[i]);
+ DIFF1(cpu_idle[i]);
+ DIFF1(cpu_iow[i]);
+ }
+}
+
+static void stats_fetch(const char *ifname, struct ifstat *stats)
+{
+ if (stats_proc_net_dev(ifname, stats) < 0)
+ panic("Cannot fetch device stats!\n");
+ if (stats_proc_softirqs(stats) < 0)
+ panic("Cannot fetch software interrupts!\n");
+ if (stats_proc_memory(stats) < 0)
+ panic("Cannot fetch memory stats!\n");
+ if (stats_proc_system(stats) < 0)
+ panic("Cannot fetch system stats!\n");
+
+ stats_proc_interrupts((char *) ifname, stats);
+
+ stats_wireless(ifname, stats);
+}
+
+static void stats_sample_generic(const char *ifname, uint64_t ms_interval)
+{
+ memset(&stats_old, 0, sizeof(stats_old));
+ memset(&stats_new, 0, sizeof(stats_new));
+ memset(&stats_delta, 0, sizeof(stats_delta));
+
+ stats_fetch(ifname, &stats_old);
+ usleep(ms_interval * 1000);
+ stats_fetch(ifname, &stats_new);
+
+ stats_diff(&stats_old, &stats_new, &stats_delta);
+}
+
+static void screen_init(WINDOW **screen)
+{
+ (*screen) = initscr();
+
+ raw();
+ noecho();
+ cbreak();
+ nodelay((*screen), TRUE);
+
+ keypad(stdscr, TRUE);
+
+ refresh();
+ wrefresh((*screen));
+}
+
+static void screen_header(WINDOW *screen, const char *ifname, int *voff,
+ uint64_t ms_interval)
+{
+ size_t len = 0;
+ char buff[64];
+ struct ethtool_drvinfo drvinf;
+ u32 rate = device_bitrate(ifname);
+ int link = ethtool_link(ifname);
+
+ memset(&drvinf, 0, sizeof(drvinf));
+ ethtool_drvinf(ifname, &drvinf);
+
+ memset(buff, 0, sizeof(buff));
+ if (rate)
+ len += snprintf(buff + len, sizeof(buff) - len, " %uMbit/s", rate);
+ if (link >= 0)
+ len += snprintf(buff + len, sizeof(buff) - len, " link:%s",
+ link == 0 ? "no" : "yes");
+
+ mvwprintw(screen, (*voff)++, 2,
+ "Kernel net/sys statistics for %s (%s%s), t=%lums"
+ " ",
+ ifname, drvinf.driver, buff, ms_interval);
+}
+
+static void screen_net_dev_rel(WINDOW *screen, const struct ifstat *rel,
+ int *voff)
+{
+ attron(A_REVERSE);
+
+ mvwprintw(screen, (*voff)++, 0,
+ " RX: %16.3llf MiB/t "
+ "%10llu pkts/t "
+ "%10llu drops/t "
+ "%10llu errors/t ",
+ ((long double) rel->rx_bytes) / (1LLU << 20),
+ rel->rx_packets, rel->rx_drops, rel->rx_errors);
+
+ mvwprintw(screen, (*voff)++, 0,
+ " TX: %16.3llf MiB/t "
+ "%10llu pkts/t "
+ "%10llu drops/t "
+ "%10llu errors/t ",
+ ((long double) rel->tx_bytes) / (1LLU << 20),
+ rel->tx_packets, rel->tx_drops, rel->tx_errors);
+
+ attroff(A_REVERSE);
+}
+
+static void screen_net_dev_abs(WINDOW *screen, const struct ifstat *abs,
+ int *voff)
+{
+ mvwprintw(screen, (*voff)++, 2,
+ "RX: %16.3llf MiB "
+ "%10llu pkts "
+ "%10llu drops "
+ "%10llu errors",
+ ((long double) abs->rx_bytes) / (1LLU << 20),
+ abs->rx_packets, abs->rx_drops, abs->rx_errors);
+
+ mvwprintw(screen, (*voff)++, 2,
+ "TX: %16.3llf MiB "
+ "%10llu pkts "
+ "%10llu drops "
+ "%10llu errors",
+ ((long double) abs->tx_bytes) / (1LLU << 20),
+ abs->tx_packets, abs->tx_drops, abs->tx_errors);
+}
+
+static void screen_sys_mem(WINDOW *screen, const struct ifstat *rel,
+ const struct ifstat *abs, int *voff)
+{
+ mvwprintw(screen, (*voff)++, 2,
+ "SYS: %14u cs/t "
+ "%10.1lf%% mem "
+ "%13u running "
+ "%10u iowait",
+ rel->cswitch,
+ (100.0 * (abs->mem_total - abs->mem_free)) / abs->mem_total,
+ abs->procs_run, abs->procs_iow);
+}
+
+static void screen_percpu_states(WINDOW *screen, const struct ifstat *rel,
+ int cpus, int *voff)
+{
+ int i;
+ uint64_t all;
+
+ for (i = 0; i < cpus; ++i) {
+ all = rel->cpu_user[i] + rel->cpu_nice[i] + rel->cpu_sys[i] +
+ rel->cpu_idle[i] + rel->cpu_iow[i];
+
+ mvwprintw(screen, (*voff)++, 2,
+ "CPU%d: %13.1lf%% usr/t "
+ "%9.1lf%% sys/t "
+ "%10.1lf%% idl/t "
+ "%11.1lf%% iow/t ", i,
+ 100.0 * (rel->cpu_user[i] + rel->cpu_nice[i]) / all,
+ 100.0 * rel->cpu_sys[i] / all,
+ 100.0 * rel->cpu_idle[i] / all,
+ 100.0 * rel->cpu_iow[i] / all);
+ }
+}
+
+static void screen_percpu_irqs_rel(WINDOW *screen, const struct ifstat *rel,
+ int cpus, int *voff)
+{
+ int i;
+
+ for (i = 0; i < cpus; ++i) {
+ mvwprintw(screen, (*voff)++, 2,
+ "CPU%d: %14llu irqs/t "
+ "%15llu soirq RX/t "
+ "%15llu soirq TX/t ", i,
+ rel->irqs[i],
+ rel->irqs_srx[i],
+ rel->irqs_stx[i]);
+ }
+}
+
+static void screen_percpu_irqs_abs(WINDOW *screen, const struct ifstat *abs,
+ int cpus, int *voff)
+{
+ int i;
+
+ for (i = 0; i < cpus; ++i) {
+ mvwprintw(screen, (*voff)++, 2,
+ "CPU%d: %14llu irqs", i,
+ abs->irqs[i]);
+ }
+}
+
+static void screen_wireless(WINDOW *screen, const struct ifstat *rel,
+ const struct ifstat *abs, int *voff)
+{
+ if (iswireless(abs)) {
+ mvwprintw(screen, (*voff)++, 2,
+ "LinkQual: %7d/%d (%d/t) ",
+ abs->wifi.link_qual,
+ abs->wifi.link_qual_max,
+ rel->wifi.link_qual);
+
+ mvwprintw(screen, (*voff)++, 2,
+ "Signal: %8d dBm (%d dBm/t) ",
+ abs->wifi.signal_level,
+ rel->wifi.signal_level);
+ }
+}
+
+static void screen_update(WINDOW *screen, const char *ifname, const struct ifstat *rel,
+ const struct ifstat *abs, int *first, uint64_t ms_interval)
+{
+ int cpus, voff = 1, cvoff = 2;
+
+ curs_set(0);
+
+ cpus = get_number_cpus();
+ bug_on(cpus > MAX_CPUS);
+
+ screen_header(screen, ifname, &voff, ms_interval);
+
+ voff++;
+ screen_net_dev_rel(screen, rel, &voff);
+
+ voff++;
+ screen_net_dev_abs(screen, abs, &voff);
+
+ voff++;
+ screen_sys_mem(screen, rel, abs, &voff);
+
+ voff++;
+ screen_percpu_states(screen, rel, cpus, &voff);
+
+ voff++;
+ screen_percpu_irqs_rel(screen, rel, cpus, &voff);
+
+ voff++;
+ screen_percpu_irqs_abs(screen, abs, cpus, &voff);
+
+ voff++;
+ screen_wireless(screen, rel, abs, &voff);
+
+ if (*first) {
+ mvwprintw(screen, cvoff, 2, "Collecting data ...");
+ *first = 0;
+ } else {
+ mvwprintw(screen, cvoff, 2, " ");
+ }
+
+ wrefresh(screen);
+ refresh();
+}
+
+static void screen_end(void)
+{
+ endwin();
+}
+
+static int screen_main(const char *ifname, uint64_t ms_interval)
+{
+ int first = 1, key;
+
+ screen_init(&stats_screen);
+
+ while (!sigint) {
+ key = getch();
+ if (key == 'q' || key == 0x1b || key == KEY_F(10))
+ break;
+
+ screen_update(stats_screen, ifname, &stats_delta, &stats_new,
+ &first, ms_interval);
+
+ stats_sample_generic(ifname, ms_interval);
+ }
+
+ screen_end();
+
+ return 0;
+}
+
+static void term_csv(const char *ifname, const struct ifstat *rel,
+ const struct ifstat *abs, uint64_t ms_interval)
+{
+ int cpus, i;
+
+ printf("%ld ", time(0));
+
+ printf("%llu ", rel->rx_bytes);
+ printf("%llu ", rel->rx_packets);
+ printf("%llu ", rel->rx_drops);
+ printf("%llu ", rel->rx_errors);
+
+ printf("%llu ", abs->rx_bytes);
+ printf("%llu ", abs->rx_packets);
+ printf("%llu ", abs->rx_drops);
+ printf("%llu ", abs->rx_errors);
+
+ printf("%llu ", rel->tx_bytes);
+ printf("%llu ", rel->tx_packets);
+ printf("%llu ", rel->tx_drops);
+ printf("%llu ", rel->tx_errors);
+
+ printf("%llu ", abs->tx_bytes);
+ printf("%llu ", abs->tx_packets);
+ printf("%llu ", abs->tx_drops);
+ printf("%llu ", abs->tx_errors);
+
+ printf("%u ", rel->cswitch);
+ printf("%lu ", abs->mem_free);
+ printf("%lu ", abs->mem_total - abs->mem_free);
+ printf("%lu ", abs->mem_total);
+ printf("%u ", abs->procs_run);
+ printf("%u ", abs->procs_iow);
+
+ cpus = get_number_cpus();
+ bug_on(cpus > MAX_CPUS);
+
+ for (i = 0; i < cpus; ++i) {
+ printf("%lu ", rel->cpu_user[i]);
+ printf("%lu ", rel->cpu_nice[i]);
+ printf("%lu ", rel->cpu_sys[i]);
+ printf("%lu ", rel->cpu_idle[i]);
+ printf("%lu ", rel->cpu_iow[i]);
+
+ printf("%llu ", rel->irqs[i]);
+ printf("%llu ", abs->irqs[i]);
+
+ printf("%llu ", rel->irqs_srx[i]);
+ printf("%llu ", abs->irqs_srx[i]);
+
+ printf("%llu ", rel->irqs_stx[i]);
+ printf("%llu ", abs->irqs_stx[i]);
+ }
+
+ if (iswireless(abs)) {
+ printf("%u ", rel->wifi.link_qual);
+ printf("%u ", abs->wifi.link_qual);
+ printf("%u ", abs->wifi.link_qual_max);
+
+ printf("%d ", rel->wifi.signal_level);
+ printf("%d ", abs->wifi.signal_level);
+ }
+
+ puts("");
+ fflush(stdout);
+}
+
+static void term_csv_header(const char *ifname, const struct ifstat *abs,
+ uint64_t ms_interval)
+{
+ int cpus, i, j = 1;
+
+ printf("# gnuplot dump (#col:description)\n");
+ printf("# networking interface: %s\n", ifname);
+ printf("# sampling interval (t): %lu ms\n", ms_interval);
+ printf("# %d:unixtime ", j++);
+
+ printf("%d:rx-bytes-per-t ", j++);
+ printf("%d:rx-pkts-per-t ", j++);
+ printf("%d:rx-drops-per-t ", j++);
+ printf("%d:rx-errors-per-t ", j++);
+
+ printf("%d:rx-bytes ", j++);
+ printf("%d:rx-pkts ", j++);
+ printf("%d:rx-drops ", j++);
+ printf("%d:rx-errors ", j++);
+
+ printf("%d:tx-bytes-per-t ", j++);
+ printf("%d:tx-pkts-per-t ", j++);
+ printf("%d:tx-drops-per-t ", j++);
+ printf("%d:tx-errors-per-t ", j++);
+
+ printf("%d:tx-bytes ", j++);
+ printf("%d:tx-pkts ", j++);
+ printf("%d:tx-drops ", j++);
+ printf("%d:tx-errors ", j++);
+
+ printf("%d:context-switches-per-t ", j++);
+ printf("%d:mem-free ", j++);
+ printf("%d:mem-used ", j++);
+ printf("%d:mem-total ", j++);
+ printf("%d:procs-in-run ", j++);
+ printf("%d:procs-in-iow ", j++);
+
+ cpus = get_number_cpus();
+ bug_on(cpus > MAX_CPUS);
+
+ for (i = 0, j = 22; i < cpus; ++i) {
+ printf("%d:cpu%i-usr-per-t ", j++, i);
+ printf("%d:cpu%i-nice-per-t ", j++, i);
+ printf("%d:cpu%i-sys-per-t ", j++, i);
+ printf("%d:cpu%i-idle-per-t ", j++, i);
+ printf("%d:cpu%i-iow-per-t ", j++, i);
+
+ printf("%d:cpu%i-net-irqs-per-t ", j++, i);
+ printf("%d:cpu%i-net-irqs ", j++, i);
+
+ printf("%d:cpu%i-net-rx-soft-irqs-per-t ", j++, i);
+ printf("%d:cpu%i-net-rx-soft-irqs ", j++, i);
+ printf("%d:cpu%i-net-tx-soft-irqs-per-t ", j++, i);
+ printf("%d:cpu%i-net-tx-soft-irqs ", j++, i);
+ }
+
+ if (iswireless(abs)) {
+ printf("%d:wifi-link-qual-per-t ", j++);
+ printf("%d:wifi-link-qual ", j++);
+ printf("%d:wifi-link-qual-max ", j++);
+
+ printf("%d:wifi-signal-dbm-per-t ", j++);
+ printf("%d:wifi-signal-dbm ", j++);
+ }
+
+ puts("");
+ printf("# data:\n");
+ fflush(stdout);
+}
+
+static int term_main(const char *ifname, uint64_t ms_interval)
+{
+ int first = 1;
+
+ do {
+ stats_sample_generic(ifname, ms_interval);
+
+ if (first) {
+ first = 0;
+ term_csv_header(ifname, &stats_new, ms_interval);
+ }
+
+ term_csv(ifname, &stats_delta, &stats_new, ms_interval);
+ } while (stats_loop && !sigint);
+
+ return 0;
+}
+
+int main(int argc, char **argv)
+{
+ short ifflags = 0;
+ int c, opt_index, ret, promisc = 0;
+ uint64_t interval = 1000;
+ char *ifname = NULL;
+ int (*func_main)(const char *ifname, uint64_t ms_interval) = screen_main;
+
+ setfsuid(getuid());
+ setfsgid(getgid());
+
+ while ((c = getopt_long(argc, argv, short_options, long_options,
+ &opt_index)) != EOF) {
+ switch (c) {
+ case 'h':
+ help();
+ break;
+ case 'v':
+ version();
+ break;
+ case 'd':
+ ifname = xstrndup(optarg, IFNAMSIZ);
+ break;
+ case 't':
+ interval = strtol(optarg, NULL, 10);
+ break;
+ case 'l':
+ stats_loop = 1;
+ break;
+ case 'p':
+ promisc = 1;
+ break;
+ case 'c':
+ func_main = term_main;
+ break;
+ case '?':
+ switch (optopt) {
+ case 'd':
+ case 't':
+ 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 == 1)
+ help();
+
+ if (argc == 2)
+ ifname = xstrndup(argv[1], IFNAMSIZ);
+ if (ifname == NULL)
+ panic("No networking device given!\n");
+
+ if (!strncmp("lo", ifname, IFNAMSIZ))
+ panic("lo is not supported!\n");
+ if (device_mtu(ifname) == 0)
+ panic("This is no networking device!\n");
+
+ register_signal(SIGINT, signal_handler);
+ register_signal(SIGHUP, signal_handler);
+
+ if (promisc)
+ ifflags = enter_promiscuous_mode(ifname);
+ ret = func_main(ifname, interval);
+ if (promisc)
+ leave_promiscuous_mode(ifname, ifflags);
+
+ xfree(ifname);
+ return ret;
+}
diff --git a/ifpps/.gitignore b/ifpps/.gitignore
new file mode 100644
index 0000000..32aad4d
--- /dev/null
+++ b/ifpps/.gitignore
@@ -0,0 +1,4 @@
+*.*
+
+!.gitignore
+!Makefile
diff --git a/ifpps/Makefile b/ifpps/Makefile
new file mode 100644
index 0000000..28c3544
--- /dev/null
+++ b/ifpps/Makefile
@@ -0,0 +1,6 @@
+ifpps-libs = -lncurses
+
+ifpps-objs = xmalloc.o \
+ xio.o \
+ xutils.o \
+ ifpps.o
diff --git a/ipv4.h b/ipv4.h
new file mode 100644
index 0000000..98a1703
--- /dev/null
+++ b/ipv4.h
@@ -0,0 +1,36 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright (C) 2009, 2010 Daniel Borkmann
+ * Copyright (C) 2012 Christoph Jaeger <christoph@netsniff-ng.org>
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef IPV4_H
+#define IPV4_H
+
+#include <asm/byteorder.h>
+
+#include "built_in.h"
+
+struct ipv4hdr {
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+ __extension__ uint8_t h_ihl:4,
+ h_version:4;
+#elif defined (__BIG_ENDIAN_BITFIELD)
+ __extension__ uint8_t h_version:4,
+ h_ihl:4;
+#else
+# error "Please fix <asm/byteorder.h>"
+#endif
+ uint8_t h_tos;
+ uint16_t h_tot_len;
+ uint16_t h_id;
+ uint16_t h_frag_off;
+ uint8_t h_ttl;
+ uint8_t h_protocol;
+ uint16_t h_check;
+ uint32_t h_saddr;
+ uint32_t h_daddr;
+} __packed;
+
+#endif /* IPV4_H */
diff --git a/ipv6.h b/ipv6.h
new file mode 100644
index 0000000..a55a565
--- /dev/null
+++ b/ipv6.h
@@ -0,0 +1,39 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright (C) 2009, 2010 Daniel Borkmann
+ * Copyright (C) 2012 Christoph Jaeger <christoph@netsniff-ng.org>
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef IPV6_H
+#define IPV6_H
+
+#include <asm/byteorder.h>
+
+#include "built_in.h"
+
+/*
+ * IPv6 fixed header
+ *
+ * BEWARE, it is incorrect. The first 4 bits of flow_lbl
+ * are glued to priority now, forming "class".
+ */
+struct ipv6hdr {
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+ __extension__ uint8_t priority:4,
+ version:4;
+#elif defined(__BIG_ENDIAN_BITFIELD)
+ __extension__ uint8_t version:4,
+ priority:4;
+#else
+# error "Please fix <asm/byteorder.h>"
+#endif
+ uint8_t flow_lbl[3];
+ uint16_t payload_len;
+ uint8_t nexthdr;
+ uint8_t hop_limit;
+ struct in6_addr saddr;
+ struct in6_addr daddr;
+} __packed;
+
+#endif /* IPV6_H */
diff --git a/locking.h b/locking.h
new file mode 100644
index 0000000..ac10d5d
--- /dev/null
+++ b/locking.h
@@ -0,0 +1,97 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2011 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef LOCKING_H
+#define LOCKING_H
+
+#include <pthread.h>
+
+#include "built_in.h"
+
+struct spinlock {
+ pthread_spinlock_t lock;
+};
+
+struct mutexlock {
+ pthread_mutex_t lock;
+};
+
+struct rwlock {
+ pthread_rwlock_t lock;
+};
+
+static inline int spinlock_init(struct spinlock *l)
+{
+ return -pthread_spin_init(&l->lock, 0);
+}
+
+static inline void spinlock_destroy(struct spinlock *l)
+{
+ pthread_spin_destroy(&l->lock);
+}
+
+static inline void spinlock_lock(struct spinlock *l)
+{
+ pthread_spin_lock(&l->lock);
+}
+
+static inline void spinlock_unlock(struct spinlock *l)
+{
+ pthread_spin_unlock(&l->lock);
+}
+
+static inline int mutexlock_init(struct mutexlock *l)
+{
+ return -pthread_mutex_init(&l->lock, 0);
+}
+
+static inline void mutexlock_destroy(struct mutexlock *l)
+{
+ pthread_mutex_destroy(&l->lock);
+}
+
+static inline void mutexlock_lock(struct mutexlock *l)
+{
+ pthread_mutex_lock(&l->lock);
+}
+
+static inline void mutexlock_unlock(struct mutexlock *l)
+{
+ pthread_mutex_unlock(&l->lock);
+}
+
+static inline int rwlock_init(struct rwlock *l)
+{
+ return -pthread_rwlock_init(&l->lock, 0);
+}
+
+static inline int rwlock_init2(struct rwlock *l,
+ pthread_rwlockattr_t *restrict attr)
+{
+ return -pthread_rwlock_init(&l->lock, attr);
+}
+
+static inline void rwlock_destroy(struct rwlock *l)
+{
+ pthread_rwlock_destroy(&l->lock);
+}
+
+static inline void rwlock_rd_lock(struct rwlock *l)
+{
+ pthread_rwlock_rdlock(&l->lock);
+}
+
+static inline void rwlock_wr_lock(struct rwlock *l)
+{
+ pthread_rwlock_wrlock(&l->lock);
+}
+
+static inline void rwlock_unlock(struct rwlock *l)
+{
+ pthread_rwlock_unlock(&l->lock);
+}
+
+#endif /* LOCKING_H */
diff --git a/mac80211.c b/mac80211.c
new file mode 100644
index 0000000..14bcc93
--- /dev/null
+++ b/mac80211.c
@@ -0,0 +1,223 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2012 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ * Parts derived from iw, subject to ISC license.
+ * Copyright 2007, 2008 Johannes Berg
+ * Copyright 2007 Andy Lutomirski
+ * Copyright 2007 Mike Kershaw
+ * Copyright 2008-2009 Luis R. Rodriguez
+ */
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <limits.h>
+#include <linux/nl80211.h>
+#include <libnl3/netlink/genl/genl.h>
+#include <libnl3/netlink/genl/family.h>
+#include <libnl3/netlink/genl/ctrl.h>
+#include <libnl3/netlink/msg.h>
+#include <libnl3/netlink/attr.h>
+
+#include "die.h"
+#include "xutils.h"
+#include "mac80211.h"
+#include "xmalloc.h"
+#include "built_in.h"
+
+struct nl80211_state {
+ struct nl_sock *nl_sock;
+ struct nl_cache *nl_cache;
+ struct genl_family *nl80211;
+};
+
+static void get_mac80211_phydev(const char *device, char *phydev_path,
+ size_t phydev_len)
+{
+ int ret;
+ char *pathstr;
+ ssize_t num;
+
+ ret = asprintf(&pathstr, "/sys/class/net/%s/phy80211", device);
+ if (ret < 0)
+ panic("Can't generate path name string for /sys/class/net device");
+
+ num = readlink(pathstr, phydev_path, phydev_len);
+ if (num < 0) {
+ if (errno == ENOENT || errno == EINVAL)
+ panic("It's probably not a mac80211 device!\n");
+ panic("Can't readlink %s: %s!\n", pathstr, strerror(errno));
+ }
+
+ xfree(pathstr);
+ phydev_path[min(num, phydev_len - 1)] = 0;
+}
+
+static inline struct nl_msg *nl80211_nlmsg_xalloc(void)
+{
+ struct nl_msg *ret = nlmsg_alloc();
+ if (!ret)
+ panic("Cannot allocate nlmsg memory!\n");
+ return ret;
+}
+
+static inline struct nl_sock *nl80211_nl_socket_xalloc(void)
+{
+ struct nl_sock *ret = nl_socket_alloc();
+ if (!ret)
+ panic("Cannot allocate nl socket memory!\n");
+ return ret;
+}
+
+static void nl80211_init(struct nl80211_state *state, const char *device)
+{
+ int ret;
+
+ state->nl_sock = nl80211_nl_socket_xalloc();
+
+ ret = genl_connect(state->nl_sock);
+ if (ret)
+ panic("Cannot connect generic netlink!\n");
+
+ ret = genl_ctrl_alloc_cache(state->nl_sock, &state->nl_cache);
+ if (ret < 0)
+ panic("Failed to allocate generic netlink cache: %s!",
+ nl_geterror(-ret));
+
+ state->nl80211 = genl_ctrl_search_by_name(state->nl_cache, "nl80211");
+ if (!state->nl80211)
+ panic("nl80211 not found in netlink cache!\n");
+}
+
+static void nl80211_cleanup(struct nl80211_state *state)
+{
+ genl_family_put(state->nl80211);
+
+ nl_cache_free(state->nl_cache);
+ nl_socket_free(state->nl_sock);
+}
+
+static int nl80211_add_mon_if(struct nl80211_state *state, const char *device,
+ const char *mondevice)
+{
+ int ifindex, ret;
+ struct nl_msg *msg;
+
+ ifindex = device_ifindex(device);
+
+ msg = nl80211_nlmsg_xalloc();
+
+ genlmsg_put(msg, 0, 0, genl_family_get_id(state->nl80211), 0,
+ 0, NL80211_CMD_NEW_INTERFACE, 0);
+
+ NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifindex);
+ NLA_PUT_STRING(msg, NL80211_ATTR_IFNAME, mondevice);
+ NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, NL80211_IFTYPE_MONITOR);
+
+ ret = nl_send_auto_complete(state->nl_sock, msg);
+ if (ret < 0) {
+ if (ret == -ENFILE) {
+ nlmsg_free(msg);
+ return -EBUSY;
+ }
+
+ panic("Cannot send_auto_complete!\n");
+ }
+
+ ret = nl_wait_for_ack(state->nl_sock);
+ if (ret < 0) {
+ if (ret == -ENFILE) {
+ nlmsg_free(msg);
+ return -EBUSY;
+ }
+
+ panic("Waiting for netlink ack failed!\n");
+ }
+
+ nlmsg_free(msg);
+ return 0;
+
+nla_put_failure:
+ panic("nla put failure!\n");
+ return -EIO; /* dummy */
+}
+
+static int nl80211_del_mon_if(struct nl80211_state *state, const char *device,
+ const char *mondevice)
+{
+ int ifindex, ret;
+ struct nl_msg *msg;
+
+ ifindex = device_ifindex(mondevice);
+
+ msg = nl80211_nlmsg_xalloc();
+
+ genlmsg_put(msg, 0, 0, genl_family_get_id(state->nl80211), 0,
+ 0, NL80211_CMD_DEL_INTERFACE, 0);
+
+ NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifindex);
+
+ ret = nl_send_auto_complete(state->nl_sock, msg);
+ if (ret < 0)
+ panic("Cannot send_auto_complete!\n");
+
+ ret = nl_wait_for_ack(state->nl_sock);
+ if (ret < 0)
+ panic("Waiting for netlink ack failed!\n");
+
+ nlmsg_free(msg);
+ return 0;
+
+nla_put_failure:
+ panic("nla put failure!\n");
+ return -EIO; /* dummy */
+}
+
+void enter_rfmon_mac80211(const char *device, char **mondev)
+{
+ int ret;
+ short flags;
+ uint32_t n;
+ char phydev_path[256];
+ struct nl80211_state nlstate;
+
+ /* XXX: is this already a monN device? */
+ get_mac80211_phydev(device, phydev_path, sizeof(phydev_path));
+ nl80211_init(&nlstate, device);
+
+ for (n = 0; n < UINT_MAX; n++) {
+ char mondevice[32];
+
+ slprintf(mondevice, sizeof(mondevice), "mon%u", n);
+ ret = nl80211_add_mon_if(&nlstate, device, mondevice);
+ if (ret == 0) {
+ *mondev = xstrdup(mondevice);
+
+ flags = device_get_flags(*mondev);
+ flags |= IFF_UP | IFF_RUNNING;
+ device_set_flags(*mondev, flags);
+
+ nl80211_cleanup(&nlstate);
+ return;
+ }
+ }
+
+ panic("No free monN interfaces!\n");
+}
+
+void leave_rfmon_mac80211(const char *device, const char *mondev)
+{
+ short flags;
+ struct nl80211_state nlstate;
+
+ flags = device_get_flags(mondev);
+ flags &= ~(IFF_UP | IFF_RUNNING);
+ device_set_flags(mondev, flags);
+
+ nl80211_init(&nlstate, device);
+ nl80211_del_mon_if(&nlstate, device, mondev);
+ nl80211_cleanup(&nlstate);
+}
diff --git a/mac80211.h b/mac80211.h
new file mode 100644
index 0000000..9d340ac
--- /dev/null
+++ b/mac80211.h
@@ -0,0 +1,13 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2012 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef MAC80211_H
+#define MAC80211_H
+
+extern void enter_rfmon_mac80211(const char *device, char **mondev);
+extern void leave_rfmon_mac80211(const char *device, const char *mondev);
+
+#endif /* MAC80211_H */
diff --git a/netsniff-ng.c b/netsniff-ng.c
new file mode 100644
index 0000000..ad5fd04
--- /dev/null
+++ b/netsniff-ng.c
@@ -0,0 +1,1369 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009-2013 Daniel Borkmann.
+ * Copyright 2010 Emmanuel Roullit.
+ * Subject to the GPL, version 2.
+ */
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <getopt.h>
+#include <ctype.h>
+#include <time.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/fsuid.h>
+#include <unistd.h>
+#include <stdbool.h>
+#include <pthread.h>
+#include <fcntl.h>
+
+#include "ring_rx.h"
+#include "ring_tx.h"
+#include "mac80211.h"
+#include "xutils.h"
+#include "built_in.h"
+#include "pcap_io.h"
+#include "bpf.h"
+#include "xio.h"
+#include "die.h"
+#include "geoip.h"
+#include "tprintf.h"
+#include "dissector.h"
+#include "xmalloc.h"
+
+enum dump_mode {
+ DUMP_INTERVAL_TIME,
+ DUMP_INTERVAL_SIZE,
+};
+
+struct ctx {
+ char *device_in, *device_out, *device_trans, *filter, *prefix;
+ int cpu, rfraw, dump, print_mode, dump_dir, packet_type, verbose;
+ unsigned long kpull, dump_interval, reserve_size, tx_bytes, tx_packets;
+ bool randomize, promiscuous, enforce, jumbo, dump_bpf;
+ enum pcap_ops_groups pcap; enum dump_mode dump_mode;
+ uid_t uid; gid_t gid; uint32_t link_type, magic;
+};
+
+volatile sig_atomic_t sigint = 0;
+
+static volatile bool next_dump = false;
+
+static const char *short_options = "d:i:o:rf:MJt:S:k:n:b:HQmcsqXlvhF:RGAP:Vu:g:T:DB";
+static const struct option long_options[] = {
+ {"dev", required_argument, NULL, 'd'},
+ {"in", required_argument, NULL, 'i'},
+ {"out", required_argument, NULL, 'o'},
+ {"filter", required_argument, NULL, 'f'},
+ {"num", required_argument, NULL, 'n'},
+ {"type", required_argument, NULL, 't'},
+ {"interval", required_argument, NULL, 'F'},
+ {"ring-size", required_argument, NULL, 'S'},
+ {"kernel-pull", required_argument, NULL, 'k'},
+ {"bind-cpu", required_argument, NULL, 'b'},
+ {"prefix", required_argument, NULL, 'P'},
+ {"user", required_argument, NULL, 'u'},
+ {"group", required_argument, NULL, 'g'},
+ {"magic", required_argument, NULL, 'T'},
+ {"rand", no_argument, NULL, 'r'},
+ {"rfraw", no_argument, NULL, 'R'},
+ {"mmap", no_argument, NULL, 'm'},
+ {"sg", no_argument, NULL, 'G'},
+ {"clrw", no_argument, NULL, 'c'},
+ {"jumbo-support", no_argument, NULL, 'J'},
+ {"no-promisc", no_argument, NULL, 'M'},
+ {"prio-high", no_argument, NULL, 'H'},
+ {"notouch-irq", no_argument, NULL, 'Q'},
+ {"dump-pcap-types", no_argument, NULL, 'D'},
+ {"dump-bpf", no_argument, NULL, 'B'},
+ {"silent", no_argument, NULL, 's'},
+ {"less", no_argument, NULL, 'q'},
+ {"hex", no_argument, NULL, 'X'},
+ {"ascii", no_argument, NULL, 'l'},
+ {"no-sock-mem", no_argument, NULL, 'A'},
+ {"update", no_argument, NULL, 'U'},
+ {"verbose", no_argument, NULL, 'V'},
+ {"version", no_argument, NULL, 'v'},
+ {"help", no_argument, NULL, 'h'},
+ {NULL, 0, NULL, 0}
+};
+
+static int tx_sock;
+
+static struct itimerval itimer;
+
+static unsigned long frame_count_max = 0, interval = TX_KERNEL_PULL_INT;
+
+#define __pcap_io pcap_ops[ctx->pcap]
+
+static void signal_handler(int number)
+{
+ switch (number) {
+ case SIGINT:
+ sigint = 1;
+ case SIGHUP:
+ default:
+ break;
+ }
+}
+
+static void timer_elapsed(int unused)
+{
+ set_itimer_interval_value(&itimer, 0, interval);
+ pull_and_flush_tx_ring(tx_sock);
+ setitimer(ITIMER_REAL, &itimer, NULL);
+}
+
+static void timer_next_dump(int unused)
+{
+ set_itimer_interval_value(&itimer, interval, 0);
+ next_dump = true;
+ setitimer(ITIMER_REAL, &itimer, NULL);
+}
+
+static inline bool dump_to_pcap(struct ctx *ctx)
+{
+ return ctx->dump;
+}
+
+static void pcap_to_xmit(struct ctx *ctx)
+{
+ __label__ out;
+ uint8_t *out = NULL;
+ int irq, ifindex, fd = 0, ret;
+ unsigned int size, it = 0;
+ unsigned long trunced = 0;
+ struct ring tx_ring;
+ struct frame_map *hdr;
+ struct sock_fprog bpf_ops;
+ struct timeval start, end, diff;
+ pcap_pkthdr_t phdr;
+
+ if (!device_up_and_running(ctx->device_out) && !ctx->rfraw)
+ panic("Device not up and running!\n");
+
+ bug_on(!__pcap_io);
+
+ tx_sock = pf_socket();
+
+ if (!strncmp("-", ctx->device_in, strlen("-"))) {
+ fd = dup(fileno(stdin));
+ close(fileno(stdin));
+ if (ctx->pcap == PCAP_OPS_MM)
+ ctx->pcap = PCAP_OPS_SG;
+ } else {
+ fd = open_or_die(ctx->device_in, O_RDONLY | O_LARGEFILE | O_NOATIME);
+ }
+
+ ret = __pcap_io->pull_fhdr_pcap(fd, &ctx->magic, &ctx->link_type);
+ if (ret)
+ panic("Error reading pcap header!\n");
+
+ if (__pcap_io->prepare_access_pcap) {
+ ret = __pcap_io->prepare_access_pcap(fd, PCAP_MODE_RD, ctx->jumbo);
+ if (ret)
+ panic("Error prepare reading pcap!\n");
+ }
+
+ fmemset(&tx_ring, 0, sizeof(tx_ring));
+ fmemset(&bpf_ops, 0, sizeof(bpf_ops));
+
+ if (ctx->rfraw) {
+ ctx->device_trans = xstrdup(ctx->device_out);
+ xfree(ctx->device_out);
+
+ enter_rfmon_mac80211(ctx->device_trans, &ctx->device_out);
+ if (ctx->link_type != LINKTYPE_IEEE802_11)
+ panic("Wrong linktype of pcap!\n");
+ }
+
+ ifindex = device_ifindex(ctx->device_out);
+
+ size = ring_size(ctx->device_out, ctx->reserve_size);
+
+ bpf_parse_rules(ctx->filter, &bpf_ops, ctx->link_type);
+ if (ctx->dump_bpf)
+ bpf_dump_all(&bpf_ops);
+
+ set_packet_loss_discard(tx_sock);
+ set_sockopt_hwtimestamp(tx_sock, ctx->device_out);
+
+ setup_tx_ring_layout(tx_sock, &tx_ring, size, ctx->jumbo);
+ create_tx_ring(tx_sock, &tx_ring, ctx->verbose);
+ mmap_tx_ring(tx_sock, &tx_ring);
+ alloc_tx_ring_frames(&tx_ring);
+ bind_tx_ring(tx_sock, &tx_ring, ifindex);
+
+ dissector_init_all(ctx->print_mode);
+
+ if (ctx->cpu >= 0 && ifindex > 0) {
+ irq = device_irq_number(ctx->device_out);
+ device_bind_irq_to_cpu(irq, ctx->cpu);
+
+ if (ctx->verbose)
+ printf("IRQ: %s:%d > CPU%d\n",
+ ctx->device_out, irq, ctx->cpu);
+ }
+
+ if (ctx->kpull)
+ interval = ctx->kpull;
+
+ set_itimer_interval_value(&itimer, 0, interval);
+ setitimer(ITIMER_REAL, &itimer, NULL);
+
+ drop_privileges(ctx->enforce, ctx->uid, ctx->gid);
+
+ printf("Running! Hang up with ^C!\n\n");
+ fflush(stdout);
+
+ bug_on(gettimeofday(&start, NULL));
+
+ while (likely(sigint == 0)) {
+ while (user_may_pull_from_tx(tx_ring.frames[it].iov_base)) {
+ hdr = tx_ring.frames[it].iov_base;
+ out = ((uint8_t *) hdr) + TPACKET2_HDRLEN - sizeof(struct sockaddr_ll);
+
+ do {
+ ret = __pcap_io->read_pcap(fd, &phdr, ctx->magic, out,
+ ring_frame_size(&tx_ring));
+ if (unlikely(ret <= 0))
+ goto out;
+
+ if (ring_frame_size(&tx_ring) <
+ pcap_get_length(&phdr, ctx->magic)) {
+ pcap_set_length(&phdr, ctx->magic,
+ ring_frame_size(&tx_ring));
+ trunced++;
+ }
+ } while (ctx->filter &&
+ !bpf_run_filter(&bpf_ops, out,
+ pcap_get_length(&phdr, ctx->magic)));
+
+ pcap_pkthdr_to_tpacket_hdr(&phdr, ctx->magic, &hdr->tp_h, &hdr->s_ll);
+
+ ctx->tx_bytes += hdr->tp_h.tp_len;;
+ ctx->tx_packets++;
+
+ show_frame_hdr(hdr, ctx->print_mode);
+
+ dissector_entry_point(out, hdr->tp_h.tp_snaplen,
+ ctx->link_type, ctx->print_mode);
+
+ kernel_may_pull_from_tx(&hdr->tp_h);
+
+ it++;
+ if (it >= tx_ring.layout.tp_frame_nr)
+ it = 0;
+
+ if (unlikely(sigint == 1))
+ break;
+
+ if (frame_count_max != 0) {
+ if (ctx->tx_packets >= frame_count_max) {
+ sigint = 1;
+ break;
+ }
+ }
+ }
+ }
+
+ out:
+
+ bug_on(gettimeofday(&end, NULL));
+ timersub(&end, &start, &diff);
+
+ bpf_release(&bpf_ops);
+
+ dissector_cleanup_all();
+ destroy_tx_ring(tx_sock, &tx_ring);
+
+ if (ctx->rfraw)
+ leave_rfmon_mac80211(ctx->device_trans, ctx->device_out);
+
+ if (__pcap_io->prepare_close_pcap)
+ __pcap_io->prepare_close_pcap(fd, PCAP_MODE_RD);
+
+ if (strncmp("-", ctx->device_in, strlen("-")))
+ close(fd);
+ else
+ dup2(fd, fileno(stdin));
+
+ close(tx_sock);
+
+ fflush(stdout);
+ printf("\n");
+ printf("\r%12lu packets outgoing\n", ctx->tx_packets);
+ printf("\r%12lu packets truncated in file\n", trunced);
+ printf("\r%12lu bytes outgoing\n", ctx->tx_bytes);
+ printf("\r%12lu sec, %lu usec in total\n", diff.tv_sec, diff.tv_usec);
+}
+
+static void receive_to_xmit(struct ctx *ctx)
+{
+ short ifflags = 0;
+ uint8_t *in, *out;
+ int rx_sock, ifindex_in, ifindex_out;
+ unsigned int size_in, size_out, it_in = 0, it_out = 0;
+ unsigned long frame_count = 0;
+ struct frame_map *hdr_in, *hdr_out;
+ struct ring tx_ring, rx_ring;
+ struct pollfd rx_poll;
+ struct sock_fprog bpf_ops;
+
+ if (!strncmp(ctx->device_in, ctx->device_out, IFNAMSIZ))
+ panic("Ingress/egress devices must be different!\n");
+ if (!device_up_and_running(ctx->device_out))
+ panic("Egress device not up and running!\n");
+ if (!device_up_and_running(ctx->device_in))
+ panic("Ingress device not up and running!\n");
+
+ rx_sock = pf_socket();
+ tx_sock = pf_socket();
+
+ fmemset(&tx_ring, 0, sizeof(tx_ring));
+ fmemset(&rx_ring, 0, sizeof(rx_ring));
+ fmemset(&rx_poll, 0, sizeof(rx_poll));
+ fmemset(&bpf_ops, 0, sizeof(bpf_ops));
+
+ ifindex_in = device_ifindex(ctx->device_in);
+ ifindex_out = device_ifindex(ctx->device_out);
+
+ size_in = ring_size(ctx->device_in, ctx->reserve_size);
+ size_out = ring_size(ctx->device_out, ctx->reserve_size);
+
+ enable_kernel_bpf_jit_compiler();
+
+ bpf_parse_rules(ctx->filter, &bpf_ops, ctx->link_type);
+ if (ctx->dump_bpf)
+ bpf_dump_all(&bpf_ops);
+ bpf_attach_to_sock(rx_sock, &bpf_ops);
+
+ setup_rx_ring_layout(rx_sock, &rx_ring, size_in, ctx->jumbo);
+ create_rx_ring(rx_sock, &rx_ring, ctx->verbose);
+ mmap_rx_ring(rx_sock, &rx_ring);
+ alloc_rx_ring_frames(&rx_ring);
+ bind_rx_ring(rx_sock, &rx_ring, ifindex_in);
+ prepare_polling(rx_sock, &rx_poll);
+
+ set_packet_loss_discard(tx_sock);
+ setup_tx_ring_layout(tx_sock, &tx_ring, size_out, ctx->jumbo);
+ create_tx_ring(tx_sock, &tx_ring, ctx->verbose);
+ mmap_tx_ring(tx_sock, &tx_ring);
+ alloc_tx_ring_frames(&tx_ring);
+ bind_tx_ring(tx_sock, &tx_ring, ifindex_out);
+
+ dissector_init_all(ctx->print_mode);
+
+ if (ctx->promiscuous)
+ ifflags = enter_promiscuous_mode(ctx->device_in);
+
+ if (ctx->kpull)
+ interval = ctx->kpull;
+
+ set_itimer_interval_value(&itimer, 0, interval);
+ setitimer(ITIMER_REAL, &itimer, NULL);
+
+ drop_privileges(ctx->enforce, ctx->uid, ctx->gid);
+
+ printf("Running! Hang up with ^C!\n\n");
+ fflush(stdout);
+
+ while (likely(sigint == 0)) {
+ while (user_may_pull_from_rx(rx_ring.frames[it_in].iov_base)) {
+ __label__ next;
+
+ hdr_in = rx_ring.frames[it_in].iov_base;
+ in = ((uint8_t *) hdr_in) + hdr_in->tp_h.tp_mac;
+
+ frame_count++;
+
+ if (ctx->packet_type != -1)
+ if (ctx->packet_type != hdr_in->s_ll.sll_pkttype)
+ goto next;
+
+ hdr_out = tx_ring.frames[it_out].iov_base;
+ out = ((uint8_t *) hdr_out) + TPACKET2_HDRLEN - sizeof(struct sockaddr_ll);
+
+ for (; !user_may_pull_from_tx(tx_ring.frames[it_out].iov_base) &&
+ likely(!sigint);) {
+ if (ctx->randomize)
+ next_rnd_slot(&it_out, &tx_ring);
+ else {
+ it_out++;
+ if (it_out >= tx_ring.layout.tp_frame_nr)
+ it_out = 0;
+ }
+
+ hdr_out = tx_ring.frames[it_out].iov_base;
+ out = ((uint8_t *) hdr_out) + TPACKET2_HDRLEN - sizeof(struct sockaddr_ll);
+ }
+
+ tpacket_hdr_clone(&hdr_out->tp_h, &hdr_in->tp_h);
+ fmemcpy(out, in, hdr_in->tp_h.tp_len);
+
+ kernel_may_pull_from_tx(&hdr_out->tp_h);
+ if (ctx->randomize)
+ next_rnd_slot(&it_out, &tx_ring);
+ else {
+ it_out++;
+ if (it_out >= tx_ring.layout.tp_frame_nr)
+ it_out = 0;
+ }
+
+ show_frame_hdr(hdr_in, ctx->print_mode);
+
+ dissector_entry_point(in, hdr_in->tp_h.tp_snaplen,
+ ctx->link_type, ctx->print_mode);
+
+ if (frame_count_max != 0) {
+ if (frame_count >= frame_count_max) {
+ sigint = 1;
+ break;
+ }
+ }
+
+ next:
+
+ kernel_may_pull_from_rx(&hdr_in->tp_h);
+
+ it_in++;
+ if (it_in >= rx_ring.layout.tp_frame_nr)
+ it_in = 0;
+
+ if (unlikely(sigint == 1))
+ goto out;
+ }
+
+ poll(&rx_poll, 1, -1);
+ }
+
+ out:
+
+ sock_print_net_stats(rx_sock, 0);
+
+ bpf_release(&bpf_ops);
+
+ dissector_cleanup_all();
+
+ destroy_tx_ring(tx_sock, &tx_ring);
+ destroy_rx_ring(rx_sock, &rx_ring);
+
+ if (ctx->promiscuous)
+ leave_promiscuous_mode(ctx->device_in, ifflags);
+
+ close(tx_sock);
+ close(rx_sock);
+}
+
+static void translate_pcap_to_txf(int fdo, uint8_t *out, size_t len)
+{
+ size_t bytes_done = 0;
+ char bout[80];
+
+ slprintf(bout, sizeof(bout), "{\n ");
+ write_or_die(fdo, bout, strlen(bout));
+
+ while (bytes_done < len) {
+ slprintf(bout, sizeof(bout), "0x%02x, ", out[bytes_done]);
+ write_or_die(fdo, bout, strlen(bout));
+
+ bytes_done++;
+
+ if (bytes_done % 10 == 0) {
+ slprintf(bout, sizeof(bout), "\n");
+ write_or_die(fdo, bout, strlen(bout));
+
+ if (bytes_done < len) {
+ slprintf(bout, sizeof(bout), " ");
+ write_or_die(fdo, bout, strlen(bout));
+ }
+ }
+ }
+ if (bytes_done % 10 != 0) {
+ slprintf(bout, sizeof(bout), "\n");
+ write_or_die(fdo, bout, strlen(bout));
+ }
+
+ slprintf(bout, sizeof(bout), "}\n\n");
+ write_or_die(fdo, bout, strlen(bout));
+}
+
+static void read_pcap(struct ctx *ctx)
+{
+ __label__ out;
+ uint8_t *out;
+ int ret, fd, fdo = 0;
+ unsigned long trunced = 0;
+ size_t out_len;
+ pcap_pkthdr_t phdr;
+ struct sock_fprog bpf_ops;
+ struct frame_map fm;
+ struct timeval start, end, diff;
+ struct sockaddr_ll sll;
+
+ bug_on(!__pcap_io);
+
+ if (!strncmp("-", ctx->device_in, strlen("-"))) {
+ fd = dup(fileno(stdin));
+ close(fileno(stdin));
+ if (ctx->pcap == PCAP_OPS_MM)
+ ctx->pcap = PCAP_OPS_SG;
+ } else {
+ fd = open_or_die(ctx->device_in, O_RDONLY | O_LARGEFILE | O_NOATIME);
+ }
+
+ ret = __pcap_io->pull_fhdr_pcap(fd, &ctx->magic, &ctx->link_type);
+ if (ret)
+ panic("Error reading pcap header!\n");
+
+ if (__pcap_io->prepare_access_pcap) {
+ ret = __pcap_io->prepare_access_pcap(fd, PCAP_MODE_RD, ctx->jumbo);
+ if (ret)
+ panic("Error prepare reading pcap!\n");
+ }
+
+ fmemset(&fm, 0, sizeof(fm));
+ fmemset(&bpf_ops, 0, sizeof(bpf_ops));
+
+ bpf_parse_rules(ctx->filter, &bpf_ops, ctx->link_type);
+ if (ctx->dump_bpf)
+ bpf_dump_all(&bpf_ops);
+
+ dissector_init_all(ctx->print_mode);
+
+ out_len = round_up(1024 * 1024, PAGE_SIZE);
+ out = xmalloc_aligned(out_len, CO_CACHE_LINE_SIZE);
+
+ if (ctx->device_out) {
+ if (!strncmp("-", ctx->device_out, strlen("-"))) {
+ fdo = dup(fileno(stdout));
+ close(fileno(stdout));
+ } else {
+ fdo = open_or_die_m(ctx->device_out, O_RDWR | O_CREAT |
+ O_TRUNC | O_LARGEFILE, DEFFILEMODE);
+ }
+ }
+
+ drop_privileges(ctx->enforce, ctx->uid, ctx->gid);
+
+ printf("Running! Hang up with ^C!\n\n");
+ fflush(stdout);
+
+ bug_on(gettimeofday(&start, NULL));
+
+ while (likely(sigint == 0)) {
+ do {
+ ret = __pcap_io->read_pcap(fd, &phdr, ctx->magic,
+ out, out_len);
+ if (unlikely(ret < 0))
+ goto out;
+
+ if (unlikely(pcap_get_length(&phdr, ctx->magic) == 0)) {
+ trunced++;
+ continue;
+ }
+
+ if (unlikely(pcap_get_length(&phdr, ctx->magic) > out_len)) {
+ pcap_set_length(&phdr, ctx->magic, out_len);
+ trunced++;
+ }
+ } while (ctx->filter &&
+ !bpf_run_filter(&bpf_ops, out,
+ pcap_get_length(&phdr, ctx->magic)));
+
+ pcap_pkthdr_to_tpacket_hdr(&phdr, ctx->magic, &fm.tp_h, &sll);
+
+ ctx->tx_bytes += fm.tp_h.tp_len;
+ ctx->tx_packets++;
+
+ show_frame_hdr(&fm, ctx->print_mode);
+
+ dissector_entry_point(out, fm.tp_h.tp_snaplen,
+ ctx->link_type, ctx->print_mode);
+
+ if (ctx->device_out)
+ translate_pcap_to_txf(fdo, out, fm.tp_h.tp_snaplen);
+
+ if (frame_count_max != 0) {
+ if (ctx->tx_packets >= frame_count_max) {
+ sigint = 1;
+ break;
+ }
+ }
+ }
+
+ out:
+
+ bug_on(gettimeofday(&end, NULL));
+ timersub(&end, &start, &diff);
+
+ bpf_release(&bpf_ops);
+
+ dissector_cleanup_all();
+
+ if (__pcap_io->prepare_close_pcap)
+ __pcap_io->prepare_close_pcap(fd, PCAP_MODE_RD);
+
+ xfree(out);
+
+ fflush(stdout);
+ printf("\n");
+ printf("\r%12lu packets outgoing\n", ctx->tx_packets);
+ printf("\r%12lu packets truncated in file\n", trunced);
+ printf("\r%12lu bytes outgoing\n", ctx->tx_bytes);
+ printf("\r%12lu sec, %lu usec in total\n", diff.tv_sec, diff.tv_usec);
+
+ if (strncmp("-", ctx->device_in, strlen("-")))
+ close(fd);
+ else
+ dup2(fd, fileno(stdin));
+
+ if (ctx->device_out) {
+ if (strncmp("-", ctx->device_out, strlen("-")))
+ close(fdo);
+ else
+ dup2(fdo, fileno(stdout));
+ }
+}
+
+static void finish_multi_pcap_file(struct ctx *ctx, int fd)
+{
+ __pcap_io->fsync_pcap(fd);
+
+ if (__pcap_io->prepare_close_pcap)
+ __pcap_io->prepare_close_pcap(fd, PCAP_MODE_WR);
+
+ close(fd);
+
+ fmemset(&itimer, 0, sizeof(itimer));
+ setitimer(ITIMER_REAL, &itimer, NULL);
+}
+
+static int next_multi_pcap_file(struct ctx *ctx, int fd)
+{
+ int ret;
+ char fname[512];
+
+ __pcap_io->fsync_pcap(fd);
+
+ if (__pcap_io->prepare_close_pcap)
+ __pcap_io->prepare_close_pcap(fd, PCAP_MODE_WR);
+
+ close(fd);
+
+ slprintf(fname, sizeof(fname), "%s/%s%lu.pcap", ctx->device_out,
+ ctx->prefix ? : "dump-", time(0));
+
+ fd = open_or_die_m(fname, O_RDWR | O_CREAT | O_TRUNC |
+ O_LARGEFILE, DEFFILEMODE);
+
+ ret = __pcap_io->push_fhdr_pcap(fd, ctx->magic, ctx->link_type);
+ if (ret)
+ panic("Error writing pcap header!\n");
+
+ if (__pcap_io->prepare_access_pcap) {
+ ret = __pcap_io->prepare_access_pcap(fd, PCAP_MODE_WR, ctx->jumbo);
+ if (ret)
+ panic("Error prepare writing pcap!\n");
+ }
+
+ return fd;
+}
+
+static int begin_multi_pcap_file(struct ctx *ctx)
+{
+ int fd, ret;
+ char fname[256];
+
+ bug_on(!__pcap_io);
+
+ if (ctx->device_out[strlen(ctx->device_out) - 1] == '/')
+ ctx->device_out[strlen(ctx->device_out) - 1] = 0;
+
+ slprintf(fname, sizeof(fname), "%s/%s%lu.pcap", ctx->device_out,
+ ctx->prefix ? : "dump-", time(0));
+
+ fd = open_or_die_m(fname, O_RDWR | O_CREAT | O_TRUNC |
+ O_LARGEFILE, DEFFILEMODE);
+
+ ret = __pcap_io->push_fhdr_pcap(fd, ctx->magic, ctx->link_type);
+ if (ret)
+ panic("Error writing pcap header!\n");
+
+ if (__pcap_io->prepare_access_pcap) {
+ ret = __pcap_io->prepare_access_pcap(fd, PCAP_MODE_WR, ctx->jumbo);
+ if (ret)
+ panic("Error prepare writing pcap!\n");
+ }
+
+ if (ctx->dump_mode == DUMP_INTERVAL_TIME) {
+ interval = ctx->dump_interval;
+
+ set_itimer_interval_value(&itimer, interval, 0);
+ setitimer(ITIMER_REAL, &itimer, NULL);
+ } else {
+ interval = 0;
+ }
+
+ return fd;
+}
+
+static void finish_single_pcap_file(struct ctx *ctx, int fd)
+{
+ __pcap_io->fsync_pcap(fd);
+
+ if (__pcap_io->prepare_close_pcap)
+ __pcap_io->prepare_close_pcap(fd, PCAP_MODE_WR);
+
+ if (strncmp("-", ctx->device_out, strlen("-")))
+ close(fd);
+ else
+ dup2(fd, fileno(stdout));
+}
+
+static int begin_single_pcap_file(struct ctx *ctx)
+{
+ int fd, ret;
+
+ bug_on(!__pcap_io);
+
+ if (!strncmp("-", ctx->device_out, strlen("-"))) {
+ fd = dup(fileno(stdout));
+ close(fileno(stdout));
+ if (ctx->pcap == PCAP_OPS_MM)
+ ctx->pcap = PCAP_OPS_SG;
+ } else {
+ fd = open_or_die_m(ctx->device_out,
+ O_RDWR | O_CREAT | O_TRUNC |
+ O_LARGEFILE, DEFFILEMODE);
+ }
+
+ ret = __pcap_io->push_fhdr_pcap(fd, ctx->magic, ctx->link_type);
+ if (ret)
+ panic("Error writing pcap header!\n");
+
+ if (__pcap_io->prepare_access_pcap) {
+ ret = __pcap_io->prepare_access_pcap(fd, PCAP_MODE_WR, ctx->jumbo);
+ if (ret)
+ panic("Error prepare writing pcap!\n");
+ }
+
+ return fd;
+}
+
+static void print_pcap_file_stats(int sock, struct ctx *ctx, unsigned long skipped)
+{
+ unsigned long good, bad;
+ struct tpacket_stats kstats;
+ socklen_t slen = sizeof(kstats);
+
+ fmemset(&kstats, 0, sizeof(kstats));
+ getsockopt(sock, SOL_PACKET, PACKET_STATISTICS, &kstats, &slen);
+
+ if (ctx->print_mode == PRINT_NONE) {
+ good = kstats.tp_packets - kstats.tp_drops - skipped;
+ bad = kstats.tp_drops + skipped;
+
+ printf(".(+%lu/-%lu)", good, bad);
+ fflush(stdout);
+ }
+}
+
+static void recv_only_or_dump(struct ctx *ctx)
+{
+ uint8_t *packet;
+ short ifflags = 0;
+ int sock, irq, ifindex, fd = 0, ret;
+ unsigned int size, it = 0;
+ unsigned long frame_count = 0, skipped = 0;
+ struct ring rx_ring;
+ struct pollfd rx_poll;
+ struct frame_map *hdr;
+ struct sock_fprog bpf_ops;
+ struct timeval start, end, diff;
+ pcap_pkthdr_t phdr;
+
+ if (!device_up_and_running(ctx->device_in) && !ctx->rfraw)
+ panic("Device not up and running!\n");
+
+ sock = pf_socket();
+
+ if (ctx->rfraw) {
+ ctx->device_trans = xstrdup(ctx->device_in);
+ xfree(ctx->device_in);
+
+ enter_rfmon_mac80211(ctx->device_trans, &ctx->device_in);
+ ctx->link_type = LINKTYPE_IEEE802_11;
+ }
+
+ fmemset(&rx_ring, 0, sizeof(rx_ring));
+ fmemset(&rx_poll, 0, sizeof(rx_poll));
+ fmemset(&bpf_ops, 0, sizeof(bpf_ops));
+
+ ifindex = device_ifindex(ctx->device_in);
+
+ size = ring_size(ctx->device_in, ctx->reserve_size);
+
+ enable_kernel_bpf_jit_compiler();
+
+ bpf_parse_rules(ctx->filter, &bpf_ops, ctx->link_type);
+ if (ctx->dump_bpf)
+ bpf_dump_all(&bpf_ops);
+ bpf_attach_to_sock(sock, &bpf_ops);
+
+ set_sockopt_hwtimestamp(sock, ctx->device_in);
+
+ setup_rx_ring_layout(sock, &rx_ring, size, ctx->jumbo);
+ create_rx_ring(sock, &rx_ring, ctx->verbose);
+ mmap_rx_ring(sock, &rx_ring);
+ alloc_rx_ring_frames(&rx_ring);
+ bind_rx_ring(sock, &rx_ring, ifindex);
+
+ prepare_polling(sock, &rx_poll);
+ dissector_init_all(ctx->print_mode);
+
+ if (ctx->cpu >= 0 && ifindex > 0) {
+ irq = device_irq_number(ctx->device_in);
+ device_bind_irq_to_cpu(irq, ctx->cpu);
+
+ if (ctx->verbose)
+ printf("IRQ: %s:%d > CPU%d\n",
+ ctx->device_in, irq, ctx->cpu);
+ }
+
+ if (ctx->promiscuous)
+ ifflags = enter_promiscuous_mode(ctx->device_in);
+
+ drop_privileges(ctx->enforce, ctx->uid, ctx->gid);
+
+ if (dump_to_pcap(ctx)) {
+ __label__ try_file;
+ struct stat stats;
+
+ fmemset(&stats, 0, sizeof(stats));
+ ret = stat(ctx->device_out, &stats);
+ if (ret < 0) {
+ ctx->dump_dir = 0;
+ goto try_file;
+ }
+
+ ctx->dump_dir = S_ISDIR(stats.st_mode);
+ if (ctx->dump_dir) {
+ fd = begin_multi_pcap_file(ctx);
+ } else {
+ try_file:
+ fd = begin_single_pcap_file(ctx);
+ }
+ }
+
+ printf("Running! Hang up with ^C!\n\n");
+ fflush(stdout);
+
+ bug_on(gettimeofday(&start, NULL));
+
+ while (likely(sigint == 0)) {
+ while (user_may_pull_from_rx(rx_ring.frames[it].iov_base)) {
+ __label__ next;
+
+ hdr = rx_ring.frames[it].iov_base;
+ packet = ((uint8_t *) hdr) + hdr->tp_h.tp_mac;
+ frame_count++;
+
+ if (ctx->packet_type != -1)
+ if (ctx->packet_type != hdr->s_ll.sll_pkttype)
+ goto next;
+
+ if (unlikely(ring_frame_size(&rx_ring) < hdr->tp_h.tp_snaplen)) {
+ skipped++;
+ goto next;
+ }
+
+ if (dump_to_pcap(ctx)) {
+ tpacket_hdr_to_pcap_pkthdr(&hdr->tp_h, &hdr->s_ll, &phdr, ctx->magic);
+
+ ret = __pcap_io->write_pcap(fd, &phdr, ctx->magic, packet,
+ pcap_get_length(&phdr, ctx->magic));
+ if (unlikely(ret != pcap_get_total_length(&phdr, ctx->magic)))
+ panic("Write error to pcap!\n");
+ }
+
+ show_frame_hdr(hdr, ctx->print_mode);
+
+ dissector_entry_point(packet, hdr->tp_h.tp_snaplen,
+ ctx->link_type, ctx->print_mode);
+
+ if (frame_count_max != 0) {
+ if (frame_count >= frame_count_max) {
+ sigint = 1;
+ break;
+ }
+ }
+
+ next:
+
+ kernel_may_pull_from_rx(&hdr->tp_h);
+
+ it++;
+ if (it >= rx_ring.layout.tp_frame_nr)
+ it = 0;
+
+ if (unlikely(sigint == 1))
+ break;
+
+ if (dump_to_pcap(ctx)) {
+ if (ctx->dump_mode == DUMP_INTERVAL_SIZE) {
+ interval += hdr->tp_h.tp_snaplen;
+
+ if (interval > ctx->dump_interval) {
+ next_dump = true;
+ interval = 0;
+ }
+ }
+
+ if (next_dump) {
+ fd = next_multi_pcap_file(ctx, fd);
+ next_dump = false;
+
+ if (ctx->verbose)
+ print_pcap_file_stats(sock, ctx, skipped);
+ }
+ }
+ }
+
+ poll(&rx_poll, 1, -1);
+ }
+
+ bug_on(gettimeofday(&end, NULL));
+ timersub(&end, &start, &diff);
+
+ if (!(ctx->dump_dir && ctx->print_mode == PRINT_NONE)) {
+ sock_print_net_stats(sock, skipped);
+
+ printf("\r%12lu sec, %lu usec in total\n",
+ diff.tv_sec, diff.tv_usec);
+ } else {
+ printf("\n\n");
+ fflush(stdout);
+ }
+
+ bpf_release(&bpf_ops);
+ dissector_cleanup_all();
+ destroy_rx_ring(sock, &rx_ring);
+
+ if (ctx->promiscuous)
+ leave_promiscuous_mode(ctx->device_in, ifflags);
+
+ if (ctx->rfraw)
+ leave_rfmon_mac80211(ctx->device_trans, ctx->device_in);
+
+ if (dump_to_pcap(ctx)) {
+ if (ctx->dump_dir)
+ finish_multi_pcap_file(ctx, fd);
+ else
+ finish_single_pcap_file(ctx, fd);
+ }
+
+ close(sock);
+}
+
+static void help(void)
+{
+ printf("\nnetsniff-ng %s, the packet sniffing beast\n", VERSION_STRING);
+ puts("http://www.netsniff-ng.org\n\n"
+ "Usage: netsniff-ng [options] [filter-expression]\n"
+ "Options:\n"
+ " -i|-d|--dev|--in <dev|pcap|-> Input source as netdev, pcap or pcap stdin\n"
+ " -o|--out <dev|pcap|dir|cfg|-> Output sink as netdev, pcap, directory, trafgen, or stdout\n"
+ " -f|--filter <bpf-file|expr> Use BPF filter file from bpfc or tcpdump-like expression\n"
+ " -t|--type <type> Filter for: host|broadcast|multicast|others|outgoing\n"
+ " -F|--interval <size|time> Dump interval if -o is a dir: <num>KiB/MiB/GiB/s/sec/min/hrs\n"
+ " -J|--jumbo-support Support for 64KB Super Jumbo Frames (def: 2048B)\n"
+ " -R|--rfraw Capture or inject raw 802.11 frames\n"
+ " -n|--num <0|uint> Number of packets until exit (def: 0)\n"
+ " -P|--prefix <name> Prefix for pcaps stored in directory\n"
+ " -T|--magic <pcap-magic> Pcap magic number/pcap format to store, see -D\n"
+ " -D|--dump-pcap-types Dump pcap types and magic numbers and quit\n"
+ " -B|--dump-bpf Dump generated BPF assembly\n"
+ " -r|--rand Randomize packet forwarding order (dev->dev)\n"
+ " -M|--no-promisc No promiscuous mode for netdev\n"
+ " -A|--no-sock-mem Don't tune core socket memory\n"
+ " -m|--mmap Mmap(2) pcap file i.e., for replaying pcaps\n"
+ " -G|--sg Scatter/gather pcap file I/O\n"
+ " -c|--clrw Use slower read(2)/write(2) I/O\n"
+ " -S|--ring-size <size> Specify ring size to: <num>KiB/MiB/GiB\n"
+ " -k|--kernel-pull <uint> Kernel pull from user interval in us (def: 10us)\n"
+ " -b|--bind-cpu <cpu> Bind to specific CPU\n"
+ " -u|--user <userid> Drop privileges and change to userid\n"
+ " -g|--group <groupid> Drop privileges and change to groupid\n"
+ " -H|--prio-high Make this high priority process\n"
+ " -Q|--notouch-irq Do not touch IRQ CPU affinity of NIC\n"
+ " -s|--silent Do not print captured packets\n"
+ " -q|--less Print less-verbose packet information\n"
+ " -X|--hex Print packet data in hex format\n"
+ " -l|--ascii Print human-readable packet data\n"
+ " -U|--update Update GeoIP databases\n"
+ " -V|--verbose Be more verbose\n"
+ " -v|--version Show version\n"
+ " -h|--help Guess what?!\n\n"
+ "Examples:\n"
+ " netsniff-ng --in eth0 --out dump.pcap -s -T 0xa1b2c3d4 --b 0 tcp or udp\n"
+ " netsniff-ng --in wlan0 --rfraw --out dump.pcap --silent --bind-cpu 0\n"
+ " netsniff-ng --in dump.pcap --mmap --out eth0 -k1000 --silent --bind-cpu 0\n"
+ " netsniff-ng --in dump.pcap --out dump.cfg --silent --bind-cpu 0\n"
+ " netsniff-ng --in eth0 --out eth1 --silent --bind-cpu 0 --type host\n"
+ " netsniff-ng --in eth1 --out /opt/probe/ -s -m -J --interval 100MiB -b 0\n"
+ " netsniff-ng --in vlan0 --out dump.pcap -c -u `id -u bob` -g `id -g bob`\n"
+ " netsniff-ng --in any --filter http.bpf --jumbo-support --ascii -V\n\n"
+ "Note:\n"
+ " For introducing bit errors, delays with random variation and more\n"
+ " while replaying pcaps, make use of tc(8) with its disciplines (e.g. netem).\n\n"
+ "Please report bugs to <bugs@netsniff-ng.org>\n"
+ "Copyright (C) 2009-2013 Daniel Borkmann <dborkma@tik.ee.ethz.ch>\n"
+ "Copyright (C) 2009-2012 Emmanuel Roullit <emmanuel.roullit@gmail.com>\n"
+ "Copyright (C) 2012 Markus Amend <markus@netsniff-ng.org>\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("\nnetsniff-ng %s, the packet sniffing beast\n", VERSION_STRING);
+ puts("http://www.netsniff-ng.org\n\n"
+ "Please report bugs to <bugs@netsniff-ng.org>\n"
+ "Copyright (C) 2009-2013 Daniel Borkmann <dborkma@tik.ee.ethz.ch>\n"
+ "Copyright (C) 2009-2012 Emmanuel Roullit <emmanuel.roullit@gmail.com>\n"
+ "Copyright (C) 2012 Markus Amend <markus@netsniff-ng.org>\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)
+{
+ char *ptr;
+ int c, i, j, cpu_tmp, opt_index, ops_touched = 0, vals[4] = {0};
+ bool prio_high = false, setsockmem = true;
+ void (*main_loop)(struct ctx *ctx) = NULL;
+ struct ctx ctx = {
+ .link_type = LINKTYPE_EN10MB,
+ .print_mode = PRINT_NORM,
+ .cpu = -1,
+ .packet_type = -1,
+ .promiscuous = true,
+ .randomize = false,
+ .pcap = PCAP_OPS_SG,
+ .dump_interval = 60,
+ .dump_mode = DUMP_INTERVAL_TIME,
+ .uid = getuid(),
+ .gid = getgid(),
+ .magic = ORIGINAL_TCPDUMP_MAGIC,
+ };
+
+ srand(time(NULL));
+
+ while ((c = getopt_long(argc, argv, short_options, long_options,
+ &opt_index)) != EOF) {
+ switch (c) {
+ case 'd':
+ case 'i':
+ ctx.device_in = xstrdup(optarg);
+ break;
+ case 'o':
+ ctx.device_out = xstrdup(optarg);
+ break;
+ case 'P':
+ ctx.prefix = xstrdup(optarg);
+ break;
+ case 'R':
+ ctx.link_type = LINKTYPE_IEEE802_11;
+ ctx.rfraw = 1;
+ break;
+ case 'r':
+ ctx.randomize = true;
+ break;
+ case 'J':
+ ctx.jumbo = true;
+ break;
+ case 'T':
+ ctx.magic = (uint32_t) strtoul(optarg, NULL, 0);
+ pcap_check_magic(ctx.magic);
+ break;
+ case 'f':
+ ctx.filter = xstrdup(optarg);
+ break;
+ case 'M':
+ ctx.promiscuous = false;
+ break;
+ case 'A':
+ setsockmem = false;
+ break;
+ case 'u':
+ ctx.uid = strtoul(optarg, NULL, 0);
+ ctx.enforce = true;
+ break;
+ case 'g':
+ ctx.gid = strtoul(optarg, NULL, 0);
+ ctx.enforce = true;
+ break;
+ case 't':
+ if (!strncmp(optarg, "host", strlen("host")))
+ ctx.packet_type = PACKET_HOST;
+ else if (!strncmp(optarg, "broadcast", strlen("broadcast")))
+ ctx.packet_type = PACKET_BROADCAST;
+ else if (!strncmp(optarg, "multicast", strlen("multicast")))
+ ctx.packet_type = PACKET_MULTICAST;
+ else if (!strncmp(optarg, "others", strlen("others")))
+ ctx.packet_type = PACKET_OTHERHOST;
+ else if (!strncmp(optarg, "outgoing", strlen("outgoing")))
+ ctx.packet_type = PACKET_OUTGOING;
+ else
+ ctx.packet_type = -1;
+ break;
+ case 'S':
+ ptr = optarg;
+ ctx.reserve_size = 0;
+
+ for (j = i = strlen(optarg); i > 0; --i) {
+ if (!isdigit(optarg[j - i]))
+ break;
+ ptr++;
+ }
+
+ if (!strncmp(ptr, "KiB", strlen("KiB")))
+ ctx.reserve_size = 1 << 10;
+ else if (!strncmp(ptr, "MiB", strlen("MiB")))
+ ctx.reserve_size = 1 << 20;
+ else if (!strncmp(ptr, "GiB", strlen("GiB")))
+ ctx.reserve_size = 1 << 30;
+ else
+ panic("Syntax error in ring size param!\n");
+ *ptr = 0;
+
+ ctx.reserve_size *= strtol(optarg, NULL, 0);
+ break;
+ case 'b':
+ cpu_tmp = strtol(optarg, NULL, 0);
+
+ cpu_affinity(cpu_tmp);
+ if (ctx.cpu != -2)
+ ctx.cpu = cpu_tmp;
+ break;
+ case 'H':
+ prio_high = true;
+ break;
+ case 'c':
+ ctx.pcap = PCAP_OPS_RW;
+ ops_touched = 1;
+ break;
+ case 'm':
+ ctx.pcap = PCAP_OPS_MM;
+ ops_touched = 1;
+ break;
+ case 'G':
+ ctx.pcap = PCAP_OPS_SG;
+ ops_touched = 1;
+ break;
+ case 'Q':
+ ctx.cpu = -2;
+ break;
+ case 's':
+ ctx.print_mode = PRINT_NONE;
+ break;
+ case 'q':
+ ctx.print_mode = PRINT_LESS;
+ break;
+ case 'X':
+ ctx.print_mode =
+ (ctx.print_mode == PRINT_ASCII) ?
+ PRINT_HEX_ASCII : PRINT_HEX;
+ break;
+ case 'l':
+ ctx.print_mode =
+ (ctx.print_mode == PRINT_HEX) ?
+ PRINT_HEX_ASCII : PRINT_ASCII;
+ break;
+ case 'k':
+ ctx.kpull = strtol(optarg, NULL, 0);
+ break;
+ case 'n':
+ frame_count_max = strtol(optarg, NULL, 0);
+ break;
+ case 'F':
+ ptr = optarg;
+ ctx.dump_interval = 0;
+
+ for (j = i = strlen(optarg); i > 0; --i) {
+ if (!isdigit(optarg[j - i]))
+ break;
+ ptr++;
+ }
+
+ if (!strncmp(ptr, "KiB", strlen("KiB"))) {
+ ctx.dump_interval = 1 << 10;
+ ctx.dump_mode = DUMP_INTERVAL_SIZE;
+ } else if (!strncmp(ptr, "MiB", strlen("MiB"))) {
+ ctx.dump_interval = 1 << 20;
+ ctx.dump_mode = DUMP_INTERVAL_SIZE;
+ } else if (!strncmp(ptr, "GiB", strlen("GiB"))) {
+ ctx.dump_interval = 1 << 30;
+ ctx.dump_mode = DUMP_INTERVAL_SIZE;
+ } else if (!strncmp(ptr, "sec", strlen("sec"))) {
+ ctx.dump_interval = 1;
+ ctx.dump_mode = DUMP_INTERVAL_TIME;
+ } else if (!strncmp(ptr, "min", strlen("min"))) {
+ ctx.dump_interval = 60;
+ ctx.dump_mode = DUMP_INTERVAL_TIME;
+ } else if (!strncmp(ptr, "hrs", strlen("hrs"))) {
+ ctx.dump_interval = 60 * 60;
+ ctx.dump_mode = DUMP_INTERVAL_TIME;
+ } else if (!strncmp(ptr, "s", strlen("s"))) {
+ ctx.dump_interval = 1;
+ ctx.dump_mode = DUMP_INTERVAL_TIME;
+ } else {
+ panic("Syntax error in time/size param!\n");
+ }
+
+ *ptr = 0;
+ ctx.dump_interval *= strtol(optarg, NULL, 0);
+ break;
+ case 'V':
+ ctx.verbose = 1;
+ break;
+ case 'B':
+ ctx.dump_bpf = true;
+ break;
+ case 'D':
+ pcap_dump_type_features();
+ die();
+ break;
+ case 'U':
+ update_geoip();
+ die();
+ break;
+ case 'v':
+ version();
+ break;
+ case 'h':
+ help();
+ break;
+ case '?':
+ switch (optopt) {
+ case 'd':
+ case 'i':
+ case 'o':
+ case 'f':
+ case 't':
+ case 'P':
+ case 'F':
+ case 'n':
+ case 'S':
+ case 'b':
+ case 'k':
+ case 'T':
+ case 'u':
+ case 'g':
+ case 'e':
+ panic("Option -%c requires an argument!\n",
+ optopt);
+ default:
+ if (isprint(optopt))
+ printf("Unknown option character `0x%X\'!\n", optopt);
+ die();
+ }
+ default:
+ break;
+ }
+ }
+
+ if (!ctx.filter && optind != argc) {
+ int ret;
+ off_t offset = 0;
+
+ for (i = optind; i < argc; ++i) {
+ size_t alen = strlen(argv[i]) + 2;
+ size_t flen = ctx.filter ? strlen(ctx.filter) : 0;
+
+ ctx.filter = xrealloc(ctx.filter, 1, flen + alen);
+ ret = slprintf(ctx.filter + offset, strlen(argv[i]) + 2, "%s ", argv[i]);
+ if (ret < 0)
+ panic("Cannot concatenate filter string!\n");
+ else
+ offset += ret;
+ }
+ }
+
+ if (!ctx.device_in)
+ ctx.device_in = xstrdup("any");
+
+ register_signal(SIGINT, signal_handler);
+ register_signal(SIGHUP, signal_handler);
+
+ tprintf_init();
+
+ if (prio_high) {
+ set_proc_prio(get_default_proc_prio());
+ set_sched_status(get_default_sched_policy(), get_default_sched_prio());
+ }
+
+ if (ctx.device_in && (device_mtu(ctx.device_in) ||
+ !strncmp("any", ctx.device_in, strlen(ctx.device_in)))) {
+ if (!ctx.device_out) {
+ ctx.dump = 0;
+ main_loop = recv_only_or_dump;
+ } else if (device_mtu(ctx.device_out)) {
+ register_signal_f(SIGALRM, timer_elapsed, SA_SIGINFO);
+ main_loop = receive_to_xmit;
+ } else {
+ ctx.dump = 1;
+ register_signal_f(SIGALRM, timer_next_dump, SA_SIGINFO);
+ main_loop = recv_only_or_dump;
+ if (!ops_touched)
+ ctx.pcap = PCAP_OPS_SG;
+ }
+ } else {
+ if (ctx.device_out && device_mtu(ctx.device_out)) {
+ register_signal_f(SIGALRM, timer_elapsed, SA_SIGINFO);
+ main_loop = pcap_to_xmit;
+ if (!ops_touched)
+ ctx.pcap = PCAP_OPS_MM;
+ } else {
+ main_loop = read_pcap;
+ if (!ops_touched)
+ ctx.pcap = PCAP_OPS_SG;
+ }
+ }
+
+ bug_on(!main_loop);
+
+ init_geoip(0);
+ if (setsockmem)
+ set_system_socket_memory(vals, array_size(vals));
+ xlockme();
+
+ main_loop(&ctx);
+
+ xunlockme();
+ if (setsockmem)
+ reset_system_socket_memory(vals, array_size(vals));
+ destroy_geoip();
+
+ tprintf_cleanup();
+
+ free(ctx.device_in);
+ free(ctx.device_out);
+ free(ctx.device_trans);
+ free(ctx.prefix);
+
+ return 0;
+}
diff --git a/netsniff-ng/.gitignore b/netsniff-ng/.gitignore
new file mode 100644
index 0000000..32aad4d
--- /dev/null
+++ b/netsniff-ng/.gitignore
@@ -0,0 +1,4 @@
+*.*
+
+!.gitignore
+!Makefile
diff --git a/netsniff-ng/Makefile b/netsniff-ng/Makefile
new file mode 100644
index 0000000..269d403
--- /dev/null
+++ b/netsniff-ng/Makefile
@@ -0,0 +1,50 @@
+netsniff-ng-libs = -lGeoIP \
+ -lnl-genl-3 \
+ -lnl-3 \
+ -lpcap \
+ -lpthread \
+ -lz
+
+netsniff-ng-objs = dissector.o \
+ dissector_eth.o \
+ dissector_80211.o \
+ proto_arp.o \
+ proto_ethernet.o \
+ proto_icmpv4.o \
+ proto_icmpv6.o \
+ proto_igmp.o \
+ proto_ip_authentication_hdr.o \
+ proto_ip_esp.o \
+ proto_ipv4.o \
+ proto_ipv6.o \
+ proto_ipv6_dest_opts.o \
+ proto_ipv6_fragm.o \
+ proto_ipv6_hop_by_hop.o \
+ proto_ipv6_in_ipv4.o \
+ proto_ipv6_mobility_hdr.o \
+ proto_ipv6_no_nxt_hdr.o \
+ proto_ipv6_routing.o \
+ proto_lldp.o \
+ proto_none.o \
+ proto_tcp.o \
+ proto_udp.o \
+ proto_vlan.o \
+ proto_vlan_q_in_q.o \
+ proto_mpls_unicast.o \
+ proto_80211_mac_hdr.o \
+ xio.o \
+ xutils.o \
+ xmalloc.o \
+ hash.o \
+ bpf.o \
+ bpf_comp.o \
+ oui.o \
+ pcap_rw.o \
+ pcap_sg.o \
+ pcap_mm.o \
+ ring_rx.o \
+ ring_tx.o \
+ tprintf.o \
+ geoip.o \
+ mac80211.o \
+ netsniff-ng.o
diff --git a/oui.c b/oui.c
new file mode 100644
index 0000000..66d7aa4
--- /dev/null
+++ b/oui.c
@@ -0,0 +1,104 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009 - 2013 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdint.h>
+#include <stdbool.h>
+
+#include "hash.h"
+#include "xmalloc.h"
+#include "xutils.h"
+#include "oui.h"
+
+static struct hash_table oui;
+
+static bool initialized = false;
+
+struct vendor_id {
+ unsigned int id;
+ char *vendor;
+ struct vendor_id *next;
+};
+
+const char *lookup_vendor(unsigned int id)
+{
+ struct vendor_id *v;
+
+ v = lookup_hash(id, &oui);
+ while (v && id != v->id)
+ v = v->next;
+
+ return (v && id == v->id ? v->vendor : NULL);
+}
+
+void dissector_init_oui(void)
+{
+ FILE *fp;
+ char buff[128], *ptr;
+ struct vendor_id *v;
+ void **pos;
+
+ if (initialized)
+ return;
+
+ fp = fopen("/etc/netsniff-ng/oui.conf", "r");
+ if (!fp)
+ panic("No oui.conf found!\n");
+
+ memset(buff, 0, sizeof(buff));
+
+ while (fgets(buff, sizeof(buff), fp) != NULL) {
+ buff[sizeof(buff) - 1] = 0;
+ ptr = buff;
+
+ v = xmalloc(sizeof(*v));
+ v->id = strtol(ptr, &ptr, 0);
+
+ if ((ptr = strstr(buff, ", ")))
+ ptr += strlen(", ");
+ ptr = strtrim_right(ptr, '\n');
+ ptr = strtrim_right(ptr, ' ');
+
+ v->vendor = xstrdup(ptr);
+ v->next = NULL;
+
+ pos = insert_hash(v->id, v, &oui);
+ if (pos) {
+ v->next = *pos;
+ *pos = v;
+ }
+
+ memset(buff, 0, sizeof(buff));
+ }
+
+ fclose(fp);
+ initialized = true;
+}
+
+static int dissector_cleanup_oui_hash(void *ptr)
+{
+ struct vendor_id *tmp, *v = ptr;
+
+ if (!ptr)
+ return 0;
+
+ while ((tmp = v->next)) {
+ xfree(v->vendor);
+ xfree(v);
+ v = tmp;
+ }
+
+ xfree(v->vendor);
+ xfree(v);
+
+ return 0;
+}
+
+void dissector_cleanup_oui(void)
+{
+ for_each_hash(&oui, dissector_cleanup_oui_hash);
+ free_hash(&oui);
+ initialized = false;
+}
diff --git a/oui.h b/oui.h
new file mode 100644
index 0000000..4ad616e
--- /dev/null
+++ b/oui.h
@@ -0,0 +1,19 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2012 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef OUI_H
+#define OUI_H
+
+extern const char *lookup_vendor(unsigned int id);
+extern void dissector_init_oui(void);
+extern void dissector_cleanup_oui(void);
+
+static inline const char *lookup_vendor_str(unsigned int id)
+{
+ return lookup_vendor(id) ? : "Unknown";
+}
+
+#endif /* OUI_H */
diff --git a/patricia.c b/patricia.c
new file mode 100644
index 0000000..29415cc
--- /dev/null
+++ b/patricia.c
@@ -0,0 +1,353 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2011 Daniel Borkmann, rewritten
+ * Copyright 1991-2007 Kawahara Lab., Kyoto University
+ * Copyright 2000-2005 Shikano Lab., Nara Institute of Science and Technology
+ * Copyright 2005-2007 Julius project team, Nagoya Institute of Technology
+ * All rights reserved
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#include "patricia.h"
+#include "built_in.h"
+#include "xmalloc.h"
+
+static const unsigned char mbit[] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
+
+static inline int testbit(char *str, size_t slen, int bitplace)
+{
+ int maskptr;
+
+ if ((maskptr = bitplace >> 3) > slen)
+ return 0;
+
+ return (str[maskptr] & mbit[bitplace & 7]);
+}
+
+static inline int testbit_max(char *str, int bitplace, int maxbitplace)
+{
+ if (bitplace >= maxbitplace)
+ return 0;
+
+ return (str[bitplace >> 3] & mbit[bitplace & 7]);
+}
+
+static int where_the_bit_differ(char *str1, size_t l1, char *str2, size_t l2)
+{
+ int p = 0, bitloc;
+
+ while (str1[p] == str2[p])
+ p++;
+
+ bitloc = p * 8;
+
+ while (testbit(str1, l1, bitloc) == testbit(str2, l2, bitloc))
+ bitloc++;
+
+ return bitloc;
+}
+
+static struct patricia_node *new_node(void)
+{
+ struct patricia_node *n = xzmalloc(sizeof(*n));
+
+ n->l = n->r = NULL;
+
+ return n;
+}
+
+static void free_node(struct patricia_node *n)
+{
+ free(n->key);
+ free(n->addr);
+ xfree(n);
+}
+
+void ptree_display(struct patricia_node *node, int level)
+{
+ int i;
+
+ for (i = 0; i < level; ++i)
+ printf("-");
+
+ if (node->l == NULL && node->r == NULL)
+ printf("leaf: (%s -> %d)\n", (char *) node->key, node->value.data);
+ else {
+ printf("thres: %d\n", node->value.thres_bit);
+
+ if (node->l != NULL)
+ ptree_display(node->l, level + 1);
+ if (node->r != NULL)
+ ptree_display(node->r, level + 1);
+ }
+}
+
+void ptree_get_key(int data, struct patricia_node *node,
+ struct patricia_node **wanted)
+{
+ if (!node)
+ return;
+
+ if (node->l == NULL && node->r == NULL) {
+ if (node->value.data == data)
+ (*wanted) = node;
+ } else {
+ if (node->l != NULL)
+ ptree_get_key(data, node->l, wanted);
+ if (node->r != NULL)
+ ptree_get_key(data, node->r, wanted);
+ }
+}
+
+void ptree_get_key_addr(struct sockaddr_storage *addr, size_t alen,
+ struct patricia_node *node, struct patricia_node **wanted)
+{
+ if (!node)
+ return;
+
+ if (node->l == NULL && node->r == NULL) {
+ if (!memcmp(node->addr, addr, node->alen))
+ (*wanted) = node;
+ } else {
+ if (node->l != NULL)
+ ptree_get_key_addr(addr, alen, node->l, wanted);
+ if (node->r != NULL)
+ ptree_get_key_addr(addr, alen, node->r, wanted);
+ }
+}
+
+static int ptree_search_data_r(struct patricia_node *node, char *str, size_t slen,
+ struct sockaddr_storage *addr, size_t *alen, int maxbitplace)
+{
+ if (node->l == NULL && node->r == NULL) {
+ if (node->addr && addr)
+ memcpy(addr, node->addr, node->alen);
+
+ (*alen) = node->alen;
+
+ return node->value.data;
+ }
+
+ if (testbit_max(str, node->value.thres_bit, maxbitplace) != 0)
+ return ptree_search_data_r(node->r, str, slen, addr, alen, maxbitplace);
+ else
+ return ptree_search_data_r(node->l, str, slen, addr, alen, maxbitplace);
+}
+
+static int *ptree_search_data_r_p(struct patricia_node *node, char *str,
+ size_t slen, int maxbitplace)
+{
+ if (node->l == NULL && node->r == NULL)
+ return &(node->value.data);
+
+ if (testbit_max(str, node->value.thres_bit, maxbitplace) != 0)
+ return ptree_search_data_r_p(node->r, str, slen, maxbitplace);
+ else
+ return ptree_search_data_r_p(node->l, str, slen, maxbitplace);
+}
+
+static int ptree_search_data_r_x(struct patricia_node *node, char *str,
+ size_t slen, struct sockaddr_storage *addr,
+ size_t *alen, int maxbitplace)
+{
+ if (node->l == NULL && node->r == NULL) {
+ if (node->klen == slen && !memcmp(str, node->key, node->klen)) {
+ if (node->addr && addr)
+ memcpy(addr, node->addr, node->alen);
+
+ (*alen) = node->alen;
+
+ return node->value.data;
+ } else
+ return -ENOENT;
+ }
+
+ if (testbit_max(str, node->value.thres_bit, maxbitplace) != 0)
+ return ptree_search_data_r_x(node->r, str, slen, addr, alen, maxbitplace);
+ else
+ return ptree_search_data_r_x(node->l, str, slen, addr, alen, maxbitplace);
+}
+
+int ptree_search_data_nearest(void *str, size_t sstr, struct sockaddr_storage *addr,
+ size_t *alen, struct patricia_node *root)
+{
+ if (!root)
+ return -ENOENT;
+
+ return ptree_search_data_r(root, str, sstr, addr, alen, sstr * 8);
+}
+
+static int *ptree_search_data_nearest_ptr(char *str, size_t sstr,
+ struct patricia_node *root)
+{
+ return ptree_search_data_r_p(root, str, sstr, sstr * 8);
+}
+
+int ptree_search_data_exact(void *str, size_t sstr, struct sockaddr_storage *addr,
+ size_t *alen, struct patricia_node *root)
+{
+ if (!root)
+ return -ENOENT;
+
+ return ptree_search_data_r_x(root, str, sstr, addr, alen, sstr * 8);
+}
+
+static struct patricia_node *ptree_make_root_node(char *str, size_t sstr,
+ int data, struct sockaddr_storage *addr,
+ size_t alen)
+{
+ struct patricia_node *n = new_node();
+
+ n->value.data = data;
+ n->key = xmemdupz(str, sstr);
+ n->klen = sstr;
+ if (addr)
+ n->addr = xmemdupz(addr, alen);
+ else
+ n->addr = NULL;
+ n->alen = alen;
+
+ return n;
+}
+
+static void ptree_add_entry_at(char *str, size_t slen, int bitloc, int data,
+ struct sockaddr_storage *addr, size_t alen,
+ struct patricia_node **parentlink)
+{
+ struct patricia_node *node = (*parentlink);
+
+ if (node->value.thres_bit > bitloc || (node->l == NULL && node->r == NULL)) {
+ struct patricia_node *newleaf, *newbranch;
+
+ newleaf = new_node();
+ newleaf->value.data = data;
+ newleaf->key = xmemdupz(str, slen);
+ newleaf->klen = slen;
+
+ if (addr)
+ newleaf->addr = xmemdupz(addr, alen);
+ else
+ newleaf->addr = NULL;
+ newleaf->alen = alen;
+
+ newbranch = new_node();
+ newbranch->value.thres_bit = bitloc;
+ (*parentlink) = newbranch;
+
+ if (testbit(str, slen, bitloc) ==0) {
+ newbranch->l = newleaf;
+ newbranch->r = node;
+ } else {
+ newbranch->l = node;
+ newbranch->r = newleaf;
+ }
+ } else {
+ if (testbit(str, slen, node->value.thres_bit) != 0)
+ ptree_add_entry_at(str, slen, bitloc, data, addr, alen, &(node->r));
+ else
+ ptree_add_entry_at(str, slen, bitloc, data, addr, alen, &(node->l));
+ }
+}
+
+int ptree_add_entry(void *str, size_t sstr, int data, struct sockaddr_storage *addr,
+ size_t alen, struct patricia_node **root)
+{
+ int *ptr, bitloc, malicious = 0;
+ struct patricia_node *n;
+
+ if (!(*root))
+ (*root) = ptree_make_root_node(str, sstr, data, addr, alen);
+ else {
+ ptr = ptree_search_data_nearest_ptr(str, sstr, (*root));
+ n = container_of(ptr, struct patricia_node, value.data);
+
+ if (n->klen == sstr && !memcmp(str, n->key, n->klen)) {
+ /* Make sure if entry exists, that we also have the
+ * same data, otherwise, we drop the packet */
+ if (n->value.data != data)
+ malicious = 1;
+ else if (n->alen != alen)
+ malicious = 1;
+ else if ((n->addr && !addr) || (!n->addr && addr))
+ malicious = 1;
+ else if (n->alen == alen && n->addr && addr) {
+ if (memcmp(n->addr, addr, alen))
+ malicious = 1;
+ }
+
+ return malicious;
+ }
+
+ bitloc = where_the_bit_differ(str, sstr, n->key, n->klen);
+ ptree_add_entry_at(str, sstr, bitloc, data, addr, alen, root);
+ }
+
+ return malicious;
+}
+
+static void ptree_remove_entry_r(struct patricia_node *now,
+ struct patricia_node *up,
+ struct patricia_node *up2,
+ char *str, size_t slen, int maxbitplace,
+ struct patricia_node **root)
+{
+ struct patricia_node *b;
+
+ if (now->l == NULL && now->r == NULL) {
+ if (now->klen != slen)
+ return;
+ if (memcmp(now->key, str, slen))
+ return;
+ if (up == NULL) {
+ *root = NULL;
+ free_node(now);
+ return;
+ }
+
+ b = (up->r == now) ? up->l : up->r;
+
+ if (up2 == NULL) {
+ *root = b;
+ free_node(now);
+ free_node(up);
+ return;
+ }
+ if (up2->l == up)
+ up2->l = b;
+ else
+ up2->r = b;
+
+ free_node(now);
+ free_node(up);
+ } else {
+ if (testbit_max(str, now->value.thres_bit, maxbitplace) != 0)
+ ptree_remove_entry_r(now->r, now, up, str, slen, maxbitplace, root);
+ else
+ ptree_remove_entry_r(now->l, now, up, str, slen, maxbitplace, root);
+ }
+}
+
+void ptree_del_entry(void *str, size_t sstr, struct patricia_node **root)
+{
+ if (!(*root))
+ return;
+
+ ptree_remove_entry_r(*root, NULL, NULL, str, sstr, sstr * 8, root);
+}
+
+void ptree_free(struct patricia_node *node)
+{
+ if (!node)
+ return;
+
+ if (node->l)
+ ptree_free(node->l);
+ if (node->r)
+ ptree_free(node->r);
+
+ free_node(node);
+}
diff --git a/patricia.h b/patricia.h
new file mode 100644
index 0000000..81e0f6a
--- /dev/null
+++ b/patricia.h
@@ -0,0 +1,49 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2011 Daniel Borkmann, rewritten
+ * Copyright 1991-2007 Kawahara Lab., Kyoto University
+ * Copyright 2000-2005 Shikano Lab., Nara Institute of Science and Technology
+ * Copyright 2005-2007 Julius project team, Nagoya Institute of Technology
+ * All rights reserved
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef PATRICIA_H
+#define PATRICIA_H
+
+#include <netinet/in.h>
+
+#include "built_in.h"
+
+struct patricia_node {
+ void *key;
+ size_t klen;
+ struct sockaddr_storage *addr;
+ size_t alen;
+ union {
+ int data;
+ int thres_bit;
+ } value;
+ struct patricia_node *l, *r;
+} __cacheline_aligned;
+
+extern int ptree_search_data_nearest(void *str, size_t sstr,
+ struct sockaddr_storage *addr, size_t *alen,
+ struct patricia_node *root);
+extern int ptree_search_data_exact(void *str, size_t sstr,
+ struct sockaddr_storage *addr, size_t *alen,
+ struct patricia_node *root);
+extern int ptree_add_entry(void *str, size_t sstr, int data,
+ struct sockaddr_storage *addr, size_t alen,
+ struct patricia_node **root);
+extern void ptree_del_entry(void *str, size_t sstr,
+ struct patricia_node **root);
+extern void ptree_get_key(int data, struct patricia_node *node,
+ struct patricia_node **wanted);
+extern void ptree_get_key_addr(struct sockaddr_storage *addr, size_t alen,
+ struct patricia_node *node,
+ struct patricia_node **wanted);
+extern void ptree_display(struct patricia_node *node, int level);
+extern void ptree_free(struct patricia_node *root);
+
+#endif /* PATRICIA_H */
diff --git a/pcap_io.h b/pcap_io.h
new file mode 100644
index 0000000..0784195
--- /dev/null
+++ b/pcap_io.h
@@ -0,0 +1,581 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009 - 2013 Daniel Borkmann.
+ * Copyright 2010 Emmanuel Roullit.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef PCAP_IO_H
+#define PCAP_IO_H
+
+#include <unistd.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <linux/if_packet.h>
+
+#include "built_in.h"
+#include "die.h"
+#include "xio.h"
+
+#define TCPDUMP_MAGIC 0xa1b2c3d4
+#define ORIGINAL_TCPDUMP_MAGIC TCPDUMP_MAGIC
+#define NSEC_TCPDUMP_MAGIC 0xa1b23c4d
+#define KUZNETZOV_TCPDUMP_MAGIC 0xa1b2cd34
+#define BORKMANN_TCPDUMP_MAGIC 0xa1e2cb12
+
+#define PCAP_VERSION_MAJOR 2
+#define PCAP_VERSION_MINOR 4
+#define PCAP_DEFAULT_SNAPSHOT_LEN 65535
+
+#define LINKTYPE_EN10MB 1 /* Ethernet (10Mb) */
+#define LINKTYPE_IEEE802_11 105 /* IEEE 802.11 wireless */
+
+struct pcap_filehdr {
+ uint32_t magic;
+ uint16_t version_major;
+ uint16_t version_minor;
+ int32_t thiszone;
+ uint32_t sigfigs;
+ uint32_t snaplen;
+ uint32_t linktype;
+};
+
+struct pcap_timeval {
+ int32_t tv_sec;
+ int32_t tv_usec;
+};
+
+struct pcap_timeval_ns {
+ int32_t tv_sec;
+ int32_t tv_nsec;
+};
+
+struct pcap_pkthdr {
+ struct pcap_timeval ts;
+ uint32_t caplen;
+ uint32_t len;
+};
+
+struct pcap_pkthdr_ns {
+ struct pcap_timeval_ns ts;
+ uint32_t caplen;
+ uint32_t len;
+};
+
+struct pcap_pkthdr_kuz {
+ struct pcap_timeval ts;
+ uint32_t caplen;
+ uint32_t len;
+ int ifindex;
+ uint16_t protocol;
+ uint8_t pkttype;
+};
+
+struct pcap_pkthdr_bkm {
+ struct pcap_timeval_ns ts;
+ uint32_t caplen;
+ uint32_t len;
+ uint32_t ifindex;
+ uint16_t protocol;
+ uint8_t hatype;
+ uint8_t pkttype;
+};
+
+typedef union {
+ struct pcap_pkthdr ppo;
+ struct pcap_pkthdr_ns ppn;
+ struct pcap_pkthdr_kuz ppk;
+ struct pcap_pkthdr_bkm ppb;
+ uint8_t raw;
+} pcap_pkthdr_t;
+
+enum pcap_type {
+ DEFAULT = ORIGINAL_TCPDUMP_MAGIC,
+ NSEC = NSEC_TCPDUMP_MAGIC,
+ KUZNETZOV = KUZNETZOV_TCPDUMP_MAGIC,
+ BORKMANN = BORKMANN_TCPDUMP_MAGIC,
+
+ DEFAULT_SWAPPED = ___constant_swab32(ORIGINAL_TCPDUMP_MAGIC),
+ NSEC_SWAPPED = ___constant_swab32(NSEC_TCPDUMP_MAGIC),
+ KUZNETZOV_SWAPPED = ___constant_swab32(KUZNETZOV_TCPDUMP_MAGIC),
+ BORKMANN_SWAPPED = ___constant_swab32(BORKMANN_TCPDUMP_MAGIC),
+};
+
+enum pcap_ops_groups {
+ PCAP_OPS_RW = 0,
+ PCAP_OPS_SG,
+ PCAP_OPS_MM,
+};
+
+enum pcap_mode {
+ PCAP_MODE_RD = 0,
+ PCAP_MODE_WR,
+};
+
+struct pcap_file_ops {
+ int (*pull_fhdr_pcap)(int fd, uint32_t *magic, uint32_t *linktype);
+ int (*push_fhdr_pcap)(int fd, uint32_t magic, uint32_t linktype);
+ int (*prepare_access_pcap)(int fd, enum pcap_mode mode, bool jumbo);
+ ssize_t (*write_pcap)(int fd, pcap_pkthdr_t *phdr, enum pcap_type type,
+ const uint8_t *packet, size_t len);
+ ssize_t (*read_pcap)(int fd, pcap_pkthdr_t *phdr, enum pcap_type type,
+ uint8_t *packet, size_t len);
+ void (*prepare_close_pcap)(int fd, enum pcap_mode mode);
+ void (*fsync_pcap)(int fd);
+};
+
+extern const struct pcap_file_ops pcap_rw_ops;
+extern const struct pcap_file_ops pcap_sg_ops;
+extern const struct pcap_file_ops pcap_mm_ops;
+
+static inline void pcap_check_magic(uint32_t magic)
+{
+ switch (magic) {
+
+ case ORIGINAL_TCPDUMP_MAGIC:
+ case NSEC_TCPDUMP_MAGIC:
+ case KUZNETZOV_TCPDUMP_MAGIC:
+ case BORKMANN_TCPDUMP_MAGIC:
+
+ case ___constant_swab32(ORIGINAL_TCPDUMP_MAGIC):
+ case ___constant_swab32(NSEC_TCPDUMP_MAGIC):
+ case ___constant_swab32(KUZNETZOV_TCPDUMP_MAGIC):
+ case ___constant_swab32(BORKMANN_TCPDUMP_MAGIC):
+ break;
+
+ default:
+ panic("This file has not a valid pcap header\n");
+ }
+}
+
+static inline bool pcap_magic_is_swapped(uint32_t magic)
+{
+ bool swapped = false;
+
+ switch (magic) {
+ case ___constant_swab32(ORIGINAL_TCPDUMP_MAGIC):
+ case ___constant_swab32(NSEC_TCPDUMP_MAGIC):
+ case ___constant_swab32(KUZNETZOV_TCPDUMP_MAGIC):
+ case ___constant_swab32(BORKMANN_TCPDUMP_MAGIC):
+ swapped = true;
+ }
+
+ return swapped;
+}
+
+static inline u32 pcap_get_length(pcap_pkthdr_t *phdr, enum pcap_type type)
+{
+ switch (type) {
+#define CASE_RET_CAPLEN(what, member, swap) \
+ case (what): \
+ return (swap ? ___constant_swab32(phdr->member.caplen) : \
+ phdr->member.caplen)
+
+ CASE_RET_CAPLEN(DEFAULT, ppo, 0);
+ CASE_RET_CAPLEN(NSEC, ppn, 0);
+ CASE_RET_CAPLEN(KUZNETZOV, ppk, 0);
+ CASE_RET_CAPLEN(BORKMANN, ppb, 0);
+
+ CASE_RET_CAPLEN(DEFAULT_SWAPPED, ppo, 1);
+ CASE_RET_CAPLEN(NSEC_SWAPPED, ppn, 1);
+ CASE_RET_CAPLEN(KUZNETZOV_SWAPPED, ppk, 1);
+ CASE_RET_CAPLEN(BORKMANN_SWAPPED, ppb, 1);
+
+ default:
+ bug();
+ }
+}
+
+static inline void pcap_set_length(pcap_pkthdr_t *phdr, enum pcap_type type, u32 len)
+{
+ switch (type) {
+#define CASE_SET_CAPLEN(what, member, swap) \
+ case (what): \
+ phdr->member.caplen = (swap ? ___constant_swab32(len) : len); \
+ break
+
+ CASE_SET_CAPLEN(DEFAULT, ppo, 0);
+ CASE_SET_CAPLEN(NSEC, ppn, 0);
+ CASE_SET_CAPLEN(KUZNETZOV, ppk, 0);
+ CASE_SET_CAPLEN(BORKMANN, ppb, 0);
+
+ CASE_SET_CAPLEN(DEFAULT_SWAPPED, ppo, 1);
+ CASE_SET_CAPLEN(NSEC_SWAPPED, ppn, 1);
+ CASE_SET_CAPLEN(KUZNETZOV_SWAPPED, ppk, 1);
+ CASE_SET_CAPLEN(BORKMANN_SWAPPED, ppb, 1);
+
+ default:
+ bug();
+ }
+}
+
+static inline u32 pcap_get_hdr_length(pcap_pkthdr_t *phdr, enum pcap_type type)
+{
+ switch (type) {
+#define CASE_RET_HDRLEN(what, member) \
+ case (what): \
+ return sizeof(phdr->member)
+
+ CASE_RET_HDRLEN(DEFAULT, ppo);
+ CASE_RET_HDRLEN(NSEC, ppn);
+ CASE_RET_HDRLEN(KUZNETZOV, ppk);
+ CASE_RET_HDRLEN(BORKMANN, ppb);
+
+ CASE_RET_HDRLEN(DEFAULT_SWAPPED, ppo);
+ CASE_RET_HDRLEN(NSEC_SWAPPED, ppn);
+ CASE_RET_HDRLEN(KUZNETZOV_SWAPPED, ppk);
+ CASE_RET_HDRLEN(BORKMANN_SWAPPED, ppb);
+
+ default:
+ bug();
+ }
+}
+
+static inline u32 pcap_get_total_length(pcap_pkthdr_t *phdr, enum pcap_type type)
+{
+ switch (type) {
+#define CASE_RET_TOTLEN(what, member, swap) \
+ case (what): \
+ return ((swap ? ___constant_swab32(phdr->member.caplen) : \
+ phdr->member.caplen) + sizeof(phdr->member))
+
+ CASE_RET_TOTLEN(DEFAULT, ppo, 0);
+ CASE_RET_TOTLEN(NSEC, ppn, 0);
+ CASE_RET_TOTLEN(KUZNETZOV, ppk, 0);
+ CASE_RET_TOTLEN(BORKMANN, ppb, 0);
+
+ CASE_RET_TOTLEN(DEFAULT_SWAPPED, ppo, 1);
+ CASE_RET_TOTLEN(NSEC_SWAPPED, ppn, 1);
+ CASE_RET_TOTLEN(KUZNETZOV_SWAPPED, ppk, 1);
+ CASE_RET_TOTLEN(BORKMANN_SWAPPED, ppb, 1);
+
+ default:
+ bug();
+ }
+}
+
+static inline void tpacket_hdr_to_pcap_pkthdr(struct tpacket2_hdr *thdr,
+ struct sockaddr_ll *sll,
+ pcap_pkthdr_t *phdr,
+ enum pcap_type type)
+{
+ switch (type) {
+ case DEFAULT:
+ phdr->ppo.ts.tv_sec = thdr->tp_sec;
+ phdr->ppo.ts.tv_usec = thdr->tp_nsec / 1000;
+ phdr->ppo.caplen = thdr->tp_snaplen;
+ phdr->ppo.len = thdr->tp_len;
+ break;
+
+ case DEFAULT_SWAPPED:
+ phdr->ppo.ts.tv_sec = ___constant_swab32(thdr->tp_sec);
+ phdr->ppo.ts.tv_usec = ___constant_swab32(thdr->tp_nsec / 1000);
+ phdr->ppo.caplen = ___constant_swab32(thdr->tp_snaplen);
+ phdr->ppo.len = ___constant_swab32(thdr->tp_len);
+ break;
+
+ case NSEC:
+ phdr->ppn.ts.tv_sec = thdr->tp_sec;
+ phdr->ppn.ts.tv_nsec = thdr->tp_nsec;
+ phdr->ppn.caplen = thdr->tp_snaplen;
+ phdr->ppn.len = thdr->tp_len;
+ break;
+
+ case NSEC_SWAPPED:
+ phdr->ppn.ts.tv_sec = ___constant_swab32(thdr->tp_sec);
+ phdr->ppn.ts.tv_nsec = ___constant_swab32(thdr->tp_nsec);
+ phdr->ppn.caplen = ___constant_swab32(thdr->tp_snaplen);
+ phdr->ppn.len = ___constant_swab32(thdr->tp_len);
+ break;
+
+ case KUZNETZOV:
+ phdr->ppk.ts.tv_sec = thdr->tp_sec;
+ phdr->ppk.ts.tv_usec = thdr->tp_nsec / 1000;
+ phdr->ppk.caplen = thdr->tp_snaplen;
+ phdr->ppk.len = thdr->tp_len;
+ phdr->ppk.ifindex = sll->sll_ifindex;
+ phdr->ppk.protocol = sll->sll_protocol;
+ phdr->ppk.pkttype = sll->sll_pkttype;
+ break;
+
+ case KUZNETZOV_SWAPPED:
+ phdr->ppk.ts.tv_sec = ___constant_swab32(thdr->tp_sec);
+ phdr->ppk.ts.tv_usec = ___constant_swab32(thdr->tp_nsec / 1000);
+ phdr->ppk.caplen = ___constant_swab32(thdr->tp_snaplen);
+ phdr->ppk.len = ___constant_swab32(thdr->tp_len);
+ phdr->ppk.ifindex = ___constant_swab32((u32) sll->sll_ifindex);
+ phdr->ppk.protocol = ___constant_swab16(sll->sll_protocol);
+ phdr->ppk.pkttype = sll->sll_pkttype;
+ break;
+
+ case BORKMANN:
+ phdr->ppb.ts.tv_sec = thdr->tp_sec;
+ phdr->ppb.ts.tv_nsec = thdr->tp_nsec;
+ phdr->ppb.caplen = thdr->tp_snaplen;
+ phdr->ppb.len = thdr->tp_len;
+ phdr->ppb.ifindex = (u32) sll->sll_ifindex;
+ phdr->ppb.protocol = sll->sll_protocol;
+ phdr->ppb.hatype = sll->sll_hatype;
+ phdr->ppb.pkttype = sll->sll_pkttype;
+ break;
+
+ case BORKMANN_SWAPPED:
+ phdr->ppb.ts.tv_sec = ___constant_swab32(thdr->tp_sec);
+ phdr->ppb.ts.tv_nsec = ___constant_swab32(thdr->tp_nsec);
+ phdr->ppb.caplen = ___constant_swab32(thdr->tp_snaplen);
+ phdr->ppb.len = ___constant_swab32(thdr->tp_len);
+ phdr->ppb.ifindex = ___constant_swab32((u32) sll->sll_ifindex);
+ phdr->ppb.protocol = ___constant_swab16(sll->sll_protocol);
+ phdr->ppb.hatype = sll->sll_hatype;
+ phdr->ppb.pkttype = sll->sll_pkttype;
+ break;
+
+ default:
+ bug();
+ }
+}
+
+static inline void pcap_pkthdr_to_tpacket_hdr(pcap_pkthdr_t *phdr,
+ enum pcap_type type,
+ struct tpacket2_hdr *thdr,
+ struct sockaddr_ll *sll)
+{
+ switch (type) {
+ case DEFAULT:
+ thdr->tp_sec = phdr->ppo.ts.tv_sec;
+ thdr->tp_nsec = phdr->ppo.ts.tv_usec * 1000;
+ thdr->tp_snaplen = phdr->ppo.caplen;
+ thdr->tp_len = phdr->ppo.len;
+ break;
+
+ case DEFAULT_SWAPPED:
+ thdr->tp_sec = ___constant_swab32(phdr->ppo.ts.tv_sec);
+ thdr->tp_nsec = ___constant_swab32(phdr->ppo.ts.tv_usec) * 1000;
+ thdr->tp_snaplen = ___constant_swab32(phdr->ppo.caplen);
+ thdr->tp_len = ___constant_swab32(phdr->ppo.len);
+ break;
+
+ case NSEC:
+ thdr->tp_sec = phdr->ppn.ts.tv_sec;
+ thdr->tp_nsec = phdr->ppn.ts.tv_nsec;
+ thdr->tp_snaplen = phdr->ppn.caplen;
+ thdr->tp_len = phdr->ppn.len;
+ break;
+
+ case NSEC_SWAPPED:
+ thdr->tp_sec = ___constant_swab32(phdr->ppn.ts.tv_sec);
+ thdr->tp_nsec = ___constant_swab32(phdr->ppn.ts.tv_nsec);
+ thdr->tp_snaplen = ___constant_swab32(phdr->ppn.caplen);
+ thdr->tp_len = ___constant_swab32(phdr->ppn.len);
+ break;
+
+ case KUZNETZOV:
+ thdr->tp_sec = phdr->ppk.ts.tv_sec;
+ thdr->tp_nsec = phdr->ppk.ts.tv_usec * 1000;
+ thdr->tp_snaplen = phdr->ppk.caplen;
+ thdr->tp_len = phdr->ppk.len;
+ break;
+
+ case KUZNETZOV_SWAPPED:
+ thdr->tp_sec = ___constant_swab32(phdr->ppk.ts.tv_sec);
+ thdr->tp_nsec = ___constant_swab32(phdr->ppk.ts.tv_usec) * 1000;
+ thdr->tp_snaplen = ___constant_swab32(phdr->ppk.caplen);
+ thdr->tp_len = ___constant_swab32(phdr->ppk.len);
+ break;
+
+ case BORKMANN:
+ thdr->tp_sec = phdr->ppb.ts.tv_sec;
+ thdr->tp_nsec = phdr->ppb.ts.tv_nsec;
+ thdr->tp_snaplen = phdr->ppb.caplen;
+ thdr->tp_len = phdr->ppb.len;
+ break;
+
+ case BORKMANN_SWAPPED:
+ thdr->tp_sec = ___constant_swab32(phdr->ppb.ts.tv_sec);
+ thdr->tp_nsec = ___constant_swab32(phdr->ppb.ts.tv_nsec);
+ thdr->tp_snaplen = ___constant_swab32(phdr->ppb.caplen);
+ thdr->tp_len = ___constant_swab32(phdr->ppb.len);
+ break;
+
+ default:
+ bug();
+ }
+}
+
+#define FEATURE_UNKNOWN (0 << 0)
+#define FEATURE_TIMEVAL_MS (1 << 0)
+#define FEATURE_TIMEVAL_NS (1 << 1)
+#define FEATURE_LEN (1 << 2)
+#define FEATURE_CAPLEN (1 << 3)
+#define FEATURE_IFINDEX (1 << 4)
+#define FEATURE_PROTO (1 << 5)
+#define FEATURE_HATYPE (1 << 6)
+#define FEATURE_PKTTYPE (1 << 7)
+
+struct pcap_magic_type {
+ const uint32_t magic;
+ const char *desc;
+ const uint16_t features;
+};
+
+static const struct pcap_magic_type pcap_magic_types[] __maybe_unused = {
+ {
+ .magic = ORIGINAL_TCPDUMP_MAGIC,
+ .desc = "tcpdump-capable pcap",
+ .features = FEATURE_TIMEVAL_MS |
+ FEATURE_LEN |
+ FEATURE_CAPLEN,
+ }, {
+ .magic = NSEC_TCPDUMP_MAGIC,
+ .desc = "tcpdump-capable pcap with ns resolution",
+ .features = FEATURE_TIMEVAL_NS |
+ FEATURE_LEN |
+ FEATURE_CAPLEN,
+ }, {
+ .magic = KUZNETZOV_TCPDUMP_MAGIC,
+ .desc = "Alexey Kuznetzov's pcap",
+ .features = FEATURE_TIMEVAL_MS |
+ FEATURE_LEN |
+ FEATURE_CAPLEN |
+ FEATURE_IFINDEX |
+ FEATURE_PROTO |
+ FEATURE_PKTTYPE,
+ }, {
+ .magic = BORKMANN_TCPDUMP_MAGIC,
+ .desc = "netsniff-ng pcap",
+ .features = FEATURE_TIMEVAL_NS |
+ FEATURE_LEN |
+ FEATURE_CAPLEN |
+ FEATURE_IFINDEX |
+ FEATURE_PROTO |
+ FEATURE_HATYPE |
+ FEATURE_PKTTYPE,
+ },
+};
+
+static inline void pcap_dump_type_features(void)
+{
+ int i;
+
+ for (i = 0; i < array_size(pcap_magic_types); ++i) {
+ printf("%s:\n", pcap_magic_types[i].desc);
+ printf(" magic: 0x%x (swapped: 0x%x)\n",
+ pcap_magic_types[i].magic,
+ ___constant_swab32(pcap_magic_types[i].magic));
+ printf(" features:\n");
+
+ if (pcap_magic_types[i].features == FEATURE_UNKNOWN) {
+ printf(" unknown\n");
+ continue;
+ }
+
+ if (pcap_magic_types[i].features & FEATURE_TIMEVAL_MS)
+ printf(" timeval in us\n");
+ if (pcap_magic_types[i].features & FEATURE_TIMEVAL_NS)
+ printf(" timeval in ns\n");
+ if (pcap_magic_types[i].features & FEATURE_LEN)
+ printf(" packet length\n");
+ if (pcap_magic_types[i].features & FEATURE_CAPLEN)
+ printf(" packet cap-length\n");
+ if (pcap_magic_types[i].features & FEATURE_IFINDEX)
+ printf(" packet ifindex\n");
+ if (pcap_magic_types[i].features & FEATURE_PROTO)
+ printf(" packet protocol\n");
+ if (pcap_magic_types[i].features & FEATURE_HATYPE)
+ printf(" hardware type\n");
+ if (pcap_magic_types[i].features & FEATURE_PKTTYPE)
+ printf(" packet type\n");
+ }
+}
+
+static const char *pcap_ops_group_to_str[] __maybe_unused = {
+ [PCAP_OPS_RW] = "rw",
+ [PCAP_OPS_SG] = "sg",
+ [PCAP_OPS_MM] = "mm",
+};
+
+static const struct pcap_file_ops *pcap_ops[] __maybe_unused = {
+ [PCAP_OPS_RW] = &pcap_rw_ops,
+ [PCAP_OPS_SG] = &pcap_sg_ops,
+ [PCAP_OPS_MM] = &pcap_mm_ops,
+};
+
+static inline void pcap_prepare_header(struct pcap_filehdr *hdr, uint32_t magic,
+ uint32_t linktype, int32_t thiszone,
+ uint32_t snaplen)
+{
+ bool swapped = pcap_magic_is_swapped(magic);
+
+ hdr->magic = magic;
+ hdr->version_major = swapped ? ___constant_swab16(PCAP_VERSION_MAJOR) : PCAP_VERSION_MAJOR;
+ hdr->version_minor = swapped ? ___constant_swab16(PCAP_VERSION_MINOR) : PCAP_VERSION_MINOR;
+ hdr->thiszone = swapped ? ___constant_swab32(thiszone) : thiszone;
+ hdr->sigfigs = 0;
+ hdr->snaplen = swapped ? ___constant_swab32(snaplen) : snaplen;
+ hdr->linktype = swapped ? ___constant_swab32(linktype) : linktype;
+}
+
+static inline void pcap_validate_header(const struct pcap_filehdr *hdr)
+{
+ pcap_check_magic(hdr->magic);
+
+ switch (hdr->linktype) {
+ case LINKTYPE_EN10MB:
+ case LINKTYPE_IEEE802_11:
+ case ___constant_swab32(LINKTYPE_EN10MB):
+ case ___constant_swab32(LINKTYPE_IEEE802_11):
+ break;
+ default:
+ panic("This file has not a valid pcap header\n");
+ }
+
+ if (unlikely(hdr->version_major != PCAP_VERSION_MAJOR) &&
+ ___constant_swab16(hdr->version_major) != PCAP_VERSION_MAJOR)
+ panic("This file has not a valid pcap header\n");
+ if (unlikely(hdr->version_minor != PCAP_VERSION_MINOR) &&
+ ___constant_swab16(hdr->version_minor) != PCAP_VERSION_MINOR)
+ panic("This file has not a valid pcap header\n");
+}
+
+static int pcap_generic_pull_fhdr(int fd, uint32_t *magic,
+ uint32_t *linktype) __maybe_unused;
+
+static int pcap_generic_pull_fhdr(int fd, uint32_t *magic, uint32_t *linktype)
+{
+ ssize_t ret;
+ struct pcap_filehdr hdr;
+
+ ret = read(fd, &hdr, sizeof(hdr));
+ if (unlikely(ret != sizeof(hdr)))
+ return -EIO;
+
+ pcap_validate_header(&hdr);
+
+ *magic = hdr.magic;
+ *linktype = hdr.linktype;
+
+ return 0;
+}
+
+static int pcap_generic_push_fhdr(int fd, uint32_t magic,
+ uint32_t linktype) __maybe_unused;
+
+static int pcap_generic_push_fhdr(int fd, uint32_t magic, uint32_t linktype)
+{
+ ssize_t ret;
+ struct pcap_filehdr hdr;
+
+ memset(&hdr, 0, sizeof(hdr));
+
+ pcap_prepare_header(&hdr, magic, linktype, 0, PCAP_DEFAULT_SNAPSHOT_LEN);
+
+ ret = write_or_die(fd, &hdr, sizeof(hdr));
+ if (unlikely(ret != sizeof(hdr)))
+ panic("Failed to write pkt file header!\n");
+
+ return 0;
+}
+
+#endif /* PCAP_IO_H */
diff --git a/pcap_mm.c b/pcap_mm.c
new file mode 100644
index 0000000..f3b3fd0
--- /dev/null
+++ b/pcap_mm.c
@@ -0,0 +1,197 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2011 - 2013 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdbool.h>
+#include <sys/mman.h>
+
+#include "pcap_io.h"
+#include "xio.h"
+#include "xutils.h"
+#include "built_in.h"
+
+static size_t map_size = 0;
+static char *ptr_va_start, *ptr_va_curr;
+
+static void __pcap_mmap_write_need_remap(int fd)
+{
+ int ret;
+ off_t pos, map_size_old = map_size;
+ off_t offset = ptr_va_curr - ptr_va_start;
+
+ map_size = PAGE_ALIGN(map_size_old * 10 / 8);
+
+ pos = lseek(fd, map_size, SEEK_SET);
+ if (pos < 0)
+ panic("Cannot lseek pcap file!\n");
+
+ ret = write_or_die(fd, "", 1);
+ if (ret != 1)
+ panic("Cannot write file!\n");
+
+ ptr_va_start = mremap(ptr_va_start, map_size_old, map_size, MREMAP_MAYMOVE);
+ if (ptr_va_start == MAP_FAILED)
+ panic("mmap of file failed!");
+
+ ret = madvise(ptr_va_start, map_size, MADV_SEQUENTIAL);
+ if (ret < 0)
+ panic("Failed to give kernel mmap advise!\n");
+
+ ptr_va_curr = ptr_va_start + offset;
+}
+
+static ssize_t pcap_mm_write(int fd, pcap_pkthdr_t *phdr, enum pcap_type type,
+ const uint8_t *packet, size_t len)
+{
+ size_t hdrsize = pcap_get_hdr_length(phdr, type);
+
+ if ((off_t) (ptr_va_curr - ptr_va_start) + hdrsize + len > map_size)
+ __pcap_mmap_write_need_remap(fd);
+
+ fmemcpy(ptr_va_curr, &phdr->raw, hdrsize);
+ ptr_va_curr += hdrsize;
+ fmemcpy(ptr_va_curr, packet, len);
+ ptr_va_curr += len;
+
+ return hdrsize + len;
+}
+
+static ssize_t pcap_mm_read(int fd, pcap_pkthdr_t *phdr, enum pcap_type type,
+ uint8_t *packet, size_t len)
+{
+ size_t hdrsize = pcap_get_hdr_length(phdr, type), hdrlen;
+
+ if (unlikely((off_t) (ptr_va_curr + hdrsize - ptr_va_start) > map_size))
+ return -EIO;
+
+ fmemcpy(&phdr->raw, ptr_va_curr, hdrsize);
+ ptr_va_curr += hdrsize;
+ hdrlen = pcap_get_length(phdr, type);
+
+ if (unlikely((off_t) (ptr_va_curr + hdrlen - ptr_va_start) > map_size))
+ return -EIO;
+ if (unlikely(hdrlen == 0 || hdrlen > len))
+ return -EINVAL;
+
+ fmemcpy(packet, ptr_va_curr, hdrlen);
+ ptr_va_curr += hdrlen;
+
+ return hdrsize + hdrlen;
+}
+
+static inline off_t ____get_map_size(bool jumbo)
+{
+ int allocsz = jumbo ? 16 : 3;
+
+ return PAGE_ALIGN(sizeof(struct pcap_filehdr) + (PAGE_SIZE * allocsz) * 1024);
+}
+
+static void __pcap_mm_prepare_access_wr(int fd, bool jumbo)
+{
+ int ret;
+ off_t pos;
+ struct stat sb;
+
+ map_size = ____get_map_size(jumbo);
+
+ ret = fstat(fd, &sb);
+ if (ret < 0)
+ panic("Cannot fstat pcap file!\n");
+ if (!S_ISREG (sb.st_mode))
+ panic("pcap dump file is not a regular file!\n");
+
+ pos = lseek(fd, map_size, SEEK_SET);
+ if (pos < 0)
+ panic("Cannot lseek pcap file!\n");
+
+ ret = write_or_die(fd, "", 1);
+ if (ret != 1)
+ panic("Cannot write file!\n");
+
+ ptr_va_start = mmap(0, map_size, PROT_WRITE, MAP_SHARED, fd, 0);
+ if (ptr_va_start == MAP_FAILED)
+ panic("mmap of file failed!");
+ ret = madvise(ptr_va_start, map_size, MADV_SEQUENTIAL);
+ if (ret < 0)
+ panic("Failed to give kernel mmap advise!\n");
+
+ ptr_va_curr = ptr_va_start + sizeof(struct pcap_filehdr);
+}
+
+static void __pcap_mm_prepare_access_rd(int fd)
+{
+ int ret;
+ struct stat sb;
+
+ ret = fstat(fd, &sb);
+ if (ret < 0)
+ panic("Cannot fstat pcap file!\n");
+ if (!S_ISREG (sb.st_mode))
+ panic("pcap dump file is not a regular file!\n");
+
+ map_size = sb.st_size;
+ ptr_va_start = mmap(0, map_size, PROT_READ, MAP_SHARED | MAP_LOCKED, fd, 0);
+ if (ptr_va_start == MAP_FAILED)
+ panic("mmap of file failed!");
+ ret = madvise(ptr_va_start, map_size, MADV_SEQUENTIAL);
+ if (ret < 0)
+ panic("Failed to give kernel mmap advise!\n");
+
+ ptr_va_curr = ptr_va_start + sizeof(struct pcap_filehdr);
+}
+
+static int pcap_mm_prepare_access(int fd, enum pcap_mode mode, bool jumbo)
+{
+ set_ioprio_be();
+
+ switch (mode) {
+ case PCAP_MODE_RD:
+ __pcap_mm_prepare_access_rd(fd);
+ break;
+ case PCAP_MODE_WR:
+ __pcap_mm_prepare_access_wr(fd, jumbo);
+ break;
+ default:
+ bug();
+ }
+
+ return 0;
+}
+
+static void pcap_mm_fsync(int fd)
+{
+ msync(ptr_va_start, (off_t) (ptr_va_curr - ptr_va_start), MS_ASYNC);
+}
+
+static void pcap_mm_prepare_close(int fd, enum pcap_mode mode)
+{
+ int ret;
+
+ ret = munmap(ptr_va_start, map_size);
+ if (ret < 0)
+ panic("Cannot unmap the pcap file!\n");
+
+ if (mode == PCAP_MODE_WR) {
+ ret = ftruncate(fd, (off_t) (ptr_va_curr - ptr_va_start));
+ if (ret)
+ panic("Cannot truncate the pcap file!\n");
+ }
+}
+
+const struct pcap_file_ops pcap_mm_ops = {
+ .pull_fhdr_pcap = pcap_generic_pull_fhdr,
+ .push_fhdr_pcap = pcap_generic_push_fhdr,
+ .prepare_access_pcap = pcap_mm_prepare_access,
+ .prepare_close_pcap = pcap_mm_prepare_close,
+ .read_pcap = pcap_mm_read,
+ .write_pcap = pcap_mm_write,
+ .fsync_pcap = pcap_mm_fsync,
+};
diff --git a/pcap_rw.c b/pcap_rw.c
new file mode 100644
index 0000000..22d613f
--- /dev/null
+++ b/pcap_rw.c
@@ -0,0 +1,79 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009 - 2013 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "pcap_io.h"
+#include "built_in.h"
+#include "xutils.h"
+#include "xio.h"
+#include "die.h"
+
+static ssize_t pcap_rw_write(int fd, pcap_pkthdr_t *phdr, enum pcap_type type,
+ const uint8_t *packet, size_t len)
+{
+ ssize_t ret, hdrsize = pcap_get_hdr_length(phdr, type), hdrlen = 0;
+
+ ret = write_or_die(fd, &phdr->raw, hdrsize);
+ if (unlikely(ret != hdrsize))
+ panic("Failed to write pkt header!\n");
+
+ hdrlen = pcap_get_length(phdr, type);
+ if (unlikely(hdrlen != len))
+ return -EINVAL;
+
+ ret = write_or_die(fd, packet, hdrlen);
+ if (unlikely(ret != hdrlen))
+ panic("Failed to write pkt payload!\n");
+
+ return hdrsize + hdrlen;
+}
+
+static ssize_t pcap_rw_read(int fd, pcap_pkthdr_t *phdr, enum pcap_type type,
+ uint8_t *packet, size_t len)
+{
+ ssize_t ret, hdrsize = pcap_get_hdr_length(phdr, type), hdrlen = 0;
+
+ ret = read_or_die(fd, &phdr->raw, hdrsize);
+ if (unlikely(ret != hdrsize))
+ return -EIO;
+
+ hdrlen = pcap_get_length(phdr, type);
+ if (unlikely(hdrlen == 0 || hdrlen > len))
+ return -EINVAL;
+
+ ret = read(fd, packet, hdrlen);
+ if (unlikely(ret != hdrlen))
+ return -EIO;
+
+ return hdrsize + hdrlen;
+}
+
+static int pcap_rw_prepare_access(int fd, enum pcap_mode mode, bool jumbo)
+{
+ set_ioprio_rt();
+
+ return 0;
+}
+
+static void pcap_rw_fsync(int fd)
+{
+ fdatasync(fd);
+}
+
+const struct pcap_file_ops pcap_rw_ops = {
+ .pull_fhdr_pcap = pcap_generic_pull_fhdr,
+ .push_fhdr_pcap = pcap_generic_push_fhdr,
+ .prepare_access_pcap = pcap_rw_prepare_access,
+ .read_pcap = pcap_rw_read,
+ .write_pcap = pcap_rw_write,
+ .fsync_pcap = pcap_rw_fsync,
+};
diff --git a/pcap_sg.c b/pcap_sg.c
new file mode 100644
index 0000000..ad78ce7
--- /dev/null
+++ b/pcap_sg.c
@@ -0,0 +1,193 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2011 - 2013 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/uio.h>
+#include <unistd.h>
+
+#include "pcap_io.h"
+#include "xmalloc.h"
+#include "xio.h"
+#include "xutils.h"
+#include "built_in.h"
+
+static struct iovec iov[1024] __cacheline_aligned;
+static off_t iov_off_rd = 0, iov_slot = 0;
+
+static ssize_t pcap_sg_write(int fd, pcap_pkthdr_t *phdr, enum pcap_type type,
+ const uint8_t *packet, size_t len)
+{
+ ssize_t ret, hdrsize = pcap_get_hdr_length(phdr, type);
+
+ if (unlikely(iov_slot == array_size(iov))) {
+ ret = writev(fd, iov, array_size(iov));
+ if (ret < 0)
+ panic("Writev I/O error: %s!\n", strerror(errno));
+
+ iov_slot = 0;
+ }
+
+ fmemcpy(iov[iov_slot].iov_base, &phdr->raw, hdrsize);
+ iov[iov_slot].iov_len = hdrsize;
+
+ fmemcpy(iov[iov_slot].iov_base + iov[iov_slot].iov_len, packet, len);
+ ret = (iov[iov_slot].iov_len += len);
+
+ iov_slot++;
+ return ret;
+}
+
+static ssize_t __pcap_sg_inter_iov_hdr_read(int fd, pcap_pkthdr_t *phdr, enum pcap_type type,
+ uint8_t *packet, size_t len, size_t hdrsize)
+{
+ int ret;
+ size_t offset = 0;
+ ssize_t remainder;
+
+ offset = iov[iov_slot].iov_len - iov_off_rd;
+ remainder = hdrsize - offset;
+ if (remainder < 0)
+ remainder = 0;
+
+ bug_on(offset + remainder != hdrsize);
+
+ fmemcpy(&phdr->raw, iov[iov_slot].iov_base + iov_off_rd, offset);
+ iov_off_rd = 0;
+ iov_slot++;
+
+ if (iov_slot == array_size(iov)) {
+ iov_slot = 0;
+ ret = readv(fd, iov, array_size(iov));
+ if (unlikely(ret <= 0))
+ return -EIO;
+ }
+
+ fmemcpy(&phdr->raw + offset, iov[iov_slot].iov_base + iov_off_rd, remainder);
+ iov_off_rd += remainder;
+
+ return hdrsize;
+}
+
+static ssize_t __pcap_sg_inter_iov_data_read(int fd, uint8_t *packet, size_t len, size_t hdrlen)
+{
+ int ret;
+ size_t offset = 0;
+ ssize_t remainder;
+
+ offset = iov[iov_slot].iov_len - iov_off_rd;
+ remainder = hdrlen - offset;
+ if (remainder < 0)
+ remainder = 0;
+
+ bug_on(offset + remainder != hdrlen);
+
+ fmemcpy(packet, iov[iov_slot].iov_base + iov_off_rd, offset);
+ iov_off_rd = 0;
+ iov_slot++;
+
+ if (iov_slot == array_size(iov)) {
+ iov_slot = 0;
+ ret = readv(fd, iov, array_size(iov));
+ if (unlikely(ret <= 0))
+ return -EIO;
+ }
+
+ fmemcpy(packet + offset, iov[iov_slot].iov_base + iov_off_rd, remainder);
+ iov_off_rd += remainder;
+
+ return hdrlen;
+}
+
+static ssize_t pcap_sg_read(int fd, pcap_pkthdr_t *phdr, enum pcap_type type,
+ uint8_t *packet, size_t len)
+{
+ ssize_t ret = 0;
+ size_t hdrsize = pcap_get_hdr_length(phdr, type), hdrlen;
+
+ if (likely(iov[iov_slot].iov_len - iov_off_rd >= hdrsize)) {
+ fmemcpy(&phdr->raw, iov[iov_slot].iov_base + iov_off_rd, hdrsize);
+ iov_off_rd += hdrsize;
+ } else {
+ ret = __pcap_sg_inter_iov_hdr_read(fd, phdr, type, packet,
+ len, hdrsize);
+ if (unlikely(ret < 0))
+ return ret;
+ }
+
+ hdrlen = pcap_get_length(phdr, type);
+ if (unlikely(hdrlen == 0 || hdrlen > len))
+ return -EINVAL;
+
+ if (likely(iov[iov_slot].iov_len - iov_off_rd >= hdrlen)) {
+ fmemcpy(packet, iov[iov_slot].iov_base + iov_off_rd, hdrlen);
+ iov_off_rd += hdrlen;
+ } else {
+ ret = __pcap_sg_inter_iov_data_read(fd, packet, len, hdrlen);
+ if (unlikely(ret < 0))
+ return ret;
+ }
+
+ return hdrsize + hdrlen;
+}
+
+static void pcap_sg_fsync(int fd)
+{
+ ssize_t ret = writev(fd, iov, iov_slot);
+ if (ret < 0)
+ panic("Writev I/O error: %s!\n", strerror(errno));
+
+ iov_slot = 0;
+ fdatasync(fd);
+}
+
+static int pcap_sg_prepare_access(int fd, enum pcap_mode mode, bool jumbo)
+{
+ int i, ret;
+ size_t len = 0;
+
+ iov_slot = 0;
+ len = jumbo ? (PAGE_SIZE * 16) /* 64k max */ :
+ (PAGE_SIZE * 3) /* 12k max */;
+
+ for (i = 0; i < array_size(iov); ++i) {
+ iov[i].iov_base = xzmalloc_aligned(len, 64);
+ iov[i].iov_len = len;
+ }
+
+ set_ioprio_rt();
+
+ if (mode == PCAP_MODE_RD) {
+ ret = readv(fd, iov, array_size(iov));
+ if (ret <= 0)
+ return -EIO;
+
+ iov_off_rd = 0;
+ iov_slot = 0;
+ }
+
+ return 0;
+}
+
+static void pcap_sg_prepare_close(int fd, enum pcap_mode mode)
+{
+ int i;
+
+ for (i = 0; i < array_size(iov); ++i)
+ xfree(iov[i].iov_base);
+}
+
+const struct pcap_file_ops pcap_sg_ops = {
+ .pull_fhdr_pcap = pcap_generic_pull_fhdr,
+ .push_fhdr_pcap = pcap_generic_push_fhdr,
+ .prepare_access_pcap = pcap_sg_prepare_access,
+ .prepare_close_pcap = pcap_sg_prepare_close,
+ .read_pcap = pcap_sg_read,
+ .write_pcap = pcap_sg_write,
+ .fsync_pcap = pcap_sg_fsync,
+};
diff --git a/pkt_buff.h b/pkt_buff.h
new file mode 100644
index 0000000..f86c011
--- /dev/null
+++ b/pkt_buff.h
@@ -0,0 +1,112 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright (C) 2012 Christoph Jaeger <christoph@netsniff-ng.org>
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef PKT_BUFF_H
+#define PKT_BUFF_H
+
+#include "hash.h"
+#include "built_in.h"
+#include "proto.h"
+#include "xmalloc.h"
+
+struct pkt_buff {
+ /* invariant: head <= data <= tail */
+ uint8_t *head;
+ uint8_t *data;
+ uint8_t *tail;
+ unsigned int size;
+
+ struct protocol *proto;
+};
+
+static inline struct pkt_buff *pkt_alloc(uint8_t *packet, unsigned int len)
+{
+ struct pkt_buff *pkt = xmalloc(sizeof(*pkt));
+
+ pkt->head = packet;
+ pkt->data = packet;
+ pkt->tail = packet + len;
+ pkt->size = len;
+ pkt->proto = NULL;
+
+ return pkt;
+}
+
+static inline void pkt_free(struct pkt_buff *pkt)
+{
+ xfree(pkt);
+}
+
+static inline unsigned int pkt_len(struct pkt_buff *pkt)
+{
+ bug_on(!pkt || pkt->data > pkt->tail);
+
+ return pkt->tail - pkt->data;
+}
+
+static inline uint8_t *pkt_pull(struct pkt_buff *pkt, unsigned int len)
+{
+ uint8_t *data = NULL;
+
+ bug_on(!pkt || pkt->head > pkt->data || pkt->data > pkt->tail);
+
+ if (len <= pkt_len(pkt)) {
+ data = pkt->data;
+ pkt->data += len;
+ }
+
+ bug_on(!pkt || pkt->head > pkt->data || pkt->data > pkt->tail);
+
+ return data;
+}
+
+static inline uint8_t *pkt_peek(struct pkt_buff *pkt)
+{
+ bug_on(!pkt || pkt->head > pkt->data || pkt->data > pkt->tail);
+
+ return pkt->data;
+}
+
+static inline unsigned int pkt_trim(struct pkt_buff *pkt, unsigned int len)
+{
+ unsigned int ret = 0;
+
+ bug_on(!pkt || pkt->head > pkt->data || pkt->data > pkt->tail);
+
+ if (len <= pkt_len(pkt))
+ ret = len;
+
+ pkt->tail -= ret;
+ bug_on(!pkt || pkt->head > pkt->data || pkt->data > pkt->tail);
+
+ return ret;
+}
+
+static inline uint8_t *pkt_pull_tail(struct pkt_buff *pkt, unsigned int len)
+{
+ uint8_t *tail = NULL;
+
+ bug_on(!pkt || pkt->head > pkt->data || pkt->data > pkt->tail);
+
+ if (len <= pkt_len(pkt)) {
+ tail = pkt->tail;
+ pkt->tail -= len;
+ }
+
+ return tail;
+}
+
+static inline void pkt_set_proto(struct pkt_buff *pkt, struct hash_table *table,
+ unsigned int key)
+{
+ bug_on(!pkt || !table);
+
+ pkt->proto = (struct protocol *) lookup_hash(key, table);
+ while (pkt->proto && key != pkt->proto->key)
+ pkt->proto = pkt->proto->next;
+}
+
+#endif /* PKT_BUFF_H */
diff --git a/proto.h b/proto.h
new file mode 100644
index 0000000..623caf6
--- /dev/null
+++ b/proto.h
@@ -0,0 +1,34 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright (C) 2009, 2010 Daniel Borkmann
+ * Copyright (C) 2012 Christoph Jaeger <christoph@netsniff-ng.org>
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef PROTO_H
+#define PROTO_H
+
+#include <ctype.h>
+#include <stdint.h>
+
+#include "hash.h"
+#include "tprintf.h"
+
+struct pkt_buff;
+
+struct protocol {
+ /* Needs to be filled out by user */
+ unsigned int key;
+ void (*print_full)(struct pkt_buff *pkt);
+ void (*print_less)(struct pkt_buff *pkt);
+ /* Used by program logic */
+ struct protocol *next;
+ void (*process) (struct pkt_buff *pkt);
+};
+
+extern void empty(struct pkt_buff *pkt);
+extern void hex(struct pkt_buff *pkt);
+extern void ascii(struct pkt_buff *pkt);
+extern void hex_ascii(struct pkt_buff *pkt);
+
+#endif /* PROTO_H */
diff --git a/proto_80211_mac_hdr.c b/proto_80211_mac_hdr.c
new file mode 100644
index 0000000..a496a1e
--- /dev/null
+++ b/proto_80211_mac_hdr.c
@@ -0,0 +1,3627 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2012, 2013 Markus Amend <markus@netsniff-ng.org>
+ * Copyright 2012 Daniel Borkmann <daniel@netsniff-ng.org>
+ * Subject to the GPL, version 2.
+ */
+
+/* TODO
+ * check all possible frame combinations for their behavior
+ * with respect to endianess (little / big)
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <netinet/in.h> /* for ntohs() */
+#include <asm/byteorder.h>
+#include <arpa/inet.h> /* for inet_ntop() */
+
+#include "proto.h"
+#include "protos.h"
+#include "dissector_80211.h"
+#include "built_in.h"
+#include "pkt_buff.h"
+#include "oui.h"
+
+#define TU 0.001024
+
+/* Note: Fields are encoded in little-endian! */
+struct ieee80211_frm_ctrl {
+ union {
+ u16 frame_control;
+ struct {
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+ /* Correct order here ... */
+ __extension__ u16 proto_version:2,
+ type:2,
+ subtype:4,
+ to_ds:1,
+ from_ds:1,
+ more_frags:1,
+ retry:1,
+ power_mgmt:1,
+ more_data:1,
+ wep:1,
+ order:1;
+#elif defined(__BIG_ENDIAN_BITFIELD)
+ __extension__ u16 subtype:4,
+ type:2,
+ proto_version:2,
+ order:1,
+ wep:1,
+ more_data:1,
+ power_mgmt:1,
+ retry:1,
+ more_frags:1,
+ from_ds:1,
+ to_ds:1;
+#else
+# error "Adjust your <asm/byteorder.h> defines"
+#endif
+ };
+ };
+} __packed;
+
+/* Management Frame start */
+/* Note: Fields are encoded in little-endian! */
+struct ieee80211_mgmt {
+ u16 duration;
+ u8 da[6];
+ u8 sa[6];
+ u8 bssid[6];
+ u16 seq_ctrl;
+} __packed;
+
+struct ieee80211_mgmt_auth {
+ u16 auth_alg;
+ u16 auth_transaction;
+ u16 status_code;
+ /* possibly followed by Challenge text */
+ u8 variable[0];
+} __packed;
+
+struct ieee80211_mgmt_deauth {
+ u16 reason_code;
+} __packed;
+
+struct ieee80211_mgmt_assoc_req {
+ u16 capab_info;
+ u16 listen_interval;
+ /* followed by SSID and Supported rates */
+ u8 variable[0];
+} __packed;
+
+struct ieee80211_mgmt_assoc_resp {
+ u16 capab_info;
+ u16 status_code;
+ u16 aid;
+ /* followed by Supported rates */
+ u8 variable[0];
+} __packed;
+
+struct ieee80211_mgmt_reassoc_resp {
+ u16 capab_info;
+ u16 status_code;
+ u16 aid;
+ /* followed by Supported rates */
+ u8 variable[0];
+} __packed;
+
+struct ieee80211_mgmt_reassoc_req {
+ u16 capab_info;
+ u16 listen_interval;
+ u8 current_ap[6];
+ /* followed by SSID and Supported rates */
+ u8 variable[0];
+} __packed;
+
+struct ieee80211_mgmt_disassoc {
+ u16 reason_code;
+} __packed;
+
+struct ieee80211_mgmt_probe_req {
+} __packed;
+
+struct ieee80211_mgmt_beacon {
+ u64 timestamp;
+ u16 beacon_int;
+ u16 capab_info;
+ /* followed by some of SSID, Supported rates,
+ * FH Params, DS Params, CF Params, IBSS Params, TIM */
+ u8 variable[0];
+} __packed;
+
+struct ieee80211_mgmt_probe_resp {
+ u8 timestamp[8];
+ u16 beacon_int;
+ u16 capab_info;
+ /* followed by some of SSID, Supported rates,
+ * FH Params, DS Params, CF Params, IBSS Params, TIM */
+ u8 variable[0];
+} __packed;
+/* Management Frame end */
+
+/* Control Frame start */
+/* Note: Fields are encoded in little-endian! */
+struct ieee80211_ctrl {
+} __packed;
+
+struct ieee80211_ctrl_rts {
+ u16 duration;
+ u8 da[6];
+ u8 sa[6];
+} __packed;
+
+struct ieee80211_ctrl_cts {
+ u16 duration;
+ u8 da[6];
+} __packed;
+
+struct ieee80211_ctrl_ack {
+ u16 duration;
+ u8 da[6];
+} __packed;
+
+struct ieee80211_ctrl_ps_poll {
+ u16 aid;
+ u8 bssid[6];
+ u8 sa[6];
+} __packed;
+
+struct ieee80211_ctrl_cf_end {
+ u16 duration;
+ u8 bssid[6];
+ u8 sa[6];
+} __packed;
+
+struct ieee80211_ctrl_cf_end_ack {
+ u16 duration;
+ u8 bssid[6];
+ u8 sa[6];
+} __packed;
+/* Control Frame end */
+
+/* Data Frame start */
+/* Note: Fields are encoded in little-endian! */
+struct ieee80211_data {
+} __packed;
+
+/* TODO: Extend */
+/* Data Frame end */
+
+struct element_reserved {
+ u8 len;
+} __packed;
+
+struct element_ssid {
+ u8 len;
+ u8 SSID[0];
+} __packed;
+
+struct element_supp_rates {
+ u8 len;
+ u8 rates[0];
+} __packed;
+
+struct element_fh_ps {
+ u8 len;
+ u16 dwell_time;
+ u8 hop_set;
+ u8 hop_pattern;
+ u8 hop_index;
+} __packed;
+
+struct element_dsss_ps {
+ u8 len;
+ u8 curr_ch;
+} __packed;
+
+struct element_cf_ps {
+ u8 len;
+ u8 cfp_cnt;
+ u8 cfp_period;
+ u16 cfp_max_dur;
+ u16 cfp_dur_rem;
+} __packed;
+
+struct element_tim {
+ u8 len;
+ u8 dtim_cnt;
+ u8 dtim_period;
+ u8 bmp_cntrl;
+ u8 part_virt_bmp[0];
+} __packed;
+
+struct element_ibss_ps {
+ u8 len;
+ u16 atim_win;
+} __packed;
+
+struct element_country_tripled {
+ u8 frst_ch;
+ u8 nr_ch;
+ u8 max_trans;
+} __packed;
+
+struct element_country {
+ u8 len;
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+ /* Correct order here ... */
+ u8 country_first;
+ u8 country_sec;
+ u8 country_third;
+#elif defined(__BIG_ENDIAN_BITFIELD)
+ u8 country_third;
+ u8 country_sec;
+ u8 country_first;
+#else
+# error "Adjust your <asm/byteorder.h> defines"
+#endif
+ /* triplet may repeat */
+ struct element_country_tripled tripled [0];
+ /* end triplet */
+ u8 pad[0];
+} __packed;
+
+struct element_hop_pp {
+ u8 len;
+ u8 prime_radix;
+ u8 nr_ch;
+} __packed;
+
+struct element_hop_pt {
+ u8 len;
+ u8 flag;
+ u8 nr_sets;
+ u8 modules;
+ u8 offs;
+ u8 rand_tabl[0];
+} __packed;
+
+struct element_req {
+ u8 len;
+ u8 req_elem_idl[0];
+} __packed;
+
+struct element_bss_load {
+ u8 len;
+ u16 station_cnt;
+ u8 ch_util;
+ u16 avlb_adm_cap;
+} __packed;
+
+struct element_edca_ps {
+ u8 len;
+ u8 qos_inf;
+ u8 res;
+ u32 ac_be;
+ u32 ac_bk;
+ u32 ac_vi;
+ u32 ac_vo;
+} __packed;
+
+struct element_tspec {
+ union {
+ u32 len_ts_info;
+ struct {
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+ /* Correct order here ... */
+ __extension__ u32 len:8,
+ traffic_type:1,
+ tsid:4,
+ direction:2,
+ access_policy:2,
+ aggr:1,
+ apsd:1,
+ user_prior:3,
+ tsinfo_ack_pol:2,
+ schedule:1,
+ res:7;
+#elif defined(__BIG_ENDIAN_BITFIELD)
+ __extension__ u32 len:8,
+ res:7,
+ schedule:1,
+ tsinfo_ack_pol:2,
+ user_prior:3,
+ apsd:1,
+ aggr:1,
+ access_policy:2,
+ direction:2,
+ tsid:4,
+ traffic_type:1;
+#else
+# error "Adjust your <asm/byteorder.h> defines"
+#endif
+ };
+ };
+ u16 nom_msdu_size;
+ u16 max_msdu_size;
+ u32 min_srv_intv;
+ u32 max_srv_intv;
+ u32 inactive_intv;
+ u32 susp_intv;
+ u32 srv_start_time;
+ u32 min_data_rate;
+ u32 mean_data_rate;
+ u32 peak_data_rate;
+ u32 burst_size;
+ u32 delay_bound;
+ u32 min_phy_rate;
+ u16 surplus_bandw_allow;
+ u16 med_time;
+} __packed;
+
+struct element_tclas {
+ u8 len;
+ u8 user_priority;
+ u8 frm_class[0];
+} __packed;
+
+struct element_tclas_frm_class {
+ u8 type;
+ u8 mask;
+ u8 param[0];
+} __packed;
+
+struct element_tclas_type0 {
+ u8 sa[6];
+ u8 da[6];
+ u16 type;
+} __packed;
+
+struct element_tclas_type1 {
+ u8 version;
+ u8 subparam[0];
+} __packed;
+
+struct element_tclas_type1_ip4 {
+ u32 sa;
+ u32 da;
+ u16 sp;
+ u16 dp;
+ u8 dscp;
+ u8 proto;
+ u8 reserved;
+} __packed;
+
+struct element_tclas_type1_ip6 {
+ struct in6_addr sa;
+ struct in6_addr da;
+ u16 sp;
+ u16 dp;
+ union {
+ u8 flow_label[3];
+ struct {
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+ __extension__ u8 flow_label3:8;
+ __extension__ u8 flow_label2:8;
+ __extension__ u8 flow_label1:8;
+#elif defined(__BIG_ENDIAN_BITFIELD)
+ __extension__ u8 flow_label1:8;
+ __extension__ u8 flow_label2:8;
+ __extension__ u8 flow_label3:8;
+#else
+# error "Adjust your <asm/byteorder.h> defines"
+#endif
+ };
+ };
+} __packed;
+
+struct element_tclas_type2 {
+ u16 vlan_tci;
+} __packed;
+
+struct element_tclas_type3 {
+ u16 offs;
+ u8 value[0];
+ u8 mask[0];
+} __packed;
+
+struct element_tclas_type4 {
+ u8 version;
+ u8 subparam[0];
+} __packed;
+
+struct element_tclas_type4_ip4 {
+ u32 sa;
+ u32 da;
+ u16 sp;
+ u16 dp;
+ u8 dscp;
+ u8 proto;
+ u8 reserved;
+} __packed;
+
+struct element_tclas_type4_ip6 {
+ struct in6_addr sa;
+ struct in6_addr da;
+ u16 sp;
+ u16 dp;
+ u8 dscp;
+ u8 nxt_hdr;
+ union {
+ u8 flow_label[3];
+ struct {
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+ __extension__ u8 flow_label3:8;
+ __extension__ u8 flow_label2:8;
+ __extension__ u8 flow_label1:8;
+#elif defined(__BIG_ENDIAN_BITFIELD)
+ __extension__ u8 flow_label1:8;
+ __extension__ u8 flow_label2:8;
+ __extension__ u8 flow_label3:8;
+#else
+# error "Adjust your <asm/byteorder.h> defines"
+#endif
+ };
+ };
+} __packed;
+
+struct element_tclas_type5 {
+ u8 pcp;
+ u8 cfi;
+ u8 vid;
+} __packed;
+
+struct element_schedule {
+ u8 len;
+ u16 inf;
+ u32 start;
+ u32 serv_intv;
+ u16 spec_intv;
+} __packed;
+
+struct element_chall_txt {
+ u8 len;
+ u8 chall_txt[0];
+} __packed;
+
+struct element_pwr_constr {
+ u8 len;
+ u8 local_pwr_constr;
+} __packed;
+
+struct element_pwr_cap {
+ u8 len;
+ u8 min_pwr_cap;
+ u8 max_pwr_cap;
+} __packed;
+
+struct element_tpc_req {
+ u8 len;
+} __packed;
+
+struct element_tpc_rep {
+ u8 len;
+ u8 trans_pwr;
+ u8 link_marg;
+} __packed;
+
+struct element_supp_ch {
+ u8 len;
+ u8 first_ch_nr[0];
+ u8 nr_ch[0];
+} __packed;
+
+struct element_supp_ch_tuple {
+ u8 first_ch_nr;
+ u8 nr_ch;
+} __packed;
+
+struct element_ch_sw_ann {
+ u8 len;
+ u8 switch_mode;
+ u8 new_nr;
+ u8 switch_cnt;
+} __packed;
+
+struct element_meas_basic {
+ u8 ch_nr;
+ u64 start;
+ u16 dur;
+} __packed;
+
+struct element_meas_cca {
+ u8 ch_nr;
+ u64 start;
+ u16 dur;
+} __packed;
+
+struct element_meas_rpi {
+ u8 ch_nr;
+ u64 start;
+ u16 dur;
+} __packed;
+
+struct element_meas_ch_load {
+ u8 op_class;
+ u8 ch_nr;
+ u16 rand_intv;
+ u16 dur;
+ u8 sub[0];
+} __packed;
+
+struct element_meas_noise {
+ u8 op_class;
+ u8 ch_nr;
+ u16 rand_intv;
+ u16 dur;
+ u8 sub[0];
+} __packed;
+
+struct element_meas_beacon {
+ u8 op_class;
+ u8 ch_nr;
+ u16 rand_intv;
+ u16 dur;
+ u8 mode;
+ u8 bssid[6];
+ u8 sub[0];
+} __packed;
+
+struct element_meas_frame {
+ u8 op_class;
+ u8 ch_nr;
+ u16 rand_intv;
+ u16 dur;
+ u8 frame;
+ u8 mac[6];
+ u8 sub[0];
+} __packed;
+
+struct element_meas_sta {
+ u8 peer_mac[6];
+ u16 rand_intv;
+ u16 dur;
+ u8 group_id;
+ u8 sub[0];
+} __packed;
+
+struct element_meas_lci {
+ u8 loc_subj;
+ u8 latitude_req_res;
+ u8 longitude_req_res;
+ u8 altitude_req_res;
+ u8 sub[0];
+} __packed;
+
+struct element_meas_trans_str_cat {
+ u16 rand_intv;
+ u16 dur;
+ u8 peer_sta_addr[6];
+ u8 traffic_id;
+ u8 bin_0_range;
+ u8 sub[0];
+} __packed;
+
+struct element_meas_mcast_diag {
+ u16 rand_intv;
+ u16 dur;
+ u8 group_mac[6];
+ u8 mcast_triggered[0];
+ u8 sub[0];
+} __packed;
+
+struct element_meas_loc_civic {
+ u8 loc_subj;
+ u8 civic_loc;
+ u8 loc_srv_intv_unit;
+ u16 loc_srv_intv;
+ u8 sub[0];
+} __packed;
+
+struct element_meas_loc_id {
+ u8 loc_subj;
+ u8 loc_srv_intv_unit;
+ u16 loc_srv_intv;
+ u8 sub[0];
+} __packed;
+
+struct element_meas_pause {
+ u8 time;
+ u8 sub[0];
+} __packed;
+
+struct element_meas_req {
+ u8 len;
+ u8 token;
+ u8 req_mode;
+ u8 type;
+ u8 req[0];
+} __packed;
+
+struct element_meas_rep {
+ u8 len;
+ u8 token;
+ u8 rep_mode;
+ u8 type;
+ u8 rep[0];
+} __packed;
+
+struct element_quiet {
+ u8 len;
+ u8 cnt;
+ u8 period;
+ u16 dur;
+ u16 offs;
+} __packed;
+
+struct element_ibss_dfs {
+ u8 len;
+ u8 owner[6];
+ u8 rec_intv;
+ u8 ch_map[0];
+} __packed;
+
+struct element_ibss_dfs_tuple {
+ u8 ch_nr;
+ u8 map;
+} __packed;
+
+struct element_erp {
+ u8 len;
+ u8 param;
+} __packed;
+
+struct element_ts_del {
+ u8 len;
+ u32 delay;
+} __packed;
+
+struct element_tclas_proc {
+ u8 len;
+ u8 proc;
+} __packed;
+
+struct element_ht_cap {
+ u8 len;
+ union {
+ u16 info;
+ struct {
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+ /* Correct order here ... */
+ __extension__ u16 ldpc:1,
+ supp_width:1,
+ sm_pwr:2,
+ ht_green:1,
+ gi_20mhz:1,
+ gi_40mhz:1,
+ tx_stbc:1,
+ rx_stbc:2,
+ ht_ack:1,
+ max_msdu_length:1,
+ dsss_ck_mode:1,
+ res:1,
+ forty_int:1,
+ prot_supp:1;
+#elif defined(__BIG_ENDIAN_BITFIELD)
+ __extension__ u16 rx_stbc:2,
+ ht_ack:1,
+ max_msdu_length:1,
+ dsss_ck_mode:1,
+ res:1,
+ forty_int:1,
+ prot_supp:1,
+ ldpc:1,
+ supp_width:1,
+ sm_pwr:2,
+ ht_green:1,
+ gi_20mhz:1,
+ gi_40mhz:1,
+ tx_stbc:1;
+#else
+# error "Adjust your <asm/byteorder.h> defines"
+#endif
+ };
+ };
+ u8 param;
+ union {
+ u8 mcs_set[16];
+ struct {
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+ /* Correct order here ... */
+ __extension__ u8 bitmask1:8;
+ __extension__ u8 bitmask2:8;
+ __extension__ u8 bitmask3:8;
+ __extension__ u8 bitmask4:8;
+ __extension__ u8 bitmask5:8;
+ __extension__ u8 bitmask6:8;
+ __extension__ u8 bitmask7:8;
+ __extension__ u8 bitmask8:8;
+ __extension__ u8 bitmask9:8;
+ __extension__ u8 bitmask10_res:8;
+ __extension__ u16 supp_rate_res:16;
+ __extension__ u32 tx_param_res:32;
+
+#elif defined(__BIG_ENDIAN_BITFIELD)
+ __extension__ u32 tx_param_res:32;
+ __extension__ u16 supp_rate_res:16;
+ __extension__ u8 bitmask10_res:8;
+ __extension__ u8 bitmask9:8;
+ __extension__ u8 bitmask8:8;
+ __extension__ u8 bitmask7:8;
+ __extension__ u8 bitmask6:8;
+ __extension__ u8 bitmask5:8;
+ __extension__ u8 bitmask4:8;
+ __extension__ u8 bitmask3:8;
+ __extension__ u8 bitmask2:8;
+ __extension__ u8 bitmask1:8;
+#else
+# error "Adjust your <asm/byteorder.h> defines"
+#endif
+ };
+ };
+ u16 ext_cap;
+ u32 beam_cap;
+ u8 asel_cap;
+} __packed;
+
+struct element_qos_cap {
+ u8 len;
+ u8 info;
+} __packed;
+
+struct element_ext_supp_rates {
+ u8 len;
+ u8 rates[0];
+} __packed;
+
+struct element_vend_spec {
+ u8 len;
+ u8 oui[0];
+ u8 specific[0];
+} __packed;
+
+static int8_t len_neq_error(u8 len, u8 intended)
+{
+ if(intended != len) {
+ tprintf("Length should be %u Bytes", intended);
+ return 1;
+ }
+
+ return 0;
+}
+
+static int8_t len_lt_error(u8 len, u8 intended)
+{
+ if(len < intended) {
+ tprintf("Length should be greater %u Bytes", intended);
+ return 1;
+ }
+
+ return 0;
+}
+
+static float data_rates(u8 id)
+{
+ /* XXX Why not (id / 2.f)? */
+ switch (id) {
+ case 2: return 1.0f;
+ case 3: return 1.5f;
+ case 4: return 2.0f;
+ case 5: return 2.5f;
+ case 6: return 3.0f;
+ case 9: return 4.5f;
+ case 11: return 5.5f;
+ case 12: return 6.0f;
+ case 18: return 9.0f;
+ case 22: return 11.0f;
+ case 24: return 12.0f;
+ case 27: return 13.5f;
+ case 36: return 18.0f;
+ case 44: return 22.0f;
+ case 48: return 24.0f;
+ case 54: return 27.0f;
+ case 66: return 33.0f;
+ case 72: return 36.0f;
+ case 96: return 48.0f;
+ case 108: return 54.0f;
+ }
+
+ return 0.f;
+}
+
+struct subelement {
+ u8 id;
+ u8 len;
+ u8 data[0];
+} __packed;
+
+
+static int8_t subelements(struct pkt_buff *pkt, u8 len)
+{
+ u8 i, j;
+ u8 *data;
+
+ for (i=0; i<len;) {
+ struct subelement *sub;
+
+ sub = (struct subelement *) pkt_pull(pkt, sizeof(*sub));
+ if (sub == NULL)
+ return 0;
+
+ tprintf(", Subelement ID %u, ", sub->id);
+ tprintf("Length %u, ", sub->len);
+
+ data = pkt_pull(pkt, sub->len);
+ if (data == NULL)
+ return 0;
+
+ tprintf("Data: 0x");
+ for(j=0; j < sub->len; j++)
+ tprintf("%.2x ", data[j]);
+
+ i += sub->len + 1;
+ }
+
+ /* Not needed ?! Should break before*/
+ /*
+ *if (i != len) {
+ * tprintf("Length error");
+ * return 0;
+ *}
+ */
+
+ return 1;
+}
+
+static int8_t inf_reserved(struct pkt_buff *pkt, u8 *id)
+{
+ u8 i;
+ u8 *data;
+ struct element_reserved *reserved;
+
+ reserved = (struct element_reserved *) pkt_pull(pkt, sizeof(*reserved));
+ if (reserved == NULL)
+ return 0;
+
+ tprintf("Reserved (%u, Len (%u)): ", *id, reserved->len);
+
+ data = pkt_pull(pkt, reserved->len);
+ if (data == NULL)
+ return 0;
+
+ tprintf("Data 0x");
+ for (i = 0; i < reserved->len; i++)
+ tprintf("%.2x", data[i]);
+
+ return 1;
+}
+
+static int8_t inf_ssid(struct pkt_buff *pkt, u8 *id)
+{
+ u8 i;
+ struct element_ssid *ssid;
+ char *ssid_name;
+
+ ssid = (struct element_ssid *) pkt_pull(pkt, sizeof(*ssid));
+ if (ssid == NULL)
+ return 0;
+
+ tprintf(" SSID (%u, Len (%u)): ", *id, ssid->len);
+
+ if ((ssid->len - sizeof(*ssid) + 1) > 0) {
+ ssid_name = (char *) pkt_pull(pkt, ssid->len);
+ if (ssid_name == NULL)
+ return 0;
+
+ for (i = 0; i < ssid->len; i++)
+ tprintf("%c",ssid_name[i]);
+ } else {
+ tprintf("Wildcard SSID");
+ }
+
+ return 1;
+}
+
+static int8_t inf_supp_rates(struct pkt_buff *pkt, u8 *id)
+{
+ u8 i;
+ u8 *rates;
+ struct element_supp_rates *supp_rates;
+
+ supp_rates = (struct element_supp_rates *)
+ pkt_pull(pkt, sizeof(*supp_rates));
+ if (supp_rates == NULL)
+ return 0;
+
+ tprintf(" Supp. Rates (%u, Len (%u)): ", *id, supp_rates->len);
+ if (len_lt_error(supp_rates->len, 1))
+ return 0;
+
+ if ((supp_rates->len - sizeof(*supp_rates) + 1) > 0) {
+ rates = pkt_pull(pkt, supp_rates->len);
+ if (rates == NULL)
+ return 0;
+
+ for (i = 0; i < supp_rates->len; i++)
+ tprintf("%g%s ", ((rates[i] & 0x80) >> 7) ?
+ data_rates(rates[i] & 0x3f) :
+ ((rates[i] & 0x3f) * 0.5),
+ ((rates[i] & 0x80) >> 7) ? "(B)" : "");
+ return 1;
+ }
+
+ return 0;
+}
+
+static int8_t inf_fh_ps(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_fh_ps *fh_ps;
+
+ fh_ps = (struct element_fh_ps *) pkt_pull(pkt, sizeof(*fh_ps));
+ if (fh_ps == NULL)
+ return 0;
+
+ tprintf(" FH Param Set (%u, Len(%u)): ", *id, fh_ps->len);
+ if (len_neq_error(fh_ps->len, 5))
+ return 0;
+ tprintf("Dwell Time: %fs, ", le16_to_cpu(fh_ps->dwell_time) * TU);
+ tprintf("HopSet: %u, ", fh_ps->hop_set);
+ tprintf("HopPattern: %u, ", fh_ps->hop_pattern);
+ tprintf("HopIndex: %u", fh_ps->hop_index);
+
+ return 1;
+}
+
+static int8_t inf_dsss_ps(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_dsss_ps *dsss_ps;
+
+ dsss_ps = (struct element_dsss_ps *) pkt_pull(pkt, sizeof(*dsss_ps));
+ if (dsss_ps == NULL)
+ return 0;
+
+ tprintf(" DSSS Param Set (%u, Len(%u)): ", *id, dsss_ps->len);
+ if (len_neq_error(dsss_ps->len, 1))
+ return 0;
+ tprintf("Current Channel: %u", dsss_ps->curr_ch);
+
+ return 1;
+}
+
+static int8_t inf_cf_ps(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_cf_ps *cf_ps;
+
+ cf_ps = (struct element_cf_ps *) pkt_pull(pkt, sizeof(*cf_ps));
+ if (cf_ps == NULL)
+ return 0;
+
+ tprintf(" CF Param Set (%u, Len(%u)): ", *id, cf_ps->len);
+ if (len_neq_error(cf_ps->len, 6))
+ return 0;
+ tprintf("CFP Count: %u, ", cf_ps->cfp_cnt);
+ tprintf("CFP Period: %u, ", cf_ps->cfp_period);
+ tprintf("CFP MaxDur: %fs, ", le16_to_cpu(cf_ps->cfp_max_dur) * TU);
+ tprintf("CFP DurRem: %fs", le16_to_cpu(cf_ps->cfp_dur_rem) * TU);
+
+ return 1;
+}
+
+static int8_t inf_tim(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_tim *tim;
+ u8 i;
+
+ tim = (struct element_tim *) pkt_pull(pkt, sizeof(*tim));
+ if (tim == NULL)
+ return 0;
+
+ tprintf(" TIM (%u, Len(%u)): ", *id, tim->len);
+ if (len_lt_error(tim->len, 3))
+ return 0;
+ tprintf("DTIM Count: %u, ", tim->dtim_cnt);
+ tprintf("DTIM Period: %u, ", tim->dtim_period);
+ tprintf("Bitmap Control: %u, ", tim->bmp_cntrl);
+ if ((tim->len - sizeof(*tim) + 1) > 0) {
+ u8 *bmp = pkt_pull(pkt, (tim->len - sizeof(*tim) + 1));
+ if (bmp == NULL)
+ return 0;
+
+ tprintf("Partial Virtual Bitmap: 0x");
+ for (i = 0; i < (tim->len - sizeof(*tim) + 1); i++)
+ tprintf("%.2x", bmp[i]);
+ }
+
+ return 1;
+}
+
+static int8_t inf_ibss_ps(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_ibss_ps *ibss_ps;
+
+ ibss_ps = (struct element_ibss_ps *) pkt_pull(pkt, sizeof(*ibss_ps));
+ if (ibss_ps == NULL)
+ return 0;
+
+ tprintf(" IBSS Param Set (%u, Len(%u)): ", *id, ibss_ps->len);
+ if (len_neq_error(ibss_ps->len, 2))
+ return 0;
+ tprintf("ATIM Window: %fs", le16_to_cpu(ibss_ps->atim_win) * TU);
+
+ return 1;
+}
+
+static int8_t inf_country(struct pkt_buff *pkt, u8 *id)
+{
+ u8 i;
+ u8 *pad;
+ struct element_country *country;
+
+ country = (struct element_country *) pkt_pull(pkt, sizeof(*country));
+ if (country == NULL)
+ return 0;
+
+ tprintf(" Country (%u, Len(%u)): ", *id, country->len);
+ if (len_lt_error(country->len, 6))
+ return 0;
+ tprintf("Country String: %c%c%c", country->country_first,
+ country->country_sec, country->country_third);
+
+ for (i = country->len % 3; i < (country->len - 3); i += 3) {
+ struct element_country_tripled *country_tripled;
+
+ country_tripled = (struct element_country_tripled *)
+ pkt_pull(pkt, sizeof(*country_tripled));
+ if (country_tripled == NULL)
+ return 0;
+
+ if(country_tripled->frst_ch >= 201) {
+ tprintf("Oper Ext ID: %u, ", country_tripled->frst_ch);
+ tprintf("Operating Class: %u, ", country_tripled->nr_ch);
+ tprintf("Coverage Class: %u", country_tripled->max_trans);
+ } else {
+ tprintf("First Ch Nr: %u, ", country_tripled->frst_ch);
+ tprintf("Nr of Ch: %u, ", country_tripled->nr_ch);
+ tprintf("Max Transmit Pwr Lvl: %u", country_tripled->max_trans);
+ }
+ }
+
+ if(country->len % 3) {
+ pad = pkt_pull(pkt, 1);
+ if (pad == NULL)
+ return 0;
+
+ tprintf(", Pad: 0x%x", *pad);
+ }
+
+ return 1;
+}
+
+static int8_t inf_hop_pp(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_hop_pp *hop_pp;
+
+ hop_pp = (struct element_hop_pp *) pkt_pull(pkt, sizeof(*hop_pp));
+ if (hop_pp == NULL)
+ return 0;
+
+ tprintf(" Hopping Pattern Param (%u, Len(%u)): ", *id, hop_pp->len);
+ if (len_neq_error(hop_pp->len, 2))
+ return 0;
+ tprintf("Prime Radix: %u, ", hop_pp->prime_radix);
+ tprintf("Nr of Ch: %u", hop_pp->nr_ch);
+
+ return 1;
+}
+
+static int8_t inf_hop_pt(struct pkt_buff *pkt, u8 *id)
+{
+ int i;
+ u8 *rand_tabl;
+ struct element_hop_pt *hop_pt;
+
+ hop_pt = (struct element_hop_pt *) pkt_pull(pkt, sizeof(*hop_pt));
+ if (hop_pt == NULL)
+ return 0;
+
+ tprintf(" Hopping Pattern Table (%u, Len(%u)): ", *id, hop_pt->len);
+ if (len_lt_error(hop_pt->len, 4))
+ return 0;
+ tprintf("Flag: %u, ", hop_pt->flag);
+ tprintf("Nr of Sets: %u, ", hop_pt->nr_sets);
+ tprintf("Modulus: %u, ", hop_pt->modules);
+ tprintf("Offs: %u", hop_pt->offs);
+
+ if ((hop_pt->len - sizeof(*hop_pt) + 1) > 0) {
+ rand_tabl = pkt_pull(pkt, (hop_pt->len - sizeof(*hop_pt) + 1));
+ if (rand_tabl == NULL)
+ return 0;
+
+ tprintf(", Rand table: 0x");
+ for (i = 0; i < (hop_pt->len - sizeof(*hop_pt) + 1); i++)
+ tprintf("%.2x", rand_tabl[i]);
+ }
+
+ return 1;
+}
+
+static int8_t inf_req(struct pkt_buff *pkt, u8 *id)
+{
+ int i;
+ struct element_req *req;
+ u8 *req_ids;
+
+ req = (struct element_req *) pkt_pull(pkt, sizeof(*req));
+ if (req == NULL)
+ return 0;
+
+ tprintf(" Request Element (%u, Len(%u)): ", *id, req->len);
+ if ((req->len - sizeof(*req) + 1) > 0) {
+ req_ids = pkt_pull(pkt, (req->len - sizeof(*req) + 1));
+ if (req_ids == NULL)
+ return 0;
+
+ tprintf(", Requested Element IDs: ");
+ for (i = 0; i < (req->len - sizeof(*req) + 1); i++)
+ tprintf("%u ", req_ids[i]);
+ }
+
+ return 1;
+}
+
+static int8_t inf_bss_load(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_bss_load *bss_load;
+
+ bss_load = (struct element_bss_load *) pkt_pull(pkt, sizeof(*bss_load));
+ if (bss_load == NULL)
+ return 0;
+
+ tprintf(" BSS Load element (%u, Len(%u)): ", *id, bss_load->len);
+ if (len_neq_error(bss_load->len, 5))
+ return 0;
+ tprintf("Station Count: %u, ", le16_to_cpu(bss_load->station_cnt));
+ tprintf("Channel Utilization: %u, ", bss_load->ch_util);
+ tprintf("Available Admission Capacity: %uus",
+ bss_load->avlb_adm_cap * 32);
+
+ return 1;
+}
+
+static int8_t inf_edca_ps(struct pkt_buff *pkt, u8 *id)
+{
+ u32 ac_be, ac_bk, ac_vi, ac_vo;
+ struct element_edca_ps *edca_ps;
+
+ edca_ps = (struct element_edca_ps *) pkt_pull(pkt, sizeof(*edca_ps));
+ if (edca_ps == NULL)
+ return 0;
+
+ ac_be = le32_to_cpu(edca_ps->ac_be);
+ ac_bk = le32_to_cpu(edca_ps->ac_bk);
+ ac_vi = le32_to_cpu(edca_ps->ac_vi);
+ ac_vo = le32_to_cpu(edca_ps->ac_vo);
+
+ tprintf(" EDCA Param Set (%u, Len(%u)): ", *id, edca_ps->len);
+ if (len_neq_error(edca_ps->len, 18))
+ return 0;
+ tprintf("QoS Info: 0x%x (-> EDCA Param Set Update Count (%u),"
+ "Q-Ack (%u), Queue Re (%u), TXOP Req(%u), Res(%u)), ",
+ edca_ps->qos_inf, edca_ps->qos_inf >> 4,
+ (edca_ps->qos_inf >> 3) & 1, (edca_ps->qos_inf >> 2) & 1,
+ (edca_ps->qos_inf >> 1) & 1, edca_ps->qos_inf & 1);
+ tprintf("Reserved: 0x%x, ", edca_ps->res);
+ tprintf("AC_BE Param Rec: 0x%x (-> AIFSN (%u), ACM (%u), ACI (%u),"
+ "Res (%u), ECWmin (%u), ECWmax(%u)), TXOP Limit (%uus)), ", ac_be,
+ ac_be >> 28, (ac_be >> 27) & 1, (ac_be >> 25) & 3,
+ (ac_be >> 24) & 1, (ac_be >> 20) & 15, (ac_be >> 16) & 15,
+ bswap_16(ac_be & 0xFFFF) * 32);
+ tprintf("AC_BK Param Rec: 0x%x (-> AIFSN (%u), ACM (%u), ACI (%u),"
+ "Res (%u), ECWmin (%u), ECWmax(%u)), TXOP Limit (%uus)), ", ac_bk,
+ ac_bk >> 28, (ac_bk >> 27) & 1, (ac_bk >> 25) & 3,
+ (ac_bk >> 24) & 1, (ac_bk >> 20) & 15, (ac_bk >> 16) & 15,
+ bswap_16(ac_bk & 0xFFFF) * 32);
+ tprintf("AC_VI Param Rec: 0x%x (-> AIFSN (%u), ACM (%u), ACI (%u),"
+ "Res (%u), ECWmin (%u), ECWmax(%u)), TXOP Limit (%uus)), ", ac_vi,
+ ac_vi >> 28, (ac_vi >> 27) & 1, (ac_vi >> 25) & 3,
+ (ac_vi >> 24) & 1, (ac_vi >> 20) & 15, (ac_vi >> 16) & 15,
+ bswap_16(ac_vi & 0xFFFF) * 32);
+ tprintf("AC_VO Param Rec: 0x%x (-> AIFSN (%u), ACM (%u), ACI (%u),"
+ "Res (%u), ECWmin (%u), ECWmax(%u)), TXOP Limit (%uus)", ac_vo,
+ ac_vo >> 28, (ac_vo >> 27) & 1, (ac_vo >> 25) & 3,
+ (ac_vo >> 24) & 1, (ac_vo >> 20) & 15, (ac_vo >> 16) & 15,
+ bswap_16(ac_vo & 0xFFFF) * 32);
+
+ return 1;
+}
+
+static int8_t inf_tspec(struct pkt_buff *pkt, u8 *id)
+{
+ u16 nom_msdu_size, surplus_bandw_allow;
+ struct element_tspec *tspec;
+
+ tspec = (struct element_tspec *) pkt_pull(pkt, sizeof(*tspec));
+ if (tspec == NULL)
+ return 0;
+
+ nom_msdu_size = le16_to_cpu(tspec->nom_msdu_size);
+ surplus_bandw_allow = le16_to_cpu(tspec->surplus_bandw_allow);
+
+ tprintf(" TSPEC (%u, Len(%u)): ", *id, tspec->len);
+ if (len_neq_error(tspec->len, 55))
+ return 0;
+ tprintf("Traffic Type: %u, ", tspec->traffic_type);
+ tprintf("TSID: %u, ", tspec->tsid);
+ tprintf("Direction: %u, ", tspec->direction);
+ tprintf("Access Policy: %u, ", tspec->access_policy);
+ tprintf("Aggregation: %u, ", tspec->aggr);
+ tprintf("APSD: %u, ", tspec->apsd);
+ tprintf("User Priority: %u, ", tspec->user_prior);
+ tprintf("TSinfo Ack Policy: %u, ", tspec->tsinfo_ack_pol);
+ tprintf("Schedule: %u, ", tspec->schedule);
+ tprintf("Reserved: 0x%x, ", tspec->res);
+ tprintf("Nominal MSDU Size: %uB (Fixed (%u)), ",
+ nom_msdu_size >> 1, nom_msdu_size & 1);
+ tprintf("Maximum MSDU Size: %uB, ", le16_to_cpu(tspec->max_msdu_size));
+ tprintf("Minimum Service Interval: %uus, ",
+ le32_to_cpu(tspec->min_srv_intv));
+ tprintf("Maximum Service Interval: %uus, ",
+ le32_to_cpu(tspec->max_srv_intv));
+ tprintf("Inactivity Interval: %uus, ",
+ le32_to_cpu(tspec->inactive_intv));
+ tprintf("Suspension Interval: %uus, ", le32_to_cpu(tspec->susp_intv));
+ tprintf("Service Start Time: %uus, ",
+ le32_to_cpu(tspec->srv_start_time));
+ tprintf("Minimum Data Rate: %ub/s, ",le32_to_cpu(tspec->min_data_rate));
+ tprintf("Mean Data Rate: %ub/s, ", le32_to_cpu(tspec->mean_data_rate));
+ tprintf("Peak Data Rate: %ub/s, ",le32_to_cpu(tspec->peak_data_rate));
+ tprintf("Burst Size: %uB, ", le32_to_cpu(tspec->burst_size));
+ tprintf("Delay Bound: %uus, ", le32_to_cpu(tspec->delay_bound));
+ tprintf("Minimum PHY Rate: %ub/s, ", le32_to_cpu(tspec->min_phy_rate));
+ tprintf("Surplus Bandwidth: %u.%u, ", surplus_bandw_allow >> 13,
+ surplus_bandw_allow & 0x1FFF);
+ tprintf("Medium Time: %uus", le16_to_cpu(tspec->med_time) * 32);
+
+ return 1;
+}
+
+static const char *class_type(u8 type)
+{
+ switch (type) {
+ case 0: return "Ethernet parameters";
+ case 1: return "TCP/UDP IP parameters";
+ case 2: return "IEEE 802.1Q parameters";
+ case 3: return "Filter Offset parameters";
+ case 4: return "IP and higher layer parameters";
+ case 5: return "IEEE 802.1D/Q parameters";
+ default: return "Reserved";
+ }
+}
+
+static int8_t inf_tclas(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_tclas *tclas;
+ struct element_tclas_frm_class *frm_class;
+
+ tclas = (struct element_tclas *) pkt_pull(pkt, sizeof(*tclas));
+ if (tclas == NULL)
+ return 0;
+
+ frm_class = (struct element_tclas_frm_class *)
+ pkt_pull(pkt, sizeof(*frm_class));
+ if (frm_class == NULL)
+ return 0;
+
+ tprintf(" TCLAS (%u, Len(%u)): ", *id, tclas->len);
+ if (len_lt_error(tclas->len, 3))
+ return 0;
+ tprintf("User Priority: %u, ", tclas->user_priority);
+ tprintf("Classifier Type: %s (%u), ", class_type(frm_class->type),
+ frm_class->type);
+ tprintf("Classifier Mask: 0x%x, ", frm_class->mask);
+
+ if(frm_class->type == 0) {
+ struct element_tclas_type0 *type0;
+
+ type0 = (struct element_tclas_type0 *)
+ pkt_pull(pkt, sizeof(*type0));
+ if (type0 == NULL)
+ return 0;
+
+ /* I think little endian, like the rest */
+ tprintf("Src Addr: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x, ",
+ type0->sa[5], type0->sa[4], type0->sa[3],
+ type0->sa[2], type0->sa[1], type0->sa[0]);
+ tprintf("Dst Addr: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x, ",
+ type0->da[5], type0->da[4], type0->da[3],
+ type0->da[2], type0->da[1], type0->da[0]);
+ tprintf("Type: 0x%x", le16_to_cpu(type0->type));
+ }
+ else if(frm_class->type == 1) {
+ struct element_tclas_type1 *type1;
+
+ type1 = (struct element_tclas_type1 *)
+ pkt_pull(pkt, sizeof(*type1));
+ if (type1 == NULL)
+ return 0;
+
+ tprintf("Version: %u, ", type1->version);
+ /* big endian format follows */
+ if(type1->version == 4) {
+ struct element_tclas_type1_ip4 *type1_ip4;
+ char src_ip[INET_ADDRSTRLEN];
+ char dst_ip[INET_ADDRSTRLEN];
+
+ type1_ip4 = (struct element_tclas_type1_ip4 *)
+ pkt_pull(pkt, sizeof(*type1_ip4));
+ if (type1_ip4 == NULL)
+ return 0;
+
+ inet_ntop(AF_INET, &type1_ip4->sa, src_ip, sizeof(src_ip));
+ inet_ntop(AF_INET, &type1_ip4->da, dst_ip, sizeof(dst_ip));
+
+ tprintf("Src IP: %s, ", src_ip);
+ tprintf("Dst IP: %s, ", dst_ip);
+ tprintf("Src Port: %u, ", ntohs(type1_ip4->sp));
+ tprintf("Dst Port: %u, ", ntohs(type1_ip4->dp));
+ tprintf("DSCP: 0x%x, ", type1_ip4->dscp);
+ tprintf("Proto: %u, ", type1_ip4->proto);
+ tprintf("Res: 0x%x", type1_ip4->reserved);
+ }
+ else if(type1->version == 6) {
+ struct element_tclas_type1_ip6 *type1_ip6;
+ char src_ip[INET6_ADDRSTRLEN];
+ char dst_ip[INET6_ADDRSTRLEN];
+
+ type1_ip6 = (struct element_tclas_type1_ip6 *)
+ pkt_pull(pkt, sizeof(*type1_ip6));
+ if (type1_ip6 == NULL)
+ return 0;
+
+ inet_ntop(AF_INET6, &type1_ip6->sa,
+ src_ip, sizeof(src_ip));
+ inet_ntop(AF_INET6, &type1_ip6->da,
+ dst_ip, sizeof(dst_ip));
+
+ tprintf("Src IP: %s, ", src_ip);
+ tprintf("Dst IP: %s, ", dst_ip);
+ tprintf("Src Port: %u, ", ntohs(type1_ip6->sp));
+ tprintf("Dst Port: %u, ", ntohs(type1_ip6->dp));
+ tprintf("Flow Label: 0x%x%x%x", type1_ip6->flow_label1,
+ type1_ip6->flow_label2, type1_ip6->flow_label3);
+ }
+ else {
+ tprintf("Version (%u) not supported", type1->version);
+ return 0;
+ }
+
+ }
+ else if(frm_class->type == 2) {
+ struct element_tclas_type2 *type2;
+
+ type2 = (struct element_tclas_type2 *)
+ pkt_pull(pkt, sizeof(*type2));
+ if (type2 == NULL)
+ return 0;
+
+ tprintf("802.1Q VLAN TCI: 0x%x", ntohs(type2->vlan_tci));
+ }
+ else if(frm_class->type == 3) {
+ struct element_tclas_type3 *type3;
+ u8 len, i;
+ u8 *val;
+
+ type3 = (struct element_tclas_type3 *)
+ pkt_pull(pkt, sizeof(*type3));
+ if (type3 == NULL)
+ return 0;
+
+ len = (tclas->len - 5) / 2;
+
+ tprintf("Filter Offset: %u, ", type3->offs);
+
+ if((len & 1) || (len_lt_error(tclas->len, 5))) {
+ tprintf("Length of TCLAS (%u) not correct", tclas->len);
+ return 0;
+ }
+ else {
+ val = pkt_pull(pkt, len);
+ if (val == NULL)
+ return 0;
+
+ tprintf("Filter Value: 0x");
+ for (i = 0; i < len / 2; i++)
+ tprintf("%x ", val[i]);
+ tprintf(", ");
+ tprintf("Filter Mask: 0x");
+ for (i = len / 2; i < len; i++)
+ tprintf("%x ", val[i]);
+ }
+
+ }
+ else if(frm_class->type == 4) {
+ struct element_tclas_type4 *type4;
+
+ type4 = (struct element_tclas_type4 *)
+ pkt_pull(pkt, sizeof(*type4));
+ if (type4 == NULL)
+ return 0;
+
+ tprintf("Version: %u, ", type4->version);
+ /* big endian format follows */
+ if(type4->version == 4) {
+ struct element_tclas_type4_ip4 *type4_ip4;
+ char src_ip[INET_ADDRSTRLEN];
+ char dst_ip[INET_ADDRSTRLEN];
+
+ type4_ip4 = (struct element_tclas_type4_ip4 *)
+ pkt_pull(pkt, sizeof(*type4_ip4));
+ if (type4_ip4 == NULL)
+ return 0;
+
+ inet_ntop(AF_INET, &type4_ip4->sa, src_ip, sizeof(src_ip));
+ inet_ntop(AF_INET, &type4_ip4->da, dst_ip, sizeof(dst_ip));
+
+ tprintf("Src IP: %s, ", src_ip);
+ tprintf("Dst IP: %s, ", dst_ip);
+ tprintf("Src Port: %u, ", ntohs(type4_ip4->sp));
+ tprintf("Dst Port: %u, ", ntohs(type4_ip4->dp));
+ tprintf("DSCP: 0x%x, ", type4_ip4->dscp);
+ tprintf("Proto: %u, ", type4_ip4->proto);
+ tprintf("Res: 0x%x", type4_ip4->reserved);
+ }
+ else if(type4->version == 6) {
+ struct element_tclas_type4_ip6 *type4_ip6;
+ char src_ip[INET6_ADDRSTRLEN];
+ char dst_ip[INET6_ADDRSTRLEN];
+
+ type4_ip6 = (struct element_tclas_type4_ip6 *)
+ pkt_pull(pkt, sizeof(*type4_ip6));
+ if (type4_ip6 == NULL)
+ return 0;
+
+ inet_ntop(AF_INET6, &type4_ip6->sa,
+ src_ip, sizeof(src_ip));
+ inet_ntop(AF_INET6, &type4_ip6->da,
+ dst_ip, sizeof(dst_ip));
+
+ tprintf("Src IP: %s, ", src_ip);
+ tprintf("Dst IP: %s, ", dst_ip);
+ tprintf("Src Port: %u, ", ntohs(type4_ip6->sp));
+ tprintf("Dst Port: %u, ", ntohs(type4_ip6->dp));
+ tprintf("DSCP: 0x%x, ", type4_ip6->dscp);
+ tprintf("Nxt Hdr: %u, ", type4_ip6->nxt_hdr);
+ tprintf("Flow Label: 0x%x%x%x", type4_ip6->flow_label1,
+ type4_ip6->flow_label2, type4_ip6->flow_label3);
+ }
+ else {
+ tprintf("Version (%u) not supported", type4->version);
+ return 0;
+ }
+ }
+ else if(frm_class->type == 5) {
+ struct element_tclas_type5 *type5;
+
+ type5 = (struct element_tclas_type5 *)
+ pkt_pull(pkt, sizeof(*type5));
+ if (type5 == NULL)
+ return 0;
+
+ tprintf("802.1Q PCP: 0x%x, ", type5->pcp);
+ tprintf("802.1Q CFI: 0x%x, ", type5->cfi);
+ tprintf("802.1Q VID: 0x%x", type5->vid);
+ }
+ else {
+ tprintf("Classifier Type (%u) not supported", frm_class->type);
+ return 0;
+ }
+
+ return 1;
+}
+
+static int8_t inf_sched(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_schedule *schedule;
+ u16 info;
+
+ schedule = (struct element_schedule *) pkt_pull(pkt, sizeof(*schedule));
+ if (schedule == NULL)
+ return 0;
+
+ info = le16_to_cpu(schedule->inf);
+
+ tprintf(" Schedule (%u, Len(%u)): ", *id, schedule->len);
+ if (len_neq_error(schedule->len, 12))
+ return 0;
+
+ tprintf("Aggregation: %u, ", info >> 15);
+ tprintf("TSID: %u, ", (info >> 11) & 0xF);
+ tprintf("Direction: %u, ", (info >> 9) & 0x3);
+ tprintf("Res: %u, ", info & 0x1FF);
+ tprintf("Serv Start Time: %uus, ", le32_to_cpu(schedule->start));
+ tprintf("Serv Interval: %uus, ", le32_to_cpu(schedule->serv_intv));
+ tprintf("Spec Interval: %fs", le32_to_cpu(schedule->spec_intv) * TU);
+
+ return 1;
+}
+
+static int8_t inf_chall_txt(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_chall_txt *chall_txt;
+ u8 i;
+ u8 *txt;
+
+ chall_txt = (struct element_chall_txt *)
+ pkt_pull(pkt, sizeof(*chall_txt));
+ if (chall_txt == NULL)
+ return 0;
+
+ tprintf(" Challenge Text (%u, Len(%u)): ", *id, chall_txt->len);
+ if ((chall_txt->len - sizeof(*chall_txt) + 1) > 0) {
+ txt = pkt_pull(pkt, (chall_txt->len - sizeof(*chall_txt) + 1));
+ if (txt == NULL)
+ return 0;
+
+ tprintf("0x");
+ for (i = 0; i < (chall_txt->len - sizeof(*chall_txt) + 1); i++)
+ tprintf("%x", txt[i]);
+ }
+
+ return 1;
+}
+
+static int8_t inf_pwr_constr(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_pwr_constr *pwr_constr;
+
+ pwr_constr = (struct element_pwr_constr *) pkt_pull(pkt, sizeof(*pwr_constr));
+ if (pwr_constr == NULL)
+ return 0;
+
+ tprintf(" Power Constraint (%u, Len(%u)): ", *id, pwr_constr->len);
+ if (len_neq_error(pwr_constr->len, 1))
+ return 0;
+
+ tprintf("Local Power Constraint: %udB", pwr_constr->local_pwr_constr);
+
+ return 1;
+}
+
+static int8_t inf_pwr_cap(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_pwr_cap *pwr_cap;
+
+ pwr_cap = (struct element_pwr_cap *) pkt_pull(pkt, sizeof(*pwr_cap));
+ if (pwr_cap == NULL)
+ return 0;
+
+ tprintf(" Power Capability (%u, Len(%u)): ", *id, pwr_cap->len);
+ if (len_neq_error(pwr_cap->len, 2))
+ return 0;
+
+ tprintf("Min. Transm. Pwr Cap.: %ddBm, ", (int8_t)pwr_cap->min_pwr_cap);
+ tprintf("Max. Transm. Pwr Cap.: %ddBm", (int8_t)pwr_cap->max_pwr_cap);
+
+ return 1;
+}
+
+static int8_t inf_tpc_req(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_tpc_req *tpc_req;
+
+ tpc_req = (struct element_tpc_req *) pkt_pull(pkt, sizeof(*tpc_req));
+ if (tpc_req == NULL)
+ return 0;
+
+ tprintf(" TPC Request (%u, Len(%u))", *id, tpc_req->len);
+ if (len_neq_error(tpc_req->len, 0))
+ return 0;
+
+ return 1;
+}
+
+static int8_t inf_tpc_rep(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_tpc_rep *tpc_rep;
+
+ tpc_rep = (struct element_tpc_rep *) pkt_pull(pkt, sizeof(*tpc_rep));
+ if (tpc_rep == NULL)
+ return 0;
+
+ tprintf(" TPC Report (%u, Len(%u)): ", *id, tpc_rep->len);
+ if (len_neq_error(tpc_rep->len, 2))
+ return 0;
+
+ tprintf("Transmit Power: %udBm, ", (int8_t)tpc_rep->trans_pwr);
+ tprintf("Link Margin: %udB", (int8_t)tpc_rep->trans_pwr);
+
+ return 1;
+}
+
+static int8_t inf_supp_ch(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_supp_ch *supp_ch;
+ u8 i;
+
+ supp_ch = (struct element_supp_ch *) pkt_pull(pkt, sizeof(*supp_ch));
+ if (supp_ch == NULL)
+ return 0;
+
+ tprintf(" Supp Channels (%u, Len(%u)): ", *id, supp_ch->len);
+ if (len_lt_error(supp_ch->len, 2))
+ return 0;
+
+ if(supp_ch->len & 1) {
+ tprintf("Length should be even");
+ return 0;
+ }
+
+ for (i = 0; i < supp_ch->len; i += 2) {
+ struct element_supp_ch_tuple *supp_ch_tuple;
+
+ supp_ch_tuple = (struct element_supp_ch_tuple *)
+ pkt_pull(pkt, sizeof(*supp_ch_tuple));
+ if (supp_ch_tuple == NULL)
+ return 0;
+
+ tprintf("First Channel Nr: %u, ", supp_ch_tuple->first_ch_nr);
+ tprintf("Nr of Channels: %u, ", supp_ch_tuple->nr_ch);
+ }
+
+ return 1;
+}
+
+static int8_t inf_ch_sw_ann(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_ch_sw_ann *ch_sw_ann;
+
+ ch_sw_ann = (struct element_ch_sw_ann *)
+ pkt_pull(pkt, sizeof(*ch_sw_ann));
+ if (ch_sw_ann == NULL)
+ return 0;
+
+ tprintf(" Channel Switch Announc (%u, Len(%u)): ", *id, ch_sw_ann->len);
+ if (len_neq_error(ch_sw_ann->len, 3))
+ return 0;
+
+ tprintf("Switch Mode: %u, ", ch_sw_ann->switch_mode);
+ tprintf("New Nr: %u, ", ch_sw_ann->new_nr);
+ tprintf("Switch Count: %u", ch_sw_ann->switch_cnt);
+
+ return 1;
+}
+
+static const char *meas_type(u8 type)
+{
+ switch (type) {
+ case 0: return "Basic";
+ case 1: return "Clear Channel assesment (CCA)";
+ case 2: return "Receive power indication (RPI) histogram";
+ case 3: return "Channel load";
+ case 4: return "Noise histogram";
+ case 5: return "Beacon";
+ case 6: return "Frame";
+ case 7: return "STA statistics";
+ case 8: return "LCI";
+ case 9: return "Transmit stream/category measurement";
+ case 10: return "Multicast diagnostics";
+ case 11: return "Location Civic";
+ case 12: return "Location Identifier";
+ case 13 ... 255: return "Reserved";
+ }
+}
+
+static int8_t inf_meas_req(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_meas_req *meas_req;
+
+ meas_req = (struct element_meas_req *) pkt_pull(pkt, sizeof(*meas_req));
+ if (meas_req == NULL)
+ return 0;
+
+ tprintf(" Measurement Req (%u, Len(%u)): ", *id, meas_req->len);
+ if (len_lt_error(meas_req->len, 3))
+ return 0;
+
+ tprintf("Token: %u, ", meas_req->token);
+ tprintf("Req Mode: 0x%x (Parallel (%u), Enable(%u), Request(%u), "
+ "Report(%u), Dur Mand(%u), Res(0x%x)), ", meas_req->req_mode,
+ meas_req->req_mode & 0x1,
+ (meas_req->req_mode >> 1) & 0x1,
+ (meas_req->req_mode >> 2) & 0x1,
+ (meas_req->req_mode >> 3) & 0x1,
+ (meas_req->req_mode >> 4) & 0x1,
+ meas_req->req_mode >> 7);
+ tprintf("Type: %s (%u), ", meas_type(meas_req->type), meas_req->type);
+
+ if(meas_req->len > 3) {
+ if(meas_req->type == 0) {
+ struct element_meas_basic *basic;
+
+ basic = (struct element_meas_basic *)
+ pkt_pull(pkt, sizeof(*basic));
+ if (basic == NULL)
+ return 0;
+
+ if ((meas_req->len - 3 - sizeof(*basic)) != 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_req->type);
+ return 0;
+ }
+
+ tprintf("Ch Nr: %uus, ", basic->ch_nr);
+ tprintf("Meas Start Time: %lu, ",
+ le64_to_cpu(basic->start));
+ tprintf("Meas Duration: %fs",
+ le16_to_cpu(basic->dur) * TU);
+
+ }
+ else if(meas_req->type == 1) {
+ struct element_meas_cca *cca;
+
+ cca = (struct element_meas_cca *)
+ pkt_pull(pkt, sizeof(*cca));
+ if (cca == NULL)
+ return 0;
+
+ if ((meas_req->len - 3 - sizeof(*cca)) != 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_req->type);
+ return 0;
+ }
+
+ tprintf("Ch Nr: %uus, ", cca->ch_nr);
+ tprintf("Meas Start Time: %lu, ",
+ le64_to_cpu(cca->start));
+ tprintf("Meas Duration: %fs",
+ le16_to_cpu(cca->dur) * TU);
+ }
+ else if(meas_req->type == 2) {
+ struct element_meas_rpi *rpi;
+
+ rpi = (struct element_meas_rpi *)
+ pkt_pull(pkt, sizeof(*rpi));
+ if (rpi == NULL)
+ return 0;
+
+ if ((meas_req->len - 3 - sizeof(*rpi)) != 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_req->type);
+ return 0;
+ }
+
+ tprintf("Ch Nr: %uus, ", rpi->ch_nr);
+ tprintf("Meas Start Time: %lu, ",
+ le64_to_cpu(rpi->start));
+ tprintf("Meas Duration: %fs",
+ le16_to_cpu(rpi->dur) * TU);
+ }
+ else if(meas_req->type == 3) {
+ struct element_meas_ch_load *ch_load;
+
+ ch_load = (struct element_meas_ch_load *)
+ pkt_pull(pkt, sizeof(*ch_load));
+ if (ch_load == NULL)
+ return 0;
+
+ if ((ssize_t)(meas_req->len - 3 - sizeof(*ch_load)) < 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_req->type);
+ return 0;
+ }
+
+ tprintf("OP Class: %u, ", ch_load->op_class);
+ tprintf("Ch Nr: %u, ", ch_load->ch_nr);
+ tprintf("Rand Intv: %fs, ",
+ le16_to_cpu(ch_load->rand_intv) * TU);
+ tprintf("Meas Duration: %fs",
+ le16_to_cpu(ch_load->dur) * TU);
+
+ if(!subelements(pkt,
+ meas_req->len - 3 - sizeof(*ch_load)))
+ return 0;
+ }
+ else if(meas_req->type == 4) {
+ struct element_meas_noise *noise;
+
+ noise = (struct element_meas_noise *)
+ pkt_pull(pkt, sizeof(*noise));
+ if (noise == NULL)
+ return 0;
+
+ if ((ssize_t)(meas_req->len - 3 - sizeof(*noise)) < 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_req->type);
+ return 0;
+ }
+
+ tprintf("OP Class: %u, ", noise->op_class);
+ tprintf("Ch Nr: %u, ", noise->ch_nr);
+ tprintf("Rand Intv: %fs, ",
+ le16_to_cpu(noise->rand_intv) * TU);
+ tprintf("Meas Duration: %fs",
+ le16_to_cpu(noise->dur) * TU);
+
+ if(!subelements(pkt,
+ meas_req->len - 3 - sizeof(*noise)))
+ return 0;
+ }
+ else if(meas_req->type == 5) {
+ struct element_meas_beacon *beacon;
+
+ beacon = (struct element_meas_beacon *)
+ pkt_pull(pkt, sizeof(*beacon));
+ if (beacon == NULL)
+ return 0;
+
+ if ((ssize_t)(meas_req->len - 3 - sizeof(*beacon)) < 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_req->type);
+ return 0;
+ }
+
+ tprintf("OP Class: %u, ", beacon->op_class);
+ tprintf("Ch Nr: %u, ", beacon->ch_nr);
+ tprintf("Rand Intv: %fs, ",
+ le16_to_cpu(beacon->rand_intv) * TU);
+ tprintf("Meas Duration: %fs",
+ le16_to_cpu(beacon->dur) * TU);
+ tprintf("Mode: %u, ", beacon->mode);
+ tprintf("BSSID: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
+ beacon->bssid[0], beacon->bssid[1],
+ beacon->bssid[2], beacon->bssid[3],
+ beacon->bssid[4], beacon->bssid[5]);
+
+ if(!subelements(pkt,
+ meas_req->len - 3 - sizeof(*beacon)))
+ return 0;
+ }
+ else if(meas_req->type == 6) {
+ struct element_meas_frame *frame;
+
+ frame = (struct element_meas_frame *)
+ pkt_pull(pkt, sizeof(*frame));
+ if (frame == NULL)
+ return 0;
+
+ if ((ssize_t)(meas_req->len - 3 - sizeof(*frame)) < 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_req->type);
+ return 0;
+ }
+
+ tprintf("OP Class: %u, ", frame->op_class);
+ tprintf("Ch Nr: %u, ", frame->ch_nr);
+ tprintf("Rand Intv: %fs, ",
+ le16_to_cpu(frame->rand_intv) * TU);
+ tprintf("Meas Duration: %fs",
+ le16_to_cpu(frame->dur) * TU);
+ tprintf("Request Type: %u, ", frame->frame);
+ tprintf("MAC Addr: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
+ frame->mac[0], frame->mac[1],
+ frame->mac[2], frame->mac[3],
+ frame->mac[4], frame->mac[5]);
+
+ if(!subelements(pkt,
+ meas_req->len - 3 - sizeof(*frame)))
+ return 0;
+ }
+ else if(meas_req->type == 7) {
+ struct element_meas_sta *sta;
+
+ sta = (struct element_meas_sta *)
+ pkt_pull(pkt, sizeof(*sta));
+ if (sta == NULL)
+ return 0;
+
+ if ((ssize_t)(meas_req->len - 3 - sizeof(*sta)) < 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_req->type);
+ return 0;
+ }
+
+ tprintf("Peer MAC Addr: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
+ sta->peer_mac[0], sta->peer_mac[1],
+ sta->peer_mac[2], sta->peer_mac[3],
+ sta->peer_mac[4], sta->peer_mac[5]);
+ tprintf("Rand Intv: %fs, ",
+ le16_to_cpu(sta->rand_intv) * TU);
+ tprintf("Meas Duration: %fs",
+ le16_to_cpu(sta->dur) * TU);
+ tprintf("Group ID: %u, ", sta->group_id);
+
+ if(!subelements(pkt,
+ meas_req->len - 3 - sizeof(*sta)))
+ return 0;
+ }
+ else if(meas_req->type == 8) {
+ struct element_meas_lci *lci;
+
+ lci = (struct element_meas_lci *)
+ pkt_pull(pkt, sizeof(*lci));
+ if (lci == NULL)
+ return 0;
+
+ if ((ssize_t)(meas_req->len - 3 - sizeof(*lci)) < 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_req->type);
+ return 0;
+ }
+
+ tprintf("Location Subj: %u, ", lci->loc_subj);
+ tprintf("Latitude Req Res: %udeg",
+ lci->latitude_req_res);
+ tprintf("Longitude Req Res: %udeg",
+ lci->longitude_req_res);
+ tprintf("Altitude Req Res: %udeg",
+ lci->altitude_req_res);
+
+ if(!subelements(pkt,
+ meas_req->len - 3 - sizeof(*lci)))
+ return 0;
+ }
+ else if(meas_req->type == 9) {
+ struct element_meas_trans_str_cat *trans;
+
+ trans = (struct element_meas_trans_str_cat *)
+ pkt_pull(pkt, sizeof(*trans));
+ if (trans == NULL)
+ return 0;
+
+ if ((ssize_t)(meas_req->len - 3 - sizeof(*trans)) < 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_req->type);
+ return 0;
+ }
+
+ tprintf("Rand Intv: %fs, ",
+ le16_to_cpu(trans->rand_intv) * TU);
+ tprintf("Meas Duration: %fs",
+ le16_to_cpu(trans->dur) * TU);
+ tprintf("MAC Addr: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
+ trans->peer_sta_addr[0], trans->peer_sta_addr[1],
+ trans->peer_sta_addr[2], trans->peer_sta_addr[3],
+ trans->peer_sta_addr[4], trans->peer_sta_addr[5]);
+ tprintf("Traffic ID: %u, ", trans->traffic_id);
+ tprintf("Bin 0 Range: %u, ", trans->bin_0_range);
+
+ if(!subelements(pkt,
+ meas_req->len - 3 - sizeof(*trans)))
+ return 0;
+ }
+ else if(meas_req->type == 10) {
+ struct element_meas_mcast_diag *mcast;
+
+ mcast = (struct element_meas_mcast_diag *)
+ pkt_pull(pkt, sizeof(*mcast));
+ if (mcast == NULL)
+ return 0;
+
+ if ((ssize_t)(meas_req->len - 3 - sizeof(*mcast)) < 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_req->type);
+ return 0;
+ }
+
+ tprintf("Rand Intv: %fs, ",
+ le16_to_cpu(mcast->rand_intv) * TU);
+ tprintf("Meas Duration: %fs",
+ le16_to_cpu(mcast->dur) * TU);
+ tprintf("Group MAC Addr: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
+ mcast->group_mac[0], mcast->group_mac[1],
+ mcast->group_mac[2], mcast->group_mac[3],
+ mcast->group_mac[4], mcast->group_mac[5]);
+
+ if(!subelements(pkt,
+ meas_req->len - 3 - sizeof(*mcast)))
+ return 0;
+ }
+ else if(meas_req->type == 11) {
+ struct element_meas_loc_civic *civic;
+
+ civic = (struct element_meas_loc_civic *)
+ pkt_pull(pkt, sizeof(*civic));
+ if (civic == NULL)
+ return 0;
+
+ if ((ssize_t)(meas_req->len - 3 - sizeof(*civic)) < 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_req->type);
+ return 0;
+ }
+
+ tprintf("Location Subj: %u, ", civic->loc_subj);
+ tprintf("Type: %u, ", civic->civic_loc);
+ tprintf("Srv Intv Units: %u, ",
+ le16_to_cpu(civic->loc_srv_intv_unit));
+ tprintf("Srv Intv: %u, ", civic->loc_srv_intv);
+
+ if(!subelements(pkt,
+ meas_req->len - 3 - sizeof(*civic)))
+ return 0;
+ }
+ else if(meas_req->type == 12) {
+ struct element_meas_loc_id *id;
+
+ id = (struct element_meas_loc_id *)
+ pkt_pull(pkt, sizeof(*id));
+ if (id == NULL)
+ return 0;
+
+ if ((ssize_t)(meas_req->len - 3 - sizeof(*id)) < 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_req->type);
+ return 0;
+ }
+
+ tprintf("Location Subj: %u, ", id->loc_subj);
+ tprintf("Srv Intv Units: %u, ",
+ le16_to_cpu(id->loc_srv_intv_unit));
+ tprintf("Srv Intv: %u", id->loc_srv_intv);
+
+ if(!subelements(pkt,
+ meas_req->len - 3 - sizeof(*id)))
+ return 0;
+ }
+ else if(meas_req->type == 255) {
+ struct element_meas_pause *pause;
+
+ pause = (struct element_meas_pause *)
+ pkt_pull(pkt, sizeof(*pause));
+ if (pause == NULL)
+ return 0;
+
+ if ((ssize_t)(meas_req->len - 3 - sizeof(*pause)) < 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_req->type);
+ return 0;
+ }
+
+ tprintf("Pause Time: %fs, ", pause->time * 10 * TU);
+
+ if(!subelements(pkt,
+ meas_req->len - 3 - sizeof(*pause)))
+ return 0;
+ }
+ else {
+ tprintf("Length field indicates data,"
+ " but could not interpreted");
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+static int8_t inf_meas_rep(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_meas_rep *meas_rep;
+
+ meas_rep = (struct element_meas_rep *) pkt_pull(pkt, sizeof(*meas_rep));
+ if (meas_rep == NULL)
+ return 0;
+
+ tprintf(" Measurement Rep (%u, Len(%u)): ", *id, meas_rep->len);
+ if (len_lt_error(meas_rep->len, 3))
+ return 0;
+
+ tprintf("Token: %u, ", meas_rep->token);
+ tprintf("Rep Mode: 0x%x (Late (%u), Incapable(%u), Refused(%u), ",
+ meas_rep->rep_mode, meas_rep->rep_mode >> 7,
+ (meas_rep->rep_mode >> 6) & 0x1,
+ (meas_rep->rep_mode >> 5) & 0x1);
+ tprintf("Type: %s (%u), ", meas_type(meas_rep->type), meas_rep->type);
+
+ if(meas_rep->len > 3) {
+ if(meas_rep->type == 0) {
+ struct element_meas_basic *basic;
+
+ basic = (struct element_meas_basic *)
+ pkt_pull(pkt, sizeof(*basic));
+ if (basic == NULL)
+ return 0;
+
+ if ((meas_rep->len - 3 - sizeof(*basic)) != 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_rep->type);
+ return 0;
+ }
+
+ tprintf("Ch Nr: %uus, ", basic->ch_nr);
+ tprintf("Meas Start Time: %lu, ",
+ le64_to_cpu(basic->start));
+ tprintf("Meas Duration: %fs",
+ le16_to_cpu(basic->dur) * TU);
+
+ }
+ else if(meas_rep->type == 1) {
+ struct element_meas_cca *cca;
+
+ cca = (struct element_meas_cca *)
+ pkt_pull(pkt, sizeof(*cca));
+ if (cca == NULL)
+ return 0;
+
+ if ((meas_rep->len - 3 - sizeof(*cca)) != 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_rep->type);
+ return 0;
+ }
+
+ tprintf("Ch Nr: %uus, ", cca->ch_nr);
+ tprintf("Meas Start Time: %lu, ",
+ le64_to_cpu(cca->start));
+ tprintf("Meas Duration: %fs",
+ le16_to_cpu(cca->dur) * TU);
+ }
+ else if(meas_rep->type == 2) {
+ struct element_meas_rpi *rpi;
+
+ rpi = (struct element_meas_rpi *)
+ pkt_pull(pkt, sizeof(*rpi));
+ if (rpi == NULL)
+ return 0;
+
+ if ((meas_rep->len - 3 - sizeof(*rpi)) != 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_rep->type);
+ return 0;
+ }
+
+ tprintf("Ch Nr: %uus, ", rpi->ch_nr);
+ tprintf("Meas Start Time: %lu, ",
+ le64_to_cpu(rpi->start));
+ tprintf("Meas Duration: %fs",
+ le16_to_cpu(rpi->dur) * TU);
+ }
+ else if(meas_rep->type == 3) {
+ struct element_meas_ch_load *ch_load;
+
+ ch_load = (struct element_meas_ch_load *)
+ pkt_pull(pkt, sizeof(*ch_load));
+ if (ch_load == NULL)
+ return 0;
+
+ if ((ssize_t)(meas_rep->len - 3 - sizeof(*ch_load)) < 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_rep->type);
+ return 0;
+ }
+
+ tprintf("OP Class: %u, ", ch_load->op_class);
+ tprintf("Ch Nr: %u, ", ch_load->ch_nr);
+ tprintf("Rand Intv: %fs, ",
+ le16_to_cpu(ch_load->rand_intv) * TU);
+ tprintf("Meas Duration: %fs",
+ le16_to_cpu(ch_load->dur) * TU);
+
+ if(!subelements(pkt,
+ meas_rep->len - 3 - sizeof(*ch_load)))
+ return 0;
+ }
+ else if(meas_rep->type == 4) {
+ struct element_meas_noise *noise;
+
+ noise = (struct element_meas_noise *)
+ pkt_pull(pkt, sizeof(*noise));
+ if (noise == NULL)
+ return 0;
+
+ if ((ssize_t)(meas_rep->len - 3 - sizeof(*noise)) < 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_rep->type);
+ return 0;
+ }
+
+ tprintf("OP Class: %u, ", noise->op_class);
+ tprintf("Ch Nr: %u, ", noise->ch_nr);
+ tprintf("Rand Intv: %fs, ",
+ le16_to_cpu(noise->rand_intv) * TU);
+ tprintf("Meas Duration: %fs",
+ le16_to_cpu(noise->dur) * TU);
+
+ if(!subelements(pkt,
+ meas_rep->len - 3 - sizeof(*noise)))
+ return 0;
+ }
+ else if(meas_rep->type == 5) {
+ struct element_meas_beacon *beacon;
+
+ beacon = (struct element_meas_beacon *)
+ pkt_pull(pkt, sizeof(*beacon));
+ if (beacon == NULL)
+ return 0;
+
+ if ((ssize_t)(meas_rep->len - 3 - sizeof(*beacon)) < 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_rep->type);
+ return 0;
+ }
+
+ tprintf("OP Class: %u, ", beacon->op_class);
+ tprintf("Ch Nr: %u, ", beacon->ch_nr);
+ tprintf("Rand Intv: %fs, ",
+ le16_to_cpu(beacon->rand_intv) * TU);
+ tprintf("Meas Duration: %fs",
+ le16_to_cpu(beacon->dur) * TU);
+ tprintf("Mode: %u, ", beacon->mode);
+ tprintf("BSSID: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
+ beacon->bssid[0], beacon->bssid[1],
+ beacon->bssid[2], beacon->bssid[3],
+ beacon->bssid[4], beacon->bssid[5]);
+
+ if(!subelements(pkt,
+ meas_rep->len - 3 - sizeof(*beacon)))
+ return 0;
+ }
+ else if(meas_rep->type == 6) {
+ struct element_meas_frame *frame;
+
+ frame = (struct element_meas_frame *)
+ pkt_pull(pkt, sizeof(*frame));
+ if (frame == NULL)
+ return 0;
+
+ if ((ssize_t)(meas_rep->len - 3 - sizeof(*frame)) < 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_rep->type);
+ return 0;
+ }
+
+ tprintf("OP Class: %u, ", frame->op_class);
+ tprintf("Ch Nr: %u, ", frame->ch_nr);
+ tprintf("Rand Intv: %fs, ",
+ le16_to_cpu(frame->rand_intv) * TU);
+ tprintf("Meas Duration: %fs",
+ le16_to_cpu(frame->dur) * TU);
+ tprintf("Request Type: %u, ", frame->frame);
+ tprintf("MAC Addr: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
+ frame->mac[0], frame->mac[1],
+ frame->mac[2], frame->mac[3],
+ frame->mac[4], frame->mac[5]);
+
+ if(!subelements(pkt,
+ meas_rep->len - 3 - sizeof(*frame)))
+ return 0;
+ }
+ else if(meas_rep->type == 7) {
+ struct element_meas_sta *sta;
+
+ sta = (struct element_meas_sta *)
+ pkt_pull(pkt, sizeof(*sta));
+ if (sta == NULL)
+ return 0;
+
+ if ((ssize_t)(meas_rep->len - 3 - sizeof(*sta)) < 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_rep->type);
+ return 0;
+ }
+
+ tprintf("Peer MAC Addr: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x, ",
+ sta->peer_mac[0], sta->peer_mac[1],
+ sta->peer_mac[2], sta->peer_mac[3],
+ sta->peer_mac[4], sta->peer_mac[5]);
+ tprintf("Rand Intv: %fs, ",
+ le16_to_cpu(sta->rand_intv) * TU);
+ tprintf("Meas Duration: %fs",
+ le16_to_cpu(sta->dur) * TU);
+ tprintf("Group ID: %u, ", sta->group_id);
+
+ if(!subelements(pkt,
+ meas_rep->len - 3 - sizeof(*sta)))
+ return 0;
+ }
+ else if(meas_rep->type == 8) {
+ struct element_meas_lci *lci;
+
+ lci = (struct element_meas_lci *)
+ pkt_pull(pkt, sizeof(*lci));
+ if (lci == NULL)
+ return 0;
+
+ if ((ssize_t)(meas_rep->len - 3 - sizeof(*lci)) < 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_rep->type);
+ return 0;
+ }
+
+ tprintf("Location Subj: %u, ", lci->loc_subj);
+ tprintf("Latitude Req Res: %udeg",
+ lci->latitude_req_res);
+ tprintf("Longitude Req Res: %udeg",
+ lci->longitude_req_res);
+ tprintf("Altitude Req Res: %udeg",
+ lci->altitude_req_res);
+
+ if(!subelements(pkt,
+ meas_rep->len - 3 - sizeof(*lci)))
+ return 0;
+ }
+ else if(meas_rep->type == 9) {
+ struct element_meas_trans_str_cat *trans;
+
+ trans = (struct element_meas_trans_str_cat *)
+ pkt_pull(pkt, sizeof(*trans));
+ if (trans == NULL)
+ return 0;
+
+ if ((ssize_t)(meas_rep->len - 3 - sizeof(*trans)) < 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_rep->type);
+ return 0;
+ }
+
+ tprintf("Rand Intv: %fs, ",
+ le16_to_cpu(trans->rand_intv) * TU);
+ tprintf("Meas Duration: %fs",
+ le16_to_cpu(trans->dur) * TU);
+ tprintf("MAC Addr: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x, ",
+ trans->peer_sta_addr[0], trans->peer_sta_addr[1],
+ trans->peer_sta_addr[2], trans->peer_sta_addr[3],
+ trans->peer_sta_addr[4], trans->peer_sta_addr[5]);
+ tprintf("Traffic ID: %u, ", trans->traffic_id);
+ tprintf("Bin 0 Range: %u, ", trans->bin_0_range);
+
+ if(!subelements(pkt,
+ meas_rep->len - 3 - sizeof(*trans)))
+ return 0;
+ }
+ else if(meas_rep->type == 10) {
+ struct element_meas_mcast_diag *mcast;
+
+ mcast = (struct element_meas_mcast_diag *)
+ pkt_pull(pkt, sizeof(*mcast));
+ if (mcast == NULL)
+ return 0;
+
+ if ((ssize_t)(meas_rep->len - 3 - sizeof(*mcast)) < 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_rep->type);
+ return 0;
+ }
+
+ tprintf("Rand Intv: %fs, ",
+ le16_to_cpu(mcast->rand_intv) * TU);
+ tprintf("Meas Duration: %fs",
+ le16_to_cpu(mcast->dur) * TU);
+ tprintf("Group MAC Addr: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
+ mcast->group_mac[0], mcast->group_mac[1],
+ mcast->group_mac[2], mcast->group_mac[3],
+ mcast->group_mac[4], mcast->group_mac[5]);
+
+ if(!subelements(pkt,
+ meas_rep->len - 3 - sizeof(*mcast)))
+ return 0;
+ }
+ else if(meas_rep->type == 11) {
+ struct element_meas_loc_civic *civic;
+
+ civic = (struct element_meas_loc_civic *)
+ pkt_pull(pkt, sizeof(*civic));
+ if (civic == NULL)
+ return 0;
+
+ if ((ssize_t)(meas_rep->len - 3 - sizeof(*civic)) < 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_rep->type);
+ return 0;
+ }
+
+ tprintf("Location Subj: %u, ", civic->loc_subj);
+ tprintf("Type: %u, ", civic->civic_loc);
+ tprintf("Srv Intv Units: %u, ",
+ le16_to_cpu(civic->loc_srv_intv_unit));
+ tprintf("Srv Intv: %u, ", civic->loc_srv_intv);
+
+ if(!subelements(pkt,
+ meas_rep->len - 3 - sizeof(*civic)))
+ return 0;
+ }
+ else if(meas_rep->type == 12) {
+ struct element_meas_loc_id *id;
+
+ id = (struct element_meas_loc_id *)
+ pkt_pull(pkt, sizeof(*id));
+ if (id == NULL)
+ return 0;
+
+ if ((ssize_t)(meas_rep->len - 3 - sizeof(*id)) < 0) {
+ tprintf("Length of Req matchs not Type %u",
+ meas_rep->type);
+ return 0;
+ }
+
+ tprintf("Location Subj: %u, ", id->loc_subj);
+ tprintf("Srv Intv Units: %u, ",
+ le16_to_cpu(id->loc_srv_intv_unit));
+ tprintf("Srv Intv: %u", id->loc_srv_intv);
+
+ if(!subelements(pkt,
+ meas_rep->len - 3 - sizeof(*id)))
+ return 0;
+ }
+ else {
+ tprintf("Length field indicates data,"
+ " but could not interpreted");
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+static int8_t inf_quiet(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_quiet *quiet;
+
+ quiet = (struct element_quiet *) pkt_pull(pkt, sizeof(*quiet));
+ if (quiet == NULL)
+ return 0;
+
+ tprintf(" Quit (%u, Len(%u)): ", *id, quiet->len);
+ if (len_neq_error(quiet->len, 6))
+ return 0;
+
+ tprintf("Count: %ud, ", quiet->cnt);
+ tprintf("Period: %u, ", quiet->period);
+ tprintf("Duration: %fs, ", le16_to_cpu(quiet->dur) * TU);
+ tprintf("Offs: %fs", le16_to_cpu(quiet->offs) * TU);
+
+
+ return 1;
+}
+
+static int8_t inf_ibss_dfs(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_ibss_dfs *ibss_dfs;
+ u8 i;
+
+ ibss_dfs = (struct element_ibss_dfs *) pkt_pull(pkt, sizeof(*ibss_dfs));
+ if (ibss_dfs == NULL)
+ return 0;
+
+ tprintf(" IBSS DFS (%u, Len(%u)): ", *id, ibss_dfs->len);
+ if (len_lt_error(ibss_dfs->len, 7))
+ return 0;
+
+ tprintf("Owner: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x, ",
+ ibss_dfs->owner[0], ibss_dfs->owner[1],
+ ibss_dfs->owner[2], ibss_dfs->owner[3],
+ ibss_dfs->owner[4], ibss_dfs->owner[5]);
+ tprintf("Recovery Intv: %u, ", ibss_dfs->rec_intv);
+
+ if((ibss_dfs->len - sizeof(*ibss_dfs) + 1) & 1) {
+ tprintf("Length of Channel Map should be modulo 2");
+ return 0;
+ }
+
+ for (i = 0; i < ibss_dfs->len; i += 2) {
+ struct element_ibss_dfs_tuple *ibss_dfs_tuple;
+
+ ibss_dfs_tuple = (struct element_ibss_dfs_tuple *)
+ pkt_pull(pkt, sizeof(*ibss_dfs_tuple));
+ if (ibss_dfs_tuple == NULL)
+ return 0;
+
+ tprintf("Channel Nr: %u, ", ibss_dfs_tuple->ch_nr);
+ tprintf("Map: %u, ", ibss_dfs_tuple->map);
+ }
+
+ return 1;
+}
+
+static int8_t inf_erp(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_erp *erp;
+
+ erp = (struct element_erp *) pkt_pull(pkt, sizeof(*erp));
+ if (erp == NULL)
+ return 0;
+
+ tprintf(" ERP (%u, Len(%u)): ", *id, erp->len);
+ if (len_neq_error(erp->len, 1))
+ return 0;
+ tprintf("Non ERP Present (%u), ", erp->param & 0x1);
+ tprintf("Use Protection (%u), ", (erp->param >> 1) & 0x1);
+ tprintf("Barker Preamble Mode (%u), ", (erp->param >> 2) & 0x1);
+ tprintf("Reserved (0x%.5x)", erp->param >> 3);
+
+ return 1;
+}
+
+static int8_t inf_ts_del(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_ts_del *ts_del;
+
+ ts_del = (struct element_ts_del *) pkt_pull(pkt, sizeof(*ts_del));
+ if (ts_del == NULL)
+ return 0;
+
+ tprintf(" TS Delay (%u, Len(%u)): ", *id, ts_del->len);
+ if (len_neq_error(ts_del->len, 4))
+ return 0;
+ tprintf("Delay (%fs)", le32_to_cpu(ts_del->delay) * TU);
+
+ return 1;
+}
+
+static int8_t inf_tclas_proc(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_tclas_proc *tclas_proc;
+
+ tclas_proc = (struct element_tclas_proc *)
+ pkt_pull(pkt, sizeof(*tclas_proc));
+ if (tclas_proc == NULL)
+ return 0;
+
+ tprintf(" TCLAS Procesing (%u, Len(%u)): ", *id, tclas_proc->len);
+ if (len_neq_error(tclas_proc->len, 1))
+ return 0;
+ tprintf("Processing (%u)", tclas_proc->proc);
+
+ return 1;
+}
+
+static int8_t inf_ht_cap(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_ht_cap *ht_cap;
+ u32 tx_param_res, beam_cap;
+ u16 ext_cap;
+
+ ht_cap = (struct element_ht_cap *)
+ pkt_pull(pkt, sizeof(*ht_cap));
+ if (ht_cap == NULL)
+ return 0;
+
+ tx_param_res = le32_to_cpu(ht_cap->tx_param_res);
+ beam_cap = le32_to_cpu(ht_cap->beam_cap);
+ ext_cap = le16_to_cpu(ht_cap->ext_cap);
+
+ tprintf(" HT Capabilities (%u, Len(%u)): ", *id, ht_cap->len);
+ if (len_neq_error(ht_cap->len, 26))
+ return 0;
+ tprintf("Info (LDCP Cod Cap (%u), Supp Ch Width Set (%u),"
+ " SM Pwr Save(%u), HT-Greenfield (%u), Short GI for 20/40 MHz"
+ " (%u/%u), Tx/Rx STBC (%u/%u), HT-Delayed Block Ack (%u),"
+ " Max A-MSDU Len (%u), DSSS/CCK Mode in 40 MHz (%u),"
+ " Res (0x%x), Forty MHz Intol (%u), L-SIG TXOP Protection Supp"
+ " (%u)), ", ht_cap->ldpc, ht_cap->supp_width,
+ ht_cap->sm_pwr, ht_cap->ht_green, ht_cap->gi_20mhz,
+ ht_cap->gi_40mhz, ht_cap->tx_stbc, ht_cap->rx_stbc,
+ ht_cap->ht_ack, ht_cap->max_msdu_length, ht_cap->dsss_ck_mode,
+ ht_cap->res, ht_cap->forty_int, ht_cap->prot_supp);
+ tprintf("A-MPDU Params (Max Len Exp (%u), Min Start Spacing (%u),"
+ " Res (0x%x)), ", ht_cap->param >> 6, (ht_cap->param >> 3) & 0x7,
+ ht_cap->param & 0x07);
+ tprintf("Supp MCS Set (Rx MCS Bitmask (0x%x%x%x%x%x%x%x%x%x%x),"
+ " Res (0x%x), Rx High Supp Data Rate (%u), Res (0x%x),"
+ " Tx MCS Set Def (%u), Tx Rx MCS Set Not Eq (%u),"
+ " Tx Max Number Spat Str Supp (%u),"
+ " Tx Uneq Mod Supp (%u), Res (0x%x)), ",
+ ht_cap->bitmask1, ht_cap->bitmask2, ht_cap->bitmask3,
+ ht_cap->bitmask4, ht_cap->bitmask5, ht_cap->bitmask6,
+ ht_cap->bitmask7, ht_cap->bitmask8, ht_cap->bitmask9,
+ ht_cap->bitmask10_res >> 3, ht_cap->bitmask10_res & 0x7,
+ le16_to_cpu(ht_cap->supp_rate_res) >> 6,
+ le16_to_cpu(ht_cap->supp_rate_res) & 0x3F,
+ tx_param_res >> 31, (tx_param_res >> 30) & 1,
+ (tx_param_res >> 28) & 3, (tx_param_res >> 27) & 1,
+ tx_param_res & 0x7FFFFFF);
+ tprintf("Ext Cap (PCO (%u), PCO Trans Time (%u), Res (0x%x),"
+ " MCS Feedb (%u), +HTC Supp (%u), RD Resp (%u), Res (0x%x)), ",
+ ext_cap >> 15, (ext_cap >> 13) & 3, (ext_cap >> 8) & 0x1F,
+ (ext_cap >> 6) & 3, (ext_cap >> 5) & 1, (ext_cap >> 4) & 1,
+ ext_cap & 0xF);
+ tprintf("Transm Beamf (Impl Transm Beamf Rec Cap (%u),"
+ " Rec/Transm Stagg Sound Cap (%u/%u),"
+ " Rec/Trans NDP Cap (%u/%u), Impl Transm Beamf Cap (%u),"
+ " Cal (%u), Expl CSI Transm Beamf Cap (%u),"
+ " Expl Noncmpr/Compr Steering Cap (%u/%u),"
+ " Expl Trans Beamf CSI Feedb (%u),"
+ " Expl Noncmpr/Cmpr Feedb Cap (%u/%u),"
+ " Min Grpg (%u), CSI Num Beamf Ant Supp (%u),"
+ " Noncmpr/Cmpr Steering Nr Beamf Ant Supp (%u/%u),"
+ " CSI Max Nr Rows Beamf Supp (%u),"
+ " Ch Estim Cap (%u), Res (0x%x)), ",
+ beam_cap >> 31, (beam_cap >> 30) & 1, (beam_cap >> 29) & 1,
+ (beam_cap >> 28) & 1, (beam_cap >> 27) & 1, (beam_cap >> 26) & 1,
+ (beam_cap >> 24) & 3, (beam_cap >> 23) & 1, (beam_cap >> 22) & 1,
+ (beam_cap >> 21) & 1, (beam_cap >> 19) & 3, (beam_cap >> 17) & 3,
+ (beam_cap >> 15) & 3, (beam_cap >> 13) & 3, (beam_cap >> 11) & 3,
+ (beam_cap >> 9) & 3, (beam_cap >> 7) & 3, (beam_cap >> 5) & 3,
+ (beam_cap >> 3) & 3, beam_cap & 7);
+ tprintf("ASEL (Ant Select Cap (%u),"
+ " Expl CSI Feedb Based Transm ASEL Cap (%u),"
+ " Ant Indic Feedb Based Transm ASEL Cap (%u),"
+ " Expl CSI Feedb Cap (%u), Ant Indic Feedb Cap (%u),"
+ " Rec ASEL Cap (%u), Transm Sound PPDUs Cap (%u), Res (0x%x))",
+ ht_cap->asel_cap >> 7, (ht_cap->asel_cap >> 6) & 1,
+ (ht_cap->asel_cap >> 5) & 1, (ht_cap->asel_cap >> 4) & 1,
+ (ht_cap->asel_cap >> 3) & 1, (ht_cap->asel_cap >> 2) & 1,
+ (ht_cap->asel_cap >> 1) & 1, ht_cap->asel_cap & 1);
+
+ return 1;
+}
+
+static int8_t inf_qos_cap(struct pkt_buff *pkt, u8 *id)
+{
+ struct element_qos_cap *qos_cap;
+
+ qos_cap = (struct element_qos_cap *)
+ pkt_pull(pkt, sizeof(*qos_cap));
+ if (qos_cap == NULL)
+ return 0;
+
+ tprintf(" QoS Capabilities (%u, Len(%u)): ", *id, qos_cap->len);
+ if (len_neq_error(qos_cap->len, 1))
+ return 0;
+
+ tprintf("Info (0x%x)", qos_cap->info);
+
+ return 1;
+}
+
+static int8_t inf_rsn(struct pkt_buff *pkt, u8 *id)
+{
+ return 0;
+}
+
+static int8_t inf_ext_supp_rates(struct pkt_buff *pkt, u8 *id)
+{
+ u8 i;
+ u8 *rates;
+ struct element_ext_supp_rates *ext_supp_rates;
+
+ ext_supp_rates = (struct element_ext_supp_rates *)
+ pkt_pull(pkt, sizeof(*ext_supp_rates));
+ if (ext_supp_rates == NULL)
+ return 0;
+
+ tprintf(" Ext Support Rates (%u, Len(%u)): ", *id, ext_supp_rates->len);
+
+ if ((ext_supp_rates->len - sizeof(*ext_supp_rates) + 1) > 0) {
+ rates = pkt_pull(pkt, ext_supp_rates->len);
+ if (rates == NULL)
+ return 0;
+
+ for (i = 0; i < ext_supp_rates->len; i++)
+ tprintf("%g ", (rates[i] & 0x80) ?
+ ((rates[i] & 0x3f) * 0.5) :
+ data_rates(rates[i]));
+ return 1;
+ }
+
+ return 0;
+}
+
+static int8_t inf_ap_ch_exp(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_neighb_rep(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_rcpi(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_mde(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_fte(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_time_out_int(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_rde(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_dse_reg_loc(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_supp_op_class(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_ext_ch_sw_ann(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_ht_op(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_sec_ch_offs(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_bss_avg_acc_del(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_ant(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_rsni(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_meas_pilot_trans(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_bss_avl_adm_cap(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_bss_ac_acc_del(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_time_adv(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_rm_ena_cap(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_mult_bssid(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_20_40_bss_coex(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_20_40_bss_int_ch_rep(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_overl_bss_scan_para(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_ric_desc(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_mgmt_mic(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_ev_req(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_ev_rep(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_diagn_req(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_diagn_rep(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_loc_para(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_nontr_bssid_cap(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_ssid_list(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_mult_bssid_index(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_fms_desc(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_fms_req(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_fms_resp(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_qos_tfc_cap(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_bss_max_idle_per(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_tfs_req(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_tfs_resp(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_wnm_sleep_mod(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_tim_bcst_req(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_tim_bcst_resp(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_coll_interf_rep(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_ch_usage(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_time_zone(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_dms_req(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_dms_resp(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_link_id(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_wakeup_sched(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_ch_sw_timing(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_pti_ctrl(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_tpu_buff_status(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_interw(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_adv_proto(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_exp_bandw_req(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_qos_map_set(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_roam_cons(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_emer_alert_id(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_mesh_conf(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_mesh_id(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_mesh_link_metr_rep(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_cong_notif(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_mesh_peer_mgmt(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_mesh_ch_sw_para(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_mesh_awake_win(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_beacon_timing(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_mccaop_setup_req(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_mccaop_setup_rep(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_mccaop_adv(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_mccaop_teardwn(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_gann(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_rann(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_ext_cap(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_preq(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_prep(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_perr(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_pxu(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_pxuc(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_auth_mesh_peer_exch(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_mic(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_dest_uri(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_u_apsd_coex(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_mccaop_adv_overv(struct pkt_buff *pkt, u8 *id) {
+ return 0;
+}
+
+static int8_t inf_vend_spec(struct pkt_buff *pkt, u8 *id)
+{
+ u8 i;
+ u8 *data;
+ struct element_vend_spec *vend_spec;
+
+ vend_spec = (struct element_vend_spec *)
+ pkt_pull(pkt, sizeof(*vend_spec));
+ if (vend_spec == NULL)
+ return 0;
+
+ tprintf(" Vendor Specific (%u, Len (%u)): ", *id, vend_spec->len);
+
+ data = pkt_pull(pkt, vend_spec->len);
+ if (data == NULL)
+ return 0;
+
+ tprintf("Data 0x");
+ for (i = 0; i < vend_spec->len; i++)
+ tprintf("%.2x", data[i]);
+
+ return 1;
+}
+
+static int8_t inf_elements(struct pkt_buff *pkt)
+{
+ u8 *id = pkt_pull(pkt, 1);
+ if (id == NULL)
+ return 0;
+
+ switch (*id) {
+ case 0: return inf_ssid(pkt, id);
+ case 1: return inf_supp_rates(pkt, id);
+ case 2: return inf_fh_ps(pkt, id);
+ case 3: return inf_dsss_ps(pkt, id);
+ case 4: return inf_cf_ps(pkt, id);
+ case 5: return inf_tim(pkt, id);
+ case 6: return inf_ibss_ps(pkt, id);
+ case 7: return inf_country(pkt, id);
+ case 8: return inf_hop_pp(pkt, id);
+ case 9: return inf_hop_pt(pkt, id);
+ case 10: return inf_req(pkt, id);
+ case 11: return inf_bss_load(pkt, id);
+ case 12: return inf_edca_ps(pkt, id);
+ case 13: return inf_tspec(pkt, id);
+ case 14: return inf_tclas(pkt, id);
+ case 15: return inf_sched(pkt, id);
+ case 16: return inf_chall_txt(pkt, id);
+ case 17 ... 31: return inf_reserved(pkt, id);
+ case 32: return inf_pwr_constr(pkt, id);
+ case 33: return inf_pwr_cap(pkt, id);
+ case 34: return inf_tpc_req(pkt, id);
+ case 35: return inf_tpc_rep(pkt, id);
+ case 36: return inf_supp_ch(pkt, id);
+ case 37: return inf_ch_sw_ann(pkt, id);
+ case 38: return inf_meas_req(pkt, id);
+ case 39: return inf_meas_rep(pkt, id);
+ case 40: return inf_quiet(pkt, id);
+ case 41: return inf_ibss_dfs(pkt, id);
+ case 42: return inf_erp(pkt, id);
+ case 43: return inf_ts_del(pkt, id);
+ case 44: return inf_tclas_proc(pkt, id);
+ case 45: return inf_ht_cap(pkt, id);
+ case 46: return inf_qos_cap(pkt, id);
+ case 47: return inf_reserved(pkt, id);
+ case 48: return inf_rsn(pkt, id);
+ case 49: return inf_rsn(pkt, id);
+ case 50: return inf_ext_supp_rates(pkt, id);
+ case 51: return inf_ap_ch_exp(pkt, id);
+ case 52: return inf_neighb_rep(pkt, id);
+ case 53: return inf_rcpi(pkt, id);
+ case 54: return inf_mde(pkt, id);
+ case 55: return inf_fte(pkt, id);
+ case 56: return inf_time_out_int(pkt, id);
+ case 57: return inf_rde(pkt, id);
+ case 58: return inf_dse_reg_loc(pkt, id);
+ case 59: return inf_supp_op_class(pkt, id);
+ case 60: return inf_ext_ch_sw_ann(pkt, id);
+ case 61: return inf_ht_op(pkt, id);
+ case 62: return inf_sec_ch_offs(pkt, id);
+ case 63: return inf_bss_avg_acc_del(pkt, id);
+ case 64: return inf_ant(pkt, id);
+ case 65: return inf_rsni(pkt, id);
+ case 66: return inf_meas_pilot_trans(pkt, id);
+ case 67: return inf_bss_avl_adm_cap(pkt, id);
+ case 68: return inf_bss_ac_acc_del(pkt, id);
+ case 69: return inf_time_adv(pkt, id);
+ case 70: return inf_rm_ena_cap(pkt, id);
+ case 71: return inf_mult_bssid(pkt, id);
+ case 72: return inf_20_40_bss_coex(pkt, id);
+ case 73: return inf_20_40_bss_int_ch_rep(pkt, id);
+ case 74: return inf_overl_bss_scan_para(pkt, id);
+ case 75: return inf_ric_desc(pkt, id);
+ case 76: return inf_mgmt_mic(pkt, id);
+ case 78: return inf_ev_req(pkt, id);
+ case 79: return inf_ev_rep(pkt, id);
+ case 80: return inf_diagn_req(pkt, id);
+ case 81: return inf_diagn_rep(pkt, id);
+ case 82: return inf_loc_para(pkt, id);
+ case 83: return inf_nontr_bssid_cap(pkt, id);
+ case 84: return inf_ssid_list(pkt, id);
+ case 85: return inf_mult_bssid_index(pkt, id);
+ case 86: return inf_fms_desc(pkt, id);
+ case 87: return inf_fms_req(pkt, id);
+ case 88: return inf_fms_resp(pkt, id);
+ case 89: return inf_qos_tfc_cap(pkt, id);
+ case 90: return inf_bss_max_idle_per(pkt, id);
+ case 91: return inf_tfs_req(pkt, id);
+ case 92: return inf_tfs_resp(pkt, id);
+ case 93: return inf_wnm_sleep_mod(pkt, id);
+ case 94: return inf_tim_bcst_req(pkt, id);
+ case 95: return inf_tim_bcst_resp(pkt, id);
+ case 96: return inf_coll_interf_rep(pkt, id);
+ case 97: return inf_ch_usage(pkt, id);
+ case 98: return inf_time_zone(pkt, id);
+ case 99: return inf_dms_req(pkt, id);
+ case 100: return inf_dms_resp(pkt, id);
+ case 101: return inf_link_id(pkt, id);
+ case 102: return inf_wakeup_sched(pkt, id);
+ case 104: return inf_ch_sw_timing(pkt, id);
+ case 105: return inf_pti_ctrl(pkt, id);
+ case 106: return inf_tpu_buff_status(pkt, id);
+ case 107: return inf_interw(pkt, id);
+ case 108: return inf_adv_proto(pkt, id);
+ case 109: return inf_exp_bandw_req(pkt, id);
+ case 110: return inf_qos_map_set(pkt, id);
+ case 111: return inf_roam_cons(pkt, id);
+ case 112: return inf_emer_alert_id(pkt, id);
+ case 113: return inf_mesh_conf(pkt, id);
+ case 114: return inf_mesh_id(pkt, id);
+ case 115: return inf_mesh_link_metr_rep(pkt, id);
+ case 116: return inf_cong_notif(pkt, id);
+ case 117: return inf_mesh_peer_mgmt(pkt, id);
+ case 118: return inf_mesh_ch_sw_para(pkt, id);
+ case 119: return inf_mesh_awake_win(pkt, id);
+ case 120: return inf_beacon_timing(pkt, id);
+ case 121: return inf_mccaop_setup_req(pkt, id);
+ case 122: return inf_mccaop_setup_rep(pkt, id);
+ case 123: return inf_mccaop_adv(pkt, id);
+ case 124: return inf_mccaop_teardwn(pkt, id);
+ case 125: return inf_gann(pkt, id);
+ case 126: return inf_rann(pkt, id);
+ case 127: return inf_ext_cap(pkt, id);
+ case 128: return inf_reserved(pkt, id);
+ case 129: return inf_reserved(pkt, id);
+ case 130: return inf_preq(pkt, id);
+ case 131: return inf_prep(pkt, id);
+ case 132: return inf_perr(pkt, id);
+ case 133: return inf_reserved(pkt, id);
+ case 134: return inf_reserved(pkt, id);
+ case 135: return inf_reserved(pkt, id);
+ case 136: return inf_reserved(pkt, id);
+ case 137: return inf_pxu(pkt, id);
+ case 138: return inf_pxuc(pkt, id);
+ case 139: return inf_auth_mesh_peer_exch(pkt, id);
+ case 140: return inf_mic(pkt, id);
+ case 141: return inf_dest_uri(pkt, id);
+ case 142: return inf_u_apsd_coex(pkt, id);
+ case 143 ... 173: return inf_reserved(pkt, id);
+ case 174: return inf_mccaop_adv_overv(pkt, id);
+ case 221: return inf_vend_spec(pkt, id);
+ }
+
+ return 0;
+}
+
+#define ESS 0b0000000000000001
+#define IBSS 0b0000000000000010
+#define CF_Pollable 0b0000000000000100
+#define CF_Poll_Req 0b0000000000001000
+#define Privacy 0b0000000000010000
+#define Short_Pre 0b0000000000100000
+#define PBCC 0b0000000001000000
+#define Ch_Agility 0b0000000010000000
+#define Spec_Mgmt 0b0000000100000000
+#define QoS 0b0000001000000000
+#define Short_Slot_t 0b0000010000000000
+#define APSD 0b0000100000000000
+#define Radio_Meas 0b0001000000000000
+#define DSSS_OFDM 0b0010000000000000
+#define Del_Block_ACK 0b0100000000000000
+#define Imm_Block_ACK 0b1000000000000000
+
+static int8_t cap_field(u16 cap_inf)
+{
+ if (ESS & cap_inf)
+ tprintf(" ESS;");
+ if (IBSS & cap_inf)
+ tprintf(" IBSS;");
+ if (CF_Pollable & cap_inf)
+ tprintf(" CF Pollable;");
+ if (CF_Poll_Req & cap_inf)
+ tprintf(" CF-Poll Request;");
+ if (Privacy & cap_inf)
+ tprintf(" Privacy;");
+ if (Short_Pre & cap_inf)
+ tprintf(" Short Preamble;");
+ if (PBCC & cap_inf)
+ tprintf(" PBCC;");
+ if (Ch_Agility & cap_inf)
+ tprintf(" Channel Agility;");
+ if (Spec_Mgmt & cap_inf)
+ tprintf(" Spectrum Management;");
+ if (QoS & cap_inf)
+ tprintf(" QoS;");
+ if (Short_Slot_t & cap_inf)
+ tprintf(" Short Slot Time;");
+ if (APSD & cap_inf)
+ tprintf(" APSD;");
+ if (Radio_Meas & cap_inf)
+ tprintf(" Radio Measurement;");
+ if (DSSS_OFDM & cap_inf)
+ tprintf(" DSSS-OFDM;");
+ if (Del_Block_ACK & cap_inf)
+ tprintf(" Delayed Block Ack;");
+ if (Imm_Block_ACK & cap_inf)
+ tprintf(" Immediate Block Ack;");
+
+ return 1;
+}
+
+/* Management Dissectors */
+static int8_t assoc_req(struct pkt_buff *pkt) {
+ return 0;
+}
+
+static int8_t assoc_resp(struct pkt_buff *pkt) {
+ return 0;
+}
+
+static int8_t reassoc_req(struct pkt_buff *pkt) {
+ return 0;
+}
+
+static int8_t reassoc_resp(struct pkt_buff *pkt) {
+ return 0;
+}
+
+static int8_t probe_req(struct pkt_buff *pkt) {
+ return 0;
+}
+
+static int8_t probe_resp(struct pkt_buff *pkt) {
+ return 0;
+}
+
+static int8_t beacon(struct pkt_buff *pkt)
+{
+ struct ieee80211_mgmt_beacon *beacon;
+
+ beacon = (struct ieee80211_mgmt_beacon *)
+ pkt_pull(pkt, sizeof(*beacon));
+ if (beacon == NULL)
+ return 0;
+
+ tprintf("Timestamp 0x%.16lx, ", le64_to_cpu(beacon->timestamp));
+ tprintf("Beacon Interval (%fs), ", le16_to_cpu(beacon->beacon_int)*TU);
+ tprintf("Capabilities (0x%x <->", le16_to_cpu(beacon->capab_info));
+ cap_field(le16_to_cpu(beacon->capab_info));
+ tprintf(")");
+
+ if(pkt_len(pkt)) {
+ tprintf("\n\tParameters:");
+ while (inf_elements(pkt)) {
+ tprintf("\n\t");
+ }
+ }
+
+ if(pkt_len(pkt))
+ return 0;
+ return 1;
+}
+
+static int8_t atim(struct pkt_buff *pkt) {
+ return 0;
+}
+
+static int8_t disassoc(struct pkt_buff *pkt) {
+ return 0;
+}
+
+static int8_t auth(struct pkt_buff *pkt) {
+ return 0;
+}
+
+static int8_t deauth(struct pkt_buff *pkt) {
+ return 0;
+}
+/* End Management Dissectors */
+
+/* Control Dissectors */
+static int8_t ps_poll(struct pkt_buff *pkt) {
+ return 0;
+}
+
+static int8_t rts(struct pkt_buff *pkt) {
+ return 0;
+}
+
+static int8_t cts(struct pkt_buff *pkt) {
+ return 0;
+}
+
+static int8_t ack(struct pkt_buff *pkt) {
+ return 0;
+}
+
+static int8_t cf_end(struct pkt_buff *pkt) {
+ return 0;
+}
+
+static int8_t cf_end_ack(struct pkt_buff *pkt) {
+ return 0;
+}
+/* End Control Dissectors */
+
+/* Data Dissectors */
+static int8_t data(struct pkt_buff *pkt) {
+ return 0;
+}
+
+static int8_t data_cf_ack(struct pkt_buff *pkt) {
+ return 0;
+}
+
+static int8_t data_cf_poll(struct pkt_buff *pkt) {
+ return 0;
+}
+
+static int8_t data_cf_ack_poll(struct pkt_buff *pkt) {
+ return 0;
+}
+
+static int8_t null(struct pkt_buff *pkt) {
+ return 0;
+}
+
+static int8_t cf_ack(struct pkt_buff *pkt) {
+ return 0;
+}
+
+static int8_t cf_poll(struct pkt_buff *pkt) {
+ return 0;
+}
+
+static int8_t cf_ack_poll(struct pkt_buff *pkt) {
+ return 0;
+}
+/* End Data Dissectors */
+
+static const char *mgt_sub(u8 subtype, struct pkt_buff *pkt,
+ int8_t (**get_content)(struct pkt_buff *pkt))
+{
+ u16 seq_ctrl;
+ struct ieee80211_mgmt *mgmt;
+ const char *dst, *src, *bssid;
+
+ mgmt = (struct ieee80211_mgmt *) pkt_pull(pkt, sizeof(*mgmt));
+ if (mgmt == NULL)
+ return 0;
+
+ dst = lookup_vendor((mgmt->da[0] << 16) |
+ (mgmt->da[1] << 8) |
+ mgmt->da[2]);
+ src = lookup_vendor((mgmt->sa[0] << 16) |
+ (mgmt->sa[1] << 8) |
+ mgmt->sa[2]);
+
+ bssid = lookup_vendor((mgmt->bssid[0] << 16) |
+ (mgmt->bssid[1] << 8) |
+ mgmt->bssid[2]);
+ seq_ctrl = le16_to_cpu(mgmt->seq_ctrl);
+
+ tprintf("Duration (%u),", le16_to_cpu(mgmt->duration));
+ tprintf("\n\tDestination (%.2x:%.2x:%.2x:%.2x:%.2x:%.2x) ",
+ mgmt->da[0], mgmt->da[1], mgmt->da[2],
+ mgmt->da[3], mgmt->da[4], mgmt->da[5]);
+ if (dst) {
+ tprintf("=> (%s:%.2x:%.2x:%.2x)", dst,
+ mgmt->da[3], mgmt->da[4], mgmt->da[5]);
+ }
+
+ tprintf("\n\tSource (%.2x:%.2x:%.2x:%.2x:%.2x:%.2x) ",
+ mgmt->sa[0], mgmt->sa[1], mgmt->sa[2],
+ mgmt->sa[3], mgmt->sa[4], mgmt->sa[5]);
+ if (src) {
+ tprintf("=> (%s:%.2x:%.2x:%.2x)", src,
+ mgmt->sa[3], mgmt->sa[4], mgmt->sa[5]);
+ }
+
+ tprintf("\n\tBSSID (%.2x:%.2x:%.2x:%.2x:%.2x:%.2x) ",
+ mgmt->bssid[0], mgmt->bssid[1], mgmt->bssid[2],
+ mgmt->bssid[3], mgmt->bssid[4], mgmt->bssid[5]);
+ if(bssid) {
+ tprintf("=> (%s:%.2x:%.2x:%.2x)", bssid,
+ mgmt->bssid[3], mgmt->bssid[4], mgmt->bssid[5]);
+ }
+
+ tprintf("\n\tFragmentnr. (%u), Seqnr. (%u). ",
+ seq_ctrl & 0xf, seq_ctrl >> 4);
+
+ switch (subtype) {
+ case 0b0000:
+ *get_content = assoc_req;
+ return "Association Request";
+ case 0b0001:
+ *get_content = assoc_resp;
+ return "Association Response";
+ case 0b0010:
+ *get_content = reassoc_req;
+ return "Reassociation Request";
+ case 0b0011:
+ *get_content = reassoc_resp;
+ return "Reassociation Response";
+ case 0b0100:
+ *get_content = probe_req;
+ return "Probe Request";
+ case 0b0101:
+ *get_content = probe_resp;
+ return "Probe Response";
+ case 0b1000:
+ *get_content = beacon;
+ return "Beacon";
+ case 0b1001:
+ *get_content = atim;
+ return "ATIM";
+ case 0b1010:
+ *get_content = disassoc;
+ return "Disassociation";
+ case 0b1011:
+ *get_content = auth;
+ return "Authentication";
+ case 0b1100:
+ *get_content = deauth;
+ return "Deauthentication";
+ case 0b0110 ... 0b0111:
+ case 0b1101 ... 0b1111:
+ *get_content = NULL;
+ return "Reserved";
+ default:
+ *get_content = NULL;
+ return "Management SubType unknown";
+ }
+}
+
+static const char *ctrl_sub(u8 subtype, struct pkt_buff *pkt,
+ int8_t (**get_content)(struct pkt_buff *pkt))
+{
+ switch (subtype) {
+ case 0b1010:
+ *get_content = ps_poll;
+ return "PS-Poll";
+ case 0b1011:
+ *get_content = rts;
+ return "RTS";
+ case 0b1100:
+ *get_content = cts;
+ return "CTS";
+ case 0b1101:
+ *get_content = ack;
+ return "ACK";
+ case 0b1110:
+ *get_content = cf_end;
+ return "CF End";
+ case 0b1111:
+ *get_content = cf_end_ack;
+ return "CF End + CF-ACK";
+ case 0b0000 ... 0b1001:
+ *get_content = NULL;
+ return "Reserved";
+ default:
+ return "Control SubType unkown";
+ }
+}
+
+static const char *data_sub(u8 subtype, struct pkt_buff *pkt,
+ int8_t (**get_content)(struct pkt_buff *pkt))
+{
+ switch (subtype) {
+ case 0b0000:
+ *get_content = data;
+ return "Data";
+ case 0b0001:
+ *get_content = data_cf_ack;
+ return "Data + CF-ACK";
+ case 0b0010:
+ *get_content = data_cf_poll;
+ return "Data + CF-Poll";
+ case 0b0011:
+ *get_content = data_cf_ack_poll;
+ return "Data + CF-ACK + CF-Poll";
+ case 0b0100:
+ *get_content = null;
+ return "Null";
+ case 0b0101:
+ *get_content = cf_ack;
+ return "CF-ACK";
+ case 0b0110:
+ *get_content = cf_poll;
+ return "CF-Poll";
+ case 0b0111:
+ *get_content = cf_ack_poll;
+ return "CF-ACK + CF-Poll";
+ case 0b1000 ... 0b1111:
+ *get_content = NULL;
+ return "Reserved";
+ default:
+ *get_content = NULL;
+ return "Data SubType unkown";
+ }
+}
+
+static const char *
+frame_control_type(u8 type, const char *(**get_subtype)(u8 subtype,
+ struct pkt_buff *pkt, int8_t (**get_content)(struct pkt_buff *pkt)))
+{
+ switch (type) {
+ case 0b00:
+ *get_subtype = mgt_sub;
+ return "Management";
+ case 0b01:
+ *get_subtype = ctrl_sub;
+ return "Control";
+ case 0b10:
+ *get_subtype = data_sub;
+ return "Data";
+ case 0b11:
+ *get_subtype = NULL;
+ return "Reserved";
+ default:
+ *get_subtype = NULL;
+ return "Control Type unkown";
+ }
+}
+
+static void ieee80211(struct pkt_buff *pkt)
+{
+ int8_t (*get_content)(struct pkt_buff *pkt) = NULL;
+ const char *(*get_subtype)(u8 subtype, struct pkt_buff *pkt,
+ int8_t (**get_content)(struct pkt_buff *pkt)) = NULL;
+ const char *subtype = NULL;
+ struct ieee80211_frm_ctrl *frm_ctrl;
+
+ frm_ctrl = (struct ieee80211_frm_ctrl *)
+ pkt_pull(pkt, sizeof(*frm_ctrl));
+ if (frm_ctrl == NULL)
+ return;
+
+ tprintf(" [ 802.11 Frame Control (0x%04x)]\n",
+ le16_to_cpu(frm_ctrl->frame_control));
+
+ tprintf(" [ Proto Version (%u), ", frm_ctrl->proto_version);
+ tprintf("Type (%u, %s), ", frm_ctrl->type,
+ frame_control_type(frm_ctrl->type, &get_subtype));
+ if (get_subtype) {
+ subtype = (*get_subtype)(frm_ctrl->subtype, pkt, &get_content);
+ tprintf("Subtype (%u, %s)", frm_ctrl->subtype, subtype);
+ } else {
+ tprintf("%s%s%s", colorize_start_full(black, red),
+ "No SubType Data available", colorize_end());
+ }
+
+ tprintf("%s%s", frm_ctrl->to_ds ? ", Frame goes to DS" : "",
+ frm_ctrl->from_ds ? ", Frame comes from DS" : "");
+ tprintf("%s", frm_ctrl->more_frags ? ", More Fragments" : "");
+ tprintf("%s", frm_ctrl->retry ? ", Frame is retransmitted" : "");
+ tprintf("%s", frm_ctrl->power_mgmt ? ", In Power Saving Mode" : "");
+ tprintf("%s", frm_ctrl->more_data ? ", More Data" : "");
+ tprintf("%s", frm_ctrl->wep ? ", Needs WEP" : "");
+ tprintf("%s", frm_ctrl->order ? ", Order" : "");
+ tprintf(" ]\n");
+
+ if (get_content) {
+ tprintf(" [ Subtype %s: ", subtype);
+ if (!((*get_content) (pkt)))
+ tprintf("%s%s%s", colorize_start_full(black, red),
+ "Failed to dissect Subtype", colorize_end());
+ tprintf(" ]");
+ } else {
+ tprintf("%s%s%s", colorize_start_full(black, red),
+ "No SubType Data available", colorize_end());
+ }
+
+ tprintf("\n");
+
+// pkt_set_proto(pkt, &ieee802_lay2, ntohs(eth->h_proto));
+}
+
+static void ieee80211_less(struct pkt_buff *pkt)
+{
+ tprintf("802.11 frame (more on todo)");
+}
+
+struct protocol ieee80211_ops = {
+ .key = 0,
+ .print_full = ieee80211,
+ .print_less = ieee80211_less,
+};
diff --git a/proto_arp.c b/proto_arp.c
new file mode 100644
index 0000000..d6c0eec
--- /dev/null
+++ b/proto_arp.c
@@ -0,0 +1,163 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdint.h>
+#include <netinet/in.h> /* for ntohs() */
+
+#include "proto.h"
+#include "protos.h"
+#include "dissector_eth.h"
+#include "pkt_buff.h"
+#include "built_in.h"
+
+struct arphdr {
+ uint16_t ar_hrd; /* format of hardware address */
+ uint16_t ar_pro; /* format of protocol address */
+ uint8_t ar_hln; /* length of hardware address */
+ uint8_t ar_pln; /* length of protocol address */
+ uint16_t ar_op; /* ARP opcode (command) */
+ uint8_t ar_sha[6]; /* sender hardware address */
+ uint8_t ar_sip[4]; /* sender IP address */
+ uint8_t ar_tha[6]; /* target hardware address */
+ uint8_t ar_tip[4]; /* target IP address */
+} __packed;
+
+#define ARPHRD_ETHER 1
+#define ARPHRD_IEEE802 6
+#define ARPHRD_ARCNET 7
+#define ARPHRD_ATM 16
+#define ARPHRD_ATM2 19
+#define ARPHRD_SERIAL 20
+#define ARPHRD_ATM3 21
+#define ARPHRD_IEEE1394 24
+
+#define ARPOP_REQUEST 1 /* ARP request */
+#define ARPOP_REPLY 2 /* ARP reply */
+#define ARPOP_RREQUEST 3 /* RARP request */
+#define ARPOP_RREPLY 4 /* RARP reply */
+#define ARPOP_InREQUEST 8 /* InARP request */
+#define ARPOP_InREPLY 9 /* InARP reply */
+#define ARPOP_NAK 10 /* (ATM)ARP NAK */
+
+static void arp(struct pkt_buff *pkt)
+{
+ char *hrd;
+ char *pro;
+ char *opcode;
+ struct arphdr *arp = (struct arphdr *) pkt_pull(pkt, sizeof(*arp));
+
+ if (arp == NULL)
+ return;
+
+ switch (ntohs(arp->ar_hrd)) {
+ case ARPHRD_ETHER:
+ hrd = "Ethernet";
+ break;
+ case ARPHRD_IEEE802:
+ hrd = "IEEE 802";
+ break;
+ case ARPHRD_ARCNET:
+ hrd = "ARCNET";
+ break;
+ case ARPHRD_ATM:
+ case ARPHRD_ATM2:
+ case ARPHRD_ATM3:
+ hrd = "ATM";
+ break;
+ case ARPHRD_SERIAL:
+ hrd = "Serial Line";
+ break;
+ case ARPHRD_IEEE1394:
+ hrd = "IEEE 1394.1995";
+ break;
+ default:
+ hrd = "Unknown";
+ break;
+ }
+
+ pro = lookup_ether_type(ntohs(arp->ar_pro));
+ if (pro == NULL)
+ pro = "Unknown";
+
+ switch (ntohs(arp->ar_op)) {
+ case ARPOP_REQUEST:
+ opcode = "ARP request";
+ break;
+ case ARPOP_REPLY:
+ opcode = "ARP reply";
+ break;
+ case ARPOP_RREQUEST:
+ opcode = "RARP request";
+ break;
+ case ARPOP_RREPLY:
+ opcode = "RARP reply";
+ break;
+ case ARPOP_InREQUEST:
+ opcode = "InARP request";
+ break;
+ case ARPOP_InREPLY:
+ opcode = "InARP reply";
+ break;
+ case ARPOP_NAK:
+ opcode = "(ATM) ARP NAK";
+ break;
+ default:
+ opcode = "Unknown";
+ break;
+ };
+
+ tprintf(" [ ARP ");
+ tprintf("Format HA (%u => %s), ", ntohs(arp->ar_hrd), hrd);
+ tprintf("Format Proto (0x%.4x => %s), ", ntohs(arp->ar_pro), pro);
+ tprintf("HA Len (%u), ", arp->ar_hln);
+ tprintf("Proto Len (%u), ", arp->ar_pln);
+ tprintf("Opcode (%u => %s)", ntohs(arp->ar_op), opcode);
+ tprintf(" ]\n");
+}
+
+static void arp_less(struct pkt_buff *pkt)
+{
+ char *opcode = NULL;
+ struct arphdr *arp = (struct arphdr *) pkt_pull(pkt, sizeof(*arp));
+
+ if (arp == NULL)
+ return;
+
+ switch (ntohs(arp->ar_op)) {
+ case ARPOP_REQUEST:
+ opcode = "ARP request";
+ break;
+ case ARPOP_REPLY:
+ opcode = "ARP reply";
+ break;
+ case ARPOP_RREQUEST:
+ opcode = "RARP request";
+ break;
+ case ARPOP_RREPLY:
+ opcode = "RARP reply";
+ break;
+ case ARPOP_InREQUEST:
+ opcode = "InARP request";
+ break;
+ case ARPOP_InREPLY:
+ opcode = "InARP reply";
+ break;
+ case ARPOP_NAK:
+ opcode = "(ATM) ARP NAK";
+ break;
+ default:
+ opcode = "Unknown";
+ break;
+ };
+
+ tprintf(" Op %s", opcode);
+}
+
+struct protocol arp_ops = {
+ .key = 0x0806,
+ .print_full = arp,
+ .print_less = arp_less,
+};
diff --git a/proto_ethernet.c b/proto_ethernet.c
new file mode 100644
index 0000000..99c9d6c
--- /dev/null
+++ b/proto_ethernet.c
@@ -0,0 +1,80 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <netinet/in.h>
+#include <linux/if_ether.h>
+
+#include "proto.h"
+#include "protos.h"
+#include "dissector_eth.h"
+#include "pkt_buff.h"
+#include "oui.h"
+
+static void ethernet(struct pkt_buff *pkt)
+{
+ char *type;
+ uint8_t *src_mac, *dst_mac;
+ struct ethhdr *eth = (struct ethhdr *) pkt_pull(pkt, sizeof(*eth));
+
+ if (eth == NULL)
+ return;
+
+ src_mac = eth->h_source;
+ dst_mac = eth->h_dest;
+
+ tprintf(" [ Eth ");
+ tprintf("MAC (%.2x:%.2x:%.2x:%.2x:%.2x:%.2x => ",
+ src_mac[0], src_mac[1], src_mac[2],
+ src_mac[3], src_mac[4], src_mac[5]);
+ tprintf("%.2x:%.2x:%.2x:%.2x:%.2x:%.2x), ",
+ dst_mac[0], dst_mac[1], dst_mac[2],
+ dst_mac[3], dst_mac[4], dst_mac[5]);
+ tprintf("Proto (0x%.4x", ntohs(eth->h_proto));
+
+ type = lookup_ether_type(ntohs(eth->h_proto));
+ if (type)
+ tprintf(", %s%s%s", colorize_start(bold), type, colorize_end());
+
+ tprintf(") ]\n");
+ tprintf(" [ Vendor ");
+ tprintf("(%s => %s)",
+ lookup_vendor_str((src_mac[0] << 16) | (src_mac[1] << 8) |
+ src_mac[2]),
+ lookup_vendor_str((dst_mac[0] << 16) | (dst_mac[1] << 8) |
+ dst_mac[2]));
+ tprintf(" ]\n");
+
+ pkt_set_proto(pkt, &eth_lay2, ntohs(eth->h_proto));
+}
+
+static void ethernet_less(struct pkt_buff *pkt)
+{
+ uint8_t *src_mac, *dst_mac;
+ struct ethhdr *eth = (struct ethhdr *) pkt_pull(pkt, sizeof(*eth));
+
+ if (eth == NULL)
+ return;
+
+ src_mac = eth->h_source;
+ dst_mac = eth->h_dest;
+ tprintf(" %s => %s ",
+ lookup_vendor_str((src_mac[0] << 16) | (src_mac[1] << 8) |
+ src_mac[2]),
+ lookup_vendor_str((dst_mac[0] << 16) | (dst_mac[1] << 8) |
+ dst_mac[2]));
+ tprintf("%s%s%s", colorize_start(bold),
+ lookup_ether_type(ntohs(eth->h_proto)), colorize_end());
+
+ pkt_set_proto(pkt, &eth_lay2, ntohs(eth->h_proto));
+}
+
+struct protocol ethernet_ops = {
+ .key = 0,
+ .print_full = ethernet,
+ .print_less = ethernet_less,
+};
diff --git a/proto_icmpv4.c b/proto_icmpv4.c
new file mode 100644
index 0000000..13f0eda
--- /dev/null
+++ b/proto_icmpv4.c
@@ -0,0 +1,68 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <netinet/in.h> /* for ntohs() */
+
+#include "proto.h"
+#include "protos.h"
+#include "csum.h"
+#include "dissector_eth.h"
+#include "pkt_buff.h"
+#include "built_in.h"
+
+struct icmphdr {
+ uint8_t type;
+ uint8_t code;
+ uint16_t checksum;
+ union {
+ struct {
+ uint16_t id;
+ uint16_t sequence;
+ } echo;
+ uint32_t gateway;
+ struct {
+ uint16_t ____unused;
+ uint16_t mtu;
+ } frag;
+ } un;
+} __packed;
+
+static void icmp(struct pkt_buff *pkt)
+{
+ struct icmphdr *icmp = (struct icmphdr *) pkt_pull(pkt, sizeof(*icmp));
+ uint16_t csum;
+
+ if (icmp == NULL)
+ return;
+
+ csum = calc_csum(icmp, pkt_len(pkt) + sizeof(*icmp), 0);
+
+ tprintf(" [ ICMP ");
+ tprintf("Type (%u), ", icmp->type);
+ tprintf("Code (%u), ", icmp->code);
+ tprintf("CSum (0x%.4x) is %s", ntohs(icmp->checksum),
+ csum ? colorize_start_full(black, red) "bogus (!)"
+ colorize_end() : "ok");
+ tprintf(" ]\n");
+}
+
+static void icmp_less(struct pkt_buff *pkt)
+{
+ struct icmphdr *icmp = (struct icmphdr *) pkt_pull(pkt, sizeof(*icmp));
+
+ if (icmp == NULL)
+ return;
+
+ tprintf(" Type %u Code %u", icmp->type, icmp->code);
+}
+
+struct protocol icmpv4_ops = {
+ .key = 0x01,
+ .print_full = icmp,
+ .print_less = icmp_less,
+};
diff --git a/proto_icmpv6.c b/proto_icmpv6.c
new file mode 100644
index 0000000..6b2d826
--- /dev/null
+++ b/proto_icmpv6.c
@@ -0,0 +1,1641 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2012 Markus Amend <markus@netsniff-ng.org>, Deutsche Flugsicherung GmbH
+ * Subject to the GPL, version 2.
+ *
+ * ICMPv6 described in RFC4443, RFC2710, RFC4861, RFC2894,
+ * RFC4620, RFC3122, RFC3810, RFC3775, RFC3971, RFC4065
+ * RFC4286
+ * Look also for an good overview:
+ * http://www.iana.org/assignments/icmpv6-parameters
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <asm/byteorder.h>
+
+#include "proto.h"
+#include "protos.h"
+#include "dissector_eth.h"
+#include "pkt_buff.h"
+#include "built_in.h"
+
+#define icmpv6_code_range_valid(code, sarr) ((code) < array_size((sarr)))
+
+struct icmpv6_general_hdr {
+ uint8_t h_type;
+ uint8_t h_code;
+ uint16_t h_chksum;
+} __packed;
+
+/* for type 0x01 and 0x03 */
+struct icmpv6_type_1_3 {
+ uint32_t unused;
+ uint8_t invoking_pkt[0];
+} __packed;
+
+struct icmpv6_type_2 {
+ uint32_t MTU;
+ uint8_t invoking_pkt[0];
+} __packed;
+
+struct icmpv6_type_4 {
+ uint32_t pointer;
+ uint8_t invoking_pkt[0];
+} __packed;
+
+struct icmpv6_type_128_129 {
+ uint16_t id;
+ uint16_t sn;
+ uint8_t data[0];
+} __packed;
+
+/* MLDv1 msg */
+struct icmpv6_type_130_131_132 {
+ uint16_t maxrespdel;
+ uint16_t res;
+ struct in6_addr ipv6_addr;
+} __packed;
+/* end MLDv1 msg */
+
+struct icmpv6_type_130_mldv2 {
+ uint8_t resv_S_QRV;
+ uint8_t QQIC;
+ uint16_t nr_src;
+ struct in6_addr ipv6_addr[0];
+} __packed;
+
+/* Neighbor Discovery msg */
+struct icmpv6_type_133_141_142 {
+ uint32_t res;
+ uint8_t ops[0];
+} __packed;
+
+struct icmpv6_type_134 {
+ uint8_t cur_hop_limit;
+ uint8_t m_o_res;
+ uint16_t router_lifetime;
+ uint32_t reachable_time;
+ uint32_t retrans_timer;
+ uint8_t ops[0];
+} __packed;
+
+struct icmpv6_type_135 {
+ uint32_t res;
+ struct in6_addr ipv6_addr;
+ uint8_t ops[0];
+} __packed;
+
+struct icmpv6_type_136 {
+ uint32_t r_s_o_res;
+ struct in6_addr ipv6_addr;
+ uint8_t ops[0];
+} __packed;
+
+struct icmpv6_type_137 {
+ uint32_t res;
+ struct in6_addr ipv6_targ_addr;
+ struct in6_addr ipv6_dest_addr;
+ uint8_t ops[0];
+} __packed;
+
+struct icmpv6_neighb_disc_ops_general {
+ uint8_t type;
+ uint8_t len;
+ uint8_t ops[0];
+} __packed;
+
+struct icmpv6_neighb_disc_ops_type_1_2 {
+ uint8_t link_lay_addr[0];
+} __packed;
+
+struct icmpv6_neighb_disc_ops_type_3 {
+ uint8_t prefix_len;
+ uint8_t l_a_res1;
+ uint32_t valid_lifetime;
+ uint32_t preferred_lifetime;
+ uint32_t res2;
+ struct in6_addr prefix;
+} __packed;
+
+struct icmpv6_neighb_disc_ops_type_4 {
+ uint16_t res1;
+ uint32_t res2;
+ uint8_t ip_hdr_data[0];
+} __packed;
+
+struct icmpv6_neighb_disc_ops_type_5 {
+ uint16_t res1;
+ uint32_t MTU;
+} __packed;
+
+struct icmpv6_neighb_disc_ops_type_9_10 {
+ uint16_t res1;
+ uint32_t res2;
+ uint8_t ip_hdr_data[0];
+} __packed;
+
+struct icmpv6_neighb_disc_ops_type_15 {
+ uint8_t name_type;
+ size_t pad_len;
+ char name[0];
+ uint8_t pad[0];
+} __packed;
+
+struct icmpv6_neighb_disc_ops_type_16 {
+ uint8_t cert_type;
+ uint8_t res;
+ uint8_t cert[0];
+ uint8_t pad[0];
+} __packed;
+
+struct icmpv6_neighb_disc_ops_type_17 {
+ uint8_t opt_code;
+ uint8_t prefix_len;
+ uint8_t data[0];
+} __packed;
+
+struct icmpv6_neighb_disc_ops_type_17_1 {
+ uint32_t res;
+ struct in6_addr ipv6_addr;
+} __packed;
+
+struct icmpv6_neighb_disc_ops_type_17_2 {
+ struct in6_addr ipv6_addr;
+} __packed;
+
+struct icmpv6_neighb_disc_ops_type_19 {
+ uint8_t opt_code;
+ uint8_t lla[0];
+} __packed;
+/* end Neighbor Discovery msg */
+
+struct icmpv6_type_138 {
+ uint32_t seq_nr;
+ uint8_t seg_nr;
+ uint8_t flags;
+ uint16_t maxdelay;
+ uint32_t res;
+} __packed;
+
+/* Node Information Queries */
+struct icmpv6_type_139_140 {
+ uint16_t qtype;
+ uint16_t flags;
+ uint64_t nonce;
+ uint8_t data[0];
+} __packed;
+/* end Node Information Queries */
+
+/* MLDv2 report */
+struct icmpv6_type_143 {
+ uint16_t res;
+ uint16_t nr_rec;
+ uint8_t addr_rec[0];
+} __packed;
+
+struct icmpv6_mldv2_addr_rec {
+ uint8_t rec_type;
+ uint8_t aux_data_len;
+ uint16_t nr_src;
+ struct in6_addr multic_addr;
+ struct in6_addr src_addr[0];
+} __packed;
+/* end MLDv2 report */
+
+/* ICMP Mobility Support */
+struct icmpv6_type_144_146 {
+ uint16_t id;
+ uint16_t res;
+} __packed;
+
+struct icmpv6_type_145 {
+ uint16_t id;
+ uint16_t res;
+ struct in6_addr home_agent_addr[0];
+} __packed;
+
+struct icmpv6_type_147 {
+ uint16_t id;
+ uint16_t m_o_res;
+ uint8_t ops[0];
+} __packed;
+/* end ICMP Mobility Support */
+
+/* SEcure Neighbor Discovery */
+struct icmpv6_type_148 {
+ uint16_t id;
+ uint16_t comp;
+ uint8_t ops[0];
+} __packed;
+
+struct icmpv6_type_149 {
+ uint16_t id;
+ uint16_t all_comp;
+ uint16_t comp;
+ uint16_t res;
+ uint8_t ops[0];
+} __packed;
+/* end SEcure Neighbor Discovery */
+
+struct icmpv6_type_150 {
+ union {
+ uint32_t subtype_res;
+ struct {
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+ uint32_t res :24,
+ subtype :8;
+#elif defined(__BIG_ENDIAN_BITFIELD)
+ uint32_t subtype :8,
+ res :24;
+#else
+# error "Please fix <asm/byteorder.h>"
+#endif
+ };
+ };
+ uint8_t ops[0];
+} __packed;
+
+/* Multicast Router Discovery */
+struct icmpv6_type_151 {
+ uint16_t query_intv;
+ uint16_t rob_var;
+} __packed;
+
+struct icmpv6_type_152 {
+ uint8_t null[0];
+} __packed;
+
+struct icmpv6_type_153 {
+ uint8_t null[0];
+} __packed;
+/* end Multicast Router Discovery */
+
+struct icmpv6_type_154 {
+ uint8_t subtype;
+ uint8_t res;
+ uint16_t id;
+ uint8_t ops[0];
+} __packed;
+
+static int8_t print_ipv6_addr_list(struct pkt_buff *pkt, uint8_t nr_addr)
+{
+ char address[INET6_ADDRSTRLEN];
+ struct in6_addr *addr;
+
+ while (nr_addr--) {
+ addr = (struct in6_addr *) pkt_pull(pkt, sizeof(*addr));
+ if (addr == NULL)
+ return 0;
+
+ tprintf("\n\t Address: %s",
+ inet_ntop(AF_INET6, addr, address,
+ sizeof(address)));
+ }
+
+ return 1;
+}
+
+static const char *icmpv6_mcast_rec_types[] = {
+ "MODE_IS_INCLUDE",
+ "MODE_IS_EXCLUDE",
+ "CHANGE_TO_INCLUDE_MODE",
+ "CHANGE_TO_EXCLUDE_MODE",
+ "ALLOW_NEW_SOURCES",
+ "BLOCK_OLD_SOURCES",
+};
+
+static int8_t dissect_icmpv6_mcast_rec(struct pkt_buff *pkt,
+ uint16_t nr_rec)
+{
+ uint16_t nr_src, aux_data_len_bytes;
+ char address[INET6_ADDRSTRLEN];
+ struct icmpv6_mldv2_addr_rec *addr_rec;
+
+ while (nr_rec--) {
+ addr_rec = (struct icmpv6_mldv2_addr_rec *)
+ pkt_pull(pkt,sizeof(*addr_rec));
+ if (addr_rec == NULL)
+ return 0;
+ aux_data_len_bytes = addr_rec->aux_data_len * 4;
+ nr_src = ntohs(addr_rec->nr_src);
+
+ tprintf(", Rec Type %s (%u)",
+ icmpv6_code_range_valid(addr_rec->rec_type - 1,
+ icmpv6_mcast_rec_types) ?
+ icmpv6_mcast_rec_types[addr_rec->rec_type - 1]
+ : "Unknown", addr_rec->rec_type);
+ if (aux_data_len_bytes > pkt_len(pkt)) {
+ tprintf(", Aux Data Len (%u, %u bytes) %s",
+ addr_rec->aux_data_len,
+ aux_data_len_bytes,
+ colorize_start_full(black, red) "invalid"
+ colorize_end());
+ return 0;
+ }
+ tprintf(", Aux Data Len (%u, %u bytes)",addr_rec->aux_data_len,
+ aux_data_len_bytes);
+ tprintf(", Nr. of Sources (%u)",nr_src);
+ tprintf(", Address: %s",
+ inet_ntop(AF_INET6, &addr_rec->multic_addr,
+ address, sizeof(address)));
+
+ if(!print_ipv6_addr_list(pkt, nr_src))
+ return 0;
+
+ if (aux_data_len_bytes > pkt_len(pkt)) {
+ tprintf("\nAux Data Len %s",
+ colorize_start_full(black, red) "invalid"
+ colorize_end());
+ return 0;
+ }
+
+ tprintf(", Aux Data: ");
+ while (aux_data_len_bytes--) {
+ tprintf("%x", *pkt_pull(pkt,1));
+ }
+ }
+
+ return 1;
+}
+
+static int8_t dissect_neighb_disc_ops_1(struct pkt_buff *pkt,
+ ssize_t len)
+{
+ struct icmpv6_neighb_disc_ops_type_1_2 *icmp_neighb_disc_1;
+
+ icmp_neighb_disc_1 = (struct icmpv6_neighb_disc_ops_type_1_2 *)
+ pkt_pull(pkt,sizeof(*icmp_neighb_disc_1));
+ if (icmp_neighb_disc_1 == NULL)
+ return 0;
+ len -= sizeof(*icmp_neighb_disc_1);
+ if (len < 0)
+ return 0;
+
+ tprintf("Address 0x");
+
+ while(len--){
+ tprintf("%x", *pkt_pull(pkt,1));
+ }
+
+ return 1;
+}
+
+static int8_t dissect_neighb_disc_ops_2(struct pkt_buff *pkt,
+ ssize_t len)
+{
+ return dissect_neighb_disc_ops_1(pkt, len);
+}
+
+static int8_t dissect_neighb_disc_ops_3(struct pkt_buff *pkt,
+ ssize_t len)
+{
+ char address[INET6_ADDRSTRLEN];
+ struct icmpv6_neighb_disc_ops_type_3 *icmp_neighb_disc_3;
+
+ icmp_neighb_disc_3 = (struct icmpv6_neighb_disc_ops_type_3 *)
+ pkt_pull(pkt,sizeof(*icmp_neighb_disc_3));
+ if (icmp_neighb_disc_3 == NULL)
+ return 0;
+ len -= sizeof(*icmp_neighb_disc_3);
+ if (len < 0)
+ return 0;
+
+ tprintf("Prefix Len (%u) ",icmp_neighb_disc_3->prefix_len);
+ tprintf("L (%u) A (%u) Res1 (0x%x) ",icmp_neighb_disc_3->l_a_res1 >> 7,
+ (icmp_neighb_disc_3->l_a_res1 >> 7) & 0x1,
+ icmp_neighb_disc_3->l_a_res1 & 0x3F);
+ tprintf("Valid Lifetime (%us) ",
+ ntohl(icmp_neighb_disc_3->valid_lifetime));
+ tprintf("Preferred Lifetime (%us) ",
+ ntohl(icmp_neighb_disc_3->preferred_lifetime));
+ tprintf("Reserved2 (0x%x) ",
+ ntohl(icmp_neighb_disc_3->res2));
+ tprintf("Prefix: %s ",
+ inet_ntop(AF_INET6,&icmp_neighb_disc_3->prefix,
+ address, sizeof(address)));
+
+ return 1;
+}
+
+static int8_t dissect_neighb_disc_ops_4(struct pkt_buff *pkt,
+ ssize_t len)
+{
+ struct icmpv6_neighb_disc_ops_type_4 *icmp_neighb_disc_4;
+
+ icmp_neighb_disc_4 = (struct icmpv6_neighb_disc_ops_type_4 *)
+ pkt_pull(pkt,sizeof(*icmp_neighb_disc_4));
+ if (icmp_neighb_disc_4 == NULL)
+ return 0;
+ len -= sizeof(*icmp_neighb_disc_4);
+ if (len < 0)
+ return 0;
+
+ tprintf("Reserved 1 (0x%x) ", ntohs(icmp_neighb_disc_4->res1));
+ tprintf("Reserved 2 (0x%x) ", ntohl(icmp_neighb_disc_4->res2));
+ tprintf("IP header + data ");
+
+ while (len--) {
+ tprintf("%x", *pkt_pull(pkt,1));
+ }
+
+ return 1;
+}
+
+static int8_t dissect_neighb_disc_ops_5(struct pkt_buff *pkt,
+ ssize_t len)
+{
+ struct icmpv6_neighb_disc_ops_type_5 *icmp_neighb_disc_5;
+
+ icmp_neighb_disc_5 = (struct icmpv6_neighb_disc_ops_type_5 *)
+ pkt_pull(pkt,sizeof(*icmp_neighb_disc_5));
+ if (icmp_neighb_disc_5 == NULL)
+ return 0;
+ len -= sizeof(*icmp_neighb_disc_5);
+ if (len < 0)
+ return 0;
+
+ tprintf("Reserved (0x%x) ", ntohs(icmp_neighb_disc_5->res1));
+ tprintf("MTU (%u)", ntohl(icmp_neighb_disc_5->MTU));
+
+ return 1;
+}
+
+static int8_t dissect_neighb_disc_ops_9(struct pkt_buff *pkt,
+ ssize_t len)
+{
+ struct icmpv6_neighb_disc_ops_type_9_10 *icmp_neighb_disc_9;
+
+ icmp_neighb_disc_9 = (struct icmpv6_neighb_disc_ops_type_9_10 *)
+ pkt_pull(pkt,sizeof(*icmp_neighb_disc_9));
+ if (icmp_neighb_disc_9 == NULL)
+ return 0;
+ len -= sizeof(*icmp_neighb_disc_9);
+ if (len < 0)
+ return 0;
+
+ tprintf("Reserved 1 (0x%x) ", ntohs(icmp_neighb_disc_9->res1));
+ tprintf("Reserved 2 (0x%x) ", ntohl(icmp_neighb_disc_9->res2));
+
+ return print_ipv6_addr_list(pkt, len / sizeof(struct in6_addr));
+}
+
+static int8_t dissect_neighb_disc_ops_10(struct pkt_buff *pkt,
+ ssize_t len)
+{
+ return dissect_neighb_disc_ops_9(pkt, len);
+}
+
+static const char *icmpv6_neighb_disc_ops_15_name[] = {
+ "DER Encoded X.501 Name",
+ "FQDN",
+};
+
+static int8_t dissect_neighb_disc_ops_15(struct pkt_buff *pkt,
+ ssize_t len)
+{
+ size_t pad_len;
+ ssize_t name_len;
+ struct icmpv6_neighb_disc_ops_type_15 *icmp_neighb_disc_15;
+
+ icmp_neighb_disc_15 = (struct icmpv6_neighb_disc_ops_type_15 *)
+ pkt_pull(pkt,sizeof(*icmp_neighb_disc_15));
+ if (icmp_neighb_disc_15 == NULL)
+ return 0;
+ len -= sizeof(*icmp_neighb_disc_15);
+ if (len < 0)
+ return 0;
+ pad_len = icmp_neighb_disc_15->pad_len;
+
+ tprintf("Name Type %s (%u) ",
+ icmpv6_code_range_valid(icmp_neighb_disc_15->name_type - 1,
+ icmpv6_neighb_disc_ops_15_name) ?
+ icmpv6_neighb_disc_ops_15_name[
+ icmp_neighb_disc_15->name_type - 1] : "Unknown",
+ icmp_neighb_disc_15->name_type);
+ if (pad_len > len) {
+ tprintf("Pad Len (%zu, invalid)\n%s", pad_len,
+ colorize_start_full(black, red)
+ "Skip Option" colorize_end());
+ pkt_pull(pkt, len);
+ return 1;
+ }
+ else
+ tprintf("Pad Len (%zu) ", pad_len);
+
+ name_len = len - pad_len;
+
+ tprintf("Name (");
+ while (name_len--) {
+ tprintf("%c", *pkt_pull(pkt,1));
+ }
+ tprintf(") ");
+
+ tprintf("Padding (");
+
+ while (pad_len--) {
+ tprintf("%x", *pkt_pull(pkt,1));
+ }
+ tprintf(")");
+
+ return 1;
+}
+
+static const char *icmpv6_neighb_disc_ops_16_cert[] = {
+ "X.509v3 Certificate",
+};
+
+static int8_t dissect_neighb_disc_ops_16(struct pkt_buff *pkt,
+ ssize_t len)
+{
+ struct icmpv6_neighb_disc_ops_type_16 *icmp_neighb_disc_16;
+
+ icmp_neighb_disc_16 = (struct icmpv6_neighb_disc_ops_type_16 *)
+ pkt_pull(pkt,sizeof(*icmp_neighb_disc_16));
+ if (icmp_neighb_disc_16 == NULL)
+ return 0;
+ len -= sizeof(*icmp_neighb_disc_16);
+ if (len < 0)
+ return 0;
+
+ tprintf("Cert Type %s (%u) ",
+ icmpv6_code_range_valid(icmp_neighb_disc_16->cert_type - 1,
+ icmpv6_neighb_disc_ops_16_cert) ?
+ icmpv6_neighb_disc_ops_16_cert[
+ icmp_neighb_disc_16->cert_type - 1] : "Unknown",
+ icmp_neighb_disc_16->cert_type);
+ tprintf("Res (0x%x) ", icmp_neighb_disc_16->res);
+
+ tprintf("Certificate + Padding (");
+ while (len--) {
+ tprintf("%x", *pkt_pull(pkt,1));
+ }
+ tprintf(") ");
+
+ return 1;
+}
+
+static const char *icmpv6_neighb_disc_ops_17_codes[] = {
+ "Old Care-of Address",
+ "New Care-of Address",
+ "NAR's IP address",
+ "NAR's Prefix",
+};
+
+static int8_t dissect_neighb_disc_ops_17(struct pkt_buff *pkt,
+ ssize_t len)
+{
+ char address[INET6_ADDRSTRLEN];
+ struct icmpv6_neighb_disc_ops_type_17 *icmp_neighb_disc_17;
+
+ icmp_neighb_disc_17 = (struct icmpv6_neighb_disc_ops_type_17 *)
+ pkt_pull(pkt,sizeof(*icmp_neighb_disc_17));
+ if (icmp_neighb_disc_17 == NULL)
+ return 0;
+ len -= sizeof(*icmp_neighb_disc_17);
+ if (len < 0)
+ return 0;
+
+ tprintf("Opt Code %s (%u) ",
+ icmpv6_code_range_valid(icmp_neighb_disc_17->opt_code - 1,
+ icmpv6_neighb_disc_ops_17_codes) ?
+ icmpv6_neighb_disc_ops_17_codes[
+ icmp_neighb_disc_17->opt_code - 1] : "Unknown",
+ icmp_neighb_disc_17->opt_code);
+ tprintf("Prefix Len (%u) ", icmp_neighb_disc_17->prefix_len);
+
+ if (len == sizeof(struct icmpv6_neighb_disc_ops_type_17_1)) {
+ struct icmpv6_neighb_disc_ops_type_17_1
+ *icmp_neighb_disc_17_1;
+
+ icmp_neighb_disc_17_1 =
+ (struct icmpv6_neighb_disc_ops_type_17_1 *)
+ pkt_pull(pkt,sizeof(*icmp_neighb_disc_17_1));
+ if (icmp_neighb_disc_17_1 == NULL)
+ return 0;
+ len -= sizeof(*icmp_neighb_disc_17_1);
+ if (len < 0)
+ return 0;
+
+ tprintf("Res (0x%x) ",icmp_neighb_disc_17_1->res);
+ tprintf("Addr: %s ",
+ inet_ntop(AF_INET6,&icmp_neighb_disc_17_1->ipv6_addr,
+ address, sizeof(address)));
+ }
+ else if (len == sizeof(struct icmpv6_neighb_disc_ops_type_17_2)) {
+ struct icmpv6_neighb_disc_ops_type_17_2
+ *icmp_neighb_disc_17_2;
+
+ icmp_neighb_disc_17_2 =
+ (struct icmpv6_neighb_disc_ops_type_17_2 *)
+ pkt_pull(pkt,sizeof(*icmp_neighb_disc_17_2));
+ if (icmp_neighb_disc_17_2 == NULL)
+ return 0;
+ len -= sizeof(*icmp_neighb_disc_17_2);
+ if (len < 0)
+ return 0;
+
+ tprintf("Addr: %s ",
+ inet_ntop(AF_INET6,&icmp_neighb_disc_17_2->ipv6_addr,
+ address, sizeof(address)));
+ }
+ else {
+ tprintf("%s (", colorize_start_full(black, red)
+ "Error Wrong Length. Skip Option" colorize_end());
+ while (len--) {
+ tprintf("%x", *pkt_pull(pkt,1));
+ }
+ tprintf(") ");
+ }
+
+ return 1;
+}
+
+static const char *icmpv6_neighb_disc_ops_19_codes[] = {
+ "Wildcard requesting resolution for all nearby access points",
+ "Link-Layer Address of the New Access Point",
+ "Link-Layer Address of the MN",
+ "Link-Layer Address of the NAR",
+ "Link-Layer Address of the source of RtSolPr or PrRtAdv \
+ message",
+ "The access point identified by the LLA belongs to the \
+ current interface of the router",
+ "No prefix information available for the access point \
+ identified by the LLA",
+ "No fast handover support available for the access point \
+ identified by the LLA",
+};
+
+static int8_t dissect_neighb_disc_ops_19(struct pkt_buff *pkt,
+ ssize_t len)
+{
+ struct icmpv6_neighb_disc_ops_type_19 *icmp_neighb_disc_19;
+
+ icmp_neighb_disc_19 = (struct icmpv6_neighb_disc_ops_type_19 *)
+ pkt_pull(pkt,sizeof(*icmp_neighb_disc_19));
+ if (icmp_neighb_disc_19 == NULL)
+ return 0;
+ len -= sizeof(*icmp_neighb_disc_19);
+ if (len < 0)
+ return 0;
+
+ tprintf("Opt Code %s (%u) ",
+ icmpv6_code_range_valid(icmp_neighb_disc_19->opt_code,
+ icmpv6_neighb_disc_ops_19_codes) ?
+ icmpv6_neighb_disc_ops_19_codes[
+ icmp_neighb_disc_19->opt_code] : "Unknown",
+ icmp_neighb_disc_19->opt_code);
+
+ tprintf("LLA (");
+ while(len--){
+ tprintf("%x", *pkt_pull(pkt,1));
+ }
+ tprintf(") ");
+
+ return 1;
+}
+
+static inline char *icmpv6_neighb_disc_ops(uint8_t code) {
+ switch (code) {
+ case 1: return "Source Link-Layer Address";
+ case 2: return "Target Link-Layer Address";
+ case 3: return "Prefix Information";
+ case 4: return "Redirected Header";
+ case 5: return "MTU";
+ case 6: return "NBMA Shortcut Limit Option";
+ case 7: return "Advertisement Interval Option";
+ case 8: return "Home Agent Information Option";
+ case 9: return "Source Address List";
+ case 10: return "Target Address List";
+ case 11: return "CGA option";
+ case 12: return "RSA Signature option";
+ case 13: return "Timestamp option";
+ case 14: return "Nonce option";
+ case 15: return "Trust Anchor option";
+ case 16: return "Certificate option";
+ case 17: return "IP Address/Prefix Option";
+ case 18: return "New Router Prefix Information Option";
+ case 19: return "Link-layer Address Option";
+ case 20: return "Neighbor Advertisement Acknowledgment Option";
+
+ case 23: return "Prefix Information";
+ case 24: return "Redirected Header";
+ case 25: return "MTU";
+ case 26: return "NBMA Shortcut Limit Option";
+ case 27: return "Advertisement Interval Option";
+ case 28: return "Home Agent Information Option";
+ case 29: return "Source Address List";
+ case 30: return "Target Address List";
+ case 31: return "DNS Search List Option";
+ case 32: return "Proxy Signature (PS)";
+
+ case 138: return "CARD Request option";
+ case 139: return "CARD Reply option";
+
+ case 253: return "RFC3692-style Experiment 1";
+ case 254: return "RFC3692-style Experiment 2";
+ }
+
+ return NULL;
+};
+
+static int8_t dissect_neighb_disc_ops(struct pkt_buff *pkt)
+{
+ size_t pad_bytes;
+ uint16_t ops_total_len;
+ ssize_t ops_payl_len;
+ struct icmpv6_neighb_disc_ops_general *icmp_neighb_disc;
+
+ while(pkt_len(pkt)) {
+ icmp_neighb_disc = (struct icmpv6_neighb_disc_ops_general *)
+ pkt_pull(pkt,sizeof(*icmp_neighb_disc));
+ if (icmp_neighb_disc == NULL)
+ return 0;
+
+ ops_total_len = icmp_neighb_disc->len * 8;
+ pad_bytes = (size_t) (ops_total_len % 8);
+ ops_payl_len = ops_total_len - sizeof(*icmp_neighb_disc) -
+ pad_bytes;
+
+ tprintf("\n\tOption %s (%u) ",
+ icmpv6_neighb_disc_ops(icmp_neighb_disc->type) ?
+ icmpv6_neighb_disc_ops(icmp_neighb_disc->type)
+ : "Type Unknown", icmp_neighb_disc->type);
+ if (ops_payl_len > pkt_len(pkt) || ops_payl_len < 0) {
+ tprintf("Length (%u, %u bytes, %s%s%s) ",
+ icmp_neighb_disc->len,
+ ops_total_len,
+ colorize_start_full(black, red),
+ "invalid", colorize_end());
+ return 0;
+ }
+
+ tprintf("Length (%u, %u bytes) ",icmp_neighb_disc->len,
+ ops_total_len);
+
+ switch (icmp_neighb_disc->type) {
+ case 1:
+ if (!dissect_neighb_disc_ops_1(pkt, ops_payl_len))
+ return 0;
+ break;
+ case 2:
+ if (!dissect_neighb_disc_ops_2(pkt, ops_payl_len))
+ return 0;
+ break;
+ case 3:
+ if (!dissect_neighb_disc_ops_3(pkt, ops_payl_len))
+ return 0;
+ break;
+ case 4:
+ if (!dissect_neighb_disc_ops_4(pkt, ops_payl_len))
+ return 0;
+ break;
+ case 5:
+ if (!dissect_neighb_disc_ops_5(pkt, ops_payl_len))
+ return 0;
+ break;
+ /* Type 9 and 10 defined in
+ * http://tools.ietf.org/html/rfc3122#section-3.1
+ */
+ case 9:
+ if (!dissect_neighb_disc_ops_9(pkt, ops_payl_len))
+ return 0;
+ break;
+ case 10:
+ if (!dissect_neighb_disc_ops_10(pkt, ops_payl_len))
+ return 0;
+ break;
+ /* Type 15 and 16 defined in
+ * http://tools.ietf.org/html/rfc3971#section-6.4.3
+ * http://tools.ietf.org/html/rfc3971#section-6.4.4
+ */
+ case 15:
+ if (!dissect_neighb_disc_ops_15(pkt, ops_payl_len))
+ return 0;
+ break;
+ case 16:
+ if (!dissect_neighb_disc_ops_16(pkt, ops_payl_len))
+ return 0;
+ break;
+ /* Type 17 and 19 defined in
+ * http://tools.ietf.org/html/rfc5568#section-6.4
+ */
+ case 17:
+ if (!dissect_neighb_disc_ops_17(pkt, ops_payl_len))
+ return 0;
+ break;
+ case 19:
+ if (!dissect_neighb_disc_ops_19(pkt, ops_payl_len))
+ return 0;
+ break;
+ default:
+ pkt_pull(pkt, ops_payl_len);
+ }
+
+ /* Skip Padding Bytes */
+ if (pad_bytes > pkt_len(pkt)) {
+ tprintf(" %s",colorize_start_full(black, red)
+ "Invalid Padding" colorize_end());
+ return 0;
+ }
+ pkt_pull(pkt, pad_bytes);
+ }
+
+ return 1;
+}
+
+static const char *icmpv6_type_1_codes[] = {
+ "No route to destination",
+ "Communication with destination administratively prohibited",
+ "Beyond scope of source address",
+ "Address unreachable",
+ "Port unreachable",
+ "Source address failed ingress/egress policy",
+ "Reject route to destination",
+ "Error in Source Routing Header",
+};
+
+static int8_t dissect_icmpv6_type1(struct pkt_buff *pkt)
+{
+ struct icmpv6_type_1_3 *icmp_1;
+
+ icmp_1 = (struct icmpv6_type_1_3 *) pkt_pull(pkt,sizeof(*icmp_1));
+ if (icmp_1 == NULL)
+ return 0;
+
+ tprintf(", Unused (0x%x)",ntohl(icmp_1->unused));
+ tprintf(" Payload include as much of invoking packet");
+
+ return 1;
+}
+
+static int8_t dissect_icmpv6_type2(struct pkt_buff *pkt)
+{
+ struct icmpv6_type_2 *icmp_2;
+
+ icmp_2 = (struct icmpv6_type_2 *) pkt_pull(pkt,sizeof(*icmp_2));
+ if (icmp_2 == NULL)
+ return 0;
+
+ tprintf(", MTU (0x%x)",ntohl(icmp_2->MTU));
+ tprintf(" Payload include as much of invoking packet");
+
+ return 1;
+}
+
+static const char *icmpv6_type_3_codes[] = {
+ "Hop limit exceeded in transit",
+ "Fragment reassembly time exceeded",
+};
+
+static int8_t dissect_icmpv6_type3(struct pkt_buff *pkt)
+{
+ struct icmpv6_type_1_3 *icmp_3;
+
+ icmp_3 = (struct icmpv6_type_1_3 *) pkt_pull(pkt,sizeof(*icmp_3));
+ if (icmp_3 == NULL)
+ return 0;
+
+ tprintf(", Unused (0x%x)",ntohl(icmp_3->unused));
+ tprintf(" Payload include as much of invoking packet");
+
+ return 1;
+}
+
+static const char *icmpv6_type_4_codes[] = {
+ "Erroneous header field encountered",
+ "Unrecognized Next Header type encountered",
+ "Unrecognized IPv6 option encountered",
+};
+
+static int8_t dissect_icmpv6_type4(struct pkt_buff *pkt)
+{
+ struct icmpv6_type_4 *icmp_4;
+
+ icmp_4 = (struct icmpv6_type_4 *) pkt_pull(pkt,sizeof(*icmp_4));
+ if (icmp_4 == NULL)
+ return 0;
+
+ tprintf(", Pointer (0x%x)",ntohl(icmp_4->pointer));
+ tprintf(" Payload include as much of invoking packet");
+
+ return 1;
+}
+
+static int8_t dissect_icmpv6_type128(struct pkt_buff *pkt)
+{
+ struct icmpv6_type_128_129 *icmp_128;
+
+ icmp_128 = (struct icmpv6_type_128_129 *)
+ pkt_pull(pkt,sizeof(*icmp_128));
+ if (icmp_128 == NULL)
+ return 0;
+
+ tprintf(", ID (0x%x)",ntohs(icmp_128->id));
+ tprintf(", Seq. Nr. (%u)",ntohs(icmp_128->sn));
+ tprintf(" Payload include Data");
+
+ return 1;
+}
+
+static int8_t dissect_icmpv6_type129(struct pkt_buff *pkt)
+{
+ struct icmpv6_type_128_129 *icmp_129;
+
+ icmp_129 = (struct icmpv6_type_128_129 *)
+ pkt_pull(pkt,sizeof(*icmp_129));
+ if (icmp_129 == NULL)
+ return 0;
+
+ tprintf(", ID (0x%x)",ntohs(icmp_129->id));
+ tprintf(", Seq. Nr. (%u)",ntohs(icmp_129->sn));
+ tprintf(" Payload include Data");
+
+ return 1;
+}
+
+static int8_t dissect_icmpv6_type130(struct pkt_buff *pkt)
+{
+ char address[INET6_ADDRSTRLEN];
+ uint16_t nr_src, maxrespdel;
+ uint8_t switch_mldv2 = 0;
+ struct icmpv6_type_130_131_132 *icmp_130;
+
+ icmp_130 = (struct icmpv6_type_130_131_132 *)
+ pkt_pull(pkt,sizeof(*icmp_130));
+ if (icmp_130 == NULL)
+ return 0;
+ maxrespdel = ntohs(icmp_130->maxrespdel);
+
+ if(pkt_len(pkt) >= sizeof(struct icmpv6_type_130_mldv2))
+ switch_mldv2 = 1;
+
+ if(switch_mldv2)
+ tprintf(", MLDv2, Max Resp Delay (%ums)", maxrespdel >> 15 ?
+ (((maxrespdel & 0xFFF) | 0x1000) <<
+ (((maxrespdel >> 12) & 0x3) + 3)) : maxrespdel);
+ else
+ tprintf(", Max Resp Delay (%ums)",maxrespdel);
+ tprintf(", Res (0x%x)",ntohs(icmp_130->res));
+ tprintf(", Address: %s",
+ inet_ntop(AF_INET6, &icmp_130->ipv6_addr,
+ address, sizeof(address)));
+
+ if(switch_mldv2) {
+ struct icmpv6_type_130_mldv2 *icmp_130_mldv2;
+
+ icmp_130_mldv2 = (struct icmpv6_type_130_mldv2 *)
+ pkt_pull(pkt,sizeof(*icmp_130_mldv2));
+ if (icmp_130_mldv2 == NULL)
+ return 0;
+
+ nr_src = ntohs(icmp_130_mldv2->nr_src);
+
+ tprintf(", Resv (0x%x)",icmp_130_mldv2->resv_S_QRV >> 4);
+ tprintf(", S (%u)",(icmp_130_mldv2->resv_S_QRV >> 3) & 0x1);
+ tprintf(", QRV (0x%x)",icmp_130_mldv2->resv_S_QRV & 0x3);
+ tprintf(", QQIC (%u)",icmp_130_mldv2->QQIC);
+ tprintf(", Nr Src (%u)",nr_src);
+
+ return print_ipv6_addr_list(pkt, nr_src);
+ }
+
+ return 1;
+}
+
+static int8_t dissect_icmpv6_type131(struct pkt_buff *pkt)
+{
+ char address[INET6_ADDRSTRLEN];
+ struct icmpv6_type_130_131_132 *icmp_131;
+
+ icmp_131 = (struct icmpv6_type_130_131_132 *)
+ pkt_pull(pkt,sizeof(*icmp_131));
+ if (icmp_131 == NULL)
+ return 0;
+
+ tprintf(", Max Resp Delay (%ums)",ntohs(icmp_131->maxrespdel));
+ tprintf(", Res (0x%x)",ntohs(icmp_131->res));
+ tprintf(", Address: %s",
+ inet_ntop(AF_INET6, &icmp_131->ipv6_addr,
+ address, sizeof(address)));
+
+ return 1;
+}
+
+static inline int8_t dissect_icmpv6_type132(struct pkt_buff *pkt)
+{
+ return dissect_icmpv6_type131(pkt);
+}
+
+static int8_t dissect_icmpv6_type133(struct pkt_buff *pkt)
+{
+ struct icmpv6_type_133_141_142 *icmp_133;
+
+ icmp_133 = (struct icmpv6_type_133_141_142 *)
+ pkt_pull(pkt,sizeof(*icmp_133));
+ if (icmp_133 == NULL)
+ return 0;
+
+ tprintf(", Reserved (0x%x)",ntohl(icmp_133->res));
+
+ return dissect_neighb_disc_ops(pkt);
+}
+
+static int8_t dissect_icmpv6_type134(struct pkt_buff *pkt)
+{
+ struct icmpv6_type_134 *icmp_134;
+
+ icmp_134 = (struct icmpv6_type_134 *)
+ pkt_pull(pkt,sizeof(*icmp_134));
+ if (icmp_134 == NULL)
+ return 0;
+
+ tprintf(", Cur Hop Limit (%u)",icmp_134->cur_hop_limit);
+ tprintf(", M (%u) O (%u)",icmp_134->m_o_res >> 7,
+ (icmp_134->m_o_res >> 6) & 0x1);
+ tprintf(", Router Lifetime (%us)",ntohs(icmp_134->router_lifetime));
+ tprintf(", Reachable Time (%ums)",ntohl(icmp_134->reachable_time));
+ tprintf(", Retrans Timer (%ums)",ntohl(icmp_134->retrans_timer));
+
+ return dissect_neighb_disc_ops(pkt);
+}
+
+static int8_t dissect_icmpv6_type135(struct pkt_buff *pkt)
+{
+ char address[INET6_ADDRSTRLEN];
+ struct icmpv6_type_135 *icmp_135;
+
+ icmp_135 = (struct icmpv6_type_135 *)
+ pkt_pull(pkt,sizeof(*icmp_135));
+ if (icmp_135 == NULL)
+ return 0;
+
+ tprintf(", Reserved (0x%x)",ntohl(icmp_135->res));
+ tprintf(", Target Address: %s",
+ inet_ntop(AF_INET6, &icmp_135->ipv6_addr,
+ address, sizeof(address)));
+
+ return dissect_neighb_disc_ops(pkt);
+}
+
+static int8_t dissect_icmpv6_type136(struct pkt_buff *pkt)
+{
+ char address[INET6_ADDRSTRLEN];
+ uint32_t r_s_o_res;
+ struct icmpv6_type_136 *icmp_136;
+
+ icmp_136 = (struct icmpv6_type_136 *)
+ pkt_pull(pkt,sizeof(*icmp_136));
+ if (icmp_136 == NULL)
+ return 0;
+ r_s_o_res = ntohl(icmp_136->r_s_o_res);
+
+ tprintf(", R (%u) S (%u) O (%u) Reserved (0x%x)", r_s_o_res >> 31,
+ (r_s_o_res >> 30) & 0x1, (r_s_o_res >> 29) & 0x1,
+ r_s_o_res & 0x1FFFFFFF);
+ tprintf(", Target Address: %s",
+ inet_ntop(AF_INET6, &icmp_136->ipv6_addr,
+ address, sizeof(address)));
+
+ return dissect_neighb_disc_ops(pkt);
+}
+
+static int8_t dissect_icmpv6_type137(struct pkt_buff *pkt)
+{
+ char address[INET6_ADDRSTRLEN];
+ struct icmpv6_type_137 *icmp_137;
+
+ icmp_137 = (struct icmpv6_type_137 *)
+ pkt_pull(pkt,sizeof(*icmp_137));
+ if (icmp_137 == NULL)
+ return 0;
+
+ tprintf(", Reserved (0x%x)",icmp_137->res);
+ tprintf(", Target Address: %s",
+ inet_ntop(AF_INET6, &icmp_137->ipv6_targ_addr,
+ address, sizeof(address)));
+ tprintf(", Dest Address: %s",
+ inet_ntop(AF_INET6, &icmp_137->ipv6_dest_addr,
+ address, sizeof(address)));
+
+ return dissect_neighb_disc_ops(pkt);
+}
+
+static void dissect_icmpv6_rr_body(struct pkt_buff *pkt)
+{
+ /*
+ * Upgrade Dissector for Message Body
+ * from http://tools.ietf.org/html/rfc2894#section-3.2
+ */
+ if(pkt_len(pkt))
+ tprintf(" Message Body recognized");
+}
+
+static inline char *icmpv6_type_138_codes(uint8_t code) {
+ switch (code) {
+ case 1: return "Router Renumbering Command";
+ case 2: return "Router Renumbering Result";
+ case 255: return "Sequence Number Reset";
+ }
+
+ return NULL;
+};
+
+static int8_t dissect_icmpv6_type138(struct pkt_buff *pkt)
+{
+ struct icmpv6_type_138 *icmp_138;
+
+ icmp_138 = (struct icmpv6_type_138 *)
+ pkt_pull(pkt,sizeof(*icmp_138));
+ if (icmp_138 == NULL)
+ return 0;
+
+ tprintf(", Sequence Nr. (%u)",ntohl(icmp_138->seq_nr));
+ tprintf(", Segment Nr. (%u)",icmp_138->seg_nr);
+ tprintf(", T (%u) R (%u) A (%u) S (%u) P (%u) Res \
+ (0x%x) ",icmp_138->flags >> 7, (icmp_138->flags >> 6) & 1,
+ (icmp_138->flags >> 5) & 1, (icmp_138->flags >> 4) & 1,
+ (icmp_138->flags >> 3) & 1, icmp_138->flags & 7);
+ tprintf(", Max Delay (%ums)", ntohs(icmp_138->maxdelay));
+ tprintf(", Res (0x%x)", ntohl(icmp_138->res));
+
+ dissect_icmpv6_rr_body(pkt);
+
+ return 1;
+}
+
+static void dissect_icmpv6_node_inf_data(struct pkt_buff *pkt)
+{
+ /*
+ * Upgrade Dissector for Data field
+ * http://tools.ietf.org/html/rfc4620#section-4
+ */
+ if(pkt_len(pkt))
+ tprintf(" Data recognized");
+}
+
+static const char *icmpv6_node_inf_qtypes[] = {
+ "NOOP",
+ "unused",
+ "Node Name",
+ "Node Addresses",
+ "IPv4 Addresses ",
+};
+
+static const char *icmpv6_type_139_codes[] = {
+ "Data contains IPv6 Address",
+ "Data contains Name or nothing",
+ "Data contains IPv4 Address",
+};
+
+static int8_t dissect_icmpv6_type139(struct pkt_buff *pkt)
+{
+ const char *qtype_name = "Unknown";
+ uint16_t qtype_nr;
+ struct icmpv6_type_139_140 *icmp_139;
+
+ icmp_139 = (struct icmpv6_type_139_140 *)
+ pkt_pull(pkt,sizeof(*icmp_139));
+ if (icmp_139 == NULL)
+ return 0;
+
+ qtype_nr = ntohs(icmp_139->qtype);
+ if (icmpv6_code_range_valid(qtype_nr, icmpv6_node_inf_qtypes))
+ qtype_name = icmpv6_node_inf_qtypes[qtype_nr];
+
+ tprintf(", Qtype %s (%u)", qtype_name, qtype_nr);
+ tprintf(", Flags (0x%x)", ntohs(icmp_139->flags));
+ tprintf(", Nonce (0x%lx)", ntohll(icmp_139->nonce));
+
+ dissect_icmpv6_node_inf_data(pkt);
+
+ return 1;
+}
+
+static char *icmpv6_type_140_codes[] = {
+ "Successfull reply",
+ "Responder refuses answer",
+ "Qtype is unknown to the Responder",
+};
+
+static inline int8_t dissect_icmpv6_type140(struct pkt_buff *pkt)
+{
+ return dissect_icmpv6_type139(pkt);
+}
+
+static inline int8_t dissect_icmpv6_type141(struct pkt_buff *pkt)
+{
+ return dissect_icmpv6_type133(pkt);
+}
+
+static inline int8_t dissect_icmpv6_type142(struct pkt_buff *pkt)
+{
+ return dissect_icmpv6_type133(pkt);
+}
+
+static int8_t dissect_icmpv6_type143(struct pkt_buff *pkt)
+{
+ uint16_t nr_rec;
+ struct icmpv6_type_143 *icmp_143;
+
+ icmp_143 = (struct icmpv6_type_143 *)
+ pkt_pull(pkt,sizeof(*icmp_143));
+ if (icmp_143 == NULL)
+ return 0;
+ nr_rec = ntohs(icmp_143->nr_rec);
+
+ tprintf(", Res (0x%x)",ntohs(icmp_143->res));
+ tprintf(", Nr. Mcast Addr Records (%u)",nr_rec);
+
+ return dissect_icmpv6_mcast_rec(pkt, nr_rec);
+}
+
+static int8_t dissect_icmpv6_type144(struct pkt_buff *pkt)
+{
+ struct icmpv6_type_144_146 *icmp_144;
+
+ icmp_144 = (struct icmpv6_type_144_146 *)
+ pkt_pull(pkt,sizeof(*icmp_144));
+ if (icmp_144 == NULL)
+ return 0;
+
+ tprintf(", ID (%u)",ntohs(icmp_144->id));
+ tprintf(", Res (0x%x)",ntohs(icmp_144->res));
+
+ return 1;
+}
+
+static int8_t dissect_icmpv6_type145(struct pkt_buff *pkt)
+{
+ struct icmpv6_type_145 *icmp_145;
+
+ icmp_145 = (struct icmpv6_type_145 *)
+ pkt_pull(pkt,sizeof(*icmp_145));
+ if (icmp_145 == NULL)
+ return 0;
+
+ tprintf(", ID (%u)",ntohs(icmp_145->id));
+ tprintf(", Res (0x%x)",ntohs(icmp_145->res));
+
+ return print_ipv6_addr_list(pkt, pkt_len(pkt) /
+ sizeof(struct in6_addr));
+}
+
+static inline int8_t dissect_icmpv6_type146(struct pkt_buff *pkt)
+{
+ return dissect_icmpv6_type144(pkt);
+}
+
+static int8_t dissect_icmpv6_type147(struct pkt_buff *pkt)
+{
+ uint16_t m_o_res;
+ struct icmpv6_type_147 *icmp_147;
+
+ icmp_147 = (struct icmpv6_type_147 *)
+ pkt_pull(pkt,sizeof(*icmp_147));
+ if (icmp_147 == NULL)
+ return 0;
+ m_o_res = ntohs(icmp_147->m_o_res);
+
+ tprintf(", ID (%u)",ntohs(icmp_147->id));
+ tprintf(", M (%u) O (%u) Res (0x%x)",m_o_res >> 15,
+ (m_o_res >> 14) & 1, m_o_res & 0x3FFF);
+
+ return dissect_neighb_disc_ops(pkt);
+}
+
+static int8_t dissect_icmpv6_type148(struct pkt_buff *pkt)
+{
+ struct icmpv6_type_148 *icmp_148;
+
+ icmp_148 = (struct icmpv6_type_148 *)
+ pkt_pull(pkt,sizeof(*icmp_148));
+ if (icmp_148 == NULL)
+ return 0;
+
+ tprintf(", ID (%u)",ntohs(icmp_148->id));
+ tprintf(", Component (%u)",ntohs(icmp_148->comp));
+
+ return dissect_neighb_disc_ops(pkt);
+}
+
+static int8_t dissect_icmpv6_type149(struct pkt_buff *pkt)
+{
+ struct icmpv6_type_149 *icmp_149;
+
+ icmp_149 = (struct icmpv6_type_149 *)
+ pkt_pull(pkt,sizeof(*icmp_149));
+ if (icmp_149 == NULL)
+ return 0;
+
+ tprintf(", ID (%u)",ntohs(icmp_149->id));
+ tprintf(", All Components (%u)",ntohs(icmp_149->all_comp));
+ tprintf(", Component (%u)",ntohs(icmp_149->comp));
+ tprintf(", Res (0x%x)",ntohs(icmp_149->res));
+
+ return dissect_neighb_disc_ops(pkt);
+}
+
+static int8_t dissect_icmpv6_type150(struct pkt_buff *pkt)
+{
+ struct icmpv6_type_150 *icmp_150;
+
+ icmp_150 = (struct icmpv6_type_150 *)
+ pkt_pull(pkt,sizeof(*icmp_150));
+ if (icmp_150 == NULL)
+ return 0;
+
+ tprintf(", Subtype (%u)",icmp_150->subtype);
+ tprintf(", Res (0x%x)",icmp_150->res);
+ tprintf(", Options in Payload");
+
+ return 1;
+}
+
+static int8_t dissect_icmpv6_type151(struct pkt_buff *pkt)
+{
+ struct icmpv6_type_151 *icmp_151;
+
+ icmp_151 = (struct icmpv6_type_151 *)
+ pkt_pull(pkt,sizeof(*icmp_151));
+ if (icmp_151 == NULL)
+ return 0;
+
+ tprintf(", Query Interval (%us)",ntohs(icmp_151->query_intv));
+ tprintf(", Robustness Variable (%u)",ntohs(icmp_151->rob_var));
+
+ return 1;
+}
+
+static int8_t dissect_icmpv6_type152(struct pkt_buff *pkt)
+{
+ struct icmpv6_type_152 *icmp_152;
+
+ icmp_152 = (struct icmpv6_type_152 *)
+ pkt_pull(pkt,sizeof(*icmp_152));
+ if (icmp_152 == NULL)
+ return 0;
+
+ return 1;
+}
+
+static int8_t dissect_icmpv6_type153(struct pkt_buff *pkt)
+{
+ struct icmpv6_type_153 *icmp_153;
+
+ icmp_153 = (struct icmpv6_type_153 *)
+ pkt_pull(pkt,sizeof(*icmp_153));
+ if (icmp_153 == NULL)
+ return 0;
+
+ return 1;
+}
+
+static int8_t dissect_icmpv6_type154(struct pkt_buff *pkt)
+{
+ struct icmpv6_type_154 *icmp_154;
+
+ icmp_154 = (struct icmpv6_type_154 *)
+ pkt_pull(pkt,sizeof(*icmp_154));
+ if (icmp_154 == NULL)
+ return 0;
+
+ tprintf(", Subtype (%u)",icmp_154->subtype);
+ tprintf(", Res (0x%x)",icmp_154->res);
+ tprintf(", ID (%u)",ntohs(icmp_154->id));
+
+ return dissect_neighb_disc_ops(pkt);
+}
+
+static inline char *icmpv6_type_155_codes(uint8_t code) {
+ switch (code) {
+ case 0x00: return "DODAG Information Solicitation";
+ case 0x01: return "DODAG Information Object";
+ case 0x02: return "Destination Advertisement Object";
+ case 0x03: return "Destination Advertisement Object Acknowledgment";
+ case 0x80: return "Secure DODAG Information Solicitation";
+ case 0x81: return "Secure DODAG Information Object";
+ case 0x82: return "Secure Destination Advertisement Object";
+ case 0x83: return "Secure Destination Advertisement Object Acknowledgment";
+ case 0x8A: return "Consistency Check";
+ }
+
+ return NULL;
+};
+
+static void icmpv6_process(struct icmpv6_general_hdr *icmp, const char **type,
+ const char **code, int8_t (**optional)(struct pkt_buff *pkt))
+{
+ *type = "Unknown Type";
+ *code = "Unknown Code";
+
+ switch (icmp->h_type) {
+ case 1:
+ *type = "Destination Unreachable";
+ if (icmpv6_code_range_valid(icmp->h_code, icmpv6_type_1_codes))
+ *code = icmpv6_type_1_codes[icmp->h_code];
+ *optional = dissect_icmpv6_type1;
+ return;
+ case 2:
+ *type = "Packet Too Big";
+ *optional = dissect_icmpv6_type2;
+ return;
+ case 3:
+ *type = "Time Exceeded";
+ if (icmpv6_code_range_valid(icmp->h_code, icmpv6_type_3_codes))
+ *code = icmpv6_type_3_codes[icmp->h_code];
+ *optional = dissect_icmpv6_type3;
+ return;
+ case 4:
+ *type = "Parameter Problem";
+ if (icmpv6_code_range_valid(icmp->h_code, icmpv6_type_4_codes))
+ *code = icmpv6_type_4_codes[icmp->h_code];
+ *optional = dissect_icmpv6_type4;
+ return;
+ case 100:
+ *type = "Private experimation";
+ return;
+ case 101:
+ *type = "Private experimation";
+ return;
+ case 127:
+ *type = "Reserved for expansion of ICMPv6 error messages";
+ return;
+ case 128:
+ *type = "Echo Request";
+ *optional = dissect_icmpv6_type128;
+ return;
+ case 129:
+ *type = "Echo Reply";
+ *optional = dissect_icmpv6_type129;
+ return;
+ case 130:
+ *type = "Multicast Listener Query";
+ *optional = dissect_icmpv6_type130;
+ return;
+ case 131:
+ *type = "Multicast Listener Report";
+ *optional = dissect_icmpv6_type131;
+ return;
+ case 132:
+ *type = "Multicast Listener Done";
+ *optional = dissect_icmpv6_type132;
+ return;
+ case 133:
+ *type = "Router Solicitation";
+ *optional = dissect_icmpv6_type133;
+ return;
+ case 134:
+ *type = "Router Advertisement";
+ *optional = dissect_icmpv6_type134;
+ return;
+ case 135:
+ *type = "Neighbor Solicitation";
+ *optional = dissect_icmpv6_type135;
+ return;
+ case 136:
+ *type = "Neighbor Advertisement";
+ *optional = dissect_icmpv6_type136;
+ return;
+ case 137:
+ *type = "Redirect Message";
+ *optional = dissect_icmpv6_type137;
+ return;
+ case 138:
+ *type = "Router Renumbering";
+ if(icmpv6_type_138_codes(icmp->h_code))
+ *code = icmpv6_type_138_codes(icmp->h_code);
+ *optional = dissect_icmpv6_type138;
+ return;
+ case 139:
+ *type = "ICMP Node Information Query";
+ if (icmpv6_code_range_valid(icmp->h_code,
+ icmpv6_type_139_codes))
+ *code = icmpv6_type_139_codes[icmp->h_code];
+ *optional = dissect_icmpv6_type139;
+ return;
+ case 140:
+ *type = "ICMP Node Information Response";
+ if (icmpv6_code_range_valid(icmp->h_code,
+ icmpv6_type_140_codes))
+ *code = icmpv6_type_140_codes[icmp->h_code];
+ *optional = dissect_icmpv6_type140;
+ return;
+ case 141:
+ *type = "Inverse Neighbor Discovery Solicitation Message";
+ *optional = dissect_icmpv6_type141;
+ return;
+ case 142:
+ *type = "Inverse Neighbor Discovery Advertisement Message";
+ *optional = dissect_icmpv6_type142;
+ return;
+ case 143:
+ *type = "Multicast Listener Report v2";
+ *optional = dissect_icmpv6_type143;
+ return;
+ case 144:
+ *type = "Home Agent Address Discovery Request Message";
+ *optional = dissect_icmpv6_type144;
+ return;
+ case 145:
+ *type = "Home Agent Address Discovery Reply Message";
+ *optional = dissect_icmpv6_type145;
+ return;
+ case 146:
+ *type = "Mobile Prefix Solicitation";
+ *optional = dissect_icmpv6_type146;
+ return;
+ case 147:
+ *type = "Mobile Prefix Advertisement";
+ *optional = dissect_icmpv6_type147;
+ return;
+ case 148:
+ *type = "Certification Path Solicitation";
+ *optional = dissect_icmpv6_type148;
+ return;
+ case 149:
+ *type = "Certification Path Advertisement";
+ *optional = dissect_icmpv6_type149;
+ return;
+ case 150:
+ *type = "ICMP messages utilized by experimental mobility "
+ "protocols such as Seamoby";
+ *optional = dissect_icmpv6_type150;
+ return;
+ case 151:
+ *type = "Multicast Router Advertisement";
+ *code = "Ad. Interval";
+ *optional = dissect_icmpv6_type151;
+ return;
+ case 152:
+ *type = "Multicast Router Solicitation";
+ *code = "Reserved";
+ *optional = dissect_icmpv6_type152;
+ return;
+ case 153:
+ *type = "Multicast Router Termination";
+ *code = "Reserved";
+ *optional = dissect_icmpv6_type153;
+ return;
+ case 154:
+ *type = "FMIPv6 Messages";
+ *optional = dissect_icmpv6_type154;
+ return;
+ case 155:
+ *type = "RPL Control Message";
+ if(icmpv6_type_155_codes(icmp->h_code))
+ *code = icmpv6_type_155_codes(icmp->h_code);
+ return;
+ case 200:
+ *type = "Private experimation";
+ return;
+ case 201:
+ *type = "Private experimation";
+ return;
+ case 255:
+ *type = "Reserved for expansion of ICMPv6 error messages";
+ return;
+ }
+}
+
+static void icmpv6(struct pkt_buff *pkt)
+{
+ const char *type = NULL, *code = NULL;
+ int8_t (*optional)(struct pkt_buff *pkt) = NULL;
+ struct icmpv6_general_hdr *icmp =
+ (struct icmpv6_general_hdr *) pkt_pull(pkt, sizeof(*icmp));
+
+ if (icmp == NULL)
+ return;
+
+ icmpv6_process(icmp, &type, &code, &optional);
+
+ tprintf(" [ ICMPv6 ");
+ tprintf("%s (%u), ", type, icmp->h_type);
+ tprintf("%s (%u), ", code, icmp->h_code);
+ tprintf("Chks (0x%x)", ntohs(icmp->h_chksum));
+ if (optional)
+ if (!((*optional) (pkt)))
+ tprintf("\n%s%s%s", colorize_start_full(black, red),
+ "Failed to dissect Message", colorize_end());
+ tprintf(" ]\n");
+}
+
+static void icmpv6_less(struct pkt_buff *pkt)
+{
+ struct icmpv6_general_hdr *icmp =
+ (struct icmpv6_general_hdr *) pkt_pull(pkt, sizeof(*icmp));
+
+ if (icmp == NULL)
+ return;
+
+ tprintf(" ICMPv6 Type (%u) Code (%u)", icmp->h_type, icmp->h_code);
+}
+
+struct protocol icmpv6_ops = {
+ .key = 0x3A,
+ .print_full = icmpv6,
+ .print_less = icmpv6_less,
+};
diff --git a/proto_igmp.c b/proto_igmp.c
new file mode 100644
index 0000000..30fb527
--- /dev/null
+++ b/proto_igmp.c
@@ -0,0 +1,560 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright (C) 2012 Christoph Jaeger <christoph@netsniff-ng.org>
+ * Subject to the GPL, version 2.
+ */
+
+#include <arpa/inet.h>
+#include <asm/byteorder.h>
+#include <netinet/in.h>
+
+#include "proto.h"
+#include "protos.h"
+#include "csum.h"
+#include "dissector_eth.h"
+#include "built_in.h"
+#include "pkt_buff.h"
+
+/* IGMPv0 (RFC-988) */
+struct igmp_v0_msg {
+ uint8_t type;
+ uint8_t code;
+ uint16_t checksum;
+ uint32_t identifier;
+ uint32_t group_address;
+ uint64_t access_key;
+} __packed;
+
+/* igmp_v0_msg.type */
+#define IGMP_V0_CREATE_GROUP_REQUEST 0x01
+#define IGMP_V0_CREATE_GROUP_REPLY 0x02
+#define IGMP_V0_JOIN_GROUP_REQUEST 0x03
+#define IGMP_V0_JOIN_GROUP_REPLY 0x04
+#define IGMP_V0_LEAVE_GROUP_REQUEST 0x05
+#define IGMP_V0_LEAVE_GROUP_REPLY 0x06
+#define IGMP_V0_CONFIRM_GROUP_REQUEST 0x07
+#define IGMP_V0_CONFIRM_GROUP_REPLY 0x08
+
+/* IGMPv1 (RFC-1054/RFC-1112, obsoletes RFC-988) */
+struct igmp_v1_msg {
+ union {
+ uint8_t version__type;
+ struct {
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+ uint8_t type :4,
+ version :4;
+#elif defined(__BIG_ENDIAN_BITFIELD)
+ uint8_t version :4,
+ type :4;
+#else
+# error "Please fix <asm/byteorder.h>"
+#endif
+ };
+ };
+ uint8_t unused; /* always zero */
+ uint16_t checksum;
+ uint32_t group_address;
+} __attribute__((packed));
+
+/* igmp_v1_msg.version__type (!) */
+/* IGMP_V1_MEMBERSHIP_QUERY 0x11 */
+#define IGMP_V1_MEMBERSHIP_REPORT 0x12
+
+/* IGMPv2 (RFC-2236) */
+struct igmp_v2_msg {
+ uint8_t type;
+ uint8_t max_resp_time;
+ uint16_t checksum;
+ uint32_t group_address;
+} __attribute__((packed));
+
+/* igmp_v2_msg.type */
+/* IGMP_V2_MEMBERSHIP_QUERY 0x11 */
+#define IGMP_V2_MEMBERSHIP_REPORT 0x16
+#define IGMP_V2_LEAVE_GROUP 0x17
+
+/*
+ * RGMP (RFC-3488)
+ * The RGMP message format resembles the IGMPv2 message format. All RGMP
+ * messages are sent with TTL 1, to destination address 224.0.0.25.
+ */
+#define RGMP_LEAVE_GROUP 0xFC
+#define RGMP_JOIN_GROUP 0xFD
+#define RGMP_BYE 0xFE
+#define RGMP_HELLO 0xFF
+
+/* IGMPv3 (RFC-3376) */
+struct igmp_v3_group_record {
+ uint8_t record_type;
+ uint8_t aux_data_len; /* always zero */
+ uint16_t number_of_sources;
+ uint32_t multicast_address;
+ uint32_t source_addresses[0];
+ /* auxiliary data (IGMPv3 does not define any) */
+} __attribute__((packed));
+
+/* igmp_v3_group_record.record_type */
+#define IGMP_V3_MODE_IS_INCLUDE 1
+#define IGMP_V3_MODE_IS_EXCLUDE 2
+#define IGMP_V3_CHANGE_TO_INCLUDE_MODE 3
+#define IGMP_V3_CHANGE_TO_EXCLUDE_MODE 4
+#define IGMP_V3_ALLOW_NEW_SOURCES 5
+#define IGMP_V3_BLOCK_OLD_SOURCES 6
+
+struct igmp_v3_membership_report {
+ uint8_t type;
+ uint8_t reserved1;
+ uint16_t checksum;
+ uint16_t reserved2;
+ uint16_t number_of_group_records;
+ struct igmp_v3_group_record group_records[0];
+} __attribute__((packed));
+
+struct igmp_v3_membership_query {
+ uint8_t type;
+ uint8_t max_resp_code;
+ uint16_t checksum;
+ uint32_t group_address;
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+ uint8_t qrv :3,
+ s_flag :1,
+ :4;
+#elif defined(__BIG_ENDIAN_BITFIELD)
+ uint8_t :4,
+ s_flag :1,
+ qrv :3;
+#else
+# error "Please fix <asm/byteorder.h>"
+#endif
+ uint8_t qqic;
+ uint16_t number_of_sources;
+ uint32_t source_addresses[0];
+} __attribute__((packed));
+
+#define IGMP_MEMBERSHIP_QUERY 0x11 /* v1/v2/v3 */
+#define IGMP_V3_MEMBERSHIP_REPORT 0x22
+
+#define EXP(x) (((x) & 0x70) >> 4)
+#define MANT(x) ((x) & 0x0F)
+
+#define DECODE_MAX_RESP_CODE(x) ((x) < 128 ? (x) : (MANT(x) | 0x10) << (EXP(x) + 3))
+#define DECODE_QQIC(x) ((x) < 128 ? (x) : (MANT(x) | 0x10) << (EXP(x) + 3))
+
+static char *friendly_msg_type_name(uint8_t msg_type)
+{
+ switch (msg_type) {
+ case IGMP_V0_CREATE_GROUP_REQUEST:
+ return "Create Group Request";
+ case IGMP_V0_CREATE_GROUP_REPLY:
+ return "Create Group Reply";
+ case IGMP_V0_JOIN_GROUP_REQUEST:
+ return "Join Group Request";
+ case IGMP_V0_JOIN_GROUP_REPLY:
+ return "Join Group Reply";
+ case IGMP_V0_LEAVE_GROUP_REQUEST:
+ return "Leave Group Request";
+ case IGMP_V0_LEAVE_GROUP_REPLY:
+ return "Leave Group Reply";
+ case IGMP_V0_CONFIRM_GROUP_REQUEST:
+ return "Confirm Group Request";
+ case IGMP_V0_CONFIRM_GROUP_REPLY:
+ return "Confirm Group Reply";
+ case IGMP_MEMBERSHIP_QUERY:
+ return "Membership Query";
+ case IGMP_V1_MEMBERSHIP_REPORT:
+ case IGMP_V2_MEMBERSHIP_REPORT:
+ case IGMP_V3_MEMBERSHIP_REPORT:
+ return "Membership Report";
+ case IGMP_V2_LEAVE_GROUP:
+ return "Leave Group";
+ case RGMP_HELLO:
+ return "Hello";
+ case RGMP_BYE:
+ return "Bye";
+ case RGMP_JOIN_GROUP:
+ return "Join Group";
+ case RGMP_LEAVE_GROUP:
+ return "Leave Group";
+ default:
+ return NULL;
+ }
+}
+
+#define PRINT_FRIENDLY_NAMED_MSG_TYPE(type) \
+ do { \
+ if (friendly_msg_type_name(type)) \
+ tprintf(" Type (0x%.2x, %s)", type, \
+ friendly_msg_type_name(type)); \
+ else \
+ tprintf(" Type (0x%.2x)", type); \
+ } while (0)
+
+static char *friendly_group_rec_type_name(uint8_t rec_type)
+{
+ switch (rec_type) {
+ case IGMP_V3_MODE_IS_INCLUDE:
+ return "Mode Is Include";
+ case IGMP_V3_MODE_IS_EXCLUDE:
+ return "Mode Is Exclude";
+ case IGMP_V3_CHANGE_TO_INCLUDE_MODE:
+ return "Change To Include Mode";
+ case IGMP_V3_CHANGE_TO_EXCLUDE_MODE:
+ return "Change To Exclude Mode";
+ case IGMP_V3_ALLOW_NEW_SOURCES:
+ return "Allow New Sources";
+ case IGMP_V3_BLOCK_OLD_SOURCES:
+ return "Block Old Sources";
+ default:
+ return NULL;
+ }
+}
+
+static void dissect_igmp_v0(struct pkt_buff *pkt)
+{
+ char addr[INET_ADDRSTRLEN];
+ uint16_t csum;
+
+ static const char *reply_codes[] = {
+ "Request Granted",
+ "Request Denied, No Resources",
+ "Request Denied, Invalid Code",
+ "Request Denied, Invalid Group Address",
+ "Request Denied, Invalid Access Key"
+ };
+
+ struct igmp_v0_msg *msg =
+ (struct igmp_v0_msg *) pkt_pull(pkt, sizeof(*msg));
+
+ if (msg == NULL)
+ return;
+
+ tprintf(" [ IGMPv0");
+ PRINT_FRIENDLY_NAMED_MSG_TYPE(msg->type);
+
+ switch (msg->type) {
+ case IGMP_V0_CREATE_GROUP_REQUEST:
+ switch (msg->code) {
+ case 0:
+ tprintf(", Code (%u, %s)", msg->code, "Public");
+ break;
+ case 1:
+ tprintf(", Code (%u, %s)", msg->code, "Private");
+ break;
+ default:
+ tprintf(", Code (%u)", msg->code);
+ }
+ break;
+ case IGMP_V0_CREATE_GROUP_REPLY:
+ case IGMP_V0_JOIN_GROUP_REPLY:
+ case IGMP_V0_LEAVE_GROUP_REPLY:
+ case IGMP_V0_CONFIRM_GROUP_REPLY:
+ if (msg->code < 5)
+ tprintf(", Code (%u, %s)", msg->code, reply_codes[msg->code]);
+ else
+ tprintf(", Code (%u, Request Pending, Retry In %u Seconds)",
+ msg->code, msg->code);
+ break;
+ default:
+ tprintf(", Code (%u)", msg->code);
+ }
+
+ csum = calc_csum(msg, sizeof(*msg) + pkt_len(pkt), 0);
+ tprintf(", CSum (0x%.4x) is %s", ntohs(msg->checksum), csum ?
+ colorize_start_full(black, red) "bogus (!)" colorize_end() : "ok");
+ if (csum)
+ tprintf(" - %s should be %x%s", colorize_start_full(black, red),
+ csum_expected(msg->checksum, csum), colorize_end());
+ tprintf(", Id (%u)", ntohs(msg->identifier));
+ inet_ntop(AF_INET, &msg->group_address, addr, sizeof(addr));
+ tprintf(", Group Addr (%s)", addr);
+ tprintf(", Access Key (0x%.16lx)", msg->access_key);
+ tprintf(" ]\n");
+}
+
+static void dissect_igmp_v1(struct pkt_buff *pkt)
+{
+ char addr[INET_ADDRSTRLEN];
+ uint16_t csum;
+
+ struct igmp_v1_msg *msg =
+ (struct igmp_v1_msg *) pkt_pull(pkt, sizeof(*msg));
+
+ if (msg == NULL)
+ return;
+
+ tprintf(" [ IGMPv1");
+ PRINT_FRIENDLY_NAMED_MSG_TYPE(msg->version__type);
+ csum = calc_csum(msg, sizeof(*msg) + pkt_len(pkt), 0);
+ tprintf(", CSum (0x%.4x) is %s", ntohs(msg->checksum), csum ?
+ colorize_start_full(black, red) "bogus (!)" colorize_end() : "ok");
+ if (csum)
+ tprintf(" - %s should be %x%s", colorize_start_full(black, red),
+ csum_expected(msg->checksum, csum), colorize_end());
+ inet_ntop(AF_INET, &msg->group_address, addr, sizeof(addr));
+ tprintf(", Group Addr (%s)", addr);
+ tprintf(" ]\n");
+}
+
+static void dissect_igmp_v2(struct pkt_buff *pkt)
+{
+ char addr[INET_ADDRSTRLEN];
+ uint16_t csum;
+
+ struct igmp_v2_msg *msg =
+ (struct igmp_v2_msg *) pkt_pull(pkt, sizeof(*msg));
+
+ if (msg == NULL)
+ return;
+
+ switch (msg->type) {
+ case RGMP_HELLO:
+ case RGMP_BYE:
+ case RGMP_JOIN_GROUP:
+ case RGMP_LEAVE_GROUP:
+ tprintf(" [ IGMPv2 (RGMP)");
+ break;
+ default:
+ tprintf(" [ IGMPv2");
+ break;
+ }
+
+ PRINT_FRIENDLY_NAMED_MSG_TYPE(msg->type);
+ tprintf(", Max Resp Time (%u)", msg->max_resp_time);
+ csum = calc_csum(msg, sizeof(*msg) + pkt_len(pkt), 0);
+ tprintf(", CSum (0x%.4x) is %s", ntohs(msg->checksum), csum ?
+ colorize_start_full(black, red) "bogus (!)" colorize_end() : "ok");
+ if (csum)
+ tprintf(" - %s should be %x%s", colorize_start_full(black, red),
+ csum_expected(msg->checksum, csum), colorize_end());
+ inet_ntop(AF_INET, &msg->group_address, addr, sizeof(addr));
+ tprintf(", Group Addr (%s)", addr);
+ tprintf(" ]\n");
+}
+
+static void dissect_igmp_v3_membership_query(struct pkt_buff *pkt)
+{
+ char addr[INET_ADDRSTRLEN];
+ size_t n;
+ uint16_t csum;
+ uint32_t *src_addr;
+
+ struct igmp_v3_membership_query *msg =
+ (struct igmp_v3_membership_query *) pkt_pull(pkt, sizeof(*msg));
+
+ if (msg == NULL)
+ return;
+
+ tprintf(" [ IGMPv3");
+ PRINT_FRIENDLY_NAMED_MSG_TYPE(msg->type);
+ tprintf(", Max Resp Code (0x%.2x => %u)", msg->max_resp_code,
+ DECODE_MAX_RESP_CODE(msg->max_resp_code));
+ csum = calc_csum(msg, sizeof(*msg) + pkt_len(pkt), 0);
+ tprintf(", CSum (0x%.4x) is %s", ntohs(msg->checksum), csum ?
+ colorize_start_full(black, red) "bogus (!)" colorize_end() : "ok");
+ if (csum)
+ tprintf(" - %s should be %x%s", colorize_start_full(black, red),
+ csum_expected(msg->checksum, csum), colorize_end());
+ inet_ntop(AF_INET, &msg->group_address, addr, sizeof(addr));
+ /* S Flag (Suppress Router-Side Processing) */
+ tprintf(", Suppress (%u)", msg->s_flag ? 1 : 0);
+ /* QRV (Querier's Robustness Variable) */
+ tprintf(", QRV (%u)", msg->qrv);
+ /* QQIC (Querier's Query Interval Code) */
+ tprintf(", QQIC (0x%.2x => %u)", msg->qqic, DECODE_QQIC(msg->qqic));
+ tprintf(", Group Addr (%s)", addr);
+ n = ntohs(msg->number_of_sources);
+ tprintf(", Num Src (%zu)", n);
+
+ if (n--) {
+ src_addr = (uint32_t *) pkt_pull(pkt, sizeof(*src_addr));
+ if (src_addr != NULL) {
+ inet_ntop(AF_INET, src_addr, addr, sizeof(addr));
+ tprintf(", Src Addr (%s", addr);
+ while (n--) {
+ src_addr = (uint32_t *)
+ pkt_pull(pkt, sizeof(*src_addr));
+ if (src_addr != NULL)
+ break;
+ inet_ntop(AF_INET, src_addr, addr, sizeof(addr));
+ tprintf(", %s", addr);
+ }
+ tprintf(")");
+ }
+ }
+ tprintf(" ]\n");
+}
+
+static void dissect_igmp_v3_membership_report(struct pkt_buff *pkt)
+{
+ char addr[INET_ADDRSTRLEN];
+ size_t m, n;
+ uint16_t csum;
+ uint32_t *src_addr;
+
+ struct igmp_v3_group_record *rec;
+ struct igmp_v3_membership_report *msg =
+ (struct igmp_v3_membership_report *) pkt_pull(pkt, sizeof(*msg));
+
+ if (msg == NULL)
+ return;
+
+ tprintf(" [ IGMPv3");
+ PRINT_FRIENDLY_NAMED_MSG_TYPE(msg->type);
+ csum = calc_csum(msg, sizeof(*msg) + pkt_len(pkt), 0);
+ tprintf(", CSum (0x%.4x) is %s", ntohs(msg->checksum), csum ?
+ colorize_start_full(black, red) "bogus (!)" colorize_end() : "ok");
+ if (csum)
+ tprintf(" - %s should be %x%s", colorize_start_full(black, red),
+ csum_expected(msg->checksum, csum), colorize_end());
+ m = ntohs(msg->number_of_group_records);
+ tprintf(", Num Group Rec (%zu)", m);
+ tprintf(" ]\n");
+
+ while (m--) {
+ rec = (struct igmp_v3_group_record *) pkt_pull(pkt, sizeof(*rec));
+
+ if (rec == NULL)
+ break;
+
+ tprintf(" [ Group Record");
+ if (friendly_group_rec_type_name(rec->record_type))
+ tprintf(" Type (%u, %s)", rec->record_type,
+ friendly_group_rec_type_name(rec->record_type));
+ else
+ tprintf(" Type (%u)", rec->record_type);
+ n = ntohs(rec->number_of_sources);
+ tprintf(", Num Src (%zu)", n);
+ inet_ntop(AF_INET, &rec->multicast_address, addr, sizeof(addr));
+ tprintf(", Multicast Addr (%s)", addr);
+
+ if (n--) {
+ src_addr = (uint32_t *) pkt_pull(pkt, sizeof(*src_addr));
+ if (src_addr != NULL) {
+ inet_ntop(AF_INET, src_addr, addr, sizeof(addr));
+ tprintf(", Src Addr (%s", addr);
+ while (n--) {
+ src_addr = (uint32_t *)
+ pkt_pull(pkt, sizeof(*src_addr));
+ if (src_addr != NULL)
+ break;
+ inet_ntop(AF_INET, src_addr, addr, sizeof(addr));
+ tprintf(", %s", addr);
+ }
+ tprintf(")");
+ }
+ }
+
+ tprintf(" ]\n");
+ }
+ tprintf("\n");
+}
+
+static void igmp(struct pkt_buff *pkt)
+{
+ switch (*pkt_peek(pkt)) {
+ case IGMP_V0_CREATE_GROUP_REQUEST:
+ case IGMP_V0_CREATE_GROUP_REPLY:
+ case IGMP_V0_JOIN_GROUP_REQUEST:
+ case IGMP_V0_JOIN_GROUP_REPLY:
+ case IGMP_V0_LEAVE_GROUP_REQUEST:
+ case IGMP_V0_LEAVE_GROUP_REPLY:
+ case IGMP_V0_CONFIRM_GROUP_REQUEST:
+ case IGMP_V0_CONFIRM_GROUP_REPLY:
+ if (pkt_len(pkt) == sizeof(struct igmp_v0_msg))
+ dissect_igmp_v0(pkt);
+ break;
+ case IGMP_MEMBERSHIP_QUERY: /* v1/v2/v3 */
+ if (pkt_len(pkt) >= sizeof(struct igmp_v3_membership_query))
+ dissect_igmp_v3_membership_query(pkt);
+ else if (pkt_len(pkt) == sizeof(struct igmp_v2_msg)
+ && *(pkt_peek(pkt) + 1))
+ dissect_igmp_v2(pkt);
+ else if (pkt_len(pkt) == sizeof(struct igmp_v1_msg))
+ dissect_igmp_v1(pkt);
+ break;
+ case IGMP_V1_MEMBERSHIP_REPORT:
+ if (pkt_len(pkt) == sizeof(struct igmp_v1_msg))
+ dissect_igmp_v1(pkt);
+ break;
+ case RGMP_HELLO:
+ case RGMP_BYE:
+ case RGMP_JOIN_GROUP:
+ case RGMP_LEAVE_GROUP:
+ case IGMP_V2_MEMBERSHIP_REPORT:
+ case IGMP_V2_LEAVE_GROUP:
+ if (pkt_len(pkt) == sizeof(struct igmp_v2_msg))
+ dissect_igmp_v2(pkt);
+ break;
+ case IGMP_V3_MEMBERSHIP_REPORT:
+ if (pkt_len(pkt) >= sizeof(struct igmp_v3_membership_report))
+ dissect_igmp_v3_membership_report(pkt);
+ break;
+ }
+}
+
+static void igmp_less(struct pkt_buff *pkt)
+{
+ int version = -1;
+
+ switch (*pkt_peek(pkt)) {
+ case IGMP_V0_CREATE_GROUP_REQUEST:
+ case IGMP_V0_CREATE_GROUP_REPLY:
+ case IGMP_V0_JOIN_GROUP_REQUEST:
+ case IGMP_V0_JOIN_GROUP_REPLY:
+ case IGMP_V0_LEAVE_GROUP_REQUEST:
+ case IGMP_V0_LEAVE_GROUP_REPLY:
+ case IGMP_V0_CONFIRM_GROUP_REQUEST:
+ case IGMP_V0_CONFIRM_GROUP_REPLY:
+ if (pkt_len(pkt) == sizeof(struct igmp_v0_msg))
+ version = 0;
+ break;
+ case IGMP_MEMBERSHIP_QUERY: /* v1/v2/v3 */
+ if (pkt_len(pkt) >= sizeof(struct igmp_v3_membership_query))
+ version = 3;
+ else if (pkt_len(pkt) == sizeof(struct igmp_v2_msg)
+ && *(pkt_peek(pkt) + 1))
+ version = 2;
+ else if (pkt_len(pkt) == sizeof(struct igmp_v1_msg))
+ version = 1;
+ break;
+ case IGMP_V1_MEMBERSHIP_REPORT:
+ if (pkt_len(pkt) == sizeof(struct igmp_v1_msg))
+ version = 1;
+ break;
+ case RGMP_HELLO:
+ case RGMP_BYE:
+ case RGMP_JOIN_GROUP:
+ case RGMP_LEAVE_GROUP:
+ case IGMP_V2_MEMBERSHIP_REPORT:
+ case IGMP_V2_LEAVE_GROUP:
+ if (pkt_len(pkt) == sizeof(struct igmp_v2_msg))
+ version = 2;
+ break;
+ case IGMP_V3_MEMBERSHIP_REPORT:
+ if (pkt_len(pkt) >= sizeof(struct igmp_v3_membership_report))
+ version = 3;
+ break;
+ }
+
+ if (version < 0 || version > 3)
+ return;
+
+ switch (*pkt_peek(pkt)) {
+ case RGMP_HELLO:
+ case RGMP_BYE:
+ case RGMP_JOIN_GROUP:
+ case RGMP_LEAVE_GROUP:
+ tprintf(" IGMPv2 (RGMP)");
+ break;
+ default:
+ tprintf(" IGMPv%u", version);
+ break;
+ }
+ PRINT_FRIENDLY_NAMED_MSG_TYPE(*pkt_peek(pkt));
+}
+
+struct protocol igmp_ops = {
+ .key = 0x02,
+ .print_full = igmp,
+ .print_less = igmp_less,
+};
diff --git a/proto_ip_authentication_hdr.c b/proto_ip_authentication_hdr.c
new file mode 100644
index 0000000..2d5f57c
--- /dev/null
+++ b/proto_ip_authentication_hdr.c
@@ -0,0 +1,87 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2012 Markus Amend <markus@netsniff-ng.org>, Deutsche Flugsicherung GmbH
+ * Subject to the GPL, version 2.
+ *
+ * IP Authentication Header described in RFC4302
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <netinet/in.h> /* for ntohs() */
+
+#include "proto.h"
+#include "protos.h"
+#include "dissector_eth.h"
+#include "built_in.h"
+#include "pkt_buff.h"
+
+struct auth_hdr {
+ uint8_t h_next_header;
+ uint8_t h_payload_len;
+ uint16_t h_reserved;
+ uint32_t h_spi;
+ uint32_t h_snf;
+} __packed;
+
+static void auth_hdr(struct pkt_buff *pkt)
+{
+ ssize_t hdr_len;
+ size_t i;
+ struct auth_hdr *auth_ops;
+
+ auth_ops = (struct auth_hdr *) pkt_pull(pkt, sizeof(*auth_ops));
+ if (auth_ops == NULL)
+ return;
+
+ hdr_len = (auth_ops->h_payload_len * 4) + 8;
+
+ tprintf(" [ Authentication Header ");
+ tprintf("NextHdr (%u), ", auth_ops->h_next_header);
+ if (hdr_len > pkt_len(pkt) || hdr_len < 0){
+ tprintf("HdrLen (%u, %zd Bytes %s), ",
+ auth_ops->h_payload_len, hdr_len,
+ colorize_start_full(black, red)
+ "invalid" colorize_end());
+ return;
+ }
+ tprintf("HdrLen (%u, %zd Bytes), ",auth_ops->h_payload_len, hdr_len);
+ tprintf("Reserved (0x%x), ", ntohs(auth_ops->h_reserved));
+ /* TODO
+ * Upgrade for Extended (64-bit) Sequence Number
+ * http://tools.ietf.org/html/rfc4302#section-2.5.1
+ */
+ tprintf("SPI (0x%x), ", ntohl(auth_ops->h_spi));
+ tprintf("SNF (0x%x), ", ntohl(auth_ops->h_snf));
+ tprintf("ICV 0x");
+ for (i = sizeof(struct auth_hdr); i < hdr_len; i++)
+ tprintf("%02x", *pkt_pull(pkt, 1));
+ tprintf(" ]\n");
+
+ pkt_set_proto(pkt, &eth_lay3, auth_ops->h_next_header);
+}
+
+static void auth_hdr_less(struct pkt_buff *pkt)
+{
+ ssize_t hdr_len;
+ struct auth_hdr *auth_ops;
+
+ auth_ops = (struct auth_hdr *) pkt_pull(pkt, sizeof(*auth_ops));
+ if (auth_ops == NULL)
+ return;
+
+ hdr_len = (auth_ops->h_payload_len * 4) + 8;
+ if (hdr_len > pkt_len(pkt) || hdr_len < 0)
+ return;
+
+ tprintf(" AH");
+
+ pkt_pull(pkt, hdr_len - sizeof(*auth_ops));
+ pkt_set_proto(pkt, &eth_lay3, auth_ops->h_next_header);
+}
+
+struct protocol ip_auth_ops = {
+ .key = 0x33,
+ .print_full = auth_hdr,
+ .print_less = auth_hdr_less,
+};
diff --git a/proto_ip_esp.c b/proto_ip_esp.c
new file mode 100644
index 0000000..cc4e06e
--- /dev/null
+++ b/proto_ip_esp.c
@@ -0,0 +1,53 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2012 Markus Amend <markus@netsniff-ng.org>, Deutsche Flugsicherung GmbH
+ * Subject to the GPL, version 2.
+ *
+ * Encapsulating Security Payload described in RFC4303
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <netinet/in.h> /* for ntohs() */
+
+#include "proto.h"
+#include "protos.h"
+#include "dissector_eth.h"
+#include "built_in.h"
+#include "pkt_buff.h"
+
+struct esp_hdr {
+ uint32_t h_spi;
+ uint32_t h_sn;
+} __packed;
+
+static void esp(struct pkt_buff *pkt)
+{
+ struct esp_hdr *esp_ops;
+
+ esp_ops = (struct esp_hdr *) pkt_pull(pkt, sizeof(*esp_ops));
+ if (esp_ops == NULL)
+ return;
+
+ tprintf(" [ ESP ");
+ tprintf("SPI (0x%x), ", ntohl(esp_ops->h_spi));
+ tprintf("SN (0x%x)", ntohl(esp_ops->h_sn));
+ tprintf(" ]\n");
+}
+
+static void esp_less(struct pkt_buff *pkt)
+{
+ struct esp_hdr *esp_ops;
+
+ esp_ops = (struct esp_hdr *) pkt_pull(pkt, sizeof(*esp_ops));
+ if (esp_ops == NULL)
+ return;
+
+ tprintf(" ESP");
+}
+
+struct protocol ip_esp_ops = {
+ .key = 0x32,
+ .print_full = esp,
+ .print_less = esp_less,
+};
diff --git a/proto_ipv4.c b/proto_ipv4.c
new file mode 100644
index 0000000..e11098f
--- /dev/null
+++ b/proto_ipv4.c
@@ -0,0 +1,201 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright (C) 2009, 2010 Daniel Borkmann
+ * Copyright (C) 2012 Christoph Jaeger <christoph@netsniff-ng.org>
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <netinet/in.h> /* for ntohs() */
+#include <arpa/inet.h> /* for inet_ntop() */
+
+#include "proto.h"
+#include "protos.h"
+#include "csum.h"
+#include "dissector_eth.h"
+#include "ipv4.h"
+#include "geoip.h"
+#include "pkt_buff.h"
+#include "built_in.h"
+
+#define FRAG_OFF_RESERVED_FLAG(x) ((x) & 0x8000)
+#define FRAG_OFF_NO_FRAGMENT_FLAG(x) ((x) & 0x4000)
+#define FRAG_OFF_MORE_FRAGMENT_FLAG(x) ((x) & 0x2000)
+#define FRAG_OFF_FRAGMENT_OFFSET(x) ((x) & 0x1fff)
+
+/* IP Option Numbers (http://www.iana.org/assignments/ip-parameters) */
+#define IP_OPT_EOOL 0x00
+#define IP_OPT_NOP 0x01
+
+#define IP_OPT_COPIED_FLAG(x) ((x) & 0x80)
+#define IP_OPT_CLASS(x) (((x) & 0x60) >> 5)
+#define IP_OPT_NUMBER(x) ((x) & 0x1F)
+
+static void ipv4(struct pkt_buff *pkt)
+{
+ uint16_t csum, frag_off, h_tot_len;
+ char src_ip[INET_ADDRSTRLEN];
+ char dst_ip[INET_ADDRSTRLEN];
+ struct ipv4hdr *ip = (struct ipv4hdr *) pkt_pull(pkt, sizeof(*ip));
+ uint8_t *opt, *trailer;
+ unsigned int trailer_len = 0;
+ ssize_t opts_len, opt_len;
+ struct sockaddr_in sas, sad;
+ const char *city, *region, *country;
+
+ if (!ip)
+ return;
+
+ frag_off = ntohs(ip->h_frag_off);
+ h_tot_len = ntohs(ip->h_tot_len);
+ csum = calc_csum(ip, ip->h_ihl * 4, 0);
+
+ inet_ntop(AF_INET, &ip->h_saddr, src_ip, sizeof(src_ip));
+ inet_ntop(AF_INET, &ip->h_daddr, dst_ip, sizeof(dst_ip));
+
+ if ((pkt_len(pkt) + sizeof(*ip)) > h_tot_len) {
+ trailer_len = pkt_len(pkt) + sizeof(*ip) - h_tot_len;
+ trailer = pkt->data + h_tot_len + trailer_len;
+ }
+
+ if (trailer_len) {
+ tprintf(" [ Eth trailer ");
+ while (trailer_len--) {
+ tprintf("%x", *(trailer - trailer_len));
+ }
+ tprintf(" ]\n");
+ }
+
+ tprintf(" [ IPv4 ");
+ tprintf("Addr (%s => %s), ", src_ip, dst_ip);
+ tprintf("Proto (%u), ", ip->h_protocol);
+ tprintf("TTL (%u), ", ip->h_ttl);
+ tprintf("TOS (%u), ", ip->h_tos);
+ tprintf("Ver (%u), ", ip->h_version);
+ tprintf("IHL (%u), ", ip->h_ihl);
+ tprintf("Tlen (%u), ", ntohs(ip->h_tot_len));
+ tprintf("ID (%u), ", ntohs(ip->h_id));
+ tprintf("Res (%u), NoFrag (%u), MoreFrag (%u), FragOff (%u), ",
+ FRAG_OFF_RESERVED_FLAG(frag_off) ? 1 : 0,
+ FRAG_OFF_NO_FRAGMENT_FLAG(frag_off) ? 1 : 0,
+ FRAG_OFF_MORE_FRAGMENT_FLAG(frag_off) ? 1 : 0,
+ FRAG_OFF_FRAGMENT_OFFSET(frag_off));
+ tprintf("CSum (0x%.4x) is %s", ntohs(ip->h_check),
+ csum ? colorize_start_full(black, red) "bogus (!)"
+ colorize_end() : "ok");
+ if (csum)
+ tprintf("%s should be 0x%.4x%s", colorize_start_full(black, red),
+ csum_expected(ip->h_check, csum), colorize_end());
+ tprintf(" ]\n");
+
+ memset(&sas, 0, sizeof(sas));
+ sas.sin_family = PF_INET;
+ sas.sin_addr.s_addr = ip->h_saddr;
+
+ memset(&sad, 0, sizeof(sad));
+ sad.sin_family = PF_INET;
+ sad.sin_addr.s_addr = ip->h_daddr;
+
+ if (geoip_working()) {
+ tprintf("\t[ Geo (");
+ if ((country = geoip4_country_name(sas))) {
+ tprintf("%s", country);
+ if ((region = geoip4_region_name(sas)))
+ tprintf(" / %s", region);
+ if ((city = geoip4_city_name(sas)))
+ tprintf(" / %s", city);
+ } else {
+ tprintf("local");
+ }
+ tprintf(" => ");
+ if ((country = geoip4_country_name(sad))) {
+ tprintf("%s", country);
+ if ((region = geoip4_region_name(sad)))
+ tprintf(" / %s", region);
+ if ((city = geoip4_city_name(sad)))
+ tprintf(" / %s", city);
+ } else {
+ tprintf("local");
+ }
+ tprintf(") ]\n");
+ }
+
+ opts_len = max((uint8_t) ip->h_ihl, sizeof(*ip) / sizeof(uint32_t)) *
+ sizeof(uint32_t) - sizeof(*ip);
+
+ for (opt = pkt_pull(pkt, opts_len); opt && opts_len > 0; opt++) {
+ tprintf(" [ Option Copied (%u), Class (%u), Number (%u)",
+ IP_OPT_COPIED_FLAG(*opt) ? 1 : 0, IP_OPT_CLASS(*opt),
+ IP_OPT_NUMBER(*opt));
+
+ switch (*opt) {
+ case IP_OPT_EOOL:
+ case IP_OPT_NOP:
+ tprintf(" ]\n");
+ opts_len--;
+ break;
+ default:
+ /*
+ * Assuming that EOOL and NOP are the only single-byte
+ * options, treat all other options as variable in
+ * length with a minimum of 2.
+ *
+ * TODO: option length might be incorrect in malformed packets,
+ * check and handle that
+ */
+ opt_len = *(++opt);
+ if (opt_len > opts_len) {
+ tprintf(", Len (%zd, invalid) ]\n", opt_len);
+ goto out;
+ } else
+ tprintf(", Len (%zd) ]\n", opt_len);
+ opts_len -= opt_len;
+ tprintf(" [ Data hex ");
+ for (opt_len -= 2; opt_len > 0; opt_len--)
+ tprintf(" %.2x", *(++opt));
+ tprintf(" ]\n");
+ break;
+ }
+ }
+out:
+ /* cut off everything that is not part of IPv4 payload */
+ /* XXX there could still be an Ethernet trailer included or others */
+
+ pkt_trim(pkt, pkt_len(pkt) - min(pkt_len(pkt),
+ (ntohs(ip->h_tot_len) - ip->h_ihl * sizeof(uint32_t))));
+
+ pkt_set_proto(pkt, &eth_lay3, ip->h_protocol);
+}
+
+static void ipv4_less(struct pkt_buff *pkt)
+{
+ char src_ip[INET_ADDRSTRLEN];
+ char dst_ip[INET_ADDRSTRLEN];
+ struct ipv4hdr *ip = (struct ipv4hdr *) pkt_pull(pkt, sizeof(*ip));
+
+ if (!ip)
+ return;
+
+ inet_ntop(AF_INET, &ip->h_saddr, src_ip, sizeof(src_ip));
+ inet_ntop(AF_INET, &ip->h_daddr, dst_ip, sizeof(dst_ip));
+
+ tprintf(" %s/%s Len %u", src_ip, dst_ip,
+ ntohs(ip->h_tot_len));
+
+ /* cut off IP options and everything that is not part of IPv4 payload */
+ pkt_pull(pkt, max((uint8_t) ip->h_ihl, sizeof(*ip) / sizeof(uint32_t))
+ * sizeof(uint32_t) - sizeof(*ip));
+ /* XXX there coul still be an Ethernet trailer included or others */
+#if 0
+ pkt_trim(pkt, pkt_len(pkt) - min(pkt_len(pkt),
+ (ntohs(ip->h_tot_len) - ip->h_ihl * sizeof(uint32_t))));
+#endif
+ pkt_set_proto(pkt, &eth_lay3, ip->h_protocol);
+}
+
+struct protocol ipv4_ops = {
+ .key = 0x0800,
+ .print_full = ipv4,
+ .print_less = ipv4_less,
+};
diff --git a/proto_ipv6.c b/proto_ipv6.c
new file mode 100644
index 0000000..23cf6c4
--- /dev/null
+++ b/proto_ipv6.c
@@ -0,0 +1,112 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Copyright 2010 Emmanuel Roullit.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <netinet/in.h> /* for ntohs() */
+#include <arpa/inet.h> /* for inet_ntop() */
+
+#include "proto.h"
+#include "protos.h"
+#include "csum.h"
+#include "dissector_eth.h"
+#include "ipv6.h"
+#include "geoip.h"
+#include "pkt_buff.h"
+
+extern void ipv6(struct pkt_buff *pkt);
+extern void ipv6_less(struct pkt_buff *pkt);
+
+void ipv6(struct pkt_buff *pkt)
+{
+ uint8_t traffic_class;
+ uint32_t flow_label;
+ char src_ip[INET6_ADDRSTRLEN];
+ char dst_ip[INET6_ADDRSTRLEN];
+ struct ipv6hdr *ip = (struct ipv6hdr *) pkt_pull(pkt, sizeof(*ip));
+ struct sockaddr_in6 sas, sad;
+ const char *city, *region, *country;
+
+ if (ip == NULL)
+ return;
+
+ traffic_class = (ip->priority << 4) |
+ ((ip->flow_lbl[0] & 0xF0) >> 4);
+ flow_label = ((ip->flow_lbl[0] & 0x0F) << 8) |
+ (ip->flow_lbl[1] << 4) | ip->flow_lbl[2];
+
+ inet_ntop(AF_INET6, &ip->saddr, src_ip, sizeof(src_ip));
+ inet_ntop(AF_INET6, &ip->daddr, dst_ip, sizeof(dst_ip));
+
+ tprintf(" [ IPv6 ");
+ tprintf("Addr (%s => %s), ", src_ip, dst_ip);
+ tprintf("Version (%u), ", ip->version);
+ tprintf("TrafficClass (%u), ", traffic_class);
+ tprintf("FlowLabel (%u), ", flow_label);
+ tprintf("Len (%u), ", ntohs(ip->payload_len));
+ tprintf("NextHdr (%u), ", ip->nexthdr);
+ tprintf("HopLimit (%u)", ip->hop_limit);
+ tprintf(" ]\n");
+
+ memset(&sas, 0, sizeof(sas));
+ sas.sin6_family = PF_INET6;
+ memcpy(&sas.sin6_addr, &ip->saddr, sizeof(ip->saddr));
+
+ memset(&sad, 0, sizeof(sad));
+ sad.sin6_family = PF_INET6;
+ memcpy(&sad.sin6_addr, &ip->daddr, sizeof(ip->daddr));
+
+ if (geoip_working()) {
+ tprintf("\t[ Geo (");
+ if ((country = geoip6_country_name(sas))) {
+ tprintf("%s", country);
+ if ((region = geoip6_region_name(sas)))
+ tprintf(" / %s", region);
+ if ((city = geoip6_city_name(sas)))
+ tprintf(" / %s", city);
+ } else {
+ tprintf("local");
+ }
+ tprintf(" => ");
+ if ((country = geoip6_country_name(sad))) {
+ tprintf("%s", country);
+ if ((region = geoip6_region_name(sad)))
+ tprintf(" / %s", region);
+ if ((city = geoip6_city_name(sad)))
+ tprintf(" / %s", city);
+ } else {
+ tprintf("local");
+ }
+ tprintf(") ]\n");
+ }
+
+ pkt_set_proto(pkt, &eth_lay3, ip->nexthdr);
+}
+
+void ipv6_less(struct pkt_buff *pkt)
+{
+ char src_ip[INET6_ADDRSTRLEN];
+ char dst_ip[INET6_ADDRSTRLEN];
+ struct ipv6hdr *ip = (struct ipv6hdr *) pkt_pull(pkt, sizeof(*ip));
+
+ if (ip == NULL)
+ return;
+
+ inet_ntop(AF_INET6, &ip->saddr, src_ip, sizeof(src_ip));
+ inet_ntop(AF_INET6, &ip->daddr, dst_ip, sizeof(dst_ip));
+
+ tprintf(" %s/%s Len %u", src_ip, dst_ip,
+ ntohs(ip->payload_len));
+
+ pkt_set_proto(pkt, &eth_lay3, ip->nexthdr);
+}
+
+struct protocol ipv6_ops = {
+ .key = 0x86DD,
+ .print_full = ipv6,
+ .print_less = ipv6_less,
+};
diff --git a/proto_ipv6_dest_opts.c b/proto_ipv6_dest_opts.c
new file mode 100644
index 0000000..dfdd256
--- /dev/null
+++ b/proto_ipv6_dest_opts.c
@@ -0,0 +1,101 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2012 Markus Amend <markus@netsniff-ng.org>, Deutsche Flugsicherung GmbH
+ * Subject to the GPL, version 2.
+ *
+ * IPv6 Destination Options Header described in RFC2460
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <netinet/in.h> /* for ntohs() */
+
+#include "proto.h"
+#include "protos.h"
+#include "dissector_eth.h"
+#include "built_in.h"
+#include "pkt_buff.h"
+
+struct dest_optshdr {
+ uint8_t h_next_header;
+ uint8_t hdr_len;
+} __packed;
+
+
+static void dissect_opt_dest(struct pkt_buff *pkt, ssize_t *opt_len)
+{
+ /* Have to been upgraded.
+ * http://tools.ietf.org/html/rfc2460#section-4.2
+ * Look also for proto_ipv6_hop_by_hop.h, it needs
+ * dissect_opt(), too.
+ */
+ if (*opt_len)
+ tprintf(", Option(s) recognized ");
+
+ /* If adding dissector reduce opt_len for each using of pkt_pull
+ * to the same size.
+ */
+}
+
+static void dest_opts(struct pkt_buff *pkt)
+{
+ uint16_t hdr_ext_len;
+ ssize_t opt_len;
+ struct dest_optshdr *dest_ops;
+
+ dest_ops = (struct dest_optshdr *) pkt_pull(pkt, sizeof(*dest_ops));
+ if (dest_ops == NULL)
+ return;
+
+ /* Total Header Length in Bytes */
+ hdr_ext_len = (dest_ops->hdr_len + 1) * 8;
+ /* Options length in Bytes */
+ opt_len = hdr_ext_len - sizeof(*dest_ops);
+
+ tprintf("\t [ Destination Options ");
+ tprintf("NextHdr (%u), ", dest_ops->h_next_header);
+ if (opt_len > pkt_len(pkt) || opt_len < 0) {
+ tprintf("HdrExtLen (%u, %u Bytes, %s)", dest_ops->hdr_len,
+ hdr_ext_len, colorize_start_full(black, red)
+ "invalid" colorize_end());
+ return;
+ }
+ tprintf("HdrExtLen (%u, %u Bytes)", dest_ops->hdr_len,
+ hdr_ext_len);
+
+ dissect_opt_dest(pkt, &opt_len);
+
+ tprintf(" ]\n");
+
+ pkt_pull(pkt, opt_len);
+ pkt_set_proto(pkt, &eth_lay3, dest_ops->h_next_header);
+}
+
+static void dest_opts_less(struct pkt_buff *pkt)
+{
+ uint16_t hdr_ext_len;
+ ssize_t opt_len;
+ struct dest_optshdr *dest_ops;
+
+ dest_ops = (struct dest_optshdr *) pkt_pull(pkt, sizeof(*dest_ops));
+ if (dest_ops == NULL)
+ return;
+
+ /* Total Header Length in Bytes */
+ hdr_ext_len = (dest_ops->hdr_len + 1) * 8;
+ /* Options length in Bytes */
+ opt_len = hdr_ext_len - sizeof(*dest_ops);
+ if (opt_len > pkt_len(pkt) || opt_len < 0)
+ return;
+
+ tprintf(" Dest Ops");
+
+ pkt_pull(pkt, opt_len);
+ pkt_set_proto(pkt, &eth_lay3, dest_ops->h_next_header);
+}
+
+struct protocol ipv6_dest_opts_ops = {
+ .key = 0x3C,
+ .print_full = dest_opts,
+ .print_less = dest_opts_less,
+};
diff --git a/proto_ipv6_fragm.c b/proto_ipv6_fragm.c
new file mode 100644
index 0000000..568a897
--- /dev/null
+++ b/proto_ipv6_fragm.c
@@ -0,0 +1,70 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2012 Markus Amend <markus@netsniff-ng.org>, Deutsche Flugsicherung GmbH
+ * Subject to the GPL, version 2.
+ *
+ * IPv6 Fragmentation Header described in RFC2460
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <netinet/in.h> /* for ntohs() */
+
+#include "proto.h"
+#include "protos.h"
+#include "dissector_eth.h"
+#include "built_in.h"
+#include "pkt_buff.h"
+
+struct fragmhdr {
+ uint8_t h_fragm_next_header;
+ uint8_t h_fragm_reserved;
+ uint16_t h_fragm_off_res_M;
+ uint32_t h_fragm_identification;
+} __packed;
+
+static void fragm(struct pkt_buff *pkt)
+{
+ uint16_t off_res_M;
+ struct fragmhdr *fragm_ops;
+
+ fragm_ops = (struct fragmhdr *) pkt_pull(pkt, sizeof(*fragm_ops));
+ if (fragm_ops == NULL)
+ return;
+
+ off_res_M = ntohs(fragm_ops->h_fragm_off_res_M);
+
+ tprintf("\t [ Fragment ");
+ tprintf("NextHdr (%u), ", fragm_ops->h_fragm_next_header);
+ tprintf("Reserved (%u), ", fragm_ops->h_fragm_reserved);
+ tprintf("Offset (%u), ", off_res_M >> 3);
+ tprintf("Res (%u), ", (off_res_M >> 1) & 0x3);
+ tprintf("M flag (%u), ", off_res_M & 0x1);
+ tprintf("Identification (%u)",
+ ntohl(fragm_ops->h_fragm_identification));
+ tprintf(" ]\n");
+
+ pkt_set_proto(pkt, &eth_lay3, fragm_ops->h_fragm_next_header);
+}
+
+static void fragm_less(struct pkt_buff *pkt)
+{
+ uint16_t off_res_M;
+ struct fragmhdr *fragm_ops;
+
+ fragm_ops = (struct fragmhdr *) pkt_pull(pkt, sizeof(*fragm_ops));
+ if (fragm_ops == NULL)
+ return;
+
+ off_res_M = ntohs(fragm_ops->h_fragm_off_res_M);
+
+ tprintf(" FragmOffs %u", off_res_M >> 3);
+
+ pkt_set_proto(pkt, &eth_lay3, fragm_ops->h_fragm_next_header);
+}
+
+struct protocol ipv6_fragm_ops = {
+ .key = 0x2C,
+ .print_full = fragm,
+ .print_less = fragm_less,
+};
diff --git a/proto_ipv6_hop_by_hop.c b/proto_ipv6_hop_by_hop.c
new file mode 100644
index 0000000..b0c5a0d
--- /dev/null
+++ b/proto_ipv6_hop_by_hop.c
@@ -0,0 +1,100 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2012 Markus Amend <markus@netsniff-ng.org>, Deutsche Flugsicherung GmbH
+ * Subject to the GPL, version 2.
+ *
+ * IPv6 Hop-By-Hop Header described in RFC2460
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <netinet/in.h> /* for ntohs() */
+
+#include "proto.h"
+#include "protos.h"
+#include "dissector_eth.h"
+#include "built_in.h"
+#include "pkt_buff.h"
+
+struct hop_by_hophdr {
+ uint8_t h_next_header;
+ uint8_t hdr_len;
+} __packed;
+
+static void dissect_opt_hop (struct pkt_buff *pkt, ssize_t *opt_len)
+{
+ /* Have to been upgraded.
+ * http://tools.ietf.org/html/rfc2460#section-4.2
+ * Look also for proto_ipv6_dest_opts.h, it needs
+ * dissect_opt(), too.
+ */
+ if (*opt_len)
+ tprintf(", Option(s) recognized ");
+
+ /* If adding dissector reduce opt_len for each using of pkt_pull
+ * to the same size.
+ */
+}
+
+static void hop_by_hop(struct pkt_buff *pkt)
+{
+ uint16_t hdr_ext_len;
+ ssize_t opt_len;
+ struct hop_by_hophdr *hop_ops;
+
+ hop_ops = (struct hop_by_hophdr *) pkt_pull(pkt, sizeof(*hop_ops));
+ if (hop_ops == NULL)
+ return;
+
+ /* Total Header Length in Bytes */
+ hdr_ext_len = (hop_ops->hdr_len + 1) * 8;
+ /* Options length in Bytes */
+ opt_len = hdr_ext_len - sizeof(*hop_ops);
+
+ tprintf("\t [ Hop-by-Hop Options ");
+ tprintf("NextHdr (%u), ", hop_ops->h_next_header);
+ if (opt_len > pkt_len(pkt) || opt_len < 0){
+ tprintf("HdrExtLen (%u, %u Bytes, %s)", hop_ops->hdr_len,
+ hdr_ext_len, colorize_start_full(black, red)
+ "invalid" colorize_end());
+ return;
+ }
+ tprintf("HdrExtLen (%u, %u Bytes)", hop_ops->hdr_len,
+ hdr_ext_len);
+
+ dissect_opt_hop(pkt, &opt_len);
+
+ tprintf(" ]\n");
+
+ pkt_pull(pkt, opt_len);
+ pkt_set_proto(pkt, &eth_lay3, hop_ops->h_next_header);
+}
+
+static void hop_by_hop_less(struct pkt_buff *pkt)
+{
+ uint16_t hdr_ext_len;
+ ssize_t opt_len;
+ struct hop_by_hophdr *hop_ops;
+
+ hop_ops = (struct hop_by_hophdr *) pkt_pull(pkt, sizeof(*hop_ops));
+ if (hop_ops == NULL)
+ return;
+
+ /* Total Header Length in Bytes */
+ hdr_ext_len = (hop_ops->hdr_len + 1) * 8;
+ /* Options length in Bytes */
+ opt_len = hdr_ext_len - sizeof(*hop_ops);
+ if (opt_len > pkt_len(pkt) || opt_len < 0)
+ return;
+
+ tprintf(" Hop Ops");
+
+ pkt_pull(pkt, opt_len);
+ pkt_set_proto(pkt, &eth_lay3, hop_ops->h_next_header);
+}
+
+struct protocol ipv6_hop_by_hop_ops = {
+ .key = 0x0,
+ .print_full = hop_by_hop,
+ .print_less = hop_by_hop_less,
+};
diff --git a/proto_ipv6_in_ipv4.c b/proto_ipv6_in_ipv4.c
new file mode 100644
index 0000000..69eaadc
--- /dev/null
+++ b/proto_ipv6_in_ipv4.c
@@ -0,0 +1,25 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2012 Markus Amend <markus@netsniff-ng.org>, Deutsche Flugsicherung GmbH
+ * Subject to the GPL, version 2.
+ *
+ * IPv6 in IPv4 encapsulation described in RFC3056
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <netinet/in.h> /* for ntohs() */
+
+#include "proto.h"
+#include "protos.h"
+#include "dissector_eth.h"
+#include "built_in.h"
+
+extern void ipv6(struct pkt_buff *pkt);
+extern void ipv6_less(struct pkt_buff *pkt);
+
+struct protocol ipv6_in_ipv4_ops = {
+ .key = 0x29,
+ .print_full = ipv6,
+ .print_less = ipv6_less,
+};
diff --git a/proto_ipv6_mobility_hdr.c b/proto_ipv6_mobility_hdr.c
new file mode 100644
index 0000000..549d4f0
--- /dev/null
+++ b/proto_ipv6_mobility_hdr.c
@@ -0,0 +1,311 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2012 Markus Amend <markus@netsniff-ng.org>, Deutsche Flugsicherung GmbH
+ * Subject to the GPL, version 2.
+ *
+ * IPv6 Mobility Header described in RFC6275
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <netinet/in.h> /* for ntohs() */
+#include <arpa/inet.h>
+
+#include "proto.h"
+#include "protos.h"
+#include "dissector_eth.h"
+#include "built_in.h"
+#include "pkt_buff.h"
+
+#define BINDING_REFRESH_REQUEST_MESSAGE 0x00
+#define HOME_TEST_INIT_MESSAGE 0x01
+#define CARE_OF_TEST_INIT_MESSAGE 0x02
+#define HOME_TEST_MESSAGE 0x03
+#define CARE_OF_TEST_MESSAGE 0x04
+#define BINDING_UPDATE_MESSAGE 0x05
+#define BINDING_ACKNOWLEDGEMENT_MESSAGE 0x06
+#define BINDING_ERROR_MESSAGE 0x07
+
+struct mobilityhdr {
+ uint8_t payload_proto;
+ uint8_t hdr_len;
+ uint8_t MH_type;
+ uint8_t reserved;
+ uint16_t chksum;
+ uint8_t msgdata[0];
+} __packed;
+
+struct bin_refr_req_msg {
+ uint16_t reserved;
+ uint8_t mobility_opt[0];
+} __packed;
+
+/* for 0x01 and 0x02 */
+struct tst_init_msg {
+ uint16_t reserved;
+ uint64_t init_cookie;
+ uint8_t mobility_opt[0];
+} __packed;
+
+/* for 0x03 and 0x04 */
+struct tst_msg {
+ uint16_t nonce_index;
+ uint64_t init_cookie;
+ uint64_t keygen_token;
+ uint8_t mobility_opt[0];
+} __packed;
+
+struct bind_upd_msg {
+ uint16_t sequence;
+ uint16_t ahlk_res;
+ uint16_t lifetime;
+ uint8_t mobility_opt[0];
+} __packed;
+
+struct bind_ack_msg {
+ uint8_t status;
+ uint8_t k_res;
+ uint16_t sequence;
+ uint16_t lifetime;
+ uint8_t mobility_opt[0];
+} __packed;
+
+struct bind_err_msg {
+ uint8_t status;
+ uint8_t res;
+ uint64_t home_addr;
+ uint8_t mobility_opt[0];
+} __packed;
+
+
+static void dissect_mobility_options(struct pkt_buff *pkt,
+ ssize_t *message_data_len)
+{
+ /* Have to been upgraded.
+ * http://tools.ietf.org/html/rfc6275#section-6.2.1
+ */
+ if (*message_data_len)
+ tprintf("MH Option(s) recognized ");
+
+ /* If adding dissector reduce message_data_len for each using of
+ * pkt_pull to the same size.
+ */
+}
+
+static void dissect_mobilityhdr_type_0(struct pkt_buff *pkt,
+ ssize_t *message_data_len)
+{
+ struct bin_refr_req_msg *type_0;
+
+ type_0 = (struct bin_refr_req_msg *) pkt_pull(pkt, sizeof(*type_0));
+ *message_data_len -= sizeof(*type_0);
+ if (type_0 == NULL || *message_data_len > pkt_len(pkt) ||
+ *message_data_len < 0)
+ return;
+
+ dissect_mobility_options(pkt, message_data_len);
+}
+
+static void dissect_mobilityhdr_type_1_2(struct pkt_buff *pkt,
+ ssize_t *message_data_len)
+{
+ struct tst_init_msg *type_1_2;
+
+ type_1_2 = (struct tst_init_msg *) pkt_pull(pkt, sizeof(*type_1_2));
+ *message_data_len -= sizeof(*type_1_2);
+ if (type_1_2 == NULL || *message_data_len > pkt_len(pkt) ||
+ *message_data_len < 0)
+ return;
+
+ tprintf("Init Cookie (0x%lx)", ntohll(type_1_2->init_cookie));
+
+ dissect_mobility_options(pkt, message_data_len);
+}
+
+static void dissect_mobilityhdr_type_3_4(struct pkt_buff *pkt,
+ ssize_t *message_data_len)
+{
+ struct tst_msg *type_3_4;
+
+ type_3_4 = (struct tst_msg *) pkt_pull(pkt, sizeof(*type_3_4));
+ *message_data_len -= sizeof(*type_3_4);
+ if (type_3_4 == NULL || *message_data_len > pkt_len(pkt) ||
+ *message_data_len < 0)
+ return;
+
+ tprintf("HN Index (%u) ", ntohs(type_3_4->nonce_index));
+ tprintf("Init Cookie (0x%lx) ", ntohll(type_3_4->init_cookie));
+ tprintf("Keygen Token (0x%lx)", ntohll(type_3_4->keygen_token));
+
+ dissect_mobility_options(pkt, message_data_len);
+}
+
+static void dissect_mobilityhdr_type_5(struct pkt_buff *pkt,
+ ssize_t *message_data_len)
+{
+ struct bind_upd_msg *type_5;
+
+ type_5 = (struct bind_upd_msg *) pkt_pull(pkt, sizeof(*type_5));
+ *message_data_len -= sizeof(*type_5);
+ if (type_5 == NULL || *message_data_len > pkt_len(pkt) ||
+ *message_data_len < 0)
+ return;
+
+ tprintf("Sequence (0x%x) ", ntohs(type_5->sequence));
+ tprintf("A|H|L|K (0x%x) ", ntohs(type_5->ahlk_res) >> 12);
+ tprintf("Lifetime (%us)", ntohs(type_5->lifetime) * 4);
+
+ dissect_mobility_options(pkt, message_data_len);
+}
+
+static void dissect_mobilityhdr_type_6(struct pkt_buff *pkt,
+ ssize_t *message_data_len)
+{
+ struct bind_ack_msg *type_6;
+
+ type_6 = (struct bind_ack_msg *) pkt_pull(pkt, sizeof(*type_6));
+ *message_data_len -= sizeof(*type_6);
+ if (type_6 == NULL || *message_data_len > pkt_len(pkt) ||
+ *message_data_len < 0)
+ return;
+
+ tprintf("Status (0x%x) ", type_6->status);
+ tprintf("K (%u) ", type_6->k_res >> 7);
+ tprintf("Sequence (0x%x)", ntohs(type_6->sequence));
+ tprintf("Lifetime (%us)", ntohs(type_6->lifetime) * 4);
+
+ dissect_mobility_options(pkt, message_data_len);
+}
+
+static void dissect_mobilityhdr_type_7(struct pkt_buff *pkt,
+ ssize_t *message_data_len)
+{
+ char address[INET6_ADDRSTRLEN];
+ uint64_t addr;
+ struct bind_err_msg *type_7;
+
+ type_7 = (struct bind_err_msg *) pkt_pull(pkt, sizeof(*type_7));
+ *message_data_len -= sizeof(*type_7);
+ addr = ntohll(type_7->home_addr);
+ if (type_7 == NULL || *message_data_len > pkt_len(pkt) ||
+ *message_data_len < 0)
+ return;
+
+ tprintf("Status (0x%x) ", type_7->status);
+ tprintf("Home Addr (%s)",
+ inet_ntop(AF_INET6, &addr, address,
+ sizeof(address)));
+
+ dissect_mobility_options(pkt, message_data_len);
+}
+
+static void get_mh_type(struct pkt_buff *pkt, ssize_t *message_data_len,
+ uint8_t *mh_type)
+{
+ switch (*mh_type) {
+ case BINDING_REFRESH_REQUEST_MESSAGE:
+ tprintf("Binding Refresh Request Message ");
+ dissect_mobilityhdr_type_0(pkt, message_data_len);
+ break;
+ case HOME_TEST_INIT_MESSAGE:
+ tprintf("Home Test Init Message ");
+ dissect_mobilityhdr_type_1_2(pkt, message_data_len);
+ break;
+ case CARE_OF_TEST_INIT_MESSAGE:
+ tprintf("Care-of Test Init Message ");
+ dissect_mobilityhdr_type_1_2(pkt, message_data_len);
+ break;
+ case HOME_TEST_MESSAGE:
+ tprintf("Binding Refresh Request Message ");
+ dissect_mobilityhdr_type_3_4(pkt, message_data_len);
+ break;
+ case CARE_OF_TEST_MESSAGE:
+ tprintf("Binding Refresh Request Message ");
+ dissect_mobilityhdr_type_3_4(pkt, message_data_len);
+ break;
+ case BINDING_UPDATE_MESSAGE:
+ tprintf("Binding Refresh Request Message ");
+ dissect_mobilityhdr_type_5(pkt, message_data_len);
+ break;
+ case BINDING_ACKNOWLEDGEMENT_MESSAGE:
+ tprintf("Binding Refresh Request Message ");
+ dissect_mobilityhdr_type_6(pkt, message_data_len);
+ break;
+ case BINDING_ERROR_MESSAGE:
+ tprintf("Binding Refresh Request Message ");
+ dissect_mobilityhdr_type_7(pkt, message_data_len);
+ break;
+ default:
+ tprintf("Type %u is unknown. Error", *mh_type);
+ }
+}
+
+static void mobility(struct pkt_buff *pkt)
+{
+ uint16_t hdr_ext_len;
+ ssize_t message_data_len;
+ struct mobilityhdr *mobility;
+
+ mobility = (struct mobilityhdr *) pkt_pull(pkt, sizeof(*mobility));
+ if (mobility == NULL)
+ return;
+
+ /* Total Header Length in Bytes */
+ hdr_ext_len = (mobility->hdr_len + 1) * 8;
+ /* Total Message Data length in Bytes*/
+ message_data_len = (hdr_ext_len - sizeof(*mobility));
+
+ tprintf("\t [ Mobility ");
+ tprintf("NextHdr (%u), ", mobility->payload_proto);
+ if (message_data_len > pkt_len(pkt) || message_data_len < 0){
+ tprintf("HdrExtLen (%u, %u Bytes %s), ", mobility->hdr_len,
+ hdr_ext_len, colorize_start_full(black, red)
+ "invalid" colorize_end());
+ return;
+ }
+ tprintf("HdrExtLen (%u, %u Bytes), ", mobility->hdr_len,
+ hdr_ext_len);
+ tprintf("MH Type (%u), ", mobility->MH_type);
+ tprintf("Res (0x%x), ", mobility->reserved);
+ tprintf("Chks (0x%x), ", ntohs(mobility->chksum));
+ tprintf("MH Data ");
+
+ get_mh_type(pkt, &message_data_len, &mobility->MH_type);
+
+ tprintf(" ]\n");
+
+ if (message_data_len > pkt_len(pkt) || message_data_len < 0)
+ return;
+
+ pkt_pull(pkt, message_data_len);
+ pkt_set_proto(pkt, &eth_lay3, mobility->payload_proto);
+}
+
+static void mobility_less(struct pkt_buff *pkt)
+{
+ uint16_t hdr_ext_len;
+ ssize_t message_data_len;
+ struct mobilityhdr *mobility;
+
+ mobility = (struct mobilityhdr *) pkt_pull(pkt, sizeof(*mobility));
+ if (mobility == NULL)
+ return;
+
+ /* Total Header Length in Bytes */
+ hdr_ext_len = (mobility->hdr_len + 1) * 8;
+ /* Total Message Data length in Bytes*/
+ message_data_len = (hdr_ext_len - sizeof(*mobility));
+ if (message_data_len > pkt_len(pkt) || message_data_len < 0)
+ return;
+
+ tprintf(" Mobility Type (%u), ", mobility->MH_type);
+
+ pkt_pull(pkt, message_data_len);
+ pkt_set_proto(pkt, &eth_lay3, mobility->payload_proto);
+}
+
+struct protocol ipv6_mobility_ops = {
+ .key = 0x87,
+ .print_full = mobility,
+ .print_less = mobility_less,
+};
diff --git a/proto_ipv6_no_nxt_hdr.c b/proto_ipv6_no_nxt_hdr.c
new file mode 100644
index 0000000..1988422
--- /dev/null
+++ b/proto_ipv6_no_nxt_hdr.c
@@ -0,0 +1,41 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2012 Markus Amend <markus@netsniff-ng.org>, Deutsche Flugsicherung GmbH
+ * Subject to the GPL, version 2.
+ *
+ * IPv6 No Next Header described in RFC2460
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <netinet/in.h> /* for ntohs() */
+
+#include "proto.h"
+#include "protos.h"
+#include "dissector_eth.h"
+#include "built_in.h"
+
+static void no_next_header(struct pkt_buff *pkt)
+{
+ /*
+ * The value 59 in the Next Header field of an IPv6 header or any
+ * extension header indicates that there is nothing following that
+ * header. If the Payload Length field of the IPv6 header indicates the
+ * presence of octets past the end of a header whose Next Header field
+ * contains 59, those octets must be ignored, and passed on unchanged if
+ * the packet is forwarded.
+ */
+ tprintf(" [ No Next Header");
+ tprintf(" ]\n");
+}
+
+static void no_next_header_less(struct pkt_buff *pkt)
+{
+ tprintf(" No Next Header");
+}
+
+struct protocol ipv6_no_next_header_ops = {
+ .key = 0x3B,
+ .print_full = no_next_header,
+ .print_less = no_next_header_less,
+};
diff --git a/proto_ipv6_routing.c b/proto_ipv6_routing.c
new file mode 100644
index 0000000..735f976
--- /dev/null
+++ b/proto_ipv6_routing.c
@@ -0,0 +1,163 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2012 Markus Amend <markus@netsniff-ng.org>, Deutsche Flugsicherung GmbH
+ * Subject to the GPL, version 2.
+ *
+ * IPv6 Routing Header described in RFC2460
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <netinet/in.h> /* for ntohs() and "struct in6_addr" */
+#include <arpa/inet.h> /* for inet_ntop() */
+
+#include "proto.h"
+#include "protos.h"
+#include "dissector_eth.h"
+#include "built_in.h"
+#include "pkt_buff.h"
+
+#define ROUTING_HEADER_TYPE_0 0x00
+
+struct routinghdr {
+ uint8_t h_next_header;
+ uint8_t h_hdr_ext_len;
+ uint8_t h_routing_type;
+ uint8_t h_segments_left;
+} __packed;
+
+struct routinghdr_0 {
+ uint32_t reserved;
+ uint32_t addresses[0];
+} __packed;
+
+static void dissect_routinghdr_type_0(struct pkt_buff *pkt,
+ ssize_t *data_len, int less)
+{
+ uint8_t num_addr;
+ char address[INET6_ADDRSTRLEN];
+ struct in6_addr *addr;
+ struct routinghdr_0 *routing_0;
+
+ routing_0 = (struct routinghdr_0 *) pkt_pull(pkt, sizeof(*routing_0));
+ *data_len -= sizeof(*routing_0);
+ if (routing_0 == NULL || *data_len > pkt_len(pkt) || *data_len < 0)
+ return;
+
+ if (less) {
+ tprintf("Addresses (%lu)", *data_len / sizeof(struct in6_addr));
+ return;
+ }
+
+ tprintf("Res (0x%x)", routing_0->reserved);
+
+ num_addr = *data_len / sizeof(*addr);
+
+ while (num_addr--) {
+ addr = (struct in6_addr *) pkt_pull(pkt, sizeof(*addr));
+ *data_len -= sizeof(*addr);
+ if (addr == NULL || *data_len > pkt_len(pkt) || *data_len < 0)
+ return;
+
+ tprintf("\n\t Address: %s",
+ inet_ntop(AF_INET6, addr, address,
+ sizeof(address)));
+ }
+}
+
+static inline void dissect_routinghdr_type_0_norm(struct pkt_buff *pkt,
+ ssize_t *data_len)
+{
+ dissect_routinghdr_type_0(pkt, data_len, 0);
+}
+
+static inline void dissect_routinghdr_type_0_less(struct pkt_buff *pkt,
+ ssize_t *data_len)
+{
+ dissect_routinghdr_type_0(pkt, data_len, 1);
+}
+
+static void routing(struct pkt_buff *pkt)
+{
+ uint16_t hdr_ext_len;
+ ssize_t data_len;
+ struct routinghdr *routing;
+
+ routing = (struct routinghdr *) pkt_pull(pkt, sizeof(*routing));
+ if (routing == NULL)
+ return;
+
+ /* Total Header Length in Bytes */
+ hdr_ext_len = (routing->h_hdr_ext_len + 1) * 8;
+ /* Data length in Bytes */
+ data_len = hdr_ext_len - sizeof(*routing);
+
+ tprintf("\t [ Routing ");
+ tprintf("NextHdr (%u), ", routing->h_next_header);
+ if (data_len > pkt_len(pkt) || data_len < 0){
+ tprintf("HdrExtLen (%u, %u Bytes %s), ", routing->h_hdr_ext_len,
+ hdr_ext_len, colorize_start_full(black, red)
+ "invalid" colorize_end());
+ return;
+ }
+ tprintf("HdrExtLen (%u, %u Bytes), ", routing->h_hdr_ext_len,
+ hdr_ext_len);
+ tprintf("Type (%u), ", routing->h_routing_type);
+ tprintf("Left (%u), ", routing->h_segments_left);
+
+ switch (routing->h_routing_type) {
+ case ROUTING_HEADER_TYPE_0:
+ dissect_routinghdr_type_0_norm(pkt, &data_len);
+ break;
+ default:
+ tprintf("Type %u is unknown", routing->h_routing_type);
+ }
+
+ tprintf(" ]\n");
+
+ if (data_len > pkt_len(pkt) || data_len < 0)
+ return;
+
+ pkt_pull(pkt, data_len);
+ pkt_set_proto(pkt, &eth_lay3, routing->h_next_header);
+}
+
+static void routing_less(struct pkt_buff *pkt)
+{
+ uint16_t hdr_ext_len;
+ ssize_t data_len;
+ struct routinghdr *routing;
+
+ routing = (struct routinghdr *) pkt_pull(pkt, sizeof(*routing));
+ if (routing == NULL)
+ return;
+
+ /* Total Header Length in Bytes */
+ hdr_ext_len = (routing->h_hdr_ext_len + 1) * 8;
+ /* Data length in Bytes */
+ data_len = hdr_ext_len - sizeof(*routing);
+ if (data_len > pkt_len(pkt) || data_len < 0)
+ return;
+
+ tprintf(" Routing ");
+
+ switch (routing->h_routing_type) {
+ case ROUTING_HEADER_TYPE_0:
+ dissect_routinghdr_type_0_less(pkt, &data_len);
+ break;
+ default:
+ tprintf("Type %u is unknown", routing->h_routing_type);
+ }
+
+ if (data_len > pkt_len(pkt) || data_len < 0)
+ return;
+
+ pkt_pull(pkt, data_len);
+ pkt_set_proto(pkt, &eth_lay3, routing->h_next_header);
+}
+
+struct protocol ipv6_routing_ops = {
+ .key = 0x2B,
+ .print_full = routing,
+ .print_less = routing_less,
+};
diff --git a/proto_lldp.c b/proto_lldp.c
new file mode 100644
index 0000000..22b7684
--- /dev/null
+++ b/proto_lldp.c
@@ -0,0 +1,469 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2012, 2013 Tobias Klauser <tklauser@distanz.ch>
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdint.h>
+#include <arpa/inet.h> /* for inet_ntop() */
+#include <netinet/in.h> /* for ntohs()/ntohl() */
+
+#include "built_in.h"
+#include "oui.h"
+#include "pkt_buff.h"
+#include "proto.h"
+#include "protos.h"
+#include "xutils.h"
+
+#define EXTRACT_16BIT(x) ntohs(*((uint16_t *) (x)))
+#define EXTRACT_32BIT(x) ntohl(*((uint32_t *) (x)))
+
+#define LLDP_TLV_TYPE(tlv) (((tlv) & 0xFE00) >> 9)
+#define LLDP_TLV_LENGTH(tlv) ((tlv) & 0x01FF)
+
+/*
+ * LLDP TLV types
+ */
+#define LLDP_TLV_END 0
+#define LLDP_TLV_CHASSIS_ID 1
+#define LLDP_TLV_PORT_ID 2
+#define LLDP_TLV_TTL 3
+#define LLDP_TLV_PORT_DESC 4
+#define LLDP_TLV_SYSTEM_NAME 5
+#define LLDP_TLV_SYSTEM_DESC 6
+#define LLDP_TLV_SYSTEM_CAP 7
+#define LLDP_TLV_MGMT_ADDR 8
+#define LLDP_TLV_ORG_SPECIFIC 127
+
+/*
+ * Chassis ID subtypes
+ */
+#define LLDP_CHASSIS_SUBTYPE_CHASSIS 1
+#define LLDP_CHASSIS_SUBTYPE_IF_ALIAS 2
+#define LLDP_CHASSIS_SUBTYPE_PORT 3
+#define LLDP_CHASSIS_SUBTYPE_MAC_ADDR 4
+#define LLDP_CHASSIS_SUBTYPE_NET_ADDR 5
+#define LLDP_CHASSIS_SUBTYPE_IF_NAME 6
+#define LLDP_CHASSIS_SUBTYPE_LOCAL 7
+
+/*
+ * Port ID subtypes
+ */
+#define LLDP_PORT_SUBTYPE_IF_ALIAS 1
+#define LLDP_PORT_SUBTYPE_PORT_COMP 2
+#define LLDP_PORT_SUBTYPE_MAC_ADDR 3
+#define LLDP_PORT_SUBTYPE_NET_ADDR 4
+#define LLDP_PORT_SUBTYPE_IF_NAME 5
+#define LLDP_PORT_SUBTYPE_AGENT_CIRC_ID 6
+#define LLDP_PORT_SUBTYPE_LOCAL 7
+
+/*
+ * System capabilits bit masks
+ */
+#define LLDP_SYSTEM_CAP_OTHER (1 << 0)
+#define LLDP_SYSTEM_CAP_REPEATER (1 << 1)
+#define LLDP_SYSTEM_CAP_BRIDGE (1 << 2)
+#define LLDP_SYSTEM_CAP_WLAN_AP (1 << 3)
+#define LLDP_SYSTEM_CAP_ROUTER (1 << 4)
+#define LLDP_SYSTEM_CAP_TELEPHONE (1 << 5)
+#define LLDP_SYSTEM_CAP_DOCSIS (1 << 6)
+#define LLDP_SYSTEM_CAP_STATION_ONLY (1 << 7)
+
+/*
+ * Interface number subtypes (for Management addres TLV)
+ */
+#define LLDP_IFACE_NUM_SUBTYPE_UNKNOWN 1
+#define LLDP_IFACE_NUM_SUBTYPE_IF_INDEX 2
+#define LLDP_IFACE_NUM_SUBTYPE_SYS_PORT 3
+
+/*
+ * IANA address family numbers (only the ones we actually use)
+ * http://www.iana.org/assignments/address-family-numbers/address-family-numbers.txt
+ *
+ * TODO: Move these into own header if there are other users?
+ */
+#define IANA_AF_IPV4 1
+#define IANA_AF_IPV6 2
+#define IANA_AF_802 6
+
+static int lldp_print_net_addr(const uint8_t *addr, size_t addrlen)
+{
+ uint8_t af;
+ char buf[64];
+
+ if (addrlen < 1)
+ return -EINVAL;
+
+ af = *addr++;
+ addrlen--;
+ switch (af) {
+ case IANA_AF_IPV4:
+ if (addrlen < 4)
+ return -EINVAL;
+ inet_ntop(AF_INET, addr, buf, sizeof(buf));
+ tprintf("%s", buf);
+ break;
+ case IANA_AF_IPV6:
+ if (addrlen < 16)
+ return -EINVAL;
+ inet_ntop(AF_INET6, addr, buf, sizeof(buf));
+ tprintf("%s", buf);
+ break;
+ case IANA_AF_802:
+ if (addrlen < 6)
+ return -EINVAL;
+ tprintf("%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
+ addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
+ break;
+ default:
+ tprintf("unknown address family");
+ break;
+ }
+
+ return 0;
+}
+
+static void lldp_print_cap(uint16_t cap)
+{
+ unsigned int prev = 0;
+
+ if (cap & LLDP_SYSTEM_CAP_OTHER)
+ tprintf("%sOther", prev++ ? ", " : "");
+ if (cap & LLDP_SYSTEM_CAP_REPEATER)
+ tprintf("%sRepeater", prev++ ? ", " : "");
+ if (cap & LLDP_SYSTEM_CAP_BRIDGE)
+ tprintf("%sBridge", prev++ ? ", " : "");
+ if (cap & LLDP_SYSTEM_CAP_WLAN_AP)
+ tprintf("%sWLAN AP", prev++ ? ", " : "");
+ if (cap & LLDP_SYSTEM_CAP_ROUTER)
+ tprintf("%sRouter", prev++ ? ", " : "");
+ if (cap & LLDP_SYSTEM_CAP_TELEPHONE)
+ tprintf("%sTelephone", prev++ ? ", " : "");
+ if (cap & LLDP_SYSTEM_CAP_DOCSIS)
+ tprintf("%sDOCSIS", prev++ ? ", " : "");
+ if (cap & LLDP_SYSTEM_CAP_STATION_ONLY)
+ tprintf("%sStation only", prev++ ? ", " : "");
+}
+
+static void lldp(struct pkt_buff *pkt)
+{
+ unsigned int n_tlv = 0;
+ uint8_t subtype, mgmt_alen, mgmt_oidlen;
+ uint16_t tlv_hdr;
+ unsigned int tlv_type, tlv_len;
+ unsigned int len;
+ uint8_t *tlv_info_str;
+ uint16_t sys_cap, en_cap;
+ uint32_t oui;
+
+ len = pkt_len(pkt);
+ if (len == 0)
+ return;
+
+ tprintf(" [ LLDP ");
+
+ while (len >= sizeof(tlv_hdr)) {
+ tlv_hdr = EXTRACT_16BIT(pkt_pull(pkt, sizeof(tlv_hdr)));
+ tlv_type = LLDP_TLV_TYPE(tlv_hdr);
+ tlv_len = LLDP_TLV_LENGTH(tlv_hdr);
+
+ len -= sizeof(tlv_hdr);
+
+ if (tlv_type == LLDP_TLV_END && tlv_len == 0) {
+ /* Chassis ID, Port ID and TTL are mandatory */
+ if (n_tlv < 3)
+ goto out_invalid;
+ else
+ break;
+ }
+ if (len < tlv_len)
+ goto out_invalid;
+
+ switch (tlv_type) {
+ case LLDP_TLV_CHASSIS_ID:
+ /*
+ * The mandatory chassis ID shall be the first TLV and
+ * shall appear exactly once.
+ */
+ if (n_tlv != 0)
+ goto out_invalid;
+
+ tprintf("Chassis ID");
+
+ if (tlv_len < 2)
+ goto out_invalid;
+
+ tlv_info_str = pkt_pull(pkt, tlv_len);
+ if (tlv_info_str == NULL)
+ goto out_invalid;
+
+ subtype = *tlv_info_str++;
+ tprintf(" (Subtype %u => ", subtype);
+
+ switch (subtype) {
+ case LLDP_CHASSIS_SUBTYPE_MAC_ADDR:
+ if (tlv_len < 7)
+ goto out_invalid;
+
+ tprintf("%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
+ tlv_info_str[0], tlv_info_str[1],
+ tlv_info_str[2], tlv_info_str[3],
+ tlv_info_str[4], tlv_info_str[5]);
+ break;
+ case LLDP_CHASSIS_SUBTYPE_NET_ADDR:
+ if (lldp_print_net_addr(tlv_info_str, tlv_len))
+ goto out_invalid;
+ break;
+ case LLDP_CHASSIS_SUBTYPE_CHASSIS:
+ case LLDP_CHASSIS_SUBTYPE_IF_ALIAS:
+ case LLDP_CHASSIS_SUBTYPE_PORT:
+ case LLDP_CHASSIS_SUBTYPE_IF_NAME:
+ case LLDP_CHASSIS_SUBTYPE_LOCAL:
+ tputs_safe((const char *) tlv_info_str, tlv_len - 1);
+ break;
+ default:
+ tprintf("Reserved");
+ break;
+ }
+
+ tprintf(")");
+ break;
+ case LLDP_TLV_PORT_ID:
+ /*
+ * The mandatory port ID shall be the second TLV and
+ * shall appear exactly once.
+ */
+ if (n_tlv != 1)
+ goto out_invalid;
+
+ tprintf(", Port ID");
+
+ if (tlv_len < 2)
+ goto out_invalid;
+
+ tlv_info_str = pkt_pull(pkt, tlv_len);
+ if (tlv_info_str == NULL)
+ goto out_invalid;
+
+ subtype = *tlv_info_str++;
+ tprintf(" (Subtype %u => ", subtype);
+
+ switch (subtype) {
+ case LLDP_PORT_SUBTYPE_MAC_ADDR:
+ if (tlv_len < 7)
+ goto out_invalid;
+
+ tprintf("%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
+ tlv_info_str[0], tlv_info_str[1],
+ tlv_info_str[2], tlv_info_str[3],
+ tlv_info_str[4], tlv_info_str[5]);
+ break;
+ case LLDP_PORT_SUBTYPE_NET_ADDR:
+ if (lldp_print_net_addr(tlv_info_str, tlv_len))
+ goto out_invalid;
+ break;
+ case LLDP_PORT_SUBTYPE_IF_ALIAS:
+ case LLDP_PORT_SUBTYPE_PORT_COMP:
+ case LLDP_PORT_SUBTYPE_IF_NAME:
+ case LLDP_PORT_SUBTYPE_AGENT_CIRC_ID:
+ case LLDP_PORT_SUBTYPE_LOCAL:
+ tputs_safe((const char *) tlv_info_str, tlv_len - 1);
+ break;
+ default:
+ tprintf("Reserved");
+ break;
+ }
+
+ tprintf(")");
+ break;
+ case LLDP_TLV_TTL:
+ /*
+ * The mandatory TTL shall be the third TLV and
+ * shall appear exactly once.
+ */
+ if (n_tlv != 2)
+ goto out_invalid;
+
+ tprintf(", TTL");
+
+ if (tlv_len != 2)
+ goto out_invalid;
+
+ tlv_info_str = pkt_pull(pkt, tlv_len);
+ if (tlv_info_str == NULL)
+ goto out_invalid;
+
+ tprintf(" (%u)", EXTRACT_16BIT(tlv_info_str));
+ break;
+ case LLDP_TLV_PORT_DESC:
+ tprintf(", Port desc (");
+
+ tlv_info_str = pkt_pull(pkt, tlv_len);
+ if (tlv_info_str == NULL)
+ tprintf("none");
+ else
+ tputs_safe((const char *) tlv_info_str, tlv_len);
+
+ tprintf(")");
+ break;
+ case LLDP_TLV_SYSTEM_NAME:
+ tprintf(", Sys name (");
+
+ tlv_info_str = pkt_pull(pkt, tlv_len);
+ if (tlv_info_str == NULL)
+ tprintf("none");
+ else
+ tputs_safe((const char *) tlv_info_str, tlv_len);
+
+ tprintf(")");
+ break;
+ case LLDP_TLV_SYSTEM_DESC:
+ tprintf(", Sys desc (");
+
+ tlv_info_str = pkt_pull(pkt, tlv_len);
+ if (tlv_info_str == NULL)
+ tprintf("none");
+ else
+ tputs_safe((const char *) tlv_info_str, tlv_len);
+
+ tprintf(")");
+ break;
+ case LLDP_TLV_SYSTEM_CAP:
+ tprintf(", Sys Cap");
+
+ if (tlv_len != 4)
+ goto out_invalid;
+
+ tlv_info_str = pkt_pull(pkt, tlv_len);
+ if (tlv_info_str == NULL)
+ goto out_invalid;
+
+ sys_cap = EXTRACT_16BIT(tlv_info_str);
+ tlv_info_str += sizeof(uint32_t);
+ en_cap = EXTRACT_16BIT(tlv_info_str);
+
+ tprintf(" (");
+ lldp_print_cap(sys_cap);
+ tprintf(")");
+ tprintf(" Ena Cap (");
+ lldp_print_cap(en_cap);
+ tprintf(")");
+ break;
+ case LLDP_TLV_MGMT_ADDR:
+ tprintf(", Mgmt Addr (");
+
+ if (tlv_len < 9 || tlv_len > 167)
+ goto out_invalid;
+
+ tlv_info_str = pkt_pull(pkt, tlv_len);
+ if (tlv_info_str == NULL)
+ goto out_invalid;
+
+ mgmt_alen = *tlv_info_str;
+ tlv_info_str++;
+ if (tlv_len - 1 < mgmt_alen)
+ goto out_invalid;
+
+ if (lldp_print_net_addr(tlv_info_str, mgmt_alen))
+ goto out_invalid;
+ tlv_info_str += mgmt_alen;
+
+ tprintf(", Iface Subtype %d/", *tlv_info_str);
+ switch (*tlv_info_str) {
+ case LLDP_IFACE_NUM_SUBTYPE_IF_INDEX:
+ tprintf("ifIndex");
+ break;
+ case LLDP_IFACE_NUM_SUBTYPE_SYS_PORT:
+ tprintf("System Port Number");
+ break;
+ default:
+ tprintf("Unknown");
+ break;
+ }
+
+ tlv_info_str++;
+ tprintf(", Iface Number %u", EXTRACT_32BIT(tlv_info_str));
+
+ tlv_info_str += 4;
+ mgmt_oidlen = *tlv_info_str;
+ if (tlv_len - mgmt_alen - sizeof(uint32_t) - 3 < mgmt_oidlen)
+ goto out_invalid;
+ if (mgmt_oidlen > 0) {
+ tprintf(", OID ");
+ tputs_safe((const char *) tlv_info_str + 1, mgmt_oidlen);
+ }
+
+ tprintf(")");
+ break;
+ case LLDP_TLV_ORG_SPECIFIC:
+ tprintf(", Org specific");
+
+ if (tlv_len < 4)
+ goto out_invalid;
+
+ tlv_info_str = pkt_pull(pkt, 4);
+ if (tlv_info_str == NULL)
+ goto out_invalid;
+
+ oui = ntohl(*((uint32_t *) tlv_info_str));
+ subtype = oui & 0xff;
+ oui >>= 8;
+ tprintf(" (OUI %s, Subtype %u)", lookup_vendor_str(oui),
+ subtype);
+
+ /* Just eat it up, we don't know how to interpret it */
+ pkt_pull(pkt, tlv_len - 4);
+ break;
+ default:
+ tprintf(", Unknown TLV %u", tlv_type);
+ pkt_pull(pkt, tlv_len);
+ break;
+ }
+
+ n_tlv++;
+ }
+
+ len -= tlv_len;
+
+ tprintf(" ]\n");
+ return;
+
+out_invalid:
+ tprintf(" %sINVALID%s ]\n", colorize_start_full(black, red),
+ colorize_end());
+}
+
+static void lldp_less(struct pkt_buff *pkt)
+{
+ unsigned int len, n_tlv = 0;
+ unsigned int tlv_type, tlv_len;
+ uint16_t tlv_hdr;
+
+ len = pkt_len(pkt);
+
+ while (len >= sizeof(tlv_hdr)) {
+ tlv_hdr = EXTRACT_16BIT(pkt_pull(pkt, sizeof(tlv_hdr)));
+ tlv_type = LLDP_TLV_TYPE(tlv_hdr);
+ tlv_len = LLDP_TLV_LENGTH(tlv_hdr);
+
+ n_tlv++;
+ len -= sizeof(tlv_hdr);
+
+ if (tlv_type == LLDP_TLV_END || tlv_len == 0)
+ break;
+ if (len < tlv_len)
+ break;
+
+ pkt_pull(pkt, tlv_len);
+
+ len -= tlv_len;
+ }
+
+ tprintf(" %u TLV%s", n_tlv, n_tlv == 1 ? "" : "s");
+}
+
+struct protocol lldp_ops = {
+ .key = 0x88cc,
+ .print_full = lldp,
+ .print_less = lldp_less,
+};
diff --git a/proto_mpls_unicast.c b/proto_mpls_unicast.c
new file mode 100644
index 0000000..113c10f
--- /dev/null
+++ b/proto_mpls_unicast.c
@@ -0,0 +1,109 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2012 Markus Amend <markus@netsniff-ng.org>, Deutsche Flugsicherung GmbH
+ * Subject to the GPL, version 2.
+ *
+ * http://tools.ietf.org/html/rfc3032
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <netinet/in.h> /* for ntohs() */
+#include <errno.h>
+
+#include "proto.h"
+#include "protos.h"
+#include "dissector_eth.h"
+#include "built_in.h"
+#include "pkt_buff.h"
+
+struct mpls_uchdr {
+ uint32_t mpls_uc_hdr;
+} __packed;
+
+static int mpls_uc_next_proto(struct pkt_buff *pkt)
+{
+ uint8_t proto;
+ uint16_t key = 0;
+
+ if (pkt_len(pkt))
+ proto = *(pkt->data);
+ else
+ return -EIO;
+
+ /* FIXME: Right now only test for IP Version field */
+ switch (proto >> 4) {
+ case 4:
+ key = 0x0800; /* IPv4*/
+ break;
+ case 6:
+ key = 0x86DD; /* IPv6*/
+ break;
+ default:
+ /* Nothing detected ... */
+ return -ENOENT;
+ }
+
+ return key;
+}
+
+static void mpls_uc_full(struct pkt_buff *pkt)
+{
+ int next;
+ uint32_t mpls_uc_data;
+ struct mpls_uchdr *mpls_uc;
+ uint8_t s = 0;
+
+ do {
+ mpls_uc = (struct mpls_uchdr *) pkt_pull(pkt, sizeof(*mpls_uc));
+ if (mpls_uc == NULL)
+ return;
+
+ mpls_uc_data = ntohl(mpls_uc->mpls_uc_hdr);
+ s = (mpls_uc_data >> 8) & 0x1;
+
+ tprintf(" [ MPLS ");
+ tprintf("Label (%u), ", mpls_uc_data >> 12);
+ tprintf("Exp (%u), ", (mpls_uc_data >> 9) & 0x7);
+ tprintf("S (%u), ", s);
+ tprintf("TTL (%u)", (mpls_uc_data & 0xFF));
+ tprintf(" ]\n");
+ } while (!s);
+
+ next = mpls_uc_next_proto(pkt);
+ if (next < 0)
+ return;
+
+ pkt_set_proto(pkt, &eth_lay2, (uint16_t) next);
+}
+
+static void mpls_uc_less(struct pkt_buff *pkt)
+{
+ int next;
+ uint32_t mpls_uc_data;
+ struct mpls_uchdr *mpls_uc;
+ uint8_t s = 0;
+
+ do {
+ mpls_uc = (struct mpls_uchdr *) pkt_pull(pkt, sizeof(*mpls_uc));
+ if (mpls_uc == NULL)
+ return;
+
+ mpls_uc_data = ntohl(mpls_uc->mpls_uc_hdr);
+ s = (mpls_uc_data >> 8) & 0x1;
+
+ tprintf(" MPLS/%u", mpls_uc_data >> 12);
+ } while (!s);
+
+ next = mpls_uc_next_proto(pkt);
+ if (next < 0)
+ return;
+
+ pkt_set_proto(pkt, &eth_lay2, (uint16_t) next);
+}
+
+struct protocol mpls_uc_ops = {
+ .key = 0x8847,
+ .print_full = mpls_uc_full,
+ .print_less = mpls_uc_less,
+};
diff --git a/proto_none.c b/proto_none.c
new file mode 100644
index 0000000..2320625
--- /dev/null
+++ b/proto_none.c
@@ -0,0 +1,83 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <ctype.h>
+
+#include "proto.h"
+#include "protos.h"
+#include "pkt_buff.h"
+
+void empty(struct pkt_buff *pkt) {}
+
+static void _hex(uint8_t *ptr, size_t len)
+{
+ if (!len)
+ return;
+
+ tprintf(" [ Hex ");
+ for (; ptr && len-- > 0; ptr++)
+ tprintf(" %.2x", *ptr);
+ tprintf(" ]\n");
+}
+
+void hex(struct pkt_buff *pkt)
+{
+ size_t len = pkt_len(pkt);
+
+ if (!len)
+ return;
+
+ _hex(pkt_pull(pkt, len), len);
+ tprintf("\n");
+}
+
+static void _ascii(uint8_t *ptr, size_t len)
+{
+ if (!len)
+ return;
+
+ tprintf(" [ Chr ");
+ for (; ptr && len-- > 0; ptr++)
+ tprintf("%c", isprint(*ptr) ? *ptr : '.');
+ tprintf(" ]\n");
+}
+
+void ascii(struct pkt_buff *pkt)
+{
+ size_t len = pkt_len(pkt);
+
+ if (!len)
+ return;
+
+ _ascii(pkt_pull(pkt, len), len);
+ tprintf("\n");
+}
+
+void hex_ascii(struct pkt_buff *pkt)
+{
+ size_t len = pkt_len(pkt);
+ uint8_t *ptr = pkt_pull(pkt, len);
+
+ if (len) {
+ _ascii(ptr, len);
+ _hex(ptr, len);
+ }
+
+ tprintf("\n");
+}
+
+static void none_less(struct pkt_buff *pkt)
+{
+ tprintf("\n");
+}
+
+struct protocol none_ops = {
+ .key = 0x01,
+ .print_full = hex_ascii,
+ .print_less = none_less,
+};
diff --git a/proto_tcp.c b/proto_tcp.c
new file mode 100644
index 0000000..67e99b5
--- /dev/null
+++ b/proto_tcp.c
@@ -0,0 +1,155 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <endian.h>
+#include <netinet/in.h> /* for ntohs() */
+#include <asm/byteorder.h>
+
+#include "proto.h"
+#include "protos.h"
+#include "dissector_eth.h"
+#include "built_in.h"
+#include "pkt_buff.h"
+
+struct tcphdr {
+ uint16_t source;
+ uint16_t dest;
+ uint32_t seq;
+ uint32_t ack_seq;
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+ __extension__ uint16_t res1:4,
+ doff:4,
+ fin:1,
+ syn:1,
+ rst:1,
+ psh:1,
+ ack:1,
+ urg:1,
+ ece:1,
+ cwr:1;
+#elif defined(__BIG_ENDIAN_BITFIELD)
+ __extension__ uint16_t doff:4,
+ res1:4,
+ cwr:1,
+ ece:1,
+ urg:1,
+ ack:1,
+ psh:1,
+ rst:1,
+ syn:1,
+ fin:1;
+#else
+# error "Adjust your <asm/byteorder.h> defines"
+#endif
+ uint16_t window;
+ uint16_t check;
+ uint16_t urg_ptr;
+} __packed;
+
+static void tcp(struct pkt_buff *pkt)
+{
+ struct tcphdr *tcp = (struct tcphdr *) pkt_pull(pkt, sizeof(*tcp));
+ uint16_t src, dest;
+ char *src_name, *dest_name;
+
+ if (tcp == NULL)
+ return;
+
+ src = ntohs(tcp->source);
+ dest = ntohs(tcp->dest);
+
+ src_name = lookup_port_tcp(src);
+ dest_name = lookup_port_tcp(dest);
+
+ tprintf(" [ TCP ");
+ tprintf("Port (%u", src);
+ if (src_name)
+ tprintf(" (%s%s%s)", colorize_start(bold), src_name,
+ colorize_end());
+ tprintf(" => %u", dest);
+ if (dest_name)
+ tprintf(" (%s%s%s)", colorize_start(bold), dest_name,
+ colorize_end());
+ tprintf("), ");
+ tprintf("SN (0x%x), ", ntohl(tcp->seq));
+ tprintf("AN (0x%x), ", ntohl(tcp->ack_seq));
+ tprintf("DataOff (%u), ", tcp->doff);
+ tprintf("Res (%u), ", tcp->res1);
+ tprintf("Flags (");
+ if (tcp->fin)
+ tprintf("FIN ");
+ if (tcp->syn)
+ tprintf("SYN ");
+ if (tcp->rst)
+ tprintf("RST ");
+ if (tcp->psh)
+ tprintf("PSH ");
+ if (tcp->ack)
+ tprintf("ACK ");
+ if (tcp->urg)
+ tprintf("URG ");
+ if (tcp->ece)
+ tprintf("ECE ");
+ if (tcp->cwr)
+ tprintf("CWR ");
+ tprintf("), ");
+ tprintf("Window (%u), ", ntohs(tcp->window));
+ tprintf("CSum (0x%.4x), ", ntohs(tcp->check));
+ tprintf("UrgPtr (%u)", ntohs(tcp->urg_ptr));
+ tprintf(" ]\n");
+}
+
+static void tcp_less(struct pkt_buff *pkt)
+{
+ struct tcphdr *tcp = (struct tcphdr *) pkt_pull(pkt, sizeof(*tcp));
+ uint16_t src, dest;
+ char *src_name, *dest_name;
+
+ if (tcp == NULL)
+ return;
+
+ src = ntohs(tcp->source);
+ dest = ntohs(tcp->dest);
+
+ src_name = lookup_port_tcp(src);
+ dest_name = lookup_port_tcp(dest);
+
+ tprintf(" TCP %u", src);
+ if(src_name)
+ tprintf("(%s%s%s)", colorize_start(bold), src_name,
+ colorize_end());
+ tprintf("/%u", dest);
+ if(dest_name)
+ tprintf("(%s%s%s)", colorize_start(bold), dest_name,
+ colorize_end());
+ tprintf(" F%s",colorize_start(bold));
+ if (tcp->fin)
+ tprintf(" FIN");
+ if (tcp->syn)
+ tprintf(" SYN");
+ if (tcp->rst)
+ tprintf(" RST");
+ if (tcp->psh)
+ tprintf(" PSH");
+ if (tcp->ack)
+ tprintf(" ACK");
+ if (tcp->urg)
+ tprintf(" URG");
+ if (tcp->ece)
+ tprintf(" ECE");
+ if (tcp->cwr)
+ tprintf(" CWR");
+ tprintf("%s Win %u S/A 0x%x/0x%x", colorize_end(),
+ ntohs(tcp->window), ntohl(tcp->seq), ntohl(tcp->ack_seq));
+}
+
+struct protocol tcp_ops = {
+ .key = 0x06,
+ .print_full = tcp,
+ .print_less = tcp_less,
+};
diff --git a/proto_udp.c b/proto_udp.c
new file mode 100644
index 0000000..91c9a17
--- /dev/null
+++ b/proto_udp.c
@@ -0,0 +1,89 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <netinet/in.h> /* for ntohs() */
+
+#include "proto.h"
+#include "protos.h"
+#include "dissector_eth.h"
+#include "pkt_buff.h"
+
+struct udphdr {
+ uint16_t source;
+ uint16_t dest;
+ uint16_t len;
+ uint16_t check;
+} __packed;
+
+static void udp(struct pkt_buff *pkt)
+{
+ struct udphdr *udp = (struct udphdr *) pkt_pull(pkt, sizeof(*udp));
+ ssize_t len;
+ uint16_t src, dest;
+ char *src_name, *dest_name;
+
+ if (udp == NULL)
+ return;
+
+ len = ntohs(udp->len) - sizeof(*udp);
+ src = ntohs(udp->source);
+ dest = ntohs(udp->dest);
+
+ src_name = lookup_port_udp(src);
+ dest_name = lookup_port_udp(dest);
+
+ tprintf(" [ UDP ");
+ tprintf("Port (%u", src);
+ if (src_name)
+ tprintf(" (%s%s%s)", colorize_start(bold), src_name,
+ colorize_end());
+ tprintf(" => %u", dest);
+ if (dest_name)
+ tprintf(" (%s%s%s)", colorize_start(bold), dest_name,
+ colorize_end());
+ tprintf("), ");
+ if(len > pkt_len(pkt) || len < 0){
+ tprintf("Len (%u) %s, ", ntohs(udp->len),
+ colorize_start_full(black, red)
+ "invalid" colorize_end());
+ }
+ tprintf("Len (%u Bytes, %zd Bytes Data), ", ntohs(udp->len), len);
+ tprintf("CSum (0x%.4x)", ntohs(udp->check));
+ tprintf(" ]\n");
+}
+
+static void udp_less(struct pkt_buff *pkt)
+{
+ struct udphdr *udp = (struct udphdr *) pkt_pull(pkt, sizeof(*udp));
+ uint16_t src, dest;
+ char *src_name, *dest_name;
+
+ if (udp == NULL)
+ return;
+
+ src = ntohs(udp->source);
+ dest = ntohs(udp->dest);
+
+ src_name = lookup_port_udp(src);
+ dest_name = lookup_port_udp(dest);
+
+ tprintf(" UDP %u", src);
+ if(src_name)
+ tprintf("(%s%s%s)", colorize_start(bold), src_name,
+ colorize_end());
+ tprintf("/%u", dest);
+ if (dest_name)
+ tprintf("(%s%s%s)", colorize_start(bold), dest_name,
+ colorize_end());
+}
+
+struct protocol udp_ops = {
+ .key = 0x11,
+ .print_full = udp,
+ .print_less = udp_less,
+};
diff --git a/proto_vlan.c b/proto_vlan.c
new file mode 100644
index 0000000..baa36b8
--- /dev/null
+++ b/proto_vlan.c
@@ -0,0 +1,61 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Copyright 2010 Emmanuel Roullit.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <netinet/in.h> /* for ntohs() */
+
+#include "proto.h"
+#include "protos.h"
+#include "dissector_eth.h"
+#include "pkt_buff.h"
+
+struct vlanhdr {
+ uint16_t h_vlan_TCI;
+ uint16_t h_vlan_encapsulated_proto;
+} __attribute__((packed));
+
+static void vlan(struct pkt_buff *pkt)
+{
+ uint16_t tci;
+ struct vlanhdr *vlan = (struct vlanhdr *) pkt_pull(pkt, sizeof(*vlan));
+
+ if (vlan == NULL)
+ return;
+
+ tci = ntohs(vlan->h_vlan_TCI);
+
+ tprintf(" [ VLAN ");
+ tprintf("Prio (%d), ", (tci & 0xE000) >> 13);
+ tprintf("CFI (%d), ", (tci & 0x1000) >> 12);
+ tprintf("ID (%d), ", (tci & 0x0FFF));
+ tprintf("Proto (0x%.4x)", ntohs(vlan->h_vlan_encapsulated_proto));
+ tprintf(" ]\n");
+
+ pkt_set_proto(pkt, &eth_lay2, ntohs(vlan->h_vlan_encapsulated_proto));
+}
+
+static void vlan_less(struct pkt_buff *pkt)
+{
+ uint16_t tci;
+ struct vlanhdr *vlan = (struct vlanhdr *) pkt_pull(pkt, sizeof(*vlan));
+
+ if (vlan == NULL)
+ return;
+
+ tci = ntohs(vlan->h_vlan_TCI);
+
+ tprintf(" VLAN%d", (tci & 0x0FFF));
+
+ pkt_set_proto(pkt, &eth_lay2, ntohs(vlan->h_vlan_encapsulated_proto));
+}
+
+struct protocol vlan_ops = {
+ .key = 0x8100,
+ .print_full = vlan,
+ .print_less = vlan_less,
+};
diff --git a/proto_vlan_q_in_q.c b/proto_vlan_q_in_q.c
new file mode 100644
index 0000000..72e7b78
--- /dev/null
+++ b/proto_vlan_q_in_q.c
@@ -0,0 +1,63 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2012 Markus Amend <markus@netsniff-ng.org>, Deutsche Flugsicherung GmbH
+ * Subject to the GPL, version 2.
+ *
+ * http://www.ieee802.org/1/pages/802.1ad.html
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <netinet/in.h> /* for ntohs() */
+
+#include "proto.h"
+#include "protos.h"
+#include "dissector_eth.h"
+#include "built_in.h"
+#include "pkt_buff.h"
+
+struct QinQhdr {
+ uint16_t TCI;
+ uint16_t TPID;
+} __packed;
+
+static void QinQ_full(struct pkt_buff *pkt)
+{
+ uint16_t tci;
+ struct QinQhdr *QinQ = (struct QinQhdr *) pkt_pull(pkt, sizeof(*QinQ));
+
+ if (QinQ == NULL)
+ return;
+
+ tci = ntohs(QinQ->TCI);
+
+ tprintf(" [ VLAN QinQ ");
+ tprintf("Prio (%d), ", (tci & 0xE000) >> 13);
+ tprintf("DEI (%d), ", (tci & 0x1000) >> 12);
+ tprintf("ID (%d), ", (tci & 0x0FFF));
+ tprintf("Proto (0x%.4x)", ntohs(QinQ->TPID));
+ tprintf(" ]\n");
+
+ pkt_set_proto(pkt, &eth_lay2, ntohs(QinQ->TPID));
+}
+
+static void QinQ_less(struct pkt_buff *pkt)
+{
+ uint16_t tci;
+ struct QinQhdr *QinQ = (struct QinQhdr *) pkt_pull(pkt, sizeof(*QinQ));
+
+ if (QinQ == NULL)
+ return;
+
+ tci = ntohs(QinQ->TCI);
+
+ tprintf(" VLAN%d", (tci & 0x0FFF));
+
+ pkt_set_proto(pkt, &eth_lay2, ntohs(QinQ->TPID));
+}
+
+struct protocol QinQ_ops = {
+ .key = 0x88a8,
+ .print_full = QinQ_full,
+ .print_less = QinQ_less,
+};
diff --git a/protos.h b/protos.h
new file mode 100644
index 0000000..127e1d3
--- /dev/null
+++ b/protos.h
@@ -0,0 +1,37 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef PROTOS_H
+#define PROTOS_H
+
+struct protocol;
+
+extern struct protocol arp_ops;
+extern struct protocol ethernet_ops;
+extern struct protocol icmpv4_ops;
+extern struct protocol icmpv6_ops;
+extern struct protocol igmp_ops;
+extern struct protocol ip_auth_ops;
+extern struct protocol ip_esp_ops;
+extern struct protocol ipv4_ops;
+extern struct protocol ipv6_ops;
+extern struct protocol ipv6_dest_opts_ops;
+extern struct protocol ipv6_fragm_ops;
+extern struct protocol ipv6_hop_by_hop_ops;
+extern struct protocol ipv6_in_ipv4_ops;
+extern struct protocol ipv6_mobility_ops;
+extern struct protocol ipv6_no_next_header_ops;
+extern struct protocol ipv6_routing_ops;
+extern struct protocol lldp_ops;
+extern struct protocol none_ops;
+extern struct protocol tcp_ops;
+extern struct protocol udp_ops;
+extern struct protocol vlan_ops;
+extern struct protocol ieee80211_ops;
+extern struct protocol QinQ_ops;
+extern struct protocol mpls_uc_ops;
+
+#endif /* PROTOS_H */
diff --git a/ring.h b/ring.h
new file mode 100644
index 0000000..75f4d26
--- /dev/null
+++ b/ring.h
@@ -0,0 +1,174 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef RING_H
+#define RING_H
+
+/*
+ * "I love the smell of 10GbE in the morning. Smells like ... victory."
+ * - W. Richard Stevens, "Secret Teachings of the UNIX Environment"
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <linux/if_packet.h>
+#include <linux/socket.h>
+#include <linux/sockios.h>
+#include <sys/ioctl.h>
+#include <string.h>
+#include <poll.h>
+#include <sys/poll.h>
+
+#include "xutils.h"
+#include "built_in.h"
+#include "die.h"
+
+#ifndef PACKET_FANOUT
+# define PACKET_FANOUT 18
+# define PACKET_FANOUT_POLICY_HASH 0
+# define PACKET_FANOUT_POLICY_LB 1
+# define PACKET_FANOUT_POLICY_DEFAULT PACKET_FANOUT_HASH
+#endif
+
+struct frame_map {
+ struct tpacket2_hdr tp_h __aligned_tpacket;
+ struct sockaddr_ll s_ll __align_tpacket(sizeof(struct tpacket2_hdr));
+};
+
+struct ring {
+ struct iovec *frames;
+ uint8_t *mm_space;
+ size_t mm_len;
+ struct tpacket_req layout;
+ struct sockaddr_ll s_ll;
+};
+
+static inline void next_rnd_slot(unsigned int *it, struct ring *ring)
+{
+ *it = rand() % ring->layout.tp_frame_nr;
+}
+
+#define RING_SIZE_FALLBACK (1 << 26)
+
+static inline unsigned int ring_size(char *ifname, unsigned int size)
+{
+ if (size > 0)
+ return size;
+
+ /*
+ * Device bitrate in bytes times two as ring size.
+ * Fallback => ~ 64,00 MB
+ * 10 MBit => ~ 2,38 MB
+ * 54 MBit => ~ 12,88 MB
+ * 100 MBit => ~ 23,84 MB
+ * 300 MBit => ~ 71,52 MB
+ * 1.000 MBit => ~ 238,42 MB
+ * 10.000 MBit => ~ 2.384.18 MB
+ */
+ size = device_bitrate(ifname);
+ size = (size * 1000000) / 8;
+ size = size * 2;
+ if (size == 0)
+ size = RING_SIZE_FALLBACK;
+
+ return round_up_cacheline(size);
+}
+
+static inline unsigned int ring_frame_size(struct ring *ring)
+{
+ return ring->layout.tp_frame_size;
+}
+
+static inline void tpacket_hdr_clone(struct tpacket2_hdr *thdrd,
+ struct tpacket2_hdr *thdrs)
+{
+ thdrd->tp_sec = thdrs->tp_sec;
+ thdrd->tp_nsec = thdrs->tp_nsec;
+ thdrd->tp_snaplen = thdrs->tp_snaplen;
+ thdrd->tp_len = thdrs->tp_len;
+}
+
+#ifndef POLLRDNORM
+# define POLLRDNORM 0x0040
+#endif
+#ifndef POLLWRNORM
+# define POLLWRNORM 0x0100
+#endif
+#ifndef POLLRDHUP
+# define POLLRDHUP 0x2000
+#endif
+
+#define POLL_NEXT_PKT 0
+#define POLL_MOVE_OUT 1
+
+static inline void prepare_polling(int sock, struct pollfd *pfd)
+{
+ memset(pfd, 0, sizeof(*pfd));
+ pfd->fd = sock;
+ pfd->revents = 0;
+ pfd->events = POLLIN | POLLRDNORM | POLLERR;
+}
+
+static inline void set_sockopt_fanout(int sock, unsigned int fanout_id,
+ unsigned int fanout_type)
+{
+ unsigned int fanout_arg = (fanout_id | (fanout_type << 16));
+ int ret = setsockopt(sock, SOL_PACKET, PACKET_FANOUT, &fanout_arg,
+ sizeof(fanout_arg));
+ if (ret)
+ panic("No packet fanout support!\n");
+}
+
+static inline void set_sockopt_tpacket(int sock)
+{
+ int ret, val = TPACKET_V2;
+
+ ret = setsockopt(sock, SOL_PACKET, PACKET_VERSION, &val, sizeof(val));
+ if (ret)
+ panic("Cannot set tpacketv2!\n");
+}
+
+#ifdef __WITH_HARDWARE_TIMESTAMPING
+# include <linux/net_tstamp.h>
+
+static inline void set_sockopt_hwtimestamp(int sock, const char *dev)
+{
+ int timesource, ret;
+ struct hwtstamp_config hwconfig;
+ struct ifreq ifr;
+
+ if (!strncmp("any", dev, strlen("any")))
+ return;
+
+ memset(&hwconfig, 0, sizeof(hwconfig));
+ hwconfig.tx_type = HWTSTAMP_TX_ON;
+ hwconfig.rx_filter = HWTSTAMP_FILTER_ALL;
+
+ memset(&ifr, 0, sizeof(ifr));
+ strlcpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name));
+ ifr.ifr_data = &hwconfig;
+
+ ret = ioctl(sock, SIOCSHWTSTAMP, &ifr);
+ if (ret < 0) {
+ if (errno == EOPNOTSUPP)
+ return;
+ panic("Cannot set timestamping: %s\n", strerror(errno));
+ }
+
+ timesource = SOF_TIMESTAMPING_RAW_HARDWARE;
+
+ ret = setsockopt(sock, SOL_PACKET, PACKET_TIMESTAMP, &timesource,
+ sizeof(timesource));
+ if (ret)
+ panic("Cannot set timestamping: %s!\n", strerror(errno));
+}
+#else
+static inline void set_sockopt_hwtimestamp(int sock, const char *dev)
+{
+ return;
+}
+#endif
+#endif /* RING_H */
diff --git a/ring_rx.c b/ring_rx.c
new file mode 100644
index 0000000..c4c6a38
--- /dev/null
+++ b/ring_rx.c
@@ -0,0 +1,130 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <linux/if_ether.h>
+
+#include "xmalloc.h"
+#include "die.h"
+#include "ring_rx.h"
+#include "built_in.h"
+
+void destroy_rx_ring(int sock, struct ring *ring)
+{
+ fmemset(&ring->layout, 0, sizeof(ring->layout));
+ setsockopt(sock, SOL_PACKET, PACKET_RX_RING, &ring->layout,
+ sizeof(ring->layout));
+
+ munmap(ring->mm_space, ring->mm_len);
+ ring->mm_len = 0;
+
+ xfree(ring->frames);
+}
+
+void setup_rx_ring_layout(int sock, struct ring *ring, unsigned int size,
+ int jumbo_support)
+{
+ fmemset(&ring->layout, 0, sizeof(ring->layout));
+
+ ring->layout.tp_block_size = (jumbo_support ?
+ getpagesize() << 4 :
+ getpagesize() << 2);
+ ring->layout.tp_frame_size = (jumbo_support ?
+ TPACKET_ALIGNMENT << 12 :
+ TPACKET_ALIGNMENT << 7);
+ ring->layout.tp_block_nr = size / ring->layout.tp_block_size;
+ ring->layout.tp_frame_nr = ring->layout.tp_block_size /
+ ring->layout.tp_frame_size *
+ ring->layout.tp_block_nr;
+
+ bug_on(ring->layout.tp_block_size < ring->layout.tp_frame_size);
+ bug_on((ring->layout.tp_block_size % ring->layout.tp_frame_size) != 0);
+ bug_on((ring->layout.tp_block_size % getpagesize()) != 0);
+}
+
+void create_rx_ring(int sock, struct ring *ring, int verbose)
+{
+ int ret;
+
+ set_sockopt_tpacket(sock);
+retry:
+ ret = setsockopt(sock, SOL_PACKET, PACKET_RX_RING, &ring->layout,
+ sizeof(ring->layout));
+ if (errno == ENOMEM && ring->layout.tp_block_nr > 1) {
+ ring->layout.tp_block_nr >>= 1;
+ ring->layout.tp_frame_nr = ring->layout.tp_block_size /
+ ring->layout.tp_frame_size *
+ ring->layout.tp_block_nr;
+ goto retry;
+ }
+
+ if (ret < 0)
+ panic("Cannot allocate RX_RING!\n");
+
+ ring->mm_len = ring->layout.tp_block_size * ring->layout.tp_block_nr;
+
+ if (verbose) {
+ printf("RX: %.2Lf MiB, %u Frames, each %u Byte allocated\n",
+ (long double) ring->mm_len / (1 << 20),
+ ring->layout.tp_frame_nr, ring->layout.tp_frame_size);
+ }
+}
+
+void mmap_rx_ring(int sock, struct ring *ring)
+{
+ ring->mm_space = mmap(0, ring->mm_len, PROT_READ | PROT_WRITE,
+ MAP_SHARED | MAP_LOCKED | MAP_POPULATE, sock, 0);
+ if (ring->mm_space == MAP_FAILED) {
+ destroy_rx_ring(sock, ring);
+ panic("Cannot mmap RX_RING!\n");
+ }
+}
+
+void alloc_rx_ring_frames(struct ring *ring)
+{
+ int i;
+ size_t len = ring->layout.tp_frame_nr * sizeof(*ring->frames);
+
+ ring->frames = xmalloc_aligned(len, CO_CACHE_LINE_SIZE);
+ fmemset(ring->frames, 0, len);
+
+ for (i = 0; i < ring->layout.tp_frame_nr; ++i) {
+ ring->frames[i].iov_len = ring->layout.tp_frame_size;
+ ring->frames[i].iov_base = ring->mm_space +
+ (i * ring->layout.tp_frame_size);
+ }
+}
+
+void bind_rx_ring(int sock, struct ring *ring, int ifindex)
+{
+ int ret;
+ /*
+ * The RX_RING registers itself to the networking stack with
+ * dev_add_pack(), so we have one single RX_RING for all devs
+ * otherwise you'll get the packet twice.
+ */
+ fmemset(&ring->s_ll, 0, sizeof(ring->s_ll));
+
+ ring->s_ll.sll_family = AF_PACKET;
+ ring->s_ll.sll_protocol = htons(ETH_P_ALL);
+ ring->s_ll.sll_ifindex = ifindex;
+ ring->s_ll.sll_hatype = 0;
+ ring->s_ll.sll_halen = 0;
+ ring->s_ll.sll_pkttype = 0;
+
+ ret = bind(sock, (struct sockaddr *) &ring->s_ll, sizeof(ring->s_ll));
+ if (ret < 0) {
+ destroy_rx_ring(sock, ring);
+ panic("Cannot bind RX_RING!\n");
+ }
+}
diff --git a/ring_rx.h b/ring_rx.h
new file mode 100644
index 0000000..8d695e5
--- /dev/null
+++ b/ring_rx.h
@@ -0,0 +1,31 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef RX_RING_H
+#define RX_RING_H
+
+#include "ring.h"
+#include "built_in.h"
+
+extern void destroy_rx_ring(int sock, struct ring *ring);
+extern void create_rx_ring(int sock, struct ring *ring, int verbose);
+extern void mmap_rx_ring(int sock, struct ring *ring);
+extern void alloc_rx_ring_frames(struct ring *ring);
+extern void bind_rx_ring(int sock, struct ring *ring, int ifindex);
+extern void setup_rx_ring_layout(int sock, struct ring *ring,
+ unsigned int size, int jumbo_support);
+
+static inline int user_may_pull_from_rx(struct tpacket2_hdr *hdr)
+{
+ return ((hdr->tp_status & TP_STATUS_USER) == TP_STATUS_USER);
+}
+
+static inline void kernel_may_pull_from_rx(struct tpacket2_hdr *hdr)
+{
+ hdr->tp_status = TP_STATUS_KERNEL;
+}
+
+#endif /* RX_RING_H */
diff --git a/ring_tx.c b/ring_tx.c
new file mode 100644
index 0000000..dc777e5
--- /dev/null
+++ b/ring_tx.c
@@ -0,0 +1,136 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Copyright 2009, 2010 Emmanuel Roullit.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <linux/if_ether.h>
+
+#include "die.h"
+#include "xmalloc.h"
+#include "ring_tx.h"
+#include "built_in.h"
+
+void set_packet_loss_discard(int sock)
+{
+ int ret, discard = 1;
+ ret = setsockopt(sock, SOL_PACKET, PACKET_LOSS, (void *) &discard,
+ sizeof(discard));
+ if (ret < 0)
+ panic("setsockopt: cannot set packet loss");
+}
+
+void destroy_tx_ring(int sock, struct ring *ring)
+{
+ fmemset(&ring->layout, 0, sizeof(ring->layout));
+ setsockopt(sock, SOL_PACKET, PACKET_TX_RING, &ring->layout,
+ sizeof(ring->layout));
+
+ munmap(ring->mm_space, ring->mm_len);
+ ring->mm_len = 0;
+
+ xfree(ring->frames);
+}
+
+void setup_tx_ring_layout(int sock, struct ring *ring, unsigned int size,
+ int jumbo_support)
+{
+ fmemset(&ring->layout, 0, sizeof(ring->layout));
+
+ ring->layout.tp_block_size = (jumbo_support ?
+ getpagesize() << 4 :
+ getpagesize() << 2);
+ ring->layout.tp_frame_size = (jumbo_support ?
+ TPACKET_ALIGNMENT << 12 :
+ TPACKET_ALIGNMENT << 7);
+ ring->layout.tp_block_nr = size / ring->layout.tp_block_size;
+ ring->layout.tp_frame_nr = ring->layout.tp_block_size /
+ ring->layout.tp_frame_size *
+ ring->layout.tp_block_nr;
+
+ bug_on(ring->layout.tp_block_size < ring->layout.tp_frame_size);
+ bug_on((ring->layout.tp_block_size % ring->layout.tp_frame_size) != 0);
+ bug_on((ring->layout.tp_block_size % getpagesize()) != 0);
+}
+
+void create_tx_ring(int sock, struct ring *ring, int verbose)
+{
+ int ret;
+
+ set_sockopt_tpacket(sock);
+retry:
+ ret = setsockopt(sock, SOL_PACKET, PACKET_TX_RING, &ring->layout,
+ sizeof(ring->layout));
+ if (errno == ENOMEM && ring->layout.tp_block_nr > 1) {
+ ring->layout.tp_block_nr >>= 1;
+ ring->layout.tp_frame_nr = ring->layout.tp_block_size /
+ ring->layout.tp_frame_size *
+ ring->layout.tp_block_nr;
+ goto retry;
+ }
+
+ if (ret < 0)
+ panic("Cannot allocate TX_RING!\n");
+
+ ring->mm_len = ring->layout.tp_block_size * ring->layout.tp_block_nr;
+
+ if (verbose) {
+ printf("TX: %.2Lf MiB, %u Frames, each %u Byte allocated\n",
+ (long double) ring->mm_len / (1 << 20),
+ ring->layout.tp_frame_nr, ring->layout.tp_frame_size);
+ }
+}
+
+void mmap_tx_ring(int sock, struct ring *ring)
+{
+ ring->mm_space = mmap(0, ring->mm_len, PROT_READ | PROT_WRITE,
+ MAP_SHARED | MAP_LOCKED | MAP_POPULATE, sock, 0);
+ if (ring->mm_space == MAP_FAILED) {
+ destroy_tx_ring(sock, ring);
+ panic("Cannot mmap TX_RING!\n");
+ }
+}
+
+void alloc_tx_ring_frames(struct ring *ring)
+{
+ int i;
+ size_t len = ring->layout.tp_frame_nr * sizeof(*ring->frames);
+
+ ring->frames = xmalloc_aligned(len, CO_CACHE_LINE_SIZE);
+ fmemset(ring->frames, 0, len);
+
+ for (i = 0; i < ring->layout.tp_frame_nr; ++i) {
+ ring->frames[i].iov_len = ring->layout.tp_frame_size;
+ ring->frames[i].iov_base = ring->mm_space +
+ (i * ring->layout.tp_frame_size);
+ }
+}
+
+void bind_tx_ring(int sock, struct ring *ring, int ifindex)
+{
+ int ret;
+
+ fmemset(&ring->s_ll, 0, sizeof(ring->s_ll));
+
+ ring->s_ll.sll_family = AF_PACKET;
+ ring->s_ll.sll_protocol = htons(ETH_P_ALL);
+ ring->s_ll.sll_ifindex = ifindex;
+ ring->s_ll.sll_hatype = 0;
+ ring->s_ll.sll_halen = 0;
+ ring->s_ll.sll_pkttype = 0;
+
+ ret = bind(sock, (struct sockaddr *) &ring->s_ll, sizeof(ring->s_ll));
+ if (ret < 0) {
+ destroy_tx_ring(sock, ring);
+ panic("Cannot bind TX_RING!\n");
+ }
+}
diff --git a/ring_tx.h b/ring_tx.h
new file mode 100644
index 0000000..7970045
--- /dev/null
+++ b/ring_tx.h
@@ -0,0 +1,40 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef TX_RING_H
+#define TX_RING_H
+
+#include "ring.h"
+#include "built_in.h"
+
+/* Give userland 10 us time to push packets to the ring */
+#define TX_KERNEL_PULL_INT 10
+
+extern void destroy_tx_ring(int sock, struct ring *ring);
+extern void create_tx_ring(int sock, struct ring *ring, int verbose);
+extern void mmap_tx_ring(int sock, struct ring *ring);
+extern void alloc_tx_ring_frames(struct ring *ring);
+extern void bind_tx_ring(int sock, struct ring *ring, int ifindex);
+extern void setup_tx_ring_layout(int sock, struct ring *ring,
+ unsigned int size, int jumbo_support);
+extern void set_packet_loss_discard(int sock);
+
+static inline int user_may_pull_from_tx(struct tpacket2_hdr *hdr)
+{
+ return ((hdr->tp_status & TP_STATUS_AVAILABLE) == TP_STATUS_AVAILABLE);
+}
+
+static inline void kernel_may_pull_from_tx(struct tpacket2_hdr *hdr)
+{
+ hdr->tp_status = TP_STATUS_SEND_REQUEST;
+}
+
+static inline int pull_and_flush_tx_ring(int sock)
+{
+ return sendto(sock, NULL, 0, MSG_DONTWAIT, NULL, 0);
+}
+
+#endif /* TX_RING_H */
diff --git a/stun.c b/stun.c
new file mode 100644
index 0000000..5892ad5
--- /dev/null
+++ b/stun.c
@@ -0,0 +1,190 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2011 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <errno.h>
+#include <time.h>
+#include <unistd.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/select.h>
+
+#include "xmalloc.h"
+#include "xutils.h"
+#include "die.h"
+
+extern int print_stun_probe(char *server, int sport, int tport);
+
+#define BINDING_REQUEST 0x0001
+#define BINDING_RESPONSE 0x0101
+
+#define MAPPED_ADDRESS 0x0001
+
+#define TIMEOUT 5000
+#define REQUEST_LEN 20
+
+#define ID_COOKIE_FIELD htonl(((int) 'a' << 24) + \
+ ((int) 'c' << 16) + \
+ ((int) 'd' << 8) + \
+ (int) 'c')
+
+struct stun_header {
+ uint16_t type;
+ uint16_t len;
+ uint32_t magic_cookie;
+ uint32_t transid[3];
+};
+
+struct stun_attrib {
+ uint16_t type;
+ uint16_t len;
+ uint8_t *value;
+};
+
+struct stun_mapped_addr {
+ uint8_t none;
+ uint8_t family;
+ uint16_t port;
+ uint32_t ip;
+};
+
+static int stun_test(const char *server_ip, int server_port,
+ int tun_port)
+{
+ int ret, sock;
+ uint8_t pkt[256];
+ uint8_t rpkt[256];
+ size_t len, off, max;
+ struct in_addr in;
+ struct timeval timeout;
+ struct stun_header *hdr, *rhdr;
+ struct stun_attrib *attr;
+ struct stun_mapped_addr *addr;
+ struct sockaddr_in saddr, daddr;
+ fd_set fdset;
+
+ if (!server_ip)
+ return -EINVAL;
+
+ sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ if (sock < 0)
+ panic("Cannot obtain socket!\n");
+
+ set_reuseaddr(sock);
+
+ saddr.sin_family = PF_INET;
+ saddr.sin_port = htons(tun_port);
+ saddr.sin_addr.s_addr = INADDR_ANY;
+
+ ret = bind(sock, (struct sockaddr *) &saddr, sizeof(saddr));
+ if (ret)
+ panic("Cannot bind udp socket!\n");
+
+ len = REQUEST_LEN;
+ hdr = (struct stun_header *) pkt;
+ hdr->type = htons(BINDING_REQUEST);
+ hdr->len = 0;
+ hdr->magic_cookie = ID_COOKIE_FIELD;
+ hdr->transid[0] = htonl(rand());
+ hdr->transid[1] = htonl(rand());
+ hdr->transid[2] = htonl(rand());
+
+ daddr.sin_family = PF_INET;
+ daddr.sin_port = htons(server_port);
+ daddr.sin_addr.s_addr = inet_addr(server_ip);
+
+ ret = sendto(sock, pkt, len, 0, (struct sockaddr *) &daddr,
+ sizeof(daddr));
+ if (ret != len) {
+ printf("Error sending request (%s)!\n", strerror(errno));
+ return -EIO;
+ }
+
+ timeout.tv_sec = TIMEOUT / 1000;
+ timeout.tv_usec = (TIMEOUT % 1000) * 1000;
+
+ FD_ZERO(&fdset);
+ FD_SET(sock, &fdset);
+
+ ret = select(sock + 1, &fdset, NULL, NULL, &timeout);
+ if (ret <= 0) {
+ printf("STUN server timeout!\n");
+ return -EIO;
+ }
+
+ memset(rpkt, 0, sizeof(rpkt));
+ len = read(sock, rpkt, sizeof(rpkt));
+
+ close(sock);
+
+ if (len < REQUEST_LEN) {
+ printf("Bad STUN response (%s)!\n", strerror(errno));
+ return -EIO;
+ }
+
+ rhdr = (struct stun_header *) rpkt;
+ if (ntohs(rhdr->type) != BINDING_RESPONSE) {
+ printf("Wrong STUN response type!\n");
+ return -EIO;
+ }
+
+ if (rhdr->len == 0) {
+ printf("No attributes in STUN response!\n");
+ return -EIO;
+ }
+
+ if (rhdr->magic_cookie != hdr->magic_cookie ||
+ rhdr->transid[0] != hdr->transid[0] ||
+ rhdr->transid[1] != hdr->transid[1] ||
+ rhdr->transid[2] != hdr->transid[2]) {
+ printf("Got wrong STUN transaction id!\n");
+ return -EIO;
+ }
+
+ off = REQUEST_LEN;
+ max = ntohs(rhdr->len) + REQUEST_LEN;
+
+ while (off + 8 < max) {
+ attr = (struct stun_attrib *) (rpkt + off);
+ if (ntohs(attr->type) != MAPPED_ADDRESS)
+ goto next;
+
+ addr = (struct stun_mapped_addr *) (rpkt + off + 4);
+ if (addr->family != 0x1)
+ break;
+
+ in.s_addr = addr->ip;
+ printf("Public mapping %s:%u!\n",
+ inet_ntoa(in), ntohs(addr->port));
+ break;
+next:
+ off += 4;
+ off += ntohs(attr->len);
+ }
+
+ return 0;
+}
+
+int print_stun_probe(char *server, int sport, int tport)
+{
+ char *address;
+ struct hostent *hp;
+
+ printf("STUN on %s:%u\n", server, sport);
+
+ srand(time(NULL));
+ hp = gethostbyname(server);
+ if (!hp)
+ return -EIO;
+ address = inet_ntoa(*(struct in_addr *) hp->h_addr_list[0]);
+ return stun_test(address, sport, tport);
+}
diff --git a/test/dissector_fuzz.sh b/test/dissector_fuzz.sh
new file mode 100755
index 0000000..87d8b8b
--- /dev/null
+++ b/test/dissector_fuzz.sh
@@ -0,0 +1,68 @@
+#!/usr/bin/env bash
+
+# Note: build and _install_ the toolkit first!
+
+set -u
+
+if [ ${BASH_VERSINFO} -lt 3 ] ; then
+ echo 'Error: Your bash need to be version 3 or newer. Exiting.'
+ exit 1 # operators like =~ produce errors silently in old bash versions, so exit here
+fi
+
+archive='ftp://wireshark.org/automated/captures/'
+show_output='' # empty string evaluates to false
+run_through='' # empty string evaluates to false
+count_cores=0
+count_files=0
+netsniff_ng_opts=''
+
+if [ $# -gt 0 ] ; then
+ if [ "$1" = '-h' -o "$1" = '--help' -o "$1" = '--usage' ] ; then
+ echo 'Usage: dissector_fuzz [-s (show netsniff-ng output, default: no)] [-r (keep running on errors, default: no)] [netsniff-ng long-args]'
+ exit 0
+ fi
+
+ for opt in $@ ; do
+ if [ "${opt}" = '-s' ] ; then
+ show_output='true'
+ elif [ "${opt}" = '-r' ] ; then
+ run_through='true'
+ else
+ netsniff_ng_opts="${netsniff_ng_opts} ${opt}";
+ fi
+ done
+fi
+
+mkdir -p fuzzing
+cd fuzzing
+wget -r -Nc -np -nd -A.pcap "$archive" |& grep -E "%|^--"
+ulimit -c unlimited
+rm -f core
+for file in *.pcap
+do
+ echo "Testing file $file ..."
+ if [ $show_output ]; then
+ netsniff-ng --in "$file" "${netsniff_ng_opts}"
+ else
+ netsniff-ng --in "$file" "${netsniff_ng_opts}" > /dev/null
+ fi
+ if [ -e core ]; then
+ echo "Fuck, core dumped on $file!"
+ let count_cores=count_cores+1
+ if [ $run_through ]; then
+ rm core
+ else
+ exit
+ fi
+ fi
+done
+
+if which cowsay > /dev/null ; then
+ echo_cmd='cowsay'
+else
+ echo_cmd='echo'
+fi
+
+${echo_cmd} 'Your fuckup Score'
+echo " * tested pcaps: $count_files"
+echo " * core dumps: $count_cores"
diff --git a/tprintf.c b/tprintf.c
new file mode 100644
index 0000000..46e9574
--- /dev/null
+++ b/tprintf.c
@@ -0,0 +1,169 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Copyright 2013 Tobias Klauser.
+ * Subject to the GPL, version 2.
+ */
+
+#define _BSD_SOURCE
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <sys/ioctl.h>
+
+#include "xutils.h"
+#include "tprintf.h"
+#include "die.h"
+#include "locking.h"
+#include "built_in.h"
+
+#define term_trailing_size 5
+#define term_starting_size 3
+
+#define term_curr_size (get_tty_size() - term_trailing_size)
+
+static char buffer[1024];
+
+static volatile size_t buffer_use = 0;
+
+static struct spinlock buffer_lock;
+
+static int get_tty_size(void)
+{
+#ifdef TIOCGSIZE
+ struct ttysize ts = {0};
+
+ return (ioctl(0, TIOCGSIZE, &ts) == 0 ? ts.ts_cols : DEFAULT_TTY_SIZE);
+#elif defined(TIOCGWINSZ)
+ struct winsize ts;
+
+ return (ioctl(0, TIOCGWINSZ, &ts) == 0 ? ts.ws_col : DEFAULT_TTY_SIZE);
+#else
+ return DEFAULT_TTY_SIZE;
+#endif
+}
+
+static inline void __tprintf_flush_newline(void)
+{
+ int i;
+
+ fputc('\n', stdout);
+ for (i = 0; i < term_starting_size; ++i)
+ fputc(' ', stdout);
+}
+
+static inline int __tprintf_flush_skip(char *buffer, int i, size_t max)
+{
+ int val = buffer[i];
+
+ if (val == ' ' || val == ',')
+ return 1;
+
+ return 0;
+}
+
+static void __tprintf_flush(void)
+{
+ int i;
+ static ssize_t line_count = 0;
+ size_t term_len = term_curr_size;
+
+ for (i = 0; i < buffer_use; ++i) {
+ if (buffer[i] == '\n') {
+ term_len = term_curr_size;
+ line_count = -1;
+ }
+
+ if (line_count == term_len) {
+ __tprintf_flush_newline();
+ line_count = term_starting_size;
+
+ while (i < buffer_use &&
+ __tprintf_flush_skip(buffer, i, buffer_use))
+ i++;
+ }
+
+ fputc(buffer[i], stdout);
+ line_count++;
+ }
+
+ fflush(stdout);
+ buffer_use = 0;
+}
+
+void tprintf_flush(void)
+{
+ spinlock_lock(&buffer_lock);
+ __tprintf_flush();
+ spinlock_unlock(&buffer_lock);
+}
+
+void tprintf_init(void)
+{
+ spinlock_init(&buffer_lock);
+
+ setvbuf(stdout, NULL, _IONBF, 0);
+ setvbuf(stderr, NULL, _IONBF, 0);
+}
+
+void tprintf_cleanup(void)
+{
+ tprintf_flush();
+ spinlock_destroy(&buffer_lock);
+}
+
+void tprintf(char *msg, ...)
+{
+ ssize_t ret;
+ ssize_t avail;
+ va_list vl;
+
+ spinlock_lock(&buffer_lock);
+
+ avail = sizeof(buffer) - buffer_use;
+ bug_on(avail < 0);
+
+ va_start(vl, msg);
+ ret = vsnprintf(buffer + buffer_use, avail, msg, vl);
+ va_end(vl);
+
+ if (ret < 0)
+ panic("vsnprintf screwed up in tprintf!\n");
+ if (ret > sizeof(buffer))
+ panic("No mem in tprintf left!\n");
+ if (ret >= avail) {
+ __tprintf_flush();
+
+ avail = sizeof(buffer) - buffer_use;
+ bug_on(avail < 0);
+
+ va_start(vl, msg);
+ ret = vsnprintf(buffer + buffer_use, avail, msg, vl);
+ va_end(vl);
+
+ if (ret < 0)
+ panic("vsnprintf screwed up in tprintf!\n");
+ }
+
+ buffer_use += ret;
+
+ spinlock_unlock(&buffer_lock);
+}
+
+void tputchar_safe(int c)
+{
+ unsigned char ch = (unsigned char)(c & 0xff);
+
+ if (isprint(ch))
+ tprintf("%c", ch);
+ else
+ tprintf("\\0x%02x", ch);
+}
+
+void tputs_safe(const char *str, size_t len)
+{
+ while (len--) {
+ tputchar_safe(*str);
+ str++;
+ }
+}
diff --git a/tprintf.h b/tprintf.h
new file mode 100644
index 0000000..dc4349a
--- /dev/null
+++ b/tprintf.h
@@ -0,0 +1,27 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef TPRINTF_H
+#define TPRINTF_H
+
+#include "built_in.h"
+#include "colors.h"
+
+extern void tprintf_init(void);
+extern void tprintf(char *msg, ...) __check_format_printf(1, 2);
+extern void tprintf_flush(void);
+extern void tprintf_cleanup(void);
+
+extern void tputchar_safe(int c);
+extern void tputs_safe(const char *str, size_t len);
+
+#define colorize_start(fore) "\033[" __##fore "m"
+#define colorize_start_full(fore, back) "\033[" __##fore ";" __on_##back "m"
+#define colorize_end() "\033[" __reset "m"
+
+#define DEFAULT_TTY_SIZE 80
+
+#endif /* TPRINTF_H */
diff --git a/trafgen.c b/trafgen.c
new file mode 100644
index 0000000..03c12c5
--- /dev/null
+++ b/trafgen.c
@@ -0,0 +1,1064 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2011 - 2013 Daniel Borkmann <dborkma@tik.ee.ethz.ch>,
+ * Swiss federal institute of technology (ETH Zurich)
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <getopt.h>
+#include <ctype.h>
+#include <stdbool.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <sys/fsuid.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/wait.h>
+#include <sys/mman.h>
+#include <net/ethernet.h>
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#include <linux/icmp.h>
+#include <arpa/inet.h>
+#include <signal.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <time.h>
+#include <poll.h>
+#include <netdb.h>
+#include <math.h>
+#include <unistd.h>
+
+#include "xmalloc.h"
+#include "die.h"
+#include "mac80211.h"
+#include "xutils.h"
+#include "xio.h"
+#include "built_in.h"
+#include "trafgen_conf.h"
+#include "tprintf.h"
+#include "ring_tx.h"
+#include "csum.h"
+
+struct ctx {
+ bool rand, rfraw, jumbo_support, verbose, smoke_test, enforce;
+ unsigned long kpull, num, gap, reserve_size, cpus;
+ uid_t uid; gid_t gid; char *device, *device_trans, *rhost;
+ struct sockaddr_in dest;
+};
+
+struct cpu_stats {
+ unsigned long tv_sec, tv_usec;
+ unsigned long long tx_packets, tx_bytes;
+ unsigned long long cf_packets, cf_bytes;
+ unsigned long long cd_packets;
+ sig_atomic_t state;
+};
+
+sig_atomic_t sigint = 0;
+
+struct packet *packets = NULL;
+size_t plen = 0;
+
+struct packet_dyn *packet_dyn = NULL;
+size_t dlen = 0;
+
+static const char *short_options = "d:c:n:t:vJhS:rk:i:o:VRs:P:eE:pu:g:";
+static const struct option long_options[] = {
+ {"dev", required_argument, NULL, 'd'},
+ {"out", required_argument, NULL, 'o'},
+ {"in", required_argument, NULL, 'i'},
+ {"conf", required_argument, NULL, 'c'},
+ {"num", required_argument, NULL, 'n'},
+ {"gap", required_argument, NULL, 't'},
+ {"cpus", required_argument, NULL, 'P'},
+ {"ring-size", required_argument, NULL, 'S'},
+ {"kernel-pull", required_argument, NULL, 'k'},
+ {"smoke-test", required_argument, NULL, 's'},
+ {"seed", required_argument, NULL, 'E'},
+ {"user", required_argument, NULL, 'u'},
+ {"group", required_argument, NULL, 'g'},
+ {"jumbo-support", no_argument, NULL, 'J'},
+ {"cpp", no_argument, NULL, 'p'},
+ {"rfraw", no_argument, NULL, 'R'},
+ {"rand", no_argument, NULL, 'r'},
+ {"verbose", no_argument, NULL, 'V'},
+ {"version", no_argument, NULL, 'v'},
+ {"example", no_argument, NULL, 'e'},
+ {"help", no_argument, NULL, 'h'},
+ {NULL, 0, NULL, 0}
+};
+
+static int sock;
+
+static struct itimerval itimer;
+
+static unsigned long interval = TX_KERNEL_PULL_INT;
+
+static struct cpu_stats *stats;
+
+unsigned int seed;
+
+#define CPU_STATS_STATE_CFG 1
+#define CPU_STATS_STATE_CHK 2
+#define CPU_STATS_STATE_RES 4
+
+#ifndef ICMP_FILTER
+# define ICMP_FILTER 1
+
+struct icmp_filter {
+ __u32 data;
+};
+#endif
+
+static void signal_handler(int number)
+{
+ switch (number) {
+ case SIGINT:
+ sigint = 1;
+ case SIGHUP:
+ default:
+ break;
+ }
+}
+
+static void timer_elapsed(int number)
+{
+ set_itimer_interval_value(&itimer, 0, interval);
+ pull_and_flush_tx_ring(sock);
+ setitimer(ITIMER_REAL, &itimer, NULL);
+}
+
+static void help(void)
+{
+ printf("\ntrafgen %s, multithreaded zero-copy network packet generator\n", VERSION_STRING);
+ puts("http://www.netsniff-ng.org\n\n"
+ "Usage: trafgen [options]\n"
+ "Options:\n"
+ " -i|-c|--in|--conf <cfg/-> Packet configuration file/stdin\n"
+ " -o|-d|--out|--dev <netdev> Networking device i.e., eth0\n"
+ " -p|--cpp Run packet config through C preprocessor\n"
+ " -J|--jumbo-support Support 64KB super jumbo frames (def: 2048B)\n"
+ " -R|--rfraw Inject raw 802.11 frames\n"
+ " -s|--smoke-test <ipv4> Probe if machine survived fuzz-tested packet\n"
+ " -n|--num <uint> Number of packets until exit (def: 0)\n"
+ " -r|--rand Randomize packet selection (def: round robin)\n"
+ " -P|--cpus <uint> Specify number of forks(<= CPUs) (def: #CPUs)\n"
+ " -t|--gap <uint> Interpacket gap in us (approx)\n"
+ " -S|--ring-size <size> Manually set mmap size (KiB/MiB/GiB)\n"
+ " -k|--kernel-pull <uint> Kernel batch interval in us (def: 10us)\n"
+ " -E|--seed <uint> Manually set srand(3) seed\n"
+ " -u|--user <userid> Drop privileges and change to userid\n"
+ " -g|--group <groupid> Drop privileges and change to groupid\n"
+ " -V|--verbose Be more verbose\n"
+ " -v|--version Show version\n"
+ " -e|--example Show built-in packet config example\n"
+ " -h|--help Guess what?!\n\n"
+ "Examples:\n"
+ " See trafgen.txf for configuration file examples.\n"
+ " trafgen --dev eth0 --conf trafgen.cfg\n"
+ " trafgen -e | trafgen -i - -o eth0 --cpp -n 1\n"
+ " trafgen --dev eth0 --conf fuzzing.cfg --smoke-test 10.0.0.1\n"
+ " trafgen --dev wlan0 --rfraw --conf beacon-test.txf -V --cpus 2\n"
+ " trafgen --dev eth0 --conf frag_dos.cfg --rand --gap 1000\n"
+ " trafgen --dev eth0 --conf icmp.cfg --rand --num 1400000 -k1000\n"
+ " trafgen --dev eth0 --conf tcp_syn.cfg -u `id -u bob` -g `id -g bob`\n\n"
+ "Arbitrary packet config examples (e.g. trafgen -e > trafgen.cfg):\n"
+ " Run packet on all CPUs: { fill(0xff, 64) csum16(0, 64) }\n"
+ " Run packet only on CPU1: cpu(1): { rnd(64), 0b11001100, 0xaa }\n"
+ " Run packet only on CPU1-2: cpu(1:2): { drnd(64),'a',csum16(1, 8),'b',42 }\n\n"
+ "Note:\n"
+ " Smoke/fuzz test example: machine A, 10.0.0.2 (trafgen) is directly\n"
+ " connected to machine B (test kernel), 10.0.0.1. If ICMP reply fails\n"
+ " we assume the kernel crashed, thus we print the packet and quit.\n"
+ " In case you find a ping-of-death, please mention trafgen in your\n"
+ " commit message of the fix!\n\n"
+ " For introducing bit errors, delays with random variation and more,\n"
+ " make use of tc(8) with its different disciplines, i.e. netem.\n\n"
+ " For generating different package distributions, you can use scripting\n"
+ " to generate a trafgen config file with packet ratios as:\n\n"
+ " IMIX 64:7, 570:4, 1518:1\n"
+ " Tolly 64:55, 78:5, 576:17, 1518:23\n"
+ " Cisco 64:7, 594:4, 1518:1\n"
+ " RPR Trimodal 64:60, 512:20, 1518:20\n"
+ " RPR Quadrimodal 64:50, 512:15, 1518:15, 9218:20\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 example(void)
+{
+ const char *e =
+ "/* Note: dynamic elements make trafgen slower! */\n"
+ "#include <stddef.h>\n\n"
+ "{\n"
+ " /* MAC Destination */\n"
+ " fill(0xff, ETH_ALEN),\n"
+ " /* MAC Source */\n"
+ " 0x00, 0x02, 0xb3, drnd(3),\n"
+ " /* IPv4 Protocol */\n"
+ " c16(ETH_P_IP),\n"
+ " /* IPv4 Version, IHL, TOS */\n"
+ " 0b01000101, 0,\n"
+ " /* IPv4 Total Len */\n"
+ " c16(58),\n"
+ " /* IPv4 Ident */\n"
+ " drnd(2),\n"
+ " /* IPv4 Flags, Frag Off */\n"
+ " 0b01000000, 0,\n"
+ " /* IPv4 TTL */\n"
+ " 64,\n"
+ " /* Proto TCP */\n"
+ " 0x06,\n"
+ " /* IPv4 Checksum (IP header from, to) */\n"
+ " csumip(14, 33),\n"
+ " /* Source IP */\n"
+ " drnd(4),\n"
+ " /* Dest IP */\n"
+ " drnd(4),\n"
+ " /* TCP Source Port */\n"
+ " drnd(2),\n"
+ " /* TCP Dest Port */\n"
+ " c16(80),\n"
+ " /* TCP Sequence Number */\n"
+ " drnd(4),\n"
+ " /* TCP Ackn. Number */\n"
+ " c32(0),\n"
+ " /* TCP Header length + TCP SYN/ECN Flag */\n"
+ " c16((8 << 12) | TCP_FLAG_SYN | TCP_FLAG_ECE)\n"
+ " /* Window Size */\n"
+ " c16(16),\n"
+ " /* TCP Checksum (offset IP, offset TCP) */\n"
+ " csumtcp(14, 34),\n"
+ " /* TCP Options */\n"
+ " 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x06,\n"
+ " 0x91, 0x68, 0x7d, 0x06, 0x91, 0x68, 0x6f,\n"
+ " /* Data blob */\n"
+ " \"gotcha!\",\n"
+ "}";
+ puts(e);
+ die();
+}
+
+static void version(void)
+{
+ printf("\ntrafgen %s, multithreaded zero-copy network packet generator\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 apply_counter(int counter_id)
+{
+ int j, i = counter_id;
+ size_t counter_max = packet_dyn[i].clen;
+
+ for (j = 0; j < counter_max; ++j) {
+ uint8_t val;
+ struct counter *counter = &packet_dyn[i].cnt[j];
+
+ val = counter->val - counter->min;
+
+ switch (counter->type) {
+ case TYPE_INC:
+ val = (val + counter->inc) % (counter->max - counter->min + 1);
+ break;
+ case TYPE_DEC:
+ val = (val - counter->inc) % (counter->min - counter->max + 1);
+ break;
+ default:
+ bug();
+ }
+
+ counter->val = val + counter->min;
+ packets[i].payload[counter->off] = val;
+ }
+}
+
+static void apply_randomizer(int rand_id)
+{
+ int j, i = rand_id;
+ size_t rand_max = packet_dyn[i].rlen;
+
+ for (j = 0; j < rand_max; ++j) {
+ uint8_t val = (uint8_t) rand();
+ struct randomizer *randomizer = &packet_dyn[i].rnd[j];
+
+ packets[i].payload[randomizer->off] = val;
+ }
+}
+
+static void apply_csum16(int csum_id)
+{
+ int j, i = csum_id;
+ size_t csum_max = packet_dyn[i].slen;
+
+ for (j = 0; j < csum_max; ++j) {
+ uint16_t sum = 0;
+ struct csum16 *csum = &packet_dyn[i].csum[j];
+
+ fmemset(&packets[i].payload[csum->off], 0, sizeof(sum));
+
+ switch (csum->which) {
+ case CSUM_IP:
+ if (csum->to >= packets[i].len)
+ csum->to = packets[i].len - 1;
+ sum = calc_csum(packets[i].payload + csum->from,
+ csum->to - csum->from + 1, 0);
+ break;
+ case CSUM_UDP:
+ sum = p4_csum((void *) packets[i].payload + csum->from,
+ packets[i].payload + csum->to,
+ (packets[i].len - csum->to),
+ IPPROTO_UDP);
+ break;
+ case CSUM_TCP:
+ sum = p4_csum((void *) packets[i].payload + csum->from,
+ packets[i].payload + csum->to,
+ (packets[i].len - csum->to),
+ IPPROTO_TCP);
+ break;
+ }
+
+ fmemcpy(&packets[i].payload[csum->off], &sum, sizeof(sum));
+ }
+}
+
+static struct cpu_stats *setup_shared_var(unsigned long cpus)
+{
+ int fd;
+ char zbuff[cpus * sizeof(struct cpu_stats)], file[256];
+ struct cpu_stats *buff;
+
+ fmemset(zbuff, 0, sizeof(zbuff));
+ slprintf(file, sizeof(file), ".tmp_mmap.%u", (unsigned int) rand());
+
+ fd = creat(file, S_IRUSR | S_IWUSR);
+ bug_on(fd < 0);
+ close(fd);
+
+ fd = open_or_die_m(file, O_RDWR | O_CREAT | O_TRUNC,
+ S_IRUSR | S_IWUSR);
+ write_or_die(fd, zbuff, sizeof(zbuff));
+
+ buff = (void *) mmap(0, sizeof(zbuff), PROT_READ | PROT_WRITE,
+ MAP_SHARED, fd, 0);
+ if (buff == (void *) -1)
+ panic("Cannot setup shared variable!\n");
+
+ close(fd);
+ unlink(file);
+
+ memset(buff, 0, sizeof(zbuff));
+
+ return buff;
+}
+
+static void destroy_shared_var(void *buff, unsigned long cpus)
+{
+ munmap(buff, cpus * sizeof(struct cpu_stats));
+}
+
+static void dump_trafgen_snippet(uint8_t *payload, size_t len)
+{
+ int i;
+
+ printf("{");
+ for (i = 0; i < len; ++i) {
+ if (i % 15 == 0)
+ printf("\n ");
+ printf("0x%02x, ", payload[i]);
+ }
+ printf("\n}\n");
+ fflush(stdout);
+}
+
+static int xmit_smoke_setup(struct ctx *ctx)
+{
+ int icmp_sock, ret, ttl = 64;
+ struct icmp_filter filter;
+
+ icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
+ if (icmp_sock < 0)
+ panic("Cannot get a ICMP socket: %s!\n", strerror(errno));
+
+ filter.data = ~(1 << ICMP_ECHOREPLY);
+
+ ret = setsockopt(icmp_sock, SOL_RAW, ICMP_FILTER, &filter, sizeof(filter));
+ if (ret < 0)
+ panic("Cannot install filter!\n");
+
+ ret = setsockopt(icmp_sock, SOL_IP, IP_TTL, &ttl, sizeof(ttl));
+ if (ret < 0)
+ panic("Cannot set TTL!\n");
+
+ memset(&ctx->dest, 0, sizeof(ctx->dest));
+ ctx->dest.sin_family = AF_INET;
+ ctx->dest.sin_port = 0;
+
+ ret = inet_aton(ctx->rhost, &ctx->dest.sin_addr);
+ if (ret < 0)
+ panic("Cannot resolv address!\n");
+
+ return icmp_sock;
+}
+
+static int xmit_smoke_probe(int icmp_sock, struct ctx *ctx)
+{
+ int ret, i, j = 0, probes = 100;
+ short ident, cnt = 1, idstore[probes];
+ uint8_t outpack[512], *data;
+ struct icmphdr *icmp;
+ struct iphdr *ip;
+ size_t len = sizeof(*icmp) + 56;
+ struct sockaddr_in from;
+ socklen_t from_len;
+ struct pollfd fds = {
+ .fd = icmp_sock,
+ .events = POLLIN,
+ };
+
+ fmemset(idstore, 0, sizeof(idstore));
+ while (probes-- > 0) {
+ while ((ident = htons((short) rand())) == 0)
+ sleep(0);
+ idstore[j++] = ident;
+
+ memset(outpack, 0, sizeof(outpack));
+ icmp = (void *) outpack;
+ icmp->type = ICMP_ECHO;
+ icmp->code = 0;
+ icmp->checksum = 0;
+ icmp->un.echo.id = ident;
+ icmp->un.echo.sequence = htons(cnt++);
+
+ data = ((uint8_t *) outpack + sizeof(*icmp));
+ for (i = 0; i < 56; ++i)
+ data[i] = (uint8_t) rand();
+
+ icmp->checksum = csum((unsigned short *) outpack,
+ len / sizeof(unsigned short));
+
+ ret = sendto(icmp_sock, outpack, len, MSG_DONTWAIT,
+ (struct sockaddr *) &ctx->dest, sizeof(ctx->dest));
+ if (unlikely(ret != len))
+ panic("Cannot send out probe: %s!\n", strerror(errno));
+
+ ret = poll(&fds, 1, 50);
+ if (ret < 0)
+ panic("Poll failed!\n");
+
+ if (fds.revents & POLLIN) {
+ ret = recvfrom(icmp_sock, outpack, sizeof(outpack), 0,
+ (struct sockaddr *) &from, &from_len);
+ if (unlikely(ret <= 0))
+ panic("Probe receive failed!\n");
+ if (unlikely(from_len != sizeof(ctx->dest)))
+ continue;
+ if (unlikely(memcmp(&from, &ctx->dest, sizeof(ctx->dest))))
+ continue;
+ if (unlikely(ret < sizeof(*ip) + sizeof(*icmp)))
+ continue;
+ ip = (void *) outpack;
+ if (unlikely(ip->ihl * 4 + sizeof(*icmp) > ret))
+ continue;
+ icmp = (void *) outpack + ip->ihl * 4;
+ for (i = 0; i < array_size(idstore); ++i) {
+ if (unlikely(icmp->un.echo.id != idstore[i]))
+ continue;
+ return 0;
+ }
+ }
+ }
+
+ return -1;
+}
+
+static void xmit_slowpath_or_die(struct ctx *ctx, int cpu)
+{
+ int ret, icmp_sock = -1;
+ unsigned long num = 1, i = 0;
+ struct timeval start, end, diff;
+ unsigned long long tx_bytes = 0, tx_packets = 0;
+ struct packet_dyn *pktd;
+ struct sockaddr_ll saddr = {
+ .sll_family = PF_PACKET,
+ .sll_halen = ETH_ALEN,
+ .sll_ifindex = device_ifindex(ctx->device),
+ };
+
+ if (ctx->num > 0)
+ num = ctx->num;
+
+ if (ctx->smoke_test)
+ icmp_sock = xmit_smoke_setup(ctx);
+
+ drop_privileges(ctx->enforce, ctx->uid, ctx->gid);
+
+ bug_on(gettimeofday(&start, NULL));
+
+ while (likely(sigint == 0) && likely(num > 0)) {
+ pktd = &packet_dyn[i];
+ if (pktd->clen + pktd->rlen + pktd->slen) {
+ apply_counter(i);
+ apply_randomizer(i);
+ apply_csum16(i);
+ }
+retry:
+ ret = sendto(sock, packets[i].payload, packets[i].len, 0,
+ (struct sockaddr *) &saddr, sizeof(saddr));
+ if (unlikely(ret < 0)) {
+ if (errno == ENOBUFS) {
+ sched_yield();
+ goto retry;
+ }
+
+ panic("Sendto error: %s!\n", strerror(errno));
+ }
+
+ tx_bytes += packets[i].len;
+ tx_packets++;
+
+ if (ctx->smoke_test) {
+ ret = xmit_smoke_probe(icmp_sock, ctx);
+ if (unlikely(ret < 0)) {
+ printf("%sSmoke test alert:%s\n", colorize_start(bold), colorize_end());
+ printf(" Remote host seems to be unresponsive to ICMP probes!\n");
+ printf(" Last instance was packet%lu, seed:%u, trafgen snippet:\n\n",
+ i, seed);
+
+ dump_trafgen_snippet(packets[i].payload, packets[i].len);
+ break;
+ }
+ }
+
+ if (!ctx->rand) {
+ i++;
+ if (i >= plen)
+ i = 0;
+ } else
+ i = rand() % plen;
+
+ if (ctx->num > 0)
+ num--;
+
+ if (ctx->gap > 0)
+ usleep(ctx->gap);
+ }
+
+ bug_on(gettimeofday(&end, NULL));
+ timersub(&end, &start, &diff);
+
+ if (ctx->smoke_test)
+ close(icmp_sock);
+
+ stats[cpu].tx_packets = tx_packets;
+ stats[cpu].tx_bytes = tx_bytes;
+ stats[cpu].tv_sec = diff.tv_sec;
+ stats[cpu].tv_usec = diff.tv_usec;
+
+ stats[cpu].state |= CPU_STATS_STATE_RES;
+}
+
+static void xmit_fastpath_or_die(struct ctx *ctx, int cpu)
+{
+ int ifindex = device_ifindex(ctx->device);
+ uint8_t *out = NULL;
+ unsigned int it = 0;
+ unsigned long num = 1, i = 0, size;
+ struct ring tx_ring;
+ struct frame_map *hdr;
+ struct timeval start, end, diff;
+ struct packet_dyn *pktd;
+ unsigned long long tx_bytes = 0, tx_packets = 0;
+
+ fmemset(&tx_ring, 0, sizeof(tx_ring));
+
+ size = ring_size(ctx->device, ctx->reserve_size);
+
+ set_sock_prio(sock, 512);
+ set_packet_loss_discard(sock);
+
+ setup_tx_ring_layout(sock, &tx_ring, size, ctx->jumbo_support);
+ create_tx_ring(sock, &tx_ring, ctx->verbose);
+ mmap_tx_ring(sock, &tx_ring);
+ alloc_tx_ring_frames(&tx_ring);
+ bind_tx_ring(sock, &tx_ring, ifindex);
+
+ drop_privileges(ctx->enforce, ctx->uid, ctx->gid);
+
+ if (ctx->kpull)
+ interval = ctx->kpull;
+ if (ctx->num > 0)
+ num = ctx->num;
+
+ set_itimer_interval_value(&itimer, 0, interval);
+ setitimer(ITIMER_REAL, &itimer, NULL);
+
+ bug_on(gettimeofday(&start, NULL));
+
+ while (likely(sigint == 0) && likely(num > 0)) {
+ while (user_may_pull_from_tx(tx_ring.frames[it].iov_base) && likely(num > 0)) {
+ hdr = tx_ring.frames[it].iov_base;
+ out = ((uint8_t *) hdr) + TPACKET2_HDRLEN - sizeof(struct sockaddr_ll);
+
+ hdr->tp_h.tp_snaplen = packets[i].len;
+ hdr->tp_h.tp_len = packets[i].len;
+
+ pktd = &packet_dyn[i];
+ if (pktd->clen + pktd->rlen + pktd->slen) {
+ apply_counter(i);
+ apply_randomizer(i);
+ apply_csum16(i);
+ }
+
+ fmemcpy(out, packets[i].payload, packets[i].len);
+
+ tx_bytes += packets[i].len;
+ tx_packets++;
+
+ if (!ctx->rand) {
+ i++;
+ if (i >= plen)
+ i = 0;
+ } else
+ i = rand() % plen;
+
+ kernel_may_pull_from_tx(&hdr->tp_h);
+
+ it++;
+ if (it >= tx_ring.layout.tp_frame_nr)
+ it = 0;
+
+ if (ctx->num > 0)
+ num--;
+
+ if (unlikely(sigint == 1))
+ break;
+ }
+ }
+
+ bug_on(gettimeofday(&end, NULL));
+ timersub(&end, &start, &diff);
+
+ destroy_tx_ring(sock, &tx_ring);
+
+ stats[cpu].tx_packets = tx_packets;
+ stats[cpu].tx_bytes = tx_bytes;
+ stats[cpu].tv_sec = diff.tv_sec;
+ stats[cpu].tv_usec = diff.tv_usec;
+
+ stats[cpu].state |= CPU_STATS_STATE_RES;
+}
+
+static inline void __set_state(int cpu, sig_atomic_t s)
+{
+ stats[cpu].state = s;
+}
+
+static inline sig_atomic_t __get_state(int cpu)
+{
+ return stats[cpu].state;
+}
+
+static unsigned long __wait_and_sum_others(struct ctx *ctx, int cpu)
+{
+ int i;
+ unsigned long total;
+
+ for (i = 0, total = plen; i < ctx->cpus; i++) {
+ if (i == cpu)
+ continue;
+
+ while ((__get_state(i) & CPU_STATS_STATE_CFG) == 0 &&
+ sigint == 0)
+ sched_yield();
+
+ total += stats[i].cf_packets;
+ }
+
+ return total;
+}
+
+static void __correct_global_delta(struct ctx *ctx, int cpu, unsigned long orig)
+{
+ int i, cpu_sel;
+ unsigned long total;
+ long long delta_correction = 0;
+
+ for (i = 0, total = ctx->num; i < ctx->cpus; i++) {
+ if (i == cpu)
+ continue;
+
+ while ((__get_state(i) & CPU_STATS_STATE_CHK) == 0 &&
+ sigint == 0)
+ sched_yield();
+
+ total += stats[i].cd_packets;
+ }
+
+ if (total > orig)
+ delta_correction = -1 * ((long long) total - orig);
+ if (total < orig)
+ delta_correction = +1 * ((long long) orig - total);
+
+ for (cpu_sel = -1, i = 0; i < ctx->cpus; i++) {
+ if (stats[i].cd_packets > 0) {
+ if ((long long) stats[i].cd_packets +
+ delta_correction > 0) {
+ cpu_sel = i;
+ break;
+ }
+ }
+ }
+
+ if (cpu == cpu_sel)
+ ctx->num += delta_correction;
+}
+
+static void __set_state_cf(int cpu, unsigned long p, unsigned long b,
+ sig_atomic_t s)
+{
+ stats[cpu].cf_packets = p;
+ stats[cpu].cf_bytes = b;
+ stats[cpu].state = s;
+}
+
+static void __set_state_cd(int cpu, unsigned long p, sig_atomic_t s)
+{
+ stats[cpu].cd_packets = p;
+ stats[cpu].state = s;
+}
+
+static int xmit_packet_precheck(struct ctx *ctx, int cpu)
+{
+ int i;
+ unsigned long plen_total, orig = ctx->num;
+ size_t mtu, total_len = 0;
+
+ bug_on(plen != dlen);
+
+ for (i = 0; i < plen; ++i)
+ total_len += packets[i].len;
+
+ __set_state_cf(cpu, plen, total_len, CPU_STATS_STATE_CFG);
+ plen_total = __wait_and_sum_others(ctx, cpu);
+
+ if (orig > 0) {
+ ctx->num = (unsigned long) nearbyint((1.0 * plen / plen_total) * orig);
+
+ __set_state_cd(cpu, ctx->num, CPU_STATS_STATE_CHK |
+ CPU_STATS_STATE_CFG);
+ __correct_global_delta(ctx, cpu, orig);
+ }
+
+ if (plen == 0) {
+ __set_state(cpu, CPU_STATS_STATE_RES);
+ return -1;
+ }
+
+ for (mtu = device_mtu(ctx->device), i = 0; i < plen; ++i) {
+ if (packets[i].len > mtu + 14)
+ panic("Device MTU < than packet%d's size!\n", i);
+ if (packets[i].len <= 14)
+ panic("Packet%d's size too short!\n", i);
+ }
+
+ return 0;
+}
+
+static void main_loop(struct ctx *ctx, char *confname, bool slow,
+ int cpu, bool invoke_cpp)
+{
+ compile_packets(confname, ctx->verbose, cpu, invoke_cpp);
+ if (xmit_packet_precheck(ctx, cpu) < 0)
+ return;
+
+ if (cpu == 0) {
+ int i;
+ size_t total_len = 0, total_pkts = 0;
+
+ for (i = 0; i < ctx->cpus; ++i) {
+ total_len += stats[i].cf_bytes;
+ total_pkts += stats[i].cf_packets;
+ }
+
+ printf("%6zu packets to schedule\n", total_pkts);
+ printf("%6zu bytes in total\n", total_len);
+ printf("Running! Hang up with ^C!\n\n");
+ fflush(stdout);
+ }
+
+ sock = pf_socket();
+
+ if (slow)
+ xmit_slowpath_or_die(ctx, cpu);
+ else
+ xmit_fastpath_or_die(ctx, cpu);
+
+ close(sock);
+
+ cleanup_packets();
+}
+
+static unsigned int generate_srand_seed(void)
+{
+ int fd;
+ unsigned int seed;
+
+ fd = open("/dev/urandom", O_RDONLY);
+ if (fd < 0)
+ return time(0);
+
+ read_or_die(fd, &seed, sizeof(seed));
+
+ close(fd);
+ return seed;
+}
+
+int main(int argc, char **argv)
+{
+ bool slow = false, invoke_cpp = false, reseed = true;
+ int c, opt_index, i, j, vals[4] = {0}, irq;
+ char *confname = NULL, *ptr;
+ unsigned long cpus_tmp;
+ unsigned long long tx_packets, tx_bytes;
+ struct ctx ctx;
+
+ fmemset(&ctx, 0, sizeof(ctx));
+ ctx.cpus = get_number_cpus_online();
+ ctx.uid = getuid();
+ ctx.gid = getgid();
+
+ while ((c = getopt_long(argc, argv, short_options, long_options,
+ &opt_index)) != EOF) {
+ switch (c) {
+ case 'h':
+ help();
+ break;
+ case 'v':
+ version();
+ break;
+ case 'e':
+ example();
+ break;
+ case 'p':
+ invoke_cpp = true;
+ break;
+ case 'V':
+ ctx.verbose = true;
+ break;
+ case 'P':
+ cpus_tmp = strtoul(optarg, NULL, 0);
+ if (cpus_tmp > 0 && cpus_tmp < ctx.cpus)
+ ctx.cpus = cpus_tmp;
+ break;
+ case 'd':
+ case 'o':
+ ctx.device = xstrndup(optarg, IFNAMSIZ);
+ break;
+ case 'r':
+ ctx.rand = true;
+ break;
+ case 's':
+ slow = true;
+ ctx.cpus = 1;
+ ctx.smoke_test = true;
+ ctx.rhost = xstrdup(optarg);
+ break;
+ case 'R':
+ ctx.rfraw = true;
+ break;
+ case 'J':
+ ctx.jumbo_support = true;
+ break;
+ case 'c':
+ case 'i':
+ confname = xstrdup(optarg);
+ if (!strncmp("-", confname, strlen("-")))
+ ctx.cpus = 1;
+ break;
+ case 'u':
+ ctx.uid = strtoul(optarg, NULL, 0);
+ ctx.enforce = true;
+ break;
+ case 'g':
+ ctx.gid = strtoul(optarg, NULL, 0);
+ ctx.enforce = true;
+ break;
+ case 'k':
+ ctx.kpull = strtoul(optarg, NULL, 0);
+ break;
+ case 'E':
+ seed = strtoul(optarg, NULL, 0);
+ reseed = false;
+ break;
+ case 'n':
+ ctx.num = strtoul(optarg, NULL, 0);
+ break;
+ case 't':
+ slow = true;
+ ctx.gap = strtoul(optarg, NULL, 0);
+ if (ctx.gap > 0)
+ /* Fall back to single core to not
+ * mess up correct timing. We are slow
+ * anyway!
+ */
+ ctx.cpus = 1;
+ break;
+ case 'S':
+ ptr = optarg;
+ ctx.reserve_size = 0;
+
+ for (j = i = strlen(optarg); i > 0; --i) {
+ if (!isdigit(optarg[j - i]))
+ break;
+ ptr++;
+ }
+
+ if (!strncmp(ptr, "KiB", strlen("KiB")))
+ ctx.reserve_size = 1 << 10;
+ else if (!strncmp(ptr, "MiB", strlen("MiB")))
+ ctx.reserve_size = 1 << 20;
+ else if (!strncmp(ptr, "GiB", strlen("GiB")))
+ ctx.reserve_size = 1 << 30;
+ else
+ panic("Syntax error in ring size param!\n");
+ *ptr = 0;
+
+ ctx.reserve_size *= strtol(optarg, NULL, 0);
+ break;
+ case '?':
+ switch (optopt) {
+ case 'd':
+ case 'c':
+ case 'n':
+ case 'S':
+ case 's':
+ case 'P':
+ case 'o':
+ case 'E':
+ case 'i':
+ case 'k':
+ case 'u':
+ case 'g':
+ case 't':
+ 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 < 5)
+ help();
+ if (ctx.device == NULL)
+ panic("No networking device given!\n");
+ if (confname == NULL)
+ panic("No configuration file given!\n");
+ if (device_mtu(ctx.device) == 0)
+ panic("This is no networking device!\n");
+ if (!ctx.rfraw && device_up_and_running(ctx.device) == 0)
+ panic("Networking device not running!\n");
+
+ register_signal(SIGINT, signal_handler);
+ register_signal(SIGHUP, signal_handler);
+ register_signal_f(SIGALRM, timer_elapsed, SA_SIGINFO);
+
+ set_system_socket_memory(vals, array_size(vals));
+ xlockme();
+
+ if (ctx.rfraw) {
+ ctx.device_trans = xstrdup(ctx.device);
+ xfree(ctx.device);
+
+ enter_rfmon_mac80211(ctx.device_trans, &ctx.device);
+ sleep(0);
+ }
+
+ irq = device_irq_number(ctx.device);
+ device_set_irq_affinity_list(irq, 0, ctx.cpus - 1);
+
+ if (ctx.num > 0 && ctx.num <= ctx.cpus)
+ ctx.cpus = 1;
+
+ stats = setup_shared_var(ctx.cpus);
+
+ for (i = 0; i < ctx.cpus; i++) {
+ pid_t pid = fork();
+
+ switch (pid) {
+ case 0:
+ if (reseed)
+ seed = generate_srand_seed();
+ srand(seed);
+
+ cpu_affinity(i);
+ main_loop(&ctx, confname, slow, i, invoke_cpp);
+
+ goto thread_out;
+ case -1:
+ panic("Cannot fork processes!\n");
+ }
+ }
+
+ for (i = 0; i < ctx.cpus; i++) {
+ int status;
+
+ wait(&status);
+ if (WEXITSTATUS(status) == EXIT_FAILURE)
+ die();
+ }
+
+ if (ctx.rfraw)
+ leave_rfmon_mac80211(ctx.device_trans, ctx.device);
+
+ reset_system_socket_memory(vals, array_size(vals));
+
+ for (i = 0, tx_packets = tx_bytes = 0; i < ctx.cpus; i++) {
+ while ((__get_state(i) & CPU_STATS_STATE_RES) == 0)
+ sched_yield();
+
+ tx_packets += stats[i].tx_packets;
+ tx_bytes += stats[i].tx_bytes;
+ }
+
+ fflush(stdout);
+ printf("\n");
+ printf("\r%12llu packets outgoing\n", tx_packets);
+ printf("\r%12llu bytes outgoing\n", tx_bytes);
+ for (i = 0; i < ctx.cpus; i++) {
+ printf("\r%12lu sec, %lu usec on CPU%d (%llu packets)\n",
+ stats[i].tv_sec, stats[i].tv_usec, i,
+ stats[i].tx_packets);
+ }
+
+thread_out:
+ xunlockme();
+ destroy_shared_var(stats, ctx.cpus);
+
+ free(ctx.device);
+ free(ctx.device_trans);
+ free(ctx.rhost);
+ free(confname);
+
+ return 0;
+}
diff --git a/trafgen/.gitignore b/trafgen/.gitignore
new file mode 100644
index 0000000..32aad4d
--- /dev/null
+++ b/trafgen/.gitignore
@@ -0,0 +1,4 @@
+*.*
+
+!.gitignore
+!Makefile
diff --git a/trafgen/Makefile b/trafgen/Makefile
new file mode 100644
index 0000000..289aa28
--- /dev/null
+++ b/trafgen/Makefile
@@ -0,0 +1,16 @@
+trafgen-libs = -lnl-genl-3 \
+ -lnl-3 \
+ -lm
+
+trafgen-objs = xmalloc.o \
+ xio.o \
+ xutils.o \
+ mac80211.o \
+ ring_tx.o \
+ trafgen_lexer.yy.o \
+ trafgen_parser.tab.o \
+ trafgen.o
+
+trafgen-lex = trafgen_lexer.yy.o
+
+trafgen-yaac = trafgen_parser.tab.o
diff --git a/trafgen_conf.h b/trafgen_conf.h
new file mode 100644
index 0000000..7281b59
--- /dev/null
+++ b/trafgen_conf.h
@@ -0,0 +1,55 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef TRAFGEN_CONF
+#define TRAFGEN_CONF
+
+#include <stdint.h>
+#include <stdio.h>
+#include <sys/types.h>
+
+#define TYPE_INC 0
+#define TYPE_DEC 1
+
+enum csum {
+ CSUM_IP,
+ CSUM_UDP,
+ CSUM_TCP,
+};
+
+struct counter {
+ int type;
+ uint8_t min, max, inc, val;
+ off_t off;
+};
+
+struct randomizer {
+ off_t off;
+};
+
+struct csum16 {
+ off_t off, from, to;
+ enum csum which;
+};
+
+struct packet {
+ uint8_t *payload;
+ size_t len;
+};
+
+struct packet_dyn {
+ struct counter *cnt;
+ size_t clen;
+ struct randomizer *rnd;
+ size_t rlen;
+ struct csum16 *csum;
+ size_t slen;
+};
+
+extern int compile_packets(char *file, int verbose, int cpu, bool invoke_cpp);
+extern void cleanup_packets(void);
+
+#endif /* TRAFGEN_CONF */
diff --git a/trafgen_lexer.l b/trafgen_lexer.l
new file mode 100644
index 0000000..69caa58
--- /dev/null
+++ b/trafgen_lexer.l
@@ -0,0 +1,152 @@
+/*
+ * 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 "trafgen_parser.tab.h"
+#include "xmalloc.h"
+
+extern void yyerror(const char *);
+
+static char *try_convert_shellcode(char *sstr)
+{
+ int j = 0;
+ char *bstr, *ostr = sstr, *hay;
+ size_t blen, slen = strlen(sstr), tot = 0;
+ const char *needle = "\\x";
+
+ sstr++;
+ slen -= 2;
+
+ if (slen % 4 != 0)
+ return sstr;
+
+ blen = slen / 4;
+ hay = sstr;
+ while ((hay = strstr(hay, needle)) != NULL ) {
+ hay += strlen(needle) + 2;
+ tot++;
+ }
+
+ if (blen != tot) {
+ printf("Warning: mixed shellcode with strings, "
+ "using strings!\n");
+ return sstr;
+ }
+
+ blen += 2;
+ bstr = xzmalloc(blen);
+
+ bstr[j++] = '\"';
+ while (j < blen - 1)
+ bstr[j++] = (uint8_t) strtoul(sstr + 2, &sstr, 16);
+ bstr[j++] = '\"';
+
+ xfree(ostr);
+ return bstr;
+}
+
+%}
+
+%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]*))
+number_ascii ([a-zA-Z])
+
+%%
+
+"cpu" { return K_CPU; }
+"fill" { return K_FILL; }
+"rnd" { return K_RND; }
+"csumip" { return K_CSUMIP; }
+"csumip4" { return K_CSUMIP; }
+"csumudp" { return K_CSUMUDP; }
+"csumtcp" { return K_CSUMTCP; }
+"drnd" { return K_DRND; }
+"dinc" { return K_DINC; }
+"ddec" { return K_DDEC; }
+"seqinc" { return K_SEQINC; }
+"seqdec" { return K_SEQDEC; }
+"const8"|"c8" { return K_CONST8; }
+"const16"|"c16" { return K_CONST16; }
+"const32"|"c32" { return K_CONST32; }
+"const64"|"c64" { return K_CONST64; }
+
+[ ]*"-"[ ]* { return '-'; }
+[ ]*"+"[ ]* { return '+'; }
+[ ]*"*"[ ]* { return '*'; }
+[ ]*"/"[ ]* { return '/'; }
+[ ]*"%"[ ]* { return '%'; }
+[ ]*"&"[ ]* { return '&'; }
+[ ]*"|"[ ]* { return '|'; }
+[ ]*"<"[ ]* { return '<'; }
+[ ]*">"[ ]* { return '>'; }
+[ ]*"^"[ ]* { return '^'; }
+"{" { return '{'; }
+"}" { return '}'; }
+"(" { return '('; }
+")" { return ')'; }
+"[" { return '['; }
+"]" { return ']'; }
+"," { return ','; }
+":" { return ':'; }
+
+"\n" { yylineno++; }
+
+"\""[^\"]+"\"" { yylval.str = try_convert_shellcode(xstrdup(yytext));
+ return string; }
+
+([ \t\r\n]+)? { return K_WHITE; }
+
+"/*"([^\*]|\*[^/])*"*/" { return K_COMMENT; }
+
+"#"[^\n]* { return K_COMMENT; }
+
+{number_hex} { yylval.number = strtoul(yytext, NULL, 16);
+ return number; }
+
+{number_dec} { yylval.number = strtol(yytext, NULL, 10);
+ 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_ascii} { yylval.number = (uint8_t) (*yytext);
+ return number; }
+
+"'\\x"[a-fA-F0-9]{2}"'" { yylval.number = strtol(yytext + 3, NULL, 16);
+ return number; }
+
+"'"."'" { yylval.number = (uint8_t) (*(yytext + 1));
+ return number; }
+
+";"[^\n]* {/* NOP */}
+. { printf("Unknown character '%s'", yytext);
+ yyerror("lex Unknown character"); }
+
+%%
diff --git a/trafgen_parser.y b/trafgen_parser.y
new file mode 100644
index 0000000..ece3b25
--- /dev/null
+++ b/trafgen_parser.y
@@ -0,0 +1,611 @@
+/*
+ * 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.
+ */
+
+/* yaac-func-prefix: yy */
+
+%{
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <stdint.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <libgen.h>
+
+#include "xmalloc.h"
+#include "trafgen_parser.tab.h"
+#include "trafgen_conf.h"
+#include "built_in.h"
+#include "die.h"
+#include "csum.h"
+#include "xutils.h"
+
+#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;
+
+extern struct packet *packets;
+extern size_t plen;
+
+#define packet_last (plen - 1)
+
+#define payload_last (packets[packet_last].len - 1)
+
+extern struct packet_dyn *packet_dyn;
+extern size_t dlen;
+
+#define packetd_last (dlen - 1)
+
+#define packetdc_last (packet_dyn[packetd_last].clen - 1)
+#define packetdr_last (packet_dyn[packetd_last].rlen - 1)
+#define packetds_last (packet_dyn[packetd_last].slen - 1)
+
+static int our_cpu, min_cpu = -1, max_cpu = -1;
+
+static inline int test_ignore(void)
+{
+ if (min_cpu < 0 && max_cpu < 0)
+ return 0;
+ else if (max_cpu >= our_cpu && min_cpu <= our_cpu)
+ return 0;
+ else
+ return 1;
+}
+
+static inline int has_dynamic_elems(struct packet_dyn *p)
+{
+ return (p->rlen + p->slen + p->clen);
+}
+
+static inline void __init_new_packet_slot(struct packet *slot)
+{
+ slot->payload = NULL;
+ slot->len = 0;
+}
+
+static inline void __init_new_counter_slot(struct packet_dyn *slot)
+{
+ slot->cnt = NULL;
+ slot->clen = 0;
+}
+
+static inline void __init_new_randomizer_slot(struct packet_dyn *slot)
+{
+ slot->rnd = NULL;
+ slot->rlen = 0;
+}
+
+static inline void __init_new_csum_slot(struct packet_dyn *slot)
+{
+ slot->csum = NULL;
+ slot->slen = 0;
+}
+
+static inline void __setup_new_counter(struct counter *c, uint8_t start,
+ uint8_t stop, uint8_t stepping,
+ int type)
+{
+ c->min = start;
+ c->max = stop;
+ c->inc = stepping;
+ c->val = (type == TYPE_INC) ? start : stop;
+ c->off = payload_last;
+ c->type = type;
+}
+
+static inline void __setup_new_randomizer(struct randomizer *r)
+{
+ r->off = payload_last;
+}
+
+static inline void __setup_new_csum16(struct csum16 *s, off_t from, off_t to,
+ enum csum which)
+{
+ s->off = payload_last - 1;
+ s->from = from;
+ s->to = to;
+ s->which = which;
+}
+
+static void realloc_packet(void)
+{
+ if (test_ignore())
+ return;
+
+ plen++;
+ packets = xrealloc(packets, 1, plen * sizeof(*packets));
+
+ __init_new_packet_slot(&packets[packet_last]);
+
+ dlen++;
+ packet_dyn = xrealloc(packet_dyn, 1, dlen * sizeof(*packet_dyn));
+
+ __init_new_counter_slot(&packet_dyn[packetd_last]);
+ __init_new_randomizer_slot(&packet_dyn[packetd_last]);
+ __init_new_csum_slot(&packet_dyn[packetd_last]);
+}
+
+static void set_byte(uint8_t val)
+{
+ struct packet *pkt = &packets[packet_last];
+
+ if (test_ignore())
+ return;
+
+ pkt->len++;
+ pkt->payload = xrealloc(pkt->payload, 1, pkt->len);
+ pkt->payload[payload_last] = val;
+}
+
+static void set_multi_byte(uint8_t *s, size_t len)
+{
+ int i;
+
+ for (i = 0; i < len; ++i)
+ set_byte(s[i]);
+}
+
+static void set_fill(uint8_t val, size_t len)
+{
+ size_t i;
+ struct packet *pkt = &packets[packet_last];
+
+ if (test_ignore())
+ return;
+
+ pkt->len += len;
+ pkt->payload = xrealloc(pkt->payload, 1, pkt->len);
+ for (i = 0; i < len; ++i)
+ pkt->payload[payload_last - i] = val;
+}
+
+static void __set_csum16_dynamic(size_t from, size_t to, enum csum which)
+{
+ struct packet *pkt = &packets[packet_last];
+ struct packet_dyn *pktd = &packet_dyn[packetd_last];
+
+ pkt->len += 2;
+ pkt->payload = xrealloc(pkt->payload, 1, pkt->len);
+
+ pktd->slen++;
+ pktd->csum = xrealloc(pktd->csum, 1, pktd->slen * sizeof(struct csum16));
+
+ __setup_new_csum16(&pktd->csum[packetds_last], from, to, which);
+}
+
+static void __set_csum16_static(size_t from, size_t to, enum csum which)
+{
+ struct packet *pkt = &packets[packet_last];
+ uint16_t sum;
+ uint8_t *psum;
+
+ sum = htons(calc_csum(pkt->payload + from, to - from, 0));
+ psum = (uint8_t *) &sum;
+
+ set_byte(psum[0]);
+ set_byte(psum[1]);
+}
+
+static void set_csum16(size_t from, size_t to, enum csum which)
+{
+ int make_it_dynamic = 0;
+ struct packet *pkt = &packets[packet_last];
+ struct packet_dyn *pktd = &packet_dyn[packetd_last];
+
+ if (test_ignore())
+ return;
+
+ if (to < from) {
+ size_t tmp = to;
+
+ to = from;
+ from = tmp;
+ }
+
+ bug_on(!(from < to));
+
+ if (to >= pkt->len || which == CSUM_TCP || which == CSUM_UDP)
+ make_it_dynamic = 1;
+
+ if (has_dynamic_elems(pktd) || make_it_dynamic)
+ __set_csum16_dynamic(from, to, which);
+ else
+ __set_csum16_static(from, to, which);
+}
+
+static void set_rnd(size_t len)
+{
+ size_t i;
+ struct packet *pkt = &packets[packet_last];
+
+ if (test_ignore())
+ return;
+
+ pkt->len += len;
+ pkt->payload = xrealloc(pkt->payload, 1, pkt->len);
+ for (i = 0; i < len; ++i)
+ pkt->payload[payload_last - i] = (uint8_t) rand();
+}
+
+static void set_sequential_inc(uint8_t start, size_t len, uint8_t stepping)
+{
+ size_t i;
+ struct packet *pkt = &packets[packet_last];
+
+ if (test_ignore())
+ return;
+
+ pkt->len += len;
+ pkt->payload = xrealloc(pkt->payload, 1, pkt->len);
+ for (i = 0; i < len; ++i) {
+ off_t off = len - 1 - i;
+
+ pkt->payload[payload_last - off] = start;
+ start += stepping;
+ }
+}
+
+static void set_sequential_dec(uint8_t start, size_t len, uint8_t stepping)
+{
+ size_t i;
+ struct packet *pkt = &packets[packet_last];
+
+ if (test_ignore())
+ return;
+
+ pkt->len += len;
+ pkt->payload = xrealloc(pkt->payload, 1, pkt->len);
+ for (i = 0; i < len; ++i) {
+ int off = len - 1 - i;
+
+ pkt->payload[payload_last - off] = start;
+ start -= stepping;
+ }
+}
+
+static void set_dynamic_rnd(void)
+{
+ struct packet *pkt = &packets[packet_last];
+ struct packet_dyn *pktd = &packet_dyn[packetd_last];
+
+ if (test_ignore())
+ return;
+
+ pkt->len++;
+ pkt->payload = xrealloc(pkt->payload, 1, pkt->len);
+
+ pktd->rlen++;
+ pktd->rnd = xrealloc(pktd->rnd, 1, pktd->rlen * sizeof(struct randomizer));
+
+ __setup_new_randomizer(&pktd->rnd[packetdr_last]);
+}
+
+static void set_dynamic_incdec(uint8_t start, uint8_t stop, uint8_t stepping,
+ int type)
+{
+ struct packet *pkt = &packets[packet_last];
+ struct packet_dyn *pktd = &packet_dyn[packetd_last];
+
+ if (test_ignore())
+ return;
+
+ pkt->len++;
+ pkt->payload = xrealloc(pkt->payload, 1, pkt->len);
+
+ pktd->clen++;
+ pktd->cnt =xrealloc(pktd->cnt, 1, pktd->clen * sizeof(struct counter));
+
+ __setup_new_counter(&pktd->cnt[packetdc_last], start, stop, stepping, type);
+}
+
+%}
+
+%union {
+ long long int number;
+ char *str;
+}
+
+%token K_COMMENT K_FILL K_RND K_SEQINC K_SEQDEC K_DRND K_DINC K_DDEC K_WHITE
+%token K_CPU K_CSUMIP K_CSUMUDP K_CSUMTCP K_CONST8 K_CONST16 K_CONST32 K_CONST64
+
+%token ',' '{' '}' '(' ')' '[' ']' ':' '-' '+' '*' '/' '%' '&' '|' '<' '>' '^'
+
+%token number string
+
+%type <number> number expression
+%type <str> string
+
+%left '-' '+' '*' '/' '%' '&' '|' '<' '>' '^'
+
+%%
+
+packets
+ : { }
+ | packets packet { }
+ | packets inline_comment { }
+ | packets K_WHITE { }
+ ;
+
+inline_comment
+ : K_COMMENT { }
+ ;
+
+packet
+ : '{' delimiter payload delimiter '}' {
+ min_cpu = max_cpu = -1;
+ realloc_packet();
+ }
+ | K_CPU '(' number ':' number ')' ':' K_WHITE '{' delimiter payload delimiter '}' {
+ min_cpu = $3;
+ max_cpu = $5;
+
+ if (min_cpu > max_cpu) {
+ int tmp = min_cpu;
+
+ min_cpu = max_cpu;
+ max_cpu = tmp;
+ }
+
+ realloc_packet();
+ }
+ | K_CPU '(' number ')' ':' K_WHITE '{' delimiter payload delimiter '}' {
+ min_cpu = max_cpu = $3;
+ realloc_packet();
+ }
+ ;
+
+payload
+ : elem { }
+ | payload elem_delimiter { }
+ ;
+
+delimiter
+ : ',' { }
+ | K_WHITE { }
+ | ',' K_WHITE { }
+ ;
+
+elem_delimiter
+ : delimiter elem { }
+ ;
+
+elem
+ : number { set_byte((uint8_t) $1); }
+ | string { set_multi_byte((uint8_t *) $1 + 1, strlen($1) - 2); }
+ | fill { }
+ | rnd { }
+ | drnd { }
+ | seqinc { }
+ | seqdec { }
+ | dinc { }
+ | ddec { }
+ | csum { }
+ | const { }
+ | inline_comment { }
+ ;
+
+expression
+ : number
+ { $$ = $1; }
+ | expression '+' expression
+ { $$ = $1 + $3; }
+ | expression '-' expression
+ { $$ = $1 - $3; }
+ | expression '*' expression
+ { $$ = $1 * $3; }
+ | expression '/' expression
+ { $$ = $1 / $3; }
+ | expression '%' expression
+ { $$ = $1 % $3; }
+ | expression '&' expression
+ { $$ = $1 & $3; }
+ | expression '|' expression
+ { $$ = $1 | $3; }
+ | expression '^' expression
+ { $$ = $1 ^ $3; }
+ | expression '<' '<' expression
+ { $$ = $1 << $4; }
+ | expression '>' '>' expression
+ { $$ = $1 >> $4; }
+ | '(' expression ')'
+ { $$ = $2;}
+ ;
+
+fill
+ : K_FILL '(' number delimiter number ')'
+ { set_fill($3, $5); }
+ ;
+
+const
+ : K_CONST8 '(' expression ')'
+ { set_byte((uint8_t) $3); }
+ | K_CONST16 '(' expression ')' {
+ uint16_t __c = cpu_to_be16((uint16_t) $3);
+
+ set_multi_byte((uint8_t *) &__c, sizeof(__c));
+ }
+ | K_CONST32 '(' expression ')' {
+ uint32_t __c = cpu_to_be32((uint32_t) $3);
+
+ set_multi_byte((uint8_t *) &__c, sizeof(__c));
+ }
+ | K_CONST64 '(' expression ')' {
+ uint64_t __c = cpu_to_be64((uint64_t) $3);
+
+ set_multi_byte((uint8_t *) &__c, sizeof(__c));
+ }
+ ;
+
+rnd
+ : K_RND '(' number ')'
+ { set_rnd($3); }
+ ;
+
+csum
+ : K_CSUMIP '(' number delimiter number ')'
+ { set_csum16($3, $5, CSUM_IP); }
+ | K_CSUMTCP '(' number delimiter number ')'
+ { set_csum16($3, $5, CSUM_TCP); }
+ | K_CSUMUDP '(' number delimiter number ')'
+ { set_csum16($3, $5, CSUM_UDP); }
+ ;
+
+seqinc
+ : K_SEQINC '(' number delimiter number ')'
+ { set_sequential_inc($3, $5, 1); }
+ | K_SEQINC '(' number delimiter number delimiter number ')'
+ { set_sequential_inc($3, $5, $7); }
+ ;
+
+seqdec
+ : K_SEQDEC '(' number delimiter number ')'
+ { set_sequential_dec($3, $5, 1); }
+ | K_SEQDEC '(' number delimiter number delimiter number ')'
+ { set_sequential_dec($3, $5, $7); }
+ ;
+
+drnd
+ : K_DRND '(' ')'
+ { set_dynamic_rnd(); }
+ | K_DRND '(' number ')'
+ {
+ int i, max = $3;
+ for (i = 0; i < max; ++i)
+ set_dynamic_rnd();
+ }
+ ;
+
+dinc
+ : K_DINC '(' number delimiter number ')'
+ { set_dynamic_incdec($3, $5, 1, TYPE_INC); }
+ | K_DINC '(' number delimiter number delimiter number ')'
+ { set_dynamic_incdec($3, $5, $7, TYPE_INC); }
+ ;
+
+ddec
+ : K_DDEC '(' number delimiter number ')'
+ { set_dynamic_incdec($3, $5, 1, TYPE_DEC); }
+ | K_DDEC '(' number delimiter number delimiter number ')'
+ { set_dynamic_incdec($3, $5, $7, TYPE_DEC); }
+ ;
+
+%%
+
+static void finalize_packet(void)
+{
+ /* XXX hack ... we allocated one packet pointer too much */
+ plen--;
+ dlen--;
+}
+
+static void dump_conf(void)
+{
+ size_t i, j;
+
+ for (i = 0; i < plen; ++i) {
+ printf("[%zu] pkt\n", i);
+ printf(" len %zu cnts %zu rnds %zu\n",
+ packets[i].len,
+ packet_dyn[i].clen,
+ packet_dyn[i].rlen);
+
+ printf(" payload ");
+ for (j = 0; j < packets[i].len; ++j)
+ printf("%02x ", packets[i].payload[j]);
+ printf("\n");
+
+ for (j = 0; j < packet_dyn[i].clen; ++j)
+ printf(" cnt%zu [%u,%u], inc %u, off %ld type %s\n", j,
+ packet_dyn[i].cnt[j].min,
+ packet_dyn[i].cnt[j].max,
+ packet_dyn[i].cnt[j].inc,
+ packet_dyn[i].cnt[j].off,
+ packet_dyn[i].cnt[j].type == TYPE_INC ?
+ "inc" : "dec");
+
+ for (j = 0; j < packet_dyn[i].rlen; ++j)
+ printf(" rnd%zu off %ld\n", j,
+ packet_dyn[i].rnd[j].off);
+ }
+}
+
+void cleanup_packets(void)
+{
+ size_t i;
+
+ for (i = 0; i < plen; ++i) {
+ if (packets[i].len > 0)
+ xfree(packets[i].payload);
+ }
+
+ free(packets);
+
+ for (i = 0; i < dlen; ++i) {
+ free(packet_dyn[i].cnt);
+ free(packet_dyn[i].rnd);
+ }
+
+ free(packet_dyn);
+}
+
+int compile_packets(char *file, int verbose, int cpu, bool invoke_cpp)
+{
+ char tmp_file[128];
+
+ memset(tmp_file, 0, sizeof(tmp_file));
+ our_cpu = cpu;
+
+ if (invoke_cpp) {
+ char cmd[256], *dir, *base, *a, *b;
+
+ dir = dirname((a = xstrdup(file)));
+ base = basename((b = xstrdup(file)));
+
+ slprintf(tmp_file, sizeof(tmp_file), "%s/.tmp-%u-%s", dir, rand(), base);
+ slprintf(cmd, sizeof(cmd), "cpp -I/etc/netsniff-ng/ %s > %s", file, tmp_file);
+ system(cmd);
+
+ file = tmp_file;
+ xfree(a);
+ xfree(b);
+ }
+
+ if (!strncmp("-", file, strlen("-")))
+ yyin = stdin;
+ else
+ yyin = fopen(file, "r");
+ if (!yyin)
+ panic("Cannot open %s: %s!\n", file, strerror(errno));
+
+ realloc_packet();
+ yyparse();
+ finalize_packet();
+
+ if (our_cpu == 0 && verbose)
+ dump_conf();
+
+ fclose(yyin);
+ if (invoke_cpp)
+ unlink(tmp_file);
+
+ return 0;
+}
+
+void yyerror(const char *err)
+{
+ panic("Syntax error at line%d, at char '%s'! %s!\n", yylineno, yytext, err);
+}
diff --git a/trie.c b/trie.c
new file mode 100644
index 0000000..f0eecd5
--- /dev/null
+++ b/trie.c
@@ -0,0 +1,117 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2011 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#include <stdint.h>
+#include <string.h>
+#include <netinet/in.h>
+
+#include "patricia.h"
+#include "locking.h"
+#include "trie.h"
+#include "ipv4.h"
+#include "ipv6.h"
+
+static struct patricia_node *tree = NULL;
+
+static struct rwlock tree_lock;
+
+void trie_addr_lookup(char *buff, size_t len, int ipv4, int *fd,
+ struct sockaddr_storage *addr, size_t *alen)
+{
+ void *data;
+ size_t dlen;
+ struct ipv4hdr *hdr4 = (void *) buff;
+ struct ipv6hdr *hdr6 = (void *) buff;
+
+ data = ipv4 ? (void *) &hdr4->h_daddr : (void *) &hdr6->daddr;
+ dlen = ipv4 ? sizeof(hdr4->h_daddr) : sizeof(hdr6->daddr);
+
+ if (unlikely((ipv4 && ((struct ipv4hdr *) buff)->h_version != 4) ||
+ (!ipv4 && ((struct ipv6hdr *) buff)->version != 6))) {
+ memset(addr, 0, sizeof(*addr));
+ (*alen) = 0;
+ (*fd) = -1;
+ return;
+ }
+
+ rwlock_rd_lock(&tree_lock);
+ (*fd) = ptree_search_data_exact(data, dlen, addr, alen, tree);
+ rwlock_unlock(&tree_lock);
+}
+
+int trie_addr_maybe_update(char *buff, size_t len, int ipv4, int fd,
+ struct sockaddr_storage *addr, size_t alen)
+{
+ int ret;
+ void *data;
+ size_t dlen;
+ struct ipv4hdr *hdr4 = (void *) buff;
+ struct ipv6hdr *hdr6 = (void *) buff;
+
+ data = ipv4 ? (void *) &hdr4->h_saddr : (void *) &hdr6->saddr;
+ dlen = ipv4 ? sizeof(hdr4->h_saddr) : sizeof(hdr6->saddr);
+
+ if (unlikely((ipv4 && ((struct ipv4hdr *) buff)->h_version != 4) ||
+ (!ipv4 && ((struct ipv6hdr *) buff)->version != 6)))
+ return -1;
+
+ rwlock_wr_lock(&tree_lock);
+ ret = ptree_add_entry(data, dlen, fd, addr, alen, &tree);
+ rwlock_unlock(&tree_lock);
+
+ return ret;
+}
+
+void trie_addr_remove(int fd)
+{
+ int found = 1;
+ struct patricia_node *n = NULL;
+
+ rwlock_wr_lock(&tree_lock);
+
+ while (found) {
+ ptree_get_key(fd, tree, &n);
+ if (n) {
+ ptree_del_entry(n->key, n->klen, &tree);
+ n = NULL;
+ } else
+ found = 0;
+ }
+
+ rwlock_unlock(&tree_lock);
+}
+
+void trie_addr_remove_addr(struct sockaddr_storage *addr, size_t alen)
+{
+ int found = 1;
+ struct patricia_node *n = NULL;
+
+ rwlock_wr_lock(&tree_lock);
+
+ while (found) {
+ ptree_get_key_addr(addr, alen, tree, &n);
+ if (n) {
+ ptree_del_entry(n->key, n->klen, &tree);
+ n = NULL;
+ } else
+ found = 0;
+ }
+
+ rwlock_unlock(&tree_lock);
+}
+
+void trie_init(void)
+{
+ rwlock_init(&tree_lock);
+}
+
+void trie_cleanup(void)
+{
+ rwlock_wr_lock(&tree_lock);
+ ptree_free(tree);
+ rwlock_unlock(&tree_lock);
+ rwlock_destroy(&tree_lock);
+}
diff --git a/trie.h b/trie.h
new file mode 100644
index 0000000..8b43942
--- /dev/null
+++ b/trie.h
@@ -0,0 +1,21 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2011 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef TRIE_H
+#define TRIE_H
+
+#include <netinet/in.h>
+
+extern void trie_addr_lookup(char *buff, size_t len, int ipv4, int *fd,
+ struct sockaddr_storage *addr, size_t *alen);
+extern int trie_addr_maybe_update(char *buff, size_t len, int ipv4, int fd,
+ struct sockaddr_storage *addr, size_t alen);
+extern void trie_addr_remove(int fd);
+extern void trie_addr_remove_addr(struct sockaddr_storage *addr, size_t alen);
+extern void trie_init(void);
+extern void trie_cleanup(void);
+
+#endif /* TRIE_H */
diff --git a/update-oui.py b/update-oui.py
new file mode 100755
index 0000000..52af122
--- /dev/null
+++ b/update-oui.py
@@ -0,0 +1,81 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# update-oui.py -- update netsniff-ng oui.conf from official IEEE OUI list
+#
+# Copyright (C) 2013 Tobias Klauser <tklauser@distanz.ch>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+
+import os
+import sys
+import re
+import getopt
+try:
+ from urllib2 import urlopen # Python 2.x
+except ImportError:
+ from urllib.request import urlopen # Python 3.x
+
+DEFAULT_OUPUT_FILE = "oui.conf"
+DEFAULT_OUI_URL = "http://standards.ieee.org/develop/regauth/oui/oui.txt"
+
+OUI_PATTERN = re.compile(b"^\s*([a-fA-F0-9]{2})-([a-fA-F0-9]{2})-([a-fA-F0-9]{2})\s+\(hex\)\s+(.*)$")
+
+def usage():
+ print("""usage: {0} [OPTION...]
+available options:
+ -f force overwrite of existing file
+ -o set output file (default: {1})
+ -u set URL to fetch OUI list from (default: {2})
+ -h show this help and exit""".format(os.path.basename(sys.argv[0]),
+ DEFAULT_OUPUT_FILE, DEFAULT_OUI_URL))
+
+def main():
+ try:
+ opts, args = getopt.getopt(sys.argv[1:], "fo:u:h")
+ except getopt.GetoptError as err:
+ print(str(err))
+ usage()
+ sys.exit(-1)
+
+ overwrite = False
+ output_file = DEFAULT_OUPUT_FILE
+ oui_url = DEFAULT_OUI_URL
+ for o, a in opts:
+ if o == '-f':
+ overwrite = True
+ elif o == '-o':
+ output_file = a
+ elif o == '-u':
+ oui_url = a
+ elif o == '-h':
+ usage()
+ sys.exit(0)
+ else:
+ assert False, "unhandled option"
+
+ if not overwrite and os.path.exists(output_file):
+ print("Eror: output file {} already exists".format(output_file))
+ sys.exit(-1)
+
+ print("Updating OUI information in {} from {}... ".format(output_file, oui_url))
+
+ fh_file = open(output_file, 'w')
+ fh_url = urlopen(oui_url)
+
+ n = 0
+ for line in fh_url:
+ m = OUI_PATTERN.match(line)
+ if m:
+ fh_file.write("0x{}{}{}, {}\n".format(m.group(1), m.group(2), m.group(3), m.group(4)))
+ n += 1
+
+ print("{} OUIs written to {}".format(n, output_file))
+
+ fh_url.close()
+ fh_file.close()
+
+if __name__ == '__main__':
+ main()
diff --git a/xio.c b/xio.c
new file mode 100644
index 0000000..d2c6181
--- /dev/null
+++ b/xio.c
@@ -0,0 +1,248 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <syslog.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <linux/if.h>
+#include <linux/if_tun.h>
+
+#include "die.h"
+#include "xio.h"
+#include "xutils.h"
+
+int open_or_die(const char *file, int flags)
+{
+ int ret = open(file, flags);
+ if (ret < 0)
+ panic("Cannot open file %s! %s.\n", file, strerror(errno));
+
+ return ret;
+}
+
+int open_or_die_m(const char *file, int flags, mode_t mode)
+{
+ int ret = open(file, flags, mode);
+ if (ret < 0)
+ panic("Cannot open or create file %s! %s.", file, strerror(errno));
+ return ret;
+}
+
+void create_or_die(const char *file, mode_t mode)
+{
+ int fd = open_or_die_m(file, O_WRONLY | O_CREAT, mode);
+ close(fd);
+}
+
+void pipe_or_die(int pipefd[2], int flags)
+{
+ int ret = pipe2(pipefd, flags);
+ if (ret < 0)
+ panic("Cannot create pipe2 event fd! %s.\n", strerror(errno));
+}
+
+int tun_open_or_die(char *name, int type)
+{
+ int fd, ret;
+ short flags;
+ struct ifreq ifr;
+
+ if (!name)
+ panic("No name provided for tundev!\n");
+
+ fd = open_or_die("/dev/net/tun", O_RDWR);
+
+ memset(&ifr, 0, sizeof(ifr));
+ ifr.ifr_flags = type;
+ strlcpy(ifr.ifr_name, name, IFNAMSIZ);
+
+ ret = ioctl(fd, TUNSETIFF, &ifr);
+ if (ret < 0)
+ panic("ioctl screwed up! %s.\n", strerror(errno));
+
+ ret = fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);
+ if (ret < 0)
+ panic("fctnl screwed up! %s.\n", strerror(errno));
+
+ flags = device_get_flags(name);
+ flags |= IFF_UP | IFF_RUNNING;
+ device_set_flags(name, flags);
+
+ return fd;
+}
+
+ssize_t read_or_die(int fd, void *buf, size_t len)
+{
+ ssize_t ret = read(fd, buf, len);
+ if (ret < 0) {
+ if (errno == EPIPE)
+ die();
+ panic("Cannot read from descriptor! %s.\n", strerror(errno));
+ }
+
+ return ret;
+}
+
+ssize_t write_or_die(int fd, const void *buf, size_t len)
+{
+ ssize_t ret = write(fd, buf, len);
+ if (ret < 0) {
+ if (errno == EPIPE)
+ die();
+ panic("Cannot write to descriptor! %s.", strerror(errno));
+ }
+
+ return ret;
+}
+
+extern volatile sig_atomic_t sigint;
+
+ssize_t read_exact(int fd, void *buf, size_t len, int mayexit)
+{
+ ssize_t num = 0, written;
+
+ while (len > 0 && !sigint) {
+ if ((written = read(fd, buf, len)) < 0) {
+ if (errno == EAGAIN && num > 0)
+ continue;
+ if (mayexit)
+ return -1;
+ else
+ continue;
+ }
+ if (!written)
+ return 0;
+ len -= written;
+ buf += written;
+ num += written;
+ }
+
+ return num;
+}
+
+ssize_t write_exact(int fd, void *buf, size_t len, int mayexit)
+{
+ ssize_t num = 0, written;
+
+ while (len > 0 && !sigint) {
+ if ((written = write(fd, buf, len)) < 0) {
+ if (errno == EAGAIN && num > 0)
+ continue;
+ if (mayexit)
+ return -1;
+ else
+ continue;
+ }
+ if (!written)
+ return 0;
+ len -= written;
+ buf += written;
+ num += written;
+ }
+
+ return num;
+}
+
+static int fd_rnd = -1;
+
+static void randombytes(unsigned char *x, unsigned long long xlen)
+{
+ int ret;
+
+ if (fd_rnd == -1) {
+ for (;;) {
+ fd_rnd = open("/dev/urandom", O_RDONLY);
+ if (fd_rnd != -1)
+ break;
+ sleep(1);
+ }
+ }
+
+ while (xlen > 0) {
+ if (xlen < 1048576)
+ ret = xlen;
+ else
+ ret = 1048576;
+
+ ret = read(fd_rnd, x, ret);
+ if (ret < 1) {
+ sleep(1);
+ continue;
+ }
+
+ x += ret;
+ xlen -= ret;
+ }
+}
+
+/* Note: it's not really secure, but the name only suggests it's better to use
+ * than rand(3) when transferring bytes over the network in non-security
+ * critical structure members. secrand() is only used to fill up salts actually.
+ */
+int secrand(void)
+{
+ int ret;
+
+ randombytes((void *) &ret, sizeof(ret));
+
+ return ret;
+}
+
+static char const *priov[] = {
+ [LOG_EMERG] = "EMERG:",
+ [LOG_ALERT] = "ALERT:",
+ [LOG_CRIT] = "CRIT:",
+ [LOG_ERR] = "ERR:",
+ [LOG_WARNING] = "WARNING:",
+ [LOG_NOTICE] = "NOTICE:",
+ [LOG_INFO] = "INFO:",
+ [LOG_DEBUG] = "DEBUG:",
+};
+
+static ssize_t cookie_writer(void *cookie, char const *data, size_t leng)
+{
+ int prio = LOG_DEBUG, len;
+
+ do {
+ len = strlen(priov[prio]);
+ } while (memcmp(data, priov[prio], len) && --prio >= 0);
+
+ if (prio < 0) {
+ prio = LOG_INFO;
+ } else {
+ data += len;
+ leng -= len;
+ }
+
+ while (*data == ' ') {
+ ++data;
+ --leng;
+ }
+
+ syslog(prio, "%.*s", (int) leng, data);
+
+ return leng;
+}
+
+static cookie_io_functions_t cookie_log = {
+ .write = cookie_writer,
+};
+
+void to_std_log(FILE **fp)
+{
+ setvbuf(*fp = fopencookie(NULL, "w", cookie_log), NULL, _IOLBF, 0);
+}
diff --git a/xio.h b/xio.h
new file mode 100644
index 0000000..fe8e1e2
--- /dev/null
+++ b/xio.h
@@ -0,0 +1,22 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef XIO_H
+#define XIO_H
+
+extern int open_or_die(const char *file, int flags);
+extern int open_or_die_m(const char *file, int flags, mode_t mode);
+extern void create_or_die(const char *file, mode_t mode);
+extern int tun_open_or_die(char *name, int type);
+extern void pipe_or_die(int pipefd[2], int flags);
+extern ssize_t read_or_die(int fd, void *buf, size_t count);
+extern ssize_t write_or_die(int fd, const void *buf, size_t count);
+extern ssize_t read_exact(int fd, void *buf, size_t len, int mayexit);
+extern ssize_t write_exact(int fd, void *buf, size_t len, int mayexit);
+extern int secrand(void);
+extern void to_std_log(FILE **fp);
+
+#endif /* XIO_H */
diff --git a/xmalloc.c b/xmalloc.c
new file mode 100644
index 0000000..246be07
--- /dev/null
+++ b/xmalloc.c
@@ -0,0 +1,151 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010, 2011, 2012 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#define _GNU_SOURCE
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <signal.h>
+#include <limits.h>
+#include <sys/types.h>
+
+#include "xmalloc.h"
+#include "xutils.h"
+#include "built_in.h"
+#include "die.h"
+
+void *xmalloc(size_t size)
+{
+ void *ptr;
+
+ if (unlikely(size == 0))
+ panic("xmalloc: zero size\n");
+
+ ptr = malloc(size);
+ if (unlikely(ptr == NULL))
+ panic("xmalloc: out of memory (allocating %zu bytes)\n",
+ size);
+
+ return ptr;
+}
+
+void *xzmalloc(size_t size)
+{
+ void *ptr = xmalloc(size);
+ memset(ptr, 0, size);
+ return ptr;
+}
+
+void *xmalloc_aligned(size_t size, size_t alignment)
+{
+ int ret;
+ void *ptr;
+
+ if (unlikely(size == 0))
+ panic("xmalloc_aligned: zero size\n");
+
+ ret = posix_memalign(&ptr, alignment, size);
+ if (unlikely(ret != 0))
+ panic("xmalloc_aligned: out of memory (allocating %zu "
+ "bytes)\n", size);
+
+ return ptr;
+}
+
+void *xzmalloc_aligned(size_t size, size_t alignment)
+{
+ void *ptr = xmalloc_aligned(size, alignment);
+ memset(ptr, 0, size);
+ return ptr;
+}
+
+void *xmallocz(size_t size)
+{
+ void *ptr;
+
+ if (unlikely(size + 1 < size))
+ panic("xmallocz: data too large to fit into virtual "
+ "memory space\n");
+
+ ptr = xmalloc(size + 1);
+ ((char*) ptr)[size] = 0;
+
+ return ptr;
+}
+
+void *xmemdupz(const void *data, size_t len)
+{
+ return memcpy(xmallocz(len), data, len);
+}
+
+void *xrealloc(void *ptr, size_t nmemb, size_t size)
+{
+ void *new_ptr;
+ size_t new_size = nmemb * size;
+
+ if (unlikely(new_size == 0))
+ panic("xrealloc: zero size\n");
+ if (unlikely(((size_t) ~0) / nmemb < size))
+ panic("xrealloc: nmemb * size > SIZE_T_MAX\n");
+
+ if (ptr == NULL)
+ new_ptr = malloc(new_size);
+ else
+ new_ptr = realloc(ptr, new_size);
+
+ if (unlikely(new_ptr == NULL))
+ panic("xrealloc: out of memory (new_size %zu bytes)\n",
+ new_size);
+
+ return new_ptr;
+}
+
+void xfree_func(void *ptr)
+{
+ if (unlikely(ptr == NULL))
+ panic("xfree: NULL pointer given as argument\n");
+
+ free(ptr);
+}
+
+char *xstrdup(const char *str)
+{
+ size_t len;
+ char *cp;
+
+ len = strlen(str) + 1;
+ cp = xmalloc(len);
+
+ strlcpy(cp, str, len);
+
+ return cp;
+}
+
+char *xstrndup(const char *str, size_t size)
+{
+ size_t len;
+ char *cp;
+
+ len = strlen(str) + 1;
+ if (size < len)
+ len = size;
+
+ cp = xmalloc(len);
+
+ strlcpy(cp, str, len);
+
+ return cp;
+}
+
+int xdup(int fd)
+{
+ int ret = dup(fd);
+ if (unlikely(ret < 0))
+ panic("xdup: dup failed\n");
+ return ret;
+}
diff --git a/xmalloc.h b/xmalloc.h
new file mode 100644
index 0000000..53a88b6
--- /dev/null
+++ b/xmalloc.h
@@ -0,0 +1,35 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef XMALLOC_H
+#define XMALLOC_H
+
+#include <stdlib.h>
+
+#include "built_in.h"
+#include "die.h"
+
+extern void *xmalloc(size_t size) __hidden;
+extern void *xzmalloc(size_t size) __hidden;
+extern void *xmallocz(size_t size) __hidden;
+extern void *xmalloc_aligned(size_t size, size_t alignment) __hidden;
+extern void *xzmalloc_aligned(size_t size, size_t alignment) __hidden;
+extern void *xmemdupz(const void *data, size_t len) __hidden;
+extern void *xrealloc(void *ptr, size_t nmemb, size_t size) __hidden;
+extern void xfree_func(void *ptr) __hidden;
+extern char *xstrdup(const char *str) __hidden;
+extern char *xstrndup(const char *str, size_t size) __hidden;
+extern int xdup(int fd) __hidden;
+
+#define xfree(ptr) \
+do { \
+ if (unlikely((ptr) == NULL)) \
+ panic("xfree: NULL pointer given as argument\n"); \
+ free((ptr)); \
+ (ptr) = NULL; \
+} while (0)
+
+#endif /* XMALLOC_H */
diff --git a/xutils.c b/xutils.c
new file mode 100644
index 0000000..7a12d1e
--- /dev/null
+++ b/xutils.c
@@ -0,0 +1,1024 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Copyright 2009, 2010 Emmanuel Roullit.
+ * Copyright 2010 Marek Polacek.
+ * Subject to the GPL, version 2.
+ */
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <signal.h>
+#include <arpa/inet.h>
+#include <time.h>
+#include <sched.h>
+#include <limits.h>
+#include <stdbool.h>
+#include <netdb.h>
+#include <ifaddrs.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <sys/resource.h>
+#include <sys/epoll.h>
+#include <sys/syscall.h>
+#include <asm/unistd.h>
+#include <linux/if.h>
+#include <linux/socket.h>
+#include <linux/types.h>
+#include <linux/if_ether.h>
+#include <linux/if_packet.h>
+#include <linux/sockios.h>
+#include <netinet/tcp.h>
+#include <netinet/udp.h>
+
+#include "die.h"
+#include "xutils.h"
+#include "ring.h"
+#include "built_in.h"
+
+#define IOPRIO_CLASS_SHIFT 13
+
+enum {
+ ioprio_class_none,
+ ioprio_class_rt,
+ ioprio_class_be,
+ ioprio_class_idle,
+};
+
+enum {
+ ioprio_who_process = 1,
+ ioprio_who_pgrp,
+ ioprio_who_user,
+};
+
+enum {
+ sock_rmem_max = 0,
+ sock_rmem_def,
+ sock_wmem_max,
+ sock_wmem_def,
+};
+
+#define SMEM_SUG_MAX 104857600
+#define SMEM_SUG_DEF 4194304
+
+static const char *const to_prio[] = {
+ "none",
+ "realtime",
+ "best-effort",
+ "idle",
+};
+
+static const char *const sock_mem[] = {
+ "/proc/sys/net/core/rmem_max",
+ "/proc/sys/net/core/rmem_default",
+ "/proc/sys/net/core/wmem_max",
+ "/proc/sys/net/core/wmem_default",
+};
+
+int af_socket(int af)
+{
+ int sock;
+
+ if (unlikely(af != AF_INET && af != AF_INET6))
+ panic("Wrong AF socket type!\n");
+
+ sock = socket(af, SOCK_DGRAM, 0);
+ if (unlikely(sock < 0))
+ panic("Creation AF socket failed!\n");
+
+ return sock;
+}
+
+int pf_socket(void)
+{
+ int sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
+ if (unlikely(sock < 0))
+ panic("Creation of PF socket failed!\n");
+
+ return sock;
+}
+
+void set_sock_prio(int fd, int prio)
+{
+ int val = prio;
+ setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &val, sizeof(val));
+}
+
+void set_udp_cork(int fd)
+{
+ int state = 1;
+ setsockopt(fd, IPPROTO_UDP, UDP_CORK, &state, sizeof(state));
+}
+
+void set_udp_uncork(int fd)
+{
+ int state = 0;
+ setsockopt(fd, IPPROTO_UDP, UDP_CORK, &state, sizeof(state));
+}
+
+void set_tcp_cork(int fd)
+{
+ int state = 1;
+ setsockopt(fd, IPPROTO_TCP, TCP_CORK, &state, sizeof(state));
+}
+
+void set_tcp_uncork(int fd)
+{
+ int state = 0;
+ setsockopt(fd, IPPROTO_TCP, TCP_CORK, &state, sizeof(state));
+}
+
+void set_sock_cork(int fd, int udp)
+{
+ if (!!udp)
+ set_udp_cork(fd);
+ else
+ set_tcp_cork(fd);
+}
+
+void set_sock_uncork(int fd, int udp)
+{
+ if (!!udp)
+ set_udp_uncork(fd);
+ else
+ set_tcp_uncork(fd);
+}
+
+int set_nonblocking(int fd)
+{
+ int ret = fcntl(fd, F_SETFL, fcntl(fd, F_GETFD, 0) | O_NONBLOCK);
+ if (unlikely(ret < 0))
+ panic("Cannot fcntl!\n");
+
+ return 0;
+}
+
+int set_nonblocking_sloppy(int fd)
+{
+ return fcntl(fd, F_SETFL, fcntl(fd, F_GETFD, 0) | O_NONBLOCK);
+}
+
+void set_socket_keepalive(int fd)
+{
+ int one = 1;
+ setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &one, sizeof(one));
+}
+
+void set_tcp_nodelay(int fd)
+{
+ int one = 1;
+ setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one));
+}
+
+int set_ipv6_only(int fd)
+{
+ int one = 1;
+ return setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));
+}
+
+int set_reuseaddr(int fd)
+{
+ int ret, one = 1;
+
+ ret = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
+ if (unlikely(ret < 0))
+ panic("Cannot reuse addr!\n");
+
+ return 0;
+}
+
+void set_mtu_disc_dont(int fd)
+{
+ int mtu = IP_PMTUDISC_DONT;
+ setsockopt(fd, SOL_IP, IP_MTU_DISCOVER, &mtu, sizeof(mtu));
+}
+
+void set_epoll_descriptor(int fd_epoll, int action, int fd_toadd, int events)
+{
+ int ret;
+ struct epoll_event ev;
+
+ memset(&ev, 0, sizeof(ev));
+ ev.events = events;
+ ev.data.fd = fd_toadd;
+
+ ret = epoll_ctl(fd_epoll, action, fd_toadd, &ev);
+ if (ret < 0)
+ panic("Cannot add socket for epoll!\n");
+}
+
+int set_epoll_descriptor2(int fd_epoll, int action, int fd_toadd, int events)
+{
+ struct epoll_event ev;
+
+ memset(&ev, 0, sizeof(ev));
+ ev.events = events;
+ ev.data.fd = fd_toadd;
+
+ return epoll_ctl(fd_epoll, action, fd_toadd, &ev);
+}
+
+u32 wireless_bitrate(const char *ifname)
+{
+ int sock, ret, rate_in_mbit;
+ struct iwreq iwr;
+
+ sock = af_socket(AF_INET);
+
+ memset(&iwr, 0, sizeof(iwr));
+ strlcpy(iwr.ifr_name, ifname, IFNAMSIZ);
+
+ ret = ioctl(sock, SIOCGIWRATE, &iwr);
+ if (!ret)
+ rate_in_mbit = iwr.u.bitrate.value / 1000000;
+ else
+ rate_in_mbit = 0;
+
+ close(sock);
+
+ return rate_in_mbit;
+}
+
+void drop_privileges(bool enforce, uid_t uid, gid_t gid)
+{
+ if (enforce) {
+ if (uid == getuid())
+ panic("Uid cannot be the same as the current user!\n");
+ if (gid == getgid())
+ panic("Gid cannot be the same as the current user!\n");
+ }
+ if (setgid(gid) != 0)
+ panic("Unable to drop group privileges: %s!\n", strerror(errno));
+ if (setuid(uid) != 0)
+ panic("Unable to drop user privileges: %s!\n", strerror(errno));
+}
+
+int get_system_socket_mem(int which)
+{
+ int fd, val = -1;
+ ssize_t ret;
+ const char *file = sock_mem[which];
+ char buff[64];
+
+ fd = open(file, O_RDONLY);
+ if (fd < 0)
+ return val;
+
+ ret = read(fd, buff, sizeof(buff));
+ if (ret > 0)
+ val = atoi(buff);
+
+ close(fd);
+ return val;
+}
+
+void set_system_socket_mem(int which, int val)
+{
+ int fd;
+ const char *file = sock_mem[which];
+ ssize_t ret;
+ char buff[64];
+
+ fd = open(file, O_WRONLY);
+ if (fd < 0)
+ return;
+
+ memset(buff, 0, sizeof(buff));
+ slprintf(buff, sizeof(buff), "%d", val);
+
+ ret = write(fd, buff, strlen(buff));
+ ret = ret;
+
+ close(fd);
+}
+
+int wireless_sigqual(const char *ifname, struct iw_statistics *stats)
+{
+ int ret, sock;
+ struct iwreq iwr;
+
+ sock = af_socket(AF_INET);
+
+ memset(&iwr, 0, sizeof(iwr));
+ strlcpy(iwr.ifr_name, ifname, IFNAMSIZ);
+
+ iwr.u.data.pointer = (caddr_t) stats;
+ iwr.u.data.length = sizeof(*stats);
+ iwr.u.data.flags = 1;
+
+ ret = ioctl(sock, SIOCGIWSTATS, &iwr);
+
+ close(sock);
+
+ return ret;
+}
+
+int wireless_rangemax_sigqual(const char *ifname)
+{
+ int ret, sock, sigqual;
+ struct iwreq iwr;
+ struct iw_range iwrange;
+
+ sock = af_socket(AF_INET);
+
+ memset(&iwrange, 0, sizeof(iwrange));
+
+ memset(&iwr, 0, sizeof(iwr));
+ strlcpy(iwr.ifr_name, ifname, IFNAMSIZ);
+
+ iwr.u.data.pointer = (caddr_t) &iwrange;
+ iwr.u.data.length = sizeof(iwrange);
+ iwr.u.data.flags = 0;
+
+ ret = ioctl(sock, SIOCGIWRANGE, &iwr);
+ if (!ret)
+ sigqual = iwrange.max_qual.qual;
+ else
+ sigqual = 0;
+
+ close(sock);
+
+ return sigqual;
+}
+
+u32 ethtool_bitrate(const char *ifname)
+{
+ int ret, sock, bitrate;
+ struct ifreq ifr;
+ struct ethtool_cmd ecmd;
+
+ sock = af_socket(AF_INET);
+
+ memset(&ecmd, 0, sizeof(ecmd));
+
+ memset(&ifr, 0, sizeof(ifr));
+ strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
+
+ ecmd.cmd = ETHTOOL_GSET;
+ ifr.ifr_data = (char *) &ecmd;
+
+ ret = ioctl(sock, SIOCETHTOOL, &ifr);
+ if (ret) {
+ bitrate = 0;
+ goto out;
+ }
+
+ switch (ecmd.speed) {
+ case SPEED_10:
+ case SPEED_100:
+ case SPEED_1000:
+ case SPEED_2500:
+ case SPEED_10000:
+ bitrate = ecmd.speed;
+ break;
+ default:
+ bitrate = 0;
+ break;
+ };
+out:
+ close(sock);
+
+ return bitrate;
+}
+
+int ethtool_link(const char *ifname)
+{
+ int ret, sock;
+ struct ifreq ifr;
+ struct ethtool_value ecmd;
+
+ sock = af_socket(AF_INET);
+
+ memset(&ecmd, 0, sizeof(ecmd));
+
+ memset(&ifr, 0, sizeof(ifr));
+ strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
+
+ ecmd.cmd = ETHTOOL_GLINK;
+ ifr.ifr_data = (char *) &ecmd;
+
+ ret = ioctl(sock, SIOCETHTOOL, &ifr);
+ if (ret)
+ ret = -EINVAL;
+ else
+ ret = !!ecmd.data;
+
+ close(sock);
+ return ret;
+}
+
+int ethtool_drvinf(const char *ifname, struct ethtool_drvinfo *drvinf)
+{
+ int ret, sock;
+ struct ifreq ifr;
+
+ sock = af_socket(AF_INET);
+
+ memset(drvinf, 0, sizeof(*drvinf));
+
+ memset(&ifr, 0, sizeof(ifr));
+ strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
+
+ drvinf->cmd = ETHTOOL_GDRVINFO;
+ ifr.ifr_data = (char *) drvinf;
+
+ ret = ioctl(sock, SIOCETHTOOL, &ifr);
+
+ close(sock);
+
+ return ret;
+}
+
+u32 device_bitrate(const char *ifname)
+{
+ u32 speed_c, speed_w;
+
+ speed_c = ethtool_bitrate(ifname);
+ speed_w = wireless_bitrate(ifname);
+
+ return (speed_c == 0 ? speed_w : speed_c);
+}
+
+int device_ifindex(const char *ifname)
+{
+ int ret, sock, index;
+ struct ifreq ifr;
+
+ if (!strncmp("any", ifname, strlen("any")))
+ return 0;
+
+ sock = af_socket(AF_INET);
+
+ memset(&ifr, 0, sizeof(ifr));
+ strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
+
+ ret = ioctl(sock, SIOCGIFINDEX, &ifr);
+ if (!ret)
+ index = ifr.ifr_ifindex;
+ else
+ index = -1;
+
+ close(sock);
+
+ return index;
+}
+
+static int __device_address6(const char *ifname, struct sockaddr_storage *ss)
+{
+ int ret, family, found = -EINVAL;
+ struct ifaddrs *ifaddr, *ifa;
+
+ ret = getifaddrs(&ifaddr);
+ if (ret < 0)
+ panic("Cannot get device addresses for IPv6!\n");
+
+ for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
+ family = ifa->ifa_addr->sa_family;
+ if (family != AF_INET6)
+ continue;
+ if (strcmp(ifa->ifa_name, ifname))
+ continue;
+
+ memcpy(ss, ifa->ifa_addr, sizeof(*ss));
+ found = 0;
+ break;
+ }
+
+ freeifaddrs(ifaddr);
+ return found;
+}
+
+int device_address(const char *ifname, int af, struct sockaddr_storage *ss)
+{
+ int ret, sock;
+ struct ifreq ifr;
+
+ if (!ss)
+ return -EINVAL;
+ if (!strncmp("any", ifname, strlen("any")))
+ return -EINVAL;
+ if (af == AF_INET6)
+ return __device_address6(ifname, ss);
+
+ sock = af_socket(af);
+
+ memset(&ifr, 0, sizeof(ifr));
+ strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
+
+ ifr.ifr_addr.sa_family = af;
+
+ ret = ioctl(sock, SIOCGIFADDR, &ifr);
+ if (!ret)
+ memcpy(ss, &ifr.ifr_addr, sizeof(ifr.ifr_addr));
+
+ close(sock);
+
+ return ret;
+}
+
+int device_mtu(const char *ifname)
+{
+ int ret, sock, mtu;
+ struct ifreq ifr;
+
+ sock = af_socket(AF_INET);
+
+ memset(&ifr, 0, sizeof(ifr));
+ strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
+
+ ret = ioctl(sock, SIOCGIFMTU, &ifr);
+ if (!ret)
+ mtu = ifr.ifr_mtu;
+ else
+ mtu = 0;
+
+ close(sock);
+
+ return mtu;
+}
+
+short device_get_flags(const char *ifname)
+{
+ /* Really, it's short! Look at struct ifreq */
+ short flags;
+ int ret, sock;
+ struct ifreq ifr;
+
+ sock = af_socket(AF_INET);
+
+ memset(&ifr, 0, sizeof(ifr));
+ strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
+
+ ret = ioctl(sock, SIOCGIFFLAGS, &ifr);
+ if (!ret)
+ flags = ifr.ifr_flags;
+ else
+ flags = 0;
+
+ close(sock);
+
+ return flags;
+}
+
+void device_set_flags(const char *ifname, const short flags)
+{
+ int ret, sock;
+ struct ifreq ifr;
+
+ sock = af_socket(AF_INET);
+
+ memset(&ifr, 0, sizeof(ifr));
+ strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
+
+ ifr.ifr_flags = flags;
+
+ ret = ioctl(sock, SIOCSIFFLAGS, &ifr);
+ if (ret < 0)
+ panic("Cannot set NIC flags!\n");
+
+ close(sock);
+}
+
+int device_irq_number(const char *ifname)
+{
+ /*
+ * Since fetching IRQ numbers from SIOCGIFMAP is deprecated and not
+ * supported anymore, we need to grab them from procfs
+ */
+ int irq = 0;
+ char *buffp;
+ char buff[512];
+ char sysname[512];
+ FILE *fp;
+
+ if (!strncmp("lo", ifname, strlen("lo")))
+ return 0;
+
+ fp = fopen("/proc/interrupts", "r");
+ if (!fp)
+ panic("Cannot open /proc/interrupts!\n");
+
+ memset(buff, 0, sizeof(buff));
+ while (fgets(buff, sizeof(buff), fp) != NULL) {
+ buff[sizeof(buff) - 1] = 0;
+
+ if (strstr(buff, ifname) == NULL)
+ continue;
+
+ buffp = buff;
+ while (*buffp != ':')
+ buffp++;
+ *buffp = 0;
+ irq = atoi(buff);
+
+ memset(buff, 0, sizeof(buff));
+ }
+
+ fclose(fp);
+
+ if (irq != 0)
+ return irq;
+ /*
+ * Try sysfs as fallback. Probably wireless devices will be found
+ * here. We return silently if it fails ...
+ */
+ slprintf(sysname, sizeof(sysname), "/sys/class/net/%s/device/irq",
+ ifname);
+
+ fp = fopen(sysname, "r");
+ if (!fp)
+ return -ENOENT;
+
+ memset(buff, 0, sizeof(buff));
+ if(fgets(buff, sizeof(buff), fp) != NULL) {
+ buff[sizeof(buff) - 1] = 0;
+ irq = atoi(buff);
+ }
+
+ fclose(fp);
+
+ return irq;
+}
+
+int device_set_irq_affinity_list(int irq, unsigned long from, unsigned long to)
+{
+ int ret, fd;
+ char file[256], list[64];
+
+ slprintf(file, sizeof(file), "/proc/irq/%d/smp_affinity_list", irq);
+ slprintf(list, sizeof(list), "%lu-%lu\n", from, to);
+
+ fd = open(file, O_WRONLY);
+ if (fd < 0)
+ return -ENOENT;
+
+ ret = write(fd, list, strlen(list));
+
+ close(fd);
+ return ret;
+}
+
+int device_bind_irq_to_cpu(int irq, int cpu)
+{
+ int ret;
+ char buff[256];
+ char file[256];
+ FILE *fp;
+
+ /* Note: first CPU begins with CPU 0 */
+ if (irq < 0 || cpu < 0)
+ return -EINVAL;
+
+ memset(file, 0, sizeof(file));
+ memset(buff, 0, sizeof(buff));
+
+ /* smp_affinity starts counting with CPU 1, 2, ... */
+ cpu = cpu + 1;
+ sprintf(file, "/proc/irq/%d/smp_affinity", irq);
+
+ fp = fopen(file, "w");
+ if (!fp)
+ return -ENOENT;
+
+ sprintf(buff, "%d", cpu);
+ ret = fwrite(buff, sizeof(buff), 1, fp);
+
+ fclose(fp);
+ return (ret > 0 ? 0 : ret);
+}
+
+void sock_print_net_stats(int sock, unsigned long skipped)
+{
+ int ret;
+ struct tpacket_stats kstats;
+
+ socklen_t slen = sizeof(kstats);
+
+ memset(&kstats, 0, sizeof(kstats));
+ ret = getsockopt(sock, SOL_PACKET, PACKET_STATISTICS, &kstats, &slen);
+ if (ret > -1) {
+ uint64_t packets = kstats.tp_packets;
+ uint64_t drops = kstats.tp_drops;
+
+ printf("\r%12ld packets incoming\n", packets);
+ printf("\r%12ld packets passed filter\n", packets - drops - skipped);
+ printf("\r%12ld packets failed filter (out of space)\n", drops + skipped);
+ if (kstats.tp_packets > 0)
+ printf("\r%12.4lf%\% packet droprate\n", (1.0 * drops / packets) * 100.0);
+ }
+}
+
+void register_signal(int signal, void (*handler)(int))
+{
+ sigset_t block_mask;
+ struct sigaction saction;
+
+ sigfillset(&block_mask);
+
+ saction.sa_handler = handler;
+ saction.sa_mask = block_mask;
+ saction.sa_flags = SA_RESTART;
+
+ sigaction(signal, &saction, NULL);
+}
+
+void register_signal_f(int signal, void (*handler)(int), int flags)
+{
+ sigset_t block_mask;
+ struct sigaction saction;
+
+ sigfillset(&block_mask);
+
+ saction.sa_handler = handler;
+ saction.sa_mask = block_mask;
+ saction.sa_flags = flags;
+
+ sigaction(signal, &saction, NULL);
+}
+
+short enter_promiscuous_mode(char *ifname)
+{
+ short ifflags;
+
+ if (!strncmp("any", ifname, strlen("any")))
+ return 0;
+
+ ifflags = device_get_flags(ifname);
+ device_set_flags(ifname, ifflags | IFF_PROMISC);
+
+ return ifflags;
+}
+
+void leave_promiscuous_mode(char *ifname, short oldflags)
+{
+ if (!strncmp("any", ifname, strlen("any")))
+ return;
+
+ device_set_flags(ifname, oldflags);
+}
+
+int device_up_and_running(char *ifname)
+{
+ if (!ifname)
+ return -EINVAL;
+ if (!strncmp("any", ifname, strlen("any")))
+ return 1;
+
+ return (device_get_flags(ifname) & (IFF_UP | IFF_RUNNING)) == (IFF_UP | IFF_RUNNING);
+}
+
+void cpu_affinity(int cpu)
+{
+ int ret;
+ cpu_set_t cpu_bitmask;
+
+ CPU_ZERO(&cpu_bitmask);
+ CPU_SET(cpu, &cpu_bitmask);
+
+ ret = sched_setaffinity(getpid(), sizeof(cpu_bitmask),
+ &cpu_bitmask);
+ if (ret)
+ panic("Can't set this cpu affinity!\n");
+}
+
+int set_proc_prio(int priority)
+{
+ int ret = setpriority(PRIO_PROCESS, getpid(), priority);
+ if (ret)
+ panic("Can't set nice val to %i!\n", priority);
+
+ return 0;
+}
+
+int set_sched_status(int policy, int priority)
+{
+ int ret, min_prio, max_prio;
+ struct sched_param sp;
+
+ max_prio = sched_get_priority_max(policy);
+ min_prio = sched_get_priority_min(policy);
+
+ if (max_prio == -1 || min_prio == -1)
+ printf("Cannot determine scheduler prio limits!\n");
+ else if (priority < min_prio)
+ priority = min_prio;
+ else if (priority > max_prio)
+ priority = max_prio;
+
+ memset(&sp, 0, sizeof(sp));
+ sp.sched_priority = priority;
+
+ ret = sched_setscheduler(getpid(), policy, &sp);
+ if (ret) {
+ printf("Cannot set scheduler policy!\n");
+ return -EINVAL;
+ }
+
+ ret = sched_setparam(getpid(), &sp);
+ if (ret) {
+ printf("Cannot set scheduler prio!\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static inline int ioprio_set(int which, int who, int ioprio)
+{
+ return syscall(SYS_ioprio_set, which, who, ioprio);
+}
+
+static inline int ioprio_get(int which, int who)
+{
+ return syscall(SYS_ioprio_get, which, who);
+}
+
+static void ioprio_setpid(pid_t pid, int ioprio, int ioclass)
+{
+ int ret = ioprio_set(ioprio_who_process, pid,
+ ioprio | ioclass << IOPRIO_CLASS_SHIFT);
+ if (ret < 0)
+ panic("Failed to set io prio for pid!\n");
+}
+
+void ioprio_print(void)
+{
+ int ioprio = ioprio_get(ioprio_who_process, getpid());
+ if (ioprio < 0)
+ panic("Failed to fetch io prio for pid!\n");
+ else {
+ int ioclass = ioprio >> IOPRIO_CLASS_SHIFT;
+ if (ioclass != ioprio_class_idle) {
+ ioprio &= 0xff;
+ printf("%s: prio %d\n", to_prio[ioclass], ioprio);
+ } else
+ printf("%s\n", to_prio[ioclass]);
+ }
+}
+
+void set_ioprio_rt(void)
+{
+ ioprio_setpid(getpid(), 4, ioprio_class_rt);
+}
+
+void set_ioprio_be(void)
+{
+ ioprio_setpid(getpid(), 4, ioprio_class_be);
+}
+
+void xlockme(void)
+{
+ if (mlockall(MCL_CURRENT | MCL_FUTURE) != 0)
+ panic("Cannot lock pages!\n");
+}
+
+void xunlockme(void)
+{
+ munlockall();
+}
+
+size_t strlcpy(char *dest, const char *src, size_t size)
+{
+ size_t ret = strlen(src);
+
+ if (size) {
+ size_t len = (ret >= size) ? size - 1 : ret;
+
+ memcpy(dest, src, len);
+ dest[len] = '\0';
+ }
+
+ return ret;
+}
+
+static inline int vslprintf(char *dst, size_t size, const char *fmt, va_list ap)
+{
+ int ret;
+
+ ret = vsnprintf(dst, size, fmt, ap);
+ dst[size - 1] = '\0';
+
+ return ret;
+}
+
+int slprintf(char *dst, size_t size, const char *fmt, ...)
+{
+ int ret;
+ va_list ap;
+
+ va_start(ap, fmt);
+ ret = vslprintf(dst, size, fmt, ap);
+ va_end(ap);
+
+ return ret;
+}
+
+int slprintf_nocheck(char *dst, size_t size, const char *fmt, ...)
+{
+ int ret;
+ va_list ap;
+
+ va_start(ap, fmt);
+ ret = vslprintf(dst, size, fmt, ap);
+ va_end(ap);
+
+ return ret;
+}
+
+noinline void *xmemset(void *s, int c, size_t n)
+{
+ size_t i;
+ uint8_t *ptr = s;
+
+ for (i = 0; i < n; ++i)
+ ptr[i] = (uint8_t) c;
+
+ return ptr;
+}
+
+char *strtrim_right(char *p, char c)
+{
+ char *end;
+ size_t len;
+
+ len = strlen(p);
+ while (*p && len) {
+ end = p + len - 1;
+ if (c == *end)
+ *end = 0;
+ else
+ break;
+ len = strlen(p);
+ }
+
+ return p;
+}
+
+int get_default_sched_policy(void)
+{
+ return SCHED_FIFO;
+}
+
+int get_default_sched_prio(void)
+{
+ return sched_get_priority_max(get_default_sched_policy());
+}
+
+int get_number_cpus(void)
+{
+ return sysconf(_SC_NPROCESSORS_CONF);
+}
+
+int get_number_cpus_online(void)
+{
+ return sysconf(_SC_NPROCESSORS_ONLN);
+}
+
+int get_default_proc_prio(void)
+{
+ return -20;
+}
+
+void set_system_socket_memory(int *vals, size_t len)
+{
+ bug_on(len != 4);
+
+ if ((vals[0] = get_system_socket_mem(sock_rmem_max)) < SMEM_SUG_MAX)
+ set_system_socket_mem(sock_rmem_max, SMEM_SUG_MAX);
+ if ((vals[1] = get_system_socket_mem(sock_rmem_def)) < SMEM_SUG_DEF)
+ set_system_socket_mem(sock_rmem_def, SMEM_SUG_DEF);
+ if ((vals[2] = get_system_socket_mem(sock_wmem_max)) < SMEM_SUG_MAX)
+ set_system_socket_mem(sock_wmem_max, SMEM_SUG_MAX);
+ if ((vals[3] = get_system_socket_mem(sock_wmem_def)) < SMEM_SUG_DEF)
+ set_system_socket_mem(sock_wmem_def, SMEM_SUG_DEF);
+}
+
+void reset_system_socket_memory(int *vals, size_t len)
+{
+ bug_on(len != 4);
+
+ set_system_socket_mem(sock_rmem_max, vals[0]);
+ set_system_socket_mem(sock_rmem_def, vals[1]);
+ set_system_socket_mem(sock_wmem_max, vals[2]);
+ set_system_socket_mem(sock_wmem_def, vals[3]);
+}
+
+void set_itimer_interval_value(struct itimerval *itimer, unsigned long sec,
+ unsigned long usec)
+{
+ itimer->it_interval.tv_sec = sec;
+ itimer->it_interval.tv_usec = usec;
+
+ itimer->it_value.tv_sec = sec;
+ itimer->it_value.tv_usec = usec;
+}
diff --git a/xutils.h b/xutils.h
new file mode 100644
index 0000000..d1835e4
--- /dev/null
+++ b/xutils.h
@@ -0,0 +1,94 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * Copyright 2009, 2010 Daniel Borkmann.
+ * Copyright 2009, 2010 Emmanuel Roullit.
+ * Subject to the GPL, version 2.
+ */
+
+#ifndef XSYS_H
+#define XSYS_H
+
+#define _GNU_SOURCE
+#include <errno.h>
+#include <stdint.h>
+#include <sys/socket.h>
+#include <unistd.h>
+#include <linux/ethtool.h>
+#include <linux/if.h>
+#include <linux/wireless.h>
+#include <poll.h>
+#include <sys/poll.h>
+#include <sched.h>
+#include <stdbool.h>
+#include <sys/resource.h>
+#include <sys/time.h>
+
+#include "built_in.h"
+
+extern int af_socket(int af);
+extern int pf_socket(void);
+extern int wireless_sigqual(const char *ifname, struct iw_statistics *stats);
+extern int wireless_rangemax_sigqual(const char *ifname);
+extern u32 wireless_bitrate(const char *ifname);
+extern u32 ethtool_bitrate(const char *ifname);
+extern u32 device_bitrate(const char *ifname);
+extern int ethtool_drvinf(const char *ifname, struct ethtool_drvinfo *drvinf);
+extern int ethtool_link(const char *ifname);
+extern int device_mtu(const char *ifname);
+extern int device_address(const char *ifname, int af, struct sockaddr_storage *ss);
+extern int device_irq_number(const char *ifname);
+extern int device_set_irq_affinity_list(int irq, unsigned long from, unsigned long to);
+extern int device_bind_irq_to_cpu(int irq, int cpu);
+extern void sock_print_net_stats(int sock, unsigned long skipped);
+extern int device_ifindex(const char *ifname);
+extern short device_get_flags(const char *ifname);
+extern void device_set_flags(const char *ifname, const short flags);
+extern void drop_privileges(bool enforce, uid_t uid, gid_t gid);
+extern void xlockme(void);
+extern void xunlockme(void);
+extern int set_nonblocking(int fd);
+extern int set_nonblocking_sloppy(int fd);
+extern int set_reuseaddr(int fd);
+extern void set_sock_prio(int fd, int prio);
+extern void set_tcp_cork(int fd);
+extern void set_tcp_uncork(int fd);
+extern void set_udp_cork(int fd);
+extern void set_udp_uncork(int fd);
+extern void set_sock_cork(int fd, int udp);
+extern void set_sock_uncork(int fd, int udp);
+extern void set_tcp_nodelay(int fd);
+extern void set_socket_keepalive(int fd);
+extern int set_ipv6_only(int fd);
+extern void set_mtu_disc_dont(int fd);
+extern int get_system_socket_mem(int which);
+extern void set_system_socket_mem(int which, int val);
+extern void register_signal(int signal, void (*handler)(int));
+extern void register_signal_f(int signal, void (*handler)(int), int flags);
+extern short enter_promiscuous_mode(char *ifname);
+extern void leave_promiscuous_mode(char *ifname, short oldflags);
+extern int device_up_and_running(char *ifname);
+extern void set_epoll_descriptor(int fd_epoll, int action, int fd_toadd, int events);
+extern int set_epoll_descriptor2(int fd_epoll, int action, int fd_toadd, int events);
+extern void cpu_affinity(int cpu);
+extern int set_cpu_affinity(char *str, int inverted);
+extern int set_proc_prio(int prio);
+extern int set_sched_status(int policy, int priority);
+extern void ioprio_print(void);
+extern void set_ioprio_rt(void);
+extern void set_ioprio_be(void);
+extern size_t strlcpy(char *dest, const char *src, size_t size);
+extern int slprintf(char *dst, size_t size, const char *fmt, ...) __check_format_printf(3, 4);
+extern int slprintf_nocheck(char *dst, size_t size, const char *fmt, ...);
+extern noinline void *xmemset(void *s, int c, size_t n);
+extern char *strtrim_right(char *p, char c);
+extern int get_default_sched_policy(void);
+extern int get_default_sched_prio(void);
+extern int get_number_cpus(void);
+extern int get_number_cpus_online(void);
+extern int get_default_proc_prio(void);
+extern void set_system_socket_memory(int *vals, size_t len);
+extern void reset_system_socket_memory(int *vals, size_t len);
+extern void set_itimer_interval_value(struct itimerval *itimer, unsigned long sec,
+ unsigned long usec);
+
+#endif /* XSYS_H */