X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=eafb591dac4d64a5d3da6db501a150b116130794;hb=e72ce56ce6973656acb064366459d54cda85f8cc;hp=eec6b67b2d731730b7df2d52f42c5ee530208d23;hpb=8e15f9531d1629f5a2f51ab59fe3ce90e49f2d09;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index eec6b67b..eafb591d 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -40,12 +40,14 @@ use strict; use vars qw($pc11_max_age $pc23_max_age $last_pc50 $eph_restime $eph_info_restime $eph_pc34_restime $last_hour $last10 %eph %pings %rcmds $ann_to_talk $pingint $obscount %pc19list $chatdupeage $chatimportfn - $investigation_int $pc19_version $myprot_version + $pc19_version $myprot_version %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 $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 @@ -71,15 +73,13 @@ $pingint = 5*60; $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 = 5454; # 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 +$pc92_update_period = 4*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 = 1*60*60; # the update period for external nodes +$pc92_keepalive_period = 1*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 = @@ -214,11 +214,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"; @@ -239,7 +247,8 @@ 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); + $main::me->update_pc92_keepalive; } # @@ -348,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; } # @@ -407,6 +420,12 @@ sub normal } } + if (defined &Local::pcprot) { + my $r; + eval { $r = Local::pcprot($self, $pcno, $line, @field); }; + return if $r; # i.e don't process it + } + # send it out for processing my $origin = $self->{call}; no strict 'subs'; @@ -430,38 +449,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; - next if $dxchan->handle_xml; - next if $dxchan == $main::me; - - # send the pc50 - $dxchan->send($pc50s) if $pc50s; - - # send a ping out on this channel - if ($dxchan->{pingint} && $t >= $dxchan->{pingint} + $dxchan->{lastping}) { - if ($dxchan->{nopings} <= 0) { - $dxchan->disconnect; - } else { - DXXml::Ping::add($main::me, $dxchan->call); - $dxchan->{nopings} -= 1; - $dxchan->{lastping} = $t; - $dxchan->{lastping} += $dxchan->{pingint} / 2 unless @{$dxchan->{pingtime}}; - } - } - - } - - Investigate::process(); - clean_pc92_find(); - # every ten seconds if ($t - $last10 >= 10) { # clean out ephemera @@ -469,12 +456,38 @@ sub process eph_clean(); import_chat(); - if ($main::systime >= $next_pc92_obs_timeout) { - time_out_pc92_routes(); - $next_pc92_obs_timeout = $main::systime + $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; } - $last10 = $t; + foreach $dxchan (@dxchan) { + next unless $dxchan->is_node; + next if $dxchan == $main::me; + + # send the pc50 + $dxchan->send($pc50s) if !$dxchan->{do_pc9x} && $pc50s; + + # send a ping out on this channel + if ($dxchan->{pingint} && $t >= $dxchan->{pingint} + $dxchan->{lastping}) { + if ($dxchan->{nopings} <= 0) { + dbg("ROUTE: $dxchan->{call} disconnected on ping obscount") if isdbg('obscount'); + $dxchan->disconnect; + } else { + DXXml::Ping::add($main::me, $dxchan->call); + $dxchan->{nopings} -= 1; + $dxchan->{lastping} = $t; + $dxchan->{lastping} += $dxchan->{pingint} / 2 unless @{$dxchan->{pingtime}}; + dbg("ROUTE: $dxchan->{call} ping obscount = $dxchan->{nopings}") if isdbg('obscount'); + } + } + } + + clean_pc92_find(); # send out config broadcasts foreach $dxchan (@dxchan) { @@ -487,18 +500,26 @@ sub process # 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}) { + 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_update_period/2)) { + 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($pc92_update_period - rand($pc92_update_period/4)); + $dxchan->update_pc92_next; } + } else { + $dxchan->update_pc92_next; # this won't actually do anything, it's just to be tidy } } } + # do the keepalive for me, if required + if ($main::systime >= $main::me->{next_pc92_keepalive}) { + time_out_pc92_routes(); + $main::me->broadcast_pc92_keepalive($main::mycall); + } + if ($pc92_slug_changes && $main::systime >= $last_pc92_slug + $pc92_slug_changes) { my ($add, $del) = gen_pc92_changes(); $main::me->route_pc92d($main::mycall, undef, $main::routeroot, @$del) if @$del; @@ -533,6 +554,7 @@ sub send_dx_spot foreach $dxchan (@dxchan) { next if $dxchan == $main::me; next if $dxchan == $self && $self->is_node; + next if $line =~ /PC61/ && !$dxchan->is_spider && !$dxchan->is_user; $dxchan->dx_spot($line, $self->{isolate}, @_, $self->{call}); } } @@ -841,8 +863,10 @@ sub send_local_config } elsif ($self->{do_pc9x}) { dbg("send_local_config: doing pc9x"); my $node = Route::Node::get($self->{call}); - $self->send_last_pc92_config($main::routeroot); - $self->send(pc92a($main::routeroot, $node)) unless $main::routeroot->last_PC92C =~ /$self->{call}/; +# $self->send_last_pc92_config($main::routeroot); +# $self->send(pc92a($main::routeroot, $node)) unless $main::routeroot->last_PC92C =~ /$self->{call}/; + $self->send(pc92a($main::routeroot, $node)); + $self->send(pc92k($main::routeroot)); } else { # create a list of all the nodes that are not connected to this connection # and are not themselves isolated, this to make sure that isolated nodes @@ -936,7 +960,25 @@ sub broadcast_pc92_update 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 broadcast_pc92_keepalive +{ + my $self = shift; + my $call = shift; + + dbg("ROUTE: broadcast_pc92_keepalive $call") if isdbg('obscount'); + + my $nref = Route::Node::get($call); + unless ($nref) { + dbg("ERROR: broadcast_pc92_keepalive - Route::Node $call disappeared"); + return; + } + my $l = pc92k($nref); + $nref->lastid(last_pc9x_id()); + $main::me->broadcast_route_pc9x($main::mycall, undef, $l, 0); + $self->update_pc92_keepalive; } sub time_out_pc92_routes @@ -1174,12 +1216,12 @@ sub addrcmd sub disconnect { my $self = shift; - my $pc39flag = shift; + my $pc39flag = shift || 0; my $call = $self->call; return if $self->{disconnecting}++; - unless ($pc39flag && $pc39flag == 1) { + unless ($pc39flag == 1) { $self->send_now("D", DXProt::pc39($main::mycall, $self->msg('disc1', "System Op"))); } @@ -1240,7 +1282,7 @@ sub disconnect } # broadcast to all other nodes that all the nodes connected to via me are gone - unless ($pc39flag && $pc39flag == 2) { + unless ($pc39flag == 2) { $self->route_pc21($main::mycall, undef, @rout) if @rout; $self->route_pc92d($main::mycall, undef, $main::routeroot, $node) if $node; } @@ -1462,11 +1504,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, @_); }