Net::Frame::Layer::SLL - Linux cooked capture layer object


Net-Frame documentation Contained in the Net-Frame distribution.

Index


Code Index:

NAME

Top

Net::Frame::Layer::SLL - Linux cooked capture layer object

SYNOPSIS

Top

   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;

DESCRIPTION

Top

This modules implements the encoding and decoding of the Linux cooked capture layer.

See also Net::Frame::Layer for other attributes and methods.

ATTRIBUTES

Top

packetType

Stores the packet type (unicast to us, sent by us ...).

addressType

The address type.

addressLength

The length of the previously specified address.

source

Source address.

protocol

Encapsulated protocol.

The following are inherited attributes. See Net::Frame::Layer for more information.

raw
payload
nextLayer

METHODS

Top

new
new (hash)

Object constructor. You can pass attributes that will overwrite default ones. See SYNOPSIS for default values.

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 Net::Frame::Layer for more information.

layer
computeLengths
computeChecksums
pack
unpack
encapsulate
getLength
getPayloadLength
print
dump

CONSTANTS

Top

Load them: use Net::Frame::Layer::SLL qw(:consts);

NF_SLL_PACKET_TYPE_SENT_BY_US
NF_SLL_PACKET_TYPE_UNICAST_TO_US

Various possible packet types.

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

Various supported encapsulated layer types.

NF_SLL_ADDRESS_TYPE_512

SEE ALSO

Top

Net::Frame::Layer

AUTHOR

Top

Patrice <GomoR> Auffret

COPYRIGHT AND LICENSE

Top


Net-Frame documentation Contained in the Net-Frame distribution.

#
# $Id: SLL.pm 333 2011-02-16 10:47:33Z 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__