ospfv2 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -69,7 +69,7 @@ module OSPFv2::LSDB
|
|
69
69
|
rlsa = OSPFv2::Lsa.factory \
|
70
70
|
:advertising_router=> router_id,
|
71
71
|
:ls_id=> router_id,
|
72
|
-
:ls_type=>:
|
72
|
+
:ls_type=>:router,
|
73
73
|
:options=> 0x22
|
74
74
|
|
75
75
|
advertised_routers << router_id
|
@@ -96,7 +96,7 @@ module OSPFv2::LSDB
|
|
96
96
|
|
97
97
|
|
98
98
|
def remove_adjacency(rid, neighbor_id, prefix)
|
99
|
-
if (rlsa = lookup(:
|
99
|
+
if (rlsa = lookup(:router, rid))
|
100
100
|
addr, source_address, plen, network, netmask = IPAddr.to_arr(prefix)
|
101
101
|
rlsa.delete(:point_to_point,id2ip(neighbor_id))
|
102
102
|
rlsa.delete(3,network)
|
@@ -136,7 +136,7 @@ module OSPFv2::LSDB
|
|
136
136
|
:advertising_router=> router_id,
|
137
137
|
:ls_id=> router_id,
|
138
138
|
:nwveb=>2,
|
139
|
-
:ls_type=>:
|
139
|
+
:ls_type=>:router,
|
140
140
|
:options=> 0x22
|
141
141
|
|
142
142
|
advertised_routers << router_id
|
@@ -26,6 +26,7 @@ require 'lsa/lsa'
|
|
26
26
|
|
27
27
|
module OSPFv2
|
28
28
|
|
29
|
+
#FIXME extend class Lsa instead...
|
29
30
|
|
30
31
|
class Lsa
|
31
32
|
def lsdb_link_id
|
@@ -49,10 +50,14 @@ module OSPFv2::LSDB
|
|
49
50
|
(row << 16) + col + base_rid
|
50
51
|
end
|
51
52
|
|
53
|
+
#FIXME: 9/24/2014 ???????
|
54
|
+
# check where this is used?
|
55
|
+
# should create an infinite loop?
|
52
56
|
def router_id(*args)
|
53
57
|
LinkStateDatabase.router_id(*args)
|
54
58
|
end
|
55
59
|
|
60
|
+
# FIXME: should be moved to base
|
56
61
|
# lsdb = LinkStateDatabase.create 10, 10, :prefix => '192.168.0.0/24'
|
57
62
|
# lsdb = LinkStateDatabase.create 10, 10, :prefix_base => '192.168.0.0/24', :router_id_base =>
|
58
63
|
def self.create(arg={})
|
@@ -138,11 +143,11 @@ module OSPFv2::LSDB
|
|
138
143
|
end
|
139
144
|
|
140
145
|
def link_refresh
|
141
|
-
|
146
|
+
#TODO implement link_refresh
|
142
147
|
end
|
143
148
|
|
144
149
|
def link_maxage
|
145
|
-
|
150
|
+
#TODO implement link_maxage
|
146
151
|
end
|
147
152
|
|
148
153
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module OSPFv2::LSDB
|
2
|
+
module Ios
|
3
|
+
def _to_s_hdr_ios
|
4
|
+
s=[]
|
5
|
+
s << ""
|
6
|
+
s << " OSPF Router with ID ()"
|
7
|
+
s
|
8
|
+
end
|
9
|
+
def _to_s_hdr_router_ios(verbose=false)
|
10
|
+
s=[]
|
11
|
+
s << ""
|
12
|
+
s << " Router Link States (Area #{area_id.to_i})"
|
13
|
+
s << ""
|
14
|
+
s << "Link ID ADV Router Age Seq# Checksum Link count" unless verbose
|
15
|
+
s
|
16
|
+
end
|
17
|
+
def _to_s_hdr_network_ios(verbose=false)
|
18
|
+
s=[]
|
19
|
+
s << ""
|
20
|
+
s << " Net Link States (Area #{area_id.to_i})"
|
21
|
+
s << ""
|
22
|
+
s << "Link ID ADV Router Age Seq# Checksum" unless verbose
|
23
|
+
s
|
24
|
+
end
|
25
|
+
def _to_s_hdr_summary_ios(verbose=false)
|
26
|
+
s=[]
|
27
|
+
s << ""
|
28
|
+
s << " Summary Net Link States (Area #{area_id.to_i})"
|
29
|
+
s << ""
|
30
|
+
s << "Link ID ADV Router Age Seq# Checksum" unless verbose
|
31
|
+
s
|
32
|
+
end
|
33
|
+
def _to_s_hdr_asbr_summary_ios(verbose=false)
|
34
|
+
s=[]
|
35
|
+
s << ""
|
36
|
+
s << " Summary ASB Link States (Area #{area_id.to_i})"
|
37
|
+
s << ""
|
38
|
+
s << "Link ID ADV Router Age Seq# Checksum" unless verbose
|
39
|
+
s
|
40
|
+
end
|
41
|
+
def _to_s_hdr_as_external_ios(verbose=false)
|
42
|
+
s=[]
|
43
|
+
s << ""
|
44
|
+
s << " Type-5 AS External States (Area #{area_id.to_i})"
|
45
|
+
s << ""
|
46
|
+
s << "Link ID ADV Router Age Seq# Checksum Tag" unless verbose
|
47
|
+
s
|
48
|
+
end
|
49
|
+
def _to_s_hdr_area_ios(verbose=false)
|
50
|
+
s=[]
|
51
|
+
s << ""
|
52
|
+
s << " Type-10 Opaque Link Area Link States (Area #{area_id.to_i})"
|
53
|
+
s << ""
|
54
|
+
s << "Link ID ADV Router Age Seq# Checksum Opaque ID" unless verbose
|
55
|
+
s
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
data/lib/lsa/external.rb
CHANGED
@@ -193,12 +193,45 @@ module OSPFv2
|
|
193
193
|
super
|
194
194
|
end
|
195
195
|
|
196
|
-
def
|
196
|
+
def to_s
|
197
|
+
super
|
198
|
+
end
|
199
|
+
|
200
|
+
# Network Mask: /24
|
201
|
+
# Metric Type: 1 (Comparable directly to link state metric)
|
202
|
+
# TOS: 0
|
203
|
+
# Metric: 0
|
204
|
+
# Forward Address: 0.0.0.0
|
205
|
+
# External Route Tag: 0
|
206
|
+
# Metric Type: 1 (Comparable directly to link state metric)
|
207
|
+
# TOS: 10
|
208
|
+
# Metric: 20
|
209
|
+
# Forward Address: 0.0.0.0
|
210
|
+
# External Route Tag: 10
|
211
|
+
|
212
|
+
def to_s_ios
|
213
|
+
super + external_route.tag.to_s
|
214
|
+
end
|
215
|
+
|
216
|
+
def to_s_ios_verbose
|
217
|
+
s = []
|
218
|
+
mt_metrics = self.mt_metrics.collect
|
219
|
+
s << super
|
220
|
+
s << "Network Mask: #{netmask}"
|
221
|
+
ext = []
|
222
|
+
ext << " #{external_route}"
|
223
|
+
ext << mt_metrics.collect { |x| x.to_s }
|
224
|
+
s << ext.join("\n ")
|
225
|
+
s.join("\n ")
|
226
|
+
end
|
227
|
+
|
228
|
+
|
229
|
+
def to_s_verbose
|
197
230
|
mt_metrics = self.mt_metrics.collect
|
198
231
|
super +
|
199
232
|
['',netmask, external_route, *mt_metrics ].collect { |x| x.to_s }.join("\n ")
|
200
233
|
end
|
201
|
-
|
234
|
+
|
202
235
|
def to_s_junos
|
203
236
|
super
|
204
237
|
end
|
data/lib/lsa/lsa.rb
CHANGED
@@ -124,16 +124,14 @@ length
|
|
124
124
|
|
125
125
|
=end
|
126
126
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
require 'infra/to_s'
|
127
|
+
require_relative '../infra/ospf_common'
|
128
|
+
require_relative '../infra/ospf_constants'
|
129
|
+
require_relative '../ie/id'
|
130
|
+
require_relative '../ie/ls_type'
|
131
|
+
require_relative '../ie/ls_age'
|
132
|
+
require_relative '../ie/sequence_number'
|
133
|
+
require_relative '../ie/options'
|
134
|
+
require_relative '../ls_db/advertised_routers'
|
137
135
|
|
138
136
|
module OSPFv2
|
139
137
|
|
@@ -141,12 +139,40 @@ module OSPFv2
|
|
141
139
|
include Comparable
|
142
140
|
|
143
141
|
unless const_defined?(:AdvertisingRouter)
|
144
|
-
AdvertisingRouter = Class.new(Id)
|
145
|
-
|
142
|
+
AdvertisingRouter = Class.new(Id) do
|
143
|
+
def to_s_ios
|
144
|
+
"Advertising Router: " + to_ip
|
145
|
+
end
|
146
|
+
end
|
147
|
+
LsId = Class.new(Id) do
|
148
|
+
def to_s_ios
|
149
|
+
"Link State ID: " + to_ip
|
150
|
+
end
|
151
|
+
end
|
146
152
|
LsAge = Class.new(LsAge)
|
147
153
|
MODX=4102
|
148
154
|
end
|
155
|
+
|
156
|
+
|
157
|
+
# 0 1 2 3
|
158
|
+
# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
159
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
160
|
+
# | LS age | Options | LS type |
|
161
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
162
|
+
# | Link State ID |
|
163
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
164
|
+
# | Advertising Router |
|
165
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
166
|
+
# | LS sequence number |
|
167
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
168
|
+
# | LS checksum | length |
|
169
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
170
|
+
#
|
171
|
+
class Header
|
172
|
+
end
|
173
|
+
|
149
174
|
|
175
|
+
#FIXME: need to generate Router, Network, .. LSAs.
|
150
176
|
class << self
|
151
177
|
def new_ntop(arg)
|
152
178
|
lsa = new
|
@@ -163,14 +189,17 @@ module OSPFv2
|
|
163
189
|
|
164
190
|
include OSPFv2::Common
|
165
191
|
include OSPFv2::Constant
|
166
|
-
|
167
|
-
# FIXME: when adding LSA in LSDB should be acked when init, rxmt otherwise ....
|
192
|
+
|
168
193
|
def ack
|
169
194
|
@_rxmt_=false
|
170
195
|
end
|
171
196
|
def retransmit
|
172
197
|
@_rxmt_=true
|
173
198
|
end
|
199
|
+
|
200
|
+
# returns
|
201
|
+
# true if lsa has been acked by neighbor
|
202
|
+
# false otherwise
|
174
203
|
def is_acked?
|
175
204
|
@_rxmt_ == false
|
176
205
|
end
|
@@ -181,24 +210,34 @@ module OSPFv2
|
|
181
210
|
attr_reader :ls_id
|
182
211
|
attr_reader :advertising_router
|
183
212
|
attr_reader :sequence_number
|
213
|
+
attr_reader :opaque_id, :opaque_type
|
184
214
|
|
185
|
-
attr_writer_delegate :advertising_router, :ls_id, :ls_age
|
215
|
+
attr_writer_delegate :advertising_router, :ls_id, :ls_age, :opaque_id, :opaque_type
|
216
|
+
|
217
|
+
LsType.all.each do |type|
|
218
|
+
define_method("#{type}?") do
|
219
|
+
type == LsType.to_sym(@ls_type.to_i)
|
220
|
+
end
|
221
|
+
end
|
186
222
|
|
187
223
|
def initialize(arg={})
|
188
224
|
arg = arg.dup
|
225
|
+
|
189
226
|
@ls_age = LsAge.new
|
190
227
|
@sequence_number = SequenceNumber.new
|
191
228
|
@options = Options.new
|
192
229
|
@ls_id = LsId.new
|
230
|
+
@ls_id = nil
|
231
|
+
if is_opaque?
|
232
|
+
@opaque_id = OpaqueId.new
|
233
|
+
@opaque_type = OpaqueType.new
|
234
|
+
else
|
235
|
+
@ls_id=LsId.new
|
236
|
+
end
|
193
237
|
@advertising_router = AdvertisingRouter.new
|
194
238
|
@_length = 0
|
195
239
|
@_rxmt_ = false
|
196
240
|
|
197
|
-
# unless @ls_type
|
198
|
-
# # raise if caller[-2].grep(/test\/unit/).empty?
|
199
|
-
# @ls_type = LsType.new(1)
|
200
|
-
# end
|
201
|
-
|
202
241
|
if arg.is_a?(Hash)
|
203
242
|
set arg
|
204
243
|
elsif arg.is_a?(String)
|
@@ -219,15 +258,58 @@ module OSPFv2
|
|
219
258
|
@sequence_number = SequenceNumber.new(seqn)
|
220
259
|
end
|
221
260
|
|
222
|
-
def
|
261
|
+
def to_s_ios
|
262
|
+
sprintf("%-15.15s %-15.15s %-4.0d 0x%8.8X 0x%6.6X ",
|
263
|
+
is_opaque? ? ls_id = Id.new_ntoh(@opaque_type.encode + @opaque_id.encode).to_ip : self.ls_id.to_ip,
|
264
|
+
advertising_router.to_ip,
|
265
|
+
ls_age.to_i,
|
266
|
+
seqn.to_I,
|
267
|
+
csum_to_i)
|
268
|
+
end
|
269
|
+
|
270
|
+
def to_s
|
223
271
|
len = encode.size
|
224
272
|
if is_opaque?
|
225
|
-
|
273
|
+
ls_id = Id.new_ntoh(@opaque_type.encode + @opaque_id.encode)
|
226
274
|
sprintf("%-4.0d 0x%2.2x %-8s %-15.15s %-15.15s 0x%8.8x 0x%4.4x %-7d",
|
227
275
|
ls_age.to_i, options.to_i, ls_type.to_s_short, ls_id.to_ip, advertising_router.to_ip, seqn.to_I,csum_to_i,len)
|
276
|
+
else
|
277
|
+
sprintf("%-4.0d 0x%2.2x %-8s %-15.15s %-15.15s 0x%8.8x 0x%4.4x %-7d",
|
278
|
+
ls_age.to_i, options.to_i, ls_type.to_s_short, self.ls_id.to_ip, advertising_router.to_ip, seqn.to_I,csum_to_i,len)
|
279
|
+
end
|
280
|
+
end
|
281
|
+
alias :to_s_dd :to_s
|
282
|
+
|
283
|
+
# LS age: 44
|
284
|
+
# Options: (No TOS-capability, No DC)
|
285
|
+
# LS Type: Opaque Area Link
|
286
|
+
# Link State ID: 1.0.0.0
|
287
|
+
# Opaque Type: 1
|
288
|
+
# Opaque ID: 0
|
289
|
+
# Advertising Router: 0.0.0.3
|
290
|
+
# LS Seq Number: 80000001
|
291
|
+
# Checksum: 0xD12
|
292
|
+
# Length: 116
|
293
|
+
# Fragment number : 0
|
294
|
+
def to_s_ios_verbose
|
295
|
+
len = encode.size
|
296
|
+
s = []
|
297
|
+
s << ''
|
298
|
+
s << ls_age.to_s_ios
|
299
|
+
s << options.to_s_ios
|
300
|
+
s << ls_type.to_s_ios
|
301
|
+
if is_opaque?
|
302
|
+
s << "Opaque Type: #{opaque_type.to_i}"
|
303
|
+
s << "Opaque ID: #{opaque_id.to_i}"
|
304
|
+
else
|
305
|
+
s << "#{ls_id.to_s_ios} #{summary? ? "(summary Network Number)" : ''}"
|
228
306
|
end
|
307
|
+
s << advertising_router.to_s_ios
|
308
|
+
s << sequence_number.to_s_ios
|
309
|
+
s << "Checksum: #{format "0x%4X", csum_to_i}" if @_csum
|
310
|
+
s << "Length: #{len}"
|
311
|
+
s.join("\n ")
|
229
312
|
end
|
230
|
-
alias :to_s_dd :to_s_default
|
231
313
|
|
232
314
|
def to_s_verbose
|
233
315
|
len = encode.size
|
@@ -257,8 +339,10 @@ module OSPFv2
|
|
257
339
|
sprintf("%-7s %-1.1s%-15.15s %-15.15s 0x%8.8x %4.0d 0x%2.2x 0x%4.4x %3d", ls_type.to_junos, '', ls_id.to_ip, advertising_router.to_ip, seqn.to_I, ls_age.to_i, options.to_i, csum_to_i, len)
|
258
340
|
end
|
259
341
|
end
|
260
|
-
|
261
|
-
|
342
|
+
|
343
|
+
def to_s_junos_verbose
|
344
|
+
to_s_junos
|
345
|
+
end
|
262
346
|
|
263
347
|
def is_opaque?
|
264
348
|
ls_type.is_opaque?
|
@@ -270,7 +354,8 @@ module OSPFv2
|
|
270
354
|
header << [options.to_i].pack('C')
|
271
355
|
header << ls_type.encode
|
272
356
|
if is_opaque?
|
273
|
-
header <<
|
357
|
+
header << @opaque_type.encode
|
358
|
+
header << @opaque_id.encode
|
274
359
|
else
|
275
360
|
header << ls_id.encode
|
276
361
|
end
|
@@ -319,8 +404,8 @@ module OSPFv2
|
|
319
404
|
@sequence_number = SequenceNumber.new seqn
|
320
405
|
@advertising_router = AdvertisingRouter.new advr
|
321
406
|
if is_opaque?
|
322
|
-
@
|
323
|
-
@
|
407
|
+
@opaque_type = OpaqueType.new(ls_id>>24)
|
408
|
+
@opaque_id = OpaqueId.new(ls_id & 0xffffff)
|
324
409
|
else
|
325
410
|
@ls_id = LsId.new ls_id
|
326
411
|
end
|
@@ -381,6 +466,14 @@ module OSPFv2
|
|
381
466
|
self
|
382
467
|
end
|
383
468
|
|
469
|
+
def refresh2(advertised_routers, age)
|
470
|
+
return unless advertised_routers.has?(advertising_router)
|
471
|
+
@sequence_number.incr
|
472
|
+
@ls_age = LsAge.new(age)
|
473
|
+
retransmit
|
474
|
+
self
|
475
|
+
end
|
476
|
+
|
384
477
|
def maxage
|
385
478
|
ls_age.maxage and retransmit
|
386
479
|
self
|
@@ -397,12 +490,14 @@ module OSPFv2
|
|
397
490
|
end
|
398
491
|
|
399
492
|
def method_missing(method, *args, &block)
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
493
|
+
if method.to_s =~ /^to_s_(ios|junos)_verbose/
|
494
|
+
p " #{self.class}: #{method} IS MISSING!!! defaulting to :to_s_verbose"
|
495
|
+
__send__ :to_s_verbose, *args, &block
|
496
|
+
elsif method.to_s =~ /^to_s_(ios|junos)$/
|
497
|
+
p $1
|
498
|
+
__send__ :to_s, *args, &block
|
404
499
|
else
|
405
|
-
|
500
|
+
raise "missing: #{method} #{caller[0..2]}"
|
406
501
|
end
|
407
502
|
end
|
408
503
|
|
@@ -472,5 +567,3 @@ module OSPFv2
|
|
472
567
|
end
|
473
568
|
|
474
569
|
end
|
475
|
-
|
476
|
-
load "../../../test/ospfv2/lsa/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|
data/lib/lsa/lsa_factory.rb
CHANGED
@@ -25,6 +25,7 @@ require 'lsa/router'
|
|
25
25
|
require 'lsa/network'
|
26
26
|
require 'lsa/summary'
|
27
27
|
require 'lsa/external'
|
28
|
+
# require 'lsa/traffic_engineering'
|
28
29
|
|
29
30
|
module OSPFv2
|
30
31
|
class Lsa
|
@@ -39,17 +40,30 @@ module OSPFv2
|
|
39
40
|
when 4 ; OSPFv2::AsbrSummary.new_ntop(arg)
|
40
41
|
when 5 ; OSPFv2::AsExternal.new_ntop(arg)
|
41
42
|
when 7 ; OSPFv2::AsExternal7.new_ntop(arg)
|
43
|
+
when 9,10,11
|
44
|
+
_, opaque_type = arg.unpack('NC')
|
45
|
+
case opaque_type
|
46
|
+
when 1
|
47
|
+
OSPFv2::TrafficEngineering.new_ntop(arg)
|
48
|
+
end
|
42
49
|
else
|
43
50
|
raise
|
44
51
|
end
|
45
52
|
elsif arg.is_a?(Hash)
|
46
53
|
case arg[:ls_type]
|
47
|
-
when :
|
48
|
-
when :
|
49
|
-
when :
|
50
|
-
when :
|
51
|
-
when :
|
52
|
-
when :
|
54
|
+
when :router ; OSPFv2::Router.new_hash(arg)
|
55
|
+
when :network ; OSPFv2::Network.new_hash(arg)
|
56
|
+
when :summary ; OSPFv2::Summary.new_hash(arg)
|
57
|
+
when :asbr_summary ; OSPFv2::AsbrSummary.new_hash(arg)
|
58
|
+
when :as_external ; OSPFv2::AsExternal.new_hash(arg)
|
59
|
+
when :as_external7 ; OSPFv2::AsExternal7.new_hash(arg)
|
60
|
+
when :area, :link_local, :domain
|
61
|
+
case arg[:opaque_type]
|
62
|
+
when 1, :te_lsa
|
63
|
+
OSPFv2::TrafficEngineering.new_hash(arg)
|
64
|
+
else
|
65
|
+
raise
|
66
|
+
end
|
53
67
|
else
|
54
68
|
raise
|
55
69
|
end
|
@@ -59,5 +73,4 @@ module OSPFv2
|
|
59
73
|
end
|
60
74
|
end
|
61
75
|
end
|
62
|
-
|
63
76
|
end
|