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
@@ -20,13 +20,15 @@
20
20
  # along with OSPFv2. If not, see <http://www.gnu.org/licenses/>.
21
21
  #++
22
22
 
23
- require 'infra/ospf_constants'
23
+ require_relative 'ie'
24
+ require_relative '../infra/ospf_constants'
24
25
 
25
26
  module OSPFv2
26
27
 
27
28
  class SequenceNumber
28
29
  include OSPFv2
29
30
  include Comparable
31
+ include IE
30
32
 
31
33
  def SequenceNumber.initial
32
34
  [N + 1].pack('I').unpack('i')[0]
@@ -76,6 +78,10 @@ module OSPFv2
76
78
  "0x"+ sprintf("%08.8x", to_I)
77
79
  end
78
80
 
81
+ def to_s_ios
82
+ "LS Seq Number: " + sprintf("%08.8x", to_I)
83
+ end
84
+
79
85
  def +(num)
80
86
  seqn = (@seqn.unpack('i')[0]+num)
81
87
  @seqn = [seqn].pack('I')
@@ -104,8 +110,6 @@ module OSPFv2
104
110
 
105
111
  end
106
112
 
107
- load "../../../test/ospfv2/ie/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
108
-
109
113
  __END__
110
114
 
111
115
 
@@ -80,7 +80,6 @@ class Symbol
80
80
  end
81
81
  end
82
82
 
83
-
84
83
  class Object
85
84
  def to_shex(*args)
86
85
  self.respond_to?(:encode) ? self.encode(*args).unpack('H*')[0] : ""
@@ -100,16 +99,6 @@ class Object
100
99
  ""
101
100
  end
102
101
  end
103
-
104
- def define_to_s
105
- if defined?($style)
106
- self.class.class_eval { eval("alias :to_s :to_s_#{$style}") }
107
- elsif respond_to?(:to_s_default)
108
- self.class.class_eval { alias :to_s :to_s_default }
109
- else
110
- puts "You're screwed!"
111
- end
112
- end
113
102
  end
114
103
 
115
104
  class Time
@@ -253,7 +242,7 @@ module OSPFv2
253
242
  # p ivar
254
243
  h.store(key,ivar.to_hash)
255
244
  elsif ivar.is_a?(Array)
256
- h.store(key, ivar.collect { |x| x.to_hash })
245
+ h.store(key, ivar.collect { |x| x.respond_to?(:to_hash) ? x.to_hash : x })
257
246
  else
258
247
  # p "#{key} don't respond to hast"
259
248
  # p ivar
@@ -5,12 +5,12 @@
5
5
  #
6
6
  #
7
7
  # This file is part of OSPFv2.
8
- #
8
+ #
9
9
  # OSPFv2 is free software: you can redistribute it and/or modify
10
10
  # it under the terms of the GNU General Public License as published by
11
11
  # the Free Software Foundation, either version 3 of the License, or
12
12
  # (at your option) any later version.
13
- #
13
+ #
14
14
  # OSPFv2 is distributed in the hope that it will be useful,
15
15
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
16
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
@@ -24,6 +24,9 @@
24
24
  require 'observer'
25
25
  require 'thread'
26
26
 
27
+ Thread.abort_on_exception = true
28
+
29
+
27
30
  module OSPFv2
28
31
 
29
32
  class Input
@@ -40,7 +43,7 @@ module OSPFv2
40
43
  end
41
44
 
42
45
  attr_reader :thread
43
-
46
+
44
47
  def our_address
45
48
  @neighbor.address
46
49
  end
@@ -52,13 +55,15 @@ module OSPFv2
52
55
  end
53
56
 
54
57
  def start
58
+
55
59
  @thread = Thread.new(@sock) do |s|
56
60
  Thread.current['name'] = self.class.to_s
57
61
  begin
58
62
  while @continue
59
63
  from, port, data = s.recv
60
64
  hdr = header(data)
61
- if hdr[:ip_proto] == 89 and data[20] == 2
65
+
66
+ if hdr[:ip_proto] == 89 and (data[20] == 2 or data[20] == "\x02")
62
67
  if from != our_address
