ospfv2 0.0.1
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.
- data/bin/ospfv2 +136 -0
- data/lib/ie/au_type.rb +79 -0
- data/lib/ie/external_route.rb +181 -0
- data/lib/ie/id.rb +97 -0
- data/lib/ie/interface_mtu.rb +64 -0
- data/lib/ie/ls_age.rb +89 -0
- data/lib/ie/ls_type.rb +148 -0
- data/lib/ie/metric.rb +63 -0
- data/lib/ie/mt_metric.rb +119 -0
- data/lib/ie/options.rb +356 -0
- data/lib/ie/ospf_version.rb +67 -0
- data/lib/ie/packet_type.rb +65 -0
- data/lib/ie/router_link.rb +167 -0
- data/lib/ie/router_link_factory.rb +53 -0
- data/lib/ie/router_link_type.rb +86 -0
- data/lib/ie/sequence_number.rb +144 -0
- data/lib/ie/tos_metric.rb +102 -0
- data/lib/infra/ospf_common.rb +291 -0
- data/lib/infra/ospf_constants.rb +73 -0
- data/lib/infra/ospf_io.rb +133 -0
- data/lib/infra/ospf_socket.rb +126 -0
- data/lib/infra/parse_options.rb +135 -0
- data/lib/infra/timer.rb +104 -0
- data/lib/infra/to_s.rb +38 -0
- data/lib/ls_db/advertised_routers.rb +78 -0
- data/lib/ls_db/common.rb +31 -0
- data/lib/ls_db/link_state_database.rb +376 -0
- data/lib/ls_db/link_state_database_build.rb +181 -0
- data/lib/ls_db/link_state_database_links.rb +178 -0
- data/lib/ls_db/links.rb +160 -0
- data/lib/lsa/external.rb +347 -0
- data/lib/lsa/lsa.rb +438 -0
- data/lib/lsa/lsa_factory.rb +59 -0
- data/lib/lsa/network.rb +166 -0
- data/lib/lsa/router.rb +336 -0
- data/lib/lsa/summary.rb +393 -0
- data/lib/neighbor/neighbor.rb +298 -0
- data/lib/neighbor/neighbor_event_handler.rb +61 -0
- data/lib/neighbor/recv_database_description.rb +153 -0
- data/lib/neighbor/recv_hello.rb +53 -0
- data/lib/neighbor/recv_ospf_packet.rb +68 -0
- data/lib/neighbor_sm/attempt_state.rb +44 -0
- data/lib/neighbor_sm/down_state.rb +46 -0
- data/lib/neighbor_sm/exchange_state.rb +32 -0
- data/lib/neighbor_sm/exstart_state.rb +69 -0
- data/lib/neighbor_sm/full_state.rb +36 -0
- data/lib/neighbor_sm/init_state.rb +43 -0
- data/lib/neighbor_sm/loading_state.rb +33 -0
- data/lib/neighbor_sm/neighbor_state.rb +87 -0
- data/lib/packet/database_description.rb +300 -0
- data/lib/packet/hello.rb +327 -0
- data/lib/packet/link_state_ack.rb +144 -0
- data/lib/packet/link_state_request.rb +153 -0
- data/lib/packet/link_state_update.rb +189 -0
- data/lib/packet/ospf_packet.rb +306 -0
- metadata +116 -0
@@ -0,0 +1,135 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2010 Jean-Michel Esnault.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
# This file is part of OSPFv2.
|
8
|
+
#
|
9
|
+
# OSPFv2 is free software: you can redistribute it and/or modify
|
10
|
+
# it under the terms of the GNU General Public License as published by
|
11
|
+
# the Free Software Foundation, either version 3 of the License, or
|
12
|
+
# (at your option) any later version.
|
13
|
+
#
|
14
|
+
# OSPFv2 is distributed in the hope that it will be useful,
|
15
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
17
|
+
# GNU General Public License for more details.
|
18
|
+
#
|
19
|
+
# You should have received a copy of the GNU General Public License
|
20
|
+
# along with OSPFv2. If not, see <http://www.gnu.org/licenses/>.
|
21
|
+
#++
|
22
|
+
|
23
|
+
require 'optparse'
|
24
|
+
require 'ostruct'
|
25
|
+
|
26
|
+
require 'ie/id'
|
27
|
+
|
28
|
+
class OptParse
|
29
|
+
def self.parse(args)
|
30
|
+
|
31
|
+
options = OpenStruct.new
|
32
|
+
options.ipaddr = '192.168.1.123'
|
33
|
+
options.network = '192.168.1.0'
|
34
|
+
options.netmask = '255.255.255.0'
|
35
|
+
options.base_link_addr = '1.3.0.0/30'
|
36
|
+
options.base_router_id = 0
|
37
|
+
options.hello_int = 10
|
38
|
+
options.router_id = 1
|
39
|
+
options.neighbor_id = 2
|
40
|
+
options.area_id = 0
|
41
|
+
options.log_fname = $stdout
|
42
|
+
options.grid = [2,2]
|
43
|
+
options.num_sum = 10
|
44
|
+
options.num_ext = 10
|
45
|
+
|
46
|
+
options.parse = Proc.new do |filename|
|
47
|
+
y_conf = YAML::load_file(filename)
|
48
|
+
y_conf.keys.each do |k|
|
49
|
+
case k.downcase
|
50
|
+
when "key1"
|
51
|
+
when "key2"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
options
|
55
|
+
end
|
56
|
+
|
57
|
+
to_ip = lambda { |id| [id].pack('N').unpack('C*').join('.') }
|
58
|
+
to_id = lambda { |x| OSPFv2::Id.to_i(x) }
|
59
|
+
dead_int = lambda { @dead_int || (options.hello_int * 4)}
|
60
|
+
|
61
|
+
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
|
+
|
74
|
+
optparse = OptionParser.new do |opts|
|
75
|
+
|
76
|
+
opts.banner = "Usage: #{$0} [options]"
|
77
|
+
|
78
|
+
opts.on( "--base-p2p-addr [PREFIX]", hlp_base_link_addr) { |x|
|
79
|
+
options.base_link_addr = x
|
80
|
+
}
|
81
|
+
opts.on("-i", "--address [PREFIX]", hlp_address) { |x|
|
82
|
+
options.ipaddr = x
|
83
|
+
options.ipaddr = x.split('/')[0]
|
84
|
+
_addr = IPAddr.new x
|
85
|
+
options.network = _addr.to_s
|
86
|
+
options.netmask = _addr.netmask
|
87
|
+
}
|
88
|
+
opts.on("--base-router-id [ID]", hlp_base_router_id) { |id|
|
89
|
+
options.base_router_id = id.to_i
|
90
|
+
}
|
91
|
+
opts.on("-r", "--router-id [ID]", hlp_router_id) { |id|
|
92
|
+
options.router_id = OSPFv2::Id.to_i(id)
|
93
|
+
}
|
94
|
+
opts.on("-n", "--neighbor-id [ID]", hlp_neighbor_id) { |id|
|
95
|
+
options.neighbor_id = OSPFv2::Id.to_i(id)
|
96
|
+
}
|
97
|
+
opts.on("-a", "--area-id [ID]", hlp_area_id) { |id|
|
98
|
+
options.area_id = to_id.call(id)
|
99
|
+
}
|
100
|
+
opts.on("-g", "--grid [colxrow]", hlp_grid) { |grid|
|
101
|
+
options.grid = grid.split('x').collect { |x| x.to_i }
|
102
|
+
}
|
103
|
+
opts.on( "--hello-interval [INT]", hlp_hello_int) { |int|
|
104
|
+
options.hello_int = int.to_i
|
105
|
+
}
|
106
|
+
opts.on("--dead-interval [INT]", hlp_dead_int) { |int|
|
107
|
+
@dead_int = int.to_i
|
108
|
+
}
|
109
|
+
opts.on("-g", "--grid [colxrow]", hlp_grid) { |grid|
|
110
|
+
options.grid = grid.split('x').collect { |x| x.to_i }
|
111
|
+
}
|
112
|
+
opts.on('-S', "--number-of-summary [INT]", "Number of Summary LSA.") { |x|
|
113
|
+
options.num_sum = x.to_i
|
114
|
+
}
|
115
|
+
opts.on('-E',"--number-of-external [INT]", "Number AsExternal") { |x|
|
116
|
+
options.num_ext = x.to_i
|
117
|
+
}
|
118
|
+
opts.on( '-f', "--log-fname [FILENAME]", "To redirect logs to a file.") { |fname|
|
119
|
+
options.log_fname = fname
|
120
|
+
}
|
121
|
+
opts.on_tail("-h", "--help", "Show this message") { puts "\n #{opts}\n" ; exit }
|
122
|
+
opts.on_tail("-?", "--help") { puts "\n #{opts}\n" ; exit }
|
123
|
+
opts.on
|
124
|
+
end
|
125
|
+
|
126
|
+
optparse.parse!(args)
|
127
|
+
options.dead_int = @dead_int || (options.hello_int * 4)
|
128
|
+
|
129
|
+
options
|
130
|
+
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
|
135
|
+
load "../../../test/ospfv2/infra/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|
data/lib/infra/timer.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2010 Jean-Michel Esnault.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
# This file is part of OSPFv2.
|
8
|
+
#
|
9
|
+
# OSPFv2 is free software: you can redistribute it and/or modify
|
10
|
+
# it under the terms of the GNU General Public License as published by
|
11
|
+
# the Free Software Foundation, either version 3 of the License, or
|
12
|
+
# (at your option) any later version.
|
13
|
+
#
|
14
|
+
# OSPFv2 is distributed in the hope that it will be useful,
|
15
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
17
|
+
# GNU General Public License for more details.
|
18
|
+
#
|
19
|
+
# You should have received a copy of the GNU General Public License
|
20
|
+
# along with OSPFv2. If not, see <http://www.gnu.org/licenses/>.
|
21
|
+
#++
|
22
|
+
|
23
|
+
require 'observer'
|
24
|
+
require 'thread'
|
25
|
+
|
26
|
+
class Timer
|
27
|
+
include Observable
|
28
|
+
|
29
|
+
class << self
|
30
|
+
def start interval, observer=nil, &block
|
31
|
+
timer = if block
|
32
|
+
new interval, observer, &block
|
33
|
+
else
|
34
|
+
new interval, observer
|
35
|
+
end
|
36
|
+
timer.start
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def initialize interval, observer=nil, &block
|
41
|
+
@interval = interval
|
42
|
+
@code = block if block
|
43
|
+
add_observer observer if observer
|
44
|
+
end
|
45
|
+
|
46
|
+
def start _interval=@interval, &block
|
47
|
+
stop if running?
|
48
|
+
changed and notify_observers(:ev_timer_start, id, Time.now.strftime("%M:%S"))
|
49
|
+
_code = block || @code
|
50
|
+
@_timer_thread_ = Thread.new(_interval, _code) do |interval, code|
|
51
|
+
sleep(interval)
|
52
|
+
code.call if code
|
53
|
+
changed and notify_observers(:ev_timer_fire, id, Time.now.strftime("%M:%S"))
|
54
|
+
end
|
55
|
+
self
|
56
|
+
end
|
57
|
+
|
58
|
+
def cancel
|
59
|
+
return unless @_timer_thread_
|
60
|
+
[:exit, :join].each { |x| @_timer_thread_.send x }
|
61
|
+
changed and notify_observers(:ev_timer_cancel, id, Time.now.strftime("%M:%S"))
|
62
|
+
yield if block_given?
|
63
|
+
end
|
64
|
+
alias :stop :cancel
|
65
|
+
|
66
|
+
def running?
|
67
|
+
@_timer_thread_ and @_timer_thread_.alive?
|
68
|
+
end
|
69
|
+
|
70
|
+
def reset &block
|
71
|
+
cancel
|
72
|
+
start &block
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def id
|
78
|
+
self.class.to_s.to_sym
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
class PeriodicTimer < Timer
|
84
|
+
def start _interval=@interval, &block
|
85
|
+
@continue = true
|
86
|
+
changed and notify_observers(:ev_timer_start, id, Time.now.strftime("%M:%S"))
|
87
|
+
_code = block || @code
|
88
|
+
@_timer_thread_ = Thread.new(_interval, _code) do |interval, code|
|
89
|
+
loop do
|
90
|
+
sleep(interval)
|
91
|
+
code.call if code
|
92
|
+
changed and notify_observers(:ev_timer_fire, id, Time.now.strftime("%M:%S"))
|
93
|
+
break unless @continue
|
94
|
+
end
|
95
|
+
changed and notify_observers(:ev_timer_stop, id, Time.now.strftime("%M:%S"))
|
96
|
+
end
|
97
|
+
self
|
98
|
+
end
|
99
|
+
def last_shot
|
100
|
+
@continue = false
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
load "../../../test/ospfv2/infra/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|
data/lib/infra/to_s.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2010 Jean-Michel Esnault.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
# This file is part of OSPFv2.
|
8
|
+
#
|
9
|
+
# OSPFv2 is free software: you can redistribute it and/or modify
|
10
|
+
# it under the terms of the GNU General Public License as published by
|
11
|
+
# the Free Software Foundation, either version 3 of the License, or
|
12
|
+
# (at your option) any later version.
|
13
|
+
#
|
14
|
+
# OSPFv2 is distributed in the hope that it will be useful,
|
15
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
17
|
+
# GNU General Public License for more details.
|
18
|
+
#
|
19
|
+
# You should have received a copy of the GNU General Public License
|
20
|
+
# along with OSPFv2. If not, see <http://www.gnu.org/licenses/>.
|
21
|
+
#++
|
22
|
+
|
23
|
+
module OSPFv2
|
24
|
+
module TO_S
|
25
|
+
|
26
|
+
def to_s(*args)
|
27
|
+
return to_s_default(*args) unless defined?($style)
|
28
|
+
case $style
|
29
|
+
when :junos ; to_s_junos(*args)
|
30
|
+
when :junos_verbose ; to_s_junos_verbose(*args)
|
31
|
+
else
|
32
|
+
to_s_default(*args)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2010 Jean-Michel Esnault.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
# This file is part of OSPFv2.
|
8
|
+
#
|
9
|
+
# OSPFv2 is free software: you can redistribute it and/or modify
|
10
|
+
# it under the terms of the GNU General Public License as published by
|
11
|
+
# the Free Software Foundation, either version 3 of the License, or
|
12
|
+
# (at your option) any later version.
|
13
|
+
#
|
14
|
+
# OSPFv2 is distributed in the hope that it will be useful,
|
15
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
17
|
+
# GNU General Public License for more details.
|
18
|
+
#
|
19
|
+
# You should have received a copy of the GNU General Public License
|
20
|
+
# along with OSPFv2. If not, see <http://www.gnu.org/licenses/>.
|
21
|
+
#++
|
22
|
+
|
23
|
+
require 'set'
|
24
|
+
require 'ie/id'
|
25
|
+
|
26
|
+
module OSPFv2::LSDB
|
27
|
+
class AdvertisedRouters
|
28
|
+
AdvertisedRouter = Class.new(OSPFv2::Id)
|
29
|
+
attr_reader :routers
|
30
|
+
def initialize
|
31
|
+
@set = Set.new
|
32
|
+
end
|
33
|
+
def +(id)
|
34
|
+
@set << router_id(id)
|
35
|
+
end
|
36
|
+
def routers
|
37
|
+
@set.collect.sort
|
38
|
+
end
|
39
|
+
alias :ids :routers
|
40
|
+
def has?(id)
|
41
|
+
routers.include?(router_id(id))
|
42
|
+
end
|
43
|
+
def -(id)
|
44
|
+
@set.delete router_id(id)
|
45
|
+
end
|
46
|
+
private
|
47
|
+
def router_id(id)
|
48
|
+
AdvertisedRouter.new(id).to_i
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
if __FILE__ == $0
|
54
|
+
|
55
|
+
require "test/unit"
|
56
|
+
|
57
|
+
# require "ls_db/advertised_routers"
|
58
|
+
|
59
|
+
class TestLsDbAdvertisedRouters < Test::Unit::TestCase
|
60
|
+
include OSPFv2::LSDB
|
61
|
+
def tests
|
62
|
+
assert AdvertisedRouters.new
|
63
|
+
routers = AdvertisedRouters.new
|
64
|
+
routers + 1
|
65
|
+
routers + '0.0.0.1'
|
66
|
+
routers + 2
|
67
|
+
routers + OSPFv2::Id.new(3)
|
68
|
+
assert_equal [1,2,3], routers.routers
|
69
|
+
routers -1
|
70
|
+
assert_equal [2,3], routers.routers
|
71
|
+
routers -3
|
72
|
+
assert_equal [2], routers.routers
|
73
|
+
routers - '0.0.0.2'
|
74
|
+
assert_equal [], routers.routers
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
data/lib/ls_db/common.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2010 Jean-Michel Esnault.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
# This file is part of OSPFv2.
|
8
|
+
#
|
9
|
+
# OSPFv2 is free software: you can redistribute it and/or modify
|
10
|
+
# it under the terms of the GNU General Public License as published by
|
11
|
+
# the Free Software Foundation, either version 3 of the License, or
|
12
|
+
# (at your option) any later version.
|
13
|
+
#
|
14
|
+
# OSPFv2 is distributed in the hope that it will be useful,
|
15
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
17
|
+
# GNU General Public License for more details.
|
18
|
+
#
|
19
|
+
# You should have received a copy of the GNU General Public License
|
20
|
+
# along with OSPFv2. If not, see <http://www.gnu.org/licenses/>.
|
21
|
+
#++
|
22
|
+
|
23
|
+
module OSPFv2
|
24
|
+
module LSDB
|
25
|
+
ROUTER_ID_BASE=0x01000000
|
26
|
+
EXTERNAL_BASE_ADDRESS='50.0.0.0/24'
|
27
|
+
SUMMARY_BASE_ADDRESS='30.0.0.0/24'
|
28
|
+
NETWORK_BASE_ADDRESS='20.0.0.0/24'
|
29
|
+
LINK_BASE_ADDRESS='13.0.0.0/30'
|
30
|
+
end
|
31
|
+
end
|