X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=2bfd66865c6eac1e2e6808e2bab7e2c423b4ebc0;hb=a55714f18999ec1ac500dfcbf7f3f12cc4a96f99;hp=629d9cb7c5952757537bb8ed9e697473184a4207;hpb=8ef5f82f54963d7e0578a892e9336d254aff2e12;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index 629d9cb7..2bfd6686 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -718,7 +718,7 @@ sub handle_16 # if there is a parent, proceed, otherwise if there is a latent PC19 in the PC19list, # fix it up in the routing tables and issue it forth before the PC16 - unless ($parent) { + if ($parent) { $dxchan = $parent->dxchan; if ($dxchan && $dxchan ne $self) { dbg("PCPROT: PC16 from $self->{call} trying to alter locally connected $ncall, ignored!") if isdbg('chanerr'); @@ -733,10 +733,10 @@ sub handle_16 } # is he under the control of the new protocol? - if ($parent && $parent->np) { - dbg("PCPROT: $ncall aranea node, ignored") if isdbg('chanerr'); - return; - } +# if ($parent && $parent->np) { +# dbg("PCPROT: $ncall aranea node, ignored") if isdbg('chanerr'); +# return; +# } my $i; my @rout; @@ -822,38 +822,37 @@ sub handle_17 my $uref = Route::User::get($ucall); unless ($uref) { dbg("PCPROT: Route::User $ucall not in config") if isdbg('chanerr'); + return; } my $parent = Route::Node::get($ncall); unless ($parent) { dbg("PCPROT: Route::Node $ncall not in config") if isdbg('chanerr'); + return; } - $dxchan = $parent->dxchan if $parent; + $dxchan = $parent->dxchan; if ($dxchan && $dxchan ne $self) { dbg("PCPROT: PC17 from $self->{call} trying to alter locally connected $ncall, ignored!") if isdbg('chanerr'); return; } # is he under the control of the new protocol? - if ($parent && $parent->np) { - dbg("PCPROT: $ncall aranea node, ignored") if isdbg('chanerr'); - return; - } +# if ($parent && $parent->np) { +# dbg("PCPROT: $ncall aranea node, ignored") if isdbg('chanerr'); +# return; +# } # input filter if required and then remove user if present - if ($parent) { + if ($parent && !$parent->np) { # return unless $self->in_filter_route($parent); $parent->del_user($uref) if $uref; - } else { - $parent = Route->new($ncall); # throw away - } + } if (eph_dup($line)) { dbg("PCPROT: dup PC17 detected") if isdbg('chanerr'); return; } - $uref = Route->new($ucall) unless $uref; # throw away $self->route_pc17($origin, $line, $parent, $uref) if (DXChannel::get($parent->call) || $parent->np); } @@ -913,26 +912,6 @@ sub handle_19 return; } - # if the origin isn't the same as the INTERFACE, then reparent, creating nodes as necessary - if ($origin ne $self->call) { - my $op = Route::Node::get($origin); - unless ($op) { - $op = $parent->add($origin, 5000, 1); - my $user = DXUser->get_current($origin); - if (!$user) { - $user = DXUser->new($origin); - $user->priv(1); # I have relented and defaulted nodes - $user->lockout(1); - $user->homenode($origin); - $user->node($origin); - $user->wantroutepc19(1); - } - $user->sort('A') unless $user->is_node; - $user->put; - } - $parent = $op; - } - # parse the PC19 for ($i = 1; $i < $#_-1; $i += 4) { my $here = $_[$i]; @@ -945,7 +924,7 @@ sub handle_19 # check for sane parameters # $ver = 5000 if $ver eq '0000'; - next if $ver < 5000; # only works with version 5 software + next unless $ver > 5000; # only works with version 5 software that isn't a passive node next if length $call < 3; # min 3 letter callsigns next if $call eq $main::mycall; @@ -969,22 +948,7 @@ sub handle_19 RouteDB::update($call, $origin); - # do we believe this call? my $genline = "PC19^$here^$call^$conf^$ver^$_[-1]^"; -# unless ($call eq $origin || $self->is_believed($call)) { -# my $pt = $user->lastping($origin) || 0; -# if ($pt+$investigation_int < $main::systime && !Investigate::get($call, $origin)) { -# my $ivp = Investigate->new($call, $origin); -# $ivp->version($ver); -# $ivp->here($here); -# $ivp->store_pcxx($pcno,$genline,$origin,'PC19',$here,$call,$conf,$ver,$_[-1]); -# } else { -# dbg("PCPROT: We don't believe $call on $origin") if isdbg('chanerr'); -# } -# $user->put; -# next; -# } - if (eph_dup($genline)) { dbg("PCPROT: dup PC19 for $call detected") if isdbg('chanerr'); next; @@ -993,8 +957,8 @@ sub handle_19 my $r = Route::Node::get($call); my $flags = $here; - # is he under the control of the new protocol? - if ($r && $r->np) { + # is he under the control of the new protocol and not my interface call? + if ($call ne $origin && $r && $r->np) { dbg("PCPROT: $call aranea node, ignored") if isdbg('chanerr'); next; } @@ -1008,6 +972,12 @@ sub handle_19 } else { next; } + } else { + if ($r->version != $ver || $r->flags != $flags) { + $r->version($ver); + $r->flags($flags); + push @rout, $r; + } } } else { @@ -1033,7 +1003,7 @@ sub handle_19 } # we only output information that we regard as reliable - @rout = grep {$_ && (DXChannel::get{$_->{call}} || $_->np) } @rout; + @rout = grep {$_ && (DXChannel::get($_->{call}) || $_->np) } @rout; $self->route_pc19($origin, $line, @rout) if @rout; } @@ -1122,7 +1092,7 @@ sub handle_21 return; } - @rout = grep {$_ && (DXChannel::get{$_->{call}} || $_->np) } @rout; + @rout = grep {$_ && (DXChannel::get($_->{call}) || $_->np) } @rout; $self->route_pc21($origin, $line, @rout) if @rout; } @@ -1608,13 +1578,13 @@ sub process # send a ping out on this channel if ($dxchan->{pingint} && $t >= $dxchan->{pingint} + $dxchan->{lastping}) { - if ($dxchan->{nopings} <= 0) { - $dxchan->disconnect; - } else { +# if ($dxchan->{nopings} <= 0) { +# $dxchan->disconnect; +# } else { addping($main::mycall, $dxchan->call); $dxchan->{nopings} -= 1; $dxchan->{lastping} = $t; - } +# } } } @@ -1913,7 +1883,7 @@ sub send_local_config for $node (@intcalls) { push @remotenodes, Route::Node::get($node) unless grep $node eq $_, @rnodes, @remotenodes; } - @remotenodes = grep {$_ && (DXChannel::get{$_->{call}} || $_->np) } @remotenodes; + @remotenodes = grep {$_ && (DXChannel::get($_->{call}) || $_->np) } @remotenodes; $self->send_route($main::mycall, \&pc19, scalar(@remotenodes), @remotenodes); }