+ # send a ping out on this channel
+ if ($dxchan->{pingint} && $t >= $dxchan->{pingint} + $dxchan->{lastping}) {
+ if ($dxchan->{nopings} <= 0) {
+ dbg("ROUTE: $dxchan->{call} disconnected on ping obscount") if isdbg('obscount');
+ $dxchan->disconnect;
+ } else {
+ DXXml::Ping::add($main::me, $dxchan->call);
+ $dxchan->{nopings} -= 1;
+ $dxchan->{lastping} = $t;
+ $dxchan->{lastping} += $dxchan->{pingint} / 2 unless @{$dxchan->{pingtime}};
+ dbg("ROUTE: $dxchan->{call} ping obscount = $dxchan->{nopings}") if isdbg('obscount');
+ }
+ }
+ }
+
+ clean_pc92_find();
+
+ # send out config broadcasts
+ foreach $dxchan (@dxchan) {
+ next unless $dxchan->is_node;
+
+ # send out a PC92 config record if required for me and
+ # all my non pc9x dependent nodes. But for dependent nodes we only do
+ # this if we have not seen any from anyone else for at least half
+ # of one update period. This should stop quite a bit of excess C
+ # records. Someone will win, it does not really matter who, because
+ # we always believe "us".
+ if ($main::systime >= $dxchan->{next_pc92_update}) {
+ if ($dxchan == $main::me || !$dxchan->{do_pc9x}) {
+ dbg("ROUTE: pc92 broadcast candidate: $dxchan->{call}") if isdbg('obscount');
+ my $ref = Route::Node::get($dxchan->{call});
+ if ($dxchan == $main::me || ($ref && ($ref->measure_pc9x_t($main::systime-$main::systime_daystart)) >= $pc92_extnode_update_period/2)) {
+ $dxchan->broadcast_pc92_update($dxchan->{call});
+ } else {
+ $dxchan->update_pc92_next;
+ }
+ } else {
+ $dxchan->update_pc92_next; # this won't actually do anything, it's just to be tidy
+ }
+ }
+ }