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