X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProtHandle.pm;h=fc05280a92afd22317cce66601e064478fcd3caf;hb=b953903f1c33ae35ce24bad344e46ab17b0b5d95;hp=903a2fd60869b6b89bc7c8a7e8dc2ebd30aa748b;hpb=1be52e58e3cb8a1746bd583b1b1e311602bb1935;p=spider.git diff --git a/perl/DXProtHandle.pm b/perl/DXProtHandle.pm index 903a2fd6..fc05280a 100644 --- a/perl/DXProtHandle.pm +++ b/perl/DXProtHandle.pm @@ -32,7 +32,6 @@ use DXHash; use Route; use Route::Node; use Script; -use Investigate; use RouteDB; @@ -44,6 +43,7 @@ use vars qw($pc11_max_age $pc23_max_age $last_pc50 $eph_restime $eph_info_restim $investigation_int $pc19_version $myprot_version %nodehops $baddx $badspotter $badnode $censorpc $rspfcheck $allowzero $decode_dk0wcy $send_opernam @checklist + $eph_pc15_restime ); # incoming talk commands @@ -375,6 +375,22 @@ sub handle_12 $self->route($_[2], $line); } } + +sub handle_15 +{ + my $self = shift; + my $pcno = shift; + my $line = shift; + my $origin = shift; + + if (eph_dup($line, $eph_pc15_restime)) { + dbg("PCPROT: Ephemeral dup, dropped") if isdbg('chanerr'); + } else { + unless ($self->{isolate}) { + DXChannel::broadcast_nodes($line, $self) if $line =~ /\^H\d+\^?~?$/; # send it to everyone but me + } + } +} # incoming user sub handle_16 @@ -715,7 +731,7 @@ sub handle_19 if (@rout) { $self->route_pc21($self->{call}, $line, @rout); $self->route_pc19($self->{call}, $line, @rout); - $self->route_pc92a($main::mycall, $line, $parent, @rout); + $self->route_pc92a($main::mycall, $line, $main::routeroot, @rout); } } @@ -787,7 +803,7 @@ sub handle_21 if (@rout) { $self->route_pc21($origin, $line, @rout); - $self->route_pc92d($main::mycall, $line, $parent, @rout); + $self->route_pc92d($main::mycall, $line, $main::routeroot, @rout); } } @@ -1315,6 +1331,45 @@ sub _del_thingy return @rout; } +my $_last_time; +my $_last_occurs; + +sub gen_pc9x_t +{ + if (!$_last_time || $_last_time != $main::systime) { + $_last_time = $main::systime; + $_last_occurs = 0; + return $_last_time - $main::systime_daystart; + } else { + $_last_occurs++; + return sprintf "$_last_time.%02d", $_last_occurs; + } +} + +sub check_pc9x_t +{ + my $call = shift; + my $t = shift; + my $pc = shift; + my $create = shift; + + my $parent = ref $call ? $call : Route::Node::get($call); + if ($parent) { + my $lastid = $parent->lastid->{$pc} || 0; + $t += 86400 if $t < $lastid - 43200; + if ($lastid >= $t) { + dbg("PCPROT: dup / old id on $call <= $lastid, ignored") if isdbg('chanerr'); + return; + } + $t -= 86400 if $t >= 86400; + } elsif ($create) { + $parent = Route::Node->new($call); + } + $parent->lastid->{$pc} = $t; + + return $parent; +} + # DXSpider routing entries sub handle_92 { @@ -1333,42 +1388,45 @@ sub handle_92 my $t = $_[2]; my $sort = $_[3]; - my @ent = grep {$_ && /^[0-7]/} @_[4 .. -1]; + my @ent = grep {$_ && /^[0-7]/} @_[4 .. $#_]; if ($pcall eq $main::mycall) { dbg("PCPROT: looped back, ignored") if isdbg('chanerr'); return; } - my $parent = Route::Node::get($pcall); - if ($parent) { - my $lastid = $parent->lastid->{92} || 0; - if ($lastid > $t) { - dbg("PCPROT: dup / old id <= $lastid, ignored") if isdbg('chanerr'); - return; - } - } else { - $parent = Route::Node->new($pcall); - } + my $parent = check_pc9x_t($pcall, $t, 92, 1); + return unless $parent; + $parent->lastid->{92} = $t; + $parent->do_pc92(1); if (@ent) { + + # look at the first one which will always be a node of some sort + # and update any information that needs to be done. my ($call, $is_node, $is_extnode, $here, $version, $build) = _decode_pc92_call($ent[0]); - if ($call && $is_node && $call eq $main::mycall) { - $parent->here(Route::here($here)); - $parent->version($version) if $version; - $parent->build($build) if $build; - } elsif ($is_extnode) { - # reparent to external node (note that we must have received a 'C' or 'A' record - # from the true parent node for this external before we get one for the this node - unless ($parent = Route::Node::get($call)) { - dbg("PCPROT: no previous C or A for this external node received, ignored") if isdbg('chanerr'); + if ($call && $is_node) { + if ($call eq $main::mycall) { + dbg("PCPROT: looped back on node entry, ignored") if isdbg('chanerr'); return; } + if ($is_extnode) { + # reparent to external node (note that we must have received a 'C' or 'A' record + # from the true parent node for this external before we get one for the this node + unless ($parent = Route::Node::get($call)) { + dbg("PCPROT: no previous C or A for this external node received, ignored") if isdbg('chanerr'); + return; + } + my $parent = check_pc9x_t($call, $t, 92) || return; + } } else { dbg("PCPROT: must be mycall or external node as first entry, ignored") if isdbg('chanerr'); return; } + $parent->here(Route::here($here)); + $parent->version($version) if $version && $version > $parent->version; + $parent->build($build) if $build && $build > $parent->build; shift @ent; } @@ -1376,14 +1434,13 @@ sub handle_92 if ($sort eq 'A') { for (@ent) { - push @radd, add_thingy($parent, $_); + push @radd, _add_thingy($parent, $_); } } elsif ($sort eq 'D') { for (@ent) { push @rdel, _del_thingy($parent, $_); } } elsif ($sort eq 'C') { - my $i; my (@nodes, @users); for (@ent) { my ($call, $is_node, $is_extnode, $here, $version, $build) = _decode_pc92_call($_); @@ -1394,7 +1451,7 @@ sub handle_92 push @users, $call; } } else { - dbg("DXPROT: pc92 call entry '$_[$i]' not decoded, ignored") if isdbg('chanerr'); + dbg("DXPROT: pc92 call entry '$_' not decoded, ignored") if isdbg('chanerr'); } } @@ -1403,8 +1460,8 @@ sub handle_92 for (@ent) { my ($call, $is_node, $is_extnode, $here, $version, $build) = _decode_pc92_call($_); if ($call) { - push @radd,_add_thingy($parent, $_[$i]) if grep $call eq $_, (@$nnodes, @$nusers); - push @rdel,_del_thingy($parent, $_[$i]) if grep $call eq $_, (@$dnodes, @$dusers); + push @radd,_add_thingy($parent, $_) if grep $call eq $_, (@$nnodes, @$nusers); + push @rdel,_del_thingy($parent, $_) if grep $call eq $_, (@$dnodes, @$dusers); } } } else { @@ -1412,12 +1469,16 @@ sub handle_92 return; } - $self->broadcast_route_pc9x($origin, undef, $line, 0); + $self->broadcast_route_pc9x($pcall, undef, $line, 0); foreach my $r (@rdel) { + next unless $r; + $self->route_pc21($pcall, undef, $r) if $r->isa('Route::Node'); $self->route_pc17($pcall, undef, $parent, $r) if $r->isa('Route::User'); } foreach my $r (@radd) { + next unless $r; + $self->route_pc19($pcall, undef, $r) if $r->isa('Route::Node'); $self->route_pc16($pcall, undef, $parent, $r) if $r->isa('Route::User'); } @@ -1446,3 +1507,5 @@ sub handle_default } } } + +1;