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
@@ -20,8 +20,10 @@
20
20
  # along with OSPFv2. If not, see <http://www.gnu.org/licenses/>.
21
21
  #++
22
22
 
23
+ require_relative 'ie'
23
24
  module OSPFv2
24
25
  class LsType
26
+ include IE
25
27
 
26
28
  @ls_type_junos = {
27
29
  1 => 'Router' ,
@@ -34,6 +36,17 @@ class LsType
34
36
  11=> 'OpaqAS' ,
35
37
  }
36
38
 
39
+ @ls_type_ios = {
40
+ 1 => 'Router Links',
41
+ 2 => 'Network Links',
42
+ 3 => 'Summary Links(Network)',
43
+ 4 => 'Summary Links(AS Boundary Router)',
44
+ 5 => 'AS External Link',
45
+ 9 => 'OpaqLoca',
46
+ 10=> 'Opaque Area Link',
47
+ 11=> 'OpaqAS' ,
48
+ }
49
+
37
50
  @ls_type_short = {
38
51
  1=>'router' ,
39
52
  2=>'network' ,
@@ -46,16 +59,17 @@ class LsType
46
59
  11=>'opaqAs' ,
47
60
  }
48
61
 
62
+ # FIXME: rename all opaque :opaque_area , :opaque_link_local, :opaque_domain
49
63
  @ls_type_sym = {
50
- 1 => :router_lsa ,
51
- 2 => :network_lsa ,
52
- 3 => :summary_lsa ,
53
- 4 => :asbr_summary_lsa,
54
- 5 => :as_external_lsa ,
55
- 7 => :as_external7_lsa,
56
- 9 => :link_local_lsa ,
57
- 10 => :area_lsa ,
58
- 11 => :domain_lsa ,
64
+ 1 => :router ,
65
+ 2 => :network ,
66
+ 3 => :summary ,
67
+ 4 => :asbr_summary,
68
+ 5 => :as_external ,
69
+ 7 => :as_external7,
70
+ 9 => :link_local ,
71
+ 10 => :area ,
72
+ 11 => :domain ,
59
73
  }
60
74
 
61
75
  @ls_type_sym_to_i = @ls_type_sym.invert
@@ -66,23 +80,12 @@ class LsType
66
80
 
67
81
  class << self
68
82
  def all
69
- [:router, :network, :summary, :asbr_summary, :as_external]
83
+ [:router, :network, :summary, :asbr_summary, :as_external, :area]
70
84
  end
71
85
 
72
86
  def to_i(arg)
73
87
  return arg unless arg.is_a?(Symbol)
74
- case arg.to_s
75
- when /^router(_lsa|)$/ ; @ls_type=1
76
- when /^network(_lsa|)$/ ; @ls_type=2
77
- when /^summary(_lsa|)$/ ; @ls_type=3
78
- when /^asbr_summary(_lsa|)$/ ; @ls_type=4
79
- when /^as_external(_lsa|)$/ ; @ls_type=5
80
- #FIXME: finish and unit-test
81
- # when :as_external7_lsa ; @ls_type=7
82
- # when :opaque_link ; @ls_type=9
83
- # when :opaque_area ; @ls_type=10
84
- # when :opaque_as ; @ls_type=11
85
- end
88
+ ls_type_sym_to_i(arg)
86
89
  end
87
90
 
88
91
  def to_sym(arg)
@@ -99,7 +102,7 @@ class LsType
99
102
  if @ls_type_sym_to_i.has_key?(arg)
100
103
  @ls_type_sym_to_i[arg]
101
104
  else
102
- raise
105
+ raise "cannot convert #{arg.inspect} to i"
103
106
  end
104
107
  end
105
108
 
@@ -112,6 +115,15 @@ class LsType
112
115
  end
113
116
  end
114
117
 
118
+ def to_s_ios(arg)
119
+ return arg unless arg.is_a?(Fixnum)
120
+ if @ls_type_ios.has_key?(arg)
121
+ @ls_type_ios[arg]
122
+ else
123
+ raise
124
+ end
125
+ end
126
+
115
127
  def to_short(arg)
116
128
  return arg unless arg.is_a?(Fixnum)
117
129
  if @ls_type_short.has_key?(arg)
@@ -121,7 +133,7 @@ class LsType
121
133
  end
122
134
  end
123
135
  end
124
-
136
+
125
137
  def initialize(ls_type=1)
126
138
  @ls_type = case ls_type
127
139
  when Symbol
@@ -156,6 +168,10 @@ class LsType
156
168
  LsType.to_short(to_i)
157
169
  end
158
170
 
