From f4c54c5174d50224a745d5ed71ad1563a9440083 Mon Sep 17 00:00:00 2001 From: Dirk Koopman Date: Tue, 9 Oct 2007 15:27:00 +0100 Subject: [PATCH] fix new pc9x midnight rollover bug --- Changes | 2 ++ perl/DXProtHandle.pm | 30 ++++++++++++++++-------------- perl/Route/Node.pm | 1 - perl/Version.pm | 2 +- perl/test_lastid.pl | 40 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 59 insertions(+), 16 deletions(-) create mode 100755 perl/test_lastid.pl diff --git a/Changes b/Changes index 2a1f37d3..828c4284 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,5 @@ +09Oct07======================================================================= +1. Added *VERY* important change to prevent loops on PC9x sentences. 06Oct07======================================================================= 1. added the possibility of having a motd_ax25 especially for sending to radio connections after a suggestion by Paolo YV1DIG. diff --git a/perl/DXProtHandle.pm b/perl/DXProtHandle.pm index d73bbc62..7db433e5 100644 --- a/perl/DXProtHandle.pm +++ b/perl/DXProtHandle.pm @@ -49,7 +49,7 @@ use vars qw($pc11_max_age $pc23_max_age $last_pc50 $eph_restime $eph_info_restim $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 +$pc9x_future_age = 2*3600; # maximum age in the future ditto $pc10_dupe_age = 45; # just something to catch duplicate PC10->PC93 conversions $pc92_slug_changes = 60; # slug any changes going outward for this long $last_pc92_slug = 0; # the last time we sent out any delayed add or del PC92s @@ -1485,20 +1485,22 @@ sub check_pc9x_t # the id on it is completely unreliable. Besides, only commands # originating on this box will go through this code... if ($parent->call ne $main::mycall) { - my $lastid = $parent->lastid || 0; - if ($t < $lastid) { - if ($t+86400-$lastid > $pc9x_past_age) { - dbg("PCPROT: dup id on $t <= $lastid, ignored") if isdbg('chanerr'); - return; - } - } elsif ($t == $lastid) { - dbg("PCPROT: dup id on $t == $lastid, ignored") if isdbg('chanerr'); - return; - } else { - # $t > $lastid, check that the timestamp offered isn't too far away from 'now' - if ($t+$main::systime_daystart-$main::systime > $pc9x_future_age ) { - dbg("PCPROT: id $t too far in the future, ignored") if isdbg('chanerr'); + my $lastid = $parent->lastid; + if (defined $lastid) { + if ($t < $lastid) { + if ($t+86400-$lastid > $pc9x_past_age) { + dbg("PCPROT: dup id on $t <= lastid $lastid, ignored") if isdbg('chanerr'); + return; + } + } elsif ($t == $lastid) { + dbg("PCPROT: dup id on $t == lastid $lastid, ignored") if isdbg('chanerr'); return; + } else { + # $t > $lastid, check that the timestamp offered isn't too far away from 'now' + if ($t-$lastid > $pc9x_future_age ) { + dbg("PCPROT: id $t too far in the future of lastid $lastid, ignored") if isdbg('chanerr'); + return; + } } } } diff --git a/perl/Route/Node.pm b/perl/Route/Node.pm index 6e7d9315..23e29382 100644 --- a/perl/Route/Node.pm +++ b/perl/Route/Node.pm @@ -286,7 +286,6 @@ sub new $self->{flags} = shift || Route::here(1); $self->{users} = []; $self->{nodes} = []; - $self->{lastid} = 0; $self->{PC92C_dxchan} = ''; $self->reset_obs; # by definition diff --git a/perl/Version.pm b/perl/Version.pm index a0cbffae..23503da1 100644 --- a/perl/Version.pm +++ b/perl/Version.pm @@ -11,6 +11,6 @@ use vars qw($version $subversion $build); $version = '1.54'; $subversion = '0'; -$build = '164'; +$build = '165'; 1; diff --git a/perl/test_lastid.pl b/perl/test_lastid.pl new file mode 100755 index 00000000..1bd0ea3b --- /dev/null +++ b/perl/test_lastid.pl @@ -0,0 +1,40 @@ +#!/usr/bin/perl + +my $pc9x_past_age = 3600; +my $pc9x_future_age = 3600*2; +my $lastid; + +try($_) for qw(85955 85968 518 85967 519 85968 520 85969), @ARGV; + +exit 0; + +sub try +{ + my $t = shift; + + print "$t : "; + + if (defined $lastid) { + if ($t < $lastid) { + my $wt; + if (($wt = $t+86400-$lastid) > $pc9x_past_age) { + print "PCPROT: dup id on $t + 86400 - $lastid ($wt) > $pc9x_past_age, ignored\n"; + return; + } + print "wt = $wt "; + } elsif ($t == $lastid) { + print "PCPROT: dup id on $t == $lastid, ignored\n"; + return; + } elsif ($t > $lastid) { + if ($t - $lastid > $pc9x_future_age) { + print "PCPROT: dup id $t too far in future on $lastid\n"; + return; + } + } + } + + print "$lastid Ok\n"; + $lastid = $t; +} + + -- 2.34.1