ospfv2 0.0.1 → 0.0.2

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.
@@ -30,14 +30,6 @@ class OspfVersion
30
30
  @ospf_version = 0
31
31
  end
32
32
  end
33
- def to_s
34
- case @ospf_version
35
- when 2 ; '2'
36
- when 3 ; '3'
37
- else
38
- 'unknown'
39
- end
40
- end
41
33
  def to_hash
42
34
  to_i
43
35
  end
@@ -30,10 +30,13 @@ module OSPFv2
30
30
 
31
31
  class RouterLink
32
32
  include Common
33
+ include CommonMetric
33
34
 
34
- LinkId = Class.new(Id)
35
- LinkData = Class.new(Id)
36
-
35
+ unless const_defined?(:LinkId)
36
+ LinkId = Class.new(Id)
37
+ LinkData = Class.new(Id)
38
+ end
39
+
37
40
  attr_reader :link_id, :link_data, :router_link_type, :metric, :mt_metrics
38
41
 
39
42
  attr_writer_delegate :link_id, :link_data, :router_link_type
@@ -79,7 +82,6 @@ module OSPFv2
79
82
  rlink.join
80
83
  end
81
84
 
82
- # TODO: if self.class is not RouterLink do not display RouterLinkType info....
83
85
  def to_s(ident=2)
84
86
  encode unless @router_link_type
85
87
  self.class.to_s.split('::').last + ":" +
@@ -118,23 +120,12 @@ module OSPFv2
118
120
  super arg
119
121
  end
120
122
  define_method(:to_hash) do
121
- super.merge :router_link_type => x
123
+ super().merge :router_link_type => x
122
124
  end
123
125
  end
124
126
  self.const_set(x.to_klass, klassname)
125
127
  }
126
128
 
127
- # FIXME: same as summary.rb ... mixin candidate
128
- def mt_metrics=(val)
129
- [val].flatten.each { |x| self << x }
130
- end
131
-
132
- def <<(metric)
133
- @mt_metrics ||=[]
134
- @mt_metrics << MtMetric.new(metric)
135
- self
136
- end
137
-
138
129
  def parse(s)
139
130
  @mt_metrics ||=[]
140
131
  link_id, link_data, router_link_type, ntos, metric, mt_metrics = s.unpack('NNCCna*')
@@ -148,20 +139,8 @@ module OSPFv2
148
139
  end
149
140
 
150
141
  end
151
- #
152
- # require 'pp'
153
- # h = {:router_link_type=>1, :metric=>1,:mt_metrics=>[{:id=>20, :metric=>33}, {:id=>255, :metric=>34}], :link_data=>"10.254.233.233",:link_id=>"2.2.2.2"}
154
- #
155
- # pp RouterLink.new(h)
156
- #
157
- # puts RouterLink.new(h)
158
- # puts RouterLink.new(h).to_shex
159
-
160
-
161
-
162
142
 
163
143
  end
164
144
 
165
145
 
166
-
167
146
  load "../../../test/ospfv2/ie/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
@@ -82,12 +82,17 @@ module OSPFv2
82
82
  self
83
83
  end
84
84
 
85
+ def incr(num=1)
86
+ seqn = (@seqn.unpack('i')[0]+num)
87
+ @seqn = [seqn].pack('I')
88
+ self
89
+ end
90
+
85
91
  def -(num)
86
92
  self.+(-num)
87
93
  end
88
94
 
89
95
  def encode
90
- #FIXME: unit-test and check if 'i' or 'I'
91
96
  [to_i].pack('N')
92
97
  end
93
98
 
@@ -100,16 +100,7 @@ class Object
100
100
  ""
101
101
  end
102
102
  end
103
- def method_missing(method, *args, &block)
104
- # puts "COMMON method_missing: #{method}"
105
103
 
106
- if method.to_s =~ /^to_s(\d+)/
107
- to_s($1.to_i)
108
- else
109
- # p caller
110
- super
111
- end
112
- end
113
104
  def define_to_s
114
105
  if defined?($style)
115
106
  self.class.class_eval { eval("alias :to_s :to_s_#{$style}") }
@@ -117,7 +108,7 @@ class Object
117
108
  self.class.class_eval { alias :to_s :to_s_default }
118
109
  else
119
110
  puts "You're screwed!"
120
- end
111
+ end
121
112
  end
122
113
  end
123
114
 
@@ -175,7 +166,7 @@ class IPAddr
175
166
  [to_s,mlen].join('/')
176
167
  end
177
168
 
178
- def IPAddr.to_ary(prefix)
169
+ def IPAddr.to_arr(prefix)
179
170
  source_address,mlen = prefix.split('/')
