ospfv2 0.0.1

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 (56) hide show
  1. data/bin/ospfv2 +136 -0
  2. data/lib/ie/au_type.rb +79 -0
  3. data/lib/ie/external_route.rb +181 -0
  4. data/lib/ie/id.rb +97 -0
  5. data/lib/ie/interface_mtu.rb +64 -0
  6. data/lib/ie/ls_age.rb +89 -0
  7. data/lib/ie/ls_type.rb +148 -0
  8. data/lib/ie/metric.rb +63 -0
  9. data/lib/ie/mt_metric.rb +119 -0
  10. data/lib/ie/options.rb +356 -0
  11. data/lib/ie/ospf_version.rb +67 -0
  12. data/lib/ie/packet_type.rb +65 -0
  13. data/lib/ie/router_link.rb +167 -0
  14. data/lib/ie/router_link_factory.rb +53 -0
  15. data/lib/ie/router_link_type.rb +86 -0
  16. data/lib/ie/sequence_number.rb +144 -0
  17. data/lib/ie/tos_metric.rb +102 -0
  18. data/lib/infra/ospf_common.rb +291 -0
  19. data/lib/infra/ospf_constants.rb +73 -0
  20. data/lib/infra/ospf_io.rb +133 -0
  21. data/lib/infra/ospf_socket.rb +126 -0
  22. data/lib/infra/parse_options.rb +135 -0
  23. data/lib/infra/timer.rb +104 -0
  24. data/lib/infra/to_s.rb +38 -0
  25. data/lib/ls_db/advertised_routers.rb +78 -0
  26. data/lib/ls_db/common.rb +31 -0
  27. data/lib/ls_db/link_state_database.rb +376 -0
  28. data/lib/ls_db/link_state_database_build.rb +181 -0
  29. data/lib/ls_db/link_state_database_links.rb +178 -0
  30. data/lib/ls_db/links.rb +160 -0
  31. data/lib/lsa/external.rb +347 -0
  32. data/lib/lsa/lsa.rb +438 -0
  33. data/lib/lsa/lsa_factory.rb +59 -0
  34. data/lib/lsa/network.rb +166 -0
  35. data/lib/lsa/router.rb +336 -0
  36. data/lib/lsa/summary.rb +393 -0
  37. data/lib/neighbor/neighbor.rb +298 -0
  38. data/lib/neighbor/neighbor_event_handler.rb +61 -0
  39. data/lib/neighbor/recv_database_description.rb +153 -0
  40. data/lib/neighbor/recv_hello.rb +53 -0
  41. data/lib/neighbor/recv_ospf_packet.rb +68 -0
  42. data/lib/neighbor_sm/attempt_state.rb +44 -0
  43. data/lib/neighbor_sm/down_state.rb +46 -0
  44. data/lib/neighbor_sm/exchange_state.rb +32 -0
  45. data/lib/neighbor_sm/exstart_state.rb +69 -0
  46. data/lib/neighbor_sm/full_state.rb +36 -0
  47. data/lib/neighbor_sm/init_state.rb +43 -0
  48. data/lib/neighbor_sm/loading_state.rb +33 -0
  49. data/lib/neighbor_sm/neighbor_state.rb +87 -0
  50. data/lib/packet/database_description.rb +300 -0
  51. data/lib/packet/hello.rb +327 -0
  52. data/lib/packet/link_state_ack.rb +144 -0
  53. data/lib/packet/link_state_request.rb +153 -0
  54. data/lib/packet/link_state_update.rb +189 -0
  55. data/lib/packet/ospf_packet.rb +306 -0
  56. metadata +116 -0
