ospfv2 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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