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