ospfv2 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/COPYING +674 -0
- data/LICENSE.txt +53 -0
- data/README +50 -0
- data/bin/ospfv2 +112 -105
- data/changelog.txt +7 -0
- data/gemspec +17 -0
- data/lib/ie/external_route.rb +9 -0
- data/lib/ie/id.rb +3 -4
- data/lib/ie/ie.rb +12 -0
- data/lib/ie/ls_age.rb +35 -5
- data/lib/ie/ls_type.rb +40 -37
- data/lib/ie/opaque_id.rb +46 -0
- data/lib/ie/opaque_type.rb +96 -0
- data/lib/ie/options.rb +5 -3
- data/lib/ie/router_link.rb +30 -7
- data/lib/ie/router_link_type.rb +116 -27
- data/lib/ie/sequence_number.rb +7 -3
- data/lib/infra/ospf_common.rb +1 -12
- data/lib/infra/ospf_io.rb +14 -8
- data/lib/infra/ospf_socket.rb +14 -14
- data/lib/infra/parse_options.rb +69 -25
- data/lib/ls_db/advertised_routers.rb +1 -1
- data/lib/ls_db/link_state_database.rb +74 -39
- data/lib/ls_db/link_state_database_build.rb +3 -3
- data/lib/ls_db/link_state_database_links.rb +7 -2
- data/lib/ls_db/lsdb_ios.rb +59 -0
- data/lib/lsa/external.rb +35 -2
- data/lib/lsa/lsa.rb +128 -35
- data/lib/lsa/lsa_factory.rb +20 -7
- data/lib/lsa/network.rb +44 -9
- data/lib/lsa/router.rb +14 -2
- data/lib/lsa/summary.rb +16 -3
- data/lib/lsa/tlv/color.rb +47 -0
- data/lib/lsa/tlv/link.rb +122 -0
- data/lib/lsa/tlv/link_id.rb +55 -0
- data/lib/lsa/tlv/link_type.rb +44 -0
- data/lib/lsa/tlv/local_interface.rb +56 -0
- data/lib/lsa/tlv/maximum_bandwidth.rb +55 -0
- data/lib/lsa/tlv/maximum_reservable_bandwidth.rb +52 -0
- data/lib/lsa/tlv/remote_interface.rb +58 -0
- data/lib/lsa/tlv/router_address.rb +57 -0
- data/lib/lsa/tlv/tlv.rb +32 -0
- data/lib/lsa/tlv/tlv_factory.rb +72 -0
- data/lib/lsa/tlv/traffic_engineering_metric.rb +52 -0
- data/lib/lsa/tlv/unreserved_bandwidth.rb +55 -0
- data/lib/lsa/traffic_engineering.rb +95 -0
- data/lib/neighbor/neighbor.rb +9 -9
- data/lib/packet/link_state_update.rb +16 -14
- data/lib/packet/ospf_packet.rb +13 -9
- data/test/unit/ie/au_type_test.rb +18 -0
- data/test/unit/ie/external_route_test.rb +51 -0
- data/test/unit/ie/id_test.rb +22 -0
- data/test/unit/ie/interface_mtu_test.rb +23 -0
- data/test/unit/ie/ls_age_test.rb +46 -0
- data/test/unit/ie/ls_type_test.rb +41 -0
- data/test/unit/ie/metric_test.rb +24 -0
- data/test/unit/ie/mt_metric_test.rb +27 -0
- data/test/unit/ie/opaque_id_test.rb +22 -0
- data/test/unit/ie/opaque_type_test.rb +22 -0
- data/test/unit/ie/options_test.rb +142 -0
- data/test/unit/ie/ospf_version_test.rb +0 -0
- data/test/unit/ie/packet_type_test.rb +33 -0
- data/test/unit/ie/router_link_factory_test.rb +26 -0
- data/test/unit/ie/router_link_test.rb +276 -0
- data/test/unit/ie/router_link_type_test.rb +24 -0
- data/test/unit/ie/sequence_number_test.rb +31 -0
- data/test/unit/ie/tos_metric_test.rb +27 -0
- data/test/unit/infra/ospf_common_test.rb +42 -0
- data/test/unit/infra/parse_options_test.rb +58 -0
- data/test/unit/infra/timer_test.rb +94 -0
- data/test/unit/ls_db/all +10 -0
- data/test/unit/ls_db/link_state_database_build_test.rb +140 -0
- data/test/unit/ls_db/link_state_database_links_tests.rb +74 -0
- data/test/unit/ls_db/link_state_database_test.rb +444 -0
- data/test/unit/ls_db/links_test.rb +49 -0
- data/test/unit/lsa/all +10 -0
- data/test/unit/lsa/external_test.rb +218 -0
- data/test/unit/lsa/lsa_factory_test.rb +314 -0
- data/test/unit/lsa/lsa_test.rb +191 -0
- data/test/unit/lsa/network_test.rb +107 -0
- data/test/unit/lsa/router_test.rb +614 -0
- data/test/unit/lsa/summary_test.rb +135 -0
- data/test/unit/lsa/tlv/color_test.rb +39 -0
- data/test/unit/lsa/tlv/link_id_test.rb +14 -0
- data/test/unit/lsa/tlv/link_test.rb +413 -0
- data/test/unit/lsa/tlv/link_type_test.rb +16 -0
- data/test/unit/lsa/tlv/local_interface_test.rb +15 -0
- data/test/unit/lsa/tlv/maximum_bandwidth_test.rb +14 -0
- data/test/unit/lsa/tlv/maximum_reservable_bandwidth_test.rb +13 -0
- data/test/unit/lsa/tlv/remote_interface_test.rb +14 -0
- data/test/unit/lsa/tlv/router_address_test.rb +16 -0
- data/test/unit/lsa/tlv/tlv_factory_test.rb +89 -0
- data/test/unit/lsa/tlv/traffic_engineering_metric_test.rb +15 -0
- data/test/unit/lsa/traffic_engineering_test.rb +65 -0
- data/test/unit/neighbor/neighbor_test.rb +82 -0
- data/test/unit/packet/all +10 -0
- data/test/unit/packet/database_description_test.rb +114 -0
- data/test/unit/packet/hello_test.rb +107 -0
- data/test/unit/packet/link_state_ack_test.rb +64 -0
- data/test/unit/packet/link_state_request_test.rb +168 -0
- data/test/unit/packet/link_state_update_test.rb +62 -0
- data/test/unit/packet/ospf_packet_test.rb +91 -0
- metadata +106 -51
- data/lib/infra/to_s.rb +0 -38
- data/lib/lsa/lsa_base.rb +0 -430
- data/lib/lsa/opaque.rb +0 -143
data/lib/ie/ls_type.rb
CHANGED
|
@@ -20,8 +20,10 @@
|
|
|
20
20
|
# along with OSPFv2. If not, see <http://www.gnu.org/licenses/>.
|
|
21
21
|
#++
|
|
22
22
|
|
|
23
|
+
require_relative 'ie'
|
|
23
24
|
module OSPFv2
|
|
24
25
|
class LsType
|
|
26
|
+
include IE
|
|
25
27
|
|
|
26
28
|
@ls_type_junos = {
|
|
27
29
|
1 => 'Router' ,
|
|
@@ -34,6 +36,17 @@ class LsType
|
|
|
34
36
|
11=> 'OpaqAS' ,
|
|
35
37
|
}
|
|
36
38
|
|
|
39
|
+
@ls_type_ios = {
|
|
40
|
+
1 => 'Router Links',
|
|
41
|
+
2 => 'Network Links',
|
|
42
|
+
3 => 'Summary Links(Network)',
|
|
43
|
+
4 => 'Summary Links(AS Boundary Router)',
|
|
44
|
+
5 => 'AS External Link',
|
|
45
|
+
9 => 'OpaqLoca',
|
|
46
|
+
10=> 'Opaque Area Link',
|
|
47
|
+
11=> 'OpaqAS' ,
|
|
48
|
+
}
|
|
49
|
+
|
|
37
50
|
@ls_type_short = {
|
|
38
51
|
1=>'router' ,
|
|
39
52
|
2=>'network' ,
|
|
@@ -46,16 +59,17 @@ class LsType
|
|
|
46
59
|
11=>'opaqAs' ,
|
|
47
60
|
}
|
|
48
61
|
|
|
62
|
+
# FIXME: rename all opaque :opaque_area , :opaque_link_local, :opaque_domain
|
|
49
63
|
@ls_type_sym = {
|
|
50
|
-
1 => :
|
|
51
|
-
2 => :
|
|
52
|
-
3 => :
|
|
53
|
-
4 => :
|
|
54
|
-
5 => :
|
|
55
|
-
7 => :
|
|
56
|
-
9 => :
|
|
57
|
-
10 => :
|
|
58
|
-
11 => :
|
|
64
|
+
1 => :router ,
|
|
65
|
+
2 => :network ,
|
|
66
|
+
3 => :summary ,
|
|
67
|
+
4 => :asbr_summary,
|
|
68
|
+
5 => :as_external ,
|
|
69
|
+
7 => :as_external7,
|
|
70
|
+
9 => :link_local ,
|
|
71
|
+
10 => :area ,
|
|
72
|
+
11 => :domain ,
|
|
59
73
|
}
|
|
60
74
|
|
|
61
75
|
@ls_type_sym_to_i = @ls_type_sym.invert
|
|
@@ -66,23 +80,12 @@ class LsType
|
|
|
66
80
|
|
|
67
81
|
class << self
|
|
68
82
|
def all
|
|
69
|
-
[:router, :network, :summary, :asbr_summary, :as_external]
|
|
83
|
+
[:router, :network, :summary, :asbr_summary, :as_external, :area]
|
|
70
84
|
end
|
|
71
85
|
|
|
72
86
|
def to_i(arg)
|
|
73
87
|
return arg unless arg.is_a?(Symbol)
|
|
74
|
-
|
|
75
|
-
when /^router(_lsa|)$/ ; @ls_type=1
|
|
76
|
-
when /^network(_lsa|)$/ ; @ls_type=2
|
|
77
|
-
when /^summary(_lsa|)$/ ; @ls_type=3
|
|
78
|
-
when /^asbr_summary(_lsa|)$/ ; @ls_type=4
|
|
79
|
-
when /^as_external(_lsa|)$/ ; @ls_type=5
|
|
80
|
-
#FIXME: finish and unit-test
|
|
81
|
-
# when :as_external7_lsa ; @ls_type=7
|
|
82
|
-
# when :opaque_link ; @ls_type=9
|
|
83
|
-
# when :opaque_area ; @ls_type=10
|
|
84
|
-
# when :opaque_as ; @ls_type=11
|
|
85
|
-
end
|
|
88
|
+
ls_type_sym_to_i(arg)
|
|
86
89
|
end
|
|
87
90
|
|
|
88
91
|
def to_sym(arg)
|
|
@@ -99,7 +102,7 @@ class LsType
|
|
|
99
102
|
if @ls_type_sym_to_i.has_key?(arg)
|
|
100
103
|
@ls_type_sym_to_i[arg]
|
|
101
104
|
else
|
|
102
|
-
raise
|
|
105
|
+
raise "cannot convert #{arg.inspect} to i"
|
|
103
106
|
end
|
|
104
107
|
end
|
|
105
108
|
|
|
@@ -112,6 +115,15 @@ class LsType
|
|
|
112
115
|
end
|
|
113
116
|
end
|
|
114
117
|
|
|
118
|
+
def to_s_ios(arg)
|
|
119
|
+
return arg unless arg.is_a?(Fixnum)
|
|
120
|
+
if @ls_type_ios.has_key?(arg)
|
|
121
|
+
@ls_type_ios[arg]
|
|
122
|
+
else
|
|
123
|
+
raise
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
115
127
|
def to_short(arg)
|
|
116
128
|
return arg unless arg.is_a?(Fixnum)
|
|
117
129
|
if @ls_type_short.has_key?(arg)
|
|
@@ -121,7 +133,7 @@ class LsType
|
|
|
121
133
|
end
|
|
122
134
|
end
|
|
123
135
|
end
|
|
124
|
-
|
|
136
|
+
|
|
125
137
|
def initialize(ls_type=1)
|
|
126
138
|
@ls_type = case ls_type
|
|
127
139
|
when Symbol
|
|
@@ -156,6 +168,10 @@ class LsType
|
|
|
156
168
|
LsType.to_short(to_i)
|
|
157
169
|
end
|
|
158
170
|
|
|
171
|
+
def to_s_ios
|
|
172
|
+
"LS Type: " + LsType.to_s_ios(to_i)
|
|
173
|
+
end
|
|
174
|
+
|
|
159
175
|
def to_junos
|
|
160
176
|
LsType.to_junos(to_i)
|
|
161
177
|
end
|
|
@@ -163,19 +179,6 @@ class LsType
|
|
|
163
179
|
end
|
|
164
180
|
end
|
|
165
181
|
|
|
166
|
-
load "../../../test/ospfv2/ie/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|
|
167
|
-
|
|
168
|
-
__END__
|
|
169
182
|
|
|
170
|
-
LSA_Header.aging=false
|
|
171
|
-
LSA_Header.lstype_to_s = Hash.new("unknown")
|
|
172
|
-
LSA_Header.lstype_to_s.store(1,"Router")
|
|
173
|
-
LSA_Header.lstype_to_s.store(2,"Network")
|
|
174
|
-
LSA_Header.lstype_to_s.store(3,"Summary")
|
|
175
|
-
LSA_Header.lstype_to_s.store(4,"ASBR_Sum")
|
|
176
|
-
LSA_Header.lstype_to_s.store(5,"External")
|
|
177
|
-
LSA_Header.lstype_to_s.store(9,"OpaqLink")
|
|
178
|
-
LSA_Header.lstype_to_s.store(10,"OpaqArea")
|
|
179
|
-
LSA_Header.lstype_to_s.store(11,"OpaqAS")
|
|
180
183
|
|
|
181
184
|
|
data/lib/ie/opaque_id.rb
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright 2011 Jean-Michel Esnault.
|
|
3
|
+
# All rights reserved.
|
|
4
|
+
# See LICENSE.txt for permissions.
|
|
5
|
+
#
|
|
6
|
+
#
|
|
7
|
+
# This file is part of OSPFv2.
|
|
8
|
+
#
|
|
9
|
+
#++
|
|
10
|
+
|
|
11
|
+
require 'infra/ospf_common'
|
|
12
|
+
|
|
13
|
+
module OSPFv2
|
|
14
|
+
class OpaqueId
|
|
15
|
+
include Common
|
|
16
|
+
|
|
17
|
+
attr_reader :opaque_id
|
|
18
|
+
attr_checked :opaque_id do |x|
|
|
19
|
+
(0..0xffffff).include?(x)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def initialize(opaque_id=0)
|
|
23
|
+
self.opaque_id=opaque_id
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def to_i
|
|
27
|
+
opaque_id
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def to_s
|
|
31
|
+
self.class.to_s.split('::').last + ": #{to_i}"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def encode
|
|
35
|
+
[opaque_id].pack('N')[1..-1]
|
|
36
|
+
end
|
|
37
|
+
alias :enc :encode
|
|
38
|
+
|
|
39
|
+
def to_hash
|
|
40
|
+
to_i
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
load "../../../test/ospfv2/ie/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright 2011 Jean-Michel Esnault.
|
|
3
|
+
# All rights reserved.
|
|
4
|
+
# See LICENSE.txt for permissions.
|
|
5
|
+
#
|
|
6
|
+
#
|
|
7
|
+
# This file is part of OSPFv2.
|
|
8
|
+
#
|
|
9
|
+
#++
|
|
10
|
+
|
|
11
|
+
require 'ie/ie'
|
|
12
|
+
module OSPFv2
|
|
13
|
+
class OpaqueType
|
|
14
|
+
include IE
|
|
15
|
+
|
|
16
|
+
@opaque_type_sym = {
|
|
17
|
+
1 => :te_lsa,
|
|
18
|
+
2 => :sycamore_optical_topology_description,
|
|
19
|
+
3 => :grace_lsa,
|
|
20
|
+
4 => :router_information,
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@opaque_type_sym_to_i = @opaque_type_sym.invert
|
|
24
|
+
|
|
25
|
+
class << self
|
|
26
|
+
def all
|
|
27
|
+
@opaque_type_sym_to_i.key
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def to_sym(arg)
|
|
31
|
+
return arg unless arg.is_a?(Fixnum)
|
|
32
|
+
if @opaque_type_sym.has_key?(arg)
|
|
33
|
+
@opaque_type_sym[arg]
|
|
34
|
+
else
|
|
35
|
+
raise
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def to_i(arg)
|
|
40
|
+
return arg if arg.is_a?(Fixnum)
|
|
41
|
+
if @opaque_type_sym_to_i.has_key?(arg)
|
|
42
|
+
@opaque_type_sym_to_i[arg]
|
|
43
|
+
else
|
|
44
|
+
raise
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def initialize(opaque_type=1)
|
|
51
|
+
@opaque_type = case opaque_type
|
|
52
|
+
when Symbol
|
|
53
|
+
OpaqueType.to_i(opaque_type)
|
|
54
|
+
when Fixnum
|
|
55
|
+
opaque_type
|
|
56
|
+
else
|
|
57
|
+
raise ArgumentError, "Invalid OpaqueType #{opaque_type}"
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
def to_i
|
|
61
|
+
@opaque_type
|
|
62
|
+
end
|
|
63
|
+
def to_s
|
|
64
|
+
self.class.to_s.split('::').last + ": #{to_sym}"
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def to_sym
|
|
68
|
+
OpaqueType.to_sym @opaque_type
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def encode
|
|
72
|
+
[@opaque_type].pack('C')
|
|
73
|
+
end
|
|
74
|
+
alias :enc :encode
|
|
75
|
+
|
|
76
|
+
def to_hash
|
|
77
|
+
to_sym
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
load "../../../test/ospfv2/ie/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|
|
84
|
+
|
|
85
|
+
__END__
|
|
86
|
+
|
|
87
|
+
Registry:
|
|
88
|
+
Value Opaque Type Reference
|
|
89
|
+
------- ------------------------------------------ ---------
|
|
90
|
+
1 Traffic Engineering LSA [RFC3630]
|
|
91
|
+
2 Sycamore Optical Topology Descriptions [Moy]
|
|
92
|
+
3 grace-LSA [RFC3623]
|
|
93
|
+
4 Router Information (RI) [RFC4970]
|
|
94
|
+
5-127 Unassigned
|
|
95
|
+
128-255 Private Use
|
|
96
|
+
|
data/lib/ie/options.rb
CHANGED
|
@@ -109,11 +109,13 @@ A.2 The Options field
|
|
|
109
109
|
|
|
110
110
|
=end
|
|
111
111
|
|
|
112
|
-
|
|
112
|
+
require_relative '../infra/ospf_common'
|
|
113
|
+
require_relative 'ie'
|
|
113
114
|
module OSPFv2
|
|
114
115
|
|
|
115
116
|
|
|
116
117
|
class Options
|
|
118
|
+
include IE
|
|
117
119
|
|
|
118
120
|
attr_accessor :options
|
|
119
121
|
|
|
@@ -149,6 +151,8 @@ module OSPFv2
|
|
|
149
151
|
end
|
|
150
152
|
end
|
|
151
153
|
end
|
|
154
|
+
|
|
155
|
+
|
|
152
156
|
unless arg[:DC].nil? and arg[:dc].nil?
|
|
153
157
|
_flag = arg[:DC] ||= arg[:dc]
|
|
154
158
|
if _flag.is_a?(TrueClass)
|
|
@@ -373,5 +377,3 @@ module OSPFv2
|
|
|
373
377
|
end
|
|
374
378
|
|
|
375
379
|
end
|
|
376
|
-
|
|
377
|
-
load "../../../test/ospfv2/ie/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|
data/lib/ie/router_link.rb
CHANGED
|
@@ -82,19 +82,40 @@ module OSPFv2
|
|
|
82
82
|
rlink.join
|
|
83
83
|
end
|
|
84
84
|
|
|
85
|
-
def to_s(ident=
|
|
85
|
+
def to_s(ident=4)
|
|
86
86
|
encode unless @router_link_type
|
|
87
87
|
self.class.to_s.split('::').last + ":" +
|
|
88
88
|
['',link_id, link_data, router_link_type, metric, *mt_metrics].compact.collect { |x| x.to_s }.join("\n"+" "*ident)
|
|
89
89
|
end
|
|
90
90
|
|
|
91
|
-
def
|
|
92
|
-
|
|
93
|
-
s +="\n Topology count: #{@mt_id.size}, Default metric: #{@metric}"
|
|
94
|
-
s += @mt_id.collect { |mt| "\n #{mt.to_s_junos_style}" }.join
|
|
95
|
-
s
|
|
91
|
+
def link_id_to_s(link_type)
|
|
92
|
+
RouterLinkType.link_id_to_s(link_type)
|
|
96
93
|
end
|
|
97
|
-
|
|
94
|
+
|
|
95
|
+
def link_data_to_s(link_type)
|
|
96
|
+
RouterLinkType.link_data_to_s(link_type)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Link connected to: another Router (point-to-point)
|
|
100
|
+
# (Link ID) Neighboring Router ID: 1.1.1.1
|
|
101
|
+
# (Link Data) Router Interface address: 192.168.158.1
|
|
102
|
+
# Number of TOS metrics: 0
|
|
103
|
+
# TOS 0 Metrics: 1
|
|
104
|
+
def to_s_ios
|
|
105
|
+
s = []
|
|
106
|
+
s << ''
|
|
107
|
+
s << "Link connected to: #{router_link_type.to_s_ios}"
|
|
108
|
+
s << " (Link ID) #{link_id_to_s(router_link_type.to_i)}: #{link_id.to_ip}"
|
|
109
|
+
s << " (Link Data) #{link_data_to_s(router_link_type.to_i)}: #{link_data.to_ip}"
|
|
110
|
+
s << " Number of TOS metrics: #{@mt_metrics.size}"
|
|
111
|
+
s << " TOS 0 Metrics: #{metric.to_i}"
|
|
112
|
+
s << @mt_metrics.collect { |mt| "\n #{mt.to_s}" }.join unless @mt_metrics.empty?
|
|
113
|
+
s << ''
|
|
114
|
+
s.join("\n ")
|
|
115
|
+
end
|
|
116
|
+
alias :to_s_ios_verbose :to_s_ios
|
|
117
|
+
|
|
118
|
+
|
|
98
119
|
def to_s_junos
|
|
99
120
|
s = " id #{link_id.to_ip}, data #{link_data.to_ip}, Type #{RouterLinkType.to_junos(router_link_type.to_i)} (#{router_link_type.to_i})"
|
|
100
121
|
s +="\n Topology count: #{@mt_metrics.size}, Default metric: #{metric.to_i}"
|
|
@@ -144,3 +165,5 @@ end
|
|
|
144
165
|
|
|
145
166
|
|
|
146
167
|
load "../../../test/ospfv2/ie/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|
|
168
|
+
|
|
169
|
+
|
data/lib/ie/router_link_type.rb
CHANGED
|
@@ -30,30 +30,121 @@
|
|
|
30
30
|
|
|
31
31
|
module OSPFv2
|
|
32
32
|
class RouterLinkType
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
33
|
+
|
|
34
|
+
@router_link_sym = {
|
|
35
|
+
1 => :point_to_point,
|
|
36
|
+
2 => :transit_network,
|
|
37
|
+
3 => :stub_network,
|
|
38
|
+
4 => :virtual_link,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@router_link_sym_to_i = @router_link_sym.invert
|
|
42
|
+
|
|
43
|
+
@router_link_type_junos = {
|
|
44
|
+
1 => 'Point-to-point',
|
|
45
|
+
2 => 'Transit',
|
|
46
|
+
3 => 'Stub',
|
|
47
|
+
4 => 'Virtual-link',
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@router_link_type_ios = {
|
|
51
|
+
1 => 'another Router (point-to-point)',
|
|
52
|
+
2 => 'a Transit Network',
|
|
53
|
+
3 => 'a Stub Network',
|
|
54
|
+
4 => 'a Virtual Link',
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@link_id_from_type = {
|
|
58
|
+
1 => 'Neighboring Router ID',
|
|
59
|
+
2 => 'Designated Router address',
|
|
60
|
+
3 => 'Network/subnet number',
|
|
61
|
+
4 => 'TBD',
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@link_data_from_type = {
|
|
65
|
+
1 => 'Router Interface address',
|
|
66
|
+
2 => 'Router Interface address',
|
|
67
|
+
3 => 'Network Mask',
|
|
68
|
+
4 => 'TBD',
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
class << self
|
|
72
|
+
|
|
73
|
+
def to_i(arg)
|
|
74
|
+
router_link_sym_to_i(arg)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def all
|
|
78
|
+
[:point_to_point, :transit_network, :stub_network, :virtual_link]
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def each
|
|
82
|
+
all.each { |x| yield(x) } if block_given?
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def to_sym(arg)
|
|
86
|
+
return arg unless arg.is_a?(Fixnum)
|
|
87
|
+
if @router_link_sym.has_key?(arg)
|
|
88
|
+
@router_link_sym[arg]
|
|
89
|
+
else
|
|
90
|
+
raise
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def router_link_sym_to_i(arg)
|
|
95
|
+
return arg if arg.is_a?(Fixnum)
|
|
96
|
+
if @router_link_sym_to_i.has_key?(arg)
|
|
97
|
+
@router_link_sym_to_i[arg]
|
|
98
|
+
else
|
|
99
|
+
raise
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def link_id_to_s(arg)
|
|
104
|
+
return arg unless arg.is_a?(Fixnum)
|
|
105
|
+
if @link_id_from_type.has_key?(arg)
|
|
106
|
+
@link_id_from_type[arg]
|
|
107
|
+
else
|
|
108
|
+
raise
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def link_data_to_s(arg)
|
|
113
|
+
return arg unless arg.is_a?(Fixnum)
|
|
114
|
+
if @link_data_from_type.has_key?(arg)
|
|
115
|
+
@link_data_from_type[arg]
|
|
116
|
+
else
|
|
117
|
+
raise
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def to_junos(arg)
|
|
122
|
+
return arg unless arg.is_a?(Fixnum)
|
|
123
|
+
if @router_link_type_junos.has_key?(arg)
|
|
124
|
+
@router_link_type_junos[arg]
|
|
125
|
+
else
|
|
126
|
+
arg
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def to_s_ios(arg)
|
|
131
|
+
return arg unless arg.is_a?(Fixnum)
|
|
132
|
+
if @router_link_type_ios.has_key?(arg)
|
|
133
|
+
@router_link_type_ios[arg]
|
|
134
|
+
else
|
|
135
|
+
arg
|
|
136
|
+
end
|
|
47
137
|
end
|
|
48
138
|
end
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
when
|
|
53
|
-
|
|
54
|
-
when
|
|
139
|
+
|
|
140
|
+
def initialize(arg=1)
|
|
141
|
+
@router_link_type = case arg
|
|
142
|
+
when Symbol
|
|
143
|
+
self.class.router_link_sym_to_i(arg)
|
|
144
|
+
when Fixnum
|
|
145
|
+
arg
|
|
55
146
|
else
|
|
56
|
-
raise ArgumentError, "Invalid RouterLinkType #{
|
|
147
|
+
raise ArgumentError, "Invalid RouterLinkType #{arg}"
|
|
57
148
|
end
|
|
58
149
|
end
|
|
59
150
|
def to_i
|
|
@@ -62,13 +153,11 @@ class RouterLinkType
|
|
|
62
153
|
def to_s
|
|
63
154
|
self.class.to_s.split('::').last + ": #{to_sym}"
|
|
64
155
|
end
|
|
156
|
+
def to_s_ios
|
|
157
|
+
RouterLinkType.to_s_ios to_i
|
|
158
|
+
end
|
|
65
159
|
def to_sym
|
|
66
|
-
|
|
67
|
-
when 1 ; :point_to_point
|
|
68
|
-
when 2 ; :transit_network
|
|
69
|
-
when 3 ; :stub_network
|
|
70
|
-
when 4 ; :virtual_link
|
|
71
|
-
end
|
|
160
|
+
RouterLinkType.to_sym @router_link_type
|
|
72
161
|
end
|
|
73
162
|
def encode
|
|
74
163
|
[@router_link_type].pack('C')
|