return ($sort, $call, $line);
}
-sub rspfcheck
-{
- my ($self, $flag, $node, $user) = @_;
- my $nref = Route::Node::get($node);
- my $dxchan = $nref->dxchan if $nref;
- if ($nref && $dxchan) {
- if ($dxchan == $self) {
- return 1 unless $user;
- return 1 if $user eq $node;
- my @users = $nref->users;
- return 1 if @users == 0 || grep $user eq $_, @users;
- dbg("RSPF: $user not on $node") if isdbg('chanerr');
- } else {
- dbg("RSPF: Shortest path for $node is " . $nref->dxchan->{call}) if isdbg('chanerr');
- }
- } else {
- return 1 if $flag;
- dbg("RSPF: required $node not found" ) if isdbg('chanerr');
- }
- return 0;
-}
-
# broadcast a message to all clusters taking into account isolation
# [except those mentioned after buffer]
sub broadcast_nodes
$last_hour $last10 %eph %pings %rcmds $ann_to_talk
$pingint $obscount %pc19list $chatdupeage $chatimportfn
$investigation_int $pc19_version $myprot_version
- %nodehops $baddx $badspotter $badnode $censorpc $rspfcheck
+ %nodehops $baddx $badspotter $badnode $censorpc
$allowzero $decode_dk0wcy $send_opernam @checklist
$eph_pc15_restime $pc92_update_period $pc92_obs_timeout
%pc92_find $pc92_find_timeout $pc92_short_update_period
$badnode = new DXHash "badnode";
$last10 = $last_pc50 = time;
$ann_to_talk = 1;
-$rspfcheck = 1;
-$eph_restime = 180;
+$eph_restime = 60;
$eph_info_restime = 60*60;
$eph_pc15_restime = 6*60;
$eph_pc34_restime = 30;
$last_hour $last10 %eph %pings %rcmds $ann_to_talk
$pingint $obscount %pc19list $chatdupeage $chatimportfn
$investigation_int $pc19_version $myprot_version
- %nodehops $baddx $badspotter $badnode $censorpc $rspfcheck
+ %nodehops $baddx $badspotter $badnode $censorpc
$allowzero $decode_dk0wcy $send_opernam @checklist
$eph_pc15_restime $pc9x_past_age $pc9x_future_age
+ $pc10_dupe_age
);
$pc9x_past_age = 62*60; # maximum age in the past of a px9x (a config record might be the only
# thing a node might send - once an hour)
$pc9x_future_age = 5*60; # maximum age in the future ditto
+$pc10_dupe_age = 45; # just something to catch duplicate PC10->PC93 conversions
+
# incoming talk commands
sub handle_10
my $line = shift;
my $origin = shift;
- # rsfp check
- return if $rspfcheck and !$self->rspfcheck(0, $_[6], $_[1]);
+ # this is to catch loops caused by bad software ...
+ if (eph_dup($line, $pc10_dupe_age)) {
+ return;
+ }
# will we allow it at all?
if ($censorpc) {
}
}
- # rsfp check
- # return if $rspfcheck and !$self->rspfcheck(1, $_[7], $_[6]);
-
# is the spotted callsign blank? This should really be trapped earlier but it
# could break other protocol sentences. Also check for lower case characters.
if ($_[2] =~ /^\s*$/) {
my $line = shift;
my $origin = shift;
- # return if $rspfcheck and !$self->rspfcheck(1, $_[5], $_[1]);
-
# announce duplicate checking
$_[3] =~ s/^\s+//; # remove leading blanks
my $origin = shift;
if (eph_dup($line, $eph_pc15_restime)) {
- dbg("PCPROT: Ephemeral dup, dropped") if isdbg('chanerr');
+ return;
} else {
unless ($self->{isolate}) {
DXChannel::broadcast_nodes($line, $self) if $line =~ /\^H\d+\^?~?$/; # send it to everyone but me
}
if (eph_dup($line)) {
- dbg("PCPROT: dup PC16 detected") if isdbg('chanerr');
return;
}
$self->tell_buddies('logoutb', $ucall, $ncall);
if (eph_dup($line)) {
- dbg("PCPROT: dup PC17 detected") if isdbg('chanerr');
return;
}
}
if (eph_dup($line)) {
- dbg("PCPROT: dup PC21 detected") if isdbg('chanerr');
return;
}
}
}
- # only do a rspf check on PC23 (not 27)
- if ($pcno == 23) {
- return if $rspfcheck and !$self->rspfcheck(1, $_[8], $_[7])
- }
# do some de-duping
my $d = cltounix($_[1], sprintf("%02d18Z", $_[2]));
return unless $nref || $uref; # if we don't know where they are, it's pointless sending it on
if (eph_dup($line)) {
- dbg("PCPROT: Dup PC24 ignored\n") if isdbg('chanerr');
return;
}
my $line = shift;
my $origin = shift;
if (eph_dup($line, $eph_pc34_restime)) {
- dbg("PCPROT: dupe PC34, ignored") if isdbg('chanerr');
+ return;
} else {
$self->process_rcmd($_[1], $_[2], $_[2], $_[3]);
}
my $l = "PC41^$call^$sort";
if (eph_dup($l, $eph_info_restime)) {
- dbg("PCPROT: dup PC41, ignored") if isdbg('chanerr');
return;
}
my $origin = shift;
if (eph_dup($line)) {
- dbg("PCPROT: Dup PC49 ignored\n") if isdbg('chanerr');
return;
}
RouteDB::update($from, $self->{call});
if (eph_dup($line)) {
- dbg("PCPROT: dup PC51 detected") if isdbg('chanerr');
return;
}
# route down an appropriate thingy
my $onode = $_[7];
$onode = $pcall if @_ <= 8;
+ # this is catch loops caused by bad software ...
+ if (eph_dup("PC93|$from|$text|$onode", $pc10_dupe_age)) {
+ return;
+ }
+
# will we allow it at all?
if ($censorpc) {
my @bad;
}
}
- # this is catch loops caused by bad software ...
- if (eph_dup("PC93|$from|$text|$onode")) {
- return;
- }
-
# if this is a 'bad spotter' user then ignore it
my $nossid = $from;
$nossid =~ s/-\d+$//;