X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProtHandle.pm;h=c7554d72375a694b9356595c5425008942130a0a;hb=17a3003a0cee5a3ba360fa2bccb382f0647de2b9;hp=5715902c2cfa1c0fe8ed487237bbb33b80f73abf;hpb=a313d9c8eb2ea8bbdbe9b5d6e49583d0d422a621;p=spider.git diff --git a/perl/DXProtHandle.pm b/perl/DXProtHandle.pm index 5715902c..c7554d72 100644 --- a/perl/DXProtHandle.pm +++ b/perl/DXProtHandle.pm @@ -473,8 +473,10 @@ sub handle_16 $user->lastin($main::systime) unless DXChannel::get($call); $user->put; } - $self->route_pc16($origin, $line, $parent, @rout) if @rout; - + if (@rout) { + $self->route_pc16($origin, $line, $parent, @rout); + $self->route_pc92a($main::mycall, undef, $parent, @rout); + } } # remove a user @@ -541,6 +543,7 @@ sub handle_17 $uref = Route->new($ucall) unless $uref; # throw away $self->route_pc17($origin, $line, $parent, $uref); + $self->route_pc92d($main::mycall, undef, $parent, $uref); } # link request @@ -712,7 +715,7 @@ sub handle_19 if (@rout) { $self->route_pc21($self->{call}, $line, @rout); $self->route_pc19($self->{call}, $line, @rout); - $self->route_pc92a($main::mycall, $line, @rout); + $self->route_pc92a($main::mycall, $line, $main::routeroot, @rout); } } @@ -784,7 +787,7 @@ sub handle_21 if (@rout) { $self->route_pc21($origin, $line, @rout); - $self->route_pc92d($main::mycall, $line, @rout); + $self->route_pc92d($main::mycall, $line, $main::routeroot, @rout); } } @@ -1322,7 +1325,7 @@ sub handle_92 $self->{do_pc92} ||= 1; - my ($pcall, $is_node, $is_extnode, $here, $version, $build) = _decode_pc92_call($_[1]); + my $pcall = $_[1]; unless ($pcall) { dbg("PCPROT: invalid callsign string '$_[1]', ignored") if isdbg('chanerr'); return; @@ -1330,6 +1333,8 @@ sub handle_92 my $t = $_[2]; my $sort = $_[3]; + my @ent = grep {$_ && /^[0-7]/} @_[4 .. $#_]; + if ($pcall eq $main::mycall) { dbg("PCPROT: looped back, ignored") if isdbg('chanerr'); return; @@ -1342,31 +1347,45 @@ sub handle_92 dbg("PCPROT: dup / old id <= $lastid, ignored") if isdbg('chanerr'); return; } - $parent->flags(Route::here($here)); - $parent->version($version) if $version; } else { - $parent = Route::Node->new($pcall, $version, Route::here($here)); + $parent = Route::Node->new($pcall); } $parent->lastid->{92} = $t; - $parent->build($build) if $build; + + if (@ent) { + my ($call, $is_node, $is_extnode, $here, $version, $build) = _decode_pc92_call($ent[0]); + if ($call && $is_node && $call eq $pcall) { + $parent->here(Route::here($here)); + $parent->version($version) if $version; + $parent->build($build) if $build; + } elsif ($is_extnode) { + # reparent to external node (note that we must have received a 'C' or 'A' record + # from the true parent node for this external before we get one for the this node + unless ($parent = Route::Node::get($call)) { + dbg("PCPROT: no previous C or A for this external node received, ignored") if isdbg('chanerr'); + return; + } + } else { + dbg("PCPROT: must be mycall or external node as first entry, ignored") if isdbg('chanerr'); + return; + } + shift @ent; + } my (@radd, @rdel); if ($sort eq 'A') { - if ($_[4]) { - if (@radd = _add_thingy($parent, $_[4])) { - } + for (@ent) { + push @radd, _add_thingy($parent, $_); } } elsif ($sort eq 'D') { - if ($_[4]) { - if (@rdel = _del_thingy($parent, $_[4])) { - } + for (@ent) { + push @rdel, _del_thingy($parent, $_); } } elsif ($sort eq 'C') { - my $i; my (@nodes, @users); - for ($i = 4; $_[$i]; $i++) { - my ($call, $is_node, $is_extnode, $here, $version, $build) = _decode_pc92_call($_[$i]); + for (@ent) { + my ($call, $is_node, $is_extnode, $here, $version, $build) = _decode_pc92_call($_); if ($call) { if ($is_node) { push @nodes, $call; @@ -1374,17 +1393,17 @@ sub handle_92 push @users, $call; } } else { - dbg("DXPROT: pc92 call entry '$_[$i]' not decoded, ignored") if isdbg('chanerr'); + dbg("DXPROT: pc92 call entry '$_' not decoded, ignored") if isdbg('chanerr'); } } my ($dnodes, $dusers, $nnodes, $nusers) = $parent->calc_config_changes(\@nodes, \@users); - for ($i = 4; $_[$i]; $i++) { - my ($call, $is_node, $is_extnode, $here, $version, $build) = _decode_pc92_call($_[$i]); + for (@ent) { + my ($call, $is_node, $is_extnode, $here, $version, $build) = _decode_pc92_call($_); if ($call) { - push @radd,_add_thingy($parent, $_[$i]) if grep $call eq $_, (@$nnodes, @$nusers); - push @rdel,_del_thingy($parent, $_[$i]) if grep $call eq $_, (@$dnodes, @$dusers); + push @radd,_add_thingy($parent, $_) if grep $call eq $_, (@$nnodes, @$nusers); + push @rdel,_del_thingy($parent, $_) if grep $call eq $_, (@$dnodes, @$dusers); } } } else {