Net-Frame
view release on metacpan or search on metacpan
lib/Net/Frame/Layer/TCP.pm view on Meta::CPAN
) or return;
$self->[$__options] = $options;
$self->[$__payload] = $payload2;
return $self;
}
sub getLength { my $self = shift; $self->[$__off] ? $self->[$__off] * 4 : 0 }
sub getOptionsLength {
my $self = shift;
my $gLen = $self->getLength;
my $hLen = NF_TCP_HDR_LEN;
return $gLen > $hLen ? $gLen - $hLen : 0;
}
sub computeLengths {
my $self = shift;
my $optLen = ($self->[$__options] && length($self->[$__options])) || 0;
my $hLen = NF_TCP_HDR_LEN;
$self->[$__off] = ($hLen + $optLen) / 4;
return 1;
}
sub computeChecksums {
my $self = shift;
my ($layers) = @_;
my $len = $self->getLength;
my $start = 0;
my $last = $self;
my $payload = '';
for my $l (@$layers) {
$last = $l;
if (! $start) {
$start++ if $l->layer eq 'TCP';
next;
}
$len += $l->getLength;
$payload .= $l->pack;
}
if (defined($last->payload) && length($last->payload)) {
$len += length($last->payload);
$payload .= $last->payload;
}
my $phpkt;
for my $l (@$layers) {
if ($l->layer eq 'IPv4') {
$phpkt = $self->SUPER::pack('a4a4CCn',
inetAton($l->src), inetAton($l->dst), 0, 6, $len);
}
elsif ($l->layer eq 'IPv6') {
$phpkt = $self->SUPER::pack('a*a*NnCC',
inet6Aton($l->src), inet6Aton($l->dst), $len, 0, 0, 6);
}
}
my $offX2Flags = ($self->[$__off] << 12) | (0x0f00 & ($self->[$__x2] << 8))
| (0x00ff & $self->[$__flags]);
$phpkt .= $self->SUPER::pack('nnNNnnnn',
$self->[$__src], $self->[$__dst], $self->[$__seq], $self->[$__ack],
$offX2Flags, $self->[$__win], 0, $self->[$__urp],
) or return;
if ($self->[$__options]) {
$phpkt .= $self->SUPER::pack('a*', $self->[$__options])
or return;
}
if (length($payload)) {
$phpkt .= $self->SUPER::pack('a*', $payload)
or return;
}
$self->[$__checksum] = inetChecksum($phpkt);
return 1;
}
our $Next = {
};
sub encapsulate {
my $self = shift;
return $Next->{$self->[$__dst]} || $Next->{$self->[$__src]}
|| $self->[$__nextLayer];
}
sub match {
my $self = shift;
my ($with) = @_;
($with->[$__ack] == $self->[$__seq] + 1)
|| ($with->[$__flags] & NF_TCP_FLAGS_RST);
}
sub getKey {
my $self = shift;
$self->layer.':'.$self->[$__src].'-'.$self->[$__dst];
}
sub getKeyReverse {
my $self = shift;
$self->layer.':'.$self->[$__dst].'-'.$self->[$__src];
}
sub print {
my $self = shift;
my $l = $self->layer;
my $buf = sprintf
"$l: src:%d dst:%d seq:0x%04x ack:0x%04x \n".
"$l: off:0x%02x x2:0x%01x flags:0x%02x win:%d checksum:0x%04x ".
"urp:0x%02x",
( run in 0.789 second using v1.01-cache-2.11-cpan-e1769b4cff6 )