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
|
@@ -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
|