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
metadata
CHANGED
|
@@ -1,40 +1,41 @@
|
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ospfv2
|
|
3
|
-
version: !ruby/object:Gem::Version
|
|
4
|
-
|
|
5
|
-
prerelease:
|
|
6
|
-
segments:
|
|
7
|
-
- 0
|
|
8
|
-
- 0
|
|
9
|
-
- 2
|
|
10
|
-
version: 0.0.2
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.3
|
|
11
5
|
platform: ruby
|
|
12
|
-
authors:
|
|
6
|
+
authors:
|
|
13
7
|
- Jean Michel Esnault
|
|
14
8
|
autorequire:
|
|
15
9
|
bindir: bin
|
|
16
10
|
cert_chain: []
|
|
17
|
-
|
|
18
|
-
date: 2011-04-16 00:00:00 Z
|
|
11
|
+
date: 2014-10-17 00:00:00.000000000 Z
|
|
19
12
|
dependencies: []
|
|
20
|
-
|
|
21
|
-
description:
|
|
13
|
+
description: Playing with OSPF version 2 using ruby.
|
|
22
14
|
email: ospfv2@esnault.org
|
|
23
|
-
executables:
|
|
15
|
+
executables:
|
|
24
16
|
- ospfv2
|
|
25
17
|
extensions: []
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
files:
|
|
18
|
+
extra_rdoc_files:
|
|
19
|
+
- LICENSE.txt
|
|
20
|
+
- README
|
|
21
|
+
files:
|
|
22
|
+
- COPYING
|
|
23
|
+
- LICENSE.txt
|
|
24
|
+
- README
|
|
25
|
+
- bin/ospfv2
|
|
26
|
+
- changelog.txt
|
|
27
|
+
- gemspec
|
|
30
28
|
- lib/ie/au_type.rb
|
|
31
29
|
- lib/ie/external_route.rb
|
|
32
30
|
- lib/ie/id.rb
|
|
31
|
+
- lib/ie/ie.rb
|
|
33
32
|
- lib/ie/interface_mtu.rb
|
|
34
33
|
- lib/ie/ls_age.rb
|
|
35
34
|
- lib/ie/ls_type.rb
|
|
36
35
|
- lib/ie/metric.rb
|
|
37
36
|
- lib/ie/mt_metric.rb
|
|
37
|
+
- lib/ie/opaque_id.rb
|
|
38
|
+
- lib/ie/opaque_type.rb
|
|
38
39
|
- lib/ie/options.rb
|
|
39
40
|
- lib/ie/ospf_version.rb
|
|
40
41
|
- lib/ie/packet_type.rb
|
|
@@ -49,22 +50,33 @@ files:
|
|
|
49
50
|
- lib/infra/ospf_socket.rb
|
|
50
51
|
- lib/infra/parse_options.rb
|
|
51
52
|
- lib/infra/timer.rb
|
|
52
|
-
- lib/infra/to_s.rb
|
|
53
53
|
- lib/ls_db/advertised_routers.rb
|
|
54
54
|
- lib/ls_db/common.rb
|
|
55
55
|
- lib/ls_db/link_state_database.rb
|
|
56
56
|
- lib/ls_db/link_state_database_build.rb
|
|
57
57
|
- lib/ls_db/link_state_database_links.rb
|
|
58
58
|
- lib/ls_db/links.rb
|
|
59
|
+
- lib/ls_db/lsdb_ios.rb
|
|
59
60
|
- lib/lsa/external.rb
|
|
60
61
|
- lib/lsa/lsa.rb
|
|
61
|
-
- lib/lsa/lsa_base.rb
|
|
62
62
|
- lib/lsa/lsa_factory.rb
|
|
63
63
|
- lib/lsa/network.rb
|
|
64
|
-
- lib/lsa/opaque.rb
|
|
65
64
|
- lib/lsa/router.rb
|
|
66
65
|
- lib/lsa/summary.rb
|
|
66
|
+
- lib/lsa/tlv/color.rb
|
|
67
|
+
- lib/lsa/tlv/link.rb
|
|
68
|
+
- lib/lsa/tlv/link_id.rb
|
|
69
|
+
- lib/lsa/tlv/link_type.rb
|
|
70
|
+
- lib/lsa/tlv/local_interface.rb
|
|
71
|
+
- lib/lsa/tlv/maximum_bandwidth.rb
|
|
72
|
+
- lib/lsa/tlv/maximum_reservable_bandwidth.rb
|
|
73
|
+
- lib/lsa/tlv/remote_interface.rb
|
|
74
|
+
- lib/lsa/tlv/router_address.rb
|
|
67
75
|
- lib/lsa/tlv/tlv.rb
|
|
76
|
+
- lib/lsa/tlv/tlv_factory.rb
|
|
77
|
+
- lib/lsa/tlv/traffic_engineering_metric.rb
|
|
78
|
+
- lib/lsa/tlv/unreserved_bandwidth.rb
|
|
79
|
+
- lib/lsa/traffic_engineering.rb
|
|
68
80
|
- lib/neighbor/neighbor.rb
|
|
69
81
|
- lib/neighbor/neighbor_event_handler.rb
|
|
70
82
|
- lib/neighbor/recv_database_description.rb
|
|
@@ -84,41 +96,84 @@ files:
|
|
|
84
96
|
- lib/packet/link_state_request.rb
|
|
85
97
|
- lib/packet/link_state_update.rb
|
|
86
98
|
- lib/packet/ospf_packet.rb
|
|
87
|
-
-
|
|
88
|
-
-
|
|
89
|
-
|
|
99
|
+
- test/unit/ie/au_type_test.rb
|
|
100
|
+
- test/unit/ie/external_route_test.rb
|
|
101
|
+
- test/unit/ie/id_test.rb
|
|
102
|
+
- test/unit/ie/interface_mtu_test.rb
|
|
103
|
+
- test/unit/ie/ls_age_test.rb
|
|
104
|
+
- test/unit/ie/ls_type_test.rb
|
|
105
|
+
- test/unit/ie/metric_test.rb
|
|
106
|
+
- test/unit/ie/mt_metric_test.rb
|
|
107
|
+
- test/unit/ie/opaque_id_test.rb
|
|
108
|
+
- test/unit/ie/opaque_type_test.rb
|
|
109
|
+
- test/unit/ie/options_test.rb
|
|
110
|
+
- test/unit/ie/ospf_version_test.rb
|
|
111
|
+
- test/unit/ie/packet_type_test.rb
|
|
112
|
+
- test/unit/ie/router_link_factory_test.rb
|
|
113
|
+
- test/unit/ie/router_link_test.rb
|
|
114
|
+
- test/unit/ie/router_link_type_test.rb
|
|
115
|
+
- test/unit/ie/sequence_number_test.rb
|
|
116
|
+
- test/unit/ie/tos_metric_test.rb
|
|
117
|
+
- test/unit/infra/ospf_common_test.rb
|
|
118
|
+
- test/unit/infra/parse_options_test.rb
|
|
119
|
+
- test/unit/infra/timer_test.rb
|
|
120
|
+
- test/unit/ls_db/all
|
|
121
|
+
- test/unit/ls_db/link_state_database_build_test.rb
|
|
122
|
+
- test/unit/ls_db/link_state_database_links_tests.rb
|
|
123
|
+
- test/unit/ls_db/link_state_database_test.rb
|
|
124
|
+
- test/unit/ls_db/links_test.rb
|
|
125
|
+
- test/unit/lsa/all
|
|
126
|
+
- test/unit/lsa/external_test.rb
|
|
127
|
+
- test/unit/lsa/lsa_factory_test.rb
|
|
128
|
+
- test/unit/lsa/lsa_test.rb
|
|
129
|
+
- test/unit/lsa/network_test.rb
|
|
130
|
+
- test/unit/lsa/router_test.rb
|
|
131
|
+
- test/unit/lsa/summary_test.rb
|
|
132
|
+
- test/unit/lsa/tlv/color_test.rb
|
|
133
|
+
- test/unit/lsa/tlv/link_id_test.rb
|
|
134
|
+
- test/unit/lsa/tlv/link_test.rb
|
|
135
|
+
- test/unit/lsa/tlv/link_type_test.rb
|
|
136
|
+
- test/unit/lsa/tlv/local_interface_test.rb
|
|
137
|
+
- test/unit/lsa/tlv/maximum_bandwidth_test.rb
|
|
138
|
+
- test/unit/lsa/tlv/maximum_reservable_bandwidth_test.rb
|
|
139
|
+
- test/unit/lsa/tlv/remote_interface_test.rb
|
|
140
|
+
- test/unit/lsa/tlv/router_address_test.rb
|
|
141
|
+
- test/unit/lsa/tlv/tlv_factory_test.rb
|
|
142
|
+
- test/unit/lsa/tlv/traffic_engineering_metric_test.rb
|
|
143
|
+
- test/unit/lsa/traffic_engineering_test.rb
|
|
144
|
+
- test/unit/neighbor/neighbor_test.rb
|
|
145
|
+
- test/unit/packet/all
|
|
146
|
+
- test/unit/packet/database_description_test.rb
|
|
147
|
+
- test/unit/packet/hello_test.rb
|
|
148
|
+
- test/unit/packet/link_state_ack_test.rb
|
|
149
|
+
- test/unit/packet/link_state_request_test.rb
|
|
150
|
+
- test/unit/packet/link_state_update_test.rb
|
|
151
|
+
- test/unit/packet/ospf_packet_test.rb
|
|
152
|
+
homepage: https://github.com/jesnault/ospfv2
|
|
90
153
|
licenses: []
|
|
91
|
-
|
|
154
|
+
metadata: {}
|
|
92
155
|
post_install_message:
|
|
93
|
-
rdoc_options:
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
-
|
|
156
|
+
rdoc_options:
|
|
157
|
+
- "--quiet"
|
|
158
|
+
- "--title"
|
|
159
|
+
- ospfv2
|
|
160
|
+
- "--line-numbers"
|
|
161
|
+
require_paths:
|
|
97
162
|
- lib
|
|
98
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
|
99
|
-
|
|
100
|
-
requirements:
|
|
163
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
164
|
+
requirements:
|
|
101
165
|
- - ">="
|
|
102
|
-
- !ruby/object:Gem::Version
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
version: "0"
|
|
107
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
|
-
none: false
|
|
109
|
-
requirements:
|
|
166
|
+
- !ruby/object:Gem::Version
|
|
167
|
+
version: '0'
|
|
168
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
169
|
+
requirements:
|
|
110
170
|
- - ">="
|
|
111
|
-
- !ruby/object:Gem::Version
|
|
112
|
-
|
|
113
|
-
segments:
|
|
114
|
-
- 0
|
|
115
|
-
version: "0"
|
|
171
|
+
- !ruby/object:Gem::Version
|
|
172
|
+
version: '0'
|
|
116
173
|
requirements: []
|
|
117
|
-
|
|
118
174
|
rubyforge_project:
|
|
119
|
-
rubygems_version:
|
|
175
|
+
rubygems_version: 2.2.2
|
|
120
176
|
signing_key:
|
|
121
|
-
specification_version:
|
|
122
|
-
summary:
|
|
177
|
+
specification_version: 4
|
|
178
|
+
summary: Playing with OSPF version 2 using ruby.
|
|
123
179
|
test_files: []
|
|
124
|
-
|
data/lib/infra/to_s.rb
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
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
|
data/lib/lsa/lsa_base.rb
DELETED
|
@@ -1,430 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
=begin rdoc
|
|
3
|
-
|
|
4
|
-
A.4.1 The LSA header
|
|
5
|
-
|
|
6
|
-
All LSAs begin with a common 20 byte header. This header contains
|
|
7
|
-
enough information to uniquely identify the LSA (LS type, Link State
|
|
8
|
-
ID, and Advertising Router). Multiple instances of the LSA may
|
|
9
|
-
exist in the routing domain at the same time. It is then necessary
|
|
10
|
-
to determine which instance is more recent. This is accomplished by
|
|
11
|
-
examining the LS age, LS sequence number and LS checksum fields that
|
|
12
|
-
are also contained in the LSA header.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
0 1 2 3
|
|
16
|
-
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
17
|
-
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
18
|
-
| LS age | Options | LS type |
|
|
19
|
-
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
20
|
-
| Link State ID |
|
|
21
|
-
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
22
|
-
| Advertising Router |
|
|
23
|
-
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
24
|
-
| LS sequence number |
|
|
25
|
-
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
26
|
-
| LS checksum | length |
|
|
27
|
-
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
0 1 2 3
|
|
32
|
-
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
33
|
-
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
34
|
-
| LS age | Options | 9, 10, or 11 |
|
|
35
|
-
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
36
|
-
| Opaque Type | Opaque ID |
|
|
37
|
-
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
38
|
-
| Advertising Router |
|
|
39
|
-
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
40
|
-
| LS Sequence Number |
|
|
41
|
-
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
42
|
-
| LS checksum | Length |
|
|
43
|
-
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
44
|
-
| |
|
|
45
|
-
+ +
|
|
46
|
-
| Opaque Information |
|
|
47
|
-
+ +
|
|
48
|
-
| ... |
|
|
49
|
-
#
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
LS age
|
|
54
|
-
The time in seconds since the LSA was originated.
|
|
55
|
-
|
|
56
|
-
Options
|
|
57
|
-
The optional capabilities supported by the described portion of
|
|
58
|
-
the routing domain. OSPF's optional capabilities are documented
|
|
59
|
-
in Section A.2.
|
|
60
|
-
|
|
61
|
-
LS type
|
|
62
|
-
The type of the LSA. Each LSA type has a separate advertisement
|
|
63
|
-
format. The LSA types defined in this memo are as follows (see
|
|
64
|
-
Section 12.1.3 for further explanation):
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
LS Type Description
|
|
68
|
-
___________________________________
|
|
69
|
-
1 Router-LSAs
|
|
70
|
-
2 Network-LSAs
|
|
71
|
-
3 Summary-LSAs (IP network)
|
|
72
|
-
4 Summary-LSAs (ASBR)
|
|
73
|
-
5 AS-external-LSAs
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
Link State ID
|
|
77
|
-
This field identifies the portion of the internet environment
|
|
78
|
-
that is being described by the LSA. The contents of this field
|
|
79
|
-
depend on the LSA's LS type. For example, in network-LSAs the
|
|
80
|
-
Link State ID is set to the IP interface address of the
|
|
81
|
-
network's Designated Router (from which the network's IP address
|
|
82
|
-
can be derived). The Link State ID is further discussed in
|
|
83
|
-
Section 12.1.4.
|
|
84
|
-
|
|
85
|
-
Advertising Router
|
|
86
|
-
The Router ID of the router that originated the LSA. For
|
|
87
|
-
example, in network-LSAs this field is equal to the Router ID of
|
|
88
|
-
the network's Designated Router.
|
|
89
|
-
|
|
90
|
-
LS sequence number
|
|
91
|
-
Detects old or duplicate LSAs. Successive instances of an LSA
|
|
92
|
-
are given successive LS sequence numbers. See Section 12.1.6
|
|
93
|
-
for more details.
|
|
94
|
-
|
|
95
|
-
LS checksum
|
|
96
|
-
The Fletcher checksum of the complete contents of the LSA,
|
|
97
|
-
including the LSA header but excluding the LS age field. See
|
|
98
|
-
Section 12.1.7 for more details.
|
|
99
|
-
|
|
100
|
-
length
|
|
101
|
-
The length in bytes of the LSA. This includes the 20 byte LSA
|
|
102
|
-
header.
|
|
103
|
-
|
|
104
|
-
=end
|
|
105
|
-
|
|
106
|
-
require 'infra/ospf_common'
|
|
107
|
-
require 'infra/ospf_constants'
|
|
108
|
-
require 'ie/id'
|
|
109
|
-
require 'ie/ls_type'
|
|
110
|
-
require 'ie/ls_age'
|
|
111
|
-
require 'ie/sequence_number'
|
|
112
|
-
require 'ie/options'
|
|
113
|
-
require 'ls_db/advertised_routers'
|
|
114
|
-
|
|
115
|
-
require 'infra/to_s'
|
|
116
|
-
|
|
117
|
-
module OSPFv2
|
|
118
|
-
|
|
119
|
-
class Lsa_Base
|
|
120
|
-
include Comparable
|
|
121
|
-
|
|
122
|
-
AdvertisingRouter = Class.new(Id)
|
|
123
|
-
LsId = Class.new(Id)
|
|
124
|
-
LsAge = Class.new(LsAge)
|
|
125
|
-
|
|
126
|
-
class << self
|
|
127
|
-
def new_ntop(arg)
|
|
128
|
-
lsa = new
|
|
129
|
-
if arg.is_a?(String)
|
|
130
|
-
lsa.parse(arg)
|
|
131
|
-
elsif arg.is_a?(self)
|
|
132
|
-
lsa.parse arg.encode
|
|
133
|
-
else
|
|
134
|
-
raise ArgumentError, "Invalid Argument: #{arg.inspect}"
|
|
135
|
-
end
|
|
136
|
-
lsa
|
|
137
|
-
end
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
include OSPFv2::Common
|
|
141
|
-
include OSPFv2::Constant
|
|
142
|
-
|
|
143
|
-
# FIXME: when adding LSA in LSDB should be acked when init, rxmt otherwise ....
|
|
144
|
-
def ack
|
|
145
|
-
@_rxmt_=false
|
|
146
|
-
end
|
|
147
|
-
def retransmit
|
|
148
|
-
@_rxmt_=true
|
|
149
|
-
end
|
|
150
|
-
def is_acked?
|
|
151
|
-
@_rxmt_ == false
|
|
152
|
-
end
|
|
153
|
-
alias :acked? :is_acked?
|
|
154
|
-
alias :ack? :acked?
|
|
155
|
-
|
|
156
|
-
attr_reader :ls_age, :options, :ls_type
|
|
157
|
-
attr_reader :ls_id
|
|
158
|
-
attr_reader :advertising_router
|
|
159
|
-
attr_reader :sequence_number
|
|
160
|
-
|
|
161
|
-
attr_writer_delegate :advertising_router, :ls_id, :ls_age
|
|
162
|
-
|
|
163
|
-
def initialize(arg={})
|
|
164
|
-
arg = arg.dup
|
|
165
|
-
@ls_age = LsAge.new
|
|
166
|
-
@sequence_number = SequenceNumber.new
|
|
167
|
-
@options = Options.new
|
|
168
|
-
@ls_type = LsType.new klass_to_ls_type
|
|
169
|
-
@ls_id = LsId.new
|
|
170
|
-
@advertising_router = AdvertisingRouter.new
|
|
171
|
-
@_length = 0
|
|
172
|
-
@_rxmt_ = false
|
|
173
|
-
|
|
174
|
-
if arg.is_a?(Hash)
|
|
175
|
-
set arg
|
|
176
|
-
elsif arg.is_a?(String)
|
|
177
|
-
parse arg
|
|
178
|
-
elsif arg.is_a?(self.class)
|
|
179
|
-
parse arg.encode
|
|
180
|
-
else
|
|
181
|
-
raise ArgumentError, "Invalid Argument: #{arg.inspect}"
|
|
182
|
-
end
|
|
183
|
-
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
def sequence_number=(seqn)
|
|
187
|
-
@sequence_number = SequenceNumber.new(seqn)
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
def to_s_default
|
|
191
|
-
len = encode.size
|
|
192
|
-
ls_type_to_s = ls_type.to_sym.to_s.chomp('_lsa')
|
|
193
|
-
sprintf("%-4.0d 0x%2.2x %-8s %-15.15s %-15.15s 0x%8.8x 0x%4.4x %-7d",
|
|
194
|
-
ls_age.to_i, options.to_i, ls_type.to_s_short, ls_id.to_ip, advertising_router.to_ip, seqn.to_I,csum_to_i,len)
|
|
195
|
-
end
|
|
196
|
-
alias :to_s_dd :to_s_default
|
|
197
|
-
|
|
198
|
-
def to_s_verbose
|
|
199
|
-
len = encode.size
|
|
200
|
-
s=[]
|
|
201
|
-
s << self.class.to_s.split('::').last + ":"
|
|
202
|
-
s << ls_age.to_s
|
|
203
|
-
s << options.to_s
|
|
204
|
-
s << ls_type.to_s
|
|
205
|
-
s << advertising_router.to_s
|
|
206
|
-
s << ls_id.to_s
|
|
207
|
-
s << "SequenceNumber: " + sequence_number.to_s
|
|
208
|
-
s << "LS checksum: #{format "%4x", csum_to_i}" if @_csum
|
|
209
|
-
s << "length: #{@_size.unpack('n')}" if @_size
|
|
210
|
-
s.join("\n ")
|
|
211
|
-
end
|
|
212
|
-
|
|
213
|
-
alias :to_s_header :to_s
|
|
214
|
-
|
|
215
|
-
def to_s_junos
|
|
216
|
-
len = encode.size
|
|
217
|
-
sprintf("%-7s %-1.1s%-15.15s %-15.15s 0x%8.8x %4.0d 0x%2.2x 0x%4.4x %3d", LsType.to_junos(ls_type.to_i), '', ls_id.to_ip, advertising_router.to_ip, seqn.to_I, ls_age.to_i, options.to_i, csum_to_i, len)
|
|
218
|
-
end
|
|
219
|
-
include OSPFv2::TO_S
|
|
220
|
-
alias :to_s_junos_verbose :to_s_junos
|
|
221
|
-
|
|
222
|
-
def encode_header
|
|
223
|
-
header = []
|
|
224
|
-
header << ls_age.encode
|
|
225
|
-
header << [options.to_i].pack('C')
|
|
226
|
-
header << ls_type.encode
|
|
227
|
-
header << ls_id.encode
|
|
228
|
-
header << advertising_router.encode
|
|
229
|
-
header << sequence_number.encode
|
|
230
|
-
header << [''].pack('a4')
|
|
231
|
-
header.join
|
|
232
|
-
end
|
|
233
|
-
alias :header_encode :encode_header
|
|
234
|
-
|
|
235
|
-
def header_lsa
|
|
236
|
-
self.class.new self
|
|
237
|
-
end
|
|
238
|
-
|
|
239
|
-
def encode(content='')
|
|
240
|
-
lsa = []
|
|
241
|
-
lsa << encode_header
|
|
242
|
-
lsa << content
|
|
243
|
-
lsa = lsa.join
|
|
244
|
-
lsa[18..19]= @_size = [lsa.size].pack('n')
|
|
245
|
-
lsa[16..17]= self.csum = cheksum(lsa[2..-1], 15).pack('CC')
|
|
246
|
-
lsa
|
|
247
|
-
end
|
|
248
|
-
|
|
249
|
-
def encode_request
|
|
250
|
-
req=[]
|
|
251
|
-
req << ls_id.encode
|
|
252
|
-
req << ls_type.encode
|
|
253
|
-
req << @advertising_router.encode
|
|
254
|
-
req.join
|
|
255
|
-
end
|
|
256
|
-
|
|
257
|
-
def parse(s)
|
|
258
|
-
validate_checksum(s)
|
|
259
|
-
ls_age, options, ls_type, ls_id, advr, seqn, csum, length, lsa = s.unpack('nCCNNNnna*')
|
|
260
|
-
@ls_type = LsType.new ls_type
|
|
261
|
-
@options = Options.new options
|
|
262
|
-
@ls_age = LsAge.new ls_age
|
|
263
|
-
@sequence_number = SequenceNumber.new seqn
|
|
264
|
-
@advertising_router = AdvertisingRouter.new advr
|
|
265
|
-
@ls_id = LsId.new ls_id
|
|
266
|
-
lsa
|
|
267
|
-
end
|
|
268
|
-
|
|
269
|
-
def key
|
|
270
|
-
[ls_type.to_i, ls_id.to_i, advertising_router.to_i]
|
|
271
|
-
end
|
|
272
|
-
|
|
273
|
-
# -1 self older than other
|
|
274
|
-
# 0 self equivalent to other
|
|
275
|
-
# +1 self newer than other
|
|
276
|
-
# FIXME: rename to 'newer'
|
|
277
|
-
# TODO: compare advr router id.
|
|
278
|
-
def <=>(other)
|
|
279
|
-
raise RuntimeError unless self.key == other.key
|
|
280
|
-
if self.sequence_number < other.sequence_number
|
|
281
|
-
# puts "*** jme: our lsa older than other: our seq less than other seq ***"
|
|
282
|
-
-1
|
|
283
|
-
elsif self.sequence_number > other.sequence_number
|
|
284
|
-
# puts "*** jme: our lsa newer than other: our seq greater than other seq ***"
|
|
285
|
-
+1
|
|
286
|
-
else
|
|
287
|
-
if self.csum_to_i < other.csum_to_i
|
|
288
|
-
# puts "*** jme: our lsa older than other: our csum less than other csum ***"
|
|
289
|
-
-1
|
|
290
|
-
elsif self.csum_to_i > other.csum_to_i
|
|
291
|
-
# puts "*** jme: our lsa newer than other: our csum greater than other csum ***"
|
|
292
|
-
+1
|
|
293
|
-
else
|
|
294
|
-
if (self.ls_age != other.ls_age and other.ls_age >= MaxAge) or
|
|
295
|
-
((other.ls_age - self.ls_age) > OSPFv2::MaxAgeDiff)
|
|
296
|
-
# puts "*** jme: our lsa newer than other: age diff < maxage diff: #{(other.ls_age - self.ls_age)} ***"
|
|
297
|
-
+1
|
|
298
|
-
else
|
|
299
|
-
# puts "*** jme: same lsa: age diff < maxage diff: #{(other.ls_age - self.ls_age)} ***"
|
|
300
|
-
0
|
|
301
|
-
end
|
|
302
|
-
end
|
|
303
|
-
end
|
|
304
|
-
end
|
|
305
|
-
|
|
306
|
-
def refresh(advertised_routers, refresh_time, seqn=nil)
|
|
307
|
-
return unless advertised_routers.has?(advertising_router)
|
|
308
|
-
return unless refresh?(refresh_time)
|
|
309
|
-
@sequence_number = SequenceNumber.new(seqn) if seqn
|
|
310
|
-
@sequence_number + 1
|
|
311
|
-
@ls_age = LsAge.new
|
|
312
|
-
retransmit
|
|
313
|
-
self
|
|
314
|
-
end
|
|
315
|
-
|
|
316
|
-
def force_refresh(seqn)
|
|
317
|
-
@sequence_number = SequenceNumber.new(seqn) if seqn
|
|
318
|
-
@sequence_number + 1
|
|
319
|
-
@ls_age = LsAge.new
|
|
320
|
-
retransmit
|
|
321
|
-
self
|
|
322
|
-
end
|
|
323
|
-
|
|
324
|
-
def maxage
|
|
325
|
-
ls_age.maxage and retransmit
|
|
326
|
-
self
|
|
327
|
-
end
|
|
328
|
-
|
|
329
|
-
def maxaged?
|
|
330
|
-
@ls_age.maxaged?
|
|
331
|
-
end
|
|
332
|
-
|
|
333
|
-
def to_hash
|
|
334
|
-
h = super
|
|
335
|
-
h.delete(:time)
|
|
336
|
-
h
|
|
337
|
-
end
|
|
338
|
-
|
|
339
|
-
def method_missing(method, *args, &block)
|
|
340
|
-
# puts "&&&&& #{self.class}: method: #{method}"
|
|
341
|
-
# p caller[0]
|
|
342
|
-
if method == :to_s_junos
|
|
343
|
-
:to_s_default
|
|
344
|
-
else
|
|
345
|
-
super
|
|
346
|
-
end
|
|
347
|
-
end
|
|
348
|
-
|
|
349
|
-
protected
|
|
350
|
-
|
|
351
|
-
def csum_to_i
|
|
352
|
-
@_csum.unpack('n')[0]
|
|
353
|
-
rescue Exception => e
|
|
354
|
-
encode
|
|
355
|
-
retry
|
|
356
|
-
end
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
private
|
|
360
|
-
|
|
361
|
-
def csum=(value)
|
|
362
|
-
raise if value.is_a?(Fixnum)
|
|
363
|
-
@_csum=value
|
|
364
|
-
end
|
|
365
|
-
|
|
366
|
-
def refresh?(refresh_time)
|
|
367
|
-
ls_age.to_i > refresh_time
|
|
368
|
-
end
|
|
369
|
-
|
|
370
|
-
def seqn
|
|
371
|
-
@sequence_number
|
|
372
|
-
end
|
|
373
|
-
|
|
374
|
-
def validate_checksum(s)
|
|
375
|
-
if ! cheksum(s[2..-1], 0) == [0,0]
|
|
376
|
-
puts "*** checksum error ? #{cheksum(s[2..-1], 0)}"
|
|
377
|
-
end
|
|
378
|
-
end
|
|
379
|
-
|
|
380
|
-
#FIXME
|
|
381
|
-
def klass_to_ls_type
|
|
382
|
-
case self.class
|
|
383
|
-
when OSPFv2::Router ; 1
|
|
384
|
-
when OSPFv2::Network ; 2
|
|
385
|
-
when OSPFv2::Summary ; 3
|
|
386
|
-
# when AsExternal ; 5
|
|
387
|
-
else
|
|
388
|
-
raise
|
|
389
|
-
end
|
|
390
|
-
end
|
|
391
|
-
|
|
392
|
-
MODX=4102
|
|
393
|
-
|
|
394
|
-
def cheksum(mess, k=0)
|
|
395
|
-
len = mess.size
|
|
396
|
-
|
|
397
|
-
if (k>0)
|
|
398
|
-
mess[k-1] = [0].pack('C')
|
|
399
|
-
mess[k] = [0].pack('C')
|
|
400
|
-
end
|
|
401
|
-
|
|
402
|
-
c0,c1,n=0,0,0
|
|
403
|
-
|
|
404
|
-
s = mess.dup
|
|
405
|
-
while s.size>0 and n <= 4102 # MODX
|
|
406
|
-
n +=1
|
|
407
|
-
c0 += s.slice!(0,1).unpack('C')[0]
|
|
408
|
-
c1 +=c0
|
|
409
|
-
end
|
|
410
|
-
|
|
411
|
-
c0 = c0%255
|
|
412
|
-
c1 = c1%255
|
|
413
|
-
|
|
414
|
-
ip = (c1 <<8) + c0
|
|
415
|
-
|
|
416
|
-
if k>0
|
|
417
|
-
iq = ((len-k)*c0 - c1)%255 ; iq += 255 if (iq <= 0)
|
|
418
|
-
ir = (510 - c0 - iq) ; ir += -255 if (ir>255)
|
|
419
|
-
return [iq,ir]
|
|
420
|
-
else
|
|
421
|
-
[c0,c1]
|
|
422
|
-
end
|
|
423
|
-
|
|
424
|
-
end
|
|
425
|
-
|
|
426
|
-
end
|
|
427
|
-
|
|
428
|
-
end
|
|
429
|
-
|
|
430
|
-
load "../../../test/ospfv2/lsa/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|