ospfv2 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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