63
68
  changed and notify_observers(:ev_recv, data, from, port) # * @sock.recv ....
64
69
  end
@@ -71,11 +76,11 @@ module OSPFv2
71
76
  end
72
77
 
73
78
  private
74
-
79
+
75
80
 
76
81
  def long2ip(ip)
77
82
  return ip if ip.is_a?(String)
78
- [ip].pack('N').unpack('CCCC').collect {|c| c}.join('.')
83
+ [ip].pack('N').unpack('CCCC').collect {|c| c}.join('.')
79
84
  end
80
85
  def header(_h)
81
86
  h = _h.unpack('CCnnnCCnNN')
@@ -93,7 +98,7 @@ module OSPFv2
93
98
  :ip_dst => long2ip(h[9]),
94
99
  }
95
100
  end
96
-
101
+
97
102
  end
98
103
 
99
104
  class OutputQ < Queue
@@ -118,9 +123,10 @@ module OSPFv2
118
123
  @thread = Thread.new(@sock) do |s|
119
124
  Thread.current['name'] = self.class.to_s
120
125
  begin
121
- while @continue
126
+ while @continue
122
127
  el = deq
123
128
  @sock.send(*el)
129
+ Thread.pass
124
130
  end
125
131
  rescue => e
126
132
  p e
@@ -5,12 +5,12 @@
5
5
  #
6
6
  #
7
7
  # This file is part of OSPFv2.
8
- #
8
+ #
9
9
  # OSPFv2 is free software: you can redistribute it and/or modify
10
10
  # it under the terms of the GNU General Public License as published by
11
11
  # the Free Software Foundation, either version 3 of the License, or
12
12
  # (at your option) any later version.
13
- #
13
+ #
14
14
  # OSPFv2 is distributed in the hope that it will be useful,
15
15
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
16
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
@@ -28,9 +28,9 @@ require 'infra/ospf_constants'
28
28
  module OSPFv2
29
29
 
30
30
  class SendSocket
31
-
31
+
32
32
  attr_reader :sock
33
-
33
+
34
34
  def initialize(src, options={})
35
35
  @src = src
36
36
  @sock = Socket.open(Socket::PF_INET, Socket::SOCK_RAW, IPPROTO_OSPF)
@@ -45,34 +45,34 @@ module OSPFv2
45
45
  STDERR.puts "#{e} Cannot Open Socket!"
46
46
  exit(1)
47
47
  end
48
-
48
+
49
49
  #TODO: use all_spf_routers, all_dr_routers, ...
50
50
  # 8.1 Sending protocol packets .............................. 58
51
-
52
-
51
+
52
+
53
53
  def send_all_spf_routers
54
54
  _send_((packet.respond_to?(:encode) ? packet.encode : packet), 0, @sock_addr_all_spf_routers)
55
55
  end
56
-
56
+
57
57
  def send_all_dr_routers
58
58
  _send_((packet.respond_to?(:encode) ? packet.encode : packet), 0, @send_all_dr_routers)
59
59
  end
60
-
60
+
61
61
  def send_to(packet, dest)
62
62
  _send_((packet.respond_to?(:encode) ? packet.encode : packet), 0, Socket.pack_sockaddr_in(0, dest))
63
63
  end
64
-
64
+
65
65
  def send(packet, dest)
66
66
  addr = Socket.pack_sockaddr_in(0, dest)
67
67
  @sock.send((packet.respond_to?(:encode) ? packet.encode : packet),0,addr)
68
68
  end
69
-
69
+
70
70
  def close
71
71
  @sock.close unless @sock.closed?
72
72
  end
73
-
73
+
74
74
  private
75
-
75
+
76
76
  def add_membership(group)
77
77
  @sock.setsockopt(Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, (IPAddr.new(group).hton + IPAddr.new(@src).hton))
78
78
  rescue Errno::EADDRNOTAVAIL
@@ -82,7 +82,7 @@ module OSPFv2
82
82
  @sock.send(bits,0,addr)
