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 )