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