diff options
author | Gerald Combs <gerald@wireshark.org> | 2010-12-06 18:30:14 +0000 |
---|---|---|
committer | Gerald Combs <gerald@wireshark.org> | 2010-12-06 18:30:14 +0000 |
commit | 0bf5fcd6b3cf4ed0f67388fcc04b2eb2593c02fd (patch) | |
tree | 722daea864e1efe655c8cb6ccb793789498b5a28 /tools/make-manuf | |
parent | 4d902b5c5ba93b853c5e0883ffa32648367c7bfa (diff) |
Move make-manuf to the tools directory.
svn path=/trunk/; revision=35130
Diffstat (limited to 'tools/make-manuf')
-rwxr-xr-x | tools/make-manuf | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/tools/make-manuf b/tools/make-manuf new file mode 100755 index 0000000000..b31e14e2fd --- /dev/null +++ b/tools/make-manuf @@ -0,0 +1,211 @@ +#!/usr/bin/perl -w +# +# $Id$ +# +# Make-manuf - Creates a file containing ethernet OUIs and their +# company IDs. It merges the databases at +# http://standards.ieee.org/regauth/oui/index.shtml and +# http://www.cavebear.com/CaveBear/Ethernet/ +# with entries in our template file. +# +# The script reads the comments at the top of "manuf.tmpl" and writes +# them to "manuf". It then joins the manufacturer listing in "manuf.tmpl" +# with the listing in "oui.txt", with the entries in "manuf.tmpl" taking +# precedence. + +# LWP is part of the standard Perl module libwww + +use Encode; +use open ':encoding(utf8)'; + +eval "require LWP::UserAgent;"; +if( $@ ) { + die "LWP isn't installed. It is part of the standard Perl\n" . + " module libwww. Bailing.\n"; +} +$agent = LWP::UserAgent->new; + +$template = "manuf.tmpl"; +$wkatmpl = "wka.tmpl"; +$outfile = "manuf"; +$inheader = 1; +$oui_url = "http://standards.ieee.org/regauth/oui/oui.txt"; +$iab_url = "http://standards.ieee.org/regauth/oui/iab.txt"; +$cb_url = "http://www.cavebear.com/CaveBear/Ethernet/Ethernet.txt"; +%oui_list = (); +$hp = "[0-9a-fA-F]{2}"; +$oui_re = "$hp:$hp:$hp"; +$cb_re = "$hp$hp$hp"; +$ieee_re = "$hp-$hp-$hp"; + +$tmpl_added = 0; +$cb_added = 0; +$cb_skipped = 0; +$oui_added = 0; +$oui_skipped = 0; +$iab_added = 0; +$iab_skipped = 0; + +sub shorten +{ + my $origmanuf = shift; + my $manuf = " " . $origmanuf . " "; + # Remove any punctuation + $manuf =~ tr/',.()/ /; + # & isn't needed when Standalone + $manuf =~ s/ \& / /g; + # Remove any "the", "inc", "plc" ... + $manuf =~ s/\s(the|inc|incorporated|plc||systems|corp|corporation|s\/a|a\/s|ab|ag|kg|gmbh|co|company|limited|ltd|holding|spa)(?= )//gi; + # Convert to consistent case + $manuf =~ s/(\w+)/\u\L$1/g; + # Remove all spaces + $manuf =~ s/\s+//g; + # Truncate all names to a reasonable length, say, 8 characters. + # If the string contains UTF-8, this may be substantially more than 8 bytes. + $manuf = substr($manuf, 0, 8); + + if ($manuf =~ /\Q$origmanuf\E/i) { + return $manuf; + } else { + return sprintf("%-22s # %s", $manuf, $origmanuf); + } +} + +sub fetch +{ + my $url = shift; + print "Fetching $url.\n"; + $request = HTTP::Request->new(GET => $url); + $result = $agent->request($request); + + if (!$result->is_success) { + die ("Error fetching $url: " . $result->status_line . "\n"); + } + return decode("iso-8859-1", $result->content); +} + +# Write out the header and populate the OUI list with our entries. + +open (TMPL, "< $template") || + die "Couldn't open template file for reading ($template)\n"; + +while ($line = <TMPL>) { + chomp($line); + if ($line !~ /^$oui_re\s+\S/ && $inheader) { + $header .= "$line\n"; + } elsif (($oui, $manuf) = ($line =~ /^($oui_re)\s+(\S.*)$/)) { + $inheader = 0; + # Ensure OUI is all upper-case + $oui =~ tr/a-f/A-F/; + # $oui_list{$oui} = &shorten($manuf); + $oui_list{$oui} = $manuf; + $tmpl_added++; + } +} + +# Add IEEE entries for IABs + +$ieee_list = fetch($iab_url); + +foreach $line (split(/\n/, $ieee_list)) { + # determine the OUI used for IAB (currently only 00-50-C2) + if (($iab_tmp, $manuf) = ($line =~ /^($ieee_re)\s+\(hex\)\s+(\S.*)$/)) { + $iab_base = $iab_tmp; + } + # determine next two bytes + if (($iab4, $iab5, $manuf) = ($line =~ /^($hp)($hp)$hp-$hp$hp$hp\s+\(base\s16\)\s+(\S.*)$/)) { + $iab = "$iab_base:$iab4:$iab5:00/36"; + $iab =~ tr /-/:/; # The IEEE bytes are separated by dashes. + # Ensure IAB is all upper-case + $iab =~ tr/a-f/A-F/; + if (exists $oui_list{$iab}) { + printf "$iab - Skipping IEEE \"$manuf\" in favor of \"$oui_list{$iab}\"\n"; + $iab_skipped++; + } else { + $oui_list{$iab} = &shorten($manuf); + $iab_added++; + } + } +} + +# Add IEEE entries for OUIs not yet known. + +$ieee_list = fetch($oui_url); + +foreach $line (split(/\n/, $ieee_list)) { + if (($oui, $manuf) = ($line =~ /^($ieee_re)\s+\(hex\)\s+(\S.*)$/)) { + $oui =~ tr /-/:/; # The IEEE bytes are separated by dashes. + # Ensure OUI is all upper-case + $oui =~ tr/a-f/A-F/; + if (exists $oui_list{$oui}) { + printf "$oui - Skipping IEEE \"$manuf\" in favor of \"$oui_list{$oui}\"\n"; + $oui_skipped++; + } else { + $oui_list{$oui} = &shorten($manuf); + $oui_added++; + } + } +} + +# Add CaveBear entries for OUIs not yet known. + +$cb_list = fetch($cb_url); + +foreach $line (split(/\n/, $cb_list)) { + if (($oui, $manuf) = ($line =~ /^($cb_re)\s+(\S.*)$/)) { + ($h1, $h2, $h3) = ($oui =~ /($hp)($hp)($hp)/); # The CaveBear bytes have no separators + $oui = "$h1:$h2:$h3"; + # Ensure OUI is all upper-case + $oui =~ tr/a-f/A-F/; + if (exists $oui_list{$oui}) { + # printf "$oui - Skipping CaveBear \"$manuf\" in favor of \"$oui_list{$oui}\"\n"; + $cb_skipped++; + } else { + printf "$oui - adding \"$manuf\" from CaveBear\n"; + $oui_list{$oui} = &shorten($manuf); + $cb_added++; + } + } +} + +# Write output file + +open (OUT, "> $outfile") || + die "Couldn't open output file for writing ($outfile)\n"; + +print(OUT "# This file was generated by running ./make-manuf.\n"); +print(OUT "# Don't change it directly, change manuf.tmpl and wka.tmpl instead.\n#\n"); +print(OUT "$header"); + +foreach $oui (sort(keys %oui_list)) { + print(OUT "$oui\t$oui_list{$oui}\n"); +} + +# Write out a blank line separating the OUIs from the well-known +# addresses, and then read the well-known address template file +# and write it to the manuf file. + +open (WKATMPL, "< $wkatmpl") || + die "Couldn't open well-known address template file for reading ($wkatmpl)\n"; + +# XXX - it'd be nice to get this from the Cavebear file, but inferring +# the address mask from entries in that file involves some work. +# +print(OUT "\n"); +while ($line = <WKATMPL>) { + chomp($line); + print(OUT "$line\n"); +} + +$total_added = $tmpl_added + $cb_added + $oui_added + $iab_added; +print <<"Fin" +Original entries : $tmpl_added +IEEE OUI added : $oui_added +IEEE IAB added : $iab_added +CaveBear added : $cb_added +Total : $total_added + +IEEE OUI skipped : $oui_skipped +IEEE IAB skipped : $iab_skipped +CaveBear skipped : $cb_skipped +Fin |