@@ -0,0 +1,189 @@
1
+ #--
2
+ # Copyright 2010 Jean-Michel Esnault.
3
+ # All rights reserved.
4
+ # See LICENSE.txt for permissions.
5
+ #
6
+ #
7
+ # This file is part of OSPFv2.
8
+ #
9
+ # OSPFv2 is free software: you can redistribute it and/or modify
10
+ # it under the terms of the GNU General Public License as published by
11
+ # the Free Software Foundation, either version 3 of the License, or
12
+ # (at your option) any later version.
13
+ #
14
+ # OSPFv2 is distributed in the hope that it will be useful,
15
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ # GNU General Public License for more details.
18
+ #
19
+ # You should have received a copy of the GNU General Public License
20
+ # along with OSPFv2. If not, see <http://www.gnu.org/licenses/>.
21
+ #++
22
+
23
+
24
+ =begin rdoc
25
+
26
+ A.3.5 The Link State Update packet
27
+
28
+ Link State Update packets are OSPF packet type 4. These packets
29
+ implement the flooding of LSAs. Each Link State Update packet
30
+ carries a collection of LSAs one hop further from their origin.
31
+ Several LSAs may be included in a single packet.
32
+
33
+ Link State Update packets are multicast on those physical networks
34
+ that support multicast/broadcast. In order to make the flooding
35
+ procedure reliable, flooded LSAs are acknowledged in Link State
36
+ Acknowledgment packets. If retransmission of certain LSAs is
37
+ necessary, the retransmitted LSAs are always sent directly to the
38
+ neighbor. For more information on the reliable flooding of LSAs,
39
+ consult Section 13.
40
+
41
+ 0 1 2 3
42
+ 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
43
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
44
+ | Version # | 4 | Packet length |
45
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
46
+ | Router ID |
47
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
48
+ | Area ID |
49
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
50
+ | Checksum | AuType |
51
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
52
+ | Authentication |
53
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
54
+ | Authentication |
55
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
56
+ | # LSAs |
57
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
58
+ | |
59
+ +- +-+
60
+ | LSAs |
61
+ +- +-+
62
+ | ... |
63
+
64
+
65
+ # LSAs
66
+ The number of LSAs included in this update.
67
+
68
+
69
+ The body of the Link State Update packet consists of a list of LSAs.
70
+ Each LSA begins with a common 20 byte header, described in Section
71
+ A.4.1. Detailed formats of the different types of LSAs are described
72
+ in Section A.4.
73
+
74
+
75
+ =end
76
+
77
+ require 'packet/ospf_packet'
78
+ require 'lsa/lsa'
79
+ require 'lsa/lsa_factory'
80
+ require 'packet/link_state_ack'
81
+ module OSPFv2
82
+
83
+ class LinkStateUpdate < OspfPacket
84
+
85
+ attr_reader :lsas
86
+
87
+ def initialize(_arg={})
88
+ arg = _arg.dup
89
+ @lsas=[]
90
+ if arg.is_a?(Hash)
91
+ arg.merge!({:packet_type=>4})
92
+ super arg
93
+ elsif arg.is_a?(String)
94
+ parse arg
95
+ elsif arg.is_a?(self)
96
+ parse arg.encode
97
+ else
98
+ raise ArgumentError, "Invalid argument", caller
99
+ end
100
+ end
101
+
102
+ def number_of_lsa
103
+ lsas.size
104
+ end
105
+
106
+ def encode
107
+ headers = []
108
+ headers << [lsas.size].pack('N')
109
+ headers << lsas.collect { |x| x.encode }.join
110
+ super headers.join
111
+ end
112
+
113
+ def parse(s)
114
+ n, lsas = super(s).unpack('Na*')
115
+ while lsas.size>0
116
+ len = lsas[18..19].unpack('n')[0]
117
+ lsa = lsas.slice!(0,len)
118
+ lsa = Lsa.factory lsa
119
+ if lsa
120
+ @lsas << lsa
121
+ else
122
+ puts "COULD NOT BUILD LSA OUT OF #{lsa.unpack('H*')}"
123
+ end
124
+ end
125
+ end
126
+
127
+ def [](val)
128
+ lsas[val]
129
+ end
130
+
131
+ # def to_s
132
+ # s = []
133
+ # s << super
134
+ # s << lsas.collect { |x| x.to_s_junos }.join("\n ")
135
+ # s.join("\n ")
136
+ # end
137
+
138
+ def to_s
139
+ s = []
140
+ s << super(:brief)
141
+ s << "\# LSAs #{@lsas.size}"
142
+ s << "Age Options Type Link-State ID Advr Router Sequence Checksum Length"
143
+ s << @lsas.collect { |x| x.to_s }.join("\n ")
144
+ s.join("\n ")
145
+ end
146
+
147
+
148
+ def each
149
+ lsas.each { |ls| yield ls }
150
+ end
151
+
152
+ def keys
153
+ lsas.collect { |ls| ls.key }
154
+ end
155
+
156
+ def ack_lsu(router_id)
157
+ ls_ack = LinkStateAck.new(:router_id => router_id, :area => area = @aread_id)
158
+ each { |lsa| ls_ack.lsa_headers << lsa }
159
+ ls_ack
160
+ end
161
+
162
+ class << self
163
+
164
+ def new_lsas(arg={})
165
+ lsus=[]
166
+ len=0
167
+ lsas = arg[:lsas]
168
+ arg.delete(:lsas)
169
+ lsu = new(arg)
170
+ lsas.flatten.compact.each do |lsa|
171
+ lsa_len = lsa.encode.size
172
+ if (len + lsa_len) > (1476-56-20)
173
+ lsus << lsu
174
+ lsu = new(arg)
175
+ len = 0
176
+ end
177
+ lsu.lsas << lsa
178
+ len += lsa_len
179
+ end
180
+ lsus << lsu
181
+ lsus
182
+ end
183
+ end
184
+
185
+ end
186
+
187
+ end
188
+
189
+ load "../../../test/ospfv2/packet/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
@@ -0,0 +1,306 @@
1
+ #--
2
+ # Copyright 2010 Jean-Michel Esnault.
3
+ # All rights reserved.
4
+ # See LICENSE.txt for permissions.
5
+ #
6
+ #
7
+ # This file is part of OSPFv2.
8
+ #
9
+ # OSPFv2 is free software: you can redistribute it and/or modify
10
+ # it under the terms of the GNU General Public License as published by
11
+ # the Free Software Foundation, either version 3 of the License, or
12
+ # (at your option) any later version.
13
+ #
14
+ # OSPFv2 is distributed in the hope that it will be useful,
15
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ # GNU General Public License for more details.
18
+ #
19
+ # You should have received a copy of the GNU General Public License
20
+ # along with OSPFv2. If not, see <http://www.gnu.org/licenses/>.
21
+ #++
22
+
23
+
24
+ =begin rdoc
25
+
26
+ http://www.ietf.org/rfc/rfc2328.txt
27
+
28
+ A.3.1 The OSPF packet header
29
+
30
+ Every OSPF packet starts with a standard 24 byte header. This
31
+ header contains all the information necessary to determine whether
32
+ the packet should be accepted for further processing. This
33
+ determination is described in Section 8.2 of the specification.
34
+
35
+
36
+ 0 1 2 3
37
+ 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
38
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
39
+ | Version # | Type | Packet length |
40
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
41
+ | Router ID |
42
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
43
+ | Area ID |
44
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
45
+ | Checksum | AuType |
46
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
47
+ | Authentication |
48
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
49
+ | Authentication |
50
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
51
+
52
+
53
+ Version #
54
+ The OSPF version number. This specification documents version 2
55
+ of the protocol.
56
+
57
+ Type
58
+ The OSPF packet types are as follows. See Sections A.3.2 through
59
+ A.3.6 for details.
60
+
61
+
62
+ Type Description
63
+ ________________________________
64
+ 1 Hello
65
+ 2 Database Description
66
+ 3 Link State Request
67
+ 4 Link State Update
68
+ 5 Link State Acknowledgment
69
+
70
+
71
+
72
+
73
+ Packet length
74
+ The length of the OSPF protocol packet in bytes. This length
75
+ includes the standard OSPF header.
76
+
77
+ Router ID
78
+ The Router ID of the packet's source.
79
+
80
+ Area ID
81
+ A 32 bit number identifying the area that this packet belongs
82
+ to. All OSPF packets are associated with a single area. Most
83
+ travel a single hop only. Packets travelling over a virtual
84
+ link are labelled with the backbone Area ID of 0.0.0.0.
85
+
86
+ Checksum
87
+ The standard IP checksum of the entire contents of the packet,
88
+ starting with the OSPF packet header but excluding the 64-bit
89
+ authentication field. This checksum is calculated as the 16-bit
90
+ one's complement of the one's complement sum of all the 16-bit
91
+ words in the packet, excepting the authentication field. If the
92
+ packet's length is not an integral number of 16-bit words, the
93
+ packet is padded with a byte of zero before checksumming. The
94
+ checksum is considered to be part of the packet authentication
95
+ procedure; for some authentication types the checksum
96
+ calculation is omitted.
97
+
98
+ AuType
99
+ Identifies the authentication procedure to be used for the
100
+ packet. Authentication is discussed in Appendix D of the
101
+ specification. Consult Appendix D for a list of the currently
102
+ defined authentication types.
103
+
104
+
105
+ Authentication
106
+ A 64-bit field for use by the authentication scheme. See
107
+ Appendix D for details.
108
+
109
+ =end
110
+
111
+
112
+ require 'infra/ospf_common'
113
+ require 'ie/id'
114
+ require 'ie/ospf_version'
115
+ require 'ie/packet_type'
116
+ require 'ie/au_type'
117
+
118
+ module OSPFv2
119
+
120
+ RouterId = Class.new(Id)
121
+ AreaId = Class.new(Id)
122
+
123
+ class OspfPacket
124
+ include OSPFv2
125
+ include OSPFv2::Common
126
+
127
+ attr_reader :area_id, :router_id, :version, :ospf_version, :packet_type, :au_type
128
+ attr_writer_delegate :area_id, :router_id, :packet_type, :au_type
129
+
130
+ def packet_name
131
+ self.class.to_s.split('::').last.to_underscore
132
+ end
133
+ alias :name :packet_name
134
+
135
+ def initialize(arg={})
136
+
137
+ if arg.is_a?(Hash)
138
+ @ospf_version = OspfVersion.new
139
+ @packet_type = PacketType.new
140
+ @area_id = AreaId.new
141
+ @router_id = RouterId.new
142
+ @au_type = AuType.new
143
+ @authentication=''
144
+ set(arg)
145
+ elsif arg.is_a?(String)
146
+ parse(arg)
147
+ else
148
+ raise ArgumentError, "Invalid argument", caller
149
+ end
150
+ end
151
+
152
+ def encode(payload='',router_id=@router_id)
153
+ @_len = 24 + payload.size
154
+ packet = @ospf_version.encode
155
+ packet << @packet_type.encode
156
+ packet << [24 + payload.size].pack('n')
157
+ packet << router_id.encode
158
+ packet << area_id.encode
159
+ packet << [0].pack('n')
160
+ packet << @au_type.encode
161
+ packet << [''].pack('a8')
162
+ packet << payload
163
+ packet[12..13]= self.csum = [checksum(packet)].pack('n')
164
+ packet
165
+ end
166
+
167
+ # Version 2, RouterId 0.0.0.1, AreaId 0.0.0.0, AuType 0, Checksum 0x9580, len 9999
168
+
169
+ def to_s_brief
170
+ encode unless @_len
171
+ "Version #{ospf_version.to_i}, RouterId #{router_id.to_ip}, AreaId #{area_id.to_ip}, Checksum #{0}, len #{@_len}"
172
+ end
173
+
174
+ def to_s_default(verbosity=:brief)
175
+ case verbosity
176
+ when :brief
177
+ to_s_brief
178
+ else
179
+ s=[]
180
+ s << self.class.to_s.split('::').last + ":"
181
+ s << ospf_version.to_s
182
+ s << packet_type.to_s
183
+ s << router_id.to_s
184
+ s << area_id.to_s
185
+ s << au_type.to_s
186
+ s << [@authentication].pack('a8')
187
+ s.join("\n ")
188
+ end
189
+ end
190
+
191
+ alias :to_s_junos :to_s_default
192
+ alias :to_s_junos_verbose :to_s_junos
193
+
194
+ def to_s(*args)
195
+ return to_s_default(*args) unless defined?($style)
196
+ case $style
197
+ when :junos ; to_s_junos(*args)
198
+ when :junos_verbose ; to_s_junos_verbose(*args)
199
+ else
200
+ to_s_default(*args)
201
+ end
202
+ end
203
+
204
+ def method_missing(method, *args, &block)
205
+ puts "Method missing in #{self.class}: method: #{method}"
206
+
207
+ if method == :to_s_junos
208
+ to_s_default(*args)
209
+ else
210
+ super
211
+ end
212
+ end
213
+
214
+ def to_hash(verbose=false)
215
+ #FIXME: verbose not working, i.e. always false
216
+ encode if verbose
217
+ h = super()
218
+ h.delete(:authentication) if @authentication==''
219
+ h.delete(:csum) unless verbose
220
+ h
221
+ end
222
+
223
+ private
224
+
225
+ def csum=(value)
226
+ raise if value.is_a?(Fixnum)
227
+ @_csum=value
228
+ end
229
+
230
+ def parse(s)
231
+ v, pt, len, rid, aid, csum, au_type, _, _, packet = s.unpack('CCnNNnnNNa*')
232
+ @ospf_version = OspfVersion.new(v)
233
+ @packet_type = PacketType.new(pt)
234
+ @router_id = RouterId.new(rid)
235
+ @area_id = AreaId.new(aid)
236
+ @au_type = AuType.new(au_type)
237
+ packet
238
+ end
239
+
240
+ def checksum(data)
241
+ data += "\000" if data.length % 2 >0
242
+ s = 0
243
+ data.unpack("n*").each { |x|
244
+ s += x
245
+ if s > 0xffff
246
+ carry = s >> 16
247
+ s &= 0xffff
248
+ s += carry
249
+ end
250
+ }
251
+ ((s >> 16) + (s & 0xffff)) ^ 0xffff
252
+ end
253
+ end
254
+
255
+ require 'packet/hello'
256
+ require 'packet/database_description'
257
+ require 'packet/link_state_update'
258
+ require 'packet/link_state_request'
259
+
260
+ class OspfPacket
261
+ include OSPFv2
262
+ include OSPFv2::Common
263
+
264
+ HELLO = 1
265
+ DATABASE_DESCRIPTION = 2
266
+ LINK_STATE_REQUEST = 3
267
+ LINK_STATE_UPDATE = 4
268
+ LINK_STATE_ACKNOWLEDGMENT = 5
269
+
270
+ class << self
271
+
272
+ def factory(arg)
273
+
274
+ if arg.is_a?(String)
275
+ s = arg.dup
276
+ version, type, len = s.unpack('CCn')
277
+
278
+ raise RuntimeError, "Bogus OSPF Version #{version}" unless version==2
279
+ case type
280
+ when HELLO ; Hello.new(s)
281
+ when DATABASE_DESCRIPTION ; DatabaseDescription.new(s)
282
+ when LINK_STATE_REQUEST ; LinkStateRequest.new(s)
283
+ when LINK_STATE_UPDATE ; LinkStateUpdate.new(s)
284
+ when LINK_STATE_ACKNOWLEDGMENT ; LinkStateAck.new(s)
285
+ else
286
+ raise RuntimeError, "unknown OSPFv2 packet type #{type}"
287
+ end
288
+
289
+ elsif arg.is_a?(Hash)
290
+ case arg[:packet_type]
291
+ when :hello ; Hello.new(arg)
292
+ when :dd ; DatabaseDescription.new(arg)
293
+ else
294
+ raise RuntimeError, "Cannot yet build this packet from hash #{arg[:packet_type]}"
295
+ end
296
+ end
297
+
298
+ end
299
+
300
+ end
301
+
302
+ end
303
+
304
+ end
305
+
306
+ load "../../../test/ospfv2/packet/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ospfv2
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Jean Michel Esnault
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-05-16 00:00:00 -07:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description:
22
+ email: jme@spidercloud.com
23
+ executables:
24
+ - ospfv2
25
+ extensions: []
26
+
27
+ extra_rdoc_files: []
28
+
29
+ files:
30
+ - lib/ie/au_type.rb
31
+ - lib/ie/external_route.rb
32
+ - lib/ie/id.rb
33
+ - lib/ie/interface_mtu.rb
34
+ - lib/ie/ls_age.rb
35
+ - lib/ie/ls_type.rb
36
+ - lib/ie/metric.rb
37
+ - lib/ie/mt_metric.rb
38
+ - lib/ie/options.rb
39
+ - lib/ie/ospf_version.rb
40
+ - lib/ie/packet_type.rb
41
+ - lib/ie/router_link.rb
42
+ - lib/ie/router_link_factory.rb
43
+ - lib/ie/router_link_type.rb
44
+ - lib/ie/sequence_number.rb
45
+ - lib/ie/tos_metric.rb
46
+ - lib/infra/ospf_common.rb
47
+ - lib/infra/ospf_constants.rb
48
+ - lib/infra/ospf_io.rb
49
+ - lib/infra/ospf_socket.rb
50
+ - lib/infra/parse_options.rb
51
+ - lib/infra/timer.rb
52
+ - lib/infra/to_s.rb
53
+ - lib/ls_db/advertised_routers.rb
54
+ - lib/ls_db/common.rb
55
+ - lib/ls_db/link_state_database.rb
56
+ - lib/ls_db/link_state_database_build.rb
57
+ - lib/ls_db/link_state_database_links.rb
58
+ - lib/ls_db/links.rb
59
+ - lib/lsa/external.rb
60
+ - lib/lsa/lsa.rb
61
+ - lib/lsa/lsa_factory.rb
62
+ - lib/lsa/network.rb
63
+ - lib/lsa/router.rb
64
+ - lib/lsa/summary.rb
65
+ - lib/neighbor/neighbor.rb
66
+ - lib/neighbor/neighbor_event_handler.rb
67
+ - lib/neighbor/recv_database_description.rb
68
+ - lib/neighbor/recv_hello.rb
69
+ - lib/neighbor/recv_ospf_packet.rb
70
+ - lib/neighbor_sm/attempt_state.rb
71
+ - lib/neighbor_sm/down_state.rb
72
+ - lib/neighbor_sm/exchange_state.rb
73
+ - lib/neighbor_sm/exstart_state.rb
74
+ - lib/neighbor_sm/full_state.rb
75
+ - lib/neighbor_sm/init_state.rb
76
+ - lib/neighbor_sm/loading_state.rb
77
+ - lib/neighbor_sm/neighbor_state.rb
78
+ - lib/packet/database_description.rb
79
+ - lib/packet/hello.rb
80
+ - lib/packet/link_state_ack.rb
81
+ - lib/packet/link_state_request.rb
82
+ - lib/packet/link_state_update.rb
83
+ - lib/packet/ospf_packet.rb
84
+ has_rdoc: true
85
+ homepage:
86
+ licenses: []
87
+
88
+ post_install_message:
89
+ rdoc_options: []
90
+
91
+ require_paths:
92
+ - lib
93
+ - lib
94
+ required_ruby_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ segments:
99
+ - 0
100
+ version: "0"
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ segments:
106
+ - 0
107
+ version: "0"
108
+ requirements: []
109
+
110
+ rubyforge_project:
111
+ rubygems_version: 1.3.6
112
+ signing_key:
113
+ specification_version: 3
114
+ summary: An OSPFv2 Emulator.
115
+ test_files: []
116
+