diff options
-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 */ |