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,444 @@
1
+ require "test/unit"
2
+ require "ls_db/link_state_database"
3
+ require 'packet/ospf_packet'
4
+
5
+ class TestLsDbLinkStateDatabase < Test::Unit::TestCase
6
+ include OSPFv2
7
+ include OSPFv2::LSDB
8
+
9
+ def setup
10
+ @ls_db = []
11
+ @ls_db << {
12
+ :sequence_number=>2147483650,
13
+ :advertising_router=>"1.2.0.0",
14
+ :ls_id=>"0.0.4.5",
15
+ :nwveb=>1,
16
+ :ls_type=>:router,
17
+ :options=> 0x21,
18
+ :ls_age=>10,
19
+ :links=>[
20
+ {
21
+ :link_id=>"1.1.1.1",
22
+ :link_data=>"255.255.255.255",
23
+ :router_link_type=>:point_to_point,
24
+ :metric=>11,
25
+ :mt_metrics=>[ {:id=>1, :metric=>11}, {:id=>2, :metric=>22} ]
26
+ },
27
+ {
28
+ :link_id=>"1.1.1.2",
29
+ :link_data=>"255.255.255.255",
30
+ :router_link_type=>:point_to_point,
31
+ :metric=>12,
32
+ :mt_metrics=>[]
33
+ }
34
+ ],
35
+ }
36
+ @ls_db << {
37
+ :ls_id=>"192.168.0.1",
38
+ :ls_age=>0,
39
+ :ls_type=>:network,
40
+ :advertising_router=>"1.1.1.1",
41
+ :sequence_number=>2147483649,
42
+ :options=>0,
43
+ :network_mask=>"255.255.255.0",
44
+ :attached_routers=>["1.1.1.1", "2.2.2.2", "3.3.3.3"],
45
+ }
46
+ @ls_db << {
47
+ :sequence_number=>2147483649,
48
+ :advertising_router=>"1.1.1.1",
49
+ :ls_id=>"10.0.0.0",
50
+ :ls_age=>0,
51
+ :options=>0,
52
+ :ls_type=>:summary,
53
+ :netmask=>"255.255.255.0",
54
+ :metric=>1,
55
+ :mt_metrics=>[{:id=>33, :metric=>20}, {:id=>34, :metric=>255}]
56
+ }
57
+ @ls_db << {
58
+ :sequence_number=>2147483649,
59
+ :advertising_router=>"1.1.1.1",
60
+ :ls_id=>"10.0.0.0",
61
+ :ls_age=>0,
62
+ :metric=>1,
63
+ :options=>0,
64
+ :ls_type=>:asbr_summary,
65
+ :netmask=>"255.255.255.0",
66
+ :mt_metrics=>[{:id=>33, :metric=>20}, {:id=>34, :metric=>255}]
67
+ }
68
+ @ls_db << {
69
+ :sequence_number=>2147483649,
70
+ :ls_age => 13,
71
+ :options=>0,
72
+ :ls_type => :as_external,
73
+ :advertising_router=>"1.1.1.1",
74
+ :ls_id=>"10.0.0.0",
75
+ :netmask => "255.255.255.0",
76
+ :external_route=> {
77
+ :type=>:e2,
78
+ :forwarding_address=>"1.2.3.0",
79
+ :metric=>1,
80
+ :tag=>255
81
+ },
82
+ }
83
+ end
84
+
85
+ def test_init
86
+ ls_db = LinkStateDatabase.new(:ls_db => @ls_db)
87
+ assert_match /Area 0.0.0.0/, ls_db.to_s_junos
88
+ assert_match /Router\s+0.0.4.5\s+1.2.0.0\s+0x80000002\s+10 0x21 0x8a41 56/, ls_db.to_s_junos
89
+ assert_match /ASBRSum 10.0.0.0\s+1.1.1.1\s+0x80000001\s+0 0x00 0x7a75 36/, ls_db.to_s_junos
90
+ assert_match /Network 192.168.0.1\s+1.1.1.1\s+0x80000001\s+0 0x00 0x1bb6 36/, ls_db.to_s_junos
91
+ assert_match /Summary 10.0.0.0\s+1.1.1.1\s+0x80000001\s+0 0x00 0x8868 36/, ls_db.to_s_junos
92
+ assert_match /Extern 10.0.0.0\s+1.1.1.1\s+0x80000001\s+13 0x00 0xb40b 36/, ls_db.to_s_junos
93
+ end
94
+
95
+ def __test_add_loopback_1
96
+ ls_db = LinkStateDatabase.new
97
+ ls_db.add_loopback '2.2.2.2', 10
98
+ ls_db.add_loopback '3.3.3.3', 20
99
+ assert_equal 2, ls_db.size
100
+ assert_equal OSPFv2::Router, ls_db[1,'2.2.2.2'].class
101
+ assert_equal 10, ls_db[1,'2.2.2.2'][0].metric.to_i
102
+ assert_equal 10, ls_db[1,'2.2.2.2', '2.2.2.2'][0].metric.to_i
103
+ assert_equal 20, ls_db[1,'3.3.3.3'][0].metric.to_i
104
+ end
105
+
106
+ def test_add_loopback
107
+ ls_db = LinkStateDatabase.new(:area_id=> 0)
108
+ ls_db.add_loopback :router_id=>2, :metric=>10, :address=>'192.168.0.1'
109
+ ls_db.add_loopback :router_id=>3, :metric=>20, :address=>'192.168.0.2'
110
+ assert_equal 2, ls_db.size
111
+ assert_equal OSPFv2::Router, ls_db[1,'0.0.0.2'].class
112
+ assert_equal 10, ls_db[1,'0.0.0.2'][0].metric.to_i
113
+ assert_equal 10, ls_db[1,'0.0.0.2', '0.0.0.2'][0].metric.to_i
114
+ assert_equal 20, ls_db[1,3][0].metric.to_i
115
+ end
116
+
117
+ def test_add_adjacency
118
+ ls_db = LinkStateDatabase.new(:area_id=> 0)
119
+ ls_db.add_adjacency(1, 2, '192.168.0.1/24', 2)
120
+ assert_equal 2, ls_db[:router,1].links.size
121
+ ls_db.add_adjacency(1, 3, '192.168.1.1/24', 2)
122
+ assert_equal 4, ls_db[:router,1].links.size
123
+ ls_db.add_adjacency(2, 3, '192.168.2.1/24', 2)
124
+ assert_equal 2, ls_db[:router,2].links.size
125
+ assert_equal 2, ls_db.size
126
+ assert_equal Router, ls_db[:router, 1].class
127
+ assert_equal RouterLink::PointToPoint, ls_db[:router,1][0].class
128
+
129
+ assert_equal 4, ls_db[:router,1].links.size
130
+ lsa = ls_db.remove_adjacency(1, 2, '192.168.0.1/24')
131
+ assert_equal 2, ls_db[:router,1].links.size
132
+ ls_db.remove_adjacency(1, 3, '192.168.1.1/24')
133
+ assert_equal 0, ls_db[:router,1].links.size
134
+
135
+ assert_equal 2, ls_db[:router,2].links.size
136
+ lsa = ls_db.remove_adjacency(2, 3, '192.168.2.1/24')
137
+ assert_equal 0, ls_db[:router,2].links.size
138
+
139
+ assert ls_db.advertised_routers.has?('0.0.0.1')
140
+ assert ls_db.advertised_routers.has?('0.0.0.2')
141
+ assert ! ls_db.advertised_routers.has?('0.0.0.3')
142
+ assert ls_db.advertised_routers.has?(1)
143
+ assert ls_db.advertised_routers.has?(2)
144
+ assert ! ls_db.advertised_routers.has?(3)
145
+ assert ls_db.proxied?('0.0.0.1')
146
+ assert ls_db.proxied?(2)
147
+ assert ! ls_db.proxied?('0.0.0.3')
148
+
149
+
150
+ # puts ls_db.to_s_ios(false)
151
+ # puts ls_db.to_s_ios(true)
152
+ # puts ls_db.to_s(true)
153
+
154
+ end
155
+
156
+ def test_add_adjacency_from_hash
157
+ ls_db = LinkStateDatabase.new(:area_id=> 0)
158
+ ls_db.add_adjacency :router_id =>1, :neighbor_router_id => 4, :prefix => '192.168.4.1/24', :metric=>2
159
+
160
+ assert_equal '0.0.0.1', ls_db[1,1].ls_id.to_ip
161
+ assert_equal 2, ls_db[1,1][0].metric.to_i
162
+
163
+ assert_equal :point_to_point, ls_db[1,1][0].router_link_type.to_sym
164
+ assert_equal 'LinkId: 0.0.0.4', ls_db[1,1][0].link_id.to_s
165
+ assert_equal 'LinkData: 192.168.4.1', ls_db[1,1][0].link_data.to_s
166
+
167
+ assert_equal :stub_network, ls_db[1,1][1].router_link_type.to_sym
168
+ assert_equal 'LinkId: 192.168.4.0', ls_db[1,1][1].link_id.to_s
169
+ assert_equal 'LinkData: 255.255.255.0', ls_db[1,1][1].link_data.to_s
170
+ #puts ls_db.to_s
171
+ end
172
+
173
+
174
+ def test_all_not_ack
175
+ ls_db = LinkStateDatabase.new :area_id=> 1, :ls_db => @ls_db
176
+ assert_equal 5, ls_db.all.size
177
+ assert_equal 0, ls_db.all.find_all { |l| ! l.ack? }.size
178
+ ls_db.each { |l| l.retransmit }
179
+ ls_db[1,'0.0.4.5','1.2.0.0'].ack
180
+ assert_equal 4, ls_db.all.find_all { |l| ! l.ack? }.size
181
+ ls_db[:network,"192.168.0.1","1.1.1.1"].ack
182
+ assert_equal 3, ls_db.all.find_all { |l| ! l.ack? }.size
183
+ end
184
+
185
+ def test_all_xxx
186
+ ls_db = LinkStateDatabase.new :area_id=> 1, :ls_db => @ls_db
187
+ assert_equal 1, ls_db.all_router.size
188
+ assert_equal 1, ls_db.all_network.size
189
+ assert_equal 1, ls_db.all_summary.size
190
+ assert_equal 1, ls_db.all_asbr_summary.size
191
+ assert_equal 1, ls_db.all_as_external.size
192
+ assert @ls_db.to_s
193
+ end
194
+
195
+ def test_ls_refresh_time
196
+ ls_db = LinkStateDatabase.new :area_id=> 1, :ls_db => @ls_db
197
+ ls_db.add_adjacency :router_id =>1, :neighbor_router_id => 4, :prefix => '192.168.4.1/24', :metric=>2
198
+ assert_equal 1800, ls_db.ls_refresh_time
199
+ assert ! ls_db.ls_refresh?(ls_db[1,1])
200
+ ls_db[1,1].ls_age=20
201
+ ls_db.ls_refresh_time=10
202
+ assert_equal 10, ls_db.ls_refresh_time
203
+ assert ls_db.ls_refresh?(ls_db[1,1])
204
+ end
205
+
206
+ def test_refresh
207
+ ls_db = LinkStateDatabase.new(:area_id=> 0)
208
+ ls_db.add_loopback :router_id=>'2.2.2.2', :metric=>10 ,:address=>'192.168.1.1'
209
+ ls_db.add_loopback :router_id=>'3.3.3.3', :metric=>20 ,:address=>'192.168.1.2'
210
+ ls_db.add_adjacency(1, 2, '192.168.2.1/24', 2)
211
+ ls_db.add_adjacency(1, 3, '192.168.3.1/24', 2)
212
+ ls_db.add_adjacency(1, 4, '192.168.4.1/24', 2)
213
+ ls_db.add_adjacency(2, 3, '192.168.5.1/24', 2)
214
+ ls_db.add_adjacency(3, 4, '192.168.6.1/24', 2)
215
+ ls_db.add_adjacency(5, 4, '192.168.7.1/24', 2)
216
+ ls_db.each { |lsa| lsa.ls_age=1801 }
217
+ ls_db.refresh
218
+ ls_db.each { |lsa|
219
+ assert_equal 0x80000002, lsa.sequence_number.to_I
220
+ assert_equal 0, lsa.ls_age.to_i
221
+ assert ! lsa.acked?
222
+ }
223
+ end
224
+
225
+ def test_to_hash
226
+ ls_db = LinkStateDatabase.new(:area_id=> 0)
227
+ ls_db.add_adjacency(1, 2, '192.168.2.1/24', 2)
228
+ ls_db.add_adjacency(1, 3, '192.168.3.1/24', 2)
229
+ ls_db.add_adjacency(2, 4, '192.168.4.1/24', 2)
230
+ assert_equal [1,2], ls_db.advertised_routers.ids
231
+ assert_equal [1,2], ls_db.to_hash[:advertised_routers]
232
+ end
233
+
234
+ def test_all_proxied
235
+ ls_db = LinkStateDatabase.new(:area_id=> 0)
236
+ ls_db.add_loopback :router_id=>'2.2.2.2', :metric=>10, :address => '192.168.1.1'
237
+ ls_db.add_loopback :router_id=>'3.3.3.3', :metric=>20, :address => '192.168.1.2'
238
+ ls_db.add_adjacency(1, 2, '192.168.2.1/24', 2)
239
+ ls_db.add_adjacency(1, 3, '192.168.3.1/24', 2)
240
+ ls_db.add_adjacency(2, 4, '192.168.4.1/24', 2)
241
+ assert_equal 4, ls_db.all_proxied.size
242
+ ls_db.advertised_routers - 1
243
+ assert_equal 3, ls_db.all_proxied.size
244
+ end
245
+
246
+ def test_recv_link_state_update
247
+ ls_db = LinkStateDatabase.new(:area_id=> 0)
248
+ ls_db.add_loopback :router_id=>'2.2.2.2', :metric=>10, :address=> '192.168.1.1'
249
+ ls_db.add_loopback :router_id=>'3.3.3.3', :metric=>20, :address=> '192.168.1.2'
250
+ ls_db.add_adjacency(1, 2, '192.168.2.1/24', 2)
251
+ ls_db.add_adjacency(1, 3, '192.168.3.1/24', 2)
252
+ ls_db.add_adjacency(1, 4, '192.168.4.1/24', 2)
253
+ ls_db.add_adjacency(2, 3, '192.168.5.1/24', 2)
254
+ ls_db.add_adjacency(3, 4, '192.168.6.1/24', 2)
255
+ ls_db.add_adjacency(5, 4, '192.168.7.1/24', 2)
256
+ ls_db.recv_link_state_update _recv_lsu
257
+ # puts ls_db
258
+ # ls_db.all.each { |l| puts l.to_s_junos }
259
+ end
260
+
261
+ private
262
+
263
+ def _sent_lsu
264
+ s = %{
265
+ 0204 0154 0101 0101 0000 0000 0a90 0000
266
+ 0000 0000 0000 0000 0000 0006 0000 2201
267
+ 0202 0202 0202 0202 8000 0001 4fbf 0024
268
+ 0200 0001 0202 0202 ffff ffff 0300 000a
269
+ 0000 2201 0303 0303 0303 0303 8000 0001
270
+ d91f 0024 0200 0001 0303 0303 ffff ffff
271
+ 0300 0014 0000 2201 0000 0002 0000 0002
272
+ 8000 0001 0337 0030 0200 0002 0000 0003
273
+ c0a8 0501 0100 0002 c0a8 0500 ffff ff00
274
+ 0300 0002 0000 2201 0000 0001 0000 0001
275
+ 8000 0001 360c 0060 0200 0006 0000 0002
276
+ c0a8 0201 0100 0002 c0a8 0200 ffff ff00
277
+ 0300 0002 0000 0003 c0a8 0301 0100 0002
278
+ c0a8 0300 ffff ff00 0300 0002 0000 0004
279
+ c0a8 0401 0100 0002 c0a8 0400 ffff ff00
280
+ 0300 0002 0000 2201 0000 0003 0000 0003
281
+ 8000 0001 1f16 0030 0200 0002 0000 0004
282
+ c0a8 0601 0100 0002 c0a8 0600 ffff ff00
283
+ 0300 0002 0000 2201 0000 0005 0000 0005
284
+ 8000 0001 210e 0030 0200 0002 0000 0004
285
+ c0a8 0701 0100 0002 c0a8 0700 ffff ff00
286
+ 0300 0002
287
+ }.split.join
288
+ OspfPacket.factory([s].pack('H*'))
289
+
290
+ end
291
+
292
+ def _recv_lsu
293
+ s = %{
294
+ 0204 0154 c0a8 01c8 0000 0000 0482 0000
295
+ 0000 0000 0000 0000 0000 0006 0c6f 2201
296
+ 0202 0202 0202 0202 8000 006c 782b 0024
297
+ 0200 0001 0202 0202 ffff ffff 0300 000a
298
+ 0c6f 2201 0303 0303 0303 0303 8000 006c
299
+ 038a 0024 0200 0001 0303 0303 ffff ffff
300
+ 0300 0014 0c6f 2201 0000 0002 0000 0002
301
+ 8000 006c 2ca2 0030 0200 0002 0000 0003
302
+ c0a8 0501 0100 0002 c0a8 0500 ffff ff00
303
+ 0300 0002 0c6f 2201 0000 0001 0000 0001
304
+ 8000 006c 5f77 0060 0200 0006 0000 0002
305
+ c0a8 0201 0100 0002 c0a8 0200 ffff ff00
306
+ 0300 0002 0000 0003 c0a8 0301 0100 0002
307
+ c0a8 0300 ffff ff00 0300 0002 0000 0004
308
+ c0a8 0401 0100 0002 c0a8 0400 ffff ff00
309
+ 0300 0002 0c6f 2201 0000 0003 0000 0003
310
+ 8000 006c 4881 0030 0200 0002 0000 0004
311
+ c0a8 0601 0100 0002 c0a8 0600 ffff ff00
312
+ 0300 0002 0c6f 2201 0000 0005 0000 0005
313
+ 8000 006c 4a79 0030 0200 0002 0000 0004
314
+ c0a8 0701 0100 0002 c0a8 0700 ffff ff00
315
+ 0300 0002
316
+ }.split.join
317
+ OspfPacket.factory([s].pack('H*'))
318
+ end
319
+
320
+ end
321
+
322
+ __END__
323
+
324
+
325
+
326
+ OSPF Router with ID (1.1.1.1) (Process ID 1)
327
+
328
+ Router Link States (Area 0)
329
+
330
+ Link ID ADV Router Age Seq# Checksum Link count
331
+
332
+ Net Link States (Area 0)
333
+
334
+ Link ID ADV Router Age Seq# Checksum
335
+
336
+ Summary Net Link States (Area 0)
337
+
338
+ Link ID ADV Router Age Seq# Checksum
339
+
340
+ Summary ASB Link States (Area 0)
341
+
342
+ Link ID ADV Router Age Seq# Checksum
343
+
344
+ Type-5 AS External Link States
345
+
346
+ Link ID ADV Router Age Seq# Checksum Tag
347
+
348
+
349
+ R1#show ip ospf database
350
+
351
+ OSPF Router with ID (1.1.1.1) (Process ID 1)
352
+
353
+ Router Link States (Area 0)
354
+
355
+ Link ID ADV Router Age Seq# Checksum Link count
356
+ 0.0.0.1 0.0.0.1 10 0x80000003 0x00E88F 4
357
+ 0.1.0.1 0.1.0.1 10 0x80000003 0x00708C 8
358
+ 0.1.0.2 0.1.0.2 10 0x80000003 0x0082B1 9
359
+ 0.1.0.3 0.1.0.3 10 0x80000003 0x00FEFC 9
360
+ 0.1.0.4 0.1.0.4 10 0x80000003 0x00249F 9
361
+ 0.1.0.5 0.1.0.5 10 0x80000003 0x0004FD 6
362
+ 0.2.0.1 0.2.0.1 10 0x80000003 0x000142 6
363
+ 0.2.0.2 0.2.0.2 10 0x80000003 0x00454C 9
364
+ 0.2.0.3 0.2.0.3 10 0x80000003 0x0077C9 9
365
+ 0.2.0.4 0.2.0.4 10 0x80000003 0x00767A 9
366
+ 0.2.0.5 0.2.0.5 10 0x80000003 0x000988 6
367
+ 1.1.1.1 1.1.1.1 15 0x8000000F 0x00FAB6 5
368
+ 2.2.2.2 2.2.2.2 1130 0x80000007 0x00BF8F 2
369
+
370
+ Net Link States (Area 0)
371
+
372
+ Link ID ADV Router Age Seq# Checksum
373
+ 192.168.0.2 2.2.2.2 1130 0x80000006 0x000AAB
374
+
375
+ Summary Net Link States (Area 0)
376
+
377
+ Link ID ADV Router Age Seq# Checksum
378
+ 30.0.1.0 0.1.0.1 11 0x80000003 0x00E457
379
+ 30.0.2.0 0.1.0.1 11 0x80000003 0x00D961
380
+ 30.0.3.0 0.2.0.1 11 0x80000003 0x00C672
381
+ 30.0.4.0 0.2.0.1 11 0x80000003 0x00BB7C
382
+
383
+ Summary ASB Link States (Area 0)
384
+
385
+ Link ID ADV Router Age Seq# Checksum
386
+ 0.1.0.1 0.1.0.1 11 0x80000003 0x005305
387
+
388
+ Type-5 AS External Link States
389
+
390
+ Link ID ADV Router Age Seq# Checksum Tag
391
+ 50.0.1.0 0.1.0.1 11 0x80000003 0x009158 0
392
+ 50.0.2.0 0.1.0.1 11 0x80000003 0x008662 0
393
+ 50.0.3.0 0.1.0.1 11 0x80000003 0x007B6C 0
394
+ 50.0.4.0 0.1.0.1 11 0x80000003 0x007076 0
395
+ 50.0.5.0 0.1.0.1 11 0x80000003 0x006580 0
396
+ R1#
397
+
398
+
399
+ OSPF link state database, Area 0.0.0.0
400
+ Type ID Adv Rtr Seq Age Opt Cksum Len
401
+ Router 0.0.0.1 0.0.0.1 0x80000001 1419 0x22 0x1dbd 72
402
+ Router 0.1.0.1 0.1.0.1 0x80000001 1419 0x22 0x7954 84
403
+ Router 0.2.0.1 0.2.0.1 0x80000001 1419 0x22 0x9c61 60
404
+ Router 1.1.1.1 1.1.1.1 0x80000023 1371 0x22 0x3870 84
405
+ Router 2.2.2.2 2.2.2.2 0x8000000b 819 0x22 0xb793 48
406
+ Network 192.168.0.2 2.2.2.2 0x8000000a 819 0x22 0x02af 32
407
+ Summary 30.0.1.0 0.1.0.1 0x80000001 1419 0x00 0xe855 28
408
+ Summary 30.0.2.0 0.2.0.1 0x80000001 1419 0x00 0xd566 28
409
+ ASBRSum 0.1.0.1 0.1.0.1 0x80000001 1419 0x00 0x5703 28
410
+ Extern 50.0.1.0 0.1.0.1 0x80000001 1419 0x00 0x9556 48
411
+ Extern 50.0.2.0 0.1.0.1 0x80000001 1419 0x00 0x8a60 48
412
+
413
+ >>
414
+
415
+ TODO: ls_db.to_s_ios
416
+
417
+ R1#show ip ospf database
418
+
419
+ OSPF Router with ID (1.1.1.1) (Process ID 1)
420
+
421
+ Router Link States (Area 0)
422
+
423
+ Link ID ADV Router Age Seq# Checksum Link count
424
+ 0.0.0.1 0.0.0.1 1238 0x80000001 0x001DBD 4
425
+ 0.1.0.1 0.1.0.1 1238 0x80000001 0x007954 5
426
+ 0.2.0.1 0.2.0.1 1238 0x80000001 0x009C61 3
427
+ 1.1.1.1 1.1.1.1 1237 0x80000023 0x003870 5
428
+ 2.2.2.2 2.2.2.2 686 0x8000000B 0x00B793 2
429
+
430
+ Net Link States (Area 0)
431
+
432
+ Link ID ADV Router Age Seq# Checksum
433
+ 192.168.0.2 2.2.2.2 686 0x8000000A 0x0002AF
434
+
435
+ Summary Net Link States (Area 0)
436
+
437
+ Link ID ADV Router Age Seq# Checksum
438
+ 30.0.1.0 0.1.0.1 1238 0x80000001 0x00E855
439
+ 30.0.2.0 0.2.0.1 1238 0x80000001 0x00D566
440
+
441
+
442
+ R1#
443
+ R1#
444
+
@@ -0,0 +1,49 @@
1
+ require "test/unit"
2
+
3
+ require "ls_db/links"
4
+
5
+ class TestLsDbLinks < Test::Unit::TestCase
6
+ include OSPFv2::LSDB
7
+ def setup
8
+ Link.reset
9
+ end
10
+ def test_link_count
11
+ assert_equal 0, Link.count
12
+ assert link = Link.new
13
+ assert link = Link.new
14
+ assert link = Link.new
15
+ assert_equal 3, Link.count
16
+ assert_equal 3, Link.all.size
17
+ assert_equal [1,2,3], Link.ids
18
+ end
19
+ def test_base_addr
20
+ assert Link.base_ip_addr.is_a?(IPAddr)
21
+ assert_equal '13.0.0.0', Link.base_ip_addr.to_s
22
+ end
23
+ def test_new_from_hash
24
+ assert_equal '0.0.0.1', Link.new( :router_id=> 1, :neighbor_id=>2).to_hash[:router_id]
25
+ assert_equal '0.0.0.2', Link.new( :router_id=> 1, :neighbor_id=>2).to_hash[:neighbor_id]
26
+ assert_equal 10, Link.new( :metric => 10).to_hash[:metric]
27
+ assert_equal '10.0.0.0/24', Link.new( :prefix => '10.0.0.0/24').to_hash[:prefix]
28
+ end
29
+ def test_address
30
+ assert_equal '13.0.0.1/30', (l1 = Link.new).local_prefix
31
+ assert_equal '13.0.0.6/30', (l2 = Link.new).remote_prefix
32
+ end
33
+ def test_array_of_links
34
+ arr = (1..10).inject([]) { |arr,i| arr << Link.new(:metric=> i) }
35
+ assert_equal 10, arr.size
36
+ assert_equal 7, arr[6].metric.to_i
37
+ assert_equal '13.0.0.25/30', arr[6].local_prefix
38
+ assert_equal '13.0.0.26/30', arr[6].remote_prefix
39
+ assert_equal '13.0.0.25', arr[6].local_address
40
+ assert_equal '13.0.0.26', arr[6].remote_address
41
+ end
42
+ def test_find_by_id
43
+ arr = (1..2).inject([]) { |arr,i| arr << Link.new( :router_id=> 1, :neighbor_id=>2) }
44
+ arr = (2..3).inject([]) { |arr,i| arr << Link.new( :router_id=> 2, :neighbor_id=>3) }
45
+ arr = (3..4).inject([]) { |arr,i| arr << Link.new( :router_id=> 3, :neighbor_id=>4) }
46
+ # puts Link.all.values.join("\n")
47
+ assert_equal 2, Link.find_by_id('0.0.0.1').size
48
+ end
49
+ end