171
+ def to_s_ios
172
+ "LS Type: " + LsType.to_s_ios(to_i)
173
+ end
174
+
159
175
  def to_junos
160
176
  LsType.to_junos(to_i)
161
177
  end
@@ -163,19 +179,6 @@ class LsType
163
179
  end
164
180
  end
165
181
 
166
- load "../../../test/ospfv2/ie/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
167
-
168
- __END__
169
182
 
170
- LSA_Header.aging=false
171
- LSA_Header.lstype_to_s = Hash.new("unknown")
172
- LSA_Header.lstype_to_s.store(1,"Router")
173
- LSA_Header.lstype_to_s.store(2,"Network")
174
- LSA_Header.lstype_to_s.store(3,"Summary")
175
- LSA_Header.lstype_to_s.store(4,"ASBR_Sum")
176
- LSA_Header.lstype_to_s.store(5,"External")
177
- LSA_Header.lstype_to_s.store(9,"OpaqLink")
178
- LSA_Header.lstype_to_s.store(10,"OpaqArea")
179
- LSA_Header.lstype_to_s.store(11,"OpaqAS")
180
183
 
181
184
 
@@ -0,0 +1,46 @@
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 'infra/ospf_common'
12
+
13
+ module OSPFv2
14
+ class OpaqueId
15
+ include Common
16
+
17
+ attr_reader :opaque_id
18
+ attr_checked :opaque_id do |x|
19
+ (0..0xffffff).include?(x)
20
+ end
21
+
22
+ def initialize(opaque_id=0)
23
+ self.opaque_id=opaque_id
24
+ end
25
+
26
+ def to_i
27
+ opaque_id
28
+ end
29
+
30
+ def to_s
31
+ self.class.to_s.split('::').last + ": #{to_i}"
32
+ end
33
+
34
+ def encode
35
+ [opaque_id].pack('N')[1..-1]
36
+ end
37
+ alias :enc :encode
38
+
39
+ def to_hash
40
+ to_i
41
+ end
42
+
43
+ end
44
+ end
45
+
46
+ load "../../../test/ospfv2/ie/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
@@ -0,0 +1,96 @@
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 'ie/ie'
12
+ module OSPFv2
13
+ class OpaqueType
14
+ include IE
15
+
16
+ @opaque_type_sym = {
17
+ 1 => :te_lsa,
18
+ 2 => :sycamore_optical_topology_description,
19
+ 3 => :grace_lsa,
20
+ 4 => :router_information,
21
+ }
22
+
23
+ @opaque_type_sym_to_i = @opaque_type_sym.invert
24
+
25
+ class << self
26
+ def all
27
+ @opaque_type_sym_to_i.key
28
+ end
29
+
30
+ def to_sym(arg)
31
+ return arg unless arg.is_a?(Fixnum)
32
+ if @opaque_type_sym.has_key?(arg)
33
+ @opaque_type_sym[arg]
34
+ else
35
+ raise
36
+ end
37
+ end
38
+
39
+ def to_i(arg)
40
+ return arg if arg.is_a?(Fixnum)
41
+ if @opaque_type_sym_to_i.has_key?(arg)
42
+ @opaque_type_sym_to_i[arg]
43
+ else
44
+ raise
45
+ end
46
+ end
47
+
48
+ end
49
+
50
+ def initialize(opaque_type=1)
51
+ @opaque_type = case opaque_type
52
+ when Symbol
53
+ OpaqueType.to_i(opaque_type)
54
+ when Fixnum
55
+ opaque_type
56
+ else
57
+ raise ArgumentError, "Invalid OpaqueType #{opaque_type}"
58
+ end
59
+ end
60
+ def to_i
61
+ @opaque_type
62
+ end
63
+ def to_s
64
+ self.class.to_s.split('::').last + ": #{to_sym}"
65
+ end
66
+
67
+ def to_sym
68
+ OpaqueType.to_sym @opaque_type
69
+ end
70
+
71
+ def encode
72
+ [@opaque_type].pack('C')
73
+ end
74
+ alias :enc :encode
75
+
76
+ def to_hash
77
+ to_sym
78
+ end
79
+
80
+ end
81
+ end
82
+
83
+ load "../../../test/ospfv2/ie/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
84
+
85
+ __END__
86
+
87
+ Registry:
88
+ Value Opaque Type Reference
89
+ ------- ------------------------------------------ ---------
90
+ 1 Traffic Engineering LSA [RFC3630]
91
+ 2 Sycamore Optical Topology Descriptions [Moy]
92
+ 3 grace-LSA [RFC3623]
93
+ 4 Router Information (RI) [RFC4970]
94
+ 5-127 Unassigned
95
+ 128-255 Private Use
96
+
@@ -109,11 +109,13 @@ A.2 The Options field
109
109
 
