From 1be52e58e3cb8a1746bd583b1b1e311602bb1935 Mon Sep 17 00:00:00 2001 From: minima Date: Wed, 3 Jan 2007 14:29:21 +0000 Subject: [PATCH] rejig callsigns in PC92 --- perl/DXProt.pm | 9 ++++---- perl/DXProtHandle.pm | 51 +++++++++++++++++++++++++++++--------------- perl/DXProtout.pm | 2 +- 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/perl/DXProt.pm b/perl/DXProt.pm index 1da81e95..a9d9e8ed 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -771,9 +771,10 @@ sub send_pc92_config dbg('DXProt::send_pc92_config') if isdbg('trace'); # send 'my' configuration for all users and pc92 capable nodes - my @dxchan = grep { $_->call ne $main::mycall && $_ != $self && !$_->{isolate} && $_->{do_pc92} } DXChannel::get_all(); - my @localnodes = map { my $r = Route::get($_->{call}); $r ? $r : () } @dxchan; - $self->send_route_pc92($main::mycall, \&pc92c, scalar @localnodes, @localnodes); + my @dxchan = grep { $_->call ne $main::mycall && $_ != $self && !$_->{isolate} && $_->{do_pc92} } DXChannel::get_all_nodes(); + my @localnodes = map { my $r = Route::Node::get($_->{call}); $r ? $r : () } @dxchan; + push @localnodes, map { my $r = Route::Node::get($_->{call}); $r ? $r : () } DXChannel::get_all_users(); + $self->send_route_pc92($main::mycall, \&pc92c, (scalar @localnodes)+1, $main::routeroot, @localnodes); # send the configuration of all the 'external' nodes that don't handle PC92 # out with the 'external' marker on the first node. @@ -1027,7 +1028,7 @@ sub disconnect # broadcast to all other nodes that all the nodes connected to via me are gone unless ($pc39flag && $pc39flag == 2) { $self->route_pc21($main::mycall, undef, @rout) if @rout; - $self->route_pc92d($main::mycall, undef, $node) if $node; + $self->route_pc92d($main::mycall, undef, $main::routeroot, $node) if $node; } # remove outstanding pings diff --git a/perl/DXProtHandle.pm b/perl/DXProtHandle.pm index 20eb37e4..903a2fd6 100644 --- a/perl/DXProtHandle.pm +++ b/perl/DXProtHandle.pm @@ -715,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, $parent, @rout); } } @@ -787,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, $parent, @rout); } } @@ -1325,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; @@ -1333,6 +1333,8 @@ sub handle_92 my $t = $_[2]; my $sort = $_[3]; + my @ent = grep {$_ && /^[0-7]/} @_[4 .. -1]; + if ($pcall eq $main::mycall) { dbg("PCPROT: looped back, ignored") if isdbg('chanerr'); return; @@ -1345,31 +1347,46 @@ 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 $main::mycall) { + $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; @@ -1383,8 +1400,8 @@ sub handle_92 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); diff --git a/perl/DXProtout.pm b/perl/DXProtout.pm index 72595d8a..ea800726 100644 --- a/perl/DXProtout.pm +++ b/perl/DXProtout.pm @@ -396,7 +396,7 @@ sub _gen_pc92 { my $sort = shift; my $ext = $sort eq 'C'; - my $s = "PC92^" . _encode_pc92_call($main::me, $ext) . "^" . _gen_time . "^$sort"; + my $s = "PC92^$main::mycall^" . _gen_time . "^$sort"; for (@_) { $s .= "^" . _encode_pc92_call($_, $ext); } -- 2.43.0