diff options
Diffstat (limited to 'contrib/ipfilter/test/h4to6')
-rw-r--r-- | contrib/ipfilter/test/h4to6 | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/contrib/ipfilter/test/h4to6 b/contrib/ipfilter/test/h4to6 new file mode 100644 index 0000000..e31f7c4 --- /dev/null +++ b/contrib/ipfilter/test/h4to6 @@ -0,0 +1,135 @@ +@P=(); +$line = 0; +while (<>) { + s/\=192.168.1.188/\=c0a8:0100::bc/g; + s/\=192.168.1.188/\=c0a8:0100::bc/g; + @F = split; + if (/^#/) { + @P[$nline++] = join(" ",@F); + next; + } + $line = 0 if (/^\[/); + if ($line == 1) { + $len = hex($F[1]) - 20; + $pr = hex($F[4]) & 0xff; + $pr = 58 if ($pr == 1); + $ttl = hex($F[4]) >> 8; + &replaceip($_, $len, $pr, $ttl); + $ipline = $nline; + $err = 0; + } elsif ($line == 2) { + if ($pr == 58) { + # + # Map the ICMP type codes from IPv4 to IPv6 + # and update the checksum to compensate. + # + if ($F[0] =~ /^0800/) { + $F[0] =~ s/^0800/8000/; + $d = 0x7800; + } + if ($F[0] =~ /^0000/) { + $F[0] =~ s/^0000/8100/; + $d = 0x8100; + } + if ($F[0] =~ /^0304/) { + $F[0] =~ s/^0304/0200/; + $d = 0xfefc; + $err = 1; + } + if ($F[0] =~ /^03/) { + $F[0] =~ s/^03/01/; + $d = 0xfe00; + $err = 1; + } + if ($F[0] =~ /^0b/) { + $F[0] =~ s/^0b/03/; + $d = 0xf800; + $err = 1; + } + if ($F[0] =~ /^0c/) { + $F[0] =~ s/^0c/04/; + $d = 0xf800; + $err = 1; + } + $F[1] = sprintf "%04x", hex($F[1]) - $d; + } + @P[$nline++] = join(" ",@F); + } elsif ($line == 3) { + if ($pr == 58 && $err == 1 && $F[0] =~ /^45/) { + local($l) = hex($F[1]) - 20; + local($p) = hex($F[4]) & 0xff; + $p = 58 if ($p == 1); + local($t) = hex($F[4]) >> 8; + &replaceip(join(" ", @F), $l, $p, $t); + @H = split(/ /, $P[$ipline]); + $H[2] += 20; + $P[$ipline] = join(" ",@H); + } else { + @P[$nline++] = join(" ",@F); + } + } else { + @P[$nline++] = join(" ",@F); + } + $line++; +} + +for ($li = 0; $li < $nline; $li++) { + print "$P[$li]\n"; +} + +exit(0); + +sub replaceip { + local(@G) = split(/\s/,$_[0]); + local($p) = ""; + + $p = sprintf "6000 0000 %04x %02x%02x", $_[1], $_[2], $_[3]; + if ($G[6] =~ /^c0a8/) { + $fmt = " %02x%02x %02x00 0000 0000 0000 0000 0000 00%02x"; + } else { + if ($G[6] =~ /^0[4a]../) { + $fmt = " 00%02x 00%02x 00%02x 0000 0000 0000 0000 00%02x"; + } else { + $fmt = " 00%02x 0000 0000 0000 0000 00%02x 00%02x 00%02x"; + } + if ($G[6] =~ /^0a/) { + $G[6] =~ s/^0a/10/; + } + if ($G[6] =~ /0a$/) { + $G[6] =~ s/0a$/10/; + } + if ($G[7] =~ /^0a/) { + $G[7] =~ s/^0a/10/; + } + if ($G[7] =~ /0a$/) { + $G[7] =~ s/0a$/10/; + } + } + $p = $p.sprintf $fmt, hex($G[6]) >> 8, hex($G[6]) & 0xff, + hex($G[7]) >> 8, hex($G[7]) & 0xff; + + if ($G[6] =~ /^c0a8/) { + $fmt = " %02x%02x %02x00 0000 0000 0000 0000 0000 00%02x"; + } else { + if ($G[8] =~ /^0[4a]../) { + $fmt = " 00%02x 00%02x 00%02x 0000 0000 0000 0000 00%02x"; + } else { + $fmt = " 00%02x 0000 0000 0000 0000 00%02x 00%02x 00%02x"; + } + if ($G[8] =~ /^0a/) { + $G[8] =~ s/^0a/10/; + } + if ($G[8] =~ /0a$/) { + $G[8] =~ s/0a$/10/; + } + if ($G[9] =~ /^0a/) { + $G[9] =~ s/^0a/10/; + } + if ($G[9] =~ /0a$/) { + $G[9] =~ s/0a$/10/; + } + } + $p = $p.sprintf $fmt, hex($G[8]) >> 8, hex($G[8]) & 0xff, + hex($G[9]) >> 8, hex($G[9]) & 0xff; + $P[$nline++] = $p; +} |