ospfv2 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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