X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=1ba185b183d4123f2489115c76088b71df6d3bb1;hb=6e210063f1ef4e5c36ad04ba029b59711cc1eb04;hp=6bdb85cf617d08be72d155af7911c572544b3474;hpb=741df15be42033db97000fc0d167341bc0deabb0;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index 6bdb85cf..1ba185b1 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -179,6 +179,7 @@ sub init do "$main::data/hop_table.pl" if -e "$main::data/hop_table.pl"; confess $@ if $@; $me->{sort} = 'S'; # S for spider + $me->{priv} = 9; } # @@ -242,7 +243,7 @@ sub start $self->{lastping} = $main::systime + ($self->pingint / 2); } $self->state('init'); - $self->pc50_t(time); + $self->{pc50_t} = $main::systime; # send info to all logged in thingies $self->tell_login('loginn'); @@ -370,8 +371,19 @@ sub normal return; } } + + my @spot = Spot::prepare($field[1], $field[2], $d, $field[5], $field[6], $field[7]); + # global spot filtering on INPUT + if ($self->{inspotsfilter}) { + my ($filter, $hops) = $self->{inspotsfilter}->it(@spot); + unless ($filter) { + dbg('chan', "PCPROT: Rejected by filter"); + return; + } + } - my @spot = Spot::add($field[1], $field[2], $d, $field[5], $field[6], $field[7]); + # add it + Spot::add(@spot); # # @spot at this point contains:- @@ -565,6 +577,8 @@ sub normal # queue up any messages (look for privates only) DXMsg::queue_msg(1) if $self->state eq 'normal'; +# broadcast_route($line, $self, $field[1]); +# return; last SWITCH; } @@ -613,6 +627,8 @@ sub normal dbg('chan', "PCPROT: $field[1] not known" ); return; } +# broadcast_route($line, $self, $field[2]); +# return; last SWITCH; } @@ -731,6 +747,8 @@ sub normal dbg('chan', "PCPROT: I WILL _NOT_ be disconnected!"); return; } +# broadcast_route($line, $self, $call); +# return; last SWITCH; } @@ -1113,9 +1131,10 @@ sub process next if $dxchan == $me; # send a pc50 out on this channel - if ($t >= $dxchan->pc50_t + $DXProt::pc50_interval) { + $dxchan->{pc50_t} = $main::systime unless exists $dxchan->{pc50_t}; + if ($t >= $dxchan->{pc50_t} + $DXProt::pc50_interval) { $dxchan->send(pc50(scalar DXChannel::get_all_users)); - $dxchan->pc50_t($t); + $dxchan->{pc50_t} = $t; } # send a ping out on this channel @@ -1148,6 +1167,39 @@ sub process # # some active measures # +sub send_route +{ + my $self = shift; + my $line = shift; + my @dxchan = DXChannel::get_all_nodes(); + my $dxchan; + + # send it if it isn't the except list and isn't isolated and still has a hop count + # taking into account filtering and so on + foreach $dxchan (@dxchan) { + my $routeit; + my ($filter, $hops); + + if ($dxchan->{routefilter}) { + ($filter, $hops) = $dxchan->{routefilter}->it($self->{call}, @_); + next unless $filter; + } + next if $dxchan == $self; + if ($hops) { + $routeit = $line; + $routeit =~ s/\^H\d+\^\~$/\^H$hops\^\~/; + } else { + $routeit = adjust_hops($dxchan, $line); # adjust its hop count by node name + next unless $routeit; + } + if ($filter) { + $dxchan->send($routeit) if $routeit; + } else { + $dxchan->send($routeit) unless $dxchan->{isolate} || $self->{isolate}; + } + } +} + sub send_dx_spot { my $self = shift; @@ -1649,10 +1701,10 @@ sub addrcmd sub disconnect { my $self = shift; - my $nopc39 = shift; + my $pc39flag = shift; my $call = $self->call; - unless ($nopc39) { + unless ($pc39flag && $pc39flag == 1) { $self->send_now("D", DXProt::pc39($main::mycall, $self->msg('disc1', "System Op"))); } @@ -1660,20 +1712,32 @@ sub disconnect my $mref = DXMsg::get_busy($call); $mref->stop_msg($call) if $mref; - # broadcast to all other nodes that all the nodes connected to via me are gone - foreach my $node (grep { $_->dxchan == $self } DXNode::get_all) { -# next if $node->call eq $call; + # create a list of all the nodes that have gone and delete them from the table + my @nodes; + foreach my $node (grep { $_->dxchancall eq $call } DXNode::get_all) { + next if $node->call eq $call; next if $node->call eq $main::mycall; - broadcast_ak1a(pc21($node->call, 'Gone.'), $self) unless $self->{isolate}; + push @nodes, $node->call; $node->del; } + # broadcast to all other nodes that all the nodes connected to via me are gone + unless ($pc39flag && $pc39flag == 2) { + unless ($self->{isolate}) { + push @nodes, $call; + for (@nodes) { + broadcast_ak1a(pc21($_, 'Gone.'), $self); + } + } + } + + # remove this node from the tables + my $node = DXCluster->get_exact($call); + $node->del if $node; + # remove outstanding pings delete $pings{$call}; - # now broadcast to all other ak1a nodes that I have gone - broadcast_ak1a(pc21($call, 'Gone.'), $self) unless $self->{isolate}; - # I was the last node visited $self->user->node($main::mycall);