180
171
  ip = IPAddr.new(prefix)
181
172
  network = ip.to_s
@@ -200,8 +191,6 @@ class IPAddr
200
191
  Proc.new { |n| n*(2**(max_len - mlen)) }
201
192
  end
202
193
 
203
-
204
-
205
194
  end
206
195
 
207
196
 
@@ -23,14 +23,14 @@
23
23
  module OSPFv2
24
24
 
25
25
  module Constant
26
- V2=2
27
- V3=3
28
- HELLO = 1
29
- DATABASE_DESCRIPTION = 2
30
- LINK_STATE_REQUEST = 3
31
- LINK_STATE_UPDATE = 4
32
- LINK_STATE_ACKNOWLEDGEMENT = 5
33
- end
26
+ V2=2
27
+ V3=3
28
+ HELLO = 1
29
+ DATABASE_DESCRIPTION = 2
30
+ LINK_STATE_REQUEST = 3
31
+ LINK_STATE_UPDATE = 4
32
+ LINK_STATE_ACKNOWLEDGEMENT = 5
33
+ end
34
34
 
35
35
  VERSION=2
36
36
  LSRefreshTime = 30*60
data/lib/infra/ospf_io.rb CHANGED
@@ -120,7 +120,7 @@ module OSPFv2
120
120
  begin
121
121
  while @continue
122
122
  el = deq
123
- @sock.send *el
123
+ @sock.send(*el)
124
124
  end
125
125
  rescue => e
126
126
  p e
@@ -34,8 +34,7 @@ module OSPFv2
34
34
  def initialize(src, options={})
35
35
  @src = src
36
36
  @sock = Socket.open(Socket::PF_INET, Socket::SOCK_RAW, IPPROTO_OSPF)
37
- add_membership OSPFv2::AllSPFRouters
38
- add_membership OSPFv2::AllDRouters
37
+ @sock.setsockopt(::Socket::IPPROTO_IP, ::Socket::IP_MULTICAST_IF, IPAddr.new(src).hton)
39
38
  rescue Errno::EPERM
40
39
  $stderr.puts "#{e}: You are not root, cannot run: #{$0}!"
41
40
  exit(1)
@@ -50,25 +49,17 @@ module OSPFv2
50
49
  #TODO: use all_spf_routers, all_dr_routers, ...
51
50
  # 8.1 Sending protocol packets .............................. 58
52
51
 
53
- def send(packet, location={:to=> :all_spf_routers})
54
- case location
55
- when :all_spf_routers ; send_all_spf_routers(packet)
56
- when :all_dr_routers ; send_all_dr_routers(packet)
57
- else
58
- send_to(packet, location[:to])
59
- end
60
- end
61
52
 
62
53
  def send_all_spf_routers
63
- _send_ (packet.respond_to?(:encode) ? packet.encode : packet), 0, @sock_addr_all_spf_routers
54
+ _send_((packet.respond_to?(:encode) ? packet.encode : packet), 0, @sock_addr_all_spf_routers)
64
55
  end
65
56
 
66
57
  def send_all_dr_routers
67
- _send_ (packet.respond_to?(:encode) ? packet.encode : packet), 0, @send_all_dr_routers
58
+ _send_((packet.respond_to?(:encode) ? packet.encode : packet), 0, @send_all_dr_routers)
68
59
  end
69
60
 
70
61
  def send_to(packet, dest)
71
- _send_ (packet.respond_to?(:encode) ? packet.encode : packet), 0, Socket.pack_sockaddr_in(0, dest)
62
+ _send_((packet.respond_to?(:encode) ? packet.encode : packet), 0, Socket.pack_sockaddr_in(0, dest))
72
63
  end
73
64
 
74
65
  def send(packet, dest)
@@ -84,7 +75,6 @@ module OSPFv2
84
75
 
85
76
  def add_membership(group)
86
77
  @sock.setsockopt(Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, (IPAddr.new(group).hton + IPAddr.new(@src).hton))
87
- puts "*** ADDED #{group} membership to Send Socket ***"
88
78
  rescue Errno::EADDRNOTAVAIL
89
79
  end
90
80
 
@@ -100,8 +90,8 @@ module OSPFv2
100
90
  def initialize(src, options={})
101
91
  @src=src
102
92
  @sock = Socket.open(Socket::PF_INET, Socket::SOCK_RAW,89)
103
- add_membership OSPFv2::AllSPFRouters
104
- add_membership OSPFv2::AllDRouters
93
+ add_membership OSPFv2::AllSPFRouters, src
94
+ add_membership OSPFv2::AllDRouters, src
105
95
  end
106
96
  def recv(size=8192)
107
97
  begin
