summaryrefslogtreecommitdiffstats
path: root/contrib/ipfilter/test/vfycksum.pl
diff options
context:
space:
mode:
authorcy <cy@FreeBSD.org>2013-07-19 05:41:57 +0000
committercy <cy@FreeBSD.org>2013-07-19 05:41:57 +0000
commit672af8808c0e7c15f330b401482f9271c2eb3fa6 (patch)
tree225b5acf68c01bc6a260b386c2b2dbf4fa2839e3 /contrib/ipfilter/test/vfycksum.pl
parent71e82d94e82560b20789833f60056506de34de8b (diff)
downloadFreeBSD-src-672af8808c0e7c15f330b401482f9271c2eb3fa6.zip
FreeBSD-src-672af8808c0e7c15f330b401482f9271c2eb3fa6.tar.gz
As per the developers handbook (5.3.1 step 1), prepare the vendor trees for
import of new ipfilter vendor sources by flattening them. To keep the tags consistent with dist, the tags are also flattened. Approved by: glebius (Mentor)
Diffstat (limited to 'contrib/ipfilter/test/vfycksum.pl')
-rwxr-xr-xcontrib/ipfilter/test/vfycksum.pl294
1 files changed, 0 insertions, 294 deletions
diff --git a/contrib/ipfilter/test/vfycksum.pl b/contrib/ipfilter/test/vfycksum.pl
deleted file mode 100755
index b3a20be..0000000
--- a/contrib/ipfilter/test/vfycksum.pl
+++ /dev/null
@@ -1,294 +0,0 @@
-
-#
-# validate the IPv4 header checksum.
-# $bytes[] is an array of 16bit values, with $cnt elements in the array.
-#
-sub dump {
- print "\n";
- for ($i = 0; $i < $#bytes; $i++) {
- printf "%04x ", $bytes[$i];
- }
- print "\n";
-}
-
-sub dosum {
- local($seed) = $_[0];
- local($start) = $_[1];
- local($max) = $_[2];
- local($idx) = $start;
- local($lsum) = $seed;
-
- for ($idx = $start, $lsum = $seed; $idx < $max; $idx++) {
- $lsum += $bytes[$idx];
- }
- $lsum = ($lsum & 0xffff) + ($lsum >> 16);
- $lsum = ~$lsum & 0xffff;
- return $lsum;
-}
-
-sub ipv4check {
- local($base) = $_[0];
- $hl = $bytes[$base] / 256;
- return if (($hl >> 4) != 4); # IPv4 ?
- $hl &= 0xf;
- $hl <<= 1; # get the header length in 16bit words
-
- $hs = &dosum(0, $base, $base + $hl);
- $osum = $bytes[$base + 5];
-
- if ($hs != 0) {
- $bytes[$base + 5] = 0;
- $hs2 = &dosum(0, $base, $base + $hl);
- $bytes[$base + 5] = $osum;
- printf " IP: ($hl,%x) %x != %x", $hs, $osum, $hs2;
- } else {
- print " IP($base): ok ";
- }
-
- #
- # Recognise TCP & UDP and calculate checksums for each of these.
- #
- if (($bytes[$base + 4] & 0xff) == 6) {
- &tcpcheck($base);
- }
-
- if (($bytes[$base + 4] & 0xff) == 17) {
- &udpcheck($base);
- }
-
- if (($bytes[$base + 4] & 0xff) == 1) {
- &icmpcheck($base);
- }
- if ($base == 0) {
- print "\n";
- }
-}
-
-sub tcpcheck {
- local($base) = $_[0];
- local($hl) = $bytes[$base] / 256;
- return if (($hl >> 4) != 4);
- return if ($bytes[$base + 3] & 0x1fff);
- $hl &= 0xf;
- $hl <<= 1;
-
- local($hs2);
- local($hs) = 6; # TCP
- local($len) = $bytes[$base + 1] - ($hl << 1);
- $hs += $len;
- $hs += $bytes[$base + 6]; # source address
- $hs += $bytes[$base + 7];
- $hs += $bytes[$base + 8]; # destination address
- $hs += $bytes[$base + 9];
- local($tcpsum) = $hs;
-
- local($thl) = $bytes[$base + $hl + 6] >> 8;
- $thl &= 0xf0;
- $thl >>= 2;
-
- $x = $bytes[$base + 1];
- $y = ($cnt - $base) * 2;
- $z = 0;
- if ($bytes[$base + 1] > ($cnt - $base) * 2) {
- print "[cnt=$cnt base=$base]";
- $x = $bytes[$base + 1];
- $y = ($cnt - $base) * 2;
- $z = 1;
- } elsif (($cnt - $base) * 2 < $hl + 20) {
- $x = ($cnt - $base) * 2;
- $y = $hl + 20;
- $z = 2;
- } elsif (($cnt - $base) * 2 < $hl + $thl) {
- $x = ($cnt - $base) * 2;
- $y = $hl + $thl;
- $z = 3;
- } elsif ($len < $thl) {
- $x = ($cnt - $base) * 2;
- $y = $len;
- $z = 4;
- }
-
- if ($z) {
- print " TCP: missing data($x $y $z) $hl";
-# &dump();
- return;
- }
-
- local($tcpat) = $base + $hl;
- $hs = &dosum($tcpsum, $tcpat, $cnt);
- if ($hs != 0) {
- local($osum) = $bytes[$tcpat + 8];
- $bytes[$base + $hl + 8] = 0;
- $hs2 = &dosum($tcpsum, $tcpat, $cnt);
- $bytes[$tcpat + 8] = $osum;
- printf " TCP: (%x) %x != %x", $hs, $osum, $hs2;
- } else {
- print " TCP: ok ($x $y)";
- }
-}
-
-sub udpcheck {
- local($base) = $_[0];
- local($hl) = $bytes[0] / 256;
- return if (($hl >> 4) != 4);
- return if ($bytes[3] & 0x1fff);
- $hl &= 0xf;
- $hl <<= 1;
-
- local($hs2);
- local($hs) = 17; # UDP
- local($len) = $bytes[$base + 1] - ($hl << 1);
- $hs += $len;
- $hs += $bytes[$base + 6]; # source address
- $hs += $bytes[$base + 7];
- $hs += $bytes[$base + 8]; # destination address
- $hs += $bytes[$base + 9];
- local($udpsum) = $hs;
-
- if ($bytes[$base + 1] > ($cnt - $base) * 2) {
- print " UDP: missing data(1)";
- return;
- } elsif ($bytes[$base + 1] < ($hl << 1) + 8) {
- print " UDP: missing data(2)";
- return;
- } elsif (($cnt - $base) * 2 < ($hl << 1) + 8) {
- print " UDP: missing data(3)";
- return;
- }
-
- local($udpat) = $base + $hl;
- $hs = &dosum($udpsum, $udpat, $cnt);
- local($osum) = $bytes[$udpat + 3];
-
- #
- # It is valid for UDP packets to have a 0 checksum field.
- # If it is 0, then display what it would otherwise be.
- #
- if ($osum == 0) {
- printf " UDP: => %x", $hs;
- } elsif ($hs != 0) {
- $bytes[$udpat + 3] = 0;
- $hs2 = &dosum($udpsum, $udpat, $cnt);
- $bytes[$udpat + 3] = $osum;
- printf " UDP: (%x) %x != %x", $hs, $osum, $hs2;
- } else {
- print " UDP: ok";
- }
-}
-
-sub icmpcheck {
- local($base) = $_[0];
- local($hl) = $bytes[$base + 0] / 256;
- return if (($hl >> 4) != 4);
- return if ($bytes[3] & 0x1fff);
- $hl &= 0xf;
- $hl <<= 1;
-
- local($hs);
- local($hs2);
-
- local($len) = $bytes[$base + 1] - ($hl << 1);
-
- if ($bytes[$base + 1] > ($cnt - $base) * 2) {
- print " ICMP: missing data(1)";
- return;
- } elsif ($bytes[$base + 1] < ($hl << 1) + 8) {
- print " ICMP: missing data(2)";
- return;
- } elsif (($cnt - $base) * 2 < ($hl << 1) + 8) {
- print " ICMP: missing data(3)";
- return;
- }
-
- local($osum) = $bytes[$base + $hl + 1];
- $bytes[$base + $hl + 1] = 0;
- $hs2 = &dosum(0, $base + $hl, $cnt);
- $bytes[$base + $hl + 1] = $osum;
-
- if ($osum != $hs2) {
- printf " ICMP: (%x) %x != %x", $hs, $osum, $hs2;
- } else {
- print " ICMP: ok";
- }
- if ($base == 0) {
- $type = $bytes[$hl] >> 8;
- if ($type == 3 || $type == 4 || $type == 5 ||
- $type == 11 || $type == 12) {
- &ipv4check($hl + 4);
- }
- }
-}
-
-while ($#ARGV >= 0) {
- open(I, "$ARGV[0]") || die $!;
- print "--- $ARGV[0] ---\n";
- $multi = 0;
- while (<I>) {
- chop;
- s/#.*//g;
-
- #
- # If the first non-comment, non-empty line of input starts
- # with a '[', then allow the input to be a multi-line hex
- # string, otherwise it has to be all on one line.
- #
- if (/^\[/) {
- $multi=1;
- s/^\[[^]]*\]//g;
-
- }
- s/^ *//g;
- if (length == 0) {
- next if ($cnt == 0);
- &ipv4check(0);
- $cnt = 0;
- $multi = 0;
- next;
- }
-
- #
- # look for 16 bits, represented with leading 0's as required,
- # in hex.
- #
- s/\t/ /g;
- while (/^[0-9a-fA-F][0-9a-fA-F] [0-9a-fA-F][0-9a-fA-F] .*/) {
- s/^([0-9a-fA-F][0-9a-fA-F]) ([0-9a-fA-F][0-9a-fA-F]) (.*)/$1$2 $3/;
- }
- while (/.* [0-9a-fA-F][0-9a-fA-F] [0-9a-fA-F][0-9a-fA-F] .*/) {
-$b=$_;
- s/(.*?) ([0-9a-fA-F][0-9a-fA-F]) ([0-9a-fA-F][0-9a-fA-F]) (.*)/$1 $2$3 $4/g;
- }
- if (/.* [0-9a-fA-F][0-9a-fA-F] [0-9a-fA-F][0-9a-fA-F]/) {
-$b=$_;
- s/(.*?) ([0-9a-fA-F][0-9a-fA-F]) ([0-9a-fA-F][0-9a-fA-F])/$1 $2$3/g;
- }
- while (/^[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F].*/) {
- $x = $_;
- $x =~ s/([0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]).*/$1/;
- $x =~ s/ *//g;
- $y = hex $x;
- s/[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F] *(.*)/$1/;
- $bytes[$cnt] = $y;
-#print "bytes[$cnt] = $x\n";
- $cnt++;
- }
-
- #
- # Pick up stragler bytes.
- #
- if (/^[0-9a-fA-F][0-9a-fA-F]/) {
- $y = hex $_;
- $bytes[$cnt++] = $y * 256;
- }
- if ($multi == 0 && $cnt > 0) {
- &ipv4check(0);
- $cnt = 0;
- }
- }
-
- if ($cnt > 0) {
- &ipv4check(0);
- }
- close(I);
- shift(@ARGV);
-}
OpenPOWER on IntegriCloud