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.
Files changed (107) hide show
  1. checksums.yaml +7 -0
  2. data/COPYING +674 -0
  3. data/LICENSE.txt +53 -0
  4. data/README +50 -0
  5. data/bin/ospfv2 +112 -105
  6. data/changelog.txt +7 -0
  7. data/gemspec +17 -0
  8. data/lib/ie/external_route.rb +9 -0
  9. data/lib/ie/id.rb +3 -4
  10. data/lib/ie/ie.rb +12 -0
  11. data/lib/ie/ls_age.rb +35 -5
  12. data/lib/ie/ls_type.rb +40 -37
  13. data/lib/ie/opaque_id.rb +46 -0
  14. data/lib/ie/opaque_type.rb +96 -0
  15. data/lib/ie/options.rb +5 -3
  16. data/lib/ie/router_link.rb +30 -7
  17. data/lib/ie/router_link_type.rb +116 -27
  18. data/lib/ie/sequence_number.rb +7 -3
  19. data/lib/infra/ospf_common.rb +1 -12
  20. data/lib/infra/ospf_io.rb +14 -8
  21. data/lib/infra/ospf_socket.rb +14 -14
  22. data/lib/infra/parse_options.rb +69 -25
  23. data/lib/ls_db/advertised_routers.rb +1 -1
  24. data/lib/ls_db/link_state_database.rb +74 -39
  25. data/lib/ls_db/link_state_database_build.rb +3 -3
  26. data/lib/ls_db/link_state_database_links.rb +7 -2
  27. data/lib/ls_db/lsdb_ios.rb +59 -0
  28. data/lib/lsa/external.rb +35 -2
  29. data/lib/lsa/lsa.rb +128 -35
  30. data/lib/lsa/lsa_factory.rb +20 -7
  31. data/lib/lsa/network.rb +44 -9
  32. data/lib/lsa/router.rb +14 -2
  33. data/lib/lsa/summary.rb +16 -3
  34. data/lib/lsa/tlv/color.rb +47 -0
  35. data/lib/lsa/tlv/link.rb +122 -0
  36. data/lib/lsa/tlv/link_id.rb +55 -0
  37. data/lib/lsa/tlv/link_type.rb +44 -0
  38. data/lib/lsa/tlv/local_interface.rb +56 -0
  39. data/lib/lsa/tlv/maximum_bandwidth.rb +55 -0
  40. data/lib/lsa/tlv/maximum_reservable_bandwidth.rb +52 -0
  41. data/lib/lsa/tlv/remote_interface.rb +58 -0
  42. data/lib/lsa/tlv/router_address.rb +57 -0
  43. data/lib/lsa/tlv/tlv.rb +32 -0
  44. data/lib/lsa/tlv/tlv_factory.rb +72 -0
  45. data/lib/lsa/tlv/traffic_engineering_metric.rb +52 -0
  46. data/lib/lsa/tlv/unreserved_bandwidth.rb +55 -0
  47. data/lib/lsa/traffic_engineering.rb +95 -0
  48. data/lib/neighbor/neighbor.rb +9 -9
  49. data/lib/packet/link_state_update.rb +16 -14
  50. data/lib/packet/ospf_packet.rb +13 -9
  51. data/test/unit/ie/au_type_test.rb +18 -0
  52. data/test/unit/ie/external_route_test.rb +51 -0
  53. data/test/unit/ie/id_test.rb +22 -0
  54. data/test/unit/ie/interface_mtu_test.rb +23 -0
  55. data/test/unit/ie/ls_age_test.rb +46 -0
  56. data/test/unit/ie/ls_type_test.rb +41 -0
  57. data/test/unit/ie/metric_test.rb +24 -0
  58. data/test/unit/ie/mt_metric_test.rb +27 -0
  59. data/test/unit/ie/opaque_id_test.rb +22 -0
  60. data/test/unit/ie/opaque_type_test.rb +22 -0
  61. data/test/unit/ie/options_test.rb +142 -0
  62. data/test/unit/ie/ospf_version_test.rb +0 -0
  63. data/test/unit/ie/packet_type_test.rb +33 -0
  64. data/test/unit/ie/router_link_factory_test.rb +26 -0
  65. data/test/unit/ie/router_link_test.rb +276 -0
  66. data/test/unit/ie/router_link_type_test.rb +24 -0
  67. data/test/unit/ie/sequence_number_test.rb +31 -0
  68. data/test/unit/ie/tos_metric_test.rb +27 -0
  69. data/test/unit/infra/ospf_common_test.rb +42 -0
  70. data/test/unit/infra/parse_options_test.rb +58 -0
  71. data/test/unit/infra/timer_test.rb +94 -0
  72. data/test/unit/ls_db/all +10 -0
  73. data/test/unit/ls_db/link_state_database_build_test.rb +140 -0
  74. data/test/unit/ls_db/link_state_database_links_tests.rb +74 -0
  75. data/test/unit/ls_db/link_state_database_test.rb +444 -0
  76. data/test/unit/ls_db/links_test.rb +49 -0
  77. data/test/unit/lsa/all +10 -0
  78. data/test/unit/lsa/external_test.rb +218 -0
  79. data/test/unit/lsa/lsa_factory_test.rb +314 -0
  80. data/test/unit/lsa/lsa_test.rb +191 -0
  81. data/test/unit/lsa/network_test.rb +107 -0
  82. data/test/unit/lsa/router_test.rb +614 -0
  83. data/test/unit/lsa/summary_test.rb +135 -0
  84. data/test/unit/lsa/tlv/color_test.rb +39 -0
  85. data/test/unit/lsa/tlv/link_id_test.rb +14 -0
  86. data/test/unit/lsa/tlv/link_test.rb +413 -0
  87. data/test/unit/lsa/tlv/link_type_test.rb +16 -0
  88. data/test/unit/lsa/tlv/local_interface_test.rb +15 -0
  89. data/test/unit/lsa/tlv/maximum_bandwidth_test.rb +14 -0
  90. data/test/unit/lsa/tlv/maximum_reservable_bandwidth_test.rb +13 -0
  91. data/test/unit/lsa/tlv/remote_interface_test.rb +14 -0
  92. data/test/unit/lsa/tlv/router_address_test.rb +16 -0
  93. data/test/unit/lsa/tlv/tlv_factory_test.rb +89 -0
  94. data/test/unit/lsa/tlv/traffic_engineering_metric_test.rb +15 -0
  95. data/test/unit/lsa/traffic_engineering_test.rb +65 -0
  96. data/test/unit/neighbor/neighbor_test.rb +82 -0
  97. data/test/unit/packet/all +10 -0
  98. data/test/unit/packet/database_description_test.rb +114 -0
  99. data/test/unit/packet/hello_test.rb +107 -0
  100. data/test/unit/packet/link_state_ack_test.rb +64 -0
  101. data/test/unit/packet/link_state_request_test.rb +168 -0
  102. data/test/unit/packet/link_state_update_test.rb +62 -0
  103. data/test/unit/packet/ospf_packet_test.rb +91 -0
  104. metadata +106 -51
  105. data/lib/infra/to_s.rb +0 -38
  106. data/lib/lsa/lsa_base.rb +0 -430
  107. 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
+
@@ -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