xref: /freebsd/usr.sbin/route6d/misc/chkrt (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
17d56d374SYoshinobu Inoue#!/usr/bin/perl
27d56d374SYoshinobu Inoue#
37d56d374SYoshinobu Inoue#
47d56d374SYoshinobu Inoue$dump="/var/tmp/route6d_dump";
57d56d374SYoshinobu Inoue$pidfile="/var/run/route6d.pid";
67d56d374SYoshinobu Inoue
77d56d374SYoshinobu Inouesystem("rm -f $dump");
87d56d374SYoshinobu Inoue
97d56d374SYoshinobu Inoueopen(FD, "< $pidfile") || die "Can not open $pidfile";
107d56d374SYoshinobu Inoue$_ = <FD>;
117d56d374SYoshinobu Inouechop;
127d56d374SYoshinobu Inoueclose(FD);
137d56d374SYoshinobu Inouesystem("kill -INT $_");
147d56d374SYoshinobu Inoue
156d7256d9SHajimu UMEMOTOopen(NS, "/usr/bin/netstat -r -n|") || die "Can not open netstat";
167d56d374SYoshinobu Inouewhile (<NS>) {
177d56d374SYoshinobu Inoue	chop;
187d56d374SYoshinobu Inoue	next unless (/^3f/ || /^5f/);
197d56d374SYoshinobu Inoue	@f = split(/\s+/);
207d56d374SYoshinobu Inoue	$gw{$f[0]} = $f[1];
217d56d374SYoshinobu Inoue	$int{$f[0]} = $f[3];
227d56d374SYoshinobu Inoue}
237d56d374SYoshinobu Inoueclose(NS);
247d56d374SYoshinobu Inoue
257d56d374SYoshinobu Inoue$err=0;
267d56d374SYoshinobu Inouesleep(2);
277d56d374SYoshinobu Inoueopen(FD, "< $dump") || die "Can not open $dump";
287d56d374SYoshinobu Inouewhile (<FD>) {
297d56d374SYoshinobu Inoue	chop;
307d56d374SYoshinobu Inoue	next unless (/^    3f/ || /^    5f/);
317d56d374SYoshinobu Inoue	@f = split(/\s+/);
327d56d374SYoshinobu Inoue	$dst = $f[1];
337d56d374SYoshinobu Inoue	$f[2] =~ /if\(\d:([a-z0-9]+)\)/;
347d56d374SYoshinobu Inoue	$intf = $1;
357d56d374SYoshinobu Inoue	$f[3] =~ /gw\(([a-z0-9:]+)\)/;
367d56d374SYoshinobu Inoue	$gateway = $1;
377d56d374SYoshinobu Inoue	$f[4] =~ /\[(\d+)\]/;
387d56d374SYoshinobu Inoue	$metric = $1;
397d56d374SYoshinobu Inoue	$f[5] =~ /age\((\d+)\)/;
407d56d374SYoshinobu Inoue	$age = $1;
417d56d374SYoshinobu Inoue	unless (defined($gw{$dst})) {
427d56d374SYoshinobu Inoue		print "NOT FOUND: $dst $intf $gateway $metric $age\n";
437d56d374SYoshinobu Inoue		$err++;
447d56d374SYoshinobu Inoue		next;
457d56d374SYoshinobu Inoue	}
467d56d374SYoshinobu Inoue	if ($gw{$dst} ne $gateway && $gw{$dst} !~ /link#\d+/) {
477d56d374SYoshinobu Inoue		print "WRONG GW: $dst $intf $gateway $metric $age\n";
487d56d374SYoshinobu Inoue		print "kernel gw: $gw{$dst}\n";
497d56d374SYoshinobu Inoue		$err++;
507d56d374SYoshinobu Inoue		next;
517d56d374SYoshinobu Inoue	}
527d56d374SYoshinobu Inoue	if ($int{$dst} ne $intf) {
537d56d374SYoshinobu Inoue		print "WRONG IF: $dst $intf $gateway $metric $age\n";
547d56d374SYoshinobu Inoue		print "kernel if: $int{$dst}\n";
557d56d374SYoshinobu Inoue		$err++;
567d56d374SYoshinobu Inoue		next;
577d56d374SYoshinobu Inoue	}
587d56d374SYoshinobu Inoue}
597d56d374SYoshinobu Inoueclose(FD);
607d56d374SYoshinobu Inoue
617d56d374SYoshinobu Inoueif ($err == 0) {
627d56d374SYoshinobu Inoue	print "No error found\n";
637d56d374SYoshinobu Inoue}
64