use vars qw($me $pc11_max_age $pc11_dup_age $pc23_dup_age
%spotdup %wwvdup $last_hour %pings %rcmds
%nodehops @baddx $baddxfn $pc12_dup_age
- %anndup);
+ %anndup $allowzero);
$me = undef; # the channel id for this cluster
$pc11_max_age = 1*3600; # the maximum age for an incoming 'real-time' pc11
return unless $node; # ignore if havn't seen a PC19 for this one yet
return unless $node->isa('DXNode');
if ($node->dxchan != $self) {
- dbg('chan', "LOOP: come in on wrong channel");
+ dbg('chan', "LOOP: $field[1] came in on wrong channel");
+ return;
+ }
+ my $dxchan;
+ if (($dxchan = DXChannel->get($field[1])) && $dxchan != $self) {
+ dbg('chan', "LOOP: $field[1] connected locally");
return;
}
my $i;
return unless $node;
return unless $node->isa('DXNode');
if ($node->dxchan != $self) {
- dbg('chan', "LOOP: come in on wrong channel");
+ dbg('chan', "LOOP: $field[2] came in on wrong channel");
+ return;
+ }
+ my $dxchan;
+ if (($dxchan = DXChannel->get($field[2])) && $dxchan != $self) {
+ dbg('chan', "LOOP: $field[2] connected locally");
return;
}
my $ref = DXCluster->get_exact($field[1]);
if ($pcno == 19) { # incoming cluster list
my $i;
+ my $newline = "PC19^";
for ($i = 1; $i < $#field-1; $i += 4) {
my $here = $field[$i];
my $call = uc $field[$i+1];
- my $confmode = $field[$i+2] eq '*';
+ my $confmode = $field[$i+2];
my $ver = $field[$i+3];
+
+ $ver = 5400 if !$ver && $allowzero;
# now check the call over
my $node = DXCluster->get_exact($call);
- if ($node && $node->dxchan != $self) {
- dbg('chan', "LOOP: come in on wrong channel");
- return;
+ if ($node) {
+ my $dxchan;
+ if (($dxchan = DXChannel->get($call)) && $dxchan != $self) {
+ dbg('chan', "LOOP: $call connected locally");
+ }
+ if ($node->dxchan != $self) {
+ dbg('chan', "LOOP: $call come in on wrong channel");
+ next;
+ }
+ dbg('chan', "already have $call");
+ next;
}
- next if $node; # we already have this
# check for sane parameters
next if $ver < 5000; # only works with version 5 software
next if length $call < 3; # min 3 letter callsigns
+
+ # add it to the nodes table and outgoing line
+ $newline .= "$here^$call^$confmode^$ver^";
DXNode->new($self, $call, $confmode, $here, $ver);
# unbusy and stop and outgoing mail (ie if somehow we receive another PC19 without a disconnect)
# queue up any messages
DXMsg::queue_msg(0) if $self->state eq 'normal';
+ return if $newline eq "PC19^";
+
+ # add hop count
+ $newline .= get_hops(19) . "^";
+ $line = $newline;
last SWITCH;
}
my $node = DXCluster->get_exact($call);
if ($node) {
if ($node->dxchan != $self) {
- dbg('chan', "LOOP: come in on wrong channel");
+ dbg('chan', "LOOP: $call come in on wrong channel");
+ return;
+ }
+ my $dxchan;
+ if (($dxchan = DXChannel->get($call)) && $dxchan != $self) {
+ dbg('chan', "LOOP: $call connected locally");
return;
}
$node->del();
if ($pcno == 50) { # keep alive/user list
my $node = DXCluster->get_exact($field[1]);
if ($node) {
+ return unless $node->isa('DXNode');
return unless $node->dxchan == $self;
$node->update_users($field[2]);
}
delete $pings{$call};
# now broadcast to all other ak1a nodes that I have gone
- broadcast_ak1a(pc21($call, 'Gone.'), $self);
+ broadcast_ak1a(pc21($call, 'Gone.'), $self) unless $self->{isolate};
Log('DXProt', $call . " Disconnected");
$ref->del() if $ref;
sub get_hops
{
- my ($pcno) = @_;
+ my $pcno = shift;
my $hops = $DXProt::hopcount{$pcno};
$hops = $DXProt::def_hopcount if !$hops;
return "H$hops";