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.
Files changed (107) hide show
  1. checksums.yaml +7 -0
  2. data/COPYING +674 -0
  3. data/LICENSE.txt +53 -0
  4. data/README +50 -0
  5. data/bin/ospfv2 +112 -105
  6. data/changelog.txt +7 -0
  7. data/gemspec +17 -0
  8. data/lib/ie/external_route.rb +9 -0
  9. data/lib/ie/id.rb +3 -4
  10. data/lib/ie/ie.rb +12 -0
  11. data/lib/ie/ls_age.rb +35 -5
  12. data/lib/ie/ls_type.rb +40 -37
  13. data/lib/ie/opaque_id.rb +46 -0
  14. data/lib/ie/opaque_type.rb +96 -0
  15. data/lib/ie/options.rb +5 -3
  16. data/lib/ie/router_link.rb +30 -7
  17. data/lib/ie/router_link_type.rb +116 -27
  18. data/lib/ie/sequence_number.rb +7 -3
  19. data/lib/infra/ospf_common.rb +1 -12
  20. data/lib/infra/ospf_io.rb +14 -8
  21. data/lib/infra/ospf_socket.rb +14 -14
  22. data/lib/infra/parse_options.rb +69 -25
  23. data/lib/ls_db/advertised_routers.rb +1 -1
  24. data/lib/ls_db/link_state_database.rb +74 -39
  25. data/lib/ls_db/link_state_database_build.rb +3 -3
  26. data/lib/ls_db/link_state_database_links.rb +7 -2
  27. data/lib/ls_db/lsdb_ios.rb +59 -0
  28. data/lib/lsa/external.rb +35 -2
  29. data/lib/lsa/lsa.rb +128 -35
  30. data/lib/lsa/lsa_factory.rb +20 -7
  31. data/lib/lsa/network.rb +44 -9
  32. data/lib/lsa/router.rb +14 -2
  33. data/lib/lsa/summary.rb +16 -3
  34. data/lib/lsa/tlv/color.rb +47 -0
  35. data/lib/lsa/tlv/link.rb +122 -0
  36. data/lib/lsa/tlv/link_id.rb +55 -0
  37. data/lib/lsa/tlv/link_type.rb +44 -0
  38. data/lib/lsa/tlv/local_interface.rb +56 -0
  39. data/lib/lsa/tlv/maximum_bandwidth.rb +55 -0
  40. data/lib/lsa/tlv/maximum_reservable_bandwidth.rb +52 -0
  41. data/lib/lsa/tlv/remote_interface.rb +58 -0
  42. data/lib/lsa/tlv/router_address.rb +57 -0
  43. data/lib/lsa/tlv/tlv.rb +32 -0
  44. data/lib/lsa/tlv/tlv_factory.rb +72 -0
  45. data/lib/lsa/tlv/traffic_engineering_metric.rb +52 -0
  46. data/lib/lsa/tlv/unreserved_bandwidth.rb +55 -0
  47. data/lib/lsa/traffic_engineering.rb +95 -0
  48. data/lib/neighbor/neighbor.rb +9 -9
  49. data/lib/packet/link_state_update.rb +16 -14
  50. data/lib/packet/ospf_packet.rb +13 -9
  51. data/test/unit/ie/au_type_test.rb +18 -0
  52. data/test/unit/ie/external_route_test.rb +51 -0
  53. data/test/unit/ie/id_test.rb +22 -0
  54. data/test/unit/ie/interface_mtu_test.rb +23 -0
  55. data/test/unit/ie/ls_age_test.rb +46 -0
  56. data/test/unit/ie/ls_type_test.rb +41 -0
  57. data/test/unit/ie/metric_test.rb +24 -0
  58. data/test/unit/ie/mt_metric_test.rb +27 -0
  59. data/test/unit/ie/opaque_id_test.rb +22 -0
  60. data/test/unit/ie/opaque_type_test.rb +22 -0
  61. data/test/unit/ie/options_test.rb +142 -0
  62. data/test/unit/ie/ospf_version_test.rb +0 -0
  63. data/test/unit/ie/packet_type_test.rb +33 -0
  64. data/test/unit/ie/router_link_factory_test.rb +26 -0
  65. data/test/unit/ie/router_link_test.rb +276 -0
  66. data/test/unit/ie/router_link_type_test.rb +24 -0
  67. data/test/unit/ie/sequence_number_test.rb +31 -0
  68. data/test/unit/ie/tos_metric_test.rb +27 -0
  69. data/test/unit/infra/ospf_common_test.rb +42 -0
  70. data/test/unit/infra/parse_options_test.rb +58 -0
  71. data/test/unit/infra/timer_test.rb +94 -0
  72. data/test/unit/ls_db/all +10 -0
  73. data/test/unit/ls_db/link_state_database_build_test.rb +140 -0
  74. data/test/unit/ls_db/link_state_database_links_tests.rb +74 -0
  75. data/test/unit/ls_db/link_state_database_test.rb +444 -0
  76. data/test/unit/ls_db/links_test.rb +49 -0
  77. data/test/unit/lsa/all +10 -0
  78. data/test/unit/lsa/external_test.rb +218 -0
  79. data/test/unit/lsa/lsa_factory_test.rb +314 -0
  80. data/test/unit/lsa/lsa_test.rb +191 -0
  81. data/test/unit/lsa/network_test.rb +107 -0
  82. data/test/unit/lsa/router_test.rb +614 -0
  83. data/test/unit/lsa/summary_test.rb +135 -0
  84. data/test/unit/lsa/tlv/color_test.rb +39 -0
  85. data/test/unit/lsa/tlv/link_id_test.rb +14 -0
  86. data/test/unit/lsa/tlv/link_test.rb +413 -0
  87. data/test/unit/lsa/tlv/link_type_test.rb +16 -0
  88. data/test/unit/lsa/tlv/local_interface_test.rb +15 -0
  89. data/test/unit/lsa/tlv/maximum_bandwidth_test.rb +14 -0
  90. data/test/unit/lsa/tlv/maximum_reservable_bandwidth_test.rb +13 -0
  91. data/test/unit/lsa/tlv/remote_interface_test.rb +14 -0
  92. data/test/unit/lsa/tlv/router_address_test.rb +16 -0
  93. data/test/unit/lsa/tlv/tlv_factory_test.rb +89 -0
  94. data/test/unit/lsa/tlv/traffic_engineering_metric_test.rb +15 -0
  95. data/test/unit/lsa/traffic_engineering_test.rb +65 -0
  96. data/test/unit/neighbor/neighbor_test.rb +82 -0
  97. data/test/unit/packet/all +10 -0
  98. data/test/unit/packet/database_description_test.rb +114 -0
  99. data/test/unit/packet/hello_test.rb +107 -0
  100. data/test/unit/packet/link_state_ack_test.rb +64 -0
  101. data/test/unit/packet/link_state_request_test.rb +168 -0
  102. data/test/unit/packet/link_state_update_test.rb +62 -0
  103. data/test/unit/packet/ospf_packet_test.rb +91 -0
  104. metadata +106 -51
  105. data/lib/infra/to_s.rb +0 -38
  106. data/lib/lsa/lsa_base.rb +0 -430
  107. 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
+
@@ -0,0 +1,10 @@
1
+ require 'fileutils'
2
+ dir = File.dirname(File.expand_path(__FILE__ ))
3
+
4
+ FileUtils.chdir(dir) do
5
+ Dir.glob("**/*rb") do |filename|
6
+ next if __FILE__ == filename
7
+ require File.join(dir,filename) unless filename == File.basename(__FILE__)
8
+ end
9
+ end
10
+
@@ -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