X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=59cdcf96c7272b5034007869e722e00df64ea830;hb=7ccae7dc99f806c3a0b128a0cf26cf8e489048fb;hp=d26795c406a3921c3387a2e6e08f87b4992ac6d2;hpb=61148e50735498a356ffd95b5a79faf1dc6b9d82;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index d26795c4..59cdcf96 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -349,6 +349,20 @@ sub normal $to = $field[2]; } + # if this is a 'nodx' node then ignore it + if ($badnode->in($field[6]) || ($via && $badnode->in($via))) { + dbg("PCPROT: Bad Node, dropped") if isdbg('chanerr'); + return; + } + + # if this is a 'bad spotter' user then ignore it + my $nossid = $from; + $nossid =~ s/-\d+$//; + if ($badspotter->in($nossid)) { + dbg("PCPROT: Bad Spotter, dropped") if isdbg('chanerr'); + return; + } + # if we are converting announces to talk is it a dup? if ($ann_to_talk) { if (AnnTalk::is_talk_candidate($from, $field[3]) && AnnTalk::dup($from, $to, $field[3])) { @@ -408,7 +422,9 @@ sub normal } # if this is a 'bad spotter' user then ignore it - if ($badspotter->in($field[6])) { + my $nossid = $field[6]; + $nossid =~ s/-\d+$//; + if ($badspotter->in($nossid)) { dbg("PCPROT: Bad Spotter, dropped") if isdbg('chanerr'); return; } @@ -442,6 +458,7 @@ sub normal } } + my @spot = Spot::prepare($field[1], $field[2], $d, $field[5], $field[6], $field[7]); # global spot filtering on INPUT if ($self->{inspotsfilter}) { @@ -451,7 +468,10 @@ sub normal return; } } - + + # this goes after the input filtering, but before the add + # so that if it is input filtered, it isn't added to the dup + # list. This allows it to come in from a "legitimate" source if (Spot::dup($field[1], $field[2], $d, $field[5])) { dbg("PCPROT: Duplicate Spot ignored\n") if isdbg('chanerr'); return; @@ -545,6 +565,20 @@ sub normal } } + # if this is a 'nodx' node then ignore it + if ($badnode->in($field[5])) { + dbg("PCPROT: Bad Node, dropped") if isdbg('chanerr'); + return; + } + + # if this is a 'bad spotter' user then ignore it + my $nossid = $field[1]; + $nossid =~ s/-\d+$//; + if ($badspotter->in($nossid)) { + dbg("PCPROT: Bad Spotter, dropped") if isdbg('chanerr'); + return; + } + if ($field[2] eq '*' || $field[2] eq $main::mycall) { @@ -617,7 +651,7 @@ sub normal next unless $call && $conf && defined $here && is_callsign($call); next if $call eq $main::mycall; - eph_del_regex("^PC17\^$call\^$ncall"); + eph_del_regex("^PC17\\^$call\\^$ncall"); $conf = $conf eq '*'; @@ -664,12 +698,7 @@ sub normal my $ncall = $field[2]; my $ucall = $field[1]; - if (eph_dup($line)) { - dbg("PCPROT: dup PC17 detected") if isdbg('chanerr'); - return; - } - - eph_del_regex("^PC16.*$ncall.*$ucall"); + eph_del_regex("^PC16\\^$ncall.*$ucall"); if ($ncall eq $main::mycall) { dbg("PCPROT: trying to alter config on this node from outside!") if isdbg('chanerr'); @@ -697,6 +726,12 @@ sub normal return unless $self->in_filter_route($parent); $parent->del_user($uref); + + if (eph_dup($line)) { + dbg("PCPROT: dup PC17 detected") if isdbg('chanerr'); + return; + } + $self->route_pc17($parent, $uref); return; } @@ -739,7 +774,7 @@ sub normal my $ver = $field[$i+3]; next unless defined $here && defined $conf && is_callsign($call); - eph_del_regex("^PC(?:21\^$call|17\^[^\^]+\^$call)"); + eph_del_regex("^PC(?:21\\^$call|17\\^[^\\^]+\\^$call)"); # check for sane parameters # $ver = 5000 if $ver eq '0000'; @@ -751,7 +786,7 @@ sub normal my $dxchan = DXChannel->get($call); if ($dxchan && $dxchan != $self) { dbg("PCPROT: PC19 from $self->{call} trying to alter wrong locally connected $call, ignored!") if isdbg('chanerr'); - return; + next; } # update it if required @@ -821,21 +856,15 @@ sub normal if ($pcno == 21) { # delete a cluster from the list my $call = uc $field[1]; - if (eph_dup($line)) { - dbg("PCPROT: dup PC21 detected") if isdbg('chanerr'); - return; - } - + eph_del_regex("^PC1[79].*$call"); + # if I get a PC21 from the same callsign as self then treat it # as a PC39: I have gone away if ($call eq $self->call) { $self->disconnect(1); - eph_del_regex("^PC(?:1[679]|21).*$field[1]"); return; } - eph_del_regex("^PC1[79].*$call"); - my @rout; my $parent = Route::Node::get($self->{call}); unless ($parent) { @@ -864,6 +893,11 @@ sub normal return; } +# if (eph_dup($line)) { +# dbg("PCPROT: dup PC21 detected") if isdbg('chanerr'); +# return; +# } + $self->route_pc21(@rout) if @rout; return; } @@ -989,7 +1023,7 @@ sub normal } if ($pcno == 35) { # remote command replies - eph_del_regex("^PC35\^$field[2]\^$field[1]\^"); + eph_del_regex("^PC35\\^$field[2]\\^$field[1]\\^"); $self->process_rcmd_reply($field[1], $field[2], $field[1], $field[3]); return; } @@ -1003,7 +1037,6 @@ sub normal if ($pcno == 39) { # incoming disconnect if ($field[1] eq $self->{call}) { $self->disconnect(1); - eph_del_regex("^PC(?:1[679]|21).*$field[1]"); } else { dbg("PCPROT: came in on wrong channel") if isdbg('chanerr'); } @@ -1204,6 +1237,9 @@ sub normal return; } + if ($pcno == 90) { # new style PC16,17,19,21 + return; + } } # if get here then rebroadcast the thing with its Hop count decremented (if @@ -1245,8 +1281,12 @@ sub process next unless $dxchan->is_node(); next if $dxchan == $main::me; - # send the pc50 - $dxchan->send($pc50s) if $pc50s; + # send the pc50 or PC90 + if ($pc50s && $dxchan->is_spider) { +# $dxchan->send_route(\&pc90, 1, $main::me, 'T', @dxchan); + } else { + $dxchan->send($pc50s) if $pc50s; + } # send a ping out on this channel if ($dxchan->{pingint} && $t >= $dxchan->{pingint} + $dxchan->{lastping}) { @@ -1282,6 +1322,7 @@ sub process # some active measures # + sub send_dx_spot { my $self = shift; @@ -1546,6 +1587,7 @@ sub send_local_config dbg("sent a null value") if isdbg('chanerr'); } } +# $self->send_route(\&pc90, 1, $main::me, 'T', DXChannel::get_all()); } # @@ -1762,6 +1804,10 @@ sub disconnect $self->send_now("D", DXProt::pc39($main::mycall, $self->msg('disc1', "System Op"))); } + # get rid of any PC16 and 19s + eph_del_regex("^PC16\\^$call"); + eph_del_regex("^PC19\\^.*$call"); + # do routing stuff my $node = Route::Node::get($call); my @rout; @@ -1908,6 +1954,12 @@ sub route_pc50 broadcast_route($self, \&pc50, 1, @_); } +sub route_pc90 +{ + my $self = shift; + broadcast_route($self, \&pc90, 1, @_); +} + sub in_filter_route { my $self = shift;