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
@@ -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=>:router_lsa,
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(:router_lsa, rid))
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=>:router_lsa,
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
@@ -193,12 +193,45 @@ module OSPFv2
193
193
  super
194
194
  end
195
195
 
196
- def to_s_default
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
@@ -124,16 +124,14 @@ length
124
124
 
125
125
  =end
126
126
 
127
- require 'infra/ospf_common'
128
- require 'infra/ospf_constants'
129
- require 'ie/id'
130
- require 'ie/ls_type'
131
- require 'ie/ls_age'
132
- require 'ie/sequence_number'
133
- require 'ie/options'
134
- require 'ls_db/advertised_routers'
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
- LsId = Class.new(Id)
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 to_s_default
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
- else
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
- include OSPFv2::TO_S
261
- alias :to_s_junos_verbose :to_s_junos
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 << [(@opaque_type << 24) + @opaque_id].pack('N')
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
- @opaque_id = ls_id >> 24
323
- @opaque_type = ls_id & 0xffffff
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
- # puts "&&&&& #{self.class}: method: #{method}"
401
- # p caller[0]
402
- if method == :to_s_junos
403
- :to_s_default
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
- super
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
@@ -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 :router_lsa ; OSPFv2::Router.new_hash(arg)
48
- when :network_lsa ; OSPFv2::Network.new_hash(arg)
49
- when :summary_lsa ; OSPFv2::Summary.new_hash(arg)
50
- when :asbr_summary_lsa ; OSPFv2::AsbrSummary.new_hash(arg)
51
- when :as_external_lsa ; OSPFv2::AsExternal.new_hash(arg)
52
- when :as_external7_lsa ; OSPFv2::AsExternal7.new_hash(arg)
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