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
@@ -0,0 +1,55 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2011 Jean-Michel Esnault.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
# This file is part of OSPFv2.
|
8
|
+
#
|
9
|
+
#++
|
10
|
+
|
11
|
+
#FIXME: make bw an IE
|
12
|
+
|
13
|
+
require_relative 'tlv'
|
14
|
+
|
15
|
+
module OSPFv2
|
16
|
+
|
17
|
+
class MaximumBandwidth_Tlv
|
18
|
+
include SubTlv
|
19
|
+
include Common
|
20
|
+
|
21
|
+
attr_reader :tlv_type, :max_bw
|
22
|
+
|
23
|
+
def initialize(arg={})
|
24
|
+
@tlv_type = 6
|
25
|
+
@max_bw = 0
|
26
|
+
|
27
|
+
if arg.is_a?(Hash) then
|
28
|
+
set(arg.dup)
|
29
|
+
elsif arg.is_a?(String)
|
30
|
+
__parse(arg)
|
31
|
+
else
|
32
|
+
raise ArgumentError, "Invalid argument", caller
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def encode
|
37
|
+
[@tlv_type, 4, @max_bw/8.0].pack('nng')
|
38
|
+
end
|
39
|
+
|
40
|
+
def __parse(s)
|
41
|
+
@tlv_type, _, max_bw = s.unpack('nng')
|
42
|
+
@max_bw = (max_bw * 8).to_int
|
43
|
+
end
|
44
|
+
|
45
|
+
def to_s
|
46
|
+
"Maximum bandwidth : #{max_bw.to_i}"
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_s_junos_style(ident=0)
|
50
|
+
" "*ident + "RtrAddr (1), length #{@length}: #{router_id.to_ip}"
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
@@ -0,0 +1,52 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2011 Jean-Michel Esnault.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
# This file is part of OSPFv2.
|
8
|
+
#
|
9
|
+
#++
|
10
|
+
|
11
|
+
require_relative 'tlv'
|
12
|
+
|
13
|
+
module OSPFv2
|
14
|
+
|
15
|
+
class MaximumReservableBandwidth_Tlv
|
16
|
+
include SubTlv
|
17
|
+
include Common
|
18
|
+
|
19
|
+
attr_reader :tlv_type, :max_resv_bw
|
20
|
+
|
21
|
+
def initialize(arg={})
|
22
|
+
@tlv_type, = 7
|
23
|
+
@max_resv_bw = 0
|
24
|
+
|
25
|
+
if arg.is_a?(Hash) then
|
26
|
+
set(arg.dup)
|
27
|
+
elsif arg.is_a?(String)
|
28
|
+
__parse(arg)
|
29
|
+
else
|
30
|
+
raise ArgumentError, "Invalid argument", caller
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def encode
|
35
|
+
[@tlv_type, 4, @max_resv_bw/8.0].pack('nng')
|
36
|
+
end
|
37
|
+
|
38
|
+
def __parse(s)
|
39
|
+
@tlv_type, _, max_resv_bw = s.unpack('nng')
|
40
|
+
@max_resv_bw = (max_resv_bw*8).to_int
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_s
|
44
|
+
"Maximum reservable bandwidth : #{max_resv_bw}"
|
45
|
+
end
|
46
|
+
|
47
|
+
def to_s_junos_style(ident=0)
|
48
|
+
" "*ident + "RtrAddr (1), length #{@length}: #{router_id.to_ip}"
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2011 Jean-Michel Esnault.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
# This file is part of OSPFv2.
|
8
|
+
#
|
9
|
+
#++
|
10
|
+
|
11
|
+
require_relative 'tlv'
|
12
|
+
|
13
|
+
#TODO interface_adrress base tlv : DRY
|
14
|
+
|
15
|
+
module OSPFv2
|
16
|
+
|
17
|
+
class RemoteInterfaceIpAddress_Tlv
|
18
|
+
include SubTlv
|
19
|
+
include Common
|
20
|
+
|
21
|
+
IpAddress = Class.new(Id) unless const_defined?(:IpAddress)
|
22
|
+
attr_reader :tlv_type, :ip_address
|
23
|
+
|
24
|
+
attr_writer_delegate :ip_address
|
25
|
+
|
26
|
+
def initialize(arg={})
|
27
|
+
@tlv_type = 4
|
28
|
+
@ip_address = IpAddress.new
|
29
|
+
|
30
|
+
if arg.is_a?(Hash) then
|
31
|
+
set(arg.dup)
|
32
|
+
elsif arg.is_a?(String)
|
33
|
+
__parse(arg)
|
34
|
+
else
|
35
|
+
raise ArgumentError, "Invalid argument", caller
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def encode
|
40
|
+
[@tlv_type, 4, @ip_address.encode].pack('nna*')
|
41
|
+
end
|
42
|
+
|
43
|
+
def __parse(s)
|
44
|
+
@tlv_type, _, ip_address = s.unpack('nna*')
|
45
|
+
@ip_address = IpAddress.new_ntoh(ip_address)
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
def to_s
|
50
|
+
"Neighbor Address : #{ip_address.to_ip}"
|
51
|
+
end
|
52
|
+
|
53
|
+
def to_s_junos_style(ident=0)
|
54
|
+
" "*ident + "RtrAddr (1), length #{@length}: #{router_id.to_ip}"
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2011 Jean-Michel Esnault.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
# This file is part of OSPFv2.
|
8
|
+
#
|
9
|
+
#++
|
10
|
+
|
11
|
+
require_relative 'tlv'
|
12
|
+
|
13
|
+
module OSPFv2
|
14
|
+
|
15
|
+
class RouterAddress_Tlv
|
16
|
+
include SubTlv
|
17
|
+
include Common
|
18
|
+
|
19
|
+
IpAddress = Class.new(Id) unless const_defined?(:IpAddress)
|
20
|
+
attr_reader :tlv_type, :ip_address
|
21
|
+
|
22
|
+
attr_writer_delegate :ip_address
|
23
|
+
|
24
|
+
def initialize(arg={})
|
25
|
+
@tlv_type = 1
|
26
|
+
@ip_address = IpAddress.new
|
27
|
+
|
28
|
+
if arg.is_a?(Hash) then
|
29
|
+
set(arg.dup)
|
30
|
+
elsif arg.is_a?(String)
|
31
|
+
__parse(arg)
|
32
|
+
else
|
33
|
+
raise ArgumentError, "Invalid argument", caller
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def encode
|
38
|
+
[@tlv_type, 4, @ip_address.encode].pack('nna*')
|
39
|
+
end
|
40
|
+
|
41
|
+
def __parse(s)
|
42
|
+
@tlv_type, _, ip_address = s.unpack('nna*')
|
43
|
+
@ip_address = IpAddress.new_ntoh(ip_address)
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
def to_s
|
48
|
+
"RouterID TLV: #{ip_address.to_ip}"
|
49
|
+
end
|
50
|
+
|
51
|
+
def to_s_junos_style(ident=0)
|
52
|
+
" "*ident + "RtrAddr (1), length #{@length}: #{ip_address.to_ip}"
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
data/lib/lsa/tlv/tlv.rb
CHANGED
@@ -0,0 +1,32 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2011 Jean-Michel Esnault.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
# This file is part of OSPFv2.
|
8
|
+
#
|
9
|
+
#++
|
10
|
+
|
11
|
+
require_relative '../../infra/ospf_common'
|
12
|
+
require_relative '../../ie/id'
|
13
|
+
|
14
|
+
module OSPFv2
|
15
|
+
module Tlv
|
16
|
+
module Common
|
17
|
+
def stlv_len(n)
|
18
|
+
(((n+3)/4)*4)+4
|
19
|
+
end
|
20
|
+
def tlv_len
|
21
|
+
@length
|
22
|
+
end
|
23
|
+
def to_hash
|
24
|
+
{:tlv_type=> tlv_type}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
module SubTlv
|
29
|
+
include Tlv
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
@@ -0,0 +1,72 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2011 Jean-Michel Esnault.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
# This file is part of OSPFv2.
|
8
|
+
#
|
9
|
+
#++
|
10
|
+
|
11
|
+
require_relative 'router_address'
|
12
|
+
require_relative 'link_type'
|
13
|
+
|
14
|
+
module OSPFv2::Tlv
|
15
|
+
def self.factory(arg={})
|
16
|
+
type=0
|
17
|
+
case arg
|
18
|
+
when Hash
|
19
|
+
return nil unless arg.has_key?(:tlv_type)
|
20
|
+
type = arg[:tlv_type]
|
21
|
+
when String
|
22
|
+
type = arg.unpack('n')[0]
|
23
|
+
return nil unless type
|
24
|
+
else
|
25
|
+
raise
|
26
|
+
end
|
27
|
+
case type
|
28
|
+
when 1 ; OSPFv2::RouterAddress_Tlv.new(arg.dup)
|
29
|
+
when 2 ; OSPFv2::Link_Tlv.new(arg.dup)
|
30
|
+
else
|
31
|
+
raise
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
require_relative 'link'
|
37
|
+
require_relative 'link_type'
|
38
|
+
require_relative 'link_id'
|
39
|
+
require_relative 'local_interface'
|
40
|
+
require_relative 'remote_interface'
|
41
|
+
require_relative 'maximum_bandwidth'
|
42
|
+
require_relative 'maximum_reservable_bandwidth'
|
43
|
+
require_relative 'unreserved_bandwidth'
|
44
|
+
require_relative 'traffic_engineering_metric'
|
45
|
+
require_relative 'color.rb'
|
46
|
+
|
47
|
+
module OSPFv2::SubTlv
|
48
|
+
def self.factory(arg={})
|
49
|
+
if arg.is_a?(Hash)
|
50
|
+
return nil if arg[:tlv_type].nil?
|
51
|
+
type = arg[:tlv_type]
|
52
|
+
elsif arg.is_a?(String)
|
53
|
+
type = arg.unpack('n')[0]
|
54
|
+
else
|
55
|
+
return
|
56
|
+
end
|
57
|
+
case type
|
58
|
+
when 1 ; OSPFv2::LinkType_Tlv.new(arg)
|
59
|
+
when 2 ; OSPFv2::LinkId_Tlv.new(arg)
|
60
|
+
when 3 ; OSPFv2::LocalInterfaceIpAddress_Tlv.new(arg)
|
61
|
+
when 4 ; OSPFv2::RemoteInterfaceIpAddress_Tlv.new(arg)
|
62
|
+
when 5 ; OSPFv2::TrafficEngineeringMetric_Tlv.new(arg)
|
63
|
+
when 6 ; OSPFv2::MaximumBandwidth_Tlv.new(arg)
|
64
|
+
when 7 ; OSPFv2::MaximumReservableBandwidth_Tlv.new(arg)
|
65
|
+
when 8 ; OSPFv2::UnreservedBandwidth_Tlv.new(arg)
|
66
|
+
when 9 ; OSPFv2::Color_Tlv.new(arg)
|
67
|
+
else
|
68
|
+
raise
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
@@ -0,0 +1,52 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2011 Jean-Michel Esnault.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
# This file is part of OSPFv2.
|
8
|
+
#
|
9
|
+
#++
|
10
|
+
|
11
|
+
require_relative 'tlv'
|
12
|
+
|
13
|
+
module OSPFv2
|
14
|
+
|
15
|
+
class TrafficEngineeringMetric_Tlv
|
16
|
+
include SubTlv
|
17
|
+
include Common
|
18
|
+
|
19
|
+
attr_reader :tlv_type, :te_metric
|
20
|
+
|
21
|
+
def initialize(arg={})
|
22
|
+
@tlv_type, = 5
|
23
|
+
@te_metric = 0
|
24
|
+
|
25
|
+
if arg.is_a?(Hash) then
|
26
|
+
set(arg.dup)
|
27
|
+
elsif arg.is_a?(String)
|
28
|
+
__parse(arg)
|
29
|
+
else
|
30
|
+
raise ArgumentError, "Invalid argument", caller
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def encode
|
35
|
+
[@tlv_type, 4, @te_metric].pack('nnN')
|
36
|
+
end
|
37
|
+
|
38
|
+
def __parse(s)
|
39
|
+
@tlv_type, _, @te_metric = s.unpack('nnN')
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
def to_s
|
44
|
+
"Admin Metric : #{te_metric}"
|
45
|
+
end
|
46
|
+
|
47
|
+
def to_s_junos_style(ident=0)
|
48
|
+
" "*ident + "RtrAddr (1), length #{@length}: #{router_id.to_ip}"
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2011 Jean-Michel Esnault.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
# This file is part of OSPFv2.
|
8
|
+
#
|
9
|
+
#++
|
10
|
+
|
11
|
+
require_relative 'tlv'
|
12
|
+
|
13
|
+
module OSPFv2
|
14
|
+
|
15
|
+
class UnreservedBandwidth_Tlv
|
16
|
+
include SubTlv
|
17
|
+
include Common
|
18
|
+
|
19
|
+
attr_reader :tlv_type, :unreserved_bw
|
20
|
+
|
21
|
+
def initialize(arg={})
|
22
|
+
@tlv_type = 8
|
23
|
+
@unreserved_bw = [0]*8
|
24
|
+
|
25
|
+
if arg.is_a?(Hash) then
|
26
|
+
set(arg.dup)
|
27
|
+
elsif arg.is_a?(String)
|
28
|
+
__parse(arg)
|
29
|
+
else
|
30
|
+
raise ArgumentError, "Invalid argument", caller
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def encode
|
35
|
+
[@tlv_type, 32].pack('nn') +
|
36
|
+
unreserved_bw.collect { |bw| bw / 8.0 }.pack('g*')
|
37
|
+
end
|
38
|
+
|
39
|
+
def __parse(s)
|
40
|
+
@tlv_type, _, *unreserved_bw = s.unpack('nng*')
|
41
|
+
@unreserved_bw = unreserved_bw.collect {|bw| (bw*8).to_i }
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_hash
|
45
|
+
h=super
|
46
|
+
h[:unreserved_bw] = unreserved_bw
|
47
|
+
h
|
48
|
+
end
|
49
|
+
def to_s
|
50
|
+
"Unreserved bandwidth : " + unreserved_bw.collect { |bw| "%s" % bw }.join(", ")
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
@@ -0,0 +1,95 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2011 Jean-Michel Esnault.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
# This file is part of OSPFv2.
|
8
|
+
#
|
9
|
+
#++
|
10
|
+
|
11
|
+
require_relative 'opaque'
|
12
|
+
require 'ie/opaque_id'
|
13
|
+
require 'ie/opaque_type'
|
14
|
+
require_relative 'tlv/tlv_factory'
|
15
|
+
|
16
|
+
module OSPFv2
|
17
|
+
class TrafficEngineering < Lsa
|
18
|
+
include Tlv
|
19
|
+
#FIXME: move this under OpaqueId ?????
|
20
|
+
@_opaque_id = 0
|
21
|
+
|
22
|
+
class << self
|
23
|
+
attr_accessor :_opaque_id
|
24
|
+
def opaque_id
|
25
|
+
@_opaque_id +=1
|
26
|
+
end
|
27
|
+
def reset_opaque_id
|
28
|
+
@_opaque_id=0
|
29
|
+
end
|
30
|
+
def new_hash(h)
|
31
|
+
r = new(h.dup)
|
32
|
+
r
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
attr_accessor :top_lvl_tlv, :opaque_id
|
37
|
+
|
38
|
+
def initialize(_arg={})
|
39
|
+
arg = _arg.dup
|
40
|
+
@ls_type = LsType.new(:area)
|
41
|
+
case arg
|
42
|
+
when Hash
|
43
|
+
super()
|
44
|
+
set arg
|
45
|
+
when String
|
46
|
+
parse arg
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def set(h)
|
51
|
+
return if h.empty?
|
52
|
+
if h.has_key?(:top_lvl_tlv)
|
53
|
+
tlv = h.delete(:top_lvl_tlv)
|
54
|
+
case tlv
|
55
|
+
when Hash
|
56
|
+
@top_lvl_tlv = OSPFv2::Tlv.factory(tlv)
|
57
|
+
when Tlv
|
58
|
+
@top_lvl_tlv = tlv
|
59
|
+
else
|
60
|
+
raise
|
61
|
+
end
|
62
|
+
end
|
63
|
+
super
|
64
|
+
end
|
65
|
+
|
66
|
+
def encode
|
67
|
+
if top_lvl_tlv
|
68
|
+
super top_lvl_tlv.encode
|
69
|
+
else
|
70
|
+
super
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def to_s_ios
|
75
|
+
super + @opaque_id.to_i.to_s
|
76
|
+
end
|
77
|
+
|
78
|
+
def to_s_ios_verbose
|
79
|
+
to_s_verbose # for now
|
80
|
+
end
|
81
|
+
|
82
|
+
def to_s_verbose
|
83
|
+
s = []
|
84
|
+
s << super
|
85
|
+
s << top_lvl_tlv.to_s(:ident=>5)
|
86
|
+
s.join("\n ")
|
87
|
+
end
|
88
|
+
|
89
|
+
def parse(s)
|
90
|
+
@top_lvl_tlv = Tlv.factory(super(s))
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|