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
@@ -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
+