X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=b8d563979b762f12e7e0ebf7db3ed37560a956aa;hb=d49641602b7abfa832d6baaf18dc15969040083e;hp=751daf04de0698fa1ff0f63cb2e7b15a6b59c5c6;hpb=c560dd09aefc252be5664ba2dd329b7bc126176d;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index 751daf04..b8d56397 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -24,6 +24,8 @@ use DXProtout; use DXDebug; use Filter; use Local; +use DXDb; +use Time::HiRes qw(gettimeofday tv_interval); use Carp; @@ -37,10 +39,10 @@ $me = undef; # the channel id for this cluster $decode_dk0wcy = undef; # if set use this callsign to decode announces from the EU WWV data beacon $pc11_max_age = 1*3600; # the maximum age for an incoming 'real-time' pc11 $pc23_max_age = 1*3600; # the maximum age for an incoming 'real-time' pc23 -$pc11_dup_age = 24*3600; # the maximum time to keep the spot dup list for -$pc23_dup_age = 24*3600; # the maximum time to keep the wwv dup list for -$pc12_dup_age = 12*3600; # the maximum time to keep the ann dup list for -$pc12_dup_lth = 72; # the length of ANN text to save for deduping +$pc11_dup_age = 3*3600; # the maximum time to keep the spot dup list for +$pc23_dup_age = 3*3600; # the maximum time to keep the wwv dup list for +$pc12_dup_age = 24*3600; # the maximum time to keep the ann dup list for +$pc12_dup_lth = 60; # the length of ANN text to save for deduping %spotdup = (); # the pc11 and 26 dup hash %wwvdup = (); # the pc23 and 27 dup hash %anndup = (); # the PC12 dup hash @@ -50,6 +52,7 @@ $last_hour = time; # last time I did an hourly periodic update %nodehops = (); # node specific hop control @baddx = (); # list of illegal spotted callsigns + $baddxfn = "$main::data/baddx.pl"; sub init @@ -123,10 +126,20 @@ sub start $self->send_now('B',"0"); $self->send_now('E',"0"); + # ping neighbour node stuff + $self->pingint($user->pingint || 3*60); + $self->nopings(3); + $self->pingtime([ ]); + # send initialisation string - if (!$self->{outbound}) { + unless ($self->{outbound}) { $self->send(pc38()) if DXNode->get_all(); $self->send(pc18()); + $self->lastping($main::systime); + } else { + # remove from outstanding connects queue + @main::outstanding_connects = grep {$_->{call} ne $call} @main::outstanding_connects; + $self->lastping($main::systime + $self->pingint / 2); } $self->state('init'); $self->pc50_t(time); @@ -515,7 +528,7 @@ sub normal dbg('chan', "Dup WWV Spot ignored\n"); return; } - if (($pcno == 23 && $d < $main::systime - $pc23_max_age) || $d > $main::systime + 900 || $field[2] < 0 || $field[2] > 23) { + if (($pcno == 23 && $d < $main::systime - $pc23_max_age) || $d > $main::systime + 1500 || $field[2] < 0 || $field[2] > 23) { dbg('chan', "WWV Date ($field[1] $field[2]) out of range"); return; } @@ -670,11 +683,7 @@ sub normal last SWITCH; } if ($pcno == 37 || $pcno == 44 || $pcno == 45 || $pcno == 46 || $pcno == 47) { - if ($field[1] eq $main::mycall) { - ; - } else { - $self->route($field[1], $line); - } + DXDb::process($self, $line); return; } @@ -699,12 +708,31 @@ sub normal # it's a reply, look in the ping list for this one my $ref = $pings{$field[2]}; if ($ref) { - my $r = shift @$ref; - my $dxchan = DXChannel->get($r->{call}); - $dxchan->send($dxchan->msg('pingi', $field[2], atime($main::systime), $main::systime - $r->{t})) if $dxchan; + my $tochan = DXChannel->get($field[2]); + while (@$ref) { + my $r = shift @$ref; + my $dxchan = DXChannel->get($r->{call}); + next unless $dxchan; + my $t = tv_interval($r->{t}, [ gettimeofday ]); + if ($dxchan->is_user) { + my $s = sprintf "%.2f", $t; + my $ave = sprintf "%.2f", $tochan ? ($tochan->pingave || $t) : $t; + $dxchan->send($dxchan->msg('pingi', $field[2], $s, $ave)) + } elsif ($dxchan->is_ak1a) { + if ($tochan) { + $tochan->nopings(3); # pump up the timer + push @{$tochan->pingtime}, $t; + shift @{$tochan->pingtime} if @{$tochan->pingtime} > 6; + my $st; + for (@{$tochan->pingtime}) { + $st += $_; + } + $tochan->{pingave} = $st / @{$tochan->pingtime}; + } + } + } } } - } else { # route down an appropriate thingy $self->route($field[1], $line); @@ -721,7 +749,7 @@ sub normal # REBROADCAST!!!! # - if (!$self->{isolate}) { + unless ($self->{isolate}) { broadcast_ak1a($line, $self); # send it to everyone but me } } @@ -744,6 +772,17 @@ sub process if ($t >= $dxchan->pc50_t + $DXProt::pc50_interval) { $dxchan->send(pc50()); $dxchan->pc50_t($t); + } + + # send a ping out on this channel + if ($t >= $dxchan->pingint + $dxchan->lastping) { + if ($dxchan->nopings <= 0) { + $dxchan->disconnect; + } else { + addping($main::mycall, $dxchan->call); + $dxchan->nopings($dxchan->nopings - 1); + $dxchan->lastping($t); + } } } @@ -776,6 +815,8 @@ sub finish my $call = $self->call; my $ref = DXCluster->get_exact($call); + $self->send_now("D", DXProt::pc39($main::mycall, $self->msg('disc1', "System Op"))); + # unbusy and stop and outgoing mail my $mref = DXMsg::get_busy($call); $mref->stop_msg($call) if $mref; @@ -1211,13 +1252,13 @@ sub unpad sub addping { my ($from, $to) = @_; - my $ref = $pings{$to}; - $ref = $pings{$to} = [] if !$ref; + my $ref = $pings{$to} || []; my $r = {}; $r->{call} = $from; - $r->{t} = $main::systime; + $r->{t} = [ gettimeofday ]; route(undef, $to, pc51($to, $main::mycall, 1)); push @$ref, $r; + $pings{$to} = $ref; } # add a rcmd request to the rcmd queues