110
110
  =end
111
111
 
112
- require 'infra/ospf_common'
112
+ require_relative '../infra/ospf_common'
113
+ require_relative 'ie'
113
114
  module OSPFv2
114
115
 
115
116
 
116
117
  class Options
118
+ include IE
117
119
 
118
120
  attr_accessor :options
119
121
 
@@ -149,6 +151,8 @@ module OSPFv2
149
151
  end
150
152
  end
151
153
  end
154
+
155
+
152
156
  unless arg[:DC].nil? and arg[:dc].nil?
153
157
  _flag = arg[:DC] ||= arg[:dc]
154
158
  if _flag.is_a?(TrueClass)
@@ -373,5 +377,3 @@ module OSPFv2
373
377
  end
374
378
 
375
379
  end
376
-
377
- load "../../../test/ospfv2/ie/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
@@ -82,19 +82,40 @@ module OSPFv2
82
82
  rlink.join
83
83
  end
84
84
 
85
- def to_s(ident=2)
85
+ def to_s(ident=4)
86
86
  encode unless @router_link_type
87
87
  self.class.to_s.split('::').last + ":" +
88
88
  ['',link_id, link_data, router_link_type, metric, *mt_metrics].compact.collect { |x| x.to_s }.join("\n"+" "*ident)
89
89
  end
90
90
 
91
- def to_s_junos_style
92
- s = " id #{id}, data #{data}, Type #{RouterLink.type_to_s_junos_style[@type]} (#{@type})"
93
- s +="\n Topology count: #{@mt_id.size}, Default metric: #{@metric}"
94
- s += @mt_id.collect { |mt| "\n #{mt.to_s_junos_style}" }.join
95
- s
91
+ def link_id_to_s(link_type)
92
+ RouterLinkType.link_id_to_s(link_type)
96
93
  end
97
-
94
+
95
+ def link_data_to_s(link_type)
96
+ RouterLinkType.link_data_to_s(link_type)
97
+ end
98
+
99
+ # Link connected to: another Router (point-to-point)
100
+ # (Link ID) Neighboring Router ID: 1.1.1.1
101
+ # (Link Data) Router Interface address: 192.168.158.1
102
+ # Number of TOS metrics: 0
103
+ # TOS 0 Metrics: 1
104
+ def to_s_ios
105
+ s = []
106
+ s << ''
107
+ s << "Link connected to: #{router_link_type.to_s_ios}"
108
+ s << " (Link ID) #{link_id_to_s(router_link_type.to_i)}: #{link_id.to_ip}"
109
+ s << " (Link Data) #{link_data_to_s(router_link_type.to_i)}: #{link_data.to_ip}"
110
+ s << " Number of TOS metrics: #{@mt_metrics.size}"
111
+ s << " TOS 0 Metrics: #{metric.to_i}"
112
+ s << @mt_metrics.collect { |mt| "\n #{mt.to_s}" }.join unless @mt_metrics.empty?
113
+ s << ''
114
+ s.join("\n ")
115
+ end
116
+ alias :to_s_ios_verbose :to_s_ios
117
+
118
+
98
119
  def to_s_junos
99
120
  s = " id #{link_id.to_ip}, data #{link_data.to_ip}, Type #{RouterLinkType.to_junos(router_link_type.to_i)} (#{router_link_type.to_i})"
100
121
  s +="\n Topology count: #{@mt_metrics.size}, Default metric: #{metric.to_i}"
@@ -144,3 +165,5 @@ end
144
165
 
145
166
 
146
167
  load "../../../test/ospfv2/ie/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
168
+
169
+
@@ -30,30 +30,121 @@
30
30
 
31
31
  module OSPFv2
32
32
  class RouterLinkType