83
83
  end
84
84
  end
85
-
85
+
86
86
  class RecvSocket
87
87
  require 'socket'
88
88
  require 'ipaddr'
@@ -26,8 +26,15 @@ require 'ostruct'
26
26
  require 'ie/id'
27
27
 
28
28
  class OptParse
29
+
30
+ def self.pry_installed?
31
+ require 'pry'
32
+ rescue LoadError
33
+ false
34
+ end
35
+
29
36
  def self.parse(args)
30
-
37
+
31
38
  options = OpenStruct.new
32
39
  options.ipaddr = '192.168.1.123'
33
40
  options.network = '192.168.1.0'
@@ -40,8 +47,12 @@ class OptParse
40
47
  options.area_id = 0
41
48
  options.log_fname = $stdout
42
49
  options.grid = [2,2]
43
- options.num_sum = 10
44
- options.num_ext = 10
50
+ options.num_sum = 3
51
+ options.num_ext = 3
52
+ options.ls_refresh_time = 2000
53
+ options.ls_refresh_interval = 180
54
+ options.console = :irb
55
+ options.network_type = :broadcast
45
56
 
46
57
  options.parse = Proc.new do |filename|
47
58
  y_conf = YAML::load_file(filename)
@@ -59,25 +70,26 @@ class OptParse
59
70
  dead_int = lambda { options.dead_int || (options.hello_int * 4) }
60
71
 
61
72
  option_help = "blabla ...."
62
- hlp_address = "IP Address of the OSPF Interface."
63
- hlp_base_link_addr = "base p2p links addres [#{options.base_link_addr}]"
64
- hlp_base_router_id = "base router-id [#{to_ip.call(options.base_router_id)}]"
65
- hlp_neighbor_id= "Neighbor Id. [#{to_ip.call(options.neighbor_id)}]"
66
- hlp_router_id = "Router Id. [#{to_ip.call(options.router_id)}]"
67
- hlp_area_id = "Area Id. [#{to_ip.call(options.area_id)}]"
68
- hlp_grid = "Area Grid. [#{options.grid.join('x')}]"
69
- hlp_hello_int = "Hello Int. [#{options.hello_int}]"
70
- hlp_dead_int = "Dead Int. [#{dead_int.call}]"
71
- hlp_sum = "\#Summary. [#{options.num_sum}]"
72
- hlp_ext = "\#External. [#{options.num_ext}]"
73
+ hlp_address = "IP Address of the OSPF Interface."
74
+ hlp_base_link_addr= "base p2p links address Default: #{options.base_link_addr}"
75
+ hlp_base_router_id = "base router-id Default: #{to_ip.call(options.base_router_id)}"
76
+ hlp_neighbor_id= "Neighbor Id. Default: #{to_ip.call(options.neighbor_id)}"
77
+ hlp_router_id = "Router Id. Default: #{to_ip.call(options.router_id)}"
78
+ hlp_area_id = "Area Id. Default: #{to_ip.call(options.area_id)}"
79
+ hlp_grid = "Area Grid. Default: #{options.grid.join('x')}"
80
+ hlp_hello_int = "Hello Int. Default: #{options.hello_int}"
81
+ hlp_dead_int = "Dead Int. Default: #{dead_int.call}"
82
+ hlp_sum = "Number of Summary LSA Default: #{options.num_sum}"
83
+ hlp_ext = "Number AsExternal Default: #{options.num_ext}"
84
+ hlp_ls_refresh_time = "LS Refresh Time Default: #{options.ls_refresh_time}"
85
+ hlp_ls_refresh_interval = "LS Refresh Interval Default: #{options.ls_refresh_interval}"
73
86
 
74
87
  optparse = OptionParser.new do |opts|
75
88
 
76
89
  opts.banner = "Usage: #{$0} [options]"
77
90
 
