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
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
require "test/unit"
|
3
|
+
require 'ie/router_link_type'
|
4
|
+
|
5
|
+
|
6
|
+
class TestIeRouterLinkType < Test::Unit::TestCase
|
7
|
+
include OSPFv2
|
8
|
+
def test_new
|
9
|
+
assert RouterLinkType.new :point_to_point
|
10
|
+
assert_equal 'RouterLinkType: point_to_point', RouterLinkType.new(:point_to_point).to_s
|
11
|
+
assert_equal 'RouterLinkType: transit_network', RouterLinkType.new(:transit_network).to_s
|
12
|
+
assert_equal 'RouterLinkType: stub_network', RouterLinkType.new(:stub_network).to_s
|
13
|
+
assert_equal 'RouterLinkType: virtual_link', RouterLinkType.new(:virtual_link).to_s
|
14
|
+
assert_equal 1, RouterLinkType.new(:point_to_point).to_i
|
15
|
+
assert_equal 2, RouterLinkType.new(:transit_network).to_i
|
16
|
+
assert_equal 3, RouterLinkType.new(:stub_network).to_i
|
17
|
+
assert_equal 4, RouterLinkType.new(:virtual_link).to_i
|
18
|
+
assert_equal :point_to_point, RouterLinkType.new(1).to_sym
|
19
|
+
assert_equal :stub_network, RouterLinkType.new(3).to_sym
|
20
|
+
assert_equal :transit_network, RouterLinkType.new(2).to_sym
|
21
|
+
assert_equal :virtual_link, RouterLinkType.new(4).to_sym
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
|
3
|
+
require "ie/sequence_number"
|
4
|
+
|
5
|
+
class TestIeSequenceNumber < Test::Unit::TestCase
|
6
|
+
include OSPFv2
|
7
|
+
def test1
|
8
|
+
sn = SequenceNumber.new()
|
9
|
+
sn_init = SequenceNumber.new(:init)
|
10
|
+
sn_max= SequenceNumber.new(:max)
|
11
|
+
sn_resv= SequenceNumber.new(:reserved)
|
12
|
+
assert_equal("0x80000001",sn.to_s)
|
13
|
+
assert_equal("0x80000001",sn_init.to_s)
|
14
|
+
assert_equal("0x7fffffff",sn_max.to_s)
|
15
|
+
assert_equal("0x80000000",sn_resv.to_s)
|
16
|
+
assert_equal(-1,sn_init <=> sn_max)
|
17
|
+
assert_equal(-1,sn_resv <=> sn_init)
|
18
|
+
assert_equal(1,sn_max <=> sn_init)
|
19
|
+
assert_equal(true,sn_init < sn_max)
|
20
|
+
assert_equal(true,sn_resv < sn_init)
|
21
|
+
assert_equal(true,sn_max > sn_init)
|
22
|
+
assert_equal("0x80000003",(sn_init + 2).to_s)
|
23
|
+
assert_equal("0x80000001",(sn_init - 2).to_s)
|
24
|
+
assert_equal("0x80000002",SequenceNumber.to_s(0x80000002))
|
25
|
+
assert_equal("0x00000001",SequenceNumber.to_s(1))
|
26
|
+
|
27
|
+
assert_equal('0x80000001', SequenceNumber.new(SequenceNumber.new).to_s)
|
28
|
+
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "ie/tos_metric"
|
3
|
+
|
4
|
+
class TestIeTosMetric < Test::Unit::TestCase
|
5
|
+
include OSPFv2
|
6
|
+
def tests
|
7
|
+
assert TosMetric.new
|
8
|
+
assert_equal( '00000000', TosMetric.new.to_shex)
|
9
|
+
assert_equal( 'TosMetric: tos: 0 cost: 0', TosMetric.new.to_s)
|
10
|
+
assert_equal( '01000001', TosMetric.new(:tos => 1, :cost => 1).to_shex)
|
11
|
+
assert_equal( '01ffffff', TosMetric.new(:tos => 1, :cost => 0xffffff).to_shex)
|
12
|
+
assert_equal( '01ffffff', TosMetric.new(:tos => 1, :cost => 0xffffffff).to_shex)
|
13
|
+
assert_equal( 1, TosMetric.new(:tos => 1, :cost => 0xffffffff).tos)
|
14
|
+
assert_equal( 4294967295, TosMetric.new(:tos => 1, :cost => 0xffffffff).cost)
|
15
|
+
assert_equal( {:tos=>1, :cost=>1}, TosMetric.new(:tos => 1, :cost => 1).to_hash)
|
16
|
+
assert_equal( 'TosMetric: tos: 1 cost: 1', TosMetric.new(:tos => 1, :cost => 1).to_s)
|
17
|
+
assert_equal( 'TosMetric: tos: 1 cost: 1', TosMetric.new(:tos => 1, :cost => 1).to_s)
|
18
|
+
assert_equal( 'TosMetric: tos: 1 cost: 1', TosMetric.new([1,1]).to_s)
|
19
|
+
assert_equal( 'Topology (ID 1) -> Metric: 1', TosMetric.new([1,1]).to_s_junos_style)
|
20
|
+
assert_equal( TosMetric.new([1,1]).to_shex, TosMetric.new(TosMetric.new([1,1])).to_shex)
|
21
|
+
m = TosMetric.new(['01ffffff'].pack('H*'))
|
22
|
+
assert_equal( '01ffffff', m.to_shex)
|
23
|
+
assert_equal( 1, m.tos)
|
24
|
+
assert_equal( 1, m.id)
|
25
|
+
assert_equal( 0xffffff, m.cost)
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
|
3
|
+
require "infra/ospf_common"
|
4
|
+
|
5
|
+
class TestCommon < Test::Unit::TestCase
|
6
|
+
def test_class_string_to__
|
7
|
+
assert_equal 'camel_case', "CamelCase".to_underscore
|
8
|
+
assert_equal 'router_id', "RouterId".to_underscore
|
9
|
+
assert_equal 'area_id', "AreaId".to_underscore
|
10
|
+
assert_equal 'ospf_bdr', "OspfBdr".to_underscore
|
11
|
+
assert_equal 'ospf_dr', "OspfDr".to_underscore
|
12
|
+
assert_equal 'as_external7', "AsExternal7".to_underscore
|
13
|
+
end
|
14
|
+
def test_class_string_to_camel
|
15
|
+
assert_equal 'CamelCase', 'camel_case'.to_camel
|
16
|
+
assert_equal 'RouterId', 'router_id'.to_camel
|
17
|
+
assert_equal 'AreaId', 'area_id'.to_camel
|
18
|
+
end
|
19
|
+
def test_class_symbol_to_klass
|
20
|
+
assert_equal :AnInstanceVar, :an_instance_var.to_klass
|
21
|
+
assert_equal :AreaId, :area_id.to_klass
|
22
|
+
assert_equal :RouterId, :router_id.to_klass
|
23
|
+
end
|
24
|
+
def test_attr_writer_delegate
|
25
|
+
end
|
26
|
+
def test_ipaddr
|
27
|
+
assert_equal IPAddr, IPAddr.to_arr('10.0.0.1/24')[0].class
|
28
|
+
assert_equal '10.0.0.1', IPAddr.to_arr('10.0.0.1/24')[1]
|
29
|
+
assert_equal 24, IPAddr.to_arr('10.0.0.1/24')[2]
|
30
|
+
assert_equal '10.0.0.0', IPAddr.to_arr('10.0.0.1/24')[3]
|
31
|
+
assert_equal '255.255.255.0', IPAddr.to_arr('10.0.0.1/24')[4]
|
32
|
+
assert_equal '10.0.0.8/30', IPAddr.new('10.0.0.0/30') ^ 2
|
33
|
+
assert_equal '10.0.0.12/30', IPAddr.new('10.0.0.0/30') ^ 3
|
34
|
+
assert_equal '10.0.0.1/30', IPAddr.new('10.0.0.0/30') + 1
|
35
|
+
assert_equal '10.0.0.2/30', IPAddr.new('10.0.0.0/30') + 2
|
36
|
+
assert_raise(NoMethodError) { IPAddr.new('10.0.0.0/30') -1 }
|
37
|
+
|
38
|
+
assert_equal '10.0.0.0', IPAddr.new('10.0.0.1/24').to_s
|
39
|
+
assert_equal '10.0.0.0/24', IPAddr.new('10.0.0.1/24').to_s_net
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
|
2
|
+
require "test/unit"
|
3
|
+
|
4
|
+
require "infra/parse_options"
|
5
|
+
|
6
|
+
class TestOptParse < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def test_parse_grid
|
9
|
+
assert_equal [2,2], parse.grid
|
10
|
+
assert_equal [3,4], parse('--grid 3x4').grid
|
11
|
+
assert_equal [3,4], parse('-g 3x4').grid
|
12
|
+
end
|
13
|
+
def test_parse_area_id
|
14
|
+
assert_equal 0, parse.area_id
|
15
|
+
assert_equal 1, parse('--area-id 1').area_id
|
16
|
+
assert_equal 2, parse('--area-id 0.0.0.2').area_id
|
17
|
+
assert_equal 2, parse('-a 0.0.0.2').area_id
|
18
|
+
end
|
19
|
+
def test_parse_router_id
|
20
|
+
assert_equal 1, parse.router_id
|
21
|
+
assert_equal 2, parse('--router-id 2').router_id
|
22
|
+
assert_equal 2, parse('-r 0.0.0.2').router_id
|
23
|
+
end
|
24
|
+
def test_parse_ipaddr
|
25
|
+
assert_equal '192.168.1.123' ,parse.ipaddr
|
26
|
+
assert_equal '1.1.1.1' ,parse('--address 1.1.1.1/23').ipaddr
|
27
|
+
assert_equal '255.255.254.0' ,parse('--address 1.1.1.1/23').netmask
|
28
|
+
end
|
29
|
+
def test_hello_int
|
30
|
+
assert_equal 10, parse.hello_int
|
31
|
+
assert_equal 60, parse('--hello-int 60').hello_int
|
32
|
+
assert_equal 40, parse.dead_int
|
33
|
+
assert_equal 20, parse('--hello-int 20').hello_int
|
34
|
+
assert_equal 80, parse('--hello-int 20').dead_int
|
35
|
+
assert_equal 200, parse('--hello-int 20 --dead-int 200').dead_int
|
36
|
+
assert_equal 200, parse('--dead-int 200').dead_int
|
37
|
+
assert_equal 10, parse('--dead-int 200').hello_int
|
38
|
+
end
|
39
|
+
def test_num_of
|
40
|
+
assert_equal 10, parse.num_sum
|
41
|
+
assert_equal 10, parse.num_ext
|
42
|
+
assert_equal 20, parse('--number-of-summary 20').num_sum
|
43
|
+
assert_equal 20, parse('--number-of-external 20').num_ext
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def set(a, v)
|
49
|
+
a.clear
|
50
|
+
v.each { |x| a << x }
|
51
|
+
end
|
52
|
+
|
53
|
+
def parse(s='')
|
54
|
+
set ARGV, s.split
|
55
|
+
OptParse.parse(ARGV)
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
|
3
|
+
require "infra/timer"
|
4
|
+
|
5
|
+
class TestInfraTimer < Test::Unit::TestCase
|
6
|
+
|
7
|
+
Timer1 = Class.new(Timer)
|
8
|
+
Timer2 = Class.new(Timer)
|
9
|
+
Timer3 = Class.new(Timer)
|
10
|
+
|
11
|
+
def update(*args)
|
12
|
+
@evQ.enq args
|
13
|
+
end
|
14
|
+
|
15
|
+
def setup
|
16
|
+
@evQ = Queue.new
|
17
|
+
end
|
18
|
+
|
19
|
+
def _tests
|
20
|
+
assert Timer.new(10)
|
21
|
+
t0 = Time.now
|
22
|
+
# + notification
|
23
|
+
t1 = Timer1.start(1,self)
|
24
|
+
assert_equal [:ev_timer_start, :"TestTimer::Timer1"], @evQ.deq
|
25
|
+
assert_equal [:ev_timer_expire, :"TestTimer::Timer1"], @evQ.deq
|
26
|
+
# - notification
|
27
|
+
# + block
|
28
|
+
t2 = Timer2.start(1) { @evQ.enq ['DONE', (Time.now-t0).to_int]}
|
29
|
+
assert_equal ['DONE',2], @evQ.deq
|
30
|
+
# + notificaion
|
31
|
+
# + block
|
32
|
+
t3 = Timer3.start(1,self) { @evQ.enq ['DONE', (Time.now-t0).to_int]}
|
33
|
+
assert_equal [:ev_timer_start, :"TestTimer::Timer3"], @evQ.deq
|
34
|
+
assert_equal ['DONE',3], @evQ.deq
|
35
|
+
assert_equal [:ev_timer_expire, :"TestTimer::Timer3"], @evQ.deq
|
36
|
+
end
|
37
|
+
def test_running?
|
38
|
+
t1 = Timer1.new(10)
|
39
|
+
assert ! t1.running?
|
40
|
+
t1.start 1
|
41
|
+
assert t1.running?
|
42
|
+
end
|
43
|
+
def _test_cancel
|
44
|
+
t1 = Timer1.new(10)
|
45
|
+
t1.start 1
|
46
|
+
assert t1.running?
|
47
|
+
t1.cancel
|
48
|
+
assert ! t1.running?
|
49
|
+
t0 = Time.now
|
50
|
+
t1 = Timer.start(3)
|
51
|
+
sleep 2
|
52
|
+
t1.reset { @evQ.enq ['DONE', (Time.now-t0).to_int]}
|
53
|
+
assert_equal ['DONE', 2+3], @evQ.deq
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
class TestPeriodicTimer < Test::Unit::TestCase
|
58
|
+
|
59
|
+
PeriodicTimer1 = Class.new(PeriodicTimer)
|
60
|
+
|
61
|
+
def update(*args)
|
62
|
+
@evQ.enq args
|
63
|
+
end
|
64
|
+
|
65
|
+
def setup
|
66
|
+
@evQ = Queue.new
|
67
|
+
end
|
68
|
+
|
69
|
+
def tests
|
70
|
+
t0 = Time.now
|
71
|
+
p = PeriodicTimer1.start(1,self) { @evQ.enq ['DONE', (Time.now-t0).to_int]}
|
72
|
+
assert_equal [:ev_timer_start, :"TestPeriodicTimer::PeriodicTimer1"], @evQ.deq[0,2]
|
73
|
+
assert_equal ['DONE',1], @evQ.deq
|
74
|
+
assert_equal [:ev_timer_fire, :"TestPeriodicTimer::PeriodicTimer1"], @evQ.deq[0,2]
|
75
|
+
assert_equal ['DONE',2], @evQ.deq
|
76
|
+
assert_equal [:ev_timer_fire, :"TestPeriodicTimer::PeriodicTimer1"], @evQ.deq[0,2]
|
77
|
+
assert_equal ['DONE',3], @evQ.deq
|
78
|
+
assert_equal [:ev_timer_fire, :"TestPeriodicTimer::PeriodicTimer1"], @evQ.deq[0,2]
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_stop
|
82
|
+
t0 = Time.now
|
83
|
+
p = PeriodicTimer1.start(1,self) { @evQ.enq ['DONE', (Time.now-t0).to_int]}
|
84
|
+
assert_equal [:ev_timer_start, :"TestPeriodicTimer::PeriodicTimer1"], @evQ.deq[0,2]
|
85
|
+
assert_equal ['DONE',1], @evQ.deq
|
86
|
+
assert_equal [:ev_timer_fire, :"TestPeriodicTimer::PeriodicTimer1"], @evQ.deq[0,2]
|
87
|
+
assert p.running?
|
88
|
+
p.stop
|
89
|
+
sleep(1.2)
|
90
|
+
assert ! p.running?
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
data/test/unit/ls_db/all
ADDED
@@ -0,0 +1,140 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "ls_db/link_state_database"
|
3
|
+
require 'packet/ospf_packet'
|
4
|
+
|
5
|
+
class TestLsDbLinkStateBuildDatabase < Test::Unit::TestCase
|
6
|
+
include OSPFv2
|
7
|
+
include OSPFv2::LSDB
|
8
|
+
|
9
|
+
def _test_add_link_to_stub
|
10
|
+
ls_db = LinkStateDatabase.new(:area_id=> 0)
|
11
|
+
ls_db.add_link_to_stub_network :router_id=> 1, :link_id => '99.99.1.0', :link_data => '255.255.255.0'
|
12
|
+
assert_equal '99.99.1.0', ls_db[1,1][0].link_id.to_ip
|
13
|
+
assert_equal '255.255.255.0', ls_db[1,1][0].link_data.to_ip
|
14
|
+
assert_equal 0, ls_db[1,1][0].metric.to_i
|
15
|
+
ls_db.add_link_to_stub_network :router_id=> 1, :network => '99.99.1.1/24', :metric=>10
|
16
|
+
assert_equal '99.99.1.0', ls_db[1,1][0].link_id.to_ip
|
17
|
+
assert_equal '255.255.255.0', ls_db[1,1][0].link_data.to_ip
|
18
|
+
assert_equal 10, ls_db[1,1][0].metric.to_i
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_add_adjacency
|
22
|
+
ls_db = LinkStateDatabase.new(:area_id=> 0)
|
23
|
+
ls_db.add_adjacency(1, 2, '192.168.0.1/24', 2)
|
24
|
+
|
25
|
+
assert_equal 2, ls_db[:router,1].links.size
|
26
|
+
ls_db.add_adjacency(1, 3, '192.168.1.1/24', 2)
|
27
|
+
assert_equal 4, ls_db[:router,1].links.size
|
28
|
+
ls_db.add_adjacency(2, 3, '192.168.2.1/24', 2)
|
29
|
+
assert_equal 2, ls_db[:router,2].links.size
|
30
|
+
assert_equal 2, ls_db.size
|
31
|
+
assert_equal Router, ls_db[:router, 1].class
|
32
|
+
assert_equal RouterLink::PointToPoint, ls_db[:router,1][0].class
|
33
|
+
|
34
|
+
assert_equal 4, ls_db[:router,1].links.size
|
35
|
+
lsa = ls_db.remove_adjacency(1, 2, '192.168.0.1/24')
|
36
|
+
assert_equal 2, ls_db[:router,1].links.size
|
37
|
+
ls_db.remove_adjacency(1, 3, '192.168.1.1/24')
|
38
|
+
assert_equal 0, ls_db[:router,1].links.size
|
39
|
+
|
40
|
+
assert_equal 2, ls_db[:router,2].links.size
|
41
|
+
lsa = ls_db.remove_adjacency(2, 3, '192.168.2.1/24')
|
42
|
+
assert_equal 0, ls_db[:router,2].links.size
|
43
|
+
|
44
|
+
assert ls_db.advertised_routers.has?('0.0.0.1')
|
45
|
+
assert ls_db.advertised_routers.has?('0.0.0.2')
|
46
|
+
assert ! ls_db.advertised_routers.has?('0.0.0.3')
|
47
|
+
assert ls_db.advertised_routers.has?(1)
|
48
|
+
assert ls_db.advertised_routers.has?(2)
|
49
|
+
assert ! ls_db.advertised_routers.has?(3)
|
50
|
+
assert ls_db.proxied?('0.0.0.1')
|
51
|
+
assert ls_db.proxied?(2)
|
52
|
+
assert ! ls_db.proxied?('0.0.0.3')
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_add_adjacency_from_hash
|
56
|
+
ls_db = LinkStateDatabase.new(:area_id=> 0)
|
57
|
+
ls_db.add_adjacency :router_id =>1, :neighbor_router_id => 4, :prefix => '192.168.4.1/24', :metric=>2
|
58
|
+
|
59
|
+
assert_equal '0.0.0.1', ls_db[1,1].ls_id.to_ip
|
60
|
+
assert_equal 2, ls_db[1,1][0].metric.to_i
|
61
|
+
|
62
|
+
assert_equal :point_to_point, ls_db[1,1][0].router_link_type.to_sym
|
63
|
+
assert_equal 'LinkId: 0.0.0.4', ls_db[1,1][0].link_id.to_s
|
64
|
+
assert_equal 'LinkData: 192.168.4.1', ls_db[1,1][0].link_data.to_s
|
65
|
+
|
66
|
+
assert_equal :stub_network, ls_db[1,1][1].router_link_type.to_sym
|
67
|
+
assert_equal 'LinkId: 192.168.4.0', ls_db[1,1][1].link_id.to_s
|
68
|
+
assert_equal 'LinkData: 255.255.255.0', ls_db[1,1][1].link_data.to_s
|
69
|
+
#puts ls_db.to_s
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_1
|
73
|
+
|
74
|
+
#
|
75
|
+
# point-to-point:
|
76
|
+
#
|
77
|
+
# 88.0.0.0/24
|
78
|
+
# routerA <---- p2p ------> routerB
|
79
|
+
# .1 .2
|
80
|
+
#
|
81
|
+
# jme@olive> show ospf database logical-router routerA detail
|
82
|
+
#
|
83
|
+
# OSPF link state database, Area 0.0.0.0
|
84
|
+
# Type ID Adv Rtr Seq Age Opt Cksum Len
|
85
|
+
# Router *88.0.0.1 88.0.0.1 0x80000003 126 0x22 0xa5bc 48
|
86
|
+
# bits 0x0, link count 2
|
87
|
+
# id 88.0.0.2, data 88.0.0.1, Type PointToPoint (1)
|
88
|
+
# Topology count: 0, Default metric: 1
|
89
|
+
# id 88.0.0.0, data 255.255.255.0, Type Stub (3)
|
90
|
+
# Topology count: 0, Default metric: 1
|
91
|
+
# Router 88.0.0.2 88.0.0.2 0x80000002 127 0x22 0x9bc5 48
|
92
|
+
# bits 0x0, link count 2
|
93
|
+
# id 88.0.0.1, data 88.0.0.2, Type PointToPoint (1)
|
94
|
+
# Topology count: 0, Default metric: 1
|
95
|
+
# id 88.0.0.0, data 255.255.255.0, Type Stub (3)
|
96
|
+
# Topology count: 0, Default metric: 1
|
97
|
+
#
|
98
|
+
#
|
99
|
+
# routerA: set router-options router-id 0.0.0.10
|
100
|
+
#
|
101
|
+
# OSPF link state database, Area 0.0.0.0
|
102
|
+
# Type ID Adv Rtr Seq Age Opt Cksum Len
|
103
|
+
# Router *10.0.0.0 10.0.0.0 0x80000008 1294 0x22 0x6695 48
|
104
|
+
# bits 0x0, link count 2
|
105
|
+
# id 88.0.0.2, data 88.0.0.1, Type PointToPoint (1)
|
106
|
+
# Topology count: 0, Default metric: 1
|
107
|
+
# id 88.0.0.0, data 255.255.255.0, Type Stub (3)
|
108
|
+
# Topology count: 0, Default metric: 1
|
109
|
+
# Router 88.0.0.2 88.0.0.2 0x8000000b 1291 0x22 0x5b4c 48
|
110
|
+
# bits 0x0, link count 2
|
111
|
+
# id 10.0.0.0, data 88.0.0.2, Type PointToPoint (1)
|
112
|
+
# Topology count: 0, Default metric: 1
|
113
|
+
# id 88.0.0.0, data 255.255.255.0, Type Stub (3)
|
114
|
+
# Topology count: 0, Default metric: 1
|
115
|
+
#
|
116
|
+
#
|
117
|
+
ls_db = LinkStateDatabase.new(:area_id=> 0)
|
118
|
+
ls_db.add_p2p_adjacency :router_id =>'88.0.0.1', :neighbor_router_id => '88.0.0.2', :prefix => '88.0.0.1/24', :metric=>1
|
119
|
+
ls_db.add_p2p_adjacency :router_id =>'88.0.0.2', :neighbor_router_id => '88.0.0.1', :prefix => '88.0.0.2/24', :metric=>1
|
120
|
+
|
121
|
+
# if router_id is not specified use address part of prefix
|
122
|
+
ls_db = LinkStateDatabase.new(:area_id=> 0)
|
123
|
+
ls_db.add_p2p_adjacency :neighbor_router_id => '88.0.0.2', :prefix => '88.0.0.1/24', :metric=>1
|
124
|
+
ls_db.add_p2p_adjacency :neighbor_router_id => '88.0.0.1', :prefix => '88.0.0.2/24', :metric=>1
|
125
|
+
|
126
|
+
# routerA with router-id 10
|
127
|
+
ls_db = LinkStateDatabase.new(:area_id=> 0)
|
128
|
+
ls_db.add_p2p_adjacency :router_id => '10.0.0.0', :neighbor_router_id => '88.0.0.2', :prefix => '88.0.0.1/24', :metric=>1
|
129
|
+
ls_db.add_p2p_adjacency :router_id =>'88.0.0.2', :neighbor_router_id => '10.0.0.0', :prefix => '88.0.0.2/24', :metric=>1
|
130
|
+
|
131
|
+
ls_db.add_loopback :router_id=> '10.0.0.0', :address=>'99.99.1.1'
|
132
|
+
|
133
|
+
ls_db.add_p2p_adjacency :neighbor_router_id => '88.0.0.2', :prefix => '192.168.1.200/24', :metric=>1
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
end
|
138
|
+
|
139
|
+
|
140
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'ls_db/link_state_database_links'
|
2
|
+
require "test/unit"
|
3
|
+
|
4
|
+
# require "ls_db/link_add"
|
5
|
+
|
6
|
+
class TestLsDbLinks < Test::Unit::TestCase
|
7
|
+
include OSPFv2::LSDB
|
8
|
+
def setup
|
9
|
+
@ls_db = LinkStateDatabase.new(:area_id=> 0)
|
10
|
+
Link.reset
|
11
|
+
end
|
12
|
+
def test_new_link
|
13
|
+
ls_db = LinkStateDatabase.new :area_id=>0
|
14
|
+
ls_db.new_link :router_id=> 1, :neighbor_id=>2
|
15
|
+
ls_db.new_link :router_id=> 1, :neighbor_id=>3
|
16
|
+
ls_db.new_link :router_id=> 1, :neighbor_id=>4
|
17
|
+
ls_db.new_link :router_id=> 1, :neighbor_id=>5
|
18
|
+
|
19
|
+
Link.all.values.each { |lnk| ls_db.link lnk, :down }
|
20
|
+
Link.all.values.each { |lnk| ls_db.link lnk, :up }
|
21
|
+
|
22
|
+
rlsa.delete(:point_to_point,'0.0.0.2')
|
23
|
+
assert_equal 7, rlsa.links.size
|
24
|
+
puts ls_db
|
25
|
+
rlsa.delete(:point_to_point,'0.0.0.3')
|
26
|
+
rlsa.delete(:point_to_point,'0.0.0.4')
|
27
|
+
rlsa.delete(:point_to_point,'0.0.0.5')
|
28
|
+
assert_equal 4, rlsa.links.size
|
29
|
+
assert_equal 5, ls_db.size
|
30
|
+
ls_db.link Link[1], :down
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_new_link_local_only
|
34
|
+
@ls_db = LinkStateDatabase.new :area_id=>0
|
35
|
+
@ls_db.new_link :router_id=> 1, :neighbor_id=>2, :direction => :local_only
|
36
|
+
@ls_db.new_link :router_id=> 1, :neighbor_id=>3, :direction => :local_only
|
37
|
+
@ls_db.new_link :router_id=> 1, :neighbor_id=>4, :direction => :local_only
|
38
|
+
@ls_db.new_link :router_id=> 1, :neighbor_id=>5, :direction => :local_only
|
39
|
+
assert_equal 1, @ls_db.size
|
40
|
+
assert_equal 1, @ls_db.all_router[0].advertising_router.to_i
|
41
|
+
end
|
42
|
+
def test_new_link_remote_only
|
43
|
+
@ls_db = LinkStateDatabase.new :area_id=>0
|
44
|
+
@ls_db.new_link :router_id=> 1, :neighbor_id=>2, :direction => :remote_only
|
45
|
+
@ls_db.new_link :router_id=> 1, :neighbor_id=>3, :direction => :remote_only
|
46
|
+
@ls_db.new_link :router_id=> 1, :neighbor_id=>4, :direction => :remote_only
|
47
|
+
@ls_db.new_link :router_id=> 1, :neighbor_id=>5, :direction => :remote_only
|
48
|
+
assert_equal 4, @ls_db.size
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_create
|
52
|
+
ls_db = LinkStateDatabase.create :columns=> 2, :rows=> 2,
|
53
|
+
:base_prefix => '169.0.0.0/24',
|
54
|
+
:base_router_id=> 0x80000000
|
55
|
+
assert_equal 4, ls_db.size
|
56
|
+
assert ls_db[1,'128.1.0.1'].has_link?(3,'169.0.0.0')
|
57
|
+
assert ls_db[1,'128.1.0.2'].has_link?(3,'169.0.2.0')
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_create_empty_database
|
61
|
+
ls_db = LinkStateDatabase.create :columns=> 0, :rows=> 0
|
62
|
+
assert_equal 0, ls_db.size
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
end
|