155163Sshin#!/usr/bin/perl
255163Sshin#
355163Sshin# $FreeBSD$
455163Sshin#
555163Sshin$dump="/var/tmp/route6d_dump";
655163Sshin$pidfile="/var/run/route6d.pid";
755163Sshin
855163Sshinsystem("rm -f $dump");
955163Sshin
1055163Sshinopen(FD, "< $pidfile") || die "Can not open $pidfile";
1155163Sshin$_ = <FD>;
1255163Sshinchop;
1355163Sshinclose(FD);
1455163Sshinsystem("kill -INT $_");
1555163Sshin
16122675Sumeopen(NS, "/usr/bin/netstat -r -n|") || die "Can not open netstat";
1755163Sshinwhile (<NS>) {
1855163Sshin	chop;
1955163Sshin	next unless (/^3f/ || /^5f/);
2055163Sshin	@f = split(/\s+/);
2155163Sshin	$gw{$f[0]} = $f[1];
2255163Sshin	$int{$f[0]} = $f[3];
2355163Sshin}
2455163Sshinclose(NS);
2555163Sshin
2655163Sshin$err=0;
2755163Sshinsleep(2);
2855163Sshinopen(FD, "< $dump") || die "Can not open $dump";
2955163Sshinwhile (<FD>) {
3055163Sshin	chop;
3155163Sshin	next unless (/^    3f/ || /^    5f/);
3255163Sshin	@f = split(/\s+/);
3355163Sshin	$dst = $f[1];
3455163Sshin	$f[2] =~ /if\(\d:([a-z0-9]+)\)/;
3555163Sshin	$intf = $1;
3655163Sshin	$f[3] =~ /gw\(([a-z0-9:]+)\)/;
3755163Sshin	$gateway = $1;
3855163Sshin	$f[4] =~ /\[(\d+)\]/;
3955163Sshin	$metric = $1;
4055163Sshin	$f[5] =~ /age\((\d+)\)/;
4155163Sshin	$age = $1;
4255163Sshin	unless (defined($gw{$dst})) {
4355163Sshin		print "NOT FOUND: $dst $intf $gateway $metric $age\n";
4455163Sshin		$err++;
4555163Sshin		next;
4655163Sshin	}
4755163Sshin	if ($gw{$dst} ne $gateway && $gw{$dst} !~ /link#\d+/) {
4855163Sshin		print "WRONG GW: $dst $intf $gateway $metric $age\n";
4955163Sshin		print "kernel gw: $gw{$dst}\n";
5055163Sshin		$err++;
5155163Sshin		next;
5255163Sshin	}
5355163Sshin	if ($int{$dst} ne $intf) {
5455163Sshin		print "WRONG IF: $dst $intf $gateway $metric $age\n";
5555163Sshin		print "kernel if: $int{$dst}\n";
5655163Sshin		$err++;
5755163Sshin		next;
5855163Sshin	}
5955163Sshin}
6055163Sshinclose(FD);
6155163Sshin
6255163Sshinif ($err == 0) {
6355163Sshin	print "No error found\n";
6455163Sshin}
65