- if (($pcno >= 28 && $pcno <= 33) || $pcno == 40 || $pcno == 42 || $pcno == 49) { # mail/file handling
- if ($pcno == 49 || $field[1] eq $main::mycall) {
- DXMsg::process($self, $line);
- } else {
- $self->route($field[1], $line) unless $self->is_clx;
- }
- return;
- }
-
- if ($pcno == 34 || $pcno == 36) { # remote commands (incoming)
- $self->process_rcmd($field[1], $field[2], $field[2], $field[3]);
- return;
- }
-
- if ($pcno == 35) { # remote command replies
- $self->process_rcmd_reply($field[1], $field[2], $field[1], $field[3]);
- return;
- }
-
- # for pc 37 see 44 onwards
-
- if ($pcno == 38) { # node connected list from neighbour
- return;
- }
-
- if ($pcno == 39) { # incoming disconnect
- if ($field[1] eq $self->{call}) {
- $self->disconnect(1);
- } else {
- dbg("PCPROT: came in on wrong channel") if isdbg('chanerr');
- }
- return;
- }
-
- if ($pcno == 41) { # user info
- my $call = $field[1];
-
- # input filter if required
- my $ref = Route::get($call) || Route->new($call);
- return unless $self->in_filter_route($ref);
-
- # add this station to the user database, if required
- my $user = DXUser->get_current($call);
- $user = DXUser->new($call) if !$user;
-
- if ($field[2] == 1) {
- $user->name($field[3]);
- } elsif ($field[2] == 2) {
- $user->qth($field[3]);
- } elsif ($field[2] == 3) {
- my ($lat, $long) = DXBearing::stoll($field[3]);
- $user->lat($lat);
- $user->long($long);
- $user->qra(DXBearing::lltoqra($lat, $long)) unless $user->qra && DXBearing::is_qra($user->qra);
- } elsif ($field[2] == 4) {
- $user->homenode($field[3]);
- }
- $user->lastoper($main::systime); # to cut down on excessive for/opers being generated
- $user->put;
-
-# perhaps this IS what we want after all
-# $self->route_pc41($ref, $call, $field[2], $field[3], $field[4]);
-# return;
- }
-
- if ($pcno == 43) {
- last SWITCH;
- }
-
- if ($pcno == 37 || $pcno == 44 || $pcno == 45 || $pcno == 46 || $pcno == 47 || $pcno == 48) {
- DXDb::process($self, $line);
- return;
- }
-
- if ($pcno == 50) { # keep alive/user list
- my $call = $field[1];
- my $node = Route::Node::get($call);
- if ($node) {
- return unless $node->call eq $self->{call};
- $node->usercount($field[2]);
-
- # input filter if required
- return unless $self->in_filter_route($node);
-
- $self->route_pc50($node, $field[2], $field[3]) unless eph_dup($line);
- }
- return;
- }
-
- if ($pcno == 51) { # incoming ping requests/answers
- my $to = $field[1];
- my $from = $field[2];
- my $flag = $field[3];
-
- # is it for us?
- if ($to eq $main::mycall) {
- if ($flag == 1) {
- $self->send(pc51($from, $to, '0'));
- } else {
- # it's a reply, look in the ping list for this one
- my $ref = $pings{$from};
- if ($ref) {
- my $tochan = DXChannel->get($from);
- while (@$ref) {
- my $r = shift @$ref;
- my $dxchan = DXChannel->get($r->{call});
- next unless $dxchan;
- my $t = tv_interval($r->{t}, [ gettimeofday ]);
- if ($dxchan->is_user) {
- my $s = sprintf "%.2f", $t;
- my $ave = sprintf "%.2f", $tochan ? ($tochan->{pingave} || $t) : $t;
- $dxchan->send($dxchan->msg('pingi', $from, $s, $ave))
- } elsif ($dxchan->is_node) {
- if ($tochan) {
- $tochan->{nopings} = $tochan->user->nopings || 2; # pump up the timer
- push @{$tochan->{pingtime}}, $t;
- shift @{$tochan->{pingtime}} if @{$tochan->{pingtime}} > 6;
- my $st;
- for (@{$tochan->{pingtime}}) {
- $st += $_;
- }
- $tochan->{pingave} = $st / @{$tochan->{pingtime}};
- }
- }
- }
+ 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;