diff options
author | Daniel Borkmann <dborkman@redhat.com> | 2013-03-15 10:41:48 +0100 |
---|---|---|
committer | Daniel Borkmann <dborkman@redhat.com> | 2013-03-15 10:41:48 +0100 |
commit | 1a9fbac03c684f29cff9ac44875bd9504a89f54e (patch) | |
tree | 1b2e40dbe5dc1899ef5b62c4325c9b94c9c450fc |
all: import netsniff-ng 0.5.8-rc0 source
We decided to get rid of the old Git history and start a new one for
several reasons:
*) Allow / enforce only high-quality commits (which was not the case
for many commits in the history), have a policy that is more close
to the one from the Linux kernel. With high quality commits, we
mean code that is logically split into commits and commit messages
that are signed-off and have a proper subject and message body.
We do not allow automatic Github merges anymore, since they are
total bullshit. However, we will either cherry-pick your patches
or pull them manually.
*) The old archive was about ~27MB for no particular good reason.
This basically derived from the bad decision that also some PDF
files where stored there. From this moment onwards, no binary
objects are allowed to be stored in this repository anymore.
The old archive is not wiped away from the Internet. You will still
be able to find it, e.g. on git.cryptoism.org etc.
Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
-rw-r--r-- | .gitignore | 42 | ||||
-rw-r--r-- | AUTHORS | 52 | ||||
-rw-r--r-- | COPYING | 347 | ||||
-rw-r--r-- | Documentation/CodingStyle | 833 | ||||
-rw-r--r-- | Documentation/Downstream | 140 | ||||
-rw-r--r-- | Documentation/KnownIssues | 97 | ||||
-rw-r--r-- | Documentation/Mirrors | 17 | ||||
-rw-r--r-- | Documentation/Performance | 278 | ||||
-rw-r--r-- | Documentation/RelatedWork | 87 | ||||
-rw-r--r-- | Documentation/Sponsors | 14 | ||||
-rw-r--r-- | Documentation/SubmittingPatches | 122 | ||||
-rw-r--r-- | Documentation/Summary | 59 | ||||
-rw-r--r-- | INSTALL | 160 | ||||
-rw-r--r-- | Makefile | 307 | ||||
-rw-r--r-- | README | 58 | ||||
-rw-r--r-- | REPORTING-BUGS | 18 | ||||
-rw-r--r-- | astraceroute.c | 1077 | ||||
-rw-r--r-- | astraceroute/.gitignore | 5 | ||||
-rw-r--r-- | astraceroute/Makefile | 13 | ||||
-rw-r--r-- | bpf.c | 765 | ||||
-rw-r--r-- | bpf.h | 135 | ||||
-rw-r--r-- | bpf_comp.c | 43 | ||||
-rw-r--r-- | bpf_lexer.l | 126 | ||||
-rw-r--r-- | bpf_parser.y | 673 | ||||
-rw-r--r-- | bpfc.c | 132 | ||||
-rw-r--r-- | bpfc/.gitignore | 4 | ||||
-rw-r--r-- | bpfc/Makefile | 12 | ||||
-rw-r--r-- | built_in.h | 344 | ||||
-rw-r--r-- | colors.h | 31 | ||||
-rw-r--r-- | configs/ether.conf | 291 | ||||
-rw-r--r-- | configs/geoip.conf | 2 | ||||
-rw-r--r-- | configs/oui.conf | 17557 | ||||
-rw-r--r-- | configs/stddef.h | 197 | ||||
-rw-r--r-- | configs/tcp.conf | 1100 | ||||
-rw-r--r-- | configs/udp.conf | 1056 | ||||
-rw-r--r-- | cpusched.c | 180 | ||||
-rw-r--r-- | cpusched.h | 16 | ||||
-rw-r--r-- | csum.h | 179 | ||||
-rw-r--r-- | ct_client.c | 440 | ||||
-rw-r--r-- | ct_server.c | 811 | ||||
-rw-r--r-- | ct_servmgmt.c | 278 | ||||
-rw-r--r-- | ct_servmgmt.h | 21 | ||||
-rw-r--r-- | ct_usermgmt.c | 772 | ||||
-rw-r--r-- | ct_usermgmt.h | 49 | ||||
-rw-r--r-- | curve.c | 281 | ||||
-rw-r--r-- | curve.h | 218 | ||||
-rw-r--r-- | curvetun.c | 692 | ||||
-rw-r--r-- | curvetun.h | 42 | ||||
-rw-r--r-- | curvetun/.gitignore | 7 | ||||
-rw-r--r-- | curvetun/Makefile | 17 | ||||
-rw-r--r-- | curvetun/abiname.c | 46 | ||||
-rwxr-xr-x | curvetun/build_nacl.sh | 46 | ||||
-rwxr-xr-x | curvetun/nacl_path.sh | 18 | ||||
-rw-r--r-- | die.h | 69 | ||||
-rw-r--r-- | dissector.c | 115 | ||||
-rw-r--r-- | dissector.h | 64 | ||||
-rw-r--r-- | dissector_80211.c | 54 | ||||
-rw-r--r-- | dissector_80211.h | 43 | ||||
-rw-r--r-- | dissector_eth.c | 219 | ||||
-rw-r--r-- | dissector_eth.h | 48 | ||||
-rw-r--r-- | flowtop.c | 1208 | ||||
-rw-r--r-- | flowtop/.gitignore | 4 | ||||
-rw-r--r-- | flowtop/Makefile | 19 | ||||
-rw-r--r-- | geoip.c | 595 | ||||
-rw-r--r-- | geoip.h | 29 | ||||
-rw-r--r-- | hash.c | 169 | ||||
-rw-r--r-- | hash.h | 86 | ||||
-rw-r--r-- | ifpps.c | 949 | ||||
-rw-r--r-- | ifpps/.gitignore | 4 | ||||
-rw-r--r-- | ifpps/Makefile | 6 | ||||
-rw-r--r-- | ipv4.h | 36 | ||||
-rw-r--r-- | ipv6.h | 39 | ||||
-rw-r--r-- | locking.h | 97 | ||||
-rw-r--r-- | mac80211.c | 223 | ||||
-rw-r--r-- | mac80211.h | 13 | ||||
-rw-r--r-- | netsniff-ng.c | 1369 | ||||
-rw-r--r-- | netsniff-ng/.gitignore | 4 | ||||
-rw-r--r-- | netsniff-ng/Makefile | 50 | ||||
-rw-r--r-- | oui.c | 104 | ||||
-rw-r--r-- | oui.h | 19 | ||||
-rw-r--r-- | patricia.c | 353 | ||||
-rw-r--r-- | patricia.h | 49 | ||||
-rw-r--r-- | pcap_io.h | 581 | ||||
-rw-r--r-- | pcap_mm.c | 197 | ||||
-rw-r--r-- | pcap_rw.c | 79 | ||||
-rw-r--r-- | pcap_sg.c | 193 | ||||
-rw-r--r-- | pkt_buff.h | 112 | ||||
-rw-r--r-- | proto.h | 34 | ||||
-rw-r--r-- | proto_80211_mac_hdr.c | 3627 | ||||
-rw-r--r-- | proto_arp.c | 163 | ||||
-rw-r--r-- | proto_ethernet.c | 80 | ||||
-rw-r--r-- | proto_icmpv4.c | 68 | ||||
-rw-r--r-- | proto_icmpv6.c | 1641 | ||||
-rw-r--r-- | proto_igmp.c | 560 | ||||
-rw-r--r-- | proto_ip_authentication_hdr.c | 87 | ||||
-rw-r--r-- | proto_ip_esp.c | 53 | ||||
-rw-r--r-- | proto_ipv4.c | 201 | ||||
-rw-r--r-- | proto_ipv6.c | 112 | ||||
-rw-r--r-- | proto_ipv6_dest_opts.c | 101 | ||||
-rw-r--r-- | proto_ipv6_fragm.c | 70 | ||||
-rw-r--r-- | proto_ipv6_hop_by_hop.c | 100 | ||||
-rw-r--r-- | proto_ipv6_in_ipv4.c | 25 | ||||
-rw-r--r-- | proto_ipv6_mobility_hdr.c | 311 | ||||
-rw-r--r-- | proto_ipv6_no_nxt_hdr.c | 41 | ||||
-rw-r--r-- | proto_ipv6_routing.c | 163 | ||||
-rw-r--r-- | proto_lldp.c | 469 | ||||
-rw-r--r-- | proto_mpls_unicast.c | 109 | ||||
-rw-r--r-- | proto_none.c | 83 | ||||
-rw-r--r-- | proto_tcp.c | 155 | ||||
-rw-r--r-- | proto_udp.c | 89 | ||||
-rw-r--r-- | proto_vlan.c | 61 | ||||
-rw-r--r-- | proto_vlan_q_in_q.c | 63 | ||||
-rw-r--r-- | protos.h | 37 | ||||
-rw-r--r-- | ring.h | 174 | ||||
-rw-r--r-- | ring_rx.c | 130 | ||||
-rw-r--r-- | ring_rx.h | 31 | ||||
-rw-r--r-- | ring_tx.c | 136 | ||||
-rw-r--r-- | ring_tx.h | 40 | ||||
-rw-r--r-- | stun.c | 190 | ||||
-rwxr-xr-x | test/dissector_fuzz.sh | 68 | ||||
-rw-r--r-- | tprintf.c | 169 | ||||
-rw-r--r-- | tprintf.h | 27 | ||||
-rw-r--r-- | trafgen.c | 1064 | ||||
-rw-r--r-- | trafgen/.gitignore | 4 | ||||
-rw-r--r-- | trafgen/Makefile | 16 | ||||
-rw-r--r-- | trafgen_conf.h | 55 | ||||
-rw-r--r-- | trafgen_lexer.l | 152 | ||||
-rw-r--r-- | trafgen_parser.y | 611 | ||||
-rw-r--r-- | trie.c | 117 | ||||
-rw-r--r-- | trie.h | 21 | ||||
-rwxr-xr-x | update-oui.py | 81 | ||||
-rw-r--r-- | xio.c | 248 | ||||
-rw-r--r-- | xio.h | 22 | ||||
-rw-r--r-- | xmalloc.c | 151 | ||||
-rw-r--r-- | xmalloc.h | 35 | ||||
-rw-r--r-- | xutils.c | 1024 | ||||
-rw-r--r-- | xutils.h | 94 |
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 @@ -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. ;) @@ -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. @@ -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" @@ -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 @@ -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"); +} @@ -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); +} @@ -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 & 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 */ @@ -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 */ @@ -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; +} @@ -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 @@ -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, ð_ports_udp, port); +} + +char *lookup_port_tcp(unsigned int id) +{ + return __do_lookup_inline(id, port, ð_ports_tcp, port); +} + +char *lookup_ether_type(unsigned int id) +{ + return __do_lookup_inline(id, port, ð_ether_types, port); +} + +#ifdef __WITH_PROTOS +static inline void dissector_init_entry(int type) +{ + dissector_set_print_type(ðernet_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(ð_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(ð_lay2, dissector_set_print_type, type); +} + +static void dissector_init_layer_3(int type) +{ + init_hash(ð_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(ð_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 = ð_ports_udp; + break; + case PORTS_TCP: + file = "/etc/netsniff-ng/tcp.conf"; + table = ð_ports_tcp; + break; + case PORTS_ETHER: + file = "/etc/netsniff-ng/ether.conf"; + table = ð_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(ð_lay2); + free_hash(ð_lay3); + + for_each_hash(ð_ether_types, dissector_cleanup_ports); + for_each_hash(ð_ports_udp, dissector_cleanup_ports); + for_each_hash(ð_ports_tcp, dissector_cleanup_ports); + + free_hash(ð_ether_types); + free_hash(ð_ports_udp); + free_hash(ð_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 ðernet_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 @@ -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)) ? : ∅ +} + +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) ? : ∅ +} + +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; +} @@ -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 */ @@ -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; +} @@ -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 @@ -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 @@ -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 */ @@ -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 @@ -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; +} @@ -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 */ @@ -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, ð_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, ð_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, ð_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, ð_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, ð_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, ð_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, ð_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, ð_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, ð_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, ð_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, ð_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, ð_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, ð_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, ð_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, ð_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, ð_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, ð_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, ð_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, ð_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, ð_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, ð_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, ð_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, ð_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, ð_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 */ @@ -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, ×ource, + 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 */ @@ -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 *) ∑ + + 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); +} @@ -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); +} @@ -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() @@ -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); +} @@ -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 */ |