started port of routing stuff
[spider.git] / perl / Thingy / Rt.pm
1 #
2 # Route Thingy handling
3 #
4 # $Id$
5 #
6 # Copyright (c) 2005 Dirk Koopman G1TLH
7 #
8
9 use strict;
10
11 package Thingy::Rt;
12
13 use vars qw($VERSION $BRANCH);
14 $VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
15 $BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /^\d+\.\d+(?:\.(\d+)\.(\d+))?$/  || (0,0));
16 $main::build += $VERSION;
17 $main::branch += $BRANCH;
18
19 use DXChannel;
20 use DXDebug;
21 use DXUtil;
22 use Thingy;
23 use Spot;
24
25 use vars qw(@ISA);
26 @ISA = qw(Thingy);
27
28 sub gen_Aranea
29 {
30         my $thing = shift;
31         unless ($thing->{Aranea}) {
32                 my @items;
33                 $thing->{Aranea} = Aranea::genmsg($thing, 'Rt', @items);
34         }
35         return $thing->{Aranea};
36 }
37
38 sub from_Aranea
39 {
40         my $thing = shift;
41         return unless $thing;
42         return $thing;
43 }
44
45 sub gen_DXProt
46 {
47         my $thing = shift;
48         my $dxchan = shift;
49         return $thing->{DXProt};
50 }
51
52 #sub gen_DXCommandmode
53 #{
54 #       my $thing = shift;
55 #       my $dxchan = shift;
56 #       my $buf;
57 #
58 #       return $buf;
59 #}
60
61 sub from_DXProt
62 {
63         my $thing = shift;
64         while (@_) {
65                 my $k = shift;
66                 $thing->{$k} = shift;
67         }
68         ($thing->{hops}) = $thing->{DXProt} =~ /\^H(\d+)\^?~?$/ if exists $thing->{DXProt};
69         return $thing;
70 }
71
72 sub handle
73 {
74         my $thing = shift;
75         my $dxchan = shift;
76
77         $thing->broadcast($dxchan);
78 }
79
80 sub in_filter
81 {
82         my $thing = shift;
83         my $dxchan = shift;
84         
85         # global route filtering on INPUT
86         if ($dxchan->{inroutefilter}) {
87                 my $ref = Route::Node::get($thing->{origin});
88                 my ($filter, $hops) = $dxchan->{inroutefilter}->it($ref);
89                 unless ($filter) {
90                         dbg("PCPROT: Rejected by input route filter") if isdbg('chanerr');
91                         return;
92                 }
93         }
94         return 1;
95 }
96
97 sub out_filter
98 {
99         my $thing = shift;
100         my $dxchan = shift;
101         
102         # global route filtering on OUTPUT
103         if ($dxchan->{routefilter}) {
104                 my $ref = Route::Node::get($thing->{origin});
105                 my ($filter, $hops) = $dxchan->{routefilter}->it($ref);
106                 unless ($filter) {
107                         dbg("PCPROT: Rejected by output route filter") if isdbg('chanerr');
108                         return;
109                 }
110                 $thing->{hops} = $hops if $hops;
111         } elsif ($dxchan->{isolate}) {
112                 return;
113         }
114         return 1;
115 }
116 1;