$to = $field[2];
}
+ # if this is a 'nodx' node then ignore it
+ if ($badnode->in($field[6]) || ($via && $badnode->in($via))) {
+ dbg("PCPROT: Bad Node, dropped") if isdbg('chanerr');
+ return;
+ }
+
+ # if this is a 'bad spotter' user then ignore it
+ my $nossid = $from;
+ $nossid =~ s/-\d+$//;
+ if ($badspotter->in($nossid)) {
+ dbg("PCPROT: Bad Spotter, dropped") if isdbg('chanerr');
+ return;
+ }
+
# if we are converting announces to talk is it a dup?
if ($ann_to_talk) {
if (AnnTalk::is_talk_candidate($from, $field[3]) && AnnTalk::dup($from, $to, $field[3])) {
}
# if this is a 'bad spotter' user then ignore it
- if ($badspotter->in($field[6])) {
+ my $nossid = $field[6];
+ $nossid =~ s/-\d+$//;
+ if ($badspotter->in($nossid)) {
dbg("PCPROT: Bad Spotter, dropped") if isdbg('chanerr');
return;
}
}
}
+ # if this is a 'nodx' node then ignore it
+ if ($badnode->in($field[5])) {
+ dbg("PCPROT: Bad Node, dropped") if isdbg('chanerr');
+ return;
+ }
+
+ # if this is a 'bad spotter' user then ignore it
+ my $nossid = $field[1];
+ $nossid =~ s/-\d+$//;
+ if ($badspotter->in($nossid)) {
+ dbg("PCPROT: Bad Spotter, dropped") if isdbg('chanerr');
+ return;
+ }
+
if ($field[2] eq '*' || $field[2] eq $main::mycall) {
my $dxchan = DXChannel->get($call);
if ($dxchan && $dxchan != $self) {
dbg("PCPROT: PC19 from $self->{call} trying to alter wrong locally connected $call, ignored!") if isdbg('chanerr');
- return;
+ next;
}
# update it if required
if ($pcno == 85) { # remote command replies
$self->process_rcmd_reply($field[1], $field[2], $field[3], $field[4]);
+ return;
+ }
+ if ($pcno == 90) { # new style PC16,17,19,21
+ my $node = $field[1];
+
+ # mark this node as wanting PC90s
+ my $parent = Route::Node::get($node);
+ if ($parent) {
+ my $t = hex $field[2];
+ my $last = $parent->lastpc90 || 0;
+ if ($last < $t) {
+ $parent->pc90(1);
+ $parent->lastpc90($t);
+ my ($updsort, $n) = unpack "AA*", $field[3];
+ for (my $i = 4; $i < $#field; $i++) {
+ my ($sort, $flag, $node, $ping) = $field[$i] =~ m{(\w)(\d)([-\w+])(,\d+)?};
+ $ping /= 10 if (defined $ping);
+ }
+ }
+ }
+
return;
}
}
next unless $dxchan->is_node();
next if $dxchan == $main::me;
- # send the pc50
- $dxchan->send($pc50s) if $pc50s;
+ # send the pc50 or PC90
+ if ($pc50s && $dxchan->user->wantpc90) {
+ $dxchan->send_route(\&pc90, 1, $main::me, 'T', @dxchan);
+ } else {
+ $dxchan->send($pc50s) if $pc50s;
+ }
# send a ping out on this channel
if ($dxchan->{pingint} && $t >= $dxchan->{pingint} + $dxchan->{lastping}) {
# some active measures
#
+
sub send_dx_spot
{
my $self = shift;
# and are not themselves isolated, this to make sure that isolated nodes
# don't appear outside of this node
my @dxchan = grep { $_->call ne $main::mycall && $_ != $self && !$_->{isolate} } DXChannel::get_all_nodes();
- @localnodes = map { my $r = Route::Node::get($_->{call}); $r ? $r : () } @dxchan if @dxchan;
+ @localnodes = map { my $r = Route::Node::get($_->{call}); $r ? $r : () } @dxchan if @dxchan && !$self->user->wantpc90;
my @intcalls = map { $_->nodes } @localnodes if @localnodes;
my $ref = Route::Node::get($self->{call});
my @rnodes = $ref->nodes;
unshift @localnodes, $main::routeroot;
}
+
send_route($self, \&pc19, scalar(@localnodes)+scalar(@remotenodes), @localnodes, @remotenodes);
# get all the users connected on the above nodes and send them out
dbg("sent a null value") if isdbg('chanerr');
}
}
+ $self->send_route(\&pc90, 1, $main::me, 'T', DXChannel::get_all()) if $self->user->wantpc90;
}
#
broadcast_route($self, \&pc50, 1, @_);
}
+sub route_pc90
+{
+ my $self = shift;
+ broadcast_route($self, \&pc90, 1, @_);
+}
+
sub in_filter_route
{
my $self = shift;