Net-Frame-Layer-CDP

 view release on metacpan or  search on metacpan

lib/Net/Frame/Layer/CDP/Address.pm  view on Meta::CPAN


#no strict 'vars';

sub new {
   shift->SUPER::new(
      protocolType   => NF_CDP_ADDRESS_PROTOCOL_TYPE_NLPID,
      protocolLength => 1,
      protocol       => NF_CDP_ADDRESS_PROTOCOL_IP,
      addressLength  => 4,
      address        => '127.0.0.1',
      @_,
   );
}

sub ipv4Address { 
   return new(@_)
}

sub ipv6Address {
   shift->SUPER::new(
      protocolType   => NF_CDP_ADDRESS_PROTOCOL_TYPE_8022,
      protocolLength => 8,
      protocol       => NF_CDP_ADDRESS_PROTOCOL_IPv6,
      addressLength  => 16,
      address        => '::1',
      @_,
   );
}

sub getLength {
   my $self = shift;

   my $length = 4;
   $length += length($self->protocol);
   $length += $self->addressLength;

   return $length
}

sub pack {
   my $self = shift;

   my $raw = $self->SUPER::pack('CC',
      $self->protocolType,
      $self->protocolLength
   ) or return;

   my $protocolLength = $self->protocolLength;
   $raw .= $self->SUPER::pack("a$protocolLength n",
      $self->protocol,
      $self->addressLength
   ) or return;

   my $addressLength = $self->addressLength;
   if ($self->protocol eq NF_CDP_ADDRESS_PROTOCOL_IP) {
      $raw .= $self->SUPER::pack('a4',
         inetAton($self->address)
      ) or return;
   } elsif ($self->protocol eq NF_CDP_ADDRESS_PROTOCOL_IPv6) {
      $raw .= $self->SUPER::pack('a16',
         inet6Aton($self->address)
      ) or return;
   } else { 
      $raw .= $self->SUPER::pack("a$addressLength",
         $self->address
      ) or return;
   }

   return $self->raw($raw);
}

sub unpack {
   my $self = shift;

   my ($protocolType, $protocolLength, $tail) =
      $self->SUPER::unpack('CC a*', $self->raw)
         or return;

   $self->protocolType($protocolType);
   $self->protocolLength($protocolLength);

   my ($protocol, $addressLength);
   ($protocol, $addressLength, $tail) = 
      $self->SUPER::unpack("a$protocolLength n a*", $tail)
         or return;

   $self->protocol($protocol);
   $self->addressLength($addressLength);

   my ($address, $payload);
   if ($self->protocol eq NF_CDP_ADDRESS_PROTOCOL_IP) {
      ($address, $payload) = 
         $self->SUPER::unpack('a4 a*', $tail)
            or return;
      $self->address(inetNtoa($address));
   } elsif ($self->protocol eq NF_CDP_ADDRESS_PROTOCOL_IPv6) {
      ($address, $payload) = 
         $self->SUPER::unpack('a16 a*', $tail)
            or return;
      $self->address(inet6Ntoa($address));
   } else { 
      ($address, $payload) = 
         $self->SUPER::unpack("a$addressLength a*", $tail)
            or return;
      $self->address($address);
   }

   $self->payload($payload);

   return $self;
}

sub computeLengths {
   my $self = shift;

   $self->protocolLength(length($self->protocol));

   if ($self->protocol eq NF_CDP_ADDRESS_PROTOCOL_IP) {
      $self->addressLength(4)
   } elsif ($self->protocol eq NF_CDP_ADDRESS_PROTOCOL_IPv6) {
      $self->addressLength(16)
   }else {
      return;
   }

   return 1;
}

sub print {
   my $self = shift;

   my $l = $self->layer;
   my $buf = sprintf
      "$l: protocolType:%d  protocolLength:%d  protocol:0x%s\n".
      "$l: addressLength:%d  address:%s",
         $self->protocolType, $self->protocolLength, (CORE::unpack 'H*', $self->protocol),
         $self->addressLength, $self->address;

   return $buf;
}

1;

__END__

=head1 NAME

Net::Frame::Layer::CDP::Address - Address encoding for CDP addresses TLV

=head1 SYNOPSIS

   use Net::Frame::Simple;
   use Net::Frame::Layer::CDP qw(:consts);

   my $layer = Net::Frame::Layer::CDP::Address->new(
      protocolType   => NF_CDP_ADDRESS_PROTOCOL_TYPE_NLPID,
      protocolLength => 1,
      protocol       => NF_CDP_ADDRESS_PROTOCOL_IP,
      addressLength  => 4,
      address        => '127.0.0.1',



( run in 1.015 second using v1.01-cache-2.11-cpan-39bf76dae61 )