X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FRoute.pm;h=c43fd34d7dc1cad6e93a0baec8504bedf0023de6;hb=refs%2Fheads%2Fnew-spawn;hp=f637539c0c41c11f5ffa531b485789430a2fc4da;hpb=d638bda3f73da1b09d029105a0f3c95093c50df5;p=spider.git diff --git a/perl/Route.pm b/perl/Route.pm index f637539c..c43fd34d 100644 --- a/perl/Route.pm +++ b/perl/Route.pm @@ -22,7 +22,7 @@ use DXUtil; use strict; -use vars qw(%list %valid $filterdef); +use vars qw(%list %valid $filterdef $maxlevel); %valid = ( call => "0,Callsign", @@ -53,6 +53,7 @@ $filterdef = bless ([ ['by_state', 'ns', 9], ], 'Filter::Cmd'); +$maxlevel = 25; # maximum recursion level in Route::config sub new { @@ -205,7 +206,7 @@ sub config $pcall = ' ' x length $pcall; # recursion detector - if ((DXChannel::get($call) && $level > 1) || $seen->{$call}) { + if ((DXChannel::get($call) && $level > 1) || $seen->{$call} || $level > $maxlevel) { $line .= ' ...'; push @out, $line; return @out; @@ -239,7 +240,7 @@ sub config push @out, $line if length $line; } else { # recursion detector - if ((DXChannel::get($call) && $level > 1) || $seen->{$call}) { + if ((DXChannel::get($call) && $level > 1) || $seen->{$call} || $level > $maxlevel) { return @out; } $seen->{$call}++; @@ -289,29 +290,33 @@ sub get sub findroutes { my $call = shift; + my %cand; my @out; dbg("ROUTE: findroutes $call") if isdbg('findroutes'); - # return immediately if we are directly connected + my $nref = Route::get($call); + return () unless $nref; + + # we are directly connected, force "best possible" priority, but + # carry on in case user is connected on other nodes. my $dxchan = DXChannel::get($call); if ($dxchan) { dbg("ROUTE: findroutes $call -> directly connected") if isdbg('findroutes'); - return $dxchan; + $cand{$call} = 99; } - my $nref = Route::get($call); - 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) { - # return immediately if we are directly connected or a user's parent node is + next if $p eq $main::mycall; # this is dealt with above + + # deal with directly connected nodes, again "best priority" $dxchan = DXChannel::get($p); if ($dxchan) { dbg("ROUTE: findroutes $call -> connected direct via parent $p") if isdbg('findroutes'); - return $dxchan; + $cand{$p} = 99; + next; } my $r = Route::Node::get($p); @@ -331,10 +336,10 @@ sub findroutes } # get a sorted list of dxchannels with the highest hop count first - my @nout = map {$_->[1]} sort {$b->[0] <=> $a->[0]} @out; + my @nout = sort {$b->[0] <=> $a->[0]} @out; if (isdbg('findroutes')) { - if (@out) { - foreach (sort {$b->[0] <=> $a->[0]} @out) { + if (@nout) { + for (@nout) { dbg("ROUTE: findroutes $call -> $_->[0] " . $_->[1]->call); } } @@ -348,7 +353,7 @@ sub alldxchan { my $self = shift; my @dxchan = findroutes($self->{call}); - return @dxchan; + return map {$_->[1]} @dxchan; } sub dxchan @@ -371,7 +376,6 @@ sub delete_interface } - # # track destruction #