X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FQXProt.pm;h=d12a6a4e987988f98a87d0248588f2911e4af993;hb=refs%2Fheads%2Fnewprot;hp=f3a69128d4737fcb122638e3543478368370b5a8;hpb=75abae88c65a19102d4a633a273a71750aa97728;p=spider.git diff --git a/perl/QXProt.pm b/perl/QXProt.pm index f3a69128..d12a6a4e 100644 --- a/perl/QXProt.pm +++ b/perl/QXProt.pm @@ -29,20 +29,38 @@ use Route; use Route::Node; use Script; use DXProt; +use Verify; + +# sub modules +use QXProt::QXI; +use QXProt::QXP; +use QXProt::QXR; use strict; use vars qw($VERSION $BRANCH); $VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ ); -$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ ) || 0; +$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ || (0,0)); $main::build += $VERSION; $main::branch += $BRANCH; -use vars qw($last_node_update $node_update_interval); - -$node_update_interval = 14*60; -$last_node_update = time; - +sub init +{ + my $user = DXUser->get($main::mycall); + $DXProt::myprot_version += $main::version*100; + $main::me = QXProt->new($main::mycall, 0, $user); + $main::me->{here} = 1; + $main::me->{state} = "indifferent"; + $main::me->{sort} = 'S'; # S for spider + $main::me->{priv} = 9; + $main::me->{metric} = 0; + $main::me->{pingave} = 0; + $main::me->{registered} = 1; + $main::me->{version} = $main::version; + $main::me->{build} = $main::build; + +# $Route::Node::me->adddxchan($main::me); +} sub start { @@ -50,73 +68,114 @@ sub start $self->SUPER::start(@_); } +sub sendinit +{ + my $self = shift; + + $self->send($self->QXI::gen); +} + sub normal { if ($_[1] =~ /^PC\d\d\^/) { DXProt::normal(@_); return; } - my $pcno; - return unless ($pcno) = $_[1] =~ /^QX(\d\d)\^/; + my ($sort, $tonode, $fromnode, $msgid, $line, $incs); + return unless ($sort, $tonode, $fromnode, $msgid, $line, $incs) = $_[1] =~ /^QX([A-Z])\^(\*|[-A-Z0-9]+)\^([-A-Z0-9]+)\^([0-9A-F]{1,4})\^(.*)\^([0-9A-F]{2})$/; - my ($self, $line) = @_; - - # calc checksum - $line =~ s/\^(\d\d)$//; - my $incs = hex $1; - my $cs = unpack("%32C*", $line) % 255; - if ($incs != $cs) { - dbg("QXPROT: Checksum fail in: $incs ne calc: $cs" ) if isdbg('qxerr'); + $msgid = hex $msgid; + my $noderef = Route::Node::get($fromnode); + $noderef = Route::Node::new($fromnode) unless $noderef; + + my $il = length $incs; + my $cs = sprintf("%02X", unpack("%32C*", substr($_[1], 0, length($_[1]) - ($il+1))) & 255); + if ($incs ne $cs) { + dbg("QXPROT: Checksum fail in: $incs ne calc: $cs" ) if isdbg('chanerr'); return; } - # split the field for further processing - my ($id, $tonode, $fromnode, @field) = split /\^/, $line; - + return unless $noderef->newid($msgid); + + { + no strict 'subs'; + my $sub = "QX${sort}::handle"; + $_[0]->$sub($tonode, $fromnode, $msgid, $line) if $_[0]->can($sub); + } + return; } +my $last_node_update = 0; +my $node_update_interval = 60*15; + sub process { - if ($main::systime >= $last_node_update+$node_update_interval) { + + my $t = $main::systime; + + foreach my $dxchan (DXChannel->get_all()) { + next unless $dxchan->is_np; + next if $dxchan == $main::me; + + # send a ping out on this channel + if ($dxchan->{pingint} && $t >= $dxchan->{pingint} + $dxchan->{lastping}) { + if ($dxchan->{nopings} <= 0) { + $dxchan->disconnect; + } else { + $dxchan->addping($main::mycall, $dxchan->call); + $dxchan->{nopings} -= 1; + $dxchan->{lastping} = $t; + } + } + } + + if ($t >= $last_node_update+$node_update_interval) { # sendallnodes(); # sendallusers(); $last_node_update = $main::systime; } } +sub adjust_hops +{ + return $_[1]; +} + sub disconnect { my $self = shift; $self->DXProt::disconnect(@_); } -sub sendallnodes -{ - my $nodes = join(',', map {sprintf("%s:%d", $_->{call}, int($_->{pingave} * $_->{metric}))} DXChannel::get_all_nodes()); - my $users = DXChannel::get_all_users(); - DXChannel::broadcast_nodes(frame(2, undef, undef, hextime(), $users, 'S', $nodes)) -} +my $msgid = 1; -sub sendallusers +sub frame { - + my $self = shift; + my $sort = shift; + my $to = shift || "*"; + my $ht; + + $ht = sprintf "%X", $msgid; + my $line = join '^', "QX$sort", $to, $main::mycall, $ht, @_; + my $cs = sprintf "%02X", unpack("%32C*", $line) & 255; + $msgid = 1 if ++$msgid > 0xffff; + return "$line^$cs"; } -sub hextime +# add a ping request to the ping queues +sub addping { - my $t = shift || $main::systime; - return sprintf "%X", $t; + my ($self, $usercall, $to) = @_; + my $ref = $DXChannel::pings{$to} || []; + my $r = {}; + $r->{call} = $usercall; + $r->{t} = [ gettimeofday ]; + DXChannel::route(undef, $to, $self->QXP::gen($to, 1, $usercall, @{$r->{t}})); + push @$ref, $r; + $DXCHannel::pings{$to} = $ref; } -sub frame -{ - my $pcno = shift; - my $to = shift || ''; - my $from = shift || $main::mycall; - - my $line = join '^', sprintf("QX%02d", $pcno), $to, $from, @_; - my $cs = unpack("%32C*", $line) % 255; - return $line . sprintf("^%02X", $cs); -} + 1;