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/LICENSE.txt
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
OSPFv2 is copyrighted free software by Jean-Michel Esnault.
|
|
2
|
+
|
|
3
|
+
You can redistribute it and/or modify it under either the terms of the GPL
|
|
4
|
+
(see the COPYING file), or the conditions below:
|
|
5
|
+
|
|
6
|
+
1. You may make and give away verbatim copies of the source form of the
|
|
7
|
+
software without restriction, provided that you duplicate all of the
|
|
8
|
+
original copyright notices and associated disclaimers.
|
|
9
|
+
|
|
10
|
+
2. You may modify your copy of the software in any way, provided that
|
|
11
|
+
you do at least ONE of the following:
|
|
12
|
+
|
|
13
|
+
a) place your modifications in the Public Domain or otherwise
|
|
14
|
+
make them Freely Available, such as by posting said
|
|
15
|
+
modifications to Usenet or an equivalent medium, or by allowing
|
|
16
|
+
the author to include your modifications in the software.
|
|
17
|
+
|
|
18
|
+
b) use the modified software only within your corporation or
|
|
19
|
+
organization.
|
|
20
|
+
|
|
21
|
+
c) rename any non-standard executables so the names do not conflict
|
|
22
|
+
with standard executables, which must also be provided.
|
|
23
|
+
|
|
24
|
+
d) make other distribution arrangements with the author.
|
|
25
|
+
|
|
26
|
+
3. You may distribute the software in object code or executable
|
|
27
|
+
form, provided that you do at least ONE of the following:
|
|
28
|
+
|
|
29
|
+
a) distribute the executables and library files of the software,
|
|
30
|
+
together with instructions (in the manual page or equivalent)
|
|
31
|
+
on where to get the original distribution.
|
|
32
|
+
|
|
33
|
+
b) accompany the distribution with the machine-readable source of
|
|
34
|
+
the software.
|
|
35
|
+
|
|
36
|
+
c) give non-standard executables non-standard names, with
|
|
37
|
+
instructions on where to get the original software distribution.
|
|
38
|
+
|
|
39
|
+
d) make other distribution arrangements with the author.
|
|
40
|
+
|
|
41
|
+
4. You may modify and include the part of the software into any other
|
|
42
|
+
software (possibly commercial).
|
|
43
|
+
|
|
44
|
+
5. The scripts and library files supplied as input to or produced as
|
|
45
|
+
output from the software do not automatically fall under the
|
|
46
|
+
copyright of the software, but belong to whomever generated them,
|
|
47
|
+
and may be sold commercially, and may be aggregated with this
|
|
48
|
+
software.
|
|
49
|
+
|
|
50
|
+
6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
|
|
51
|
+
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
|
52
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
53
|
+
PURPOSE.
|
data/README
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
Supported LSA:
|
|
2
|
+
Router, Network, Summary, AsbrSummary, AsExternal
|
|
3
|
+
|
|
4
|
+
TODO: NSSA, TE, LLC
|
|
5
|
+
|
|
6
|
+
Supported Ospf Packets:
|
|
7
|
+
|
|
8
|
+
Link State Update
|
|
9
|
+
Link State Request
|
|
10
|
+
Link State Ack
|
|
11
|
+
Database Description
|
|
12
|
+
Hello
|
|
13
|
+
|
|
14
|
+
Supported RouterType:
|
|
15
|
+
|
|
16
|
+
Intra-area
|
|
17
|
+
ABR -> generate Summary and set B bit
|
|
18
|
+
ASBR -> generate AsExternal and set E bit
|
|
19
|
+
|
|
20
|
+
Network Types Supported
|
|
21
|
+
Broadcast (DROTHER)
|
|
22
|
+
point-to-point
|
|
23
|
+
|
|
24
|
+
Authentication:
|
|
25
|
+
no auth
|
|
26
|
+
TODO: MD5, Password
|
|
27
|
+
|
|
28
|
+
Learned LSA Functionality
|
|
29
|
+
|
|
30
|
+
display of the Link State Database
|
|
31
|
+
summary
|
|
32
|
+
detailed
|
|
33
|
+
|
|
34
|
+
Scalability:
|
|
35
|
+
|
|
36
|
+
calculate large Area:
|
|
37
|
+
A Grid 50x50 Intra-area routers
|
|
38
|
+
Summary x N
|
|
39
|
+
AsExternal x N
|
|
40
|
+
|
|
41
|
+
Automation:
|
|
42
|
+
|
|
43
|
+
Using ruby language and the set of OSPF ruby classes provided by this library
|
|
44
|
+
All OSPF constructs can be described in simple ruby statements
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
RFCs:
|
|
48
|
+
|
|
49
|
+
RFC 2328
|
|
50
|
+
RFC 4915
|
data/bin/ospfv2
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
|
+
require 'timeout'
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
if Object.const_defined? :Encoding
|
|
5
|
+
Encoding.default_internal="BINARY"
|
|
6
|
+
Encoding.default_external="BINARY"
|
|
7
|
+
end
|
|
4
8
|
|
|
5
9
|
require 'neighbor/neighbor'
|
|
6
10
|
require 'packet/ospf_packet'
|
|
@@ -11,123 +15,126 @@ require 'pp'
|
|
|
11
15
|
|
|
12
16
|
include OSPFv2
|
|
13
17
|
|
|
14
|
-
|
|
18
|
+
# Parse command line
|
|
19
|
+
begin
|
|
20
|
+
options = OptParse.parse(ARGV)
|
|
21
|
+
rescue OptionParser::InvalidOption => e
|
|
22
|
+
STDERR.puts e.to_s.gsub(/at\s*$/,'')
|
|
23
|
+
exit(1)
|
|
24
|
+
end
|
|
15
25
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
begin
|
|
21
|
-
options = OptParse.parse(ARGV)
|
|
22
|
-
rescue OptionParser::InvalidOption => e
|
|
23
|
-
STDERR.puts e.to_s.gsub(/at\s*$/,'')
|
|
24
|
-
exit(1)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
ls_db = OSPFv2::LSDB::LinkStateDatabase.create :columns=> options.grid[0],
|
|
28
|
-
:rows=> options.grid[1],
|
|
29
|
-
:base_prefix => options.base_link_addr,
|
|
30
|
-
:base_router_id=> options.base_router_id
|
|
26
|
+
ls_db = OSPFv2::LSDB::LinkStateDatabase.create :columns=> options.grid[0],
|
|
27
|
+
:rows=> options.grid[1],
|
|
28
|
+
:base_prefix => options.base_link_addr,
|
|
29
|
+
:base_router_id=> options.base_router_id
|
|
31
30
|
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
# Up all links
|
|
32
|
+
LSDB::Link.all.each { |id,lnk| ls_db.link lnk, :up }
|
|
34
33
|
|
|
34
|
+
|
|
35
|
+
rlsa = Router.new :ls_id=> options.router_id, :advertising_router=>options.router_id, :options=>0x22
|
|
36
|
+
if options.network_type == :broadcast
|
|
37
|
+
#
|
|
38
|
+
# o If the state of the interface is Waiting, add a Type
|
|
39
|
+
# 3 link (stub network) with Link ID set to the IP
|
|
40
|
+
# network number of the attached network, Link Data
|
|
41
|
+
# set to the attached network's address mask, and cost
|
|
42
|
+
# equal to the interface's configured output cost.
|
|
43
|
+
#
|
|
44
|
+
# o Else, there has been a Designated Router elected for
|
|
45
|
+
# the attached network. If the router is fully
|
|
46
|
+
# adjacent to the Designated Router, or if the router
|
|
47
|
+
# itself is Designated Router and is fully adjacent to
|
|
48
|
+
# at least one other router, add a single Type 2 link
|
|
49
|
+
# (transit network) with Link ID set to the IP
|
|
50
|
+
# interface address of the attached network's
|
|
51
|
+
# Designated Router (which may be the router itself),
|
|
52
|
+
# Link Data set to the router's own IP interface
|
|
53
|
+
# address, and cost equal to the interface's
|
|
54
|
+
# configured output cost. Otherwise, add a link as if
|
|
55
|
+
# the interface state were Waiting (see above).
|
|
56
|
+
#
|
|
57
|
+
#
|
|
58
|
+
rlsa << RouterLink.new_stub_network(:link_id=>options.network, :link_data=>options.netmask, :metric=>20)
|
|
59
|
+
|
|
60
|
+
else
|
|
61
|
+
# Assume p2p:
|
|
62
|
+
# add p2p link and a stub link
|
|
63
|
+
rlsa << RouterLink.new_point_to_point(:link_id=>options.neighbor_id, :link_data=> options.ipaddr, :metric=>1)
|
|
64
|
+
rlsa << RouterLink.new_stub_network(:link_id=>options.network, :link_data=>options.netmask, :metric=>1)
|
|
65
|
+
rlsa << RouterLink.new_stub_network(:link_id=>'0.0.0.0', :link_data=>'0.0.0.0', :metric=>1)
|
|
35
66
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
rlsa = Router.new :ls_id=> options.router_id,
|
|
40
|
-
:advertising_router=>options.router_id,
|
|
41
|
-
:options=>0x22
|
|
42
|
-
rlsa << RouterLink.new_point_to_point(:link_id=>options.neighbor_id,
|
|
43
|
-
:link_data=> options.ipaddr,
|
|
44
|
-
:metric=>1)
|
|
45
|
-
rlsa << RouterLink.new_stub_network(:link_id=>options.network,
|
|
46
|
-
:link_data=>options.netmask,
|
|
47
|
-
:metric=>1)
|
|
48
|
-
ls_db << rlsa
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
rid1 = OSPFv2::LSDB::LinkStateDatabase.router_id(1,1,options.base_router_id)
|
|
52
|
-
rid2 = OSPFv2::LSDB::LinkStateDatabase.router_id(2,1,options.base_router_id)
|
|
53
|
-
rid3 = OSPFv2::LSDB::LinkStateDatabase.router_id(1,1,options.base_router_id)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# ls_db << rlsa
|
|
54
70
|
|
|
71
|
+
rid1 = OSPFv2::LSDB::LinkStateDatabase.router_id(1,1,options.base_router_id)
|
|
72
|
+
rid2 = OSPFv2::LSDB::LinkStateDatabase.router_id(2,1,options.base_router_id)
|
|
73
|
+
rid3 = OSPFv2::LSDB::LinkStateDatabase.router_id(1,1,options.base_router_id)
|
|
74
|
+
|
|
75
|
+
unless options.grid == [0,0]
|
|
55
76
|
# add a a p2p link between router_id and rid1
|
|
56
|
-
ls_db.new_link :router_id=> options.router_id, :neighbor_id=>rid1
|
|
77
|
+
ls_db.new_link :router_id=> options.router_id, :neighbor_id=>rid1
|
|
78
|
+
end
|
|
57
79
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
80
|
+
|
|
81
|
+
# Add some Summary LSAs
|
|
82
|
+
if options.num_sum>0
|
|
61
83
|
[rid1,rid2].each do |rid|
|
|
62
84
|
ls_db.lookup(1,rid).set_abr
|
|
63
85
|
(options.num_sum/2).times { ls_db << OSPFv2::Summary.new_lsdb( :advertising_router=> rid ) }
|
|
64
86
|
end
|
|
65
|
-
|
|
66
|
-
# Add some External LSAs
|
|
67
|
-
ls_db.find_router_lsa(rid3).set_asbr
|
|
68
|
-
options.num_ext.times { \
|
|
69
|
-
ls_db << OSPFv2::AsExternal.new_lsdb(:advertising_router=> rid3,
|
|
70
|
-
:mt_metrics=>[{:mt_id=>10, :metric=>20,
|
|
71
|
-
:tag=>10}])}
|
|
72
|
-
|
|
73
87
|
ls_db << AsbrSummary.new(:advertising_router=> rid3, :ls_id=> rid3)
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
neighbor = OSPFv2::Neighbor.new :src_addr => options.ipaddr,
|
|
77
|
-
:router_id => options.router_id,
|
|
78
|
-
:area_id=>options.area_id,
|
|
79
|
-
:log_fname => options.log_fname
|
|
80
|
-
|
|
81
|
-
neighbor.hello_int
|
|
82
|
-
neighbor.dead_int
|
|
83
|
-
neighbor.ls_db = ls_db
|
|
84
|
-
|
|
85
|
-
# Add option to parse
|
|
86
|
-
ls_db.ls_refresh_time=2000
|
|
87
|
-
ls_db.ls_refresh_interval=10
|
|
88
|
-
|
|
89
|
-
help= <<-"end;"
|
|
90
|
-
start
|
|
91
|
-
stop
|
|
92
|
-
puts ls_db
|
|
93
|
-
puts ls_db.to_js_unos
|
|
94
|
-
end;
|
|
95
|
-
|
|
96
|
-
def prompt() ; ">> " ; end
|
|
97
|
-
|
|
98
|
-
sleep(1)
|
|
99
|
-
ue=nil
|
|
100
|
-
|
|
101
|
-
def eval_cmd(cmd,binding)
|
|
102
|
-
s = eval(cmd,binding)
|
|
103
|
-
print "=> #{s.inspect}" if s
|
|
104
|
-
puts
|
|
105
|
-
rescue SyntaxError, NameError => e
|
|
106
|
-
puts "% syntax error\n"
|
|
107
|
-
rescue => e
|
|
108
|
-
puts "% error: #{e}\n"
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
loop do
|
|
112
|
-
print prompt() ; $stdout.flush
|
|
113
|
-
cmd = STDIN.gets
|
|
114
|
-
break unless cmd
|
|
115
|
-
next if cmd.size == 0
|
|
116
|
-
ary = cmd.downcase.split(' ')
|
|
117
|
-
case ary[0]
|
|
118
|
-
when 'start' ; neighbor.start
|
|
119
|
-
when 'stop' ; neighbor.stop
|
|
120
|
-
when 'help', '?'
|
|
121
|
-
print help
|
|
122
|
-
when nil
|
|
123
|
-
when /^(exit|quit|x|q|fin|end)$/ ; exit
|
|
124
|
-
else
|
|
125
|
-
eval_cmd cmd, binding()
|
|
126
|
-
end
|
|
127
|
-
end
|
|
88
|
+
end
|
|
128
89
|
|
|
90
|
+
# Add some External LSAs
|
|
91
|
+
ls_db.find_router_lsa(rid3).set_asbr if options.num_ext>0
|
|
92
|
+
options.num_ext.times do
|
|
93
|
+
ls_db << OSPFv2::AsExternal.new_lsdb(:advertising_router=> rid3,
|
|
94
|
+
:mt_metrics=>[{:mt_id=>10, :metric=>20,:tag=>10}])
|
|
129
95
|
end
|
|
130
96
|
|
|
131
|
-
cli.join
|
|
132
97
|
|
|
133
|
-
|
|
98
|
+
neighbor = OSPFv2::Neighbor.new :src_addr => options.ipaddr,
|
|
99
|
+
:router_id => options.router_id,
|
|
100
|
+
:area_id=>options.area_id,
|
|
101
|
+
:log_fname => options.log_fname
|
|
102
|
+
|
|
103
|
+
neighbor.hello_int
|
|
104
|
+
neighbor.dead_int
|
|
105
|
+
neighbor.ls_db = ls_db
|
|
106
|
+
|
|
107
|
+
ls_db.ls_refresh_time= options.ls_refresh_time
|
|
108
|
+
ls_db.ls_refresh_interval=options.ls_refresh_interval
|
|
109
|
+
|
|
110
|
+
def ls_db.aging(arg=nil)
|
|
111
|
+
Lsa::LsAge.aging(arg)
|
|
112
|
+
all.collect { |l| l.ls_age.to_i }
|
|
113
|
+
aging?
|
|
114
|
+
end
|
|
115
|
+
def ls_db.aging?
|
|
116
|
+
Lsa::LsAge.aging? ? :on : :off
|
|
117
|
+
end
|
|
118
|
+
def ls_db.age_reset(age=nil)
|
|
119
|
+
all.each { |l| l.ls_age.reset(age) }
|
|
120
|
+
''
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
case options.console
|
|
124
|
+
when :pry
|
|
125
|
+
require 'pry'
|
|
126
|
+
binding.pry
|
|
127
|
+
when :irb
|
|
128
|
+
require 'irb'
|
|
129
|
+
puts "*** cb $binding ***"
|
|
130
|
+
puts "Once in irb> enter \"cb $binding\" to access local variables: ls_db, neighbor, options"
|
|
131
|
+
puts "Use ls_db object to access generated link state database."
|
|
132
|
+
puts "Use neighbor object to start or stop ospfv2 neighboring."
|
|
133
|
+
puts ""
|
|
134
|
+
$binding = binding
|
|
135
|
+
IRB.start(__FILE__)
|
|
136
|
+
else
|
|
137
|
+
ls_db.aging(:on); neighbor.start
|
|
138
|
+
sleep 30_000
|
|
139
|
+
end
|
|
140
|
+
|
data/changelog.txt
CHANGED
data/gemspec
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
|
|
2
|
+
Gem::Specification.new do |spec|
|
|
3
|
+
spec.name = "ospfv2"
|
|
4
|
+
spec.date = "2014-10-17"
|
|
5
|
+
spec.version = "0.0.3"
|
|
6
|
+
spec.author = "Jean Michel Esnault"
|
|
7
|
+
spec.email = "ospfv2@esnault.org"
|
|
8
|
+
spec.summary = "Playing with OSPF version 2 using ruby."
|
|
9
|
+
spec.description = "Playing with OSPF version 2 using ruby."
|
|
10
|
+
spec.homepage = "https://github.com/jesnault/ospfv2"
|
|
11
|
+
spec.files = `git ls-files -z`.split("\x0")
|
|
12
|
+
spec.rdoc_options = ["--quiet", "--title", "ospfv2", "--line-numbers"]
|
|
13
|
+
spec.require_paths = ["lib"]
|
|
14
|
+
spec.bindir = 'bin'
|
|
15
|
+
spec.executables = ['ospfv2']
|
|
16
|
+
spec.extra_rdoc_files = ["LICENSE.txt","README"]
|
|
17
|
+
end
|
data/lib/ie/external_route.rb
CHANGED
|
@@ -118,6 +118,15 @@ module OSPFv2
|
|
|
118
118
|
def to_s
|
|
119
119
|
"#{type.to_s.upcase} (ID #{mt_id}) Metric: #{metric.to_i} Forwarding: #{forwarding_address.to_ip} Tag: #{tag}"
|
|
120
120
|
end
|
|
121
|
+
|
|
122
|
+
def to_s_ios
|
|
123
|
+
# Metric Type: 1 (Comparable directly to link state metric)
|
|
124
|
+
# TOS: 0
|
|
125
|
+
# Metric: 0
|
|
126
|
+
# Forward Address: 0.0.0.0
|
|
127
|
+
# External Route Tag: 0
|
|
128
|
+
#TODO: implement...
|
|
129
|
+
end
|
|
121
130
|
|
|
122
131
|
private
|
|
123
132
|
|
data/lib/ie/id.rb
CHANGED
|
@@ -22,10 +22,12 @@
|
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
require 'ipaddr'
|
|
25
|
-
|
|
25
|
+
require_relative '../infra/ospf_common'
|
|
26
|
+
require_relative 'ie'
|
|
26
27
|
|
|
27
28
|
module OSPFv2
|
|
28
29
|
class Id
|
|
30
|
+
include IE
|
|
29
31
|
|
|
30
32
|
def self.new_ntoh(s)
|
|
31
33
|
return unless s.is_a?(String)
|
|
@@ -92,6 +94,3 @@ class Id
|
|
|
92
94
|
end
|
|
93
95
|
|
|
94
96
|
end
|
|
95
|
-
|
|
96
|
-
load "../../../test/ospfv2/ie/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|
|
97
|
-
|
data/lib/ie/ie.rb
ADDED
data/lib/ie/ls_age.rb
CHANGED
|
@@ -20,24 +20,51 @@
|
|
|
20
20
|
# along with OSPFv2. If not, see <http://www.gnu.org/licenses/>.
|
|
21
21
|
#++
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
require_relative '../infra/ospf_constants'
|
|
24
24
|
|
|
25
25
|
module OSPFv2
|
|
26
26
|
class LsAge
|
|
27
|
+
|
|
28
|
+
class << self
|
|
29
|
+
attr_accessor :_aging
|
|
30
|
+
def aging?
|
|
31
|
+
_aging
|
|
32
|
+
end
|
|
33
|
+
def aging(arg=nil)
|
|
34
|
+
if arg
|
|
35
|
+
case arg
|
|
36
|
+
when :on ; self._aging = true
|
|
37
|
+
when :off ; self._aging = false
|
|
38
|
+
end
|
|
39
|
+
else
|
|
40
|
+
self._aging = ! _aging
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
27
45
|
include Comparable
|
|
28
46
|
|
|
29
47
|
def initialize(age=0)
|
|
30
48
|
@age=age
|
|
31
|
-
@time = Time.now
|
|
32
49
|
raise ArgumentError, "Invalid Argument #{age}" unless age.is_a?(Integer)
|
|
33
50
|
end
|
|
34
51
|
|
|
35
52
|
def to_i
|
|
36
|
-
aging?
|
|
53
|
+
if aging?
|
|
54
|
+
@time ||= Time.now
|
|
55
|
+
(Time.new - @time + @age).to_int
|
|
56
|
+
else
|
|
57
|
+
@age
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def reset(age=nil)
|
|
62
|
+
@age = age if age
|
|
63
|
+
@time=nil
|
|
37
64
|
end
|
|
38
65
|
|
|
39
66
|
def aging?
|
|
40
|
-
|
|
67
|
+
self.class.aging?
|
|
41
68
|
end
|
|
42
69
|
|
|
43
70
|
def maxage
|
|
@@ -60,6 +87,10 @@ class LsAge
|
|
|
60
87
|
self.class.to_s.split('::').last + ": #{to_i}"
|
|
61
88
|
end
|
|
62
89
|
|
|
90
|
+
def to_s_ios
|
|
91
|
+
"LS age: #{to_i}"
|
|
92
|
+
end
|
|
93
|
+
|
|
63
94
|
def encode
|
|
64
95
|
[@age].pack('n')
|
|
65
96
|
end
|
|
@@ -72,4 +103,3 @@ class LsAge
|
|
|
72
103
|
end
|
|
73
104
|
end
|
|
74
105
|
|
|
75
|
-
load "../../../test/ospfv2/ie/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|