package NetStumbler::Wap;

use strict;
use warnings;

require Exporter;

our @ISA = qw(Exporter);

#
# We do not Export anything
#
our $VERSION = '0.08';

=head1 Object Methods

=head2 new()

Returns a new Wap object. NOTE: this method may take some time to execute
as it loads the list into memory at construction time

=cut

sub new
{
    my $proto = shift;
    my $class = ref($proto) || $proto;
    my $self = {} ;
    $self->{VENDORS} = {};
    bless ($self, $class);
    return $self;
}

sub initialize
{
    my $self = shift;
    while(<DATA>)
    {
	if(/END/)
	{
	    last;
	}
	chomp;
	my ($prefix,$ven) = split(/\t/);
	if($prefix && $prefix =~ /\w\w:\w\w:\w\w/i)
	{
	    $self->{VENDORS}->{$prefix} = $ven;
	}
    }
}

=head2 isAdhoc($flags)

Params:
	-number 801.11 Capability flags
Returns:
	true is the flags indicate the access point is in adhoc mode
Example:
	if($obj->isAdhoc($flags))
	{
		# do something here
	}

=cut

sub isAdhoc
{

	my $self = shift;
	my $flags = shift;
	return $flags & 0x0002;
}

=head2 isInfrascruture($flags)

Params:
	-number 801.11 Capability flags
Returns:
	true is the flags indicate the access point is in infrastructure mode
Example:
	if($obj->isInfrascructure($flags))
	{
		# do something here
	}

=cut

sub isInfrastructure
{
	my $self = shift;
	my $flags = shift;
	return !isAdhoc($flags);
}

=head2 hasWEP($flags)

Params:
	-number 801.11 Capability flags
Returns:
	true is the flags indicate the access point has WEP enabled
Example:
	if($obj->hasWEP($flags))
	{
		# do something here
	}

=cut

sub isWEP
{
	my $self = shift;
	my $flags = shift;
	return $flags & 0x0010;
}


=head2 getVendorForBBSID ($mac)

Determine the vendor or a nic by the MAC prefix
The argument should be a mac address in the format of
00000000000
or
00:00:00:00:00:00

C<getVendorForBBSID> will return the vendor or undef
if the mac address could not be translated to a vendor

=cut

