X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=d467a5d5b7866880ce5886a4449ea3d33f36d46a;hb=6b19958cbe351af8d5462f4e0e03b87875eec16a;hp=46ba890932204210fda710a84fe993d20e45ec36;hpb=5232a160e5361e9bdcb8e2202c8063b8df6bd9dc;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index 46ba8909..d467a5d5 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -24,6 +24,7 @@ use DXProtout; use DXDebug; use Filter; use Local; +use DXDb; use Carp; @@ -181,7 +182,7 @@ sub normal my $ref = DXChannel->get($call); $ref->send("$call de $field[1]: $text") if $ref && $ref->{talk}; } else { - route($field[2], $line); # relay it on its way + $self->route($field[2], $line); # relay it on its way } return; } @@ -191,13 +192,16 @@ sub normal # route 'foreign' pc26s if ($pcno == 26) { if ($field[7] ne $main::mycall) { - route($field[7], $line); + $self->route($field[7], $line); return; } } # if this is a 'nodx' node then ignore it - last SWITCH if grep $field[7] =~ /^$_/, @DXProt::nodx_node; + if (grep $field[7] =~ /^$_/, @DXProt::nodx_node) { + dbg('chan', "Bad DXNode, dropped"); + return; + } # convert the date to a unix date my $d = cltounix($field[3], $field[4]); @@ -264,7 +268,7 @@ sub normal if ($pcno == 12) { # announces # announce duplicate checking my $text = substr(uc unpad($field[3]), 0, $pc12_dup_lth); - my $dupkey = $field[1].$field[2].$text.$field[4].$field[6]; + my $dupkey = $field[1].$field[2].$text; if ($anndup{$dupkey}) { dbg('chan', "Duplicate Announce ignored\n"); return; @@ -288,11 +292,11 @@ sub normal if ($decode_dk0wcy && $field[1] eq $decode_dk0wcy) { my ($hour, $k, $next, $a, $r, $sfi, $alarm) = $field[3] =~ /^Aurora Beacon\s+(\d+)UTC,\s+Kiel\s+K=(\d+),.*ed\s+K=(\d+),\s+A=(\d+),\s+R=(\d+),\s+SFI=(\d+),.*larm:\s+(\w+)/; $alarm = ($alarm =~ /^Y/i) ? ', Aurora in DE' : ''; - my $wwv = Geomag::update($main::systime, $hour, $sfi, $a, $k, "R=$r, Next K=$next$alarm", $decode_dk0wcy, $field[5], $r); + my $wwv = Geomag::update($main::systime, $hour, $sfi, $a, $k, "R=$r, Next K=$next$alarm", $decode_dk0wcy, $field[5], $r) if $sfi && $r; } } else { - route($field[2], $line); + $self->route($field[2], $line); } return; @@ -310,20 +314,26 @@ sub normal if ($pcno == 16) { # add a user my $node = DXCluster->get_exact($field[1]); + my $dxchan; + if (!$node && ($dxchan = DXChannel->get($field[1]))) { + # add it to the node table if it isn't present and it's + # connected locally + $node = DXNode->new($dxchan, $field[1], 0, 1, 5400); + broadcast_ak1a(pc19($dxchan, $node), $dxchan, $self) unless $dxchan->{isolate}; + + } return unless $node; # ignore if havn't seen a PC19 for this one yet return unless $node->isa('DXNode'); if ($node->dxchan != $self) { dbg('chan', "LOOP: $field[1] came in on wrong channel"); return; } - my $dxchan; if (($dxchan = DXChannel->get($field[1])) && $dxchan != $self) { dbg('chan', "LOOP: $field[1] connected locally"); return; } my $i; - - + for ($i = 2; $i < $#field; $i++) { my ($call, $confmode, $here) = $field[$i] =~ /^(\S+) (\S) (\d)/o; next if !$call || length $call < 3 || length $call > 8; @@ -351,13 +361,20 @@ sub normal if ($pcno == 17) { # remove a user my $node = DXCluster->get_exact($field[2]); + my $dxchan; + if (!$node && ($dxchan = DXChannel->get($field[2]))) { + # add it to the node table if it isn't present and it's + # connected locally + $node = DXNode->new($dxchan, $field[2], 0, 1, 5400); + broadcast_ak1a(pc19($dxchan, $node), $dxchan, $self) unless $dxchan->{isolate}; + return; + } return unless $node; return unless $node->isa('DXNode'); if ($node->dxchan != $self) { dbg('chan', "LOOP: $field[2] came in on wrong channel"); return; } - my $dxchan; if (($dxchan = DXChannel->get($field[2])) && $dxchan != $self) { dbg('chan', "LOOP: $field[2] connected locally"); return; @@ -482,7 +499,7 @@ sub normal # route 'foreign' pc27s if ($pcno == 27) { if ($field[8] ne $main::mycall) { - route($field[8], $line); + $self->route($field[8], $line); return; } } @@ -499,7 +516,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; } @@ -532,7 +549,7 @@ sub normal if ($pcno == 25) { # merge request if ($field[1] ne $main::mycall) { - route($field[1], $line); + $self->route($field[1], $line); return; } if ($field[2] eq $main::mycall) { @@ -566,7 +583,7 @@ sub normal if ($pcno == 49 || $field[1] eq $main::mycall) { DXMsg::process($self, $line); } else { - route($field[1], $line); + $self->route($field[1], $line); } return; } @@ -596,7 +613,7 @@ sub normal $self->send(pc35($main::mycall, $field[2], "$main::mycall:your attempt is logged, Tut tut tut...!")); } } else { - route($field[1], $line); + $self->route($field[1], $line); } return; } @@ -610,7 +627,7 @@ sub normal delete $rcmds{$field[2]} if !$dxchan; } } else { - route($field[1], $line); + $self->route($field[1], $line); } return; } @@ -654,11 +671,7 @@ sub normal last SWITCH; } if ($pcno == 37 || $pcno == 44 || $pcno == 45 || $pcno == 46 || $pcno == 47) { - if ($field[1] eq $main::mycall) { - ; - } else { - route($field[1], $line); - } + DXDb::process($self, $line); return; } @@ -683,15 +696,17 @@ 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; + while (@$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; + } } } } else { # route down an appropriate thingy - route($field[1], $line); + $self->route($field[1], $line); } return; } @@ -705,7 +720,7 @@ sub normal # REBROADCAST!!!! # - if (!$self->{isolate}) { + unless ($self->{isolate}) { broadcast_ak1a($line, $self); # send it to everyone but me } } @@ -728,7 +743,7 @@ sub process if ($t >= $dxchan->pc50_t + $DXProt::pc50_interval) { $dxchan->send(pc50()); $dxchan->pc50_t($t); - } + } } my $key; @@ -987,9 +1002,13 @@ sub send_local_config # sub route { - my ($call, $line) = @_; + my ($self, $call, $line) = @_; my $cl = DXCluster->get_exact($call); - if ($cl) { + if ($cl) { # don't route it back down itself + if (ref $self && $call eq $self->{call}) { + dbg('chan', "Trying to route back to source, dropped"); + return; + } my $hops; my $dxchan = $cl->{dxchan}; if ($dxchan) { @@ -1196,7 +1215,7 @@ sub addping my $r = {}; $r->{call} = $from; $r->{t} = $main::systime; - route($to, pc51($to, $main::mycall, 1)); + route(undef, $to, pc51($to, $main::mycall, 1)); push @$ref, $r; } @@ -1208,7 +1227,7 @@ sub addrcmd $r->{call} = $from; $r->{t} = $main::systime; $r->{cmd} = $cmd; - route($to, pc34($main::mycall, $to, $cmd)); + route(undef, $to, pc34($main::mycall, $to, $cmd)); $rcmds{$to} = $r; } 1;