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