X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProtHandle.pm;h=256f296774653c9246857a3de043af4f70cb98b9;hb=5d1d9d0ed0577e2459108dba8c82ab3ed591da10;hp=f3c0f6aefd22a0fab07278a15442bea512eb12e2;hpb=23bb5e1bb2403e57f59d22fd8f4f0514d9a963df;p=spider.git diff --git a/perl/DXProtHandle.pm b/perl/DXProtHandle.pm index f3c0f6ae..256f2967 100644 --- a/perl/DXProtHandle.pm +++ b/perl/DXProtHandle.pm @@ -36,6 +36,9 @@ use DXCIDR; use strict; use warnings qw(all); +no warnings qw(uninitialized); + + use vars qw($pc11_max_age $pc23_max_age $last_pc50 $eph_restime $eph_info_restime $eph_pc34_restime $last_hour $last10 %eph %pings %rcmds $ann_to_talk @@ -59,7 +62,7 @@ $pc9x_time_tolerance; # thing a node might send - once an hour and we # this is actually the partition between "yesterday" and "today" but old. $senderverify = 0; # 1 - check for forged PC11 or PC61. # 2 - if forged, dump them. -$pc11_dwell_time = 1; # number of seconds to wait for a PC61 to come to substitute the PC11 +$pc11_dwell_time = 2; # number of seconds to wait for a PC61 to come to substitute the PC11 $pc92filterdef = bless ([ @@ -140,13 +143,11 @@ sub handle_10 $main::me->normal(pc93($to, $from, $via, $pc->[3], $pc->[6])); } -my $last; -my $pc11_saved; -my $pc11_saved_time; -my $pc11_rx; -my $rpc11_to_61; -my $pc11_to_61; -my $pc61_rx; +my %pc11_saved; # delayed PC11s +my $pc11_rx; # no of pc11 rxed +my $pc61_rx; # no of pc61 rxed +my $pc11_to_61; # no of 'better' pc61, that replaced stored waiting pc11 +my $rpc11_to_61; # no of pc11s 'promoted' to pc61 by IP captured in routing table # DX Spot handling sub handle_11 @@ -166,7 +167,9 @@ sub handle_11 } } - dbg("INPUT PC$pcno $line origin $origin recurse: $recurse") if isdbg("pc11") || isdbg("pc61"); + my $type = + + dbg("INPUT $self->{call} -> $line origin $origin recurse: $recurse") if isdbg("pc11") || isdbg("pc61"); # my ($hops) = $pc->[8] =~ /^H(\d+)/; @@ -261,73 +264,72 @@ sub handle_11 unless ($recurse) { if ($pcno == 61) { - ++$pc61_rx; - - if ($pc11_saved) { - if ($key eq $pc11_saved->[0]) { - ++$pc11_to_61; - my $percent = $pc11_rx ? $pc11_to_61 * 100 / $pc11_rx : 0; - dbg(sprintf("recurse: $recurse saved PC11 spot $key dumped, better pc61 received pc61: $pc61_rx pc11: $pc11_rx -> pc61: $pc11_to_61 (%0.1f%%)", $percent)) if isdbg("pc11"); - undef $pc11_saved; - } - } + if (Spot::dup_find(@spot[0..4,7])) { + dbg("DUPE $pc->[0] $self->{call} -> key: $key dumped") if isdbg('pc11'); + return; + } else { + ++$pc61_rx; + } + + if ($pc11_saved{$key}) { + ++$pc11_to_61; + my $percent = $pc11_rx ? $pc11_to_61 * 100 / $pc11_rx : 0; + dbg(sprintf("PROMOTED BETTER $self->{call} -> $pc->[0] $key, using PC61, saved PC11 DUMPED: $pc61_rx pc11: $pc11_rx better pc61: $pc11_to_61 (%0.1f%%)", $percent)) if isdbg("pc11"); + delete $pc11_saved{$key}; + } } if ($pcno == 11) { - ++$pc11_rx; - - if ($pc11_saved) { - if ($key eq $pc11_saved->[0] ) { - dbg("recurse: $recurse saved PC11 spot $key, dupe pc11 received and dumped") if isdbg("pc11"); - return; # because it's a dup - } + if (Spot::dup_find(@spot[0..4,7])) { + dbg("DUPE $pc->[0] $self->{call} -> key: $key dumped") if isdbg('pc11'); + return; + } else { + ++$pc11_rx; + } + + if ($pc11_saved{$key}) { + dbg("DUPE $pc->[0] $self->{call } key: $key is saved, ignored") if isdbg("pc11"); + return; # because it's a dup } # can we promote this to a PC61? my $r = Route::User::get($spot[4]); # find spotter if ($r && $r->ip) { # do we have an ip addres - $pcno = 61; # now turn this into a PC61 - $spot[14] = $r->ip; + $pcno = 61; + $pc->[0] = 'PC61'; + $pc->[7] = $spot[14] = $r->ip; ++$rpc11_to_61; my $percent = $pc11_rx ? $rpc11_to_61 * 100 / $pc11_rx : 0; - dbg(sprintf("recurse: $recurse PC11 spot $key promoted to pc61 ip $spot[14] pc61: $pc61_rx pc11: $pc11_rx -> pc61 $pc11_to_61 (%0.1f%%)", $percent)) if isdbg("pc11"); - undef $pc11_saved; + dbg(sprintf("PROMOTED ROUTE $self->{call} -> PC11 $key PROMOTED to PC61 with IP $spot[14] pc61: $pc61_rx pc11: $pc11_rx route->pc61 $rpc11_to_61 (%0.1f%%)", $percent)) if isdbg("pc11"); + delete $pc11_saved{$key}; } - # if it is STILL (despite all efforts to change it) a PC11 + # if it is STILL (despite all efforts to change it) a PC11 + # save it and wait - it will be called from pc11_process if ($pcno == 11) { - if ($pc11_saved && $key ne $pc11_saved->[0]) { - dbg("recurse: $recurse NEW PC11 spot $key ne $pc11_saved->[0], recursing") if isdbg("pc11"); - # shift @$pc11_saved; # saved key - my $self = $pc11_saved->[1]; - my @saved = @$pc11_saved[2..5]; - $self->handle_11(@saved, 1); - } - - $pc11_saved = [$key, $self, $pcno, $line, $origin, $pc]; - $pc11_saved_time = $main::systime; - dbg("recurse: $recurse saved new PC11 spot $key for a better offer") if isdbg("pc11"); + $pc11_saved{$key} = [$main::systime, $self, $pcno, $line, $origin, $pc]; + dbg("SAVED $self->{call} -> NEW $pc->[0] spot $key waiting for a better offer") if isdbg("pc11"); return; } - - } else { - my $count = $pc11_to_61+$rpc11_to_61; - my $percent = $pc11_rx ? $count*100 / $pc11_rx : 0; - dbg(sprintf("recurse: $recurse PC61 spot $key passed onward pc61: $pc61_rx pc11: $pc11_rx -> pc61: $count (%0.1f%%)", $percent)) if isdbg("pc11"); - $recurse = 0; - undef $pc11_saved; } } - + + my $count = $pc11_to_61+$rpc11_to_61; + my $percent = $pc11_rx ? $count*100 / $pc11_rx : 0; + my $pc11_61 = $pc61_rx ? $pc11_rx*100 / $pc61_rx : 0; + dbg(sprintf("PASSED $self->{call} -> $pc->[0] spot $key, pc11: $pc11_rx pc61: $pc61_rx PC11/PC61 ratio: %0.1f%% total pc11->pc61: $count (%0.1f%%) ", $pc11_61, $percent)) if isdbg("pc11"); + # 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(@spot[0..4,7])) { - dbg("PCPROT: Duplicate Spot $pc->[0] $key ignored\n") if isdbg('chanerr') || isdbg('dupespot'); + dbg("PCPROT: Duplicate Spot $self->{call} -> $pc->[0] $key ignored\n") if isdbg('chanerr') || isdbg('dupespot') || isdbg('pc11'); return; } + dbg("PROCESSING $self->{call} -> $pc->[0] key: $key") if isdbg('pc11'); + # we check IP addresses for PC61 - this will also dedupe PC11 copies if (@$pc > 8 && is_ipaddr($pc->[8])) { my $ip = $pc->[8]; @@ -449,15 +451,6 @@ sub handle_11 } } - # cancel any recursion as we have now processed it - if ($recurse) { - if ($pc11_saved && $key eq $pc11_saved->[0]) { - dbg("recurse: $recurse key: $key saved_key: $pc11_saved->[0] removed") if isdbg('pc11'); - undef $pc11_saved; - } - $recurse = 0; - } - # local processing if (defined &Local::spot) { my $r; @@ -473,19 +466,31 @@ sub handle_11 # send out the filtered spots send_dx_spot($self, $line, @spot) if @spot; - + # cancel any recursion as we have now processed it + if ($recurse) { + if ($pc11_saved{$key}) { + dbg("END RECURSED $self->{call} $pc->[0] key: $key removed and finished") if isdbg('pc11'); + delete $pc11_saved{$key}; + } else { + dbg("END RECURSED $self->{call} $pc->[0] key: $key finished") if isdbg('pc11'); + } + $recurse = 0; + } else { + dbg("END NORMAL $self->{call} $pc->[0] key: $key finished") if isdbg('pc11'); + } } # used to kick outstanding PC11 if required sub pc11_process { - if ($pc11_saved && $main::systime > $pc11_saved_time + $pc11_dwell_time) { - dbg("saved PC11 spot $pc11_saved->[0] timed out waiting, recursing") if isdbg("pc11"); - shift @$pc11_saved; # saved key - my $self = shift @$pc11_saved; - my @saved = @$pc11_saved; - undef $pc11_saved; - $self->handle_11(@saved, 1); + foreach my $key (keys %pc11_saved) { + my $r = $pc11_saved{$key}; + if ($main::systime > $r->[0] + $pc11_dwell_time) { + dbg("SAVED PC11 spot $key timed out waiting, recursing") if isdbg("pc11"); + my $self = $r->[1]; + delete $pc11_saved{$key}; + $self->handle_11(@$r[2..5], 1); + } } }