# # $Id: SLL.pm 305 2009-05-23 13:21:05Z gomor $ # package Net::Frame::Layer::SLL; use strict; use warnings; use Net::Frame::Layer qw(:consts); require Exporter; our @ISA = qw(Net::Frame::Layer Exporter); our %EXPORT_TAGS = ( consts => [qw( NF_SLL_HDR_LEN NF_SLL_PACKET_TYPE_SENT_BY_US NF_SLL_PACKET_TYPE_UNICAST_TO_US NF_SLL_ADDRESS_TYPE_512 NF_SLL_PROTOCOL_IPv4 NF_SLL_PROTOCOL_X25 NF_SLL_PROTOCOL_ARP NF_SLL_PROTOCOL_CGMP NF_SLL_PROTOCOL_80211 NF_SLL_PROTOCOL_PPPIPCP NF_SLL_PROTOCOL_RARP NF_SLL_PROTOCOL_DDP NF_SLL_PROTOCOL_AARP NF_SLL_PROTOCOL_PPPCCP NF_SLL_PROTOCOL_WCP NF_SLL_PROTOCOL_8021Q NF_SLL_PROTOCOL_IPX NF_SLL_PROTOCOL_STP NF_SLL_PROTOCOL_IPv6 NF_SLL_PROTOCOL_WLCCP NF_SLL_PROTOCOL_MPLS NF_SLL_PROTOCOL_PPPoED NF_SLL_PROTOCOL_PPPoES NF_SLL_PROTOCOL_8021X NF_SLL_PROTOCOL_AoE NF_SLL_PROTOCOL_80211I NF_SLL_PROTOCOL_LLDP NF_SLL_PROTOCOL_LLTD NF_SLL_PROTOCOL_LOOP NF_SLL_PROTOCOL_VLAN NF_SLL_PROTOCOL_PPPPAP NF_SLL_PROTOCOL_PPPCHAP )], ); our @EXPORT_OK = ( @{$EXPORT_TAGS{consts}}, ); use constant NF_SLL_HDR_LEN => 16; use constant NF_SLL_PACKET_TYPE_SENT_BY_US => 4; use constant NF_SLL_PACKET_TYPE_UNICAST_TO_US => 0; use constant NF_SLL_ADDRESS_TYPE_512 => 512; use constant NF_SLL_PROTOCOL_IPv4 => 0x0800; use constant NF_SLL_PROTOCOL_X25 => 0x0805; use constant NF_SLL_PROTOCOL_ARP => 0x0806; use constant NF_SLL_PROTOCOL_CGMP => 0x2001; use constant NF_SLL_PROTOCOL_80211 => 0x2452; use constant NF_SLL_PROTOCOL_PPPIPCP => 0x8021; use constant NF_SLL_PROTOCOL_RARP => 0x8035; use constant NF_SLL_PROTOCOL_DDP => 0x809b; use constant NF_SLL_PROTOCOL_AARP => 0x80f3; use constant NF_SLL_PROTOCOL_PPPCCP => 0x80fd; use constant NF_SLL_PROTOCOL_WCP => 0x80ff; use constant NF_SLL_PROTOCOL_8021Q => 0x8100; use constant NF_SLL_PROTOCOL_IPX => 0x8137; use constant NF_SLL_PROTOCOL_STP => 0x8181; use constant NF_SLL_PROTOCOL_IPv6 => 0x86dd; use constant NF_SLL_PROTOCOL_WLCCP => 0x872d; use constant NF_SLL_PROTOCOL_MPLS => 0x8847; use constant NF_SLL_PROTOCOL_PPPoED => 0x8863; use constant NF_SLL_PROTOCOL_PPPoES => 0x8864; use constant NF_SLL_PROTOCOL_8021X => 0x888e; use constant NF_SLL_PROTOCOL_AoE => 0x88a2; use constant NF_SLL_PROTOCOL_80211I => 0x88c7; use constant NF_SLL_PROTOCOL_LLDP => 0x88cc; use constant NF_SLL_PROTOCOL_LLTD => 0x88d9; use constant NF_SLL_PROTOCOL_LOOP => 0x9000; use constant NF_SLL_PROTOCOL_VLAN => 0x9100; use constant NF_SLL_PROTOCOL_PPPPAP => 0xc023; use constant NF_SLL_PROTOCOL_PPPCHAP => 0xc223; our @AS = qw( packetType addressType addressLength source protocol ); __PACKAGE__->cgBuildIndices; __PACKAGE__->cgBuildAccessorsScalar(\@AS); no strict 'vars'; sub new { shift->SUPER::new( packetType => NF_SLL_PACKET_TYPE_SENT_BY_US, addressType => NF_SLL_ADDRESS_TYPE_512, addressLength => 0, source => 0, protocol => NF_SLL_PROTOCOL_IPv4, @_, ); } sub getLength { NF_SLL_HDR_LEN } sub pack { my $self = shift; $self->[$__raw] = $self->SUPER::pack('nnnH16n', $self->[$__packetType], $self->[$__addressType], $self->[$__addressLength], $self->[$__source], $self->[$__protocol], ) or return undef; $self->[$__raw]; } sub unpack { my $self = shift; my ($pt, $at, $al, $s, $p, $payload) = $self->SUPER::unpack('nnnH16n a*', $self->[$__raw]) or return undef; $self->[$__packetType] = $pt; $self->[$__addressType] = $at; $self->[$__addressLength] = $al; $self->[$__source] = $s; $self->[$__protocol] = $p; $self->[$__payload] = $payload; $self; } our $Next = { NF_SLL_PROTOCOL_IPv4() => 'IPv4', NF_SLL_PROTOCOL_X25() => 'X25', NF_SLL_PROTOCOL_ARP() => 'ARP', NF_SLL_PROTOCOL_CGMP() => 'CGMP', NF_SLL_PROTOCOL_80211() => '80211', NF_SLL_PROTOCOL_PPPIPCP() => 'PPPIPCP', NF_SLL_PROTOCOL_RARP() => 'RARP', NF_SLL_PROTOCOL_DDP () => 'DDP', NF_SLL_PROTOCOL_AARP() => 'AARP', NF_SLL_PROTOCOL_PPPCCP() => 'PPPCCP', NF_SLL_PROTOCOL_WCP() => 'WCP', NF_SLL_PROTOCOL_8021Q() => '8021Q', NF_SLL_PROTOCOL_IPX() => 'IPX', NF_SLL_PROTOCOL_STP() => 'STP', NF_SLL_PROTOCOL_IPv6() => 'IPv6', NF_SLL_PROTOCOL_WLCCP() => 'WLCCP', NF_SLL_PROTOCOL_MPLS() => 'MPLS', NF_SLL_PROTOCOL_PPPoED() => 'PPPoED', NF_SLL_PROTOCOL_PPPoES() => 'PPPoES', NF_SLL_PROTOCOL_8021X() => '8021X', NF_SLL_PROTOCOL_AoE() => 'AoE', NF_SLL_PROTOCOL_80211I() => '80211I', NF_SLL_PROTOCOL_LLDP() => 'LLDP', NF_SLL_PROTOCOL_LLTD() => 'LLTD', NF_SLL_PROTOCOL_LOOP() => 'LOOP', NF_SLL_PROTOCOL_VLAN() => 'VLAN', NF_SLL_PROTOCOL_PPPPAP() => 'PPPPAP', NF_SLL_PROTOCOL_PPPCHAP() => 'PPPCHAP', }; sub encapsulate { my $self = shift; return $self->[$__nextLayer] if $self->[$__nextLayer]; return $Next->{$self->[$__protocol]} || NF_LAYER_UNKNOWN; } sub print { my $self = shift; my $l = $self->layer; sprintf "$l: packetType:0x%04x addressType:0x%04x ". "addressLength:0x%04x\n". "$l: source:%d protocol:0x%04x", $self->[$__packetType], $self->[$__addressType], $self->[$__addressLength], $self->[$__source], $self->[$__protocol]; } 1; __END__ =head1 NAME Net::Frame::Layer::SLL - Linux cooked capture layer object =head1 SYNOPSIS use Net::Frame::Layer::SLL qw(:consts); # Build a layer my $layer = Net::Frame::Layer::SLL->new( packetType => NF_SLL_PACKET_TYPE_SENT_BY_US, addressType => NF_SLL_ADDRESS_TYPE_512, addressLength => 0, source => 0, protocol => NF_SLL_PROTOCOL_IPv4, ); $layer->pack; print 'RAW: '.$layer->dump."\n"; # Read a raw layer my $layer = Net::Frame::Layer::SLL->new(raw => $raw); print $layer->print."\n"; print 'PAYLOAD: '.unpack('H*', $layer->payload)."\n" if $layer->payload; =head1 DESCRIPTION This modules implements the encoding and decoding of the Linux cooked capture layer. See also B for other attributes and methods. =head1 ATTRIBUTES =over 4 =item B Stores the packet type (unicast to us, sent by us ...). =item B The address type. =item B The length of the previously specified address. =item B Source address. =item B Encapsulated protocol. =back The following are inherited attributes. See B for more information. =over 4 =item B =item B =item B =back =head1 METHODS =over 4 =item B =item B (hash) Object constructor. You can pass attributes that will overwrite default ones. See B for default values. =back The following are inherited methods. Some of them may be overriden in this layer, and some others may not be meaningful in this layer. See B for more information. =over 4 =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =back =head1 CONSTANTS Load them: use Net::Frame::Layer::SLL qw(:consts); =over 4 =item B =item B Various possible packet types. =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B Various supported encapsulated layer types. =item B =back =head1 SEE ALSO L =head1 AUTHOR Patrice EGomoRE Auffret =head1 COPYRIGHT AND LICENSE Copyright (c) 2006-2009, Patrice EGomoRE Auffret You may distribute this module under the terms of the Artistic license. See LICENSE.Artistic file in the source distribution archive. =cut