X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=8c605642754cb2076013fbc4883e9119c708f389;hb=2099a0deed84ac53057e4dc4beca262764f862e9;hp=f00a436adea5184da5c1e5f9ac79fd4e62ebd5bb;hpb=cce337f777f0b7668cceebb40527fd1e106729c9;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index f00a436a..8c605642 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -239,7 +239,7 @@ sub new # add this node to the table, the values get filled in later my $pkg = shift; my $call = shift; - $main::routeroot->add($call, '5000', Route::here(1)) if $call ne $main::mycall; + $main::routeroot->add($call, '5000', 1) if $call ne $main::mycall; return $self; } @@ -811,7 +811,7 @@ sub handle_16 } $r = Route::User::get($call); - my $flags = Route::here($here)|Route::conf($conf); + my $flags = $here; if ($r) { my $au = $r->addparent($parent); @@ -970,7 +970,7 @@ sub handle_19 if ($origin ne $self->call) { my $op = Route::Node::get($origin); unless ($op) { - $op = $parent->add($origin, 5000, Route::here(1)); + $op = $parent->add($origin, 5000, 1); my $user = DXUser->get_current($origin); if (!$user) { $user = DXUser->new($origin); @@ -1044,7 +1044,7 @@ sub handle_19 } my $r = Route::Node::get($call); - my $flags = Route::here($here)|Route::conf($conf); + my $flags = $here; # is he under the control of the new protocol? if ($r && $r->np) { @@ -1062,11 +1062,6 @@ sub handle_19 next; } } - if ($r->version ne $ver || $r->flags != $flags) { - $r->version($ver); - $r->flags($flags); - push @rout, $r unless $ar; - } } else { # if he is directly connected or allowed then add him, otherwise store him up for later @@ -1545,70 +1540,15 @@ sub handle_51 my $pcno = shift; my $line = shift; my $origin = shift; - my $to = $_[1]; - my $from = $_[2]; - my $flag = $_[3]; - - - # is it for us? - if ($to eq $main::mycall) { - if ($flag == 1) { - $self->send(pc51($from, $to, '0')); - } else { - # it's a reply, look in the ping list for this one - my $ref = $pings{$from}; - if ($ref) { - my $tochan = DXChannel::get($from); - 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', $from, $s, $ave)) - } elsif ($dxchan->is_node) { - if ($tochan) { - my $nopings = $tochan->user->nopings || $obscount; - push @{$tochan->{pingtime}}, $t; - shift @{$tochan->{pingtime}} if @{$tochan->{pingtime}} > 6; - - # cope with a missed ping, this means you must set the pingint large enough - if ($t > $tochan->{pingint} && $t < 2 * $tochan->{pingint} ) { - $t -= $tochan->{pingint}; - } - - # calc smoothed RTT a la TCP - if (@{$tochan->{pingtime}} == 1) { - $tochan->{pingave} = $t; - } else { - $tochan->{pingave} = $tochan->{pingave} + (($t - $tochan->{pingave}) / 6); - } - $tochan->{nopings} = $nopings; # pump up the timer - if (my $ivp = Investigate::get($from, $origin)) { - $ivp->handle_ping; - } - } elsif (my $rref = Route::Node::get($r->{call})) { - if (my $ivp = Investigate::get($from, $origin)) { - $ivp->handle_ping; - } - } - } - } - } - } - } else { - RouteDB::update($from, $origin); - - if (eph_dup($line)) { - dbg("PCPROT: dup PC51 detected") if isdbg('chanerr'); - return; - } - # route down an appropriate thingy - $self->route($to, $line); + if (eph_dup($line, 60)) { + dbg("PCPROT: dup PC51 detected") if isdbg('chanerr'); + return; } + + my $thing = Thingy::Ping->new(origin=>$main::mycall); + $thing->from_DXProt($self, $line, @_); + $thing->broadcast($self); } # dunno but route it @@ -2164,22 +2104,9 @@ sub load_hops sub addping { my ($from, $to, $via) = @_; - my $ref = $pings{$to} || []; - my $r = {}; - $r->{call} = $from; - $r->{t} = [ gettimeofday ]; - if ($via && (my $dxchan = DXChannel::get($via))) { - $dxchan->send(pc51($to, $main::mycall, 1)); - } else { - route(undef, $to, pc51($to, $main::mycall, 1)); - } - push @$ref, $r; - $pings{$to} = $ref; - my $u = DXUser->get_current($to); - if ($u) { - $u->lastping(($via || $from), $main::systime); - $u->put; - } + my $thing = Thingy::Ping->new_ping($from eq $main::mycall ? () : (user=>$from), $via ? (touser=> $to, group => $via) : (group => $to)); + $thing->remember; + $thing->broadcast; } sub process_rcmd @@ -2333,7 +2260,7 @@ sub disconnect } # remove outstanding pings - delete $pings{$call}; + Thingy::Ping::forget($call); # I was the last node visited $self->user->node($main::mycall);