@@ -116,10 +106,12 @@ module OSPFv2
116
106
  begin ; @sock.close ; rescue ; end
117
107
  @sock=nil
118
108
  end
119
- def add_membership(group)
120
- @sock.setsockopt(Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, (IPAddr.new(group).hton + IPAddr.new(@src).hton))
121
- puts "*** ADDED #{group} membership to Recv Socket ***"
122
- rescue Errno::EADDRNOTAVAIL
109
+ def add_membership(group,src)
110
+ optval = IPAddr.new(group).hton + IPAddr.new(src).hton
111
+ @sock.setsockopt(Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, optval)
112
+ rescue Errno::EADDRNOTAVAIL => e
113
+ p e
114
+ raise
123
115
  end
124
116
  end
125
117
 
@@ -56,7 +56,7 @@ class OptParse
56
56
 
57
57
  to_ip = lambda { |id| [id].pack('N').unpack('C*').join('.') }
58
58
  to_id = lambda { |x| OSPFv2::Id.to_i(x) }
59
- dead_int = lambda { @dead_int || (options.hello_int * 4)}
59
+ dead_int = lambda { options.dead_int || (options.hello_int * 4) }
60
60
 
61
61
  option_help = "blabla ...."
62
62
  hlp_address = "IP Address of the OSPF Interface."
@@ -104,7 +104,7 @@ class OptParse
104
104
  options.hello_int = int.to_i
105
105
  }
106
106
  opts.on("--dead-interval [INT]", hlp_dead_int) { |int|
107
- @dead_int = int.to_i
107
+ options.dead_int = int.to_i
108
108
  }