78
- opts.on( "--base-p2p-addr [PREFIX]", hlp_base_link_addr) { |x|
79
- options.base_link_addr = x
80
- }
91
+ opts.separator ""
92
+ opts.separator "Neighbor:"
81
93
  opts.on("-i", "--address [PREFIX]", hlp_address) { |x|
82
94
  options.ipaddr = x
83
95
  options.ipaddr = x.split('/')[0]
@@ -85,9 +97,6 @@ class OptParse
85
97
  options.network = _addr.to_s
86
98
  options.netmask = _addr.netmask
87
99
  }
88
- opts.on("--base-router-id [ID]", hlp_base_router_id) { |id|
89
- options.base_router_id = id.to_i
90
- }
91
100
  opts.on("-r", "--router-id [ID]", hlp_router_id) { |id|
92
101
  options.router_id = OSPFv2::Id.to_i(id)
93
102
  }
@@ -97,27 +106,62 @@ class OptParse
97
106
  opts.on("-a", "--area-id [ID]", hlp_area_id) { |id|
98
107
  options.area_id = to_id.call(id)
99
108
  }
100
- opts.on("-g", "--grid [colxrow]", hlp_grid) { |grid|
101
- options.grid = grid.split('x').collect { |x| x.to_i }
102
- }
103
109
  opts.on( "--hello-interval [INT]", hlp_hello_int) { |int|
104
110
  options.hello_int = int.to_i
105
111
  }
106
112
  opts.on("--dead-interval [INT]", hlp_dead_int) { |int|
107
113
  options.dead_int = int.to_i
108
114
  }
115
+ opts.on( '-c', "--network [TYPE]", [:broadcast, :p2p], "Network type (broadcast, p2p)") { |t|
116
+ options.network_type = t || :broadcast
117
+
118
+ }
119
+
120
+ opts.separator ""
121
+ opts.separator ""
122
+ opts.separator "Link State Dabatabse:"
109
123
  opts.on("-g", "--grid [colxrow]", hlp_grid) { |grid|
110
124
  options.grid = grid.split('x').collect { |x| x.to_i }
111
125
  }
