| @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; |
| } |