109
109
  opts.on("-g", "--grid [colxrow]", hlp_grid) { |grid|
110
110
  options.grid = grid.split('x').collect { |x| x.to_i }
@@ -124,7 +124,7 @@ class OptParse
124
124
  end
125
125
 
126
126
  optparse.parse!(args)
127
- options.dead_int = @dead_int || (options.hello_int * 4)
127
+ options.dead_int ||= (options.hello_int * 4)
128
128
 
129
129
  options
130
130
 
data/lib/infra/timer.rb CHANGED
@@ -41,6 +41,7 @@ class Timer
41
41
  @interval = interval
42
42
  @code = block if block
43
43
  add_observer observer if observer
44
+ @_timer_thread_ = nil
44
45
  end
45
46
 
46
47
  def start _interval=@interval, &block
@@ -69,7 +70,7 @@ class Timer
69
70
 
70
71
  def reset &block
71
72
  cancel
72
- start &block
73
+ start(&block)
73
74
  end
74
75
 
75
76
  private
@@ -26,11 +26,10 @@ require 'ie/id'
26
26
  module OSPFv2::LSDB
27
27
  class AdvertisedRouters
28
28
  AdvertisedRouter = Class.new(OSPFv2::Id)
29
- attr_reader :routers
30
29
  def initialize
31
30
  @set = Set.new
32
31
  end
33
- def +(id)
32
+ def <<(id)
34
33
  @set << router_id(id)
35
34
  end
36
35
  def routers
@@ -40,6 +39,9 @@ module OSPFv2::LSDB
40
39
  def has?(id)
41
40
  routers.include?(router_id(id))
42
41
  end
42
+ def to_s
43
+ @set.collect { |r| IPAddr.new_ntoh([r].pack('N')).to_s }
44
+ end
43
45
  def -(id)
44
46
  @set.delete router_id(id)
45
47
  end
@@ -50,29 +52,29 @@ module OSPFv2::LSDB
50
52
  end
51
53
  end
52
54
 
53
- if __FILE__ == $0
54
-
55
- require "test/unit"
56
-
57
- # require "ls_db/advertised_routers"
58
-
59
- class TestLsDbAdvertisedRouters < Test::Unit::TestCase
60
- include OSPFv2::LSDB
61
- def tests
62
- assert AdvertisedRouters.new
63
- routers = AdvertisedRouters.new
64
- routers + 1
65
- routers + '0.0.0.1'
66
- routers + 2
67
- routers + OSPFv2::Id.new(3)
68
- assert_equal [1,2,3], routers.routers
69
- routers -1
70
- assert_equal [2,3], routers.routers
71
- routers -3
72
- assert_equal [2], routers.routers
73
- routers - '0.0.0.2'
74
- assert_equal [], routers.routers
75
- end
76
- end
77
-
78
- end
55
+ # if __FILE__ == $0
56
+ #
57
+ # require "test/unit"
58
+ #
59
+ # # require "ls_db/advertised_routers"
60
+ #
61
+ # class TestLsDbAdvertisedRouters < Test::Unit::TestCase
62
+ # include OSPFv2::LSDB
63
+ # def tests
64
+ # assert AdvertisedRouters.new
65
+ # routers = AdvertisedRouters.new
66
+ # routers + 1
67
+ # routers + '0.0.0.1'
68
+ # routers + 2
69
+ # routers + OSPFv2::Id.new(3)
70
+ # assert_equal [1,2,3], routers.routers
71
+ # routers -1
72
+ # assert_equal [2,3], routers.routers
73
+ # routers -3
74
+ # assert_equal [2], routers.routers
75
+ # routers - '0.0.0.2'
76
+ # assert_equal [], routers.routers
77
+ # end
78
+ # end
79
+ #
80
+ # end
@@ -77,8 +77,7 @@ require 'ls_db/advertised_routers'
77
77
  require 'infra/to_s'
78
78
 
79
79
  module OSPFv2
80
-
81
- module LSDB
80
+ module LSDB
82
81
 
83
82
  class LinkStateDatabase
84
83
  include OSPFv2
@@ -95,7 +94,7 @@ module OSPFv2
95
94
 
96
95
  def initialize(arg={})
97
96
  @ls_db = Hash.new
98
- @area_id = nil
97
+ @area_id = AreaId.new
99
98
  @advertised_routers= AdvertisedRouters.new
100
99
  @ls_refresh_interval=180
101
100
  @offset=0
@@ -210,12 +209,7 @@ module OSPFv2
210
209
  raise ArgumentError, "*** Invalid argument, #{args.inspect}"
211
210
  end
212
211
  end
213
-
214
-
215
- def refresh
216
- all.find_all {|l| l.refresh(ls_refresh_time) }
217
- end
218
-
212
+
219
213
  def reset
220
214
  each {|lsa| lsa.ack }
221
215
  @offset=0
@@ -261,10 +255,6 @@ module OSPFv2
261
255
  all.find_all { |l| ! l.ack? }
262
256
  end
263
257
 
264
- def method_missing(method, *args, &block)
265
- super
266
- end
267
-
268
258
  def refresh
269
259
  all.find_all {|l| l.refresh(advertised_routers, ls_refresh_time) }
270
260
  end
@@ -277,11 +267,16 @@ module OSPFv2
277
267
  def recv_link_state_update(link_state_update)
278
268
  link_state_update.each do |lsa|
279
269
  if advertised_routers.has?(lsa.advertising_router)
270
+ puts "RECEIVING FROM *OUR* #{lsa.advertising_router}"
280
271
  if @ls_db.key? lsa.key
272
+ puts "AND WE HAVE KEY #{lsa.key.inspect} ALREADY ...."
281
273
  @ls_db[lsa.key].force_refresh(lsa.sequence_number)
282
274
  else
275
+ puts "AND WE DO NOT HAVE KEY #{lsa.key.inspect}...."
283
276
  @ls_db.store(lsa.key,lsa)
277
+ puts "STORE KEY #{lsa.key.inspect}...."
284
278
  lsa.maxage
279
+ puts "MAXAGE IT #{lsa.key.inspect}...."
285
280
  end
286
281
  else
287
282
  if lsa.maxaged?
@@ -331,46 +326,9 @@ module OSPFv2
331
326
 
332
327
  end
333
328
 
334
- #
335
- # @ls_db = []
336
- # @ls_db << {
337
- # :sequence_number=>2147483650,
338
- # :advertising_router=>"1.2.0.0",
339
- # :ls_id=>"0.0.4.5",
340
- # :nwveb=>1,
341
- # :ls_type=>:router_lsa,
342
- # :options=> 0x21,
343
- # :ls_age=>10,
344
- # :links=>[
345
- # {
346
- # :link_id=>"1.1.1.1",
347
- # :link_data=>"255.255.255.255",
348
- # :router_link_type=>:point_to_point,
349
- # :metric=>11,
350
- # :mt_metrics=>[ {:id=>1, :metric=>11}, {:id=>2, :metric=>22} ]
351
- # },
352
- # {
353
- # :link_id=>"1.1.1.2",
354
- # :link_data=>"255.255.255.255",
355
- # :router_link_type=>:point_to_point,
356
- # :metric=>12,
357
- # :mt_metrics=>[]
358
- # }
359
- # ],
360
- # }
361
- #
362
- #
363
- # ls_db = LinkStateDatabase.new :area_id=> 1, :ls_db => @ls_db
364
- # puts ""
365
- # puts ls_db.to_s_junos
366
- #
367
-
368
-
369
-
370
329
  end
371
330
  end
372
331
 
373
332
  require 'ls_db/link_state_database_build'
374
333
 
375
334
  load "../../../test/ospfv2/ls_db/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
376
-