ospfv2 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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/neighbor/neighbor.rb
CHANGED
@@ -52,15 +52,17 @@ module OSPFv2
|
|
52
52
|
include OSPFv2
|
53
53
|
attr_reader :address, :inactivity_timer, :hello, :dd_rxmt_interval
|
54
54
|
|
55
|
-
InactivityTimer = Class.new(Timer)
|
56
|
-
HelloTimer = Class.new(PeriodicTimer)
|
57
|
-
RxmtIntervalTimer = Class.new(PeriodicTimer)
|
58
|
-
RefreshTimer = Class.new(PeriodicTimer)
|
59
|
-
RouterId = Class.new(Id)
|
60
|
-
AreadId = Class.new(Id)
|
61
|
-
|
62
55
|
attr_writer :hello_int, :dead_int
|
63
56
|
|
57
|
+
unless const_defined?(:AreaId)
|
58
|
+
InactivityTimer = Class.new(Timer)
|
59
|
+
HelloTimer = Class.new(PeriodicTimer)
|
60
|
+
RxmtIntervalTimer = Class.new(PeriodicTimer)
|
61
|
+
RefreshTimer = Class.new(PeriodicTimer)
|
62
|
+
RouterId = Class.new(Id)
|
63
|
+
AreaId = Class.new(Id)
|
64
|
+
end
|
65
|
+
|
64
66
|
def initialize(arg={})
|
65
67
|
#TODO: accept prefix arg and set @address and @netmask in hello...
|
66
68
|
@address = arg[:src_addr] || '127.0.0.1'
|
@@ -195,8 +197,6 @@ module OSPFv2
|
|
195
197
|
end
|
196
198
|
end
|
197
199
|
|
198
|
-
# AllSPFRouters = "224.0.0.5"
|
199
|
-
# AllDRouters = "224.0.0.6"
|
200
200
|
def flood(lsas, dest=AllSPFRouters)
|
201
201
|
send LinkStateUpdate.new_lsas(lsas), dest
|
202
202
|
end
|
@@ -5,12 +5,12 @@
|
|
5
5
|
#
|
6
6
|
#
|
7
7
|
# This file is part of OSPFv2.
|
8
|
-
#
|
8
|
+
#
|
9
9
|
# OSPFv2 is free software: you can redistribute it and/or modify
|
10
10
|
# it under the terms of the GNU General Public License as published by
|
11
11
|
# the Free Software Foundation, either version 3 of the License, or
|
12
12
|
# (at your option) any later version.
|
13
|
-
#
|
13
|
+
#
|
14
14
|
# OSPFv2 is distributed in the hope that it will be useful,
|
15
15
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16
16
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
@@ -71,7 +71,7 @@
|
|
71
71
|
A.4.1. Detailed formats of the different types of LSAs are described
|
72
72
|
in Section A.4.
|
73
73
|
|
74
|
-
|
74
|
+
|
75
75
|
=end
|
76
76
|
|
77
77
|
require 'packet/ospf_packet'
|
@@ -79,11 +79,11 @@ require 'lsa/lsa'
|
|
79
79
|
require 'lsa/lsa_factory'
|
80
80
|
require 'packet/link_state_ack'
|
81
81
|
module OSPFv2
|
82
|
-
|
82
|
+
|
83
83
|
class LinkStateUpdate < OspfPacket
|
84
|
-
|
84
|
+
|
85
85
|
attr_reader :lsas
|
86
|
-
|
86
|
+
|
87
87
|
def initialize(_arg={})
|
88
88
|
arg = _arg.dup
|
89
89
|
@lsas=[]
|
@@ -98,11 +98,11 @@ module OSPFv2
|
|
98
98
|
raise ArgumentError, "Invalid argument", caller
|
99
99
|
end
|
100
100
|
end
|
101
|
-
|
101
|
+
|
102
102
|
def number_of_lsa
|
103
103
|
lsas.size
|
104
104
|
end
|
105
|
-
|
105
|
+
|
106
106
|
def encode
|
107
107
|
headers = []
|
108
108
|
headers << [lsas.size].pack('N')
|
@@ -123,9 +123,9 @@ module OSPFv2
|
|
123
123
|
end
|
124
124
|
end
|
125
125
|
end
|
126
|
-
|
126
|
+
|
127
127
|
def [](val)
|
128
|
-
lsas[val]
|
128
|
+
lsas[val]
|
129
129
|
end
|
130
130
|
|
131
131
|
# def to_s
|
@@ -144,11 +144,11 @@ module OSPFv2
|
|
144
144
|
s.join("\n ")
|
145
145
|
end
|
146
146
|
|
147
|
-
|
147
|
+
|
148
148
|
def each
|
149
149
|
lsas.each { |ls| yield ls }
|
150
150
|
end
|
151
|
-
|
151
|
+
|
152
152
|
def keys
|
153
153
|
lsas.collect { |ls| ls.key }
|
154
154
|
end
|
@@ -167,7 +167,7 @@ module OSPFv2
|
|
167
167
|
lsas = arg[:lsas]
|
168
168
|
arg.delete(:lsas)
|
169
169
|
lsu = new(arg)
|
170
|
-
|
170
|
+
lsas.each do |lsa|
|
171
171
|
lsa_len = lsa.encode.size
|
172
172
|
if (len + lsa_len) > (1476-56-20)
|
173
173
|
lsus << lsu
|
@@ -179,11 +179,13 @@ module OSPFv2
|
|
179
179
|
end
|
180
180
|
lsus << lsu
|
181
181
|
lsus
|
182
|
+
rescue
|
183
|
+
raise
|
182
184
|
end
|
183
185
|
end
|
184
186
|
|
185
187
|
end
|
186
|
-
|
188
|
+
|
187
189
|
end
|
188
190
|
|
189
191
|
load "../../../test/ospfv2/packet/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|
data/lib/packet/ospf_packet.rb
CHANGED
@@ -117,13 +117,15 @@ require 'ie/au_type'
|
|
117
117
|
|
118
118
|
module OSPFv2
|
119
119
|
|
120
|
-
RouterId = Class.new(Id)
|
121
|
-
AreaId = Class.new(Id)
|
122
|
-
|
123
120
|
class OspfPacket
|
124
121
|
include OSPFv2
|
125
122
|
include OSPFv2::Common
|
126
123
|
|
124
|
+
unless const_defined?(:RouterId)
|
125
|
+
RouterId = Class.new(Id)
|
126
|
+
AreaId = Class.new(Id)
|
127
|
+
end
|
128
|
+
|
127
129
|
attr_reader :area_id, :router_id, :version, :ospf_version, :packet_type, :au_type
|
128
130
|
attr_writer_delegate :area_id, :router_id, :packet_type, :au_type
|
129
131
|
|
@@ -204,7 +206,7 @@ module OSPFv2
|
|
204
206
|
|
205
207
|
def method_missing(method, *args, &block)
|
206
208
|
if method == :to_s_junos
|
207
|
-
|
209
|
+
to_s(*args)
|
208
210
|
else
|
209
211
|
super
|
210
212
|
end
|
@@ -260,11 +262,13 @@ module OSPFv2
|
|
260
262
|
include OSPFv2
|
261
263
|
include OSPFv2::Common
|
262
264
|
|
263
|
-
HELLO
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
265
|
+
unless const_defined?(:HELLO)
|
266
|
+
HELLO = 1
|
267
|
+
DATABASE_DESCRIPTION = 2
|
268
|
+
LINK_STATE_REQUEST = 3
|
269
|
+
LINK_STATE_UPDATE = 4
|
270
|
+
LINK_STATE_ACKNOWLEDGMENT = 5
|
271
|
+
end
|
268
272
|
|
269
273
|
class << self
|
270
274
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
|
2
|
+
require "test/unit"
|
3
|
+
require 'ie/au_type'
|
4
|
+
|
5
|
+
class TestIeAuType < Test::Unit::TestCase
|
6
|
+
include OSPFv2
|
7
|
+
def test_new
|
8
|
+
assert AuType.new
|
9
|
+
assert_equal 'AuType: null authentication', AuType.new(0).to_s
|
10
|
+
assert_equal 'AuType: simple password', AuType.new(1).to_s
|
11
|
+
assert_equal 'AuType: cryptographic authentication', AuType.new(2).to_s
|
12
|
+
assert_equal 'AuType: unknown', AuType.new(3).to_s
|
13
|
+
assert_equal 0, AuType.new(0).to_i
|
14
|
+
assert_equal 1, AuType.new(1).to_i
|
15
|
+
assert_equal 2, AuType.new(2).to_i
|
16
|
+
assert_equal 3, AuType.new(3).to_i
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
|
3
|
+
require "ie/external_route"
|
4
|
+
|
5
|
+
class TestIeExternalRoute < Test::Unit::TestCase
|
6
|
+
|
7
|
+
include OSPFv2
|
8
|
+
def tests
|
9
|
+
assert ExternalRoute.new
|
10
|
+
assert_equal '0000000a0000000000000000', ExternalRoute.new( :metric=> 10).to_shex
|
11
|
+
assert_equal '0000000a0000000000000000', ExternalRoute.new( :type=> :e1, :metric=> 10).to_shex
|
12
|
+
assert_equal '8000000a0000000000000000', ExternalRoute.new( :type=> :e2, :metric=> 10).to_shex
|
13
|
+
assert_equal '800000ff0101010100000000', ExternalRoute.new( :type=> :e2,
|
14
|
+
:metric=> 255,
|
15
|
+
:forwarding_address => '1.1.1.1').to_shex
|
16
|
+
assert_equal '800000ff01010101000000ff', ExternalRoute.new( :type=> :e2,
|
17
|
+
:metric=> 255,
|
18
|
+
:forwarding_address => '1.1.1.1',
|
19
|
+
:tag=> 255).to_shex
|
20
|
+
assert_equal({:metric=>255, :type=>:e2, :forwarding_address=>"1.1.1.1", :tag=>255},
|
21
|
+
h = ExternalRoute.new( :type=> :e2, :metric=> 255, :forwarding_address => '1.1.1.1', :tag=> 255).to_hash )
|
22
|
+
assert_equal h, ExternalRoute.new(h).to_hash
|
23
|
+
assert_equal h, ExternalRoute.new(ExternalRoute.new(h).encode).to_hash
|
24
|
+
|
25
|
+
ext = ExternalRoute.new(h)
|
26
|
+
assert_equal '800000ff01010101000000ff', ext.to_shex
|
27
|
+
ext2 = ExternalRoute.new(ext)
|
28
|
+
assert_equal '800000ff01010101000000ff', ext2.to_shex
|
29
|
+
|
30
|
+
ext = ExternalRoute.new(['800000ff01010101000000ff'].pack('H*'))
|
31
|
+
assert_equal 255, ext.tag
|
32
|
+
assert_equal :e2, ext.type
|
33
|
+
assert_equal '1.1.1.1', ext.forwarding_address.to_ip
|
34
|
+
assert_equal 0, ext.mt_id
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_mt
|
38
|
+
assert_raise(ArgumentError) { MtExternalRoute.new }
|
39
|
+
assert_raise(ArgumentError) { MtExternalRoute.new(:metric=> 10) }
|
40
|
+
assert_raise(ArgumentError) { MtExternalRoute.new(:id=> 0) }
|
41
|
+
assert MtExternalRoute.new(:mt_id=>1)
|
42
|
+
ext = ExternalRoute.new(['810000ff01010101000000ff'].pack('H*'))
|
43
|
+
assert_equal 255, ext.tag
|
44
|
+
assert_equal :e2, ext.type
|
45
|
+
assert_equal '1.1.1.1', ext.forwarding_address.to_ip
|
46
|
+
assert_equal 1, ext.mt_id
|
47
|
+
ext = MtExternalRoute.new(MtExternalRoute.new(:mt_id=>10, :tag=>20, :forwarding_address=>'1.1.1.1'))
|
48
|
+
assert_equal ext.to_shex, MtExternalRoute.new(ext).to_shex
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
|
2
|
+
require "test/unit"
|
3
|
+
require 'ie/id.rb'
|
4
|
+
|
5
|
+
class TestIeId < Test::Unit::TestCase
|
6
|
+
include OSPFv2
|
7
|
+
def test_new
|
8
|
+
assert Id.new
|
9
|
+
assert_equal 'Id: 0.0.0.0', Id.new.to_s
|
10
|
+
assert_equal 'Id: 0.0.0.0', Id.new.to_s
|
11
|
+
assert_equal 'Id: 1.1.1.1', Id.new('1.1.1.1').to_s
|
12
|
+
assert_equal 'Id: 1.1.1.1', Id.new(0x01010101).to_s
|
13
|
+
assert_equal 'Id: 1.1.1.1', Id.new(IPAddr.new('1.1.1.1')).to_s
|
14
|
+
assert_equal '0a000001', Id.new(0x0a000001).to_shex
|
15
|
+
assert_equal '0a000001', Id.new(Id.new(Id.new(0x0a000001))).to_shex
|
16
|
+
end
|
17
|
+
def test_new_ntoh
|
18
|
+
assert_equal 'Id: 0.0.0.0', Id.new_ntoh(Id.new.enc).to_s
|
19
|
+
assert_equal 'Id: 1.1.1.1', Id.new_ntoh(Id.new('1.1.1.1').enc).to_s
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
|
3
|
+
require "ie/interface_mtu"
|
4
|
+
|
5
|
+
class TestIeInterfaceMtu < Test::Unit::TestCase
|
6
|
+
include OSPFv2
|
7
|
+
def test_new
|
8
|
+
assert InterfaceMtu
|
9
|
+
assert_equal( '05dc', InterfaceMtu.new.to_shex)
|
10
|
+
assert_equal( 'InterfaceMtu: 1500', InterfaceMtu.new.to_s)
|
11
|
+
assert_equal( 1500, InterfaceMtu.new.to_i)
|
12
|
+
assert_equal( '05c4', InterfaceMtu.new(1476).to_shex)
|
13
|
+
assert_equal( 'InterfaceMtu: 255', InterfaceMtu.new(255).to_s)
|
14
|
+
assert_equal( 255, InterfaceMtu.new(255).to_i)
|
15
|
+
assert_raise(RuntimeError) { InterfaceMtu.new 0xffffffff }
|
16
|
+
assert_raise(RuntimeError) { InterfaceMtu.new 0xfffffff }
|
17
|
+
assert_raise(RuntimeError) { InterfaceMtu.new 0x1ffffff }
|
18
|
+
assert_raise(RuntimeError) { InterfaceMtu.new( -1) }
|
19
|
+
assert_equal( 'InterfaceMtu: 65535', InterfaceMtu.new(0xffff).to_s)
|
20
|
+
assert_equal( 'ffff', InterfaceMtu.new(0xffff).to_shex)
|
21
|
+
assert_equal( 72, InterfaceMtu.new.number_of_lsa)
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
|
3
|
+
require "ie/ls_age"
|
4
|
+
|
5
|
+
class TestIeLsAge < Test::Unit::TestCase
|
6
|
+
include OSPFv2
|
7
|
+
def test_new
|
8
|
+
assert LsAge.new
|
9
|
+
assert_equal( 0, LsAge.new.to_i)
|
10
|
+
assert_equal( 1, LsAge.new(1).to_i)
|
11
|
+
end
|
12
|
+
def test_compare
|
13
|
+
a1 = LsAge.new
|
14
|
+
a2 = LsAge.new(2)
|
15
|
+
assert( ! (a1 == a2), "should not be equal")
|
16
|
+
assert( (a1 < a2), "a1 is more recent, i.e smaller age")
|
17
|
+
end
|
18
|
+
def test_minus
|
19
|
+
a1 = LsAge.new
|
20
|
+
a2 = LsAge.new(2)
|
21
|
+
assert_equal( -2, a1 - a2)
|
22
|
+
assert_equal( 2, a2 - a1)
|
23
|
+
end
|
24
|
+
def test_maxage
|
25
|
+
a1 = LsAge.new
|
26
|
+
assert_equal( 0, a1.to_i)
|
27
|
+
assert_equal( 3600, a1.maxage)
|
28
|
+
assert( a1.maxaged?, 'should be maxaged!')
|
29
|
+
end
|
30
|
+
def test_aging
|
31
|
+
a1 = LsAge.new(20)
|
32
|
+
sleep 1.1
|
33
|
+
assert_equal( 20, a1.to_i)
|
34
|
+
assert( ! LsAge.aging?)
|
35
|
+
assert_equal( 20, a1.to_i)
|
36
|
+
LsAge.aging :on
|
37
|
+
assert LsAge.aging?
|
38
|
+
assert_equal( 20, a1.to_i)
|
39
|
+
sleep 1.1
|
40
|
+
assert( LsAge.aging?)
|
41
|
+
assert_equal( 21, a1.to_i)
|
42
|
+
LsAge.aging :off
|
43
|
+
assert( ! LsAge.aging?)
|
44
|
+
assert_equal( 20, a1.to_i)
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
|
2
|
+
require "test/unit"
|
3
|
+
require 'ie/ls_type'
|
4
|
+
|
5
|
+
|
6
|
+
class TestIeLsType < Test::Unit::TestCase
|
7
|
+
include OSPFv2
|
8
|
+
def test_new
|
9
|
+
assert LsType.new :router
|
10
|
+
assert_equal 'LsType: router', LsType.new(:router).to_s
|
11
|
+
assert_equal 'LsType: network', LsType.new(:network).to_s
|
12
|
+
assert_equal 'LsType: summary', LsType.new(:summary).to_s
|
13
|
+
assert_equal 'LsType: asbr_summary', LsType.new(:asbr_summary).to_s
|
14
|
+
assert_equal 'LsType: as_external', LsType.new(:as_external).to_s
|
15
|
+
assert_equal 'LsType: link_local', LsType.new(:link_local).to_s
|
16
|
+
assert_equal 'LsType: domain', LsType.new(:domain).to_s
|
17
|
+
assert_equal 'LsType: area', LsType.new(:area).to_s
|
18
|
+
assert_equal 1, LsType.new(:router).to_i
|
19
|
+
assert_equal 2, LsType.new(:network).to_i
|
20
|
+
assert_equal 3, LsType.new(:summary).to_i
|
21
|
+
assert_equal 4, LsType.new(:asbr_summary).to_i
|
22
|
+
assert_equal 5, LsType.new(:as_external).to_i
|
23
|
+
assert_equal 9, LsType.new(:link_local).to_i
|
24
|
+
assert_equal 10, LsType.new(:area).to_i
|
25
|
+
assert_equal 11, LsType.new(:domain).to_i
|
26
|
+
assert_equal :router, LsType.new(1).to_sym
|
27
|
+
assert_equal :summary, LsType.new(3).to_sym
|
28
|
+
assert_equal :network, LsType.new(2).to_sym
|
29
|
+
assert_equal :asbr_summary, LsType.new(4).to_sym
|
30
|
+
assert_equal :as_external, LsType.new(5).to_sym
|
31
|
+
assert_equal :link_local, LsType.new(9).to_sym
|
32
|
+
assert_equal :area, LsType.new(10).to_sym
|
33
|
+
assert_equal :domain, LsType.new(11).to_sym
|
34
|
+
assert LsType.new(:link_local).is_opaque?
|
35
|
+
assert ! LsType.new(:router).is_opaque?
|
36
|
+
assert LsType.new(:area).is_opaque?
|
37
|
+
assert_equal 'OpaqLoca', LsType.new(:link_local).to_junos
|
38
|
+
assert_equal 'Network', LsType.new(:network).to_junos
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
|
3
|
+
require "ie/metric"
|
4
|
+
|
5
|
+
class TestIeMetric < Test::Unit::TestCase
|
6
|
+
include OSPFv2
|
7
|
+
def test_new
|
8
|
+
assert Metric
|
9
|
+
assert_equal( '00000000', Metric.new.to_shex)
|
10
|
+
assert_equal( 'Metric: 0', Metric.new.to_s)
|
11
|
+
assert_equal( 0, Metric.new.to_i)
|
12
|
+
assert_equal( '000000ff', Metric.new(255).to_shex)
|
13
|
+
assert_equal( 'Metric: 255', Metric.new(255).to_s)
|
14
|
+
assert_equal( 255, Metric.new(255).to_i)
|
15
|
+
assert_raise(RuntimeError) { Metric.new 0xffffffff }
|
16
|
+
assert_raise(RuntimeError) { Metric.new 0xfffffff }
|
17
|
+
assert_raise(RuntimeError) { Metric.new 0x1ffffff }
|
18
|
+
assert_raise(RuntimeError) { Metric.new( -1) }
|
19
|
+
assert_equal( 'Metric: 16777215', Metric.new(0x0ffffff).to_s)
|
20
|
+
assert_equal( 'Topology default (ID 0) -> Metric: 16777215', Metric.new(0x0ffffff).to_s_junos)
|
21
|
+
assert_equal( '000fffff', Metric.new(0xfffff).to_shex)
|
22
|
+
assert_equal( 'ffff', Metric.new(0xfffff).to_shex('n'))
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "ie/mt_metric"
|
3
|
+
|
4
|
+
class TestIeMtMetric < Test::Unit::TestCase
|
5
|
+
include OSPFv2
|
6
|
+
def tests
|
7
|
+
assert MtMetric.new
|
8
|
+
assert_equal '00000000', MtMetric.new.to_shex
|
9
|
+
assert_equal 'Topology 0, Metric 0', MtMetric.new.to_s
|
10
|
+
assert_equal '01000001', MtMetric.new(:id => 1, :metric => 1).to_shex
|
11
|
+
assert_equal '01ffffff', MtMetric.new(:id => 1, :metric => 0xffffff).to_shex
|
12
|
+
assert_equal '01ffffff', MtMetric.new(:id => 1, :metric => 0xffffffff).to_shex
|
13
|
+
assert_equal 1, MtMetric.new(:id => 1, :metric => 0xffffffff).id
|
14
|
+
assert_equal 4294967295, MtMetric.new(:id => 1, :metric => 0xffffffff).metric
|
15
|
+
assert_equal( {:id=>1, :metric=>1}, MtMetric.new(:id => 1, :metric => 1).to_hash)
|
16
|
+
assert_equal( 'Topology 1, Metric 1', MtMetric.new(:id => 1, :metric => 1).to_s)
|
17
|
+
assert_equal( 'Topology 1, Metric 1', MtMetric.new(:id => 1, :metric => 1).to_s)
|
18
|
+
assert_equal( 'Topology 1, Metric 1', MtMetric.new([1,1]).to_s)
|
19
|
+
assert_equal 'Topology (ID 1) -> Metric: 1', MtMetric.new([1,1]).to_s_junos
|
20
|
+
assert_equal MtMetric.new([1,1]).to_shex, MtMetric.new(MtMetric.new([1,1])).to_shex
|
21
|
+
m = MtMetric.new(['01ffffff'].pack('H*'))
|
22
|
+
assert_equal '01ffffff', m.to_shex
|
23
|
+
assert_equal 1, m.id
|
24
|
+
assert_equal 1, m.id
|
25
|
+
assert_equal 0xffffff, m.metric
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
|
3
|
+
require "ie/opaque_id"
|
4
|
+
|
5
|
+
class TestIeOpaqueId < Test::Unit::TestCase
|
6
|
+
include OSPFv2
|
7
|
+
def test_new
|
8
|
+
assert OpaqueId.new
|
9
|
+
assert_equal( '000000', OpaqueId.new.to_shex)
|
10
|
+
assert_equal( 'OpaqueId: 0', OpaqueId.new.to_s)
|
11
|
+
assert_equal( 0, OpaqueId.new.to_i)
|
12
|
+
assert_equal( '0000ff', OpaqueId.new(255).to_shex)
|
13
|
+
assert_equal( 'OpaqueId: 255', OpaqueId.new(255).to_s)
|
14
|
+
assert_equal( 255, OpaqueId.new(255).to_i)
|
15
|
+
assert_raise(RuntimeError) { OpaqueId.new 0xffffffff }
|
16
|
+
assert_raise(RuntimeError) { OpaqueId.new 0xfffffff }
|
17
|
+
assert_raise(RuntimeError) { OpaqueId.new 0x1ffffff }
|
18
|
+
assert_raise(RuntimeError) { OpaqueId.new( -1) }
|
19
|
+
assert_equal( 'OpaqueId: 16777215', OpaqueId.new(0x0ffffff).to_s)
|
20
|
+
assert_equal( '0fffff', OpaqueId.new(0xfffff).to_shex)
|
21
|
+
end
|
22
|
+
end
|