112
- opts.on('-S', "--number-of-summary [INT]", "Number of Summary LSA.") { |x|
126
+ opts.on("-g", "--grid [colxrow]", hlp_grid) { |grid|
127
+ options.grid = grid.split('x').collect { |x| x.to_i }
128
+ }
129
+ opts.on('-S', "--number-of-summary [INT]", hlp_sum) { |x|
113
130
  options.num_sum = x.to_i
114
131
  }
115
- opts.on('-E',"--number-of-external [INT]", "Number AsExternal") { |x|
132
+ opts.on('-E',"--number-of-external [INT]", hlp_ext) { |x|
116
133
  options.num_ext = x.to_i
117
134
  }
135
+ opts.on("--base-router-id [ID]", hlp_base_router_id) { |id|
136
+ options.base_router_id = id.to_i
137
+ }
138
+ opts.on( "--base-p2p-addr [PREFIX]", hlp_base_link_addr) { |x|
139
+ options.base_link_addr = x
140
+ }
141
+
142
+ opts.separator "\n"
143
+ opts.on("--refresh-time [SECOND]", OptionParser::DecimalInteger, hlp_ls_refresh_time) { |x|
144
+ options.ls_refresh_time = x
145
+ }
146
+ opts.on("--refresh-interval [SECOND]", OptionParser::DecimalInteger, hlp_ls_refresh_interval) { |x|
147
+ options.ls_refresh_interval = x
148
+ }
149
+
150
+ opts.separator "\n"
118
151
  opts.on( '-f', "--log-fname [FILENAME]", "To redirect logs to a file.") { |fname|
119
152
  options.log_fname = fname
120
153
  }
154
+
155
+ if pry_installed?
156
+ opts.on( '-c', "--console [TYPE]", [:irb, :pry, :none], "Console (irb, pry, none)") { |t|
157
+ options.console = t || :irb
158
+ }
159
+ else
160
+ opts.on( '-c', "--console [TYPE]", [:irb, :none], "Console (irb, none)") { |t|
161
+ options.console = t || :irb
162
+ }
163
+ end
164
+
121
165
  opts.on_tail("-h", "--help", "Show this message") { puts "\n #{opts}\n" ; exit }
122
166
  opts.on_tail("-?", "--help") { puts "\n #{opts}\n" ; exit }
123
167
  opts.on
@@ -21,7 +21,7 @@
21
21
  #++
22
22
 
23
23
  require 'set'
24
- require 'ie/id'
24
+ require_relative '../ie/id'
25
25
 
26
26
  module OSPFv2::LSDB
27
27
  class AdvertisedRouters
@@ -74,7 +74,8 @@ require 'lsa/lsa_factory'
74
74
  require 'ls_db/common'
75
75
  require 'ls_db/advertised_routers'
76
76
 
77
- require 'infra/to_s'
77
+ require 'ls_db/lsdb_ios'
78
+
78
79
 
79
80
  module OSPFv2
80
81
  module LSDB
@@ -82,9 +83,9 @@ module LSDB
82
83
  class LinkStateDatabase
83
84
  include OSPFv2
84
85
  include OSPFv2::Common
85
- include TO_S
86
+ include Ios
86
87
 
87
- AreaId = Class.new(OSPFv2::Id)
88
+ AreaId = Class.new(OSPFv2::Id) unless const_defined?(:AreaId)
88
89
 
89
90
  attr_reader :area_id
90
91
  attr_writer_delegate :area_id
@@ -118,7 +119,6 @@ module LSDB
118
119
  end
119
120
  alias :lsas :all
120
121
 
121
- #TODO: add opaque and external type 7
122
122
  LsType.all.each do |type|
123
123
  define_method("all_#{type}") do
124
124
  @ls_db.find_all { |k,v| k[0]== LsType.to_i(type) }.collect { |k,v| v }.sort_by { |l| l.advertising_router.to_i }
@@ -212,36 +212,23 @@ module LSDB
212
212
 
213
213
  def reset
214
214
  each {|lsa| lsa.ack }
215
- @offset=0
215
+ @offset =0
216
216
  end
217
-
218
- def to_s_default
219
- s = []
220
- s << " OSPF link state database, Area #{area_id.to_ip}"
221
- s << "Age Options Type Link-State ID Advr Router Sequence Checksum Length"
222
- LsType.all.each do |type|
223
- s << (__send__ "all_#{type}").collect { |l| l.to_s }
224
- end
225
- s.join("\n")
217
+
218
+ def to_s verbose=false
219
+ _to_s '', verbose
226
220
  end
227
221
 
228
- def to_s_junos(verbose=false)
229
- lsas = []
230
- lsas << " OSPF link state database, Area #{area_id.to_ip}"
231
- lsas << " Type ID Adv Rtr Seq Age Opt Cksum Len "
232
- LsType.all.each do |type|
233
- lsas << " OSPF AS SCOPE link state database" if type == :external
234
- lsas << (__send__ "all_#{type}").collect { |l|
235
- if verbose
236
- l.to_s_junos_verbose
237
- else
238
- l.to_s_junos
239
- end
240
- }
241
- end
242
- lsas.join("\n")
222
+ [:ios, :junos].each do |style|
223
+ define_method("to_s_#{style}") do
224
+ _to_s style.to_s, false
225
+ end
226
+ alias_method "to_#{style}", "to_s_#{style}"
227
+ define_method("to_s_#{style}_verbose") do
228
+ _to_s style.to_s, true
229
+ end
230
+ alias_method "to_#{style}_v", "to_s_#{style}_verbose"
243
231
  end
244
- alias :to_j :to_s_junos
245
232
 
246
233
  def [](*key)
247
234
  lookup(*key)
@@ -255,10 +242,16 @@ module LSDB
255
242
  all.find_all { |l| ! l.ack? }
256
243
  end
257
244
 
245
+ #FIXME: don't use find_all ?????
258
246
  def refresh
259
247
  all.find_all {|l| l.refresh(advertised_routers, ls_refresh_time) }
260
248
  end
261
249
 
250
+ def refresh2(age)
251
+ all.each {|l| l.refresh2(advertised_routers, age) }
252
+ ''
253
+ end
254
+
262
255
  def ls_refresh?(ls)
263
256
  rt = ls_refresh_time
264
257
  ls.instance_eval { refresh?(rt) }
@@ -267,16 +260,11 @@ module LSDB
267
260
  def recv_link_state_update(link_state_update)
268
261
  link_state_update.each do |lsa|
269
262
  if advertised_routers.has?(lsa.advertising_router)
270
- puts "RECEIVING FROM *OUR* #{lsa.advertising_router}"
271
263
  if @ls_db.key? lsa.key
272
- puts "AND WE HAVE KEY #{lsa.key.inspect} ALREADY ...."
273
264
  @ls_db[lsa.key].force_refresh(lsa.sequence_number)
274
265
  else
275
- puts "AND WE DO NOT HAVE KEY #{lsa.key.inspect}...."
276
266
  @ls_db.store(lsa.key,lsa)
277
- puts "STORE KEY #{lsa.key.inspect}...."
278
267
  lsa.maxage
279
- puts "MAXAGE IT #{lsa.key.inspect}...."
280
268
  end
281
269
  else
282
270
  if lsa.maxaged?
@@ -292,7 +280,6 @@ module LSDB
292
280
  def has?(obj)
293
281
  lookup(obj)
294
282
  end
295
-
296
283
 
297
284
  def recv_dd(dd, ls_req_list)
298
285
  raise ArgumentError, "lss nil" unless ls_req_list
@@ -308,11 +295,58 @@ module LSDB
308
295
  }
309
296
  nil
310
297
  end
311
-
298
+
299
+ require 'ls_db/lsdb_ios'
300
+ include Ios
301
+
312
302
  private
313
303
 
314
- def lsa_types
315
- [:router, :network, :summary, :asbr_summary, :as_external]
304
+ def _to_s_hdr
305
+ s = []
306
+ s << " OSPF link state database, Area #{area_id.to_ip}"
307
+ s << "Age Options Type Link-State ID Advr Router Sequence Checksum Length"
308
+ s
309
+ end
310
+ def _to_s_hdr_junos
311
+ s = []
312
+ s << " OSPF link state database, Area #{area_id.to_ip}"
313
+ s << " Type ID Adv Rtr Seq Age Opt Cksum Len "
314
+ s
315
+ end
316
+
317
+ # FIXME: don't display header'
318
+ # >> puts ls_db.to_s(1)
319
+ # OSPF link state database, Area 0.0.0.0
320
+ # Age Options Type Link-State ID Advr Router Sequence Checksum Length
321
+ # Router:
322
+ # LsAge: 19
323
+ # Options: 0x22 [DC,E]
324
+ #
325
+
326
+ def _to_s(style, verbose)
327
+ s = []
328
+ to_s_hdr = '_to_s_hdr'
329
+ to_s = 'to_s'
330
+ to_s_verbose = 'to_s_verbose'
331
+ if style.length>0
332
+ to_s_hdr = "_to_s_hdr_#{style}"
333
+ to_s = "to_s_#{style}"
334
+ to_s_verbose = "to_s_#{style}_verbose"
335
+ end
336
+ s << __send__(to_s_hdr)
337
+ LsType.all.each do |type|
338
+ all = __send__ "all_#{type}"
339
+ next if all.empty?
340
+ s << __send__( "_to_s_hdr_#{type}_#{style}", verbose) if respond_to?("_to_s_hdr_#{type}_#{style}")
341
+ s << all.collect { |l|
342
+ if verbose
343
+ l.send to_s_verbose
344
+ else
345
+ l.send to_s
346
+ end
347
+ }
348
+ end
349
+ s.join("\n ")
316
350
  end
317
351
 
318
352
  def id2i(id)
@@ -332,3 +366,4 @@ end
332
366
  require 'ls_db/link_state_database_build'
333
367
 
334
368
  load "../../../test/ospfv2/ls_db/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
369
+