sub getVendorForBBSID
{
    my $self = shift;
    my $mac = shift;
    if(length($mac) > 12)
    {
	my $prefix = substr($mac,0,8);
    	return $self->{VENDORS}->{uc($prefix)};
    }
    else
    {
    	my $prefix = substr($mac,0,2) . ":" . substr($mac,2,2) . ":" . substr($mac,4,2);
    	return $self->{VENDORS}->{uc($prefix)};
    }
}
1;
__DATA__
00:00:00	Xerox
00:00:01	Xerox
00:00:02	Xerox
00:00:03	Xerox
00:00:04	Xerox
00:00:05	Xerox
00:00:06	Xerox
00:00:07	Xerox
00:00:08	Xerox
00:00:09	Xerox
00:00:0C	Cisco
00:00:95	Ericsson/Sony
00:00:AA	Xerox
00:00:E2	Acer
00:00:E8	Accton
00:00:F0	Samsung
00:00:FF	Camtec
00:01:02	3Com
00:01:03	3Com
00:01:24	Acer
00:01:42	Cisco
00:01:43	Cisco
00:01:4A	Ericsson/Sony
00:01:4C	Berkeley
00:01:63	Cisco
00:01:64	Cisco
00:01:96	Cisco
00:01:97	Cisco
00:01:C7	Cisco
00:01:C9	Cisco
00:01:EC	Ericsson/Sony
00:01:F4	Enterasys (Cabletron)
00:01:F9	Global
00:02:07	Global
00:02:16	Cisco
00:02:17	Cisco
00:02:2D	Proxim (Agere)ORiNOCO
00:02:4A	Cisco
00:02:4B	Cisco
00:02:6F	Senao
00:02:7D	Cisco
00:02:7E	Cisco
00:02:88	Global
00:02:8A	Ambit
00:02:9C	3Com
00:02:A5	Compaq
00:02:B3	Intel
00:02:B9	Cisco
00:02:BA	Cisco
00:02:DD	Bormax
00:02:EE	Nokia
00:02:FC	Cisco
00:02:FD	Cisco
00:03:2F	Global
00:03:31	Cisco
00:03:32	Cisco
00:03:47	Intel
00:03:6B	Cisco
00:03:6C	Cisco
00:03:93	Apple
00:03:9F	Cisco
00:03:A0	Cisco
00:03:E3	Cisco
00:03:E4	Cisco
00:03:FD	Cisco
00:03:FE	Cisco
00:03:FF	Microsoft
00:04:0B	3Com
00:04:0D	Avaya
00:04:1F	Ericsson/Sony
00:04:25	Atmel
00:04:27	Cisco
00:04:28	Cisco
00:04:31	Global
00:04:4D	Cisco
00:04:4E	Cisco
00:04:5A	Linksys
00:04:6D	Cisco
00:04:6E	Cisco
00:04:9A	Cisco
00:04:9B	Cisco
00:04:C0	Cisco
00:04:C1	Cisco
00:04:C6	Yamaha
00:04:DD	Cisco
00:04:DE	Cisco
00:04:E2	SMC
00:04:E3	Accton
00:05:00	Cisco
00:05:01	Cisco
00:05:02	Apple
00:05:1A	3Com
00:05:31	Cisco
00:05:32	Cisco
00:05:3C	Xircom
00:05:3D	Proxim (Agere)ORiNOCO
00:05:5D	D-Link
00:05:5E	Cisco
00:05:5F	Cisco
00:05:73	Cisco
00:05:74	Cisco
00:05:75	CDS
00:05:86	Lucent (WaveLAN)
00:05:9A	Cisco
00:05:9B	Cisco
00:05:DC	Cisco
00:05:DD	Cisco
00:06:25	Linksys
00:06:28	Cisco
00:06:2A	Cisco
00:06:52	Cisco
00:06:53	Cisco
00:06:6E	Delta(Netgear)
00:06:7C	Cisco
00:06:8C	3Com
00:06:C1	Cisco
00:06:D6	Cisco
00:06:D7	Cisco
00:06:EB	Global
00:07:0D	Cisco
00:07:0E	Cisco
00:07:4F	Cisco
00:07:50	Cisco
00:07:84	Cisco
00:07:85	Cisco
00:07:B3	Cisco
00:07:B4	Cisco
00:07:E9	Intel
00:07:EB	Cisco
00:07:EC	Cisco
00:08:02	Compaq
00:08:0F	Proxim(WaveLAN)
00:08:20	Cisco
00:08:21	Cisco
00:08:7C	Cisco
00:08:7D	Cisco
00:08:A3	Cisco
00:08:A4	Cisco
00:08:C2	Cisco
00:08:C7	Compaq
00:08:E2	Cisco
00:08:E3	Cisco
00:09:11	Cisco
00:09:12	Cisco
00:09:43	Cisco
00:09:44	Cisco
00:09:5B	Netgear
00:09:7B	Cisco
00:09:7C	Cisco
00:09:B6	Cisco
00:09:B7	Cisco
00:09:E1	Gemtek
00:09:E8	Cisco
00:09:E9	Cisco
00:0A:04	3Com
00:0A:27	Apple
00:0A:41	Cisco
00:0A:42	Cisco
00:0A:5E	3Com
00:0A:8A	Cisco
00:0A:8B	Cisco
00:0A:95	Apple
00:0A:B7	Cisco
00:0A:B8	Cisco
00:0A:D9	Ericsson/Sony
00:0A:E9	AirVast
00:0A:F3	Cisco
00:0A:F4	Cisco
00:0B:45	Cisco
00:0B:46	Cisco
00:0B:5F	Cisco
00:0B:60	Cisco
00:0B:89	Global
00:0B:AC	3Com
00:0B:BE	Cisco
00:0B:BF	Cisco
00:0B:C5	SMC
00:0B:CD	Compaq
00:0B:FC	Cisco
00:0B:FD	Cisco
00:0B:FF	Berkeley
00:0C:1E	Global
00:0C:30	Cisco
00:0C:31	Cisco
00:0C:41	Linksys
00:0C:85	Cisco
00:0C:86	Cisco
00:0C:CA	Global
00:0C:CC	Bluesoft
00:0C:CE	Cisco
00:0C:CF	Cisco
00:0C:F1	Intel
00:0D:28	Cisco
00:0D:29	Cisco
00:0D:3A	Microsoft
00:0D:54	3Com
00:0D:65	Cisco
00:0D:66	Cisco
00:0D:72	2Wire
00:0D:88	D-Link
00:0D:93	Apple
00:0D:B5	Global
00:0D:BC	Cisco
00:0D:BD	Cisco
00:0D:EC	Cisco
00:0D:ED	Cisco
00:0E:07	Ericsson/Sony
00:0E:0C	Intel
00:0E:35	Intel
00:0E:38	Cisco
00:0E:39	Cisco
00:0E:6A	3Com
00:0E:83	Cisco
00:0E:84	Cisco
00:0E:D6	Cisco
00:0E:D7	Cisco
00:0E:ED	Nokia
00:0F:23	Cisco
00:0F:24	Cisco
00:0F:34	Cisco
00:0F:35	Cisco
00:0F:3D	D-Link
00:0F:5B	Delta(Netgear)
00:0F:66	Cisco
00:0F:8F	Cisco
00:0F:90	Cisco
00:0F:B3	Premax(Actiontec)
00:0F:B5	Netgear
00:0F:CB	3Com
00:0F:DE	Ericsson/Sony
00:0F:E2	3Com
00:0F:F7	Cisco
00:0F:F8	Cisco
00:10:07	Cisco
00:10:0B	Cisco
00:10:0D	Cisco
00:10:11	Cisco
00:10:14	Cisco
00:10:1F	Cisco
00:10:29	Cisco
00:10:2F	Cisco
00:10:4B	3Com
00:10:54	Cisco
00:10:5A	3Com
00:10:79	Cisco
00:10:7A	Ambicom
00:10:7B	Cisco
00:10:A4	Xircom
00:10:A6	Cisco
00:10:B3	Nokia
00:10:B5	Accton
00:10:E3	Compaq
00:10:E7	BreezeNet
00:10:F6	Cisco
00:10:FF	Cisco
00:11:11	Intel
00:11:20	Cisco
00:11:21	Cisco
00:11:24	Apple
00:20:14	Global
00:20:7B	Intel
00:20:88	Global
00:20:A6	Proxim(WaveLAN)
00:20:AF	3Com
00:20:D8	NetWave-Bay
00:20:E0	Premax(Actiontec)
00:26:54	3Com
00:30:19	Cisco
00:30:1E	3Com
00:30:24	Cisco
00:30:40	Cisco
00:30:65	Apple
00:30:6D	Lucent (WaveLAN)
00:30:71	Cisco
00:30:78	Cisco
00:30:7B	Cisco
00:30:80	Cisco
00:30:85	Cisco
00:30:94	Cisco
00:30:96	Cisco
00:30:98	Global
00:30:A3	Cisco
00:30:AB	Delta(Netgear)
00:30:B6	Cisco
00:30:B8	Delta(Netgear)
00:30:BD	Belkin
00:30:F1	Accton
00:30:F2	Cisco
00:40:05	Ani
00:40:0B	Cisco
00:40:27	SMC
00:40:33	Addtron
00:40:36	Zoom-Tribe
00:40:43	Nokia
00:40:96	Aironet
00:40:AE	Delta(Netgear)
00:50:04	3Com
00:50:0B	Cisco
00:50:0F	Cisco
00:50:14	Cisco
00:50:18	Adv
00:50:2A	Cisco
00:50:3E	Cisco
00:50:50	Cisco
00:50:53	Cisco
00:50:54	Cisco
00:50:73	Cisco
00:50:80	Cisco
00:50:8B	Compaq
00:50:98	Global
00:50:99	3Com
00:50:A0	Delta(Netgear)
00:50:A2	Cisco
00:50:A7	Cisco
00:50:BA	D-Link
00:50:BD	Cisco
00:50:D1	Cisco
00:50:DA	3Com
00:50:E2	Cisco
00:50:E4	Apple
00:50:F0	Cisco
00:50:F2	Microsoft
00:50:F3	Global
00:60:08	3Com
00:60:09	Cisco
00:60:1D	Lucent (WaveLAN)
00:60:2F	Cisco
00:60:3E	Cisco
00:60:47	Cisco
00:60:5C	Cisco
00:60:67	Acer
00:60:70	Cisco
00:60:83	Cisco
00:60:8C	3Com
00:60:97	3Com
00:60:B3	Z-Com
00:60:D2	Lucent (WaveLAN)
00:80:37	Ericsson/Sony
00:80:5F	Compaq
00:80:C7	Xircom
00:80:C8	D-Link
00:90:04	3Com
00:90:0C	Cisco
00:90:0E	Handlink
00:90:21	Cisco
00:90:27	Intel
00:90:2B	Cisco
00:90:4B	Gemtek
00:90:4D	Gemtek
00:90:5F	Cisco
00:90:6C	Global
00:90:6D	Cisco
00:90:6F	Cisco
00:90:86	Cisco
00:90:92	Cisco
00:90:A6	Cisco
00:90:AB	Cisco
00:90:B1	Cisco
00:90:BF	Cisco
00:90:D1	Addtron
00:90:D9	Cisco
00:90:E6	Acer
00:90:F2	Cisco
00:A0:24	3Com
00:A0:40	Apple
00:A0:60	Acer
00:A0:8E	Nokia
00:A0:C9	Intel
00:A0:DE	Yamaha
00:A0:F8	Symbol
00:AA:00	Intel
00:AA:01	Intel
00:AA:02	Intel
00:B0:4A	Cisco
00:B0:64	Cisco
00:B0:8E	Cisco
00:B0:C2	Cisco
00:C0:03	Global
00:C0:49	U.S. Robotics
00:C0:AC	Ambit
00:D0:06	Cisco
00:D0:58	Cisco
00:D0:59	Ambit
00:D0:63	Cisco
00:D0:77	Lucent (WaveLAN)
00:D0:79	Cisco
00:D0:90	Cisco
00:D0:96	3Com
00:D0:97	Cisco
00:D0:9E	2Wire
00:D0:AB	Delta(Netgear)
00:D0:B7	Intel
00:D0:BA	Cisco
00:D0:BB	Cisco
00:D0:BC	Cisco
00:D0:C0	Cisco
00:D0:D3	Cisco
00:D0:D8	3Com
00:D0:E4	Cisco
00:D0:FF	Cisco
00:E0:03	Nokia
00:E0:14	Cisco
00:E0:1E	Cisco
00:E0:34	Cisco
00:E0:38	Proxim(WaveLAN)
00:E0:4F	Cisco
00:E0:78	Berkeley
00:E0:85	Global
00:E0:8F	Cisco
00:E0:A3	Cisco
00:E0:B0	Cisco
00:E0:E4	U.S. Robotics
00:E0:F7	Cisco
00:E0:F9	Cisco
00:E0:FE	Cisco
02:60:8C	3Com
02:C0:8C	3Com
08:00:05	Symbol
08:00:07	Apple
08:00:37	Xerox
08:00:46	Ericsson/Sony
08:00:4E	3Com
08:00:72	Xerox
__END__
# Below is stub documentation for your module. You'd better edit it!

=head1 NAME

NetStumbler::Wap - Wap tools for NetStumbler

=head1 SYNOPSIS

  use NetStumbler::Wap;
  my $waplib = NetStumbler::Wap->new();
  my $vendor = $waplib->getVendorForBBSID("mac address");

=head1 DESCRIPTION

 This module stores a list of mac prefixes for various wireless cards
 It was built for use with NetStumbler/Kismet/iStumbler etc... to help
 with vendor mac discovery
 
=head2 EXPORT

None by default.

=head1 SEE ALSO

http://idogan.istanbul.edu.tr/oui_full.html OUI database
All the items in this list were generated by parsing the oui database

=head1 AUTHOR

Salvatore E. ScottoDiLuzio<lt>washu@olypmus.net<gt>

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2004 by Salvatore ScottoDiLuzio

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.3 or,
at your option, any later version of Perl 5 you may have available.


=cut
