ospfv2 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/COPYING +674 -0
- data/LICENSE.txt +53 -0
- data/README +50 -0
- data/bin/ospfv2 +112 -105
- data/changelog.txt +7 -0
- data/gemspec +17 -0
- data/lib/ie/external_route.rb +9 -0
- data/lib/ie/id.rb +3 -4
- data/lib/ie/ie.rb +12 -0
- data/lib/ie/ls_age.rb +35 -5
- data/lib/ie/ls_type.rb +40 -37
- data/lib/ie/opaque_id.rb +46 -0
- data/lib/ie/opaque_type.rb +96 -0
- data/lib/ie/options.rb +5 -3
- data/lib/ie/router_link.rb +30 -7
- data/lib/ie/router_link_type.rb +116 -27
- data/lib/ie/sequence_number.rb +7 -3
- data/lib/infra/ospf_common.rb +1 -12
- data/lib/infra/ospf_io.rb +14 -8
- data/lib/infra/ospf_socket.rb +14 -14
- data/lib/infra/parse_options.rb +69 -25
- data/lib/ls_db/advertised_routers.rb +1 -1
- data/lib/ls_db/link_state_database.rb +74 -39
- data/lib/ls_db/link_state_database_build.rb +3 -3
- data/lib/ls_db/link_state_database_links.rb +7 -2
- data/lib/ls_db/lsdb_ios.rb +59 -0
- data/lib/lsa/external.rb +35 -2
- data/lib/lsa/lsa.rb +128 -35
- data/lib/lsa/lsa_factory.rb +20 -7
- data/lib/lsa/network.rb +44 -9
- data/lib/lsa/router.rb +14 -2
- data/lib/lsa/summary.rb +16 -3
- data/lib/lsa/tlv/color.rb +47 -0
- data/lib/lsa/tlv/link.rb +122 -0
- data/lib/lsa/tlv/link_id.rb +55 -0
- data/lib/lsa/tlv/link_type.rb +44 -0
- data/lib/lsa/tlv/local_interface.rb +56 -0
- data/lib/lsa/tlv/maximum_bandwidth.rb +55 -0
- data/lib/lsa/tlv/maximum_reservable_bandwidth.rb +52 -0
- data/lib/lsa/tlv/remote_interface.rb +58 -0
- data/lib/lsa/tlv/router_address.rb +57 -0
- data/lib/lsa/tlv/tlv.rb +32 -0
- data/lib/lsa/tlv/tlv_factory.rb +72 -0
- data/lib/lsa/tlv/traffic_engineering_metric.rb +52 -0
- data/lib/lsa/tlv/unreserved_bandwidth.rb +55 -0
- data/lib/lsa/traffic_engineering.rb +95 -0
- data/lib/neighbor/neighbor.rb +9 -9
- data/lib/packet/link_state_update.rb +16 -14
- data/lib/packet/ospf_packet.rb +13 -9
- data/test/unit/ie/au_type_test.rb +18 -0
- data/test/unit/ie/external_route_test.rb +51 -0
- data/test/unit/ie/id_test.rb +22 -0
- data/test/unit/ie/interface_mtu_test.rb +23 -0
- data/test/unit/ie/ls_age_test.rb +46 -0
- data/test/unit/ie/ls_type_test.rb +41 -0
- data/test/unit/ie/metric_test.rb +24 -0
- data/test/unit/ie/mt_metric_test.rb +27 -0
- data/test/unit/ie/opaque_id_test.rb +22 -0
- data/test/unit/ie/opaque_type_test.rb +22 -0
- data/test/unit/ie/options_test.rb +142 -0
- data/test/unit/ie/ospf_version_test.rb +0 -0
- data/test/unit/ie/packet_type_test.rb +33 -0
- data/test/unit/ie/router_link_factory_test.rb +26 -0
- data/test/unit/ie/router_link_test.rb +276 -0
- data/test/unit/ie/router_link_type_test.rb +24 -0
- data/test/unit/ie/sequence_number_test.rb +31 -0
- data/test/unit/ie/tos_metric_test.rb +27 -0
- data/test/unit/infra/ospf_common_test.rb +42 -0
- data/test/unit/infra/parse_options_test.rb +58 -0
- data/test/unit/infra/timer_test.rb +94 -0
- data/test/unit/ls_db/all +10 -0
- data/test/unit/ls_db/link_state_database_build_test.rb +140 -0
- data/test/unit/ls_db/link_state_database_links_tests.rb +74 -0
- data/test/unit/ls_db/link_state_database_test.rb +444 -0
- data/test/unit/ls_db/links_test.rb +49 -0
- data/test/unit/lsa/all +10 -0
- data/test/unit/lsa/external_test.rb +218 -0
- data/test/unit/lsa/lsa_factory_test.rb +314 -0
- data/test/unit/lsa/lsa_test.rb +191 -0
- data/test/unit/lsa/network_test.rb +107 -0
- data/test/unit/lsa/router_test.rb +614 -0
- data/test/unit/lsa/summary_test.rb +135 -0
- data/test/unit/lsa/tlv/color_test.rb +39 -0
- data/test/unit/lsa/tlv/link_id_test.rb +14 -0
- data/test/unit/lsa/tlv/link_test.rb +413 -0
- data/test/unit/lsa/tlv/link_type_test.rb +16 -0
- data/test/unit/lsa/tlv/local_interface_test.rb +15 -0
- data/test/unit/lsa/tlv/maximum_bandwidth_test.rb +14 -0
- data/test/unit/lsa/tlv/maximum_reservable_bandwidth_test.rb +13 -0
- data/test/unit/lsa/tlv/remote_interface_test.rb +14 -0
- data/test/unit/lsa/tlv/router_address_test.rb +16 -0
- data/test/unit/lsa/tlv/tlv_factory_test.rb +89 -0
- data/test/unit/lsa/tlv/traffic_engineering_metric_test.rb +15 -0
- data/test/unit/lsa/traffic_engineering_test.rb +65 -0
- data/test/unit/neighbor/neighbor_test.rb +82 -0
- data/test/unit/packet/all +10 -0
- data/test/unit/packet/database_description_test.rb +114 -0
- data/test/unit/packet/hello_test.rb +107 -0
- data/test/unit/packet/link_state_ack_test.rb +64 -0
- data/test/unit/packet/link_state_request_test.rb +168 -0
- data/test/unit/packet/link_state_update_test.rb +62 -0
- data/test/unit/packet/ospf_packet_test.rb +91 -0
- metadata +106 -51
- data/lib/infra/to_s.rb +0 -38
- data/lib/lsa/lsa_base.rb +0 -430
- data/lib/lsa/opaque.rb +0 -143
data/lib/ie/sequence_number.rb
CHANGED
@@ -20,13 +20,15 @@
|
|
20
20
|
# along with OSPFv2. If not, see <http://www.gnu.org/licenses/>.
|
21
21
|
#++
|
22
22
|
|
23
|
-
|
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
|
|
data/lib/infra/ospf_common.rb
CHANGED
@@ -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
|
data/lib/infra/ospf_io.rb
CHANGED
@@ -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
|
-
|
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
|
data/lib/infra/ospf_socket.rb
CHANGED
@@ -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'
|
data/lib/infra/parse_options.rb
CHANGED
@@ -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 =
|
44
|
-
options.num_ext =
|
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 =
|
63
|
-
hlp_base_link_addr
|
64
|
-
hlp_base_router_id
|
65
|
-
hlp_neighbor_id=
|
66
|
-
hlp_router_id =
|
67
|
-
hlp_area_id =
|
68
|
-
hlp_grid =
|
69
|
-
hlp_hello_int =
|
70
|
-
hlp_dead_int =
|
71
|
-
hlp_sum =
|
72
|
-
hlp_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.
|
79
|
-
|
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(
|
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]",
|
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
|
@@ -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 '
|
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
|
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
|
219
|
-
|
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
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
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
|
315
|
-
|
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
|
+
|