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
|
@@ -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
|