X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=41f1debe7bc3a9f1f90bc06218f140c037d98790;hb=2c50f9b4b2b3f29b000d77623a9d7c3748933aef;hp=a863b08a96701e02c288b2892704f8c82a0cda16;hpb=da2c51a552ec4aba7af7696fa631324337286949;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index a863b08a..41f1debe 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -46,6 +46,8 @@ use vars qw($pc11_max_age $pc23_max_age $last_pc50 $eph_restime $eph_info_restim $eph_pc15_restime $pc92_update_period $pc92_obs_timeout %pc92_find $pc92_find_timeout $pc92_short_update_period $next_pc92_obs_timeout $pc92_slug_changes $last_pc92_slug + $pc92_extnode_update_period $pc50_interval + $pc92_keepalive_period ); $pc11_max_age = 1*3600; # the maximum age for an incoming 'real-time' pc11 @@ -72,14 +74,13 @@ $obscount = 2; $chatdupeage = 20 * 60; $chatimportfn = "$main::root/chat_import"; $investigation_int = 12*60*60; # time between checks to see if we can see this node -$pc19_version = 5466; # the visible version no for outgoing PC19s generated from pc59 -$pc92_update_period = 60*60; # the period between outgoing PC92 C updates -$pc92_short_update_period = 15*60; # shorten the update period after a connection +$pc19_version = 5454; # the visible version no for outgoing PC19s generated from pc59 +$pc92_update_period = 24*60*60; # the period between outgoing PC92 C updates +$pc92_short_update_period = 15*60; # shorten the update period after a connection or start up +$pc92_extnode_update_period = 2*60*60; # the update period for external nodes +$pc92_keepalive_period = 60*60; # frequency of PC92 K (keepalive) records %pc92_find = (); # outstanding pc92 find operations $pc92_find_timeout = 30; # maximum time to wait for a reply -#$pc92_obs_timeout = $pc92_update_period; # the time between obscount countdowns -$pc92_obs_timeout = 60*60; # the time between obscount for incoming countdowns -$next_pc92_obs_timeout = $main::systime + 60*60; # the time between obscount countdowns @checklist = @@ -164,7 +165,10 @@ $next_pc92_obs_timeout = $main::systime + 60*60; # the time between obscount cou undef, undef, undef, - [ qw(i c n) ], # pc90 + undef, # pc90 + undef, + [ qw(i c f l)], # pc92 + [ qw(i c f *m c *c m)], # pc93 ); # use the entry in the check list to check the field list presented @@ -181,7 +185,8 @@ sub check for ($i = 1; $i < @$ref; $i++) { my ($blank, $act) = $$ref[$i] =~ /^(b?)(\w)$/; return 0 unless $act; - next if $blank && $_[$i] =~ /^[ \*]$/; + next if $blank eq 'b' && $_[$i] =~ /^[ \*]$/; + next if $blank eq '*' && $_[$i] =~ /^\*$/; if ($act eq 'c') { return $i unless is_callsign($_[$i]); } elsif ($act eq 'i') { @@ -200,6 +205,8 @@ sub check return $i unless $_[$i] =~ /^\s*\d+-\w\w\w-[12][90]\d\d$/; } elsif ($act eq 't') { return $i unless $_[$i] =~ /^[012]\d[012345]\dZ$/; + } elsif ($act eq 'l') { + return $i unless $_[$i] =~ /^[A-Z]$/; } } return 0; @@ -208,11 +215,19 @@ sub check sub update_pc92_next { my $self = shift; - my $period = shift || $pc92_update_period; + my $period = shift || ($self->{do_pc9x} ? $pc92_update_period : $pc92_extnode_update_period); $self->{next_pc92_update} = $main::systime + $period - int rand($period / 4); dbg("ROUTE: update_pc92_next: $self->{call} " . atime($self->{next_pc92_update})) if isdbg('obscount'); } +sub update_pc92_keepalive +{ + my $self = shift; + my $period = shift || $pc92_keepalive_period; + $self->{next_pc92_keepalive} = $main::systime + $period - int rand($period / 4); + dbg("ROUTE: update_pc92_keepalive: $self->{call} " . atime($self->{next_pc92_keepalive})) if isdbg('obscount'); +} + sub init { do "$main::data/hop_table.pl" if -e "$main::data/hop_table.pl"; @@ -233,7 +248,7 @@ sub init $main::me->{version} = $main::version; $main::me->{build} = "$main::subversion.$main::build"; $main::me->{do_pc9x} = 1; - $main::me->update_pc92_next($pc92_update_period); + $main::me->update_pc92_next($pc92_short_update_period); } # @@ -342,8 +357,12 @@ sub start my $script = new Script(lc $call) || new Script('node_default'); $script->run($self) if $script; - # set next_pc92_update time for this node sooner - $self->update_pc92_next($self->{outbound} ? $pc92_short_update_period : $pc92_update_period); + # set up a config broadcast "quite soon" to converge tables quicker + $main::me->update_pc92_next($pc92_short_update_period); + $self->update_pc92_next($pc92_short_update_period); + + # set next keepalive time + $self->update_pc92_keepalive; } # @@ -424,12 +443,6 @@ sub process my $dxchan; my $pc50s; - # send out a pc50 on EVERY channel all at once - if ($t >= $last_pc50 + $DXProt::pc50_interval) { - $pc50s = pc50($main::me, scalar DXChannel::get_all_users); - eph_dup($pc50s); - $last_pc50 = $t; - } foreach $dxchan (@dxchan) { next unless $dxchan->is_node; @@ -460,26 +473,57 @@ sub process if ($t - $last10 >= 10) { # clean out ephemera + eph_clean(); import_chat(); - if ($main::systime >= $next_pc92_obs_timeout) { + $last10 = $t; + + # send out a pc50 on EVERY channel all at once + if ($t >= $last_pc50 + $pc50_interval) { + $pc50s = pc50($main::me, scalar DXChannel::get_all_users); + eph_dup($pc50s); + $last_pc50 = $t; time_out_pc92_routes(); - $next_pc92_obs_timeout = $main::systime + $pc92_obs_timeout; } - $last10 = $t; - # send out config broadcasts foreach $dxchan (@dxchan) { next unless $dxchan->is_node; # send out a PC92 config record if required for me and - # all my non pc9x dependent nodes. + # all my non pc9x dependent nodes. But for dependent nodes we only do + # this if we have not seen any from anyone else for at least half + # of one update period. This should stop quite a bit of excess C + # records. Someone will win, it does not really matter who, because + # we always believe "us". if ($main::systime >= $dxchan->{next_pc92_update}) { - dbg("ROUTE: pc92 broadcast candidate: $dxchan->{call}") if isdbg('obscount'); if ($dxchan == $main::me || !$dxchan->{do_pc9x}) { - $dxchan->broadcast_pc92_update($dxchan->{call}); + dbg("ROUTE: pc92 broadcast candidate: $dxchan->{call}") if isdbg('obscount'); + my $ref = Route::Node::get($dxchan->{call}); + if ($dxchan == $main::me || ($ref && ($ref->measure_pc9x_t($main::systime-$main::systime_daystart)) >= $pc92_extnode_update_period/2)) { + $dxchan->broadcast_pc92_update($dxchan->{call}); + } else { + $dxchan->update_pc92_next; + } + } else { + $dxchan->update_pc92_next; # this won't actually do anything, it's just to be tidy + } + } + + # do the keepalives in the same way, but use a different timer + if ($main::systime >= $dxchan->{next_pc92_keepalive}) { + if ($dxchan == $main::me || !$dxchan->{do_pc9x}) { + dbg("ROUTE: pc92 keepalive candidate: $dxchan->{call}") if isdbg('obscount'); + my $ref = Route::Node::get($dxchan->{call}); +# if ($dxchan == $main::me || ($ref && ($ref->measure_pc9x_t($main::systime-$main::systime_daystart)) >= $pc92_keepalive_period/2)) { +# $dxchan->broadcast_pc92_update($dxchan->{call}); +# } else { +# $dxchan->update_pc92_next($pc92_extnode_update_period); +# } +# } else { +# $dxchan->update_pc92_next; # this won't actually do anything, it's just to be tidy + $dxchan->update_pc92_keepalive; } } } @@ -919,8 +963,9 @@ sub broadcast_pc92_update return; } my $l = $nref->last_PC92C(gen_my_pc92_config($nref)); + $nref->lastid(last_pc9x_id()); $main::me->broadcast_route_pc9x($main::mycall, undef, $l, 0); - $self->update_pc92_next($pc92_update_period); + $self->update_pc92_next; } sub time_out_pc92_routes @@ -1446,11 +1491,13 @@ sub route_pc41 broadcast_route($self, $origin, \&pc41, $line, 1, @_); } +# this is probably obsolete now sub route_pc50 { my $self = shift; my $origin = shift; my $line = shift; + broadcast_route($self, $origin, \&pc50, $line, 1, @_); }