X-Git-Url: http://www.dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FRoute.pm;h=3301099890e23214948639c8aa28c667bc52dbfd;hb=c1540ccd7990ec4bd151604dd63583d19fe4d0f6;hp=2c53175fc645b13f4e0f6a6310d97cf7e4f3c8af;hpb=a2b44b1c0d70fb3439bef2456a7f950d87e65a0a;p=spider.git diff --git a/perl/Route.pm b/perl/Route.pm index 2c53175f..33010998 100644 --- a/perl/Route.pm +++ b/perl/Route.pm @@ -1,4 +1,4 @@ -#!/usr/bin/perl +# # # This module impliments the abstracted routing for all protocols and # is probably what I SHOULD have done the first time. @@ -9,7 +9,7 @@ # # Copyright (c) 2001 Dirk Koopman G1TLH # -# $Id$ +# # package Route; @@ -181,6 +181,7 @@ sub config { my $self = shift; my $nodes_only = shift || 0; + my $width = shift || 79; my $level = shift; my $seen = shift; my @out; @@ -200,7 +201,7 @@ sub config $pcall .= ":" . $self->obscount if isdbg('obscount'); - $line = ' ' x ($level*2) . "$pcall"; + $line = ' ' x ($level*2) . $pcall; $pcall = ' ' x length $pcall; # recursion detector @@ -223,7 +224,7 @@ sub config } else { $c = "$ucall?"; } - if ((length $line) + (length $c) + 1 < 79) { + if ((length $line) + (length $c) + 1 < $width) { $line .= $c . ' '; } else { $line =~ s/\s+$//; @@ -251,7 +252,7 @@ sub config if ($nref) { my $c = $nref->user_call; dbg("recursing from $call -> $c") if isdbg('routec'); - my @rout = $nref->config($nodes_only, $level+1, $seen, @_); + my @rout = $nref->config($nodes_only, $width, $level+1, $seen, @_); if (@rout && @_) { push @out, ' ' x ($level*2) . $self->user_call unless grep /^\s+$call/, @out; } @@ -288,61 +289,56 @@ sub get sub findroutes { my $call = shift; - my $level = shift || 0; - my $seen = shift || {}; my @out; - dbg("findroutes: $call level: $level calls: " . join(',', @_)) if isdbg('routec'); + dbg("ROUTE: findroutes: $call") if isdbg('findroutes'); - # recursion detector - return () if $seen->{$call}; + # return immediately if we are directly connected if (my $dxchan = DXChannel::get($call)) { - $seen->{$call}++; - push @out, $level ? [$level, $dxchan] : $dxchan; - return @out; + return $dxchan; } - # deal with more nodes my $nref = Route::get($call); - foreach my $ncall (@{$nref->{parent}}) { - unless ($seen->{$ncall}) { - dbg("recursing from $call -> $ncall") if isdbg('routec'); - my @rout = findroutes($ncall, $level+1, $seen); - push @out, @rout; + return () unless $nref; + + # obtain the dxchannels that have seen this thingy + my @parent = $nref->isa('Route::User') ? @{$nref->{parent}} : $call; + my %cand; + foreach my $p (@parent) { + my $r = Route::Node::get($p); + if ($r) { + my %r = $r->PC92C_dxchan; + while (my ($k, $v) = each %r) { + $cand{$k} = $v if $v > ($cand{$k} || 0); + } } } - return $level == 0 ? map {$_->[1]} sort {$a->[0] <=> $b->[0]} @out : @out; + # remove any dxchannels that have gone away + while (my ($k, $v) = each %cand) { + if (my $dxc = DXChannel::get($k)) { + push @out, [$v, $dxc]; + } + } + + # get a sorted list of dxchannels with the highest hop count first + my @nout = map {$_->[1]} sort {$b->[0] <=> $a->[0]} @out; + if (isdbg('findroutes')) { + if (@out) { + foreach (sort {$b->[0] <=> $a->[0]} @out) { + dbg("ROUTE: findroute $call -> $_->[0] " . $_->[1]->call); + } + } + } + + return @nout; } # find all the possible dxchannels which this object might be on sub alldxchan { my $self = shift; - my @dxchan; -# dbg("Trying node $self->{call}") if isdbg('routech'); - - my $dxchan = DXChannel::get($self->{call}); - push @dxchan, $dxchan if $dxchan; - - # it isn't, build up a list of dxchannels and possible ping times - # for all the candidates. - unless (@dxchan) { - foreach my $p (@{$self->{parent}}) { -# dbg("Trying parent $p") if isdbg('routech'); - next if $p eq $main::mycall; # the root - my $dxchan = DXChannel::get($p); - if ($dxchan) { - push @dxchan, $dxchan unless grep $dxchan == $_, @dxchan; - } else { - next if grep $p eq $_, @_; - my $ref = Route::Node::get($p); -# dbg("Next node $p " . ($ref ? 'Found' : 'NOT Found') if isdbg('routech') ); - push @dxchan, $ref->alldxchan($self->{call}, @_) if $ref; - } - } - } -# dbg('routech', "Got dxchan: " . join(',', (map{ $_->call } @dxchan)) ); + my @dxchan = findroutes($self->{call}); return @dxchan; } @@ -357,19 +353,14 @@ sub dxchan my @dxchan = $self->alldxchan; return undef unless @dxchan; - # determine the minimum ping channel - my $minping = 99999999; - foreach my $dxc (@dxchan) { - my $p = $dxc->pingave; - if (defined $p && $p < $minping) { - $minping = $p; - $dxchan = $dxc; - } - } - $dxchan = shift @dxchan unless $dxchan; - return $dxchan; + # dxchannels are now returned in order of "closeness" + return $dxchan[0]; } +sub delete_interface +{ + +} #