TCP (Transmission Control Protocol) segment: Perl parsing library

TCP is one of the core Internet protocols on transport layer (AKA OSI layer 4), providing stateful connections with error checking, guarantees of delivery, order of segments and avoidance of duplicate delivery.

KS implementation details

License: CC0-1.0

References

This page hosts a formal specification of TCP (Transmission Control Protocol) segment using Kaitai Struct. This specification can be automatically translated into a variety of programming languages to get a parsing library.

Perl source code to parse TCP (Transmission Control Protocol) segment

TcpSegment.pm

# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild

use strict;
use warnings;
use IO::KaitaiStruct 0.007_000;

########################################################################
package TcpSegment;

our @ISA = 'IO::KaitaiStruct::Struct';

sub from_file {
    my ($class, $filename) = @_;
    my $fd;

    open($fd, '<', $filename) or return undef;
    binmode($fd);
    return new($class, IO::KaitaiStruct::Stream->new($fd));
}

sub new {
    my ($class, $_io, $_parent, $_root) = @_;
    my $self = IO::KaitaiStruct::Struct->new($_io);

    bless $self, $class;
    $self->{_parent} = $_parent;
    $self->{_root} = $_root || $self;;

    $self->_read();

    return $self;
}

sub _read {
    my ($self) = @_;

    $self->{src_port} = $self->{_io}->read_u2be();
    $self->{dst_port} = $self->{_io}->read_u2be();
    $self->{seq_num} = $self->{_io}->read_u4be();
    $self->{ack_num} = $self->{_io}->read_u4be();
    $self->{b12} = $self->{_io}->read_u1();
    $self->{b13} = $self->{_io}->read_u1();
    $self->{window_size} = $self->{_io}->read_u2be();
    $self->{checksum} = $self->{_io}->read_u2be();
    $self->{urgent_pointer} = $self->{_io}->read_u2be();
    $self->{body} = $self->{_io}->read_bytes_full();
}

sub src_port {
    my ($self) = @_;
    return $self->{src_port};
}

sub dst_port {
    my ($self) = @_;
    return $self->{dst_port};
}

sub seq_num {
    my ($self) = @_;
    return $self->{seq_num};
}

sub ack_num {
    my ($self) = @_;
    return $self->{ack_num};
}

sub b12 {
    my ($self) = @_;
    return $self->{b12};
}

sub b13 {
    my ($self) = @_;
    return $self->{b13};
}

sub window_size {
    my ($self) = @_;
    return $self->{window_size};
}

sub checksum {
    my ($self) = @_;
    return $self->{checksum};
}

sub urgent_pointer {
    my ($self) = @_;
    return $self->{urgent_pointer};
}

sub body {
    my ($self) = @_;
    return $self->{body};
}

1;