replace missing $key in pc11 INPUT dbg line
[spider.git] / perl / DXProtHandle.pm
index f3c0f6aefd22a0fab07278a15442bea512eb12e2..256f296774653c9246857a3de043af4f70cb98b9 100644 (file)
@@ -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);
+               }
        }
 }