syboar has asked for the wisdom of the Perl Monks concerning the following question:

Replies are listed 'Best First'.
Re: filter tcpdump packets
by Anonymous Monk on Aug 31, 2014 at 20:19 UTC

    The documentation is pretty thin, but looking at the source of NetPacket::TCP, I think you need to call my %opts = $tcp_obj->parse_tcp_options; and then access $opts{mss}. (untested)

    I've attempted to work with libpcap in the past myself, using both Perl and Java. Several times I've come away with an icky feeling. That leads me to ask: why do you want to do this with Perl, and not with tshark?

          Tshark is another application that identical to Tcpdump

          No, it's much more powerful - have a look again at the tshark manpage, especially the -T fields and -e options. You can use them to output Wireshark's tcp.options.mss_val field.

          As for your output, it looks like the packets don't contain an MSS option, or, if you know the packets do have one, NetPacket::TCP isn't parsing them correctly, in that case file a bug with the module.

            Net::Tshark had what amounts to a single release two years ago and has no tests. That makes it hard to tell how reliable that module is.

            not sure it's correct way to get mss options

            Have you tried looking at the data structure with Data::Dumper?

            map {$_ ->{mss}->{1500} } ...

            Without knowing the data structure, I'm going to wager a guess that maybe you need to do something like grep { $_->...->{mss}==1500 } @packets, where ... depends on the data structure you see with Data::Dumper.

            However, I'm still not sure why you're not simply doing something like this, where you are free to customize the display filter and output format without some module in between:

            my @cmd = ('tshark','-r',$PCAPFILE, qw# -R tcp.options.mss -T fields -e ip.src -e tcp.srcport -e ip.dst -e tcp.dstport -e tcp.options.mss_val #); open my $ts, '-|', @cmd or die "Error opening pipe: $!"; while(<$ts>) { chomp; my ($src_addr,$src_port,$dst_addr,$dst_port,$mss) = split /\t/; print "$src_addr:$src_port -> $dst_addr:$dst_port MSS=$mss\n"; } close $ts or die $! ? "Error closing pipe: $!" : "Exit status \$?=$? from pipe";

            (Or, look at IPC::Run to execute tshark, which is all that Net::Tshark is doing anyway.)