33
- def self.each
34
- [:point_to_point, :transit_network, :stub_network, :virtual_link].each { |x| yield(x) } if block_given?
35
- end
36
- def self.to_i(arg)
37
- return arg unless arg.is_a?(Symbol)
38
- [:point_to_point, :transit_network, :stub_network, :virtual_link].index(arg)+1
39
- end
40
- def self.to_junos(type)
41
- case type.to_i
42
- when 1 ; 'Point-to-point'
43
- when 2 ; 'Transit'
44
- when 3 ; 'Stub'
45
- when 4 ; 'Virtual-link'
46
- else ; type.to_i
33
+
34
+ @router_link_sym = {
35
+ 1 => :point_to_point,
36
+ 2 => :transit_network,
37
+ 3 => :stub_network,
38
+ 4 => :virtual_link,
39
+ }
40
+
41
+ @router_link_sym_to_i = @router_link_sym.invert
42
+
43
+ @router_link_type_junos = {
44
+ 1 => 'Point-to-point',
45
+ 2 => 'Transit',
46
+ 3 => 'Stub',
47
+ 4 => 'Virtual-link',
48
+ }
49
+
50
+ @router_link_type_ios = {
51
+ 1 => 'another Router (point-to-point)',
52
+ 2 => 'a Transit Network',
53
+ 3 => 'a Stub Network',
54
+ 4 => 'a Virtual Link',
55
+ }
56
+
57
+ @link_id_from_type = {
58
+ 1 => 'Neighboring Router ID',
59
+ 2 => 'Designated Router address',
60
+ 3 => 'Network/subnet number',
61
+ 4 => 'TBD',
62
+ }
63
+
64
+ @link_data_from_type = {
65
+ 1 => 'Router Interface address',
66
+ 2 => 'Router Interface address',
67
+ 3 => 'Network Mask',
68
+ 4 => 'TBD',
69
+ }
70
+
71
+ class << self
72
+
73
+ def to_i(arg)
74
+ router_link_sym_to_i(arg)
75
+ end
76
+
77
+ def all
78
+ [:point_to_point, :transit_network, :stub_network, :virtual_link]
79
+ end
80
+
81
+ def each
82
+ all.each { |x| yield(x) } if block_given?
83
+ end
84
+
85
+ def to_sym(arg)
86
+ return arg unless arg.is_a?(Fixnum)
87
+ if @router_link_sym.has_key?(arg)
88
+ @router_link_sym[arg]
89
+ else
90
+ raise
91
+ end
92
+ end
93
+
94
+ def router_link_sym_to_i(arg)
95
+ return arg if arg.is_a?(Fixnum)
96
+ if @router_link_sym_to_i.has_key?(arg)
97
+ @router_link_sym_to_i[arg]
98
+ else
99
+ raise
100
+ end
101
+ end
102
+
103
+ def link_id_to_s(arg)
104
+ return arg unless arg.is_a?(Fixnum)
105
+ if @link_id_from_type.has_key?(arg)
106
+ @link_id_from_type[arg]
107
+ else
108
+ raise
109
+ end
110
+ end
111
+
112
+ def link_data_to_s(arg)
113
+ return arg unless arg.is_a?(Fixnum)
114
+ if @link_data_from_type.has_key?(arg)
115
+ @link_data_from_type[arg]
116
+ else
117
+ raise
118
+ end
119
+ end
120
+
121
+ def to_junos(arg)
122
+ return arg unless arg.is_a?(Fixnum)
123
+ if @router_link_type_junos.has_key?(arg)
124
+ @router_link_type_junos[arg]
125
+ else
126
+ arg
127
+ end
128
+ end
129
+
130
+ def to_s_ios(arg)
131
+ return arg unless arg.is_a?(Fixnum)
132
+ if @router_link_type_ios.has_key?(arg)
133
+ @router_link_type_ios[arg]
134
+ else
135
+ arg
136
+ end
47
137
  end
48
138
  end
49
- def initialize(router_link_type=1)
50
- case router_link_type
51
- when 1, :point_to_point ; @router_link_type=1
52
- when 2, :transit_network ; @router_link_type=2
53
- when 3, :stub_network ; @router_link_type=3
54
- when 4, :virtual_link ; @router_link_type=4
139
+
140
+ def initialize(arg=1)
141
+ @router_link_type = case arg
142
+ when Symbol
143
+ self.class.router_link_sym_to_i(arg)
144
+ when Fixnum
145
+ arg
55
146
  else
56
- raise ArgumentError, "Invalid RouterLinkType #{router_link_type}"
147
+ raise ArgumentError, "Invalid RouterLinkType #{arg}"
57
148
  end
58
149
  end
59
150
  def to_i
@@ -62,13 +153,11 @@ class RouterLinkType
62
153
  def to_s
63
154
  self.class.to_s.split('::').last + ": #{to_sym}"
64
155
  end
156
+ def to_s_ios
157
+ RouterLinkType.to_s_ios to_i
158
+ end
65
159
  def to_sym
66
- case @router_link_type
67
- when 1 ; :point_to_point
68
- when 2 ; :transit_network
69
- when 3 ; :stub_network
70
- when 4 ; :virtual_link
71
- end
160
+ RouterLinkType.to_sym @router_link_type
72
161
  end
73
162
  def encode
74
163
  [@router_link_type].pack('C')