bgp4r 0.0.12 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. data/README.rdoc +21 -15
  2. data/bgp/common.rb +13 -12
  3. data/bgp/iana.rb +28 -205
  4. data/bgp/io.rb +0 -1
  5. data/bgp/messages/capability.rb +1 -1
  6. data/bgp/messages/message.rb +1 -1
  7. data/bgp/messages/open.rb +1 -1
  8. data/bgp/messages/route_refresh.rb +4 -7
  9. data/bgp/messages/update.rb +9 -6
  10. data/bgp/misc/live_feed.rb +1 -2
  11. data/bgp/neighbor/add_path_cap.rb +14 -13
  12. data/bgp/neighbor/neighbor.rb +30 -18
  13. data/bgp/nlris/inet.rb +9 -11
  14. data/bgp/nlris/label.rb +1 -1
  15. data/bgp/nlris/labeled.rb +31 -4
  16. data/bgp/nlris/nlri.rb +23 -183
  17. data/bgp/nlris/nsap.rb +101 -0
  18. data/bgp/nlris/prefix.rb +162 -24
  19. data/bgp/nlris/rd.rb +1 -1
  20. data/bgp/nlris/vpn.rb +23 -5
  21. data/bgp/optional_parameters/add_path.rb +11 -37
  22. data/bgp/optional_parameters/as4.rb +1 -1
  23. data/bgp/optional_parameters/capability.rb +1 -11
  24. data/bgp/optional_parameters/dynamic.rb +1 -1
  25. data/bgp/optional_parameters/graceful_restart.rb +35 -22
  26. data/bgp/optional_parameters/mbgp.rb +23 -37
  27. data/bgp/optional_parameters/orf.rb +1 -1
  28. data/bgp/optional_parameters/route_refresh.rb +1 -1
  29. data/bgp/orfs/prefix_orf.rb +3 -6
  30. data/bgp/path_attributes/aggregator.rb +1 -1
  31. data/bgp/path_attributes/as_path.rb +1 -1
  32. data/bgp/path_attributes/atomic_aggregate.rb +1 -1
  33. data/bgp/path_attributes/cluster_list.rb +1 -1
  34. data/bgp/path_attributes/communities.rb +1 -1
  35. data/bgp/path_attributes/extended_communities.rb +1 -1
  36. data/bgp/path_attributes/extended_community.rb +55 -26
  37. data/bgp/path_attributes/local_pref.rb +1 -1
  38. data/bgp/path_attributes/mp_reach.rb +178 -76
  39. data/bgp/path_attributes/mp_unreach.rb +11 -67
  40. data/bgp/path_attributes/multi_exit_disc.rb +1 -1
  41. data/bgp/path_attributes/next_hop.rb +1 -1
  42. data/bgp/path_attributes/origin.rb +1 -1
  43. data/bgp/path_attributes/originator_id.rb +1 -1
  44. data/bgp/path_attributes/path_attribute.rb +1 -1
  45. data/bgp4r.gemspec +130 -183
  46. data/examples/routegen +0 -1
  47. data/examples/test.rb +15 -0
  48. data/examples/test2.rb +116 -0
  49. data/examples/unit-testing/{malformed_update.rb → malformed_update_test.rb} +6 -6
  50. data/examples/unit-testing/{no_export.rb → no_export_test.rb} +6 -6
  51. data/examples/unit-testing/{prepend_aspath.rb → prepend_aspath_test.rb} +6 -6
  52. data/test/functional/add_path_test.rb +32 -0
  53. data/test/helpers/server.rb +11 -4
  54. data/test/{common_test.rb → unit/common_test.rb} +7 -10
  55. data/test/{iana_test.rb → unit/iana_test.rb} +7 -6
  56. data/test/{messages → unit/messages}/capability_test.rb +26 -9
  57. data/test/{messages → unit/messages}/route_refresh_test.rb +4 -4
  58. data/test/{messages → unit/messages}/update_test.rb +28 -17
  59. data/test/{neighbor → unit/neighbor}/add_path_cap_test.rb +41 -0
  60. data/test/{neighbor → unit/neighbor}/neighbor_test.rb +31 -13
  61. data/test/unit/nlris/labeled_test.rb +30 -0
  62. data/test/unit/nlris/nlri_test.rb +103 -0
  63. data/test/unit/nlris/nsap_test.rb +80 -0
  64. data/test/unit/nlris/prefix_test.rb +136 -0
  65. data/test/{optional_parameters → unit/optional_parameters}/capability_test.rb +0 -5
  66. data/test/unit/optional_parameters/graceful_restart_test.rb +41 -0
  67. data/test/{optional_parameters → unit/optional_parameters}/mbgp_test.rb +20 -0
  68. data/test/unit/path_attributes/aigp.rb +59 -0
  69. data/test/{path_attributes → unit/path_attributes}/extended_communities_test.rb +4 -0
  70. data/test/{path_attributes → unit/path_attributes}/extended_community_test.rb +9 -0
  71. data/test/unit/path_attributes/mp_reach_test.rb +563 -0
  72. data/test/{path_attributes → unit/path_attributes}/path_attribute_test.rb +1 -1
  73. metadata +128 -136
  74. data/examples/unit-testing/test.rb +0 -82
  75. data/examples/unit-testing/test1.rb +0 -82
  76. data/examples/unit-testing/test2.rb +0 -44
  77. data/test/nlris/ext_nlri_test.rb +0 -32
  78. data/test/nlris/nlri_test.rb +0 -130
  79. data/test/optional_parameters/graceful_restart_test.rb +0 -24
  80. data/test/path_attributes/mp_reach_test.rb +0 -305
  81. /data/examples/unit-testing/{unknown_transitive_attr.rb → unknown_transitive_attr_test.rb} +0 -0
  82. /data/test/{misc → functional}/live_feed_test.rb +0 -0
  83. /data/test/{messages → unit/messages}/keepalive_test.rb +0 -0
  84. /data/test/{messages → unit/messages}/markers_test.rb +0 -0
  85. /data/test/{messages → unit/messages}/message_test.rb +0 -0
  86. /data/test/{messages → unit/messages}/notification_test.rb +0 -0
  87. /data/test/{messages → unit/messages}/open_test.rb +0 -0
  88. /data/test/{nlris → unit/nlris}/inet_test.rb +0 -0
  89. /data/test/{nlris/labeled_test.rb → unit/nlris/label_test.rb} +0 -0
  90. /data/test/{nlris → unit/nlris}/rd_test.rb +0 -0
  91. /data/test/{optional_parameters → unit/optional_parameters}/add_path_test.rb +0 -0
  92. /data/test/{optional_parameters → unit/optional_parameters}/as4_test.rb +0 -0
  93. /data/test/{optional_parameters → unit/optional_parameters}/dynamic_test.rb +0 -0
  94. /data/test/{optional_parameters → unit/optional_parameters}/optional_parameter_test.rb +0 -0
  95. /data/test/{optional_parameters → unit/optional_parameters}/orf_test.rb +0 -0
  96. /data/test/{optional_parameters → unit/optional_parameters}/route_refresh_test.rb +0 -0
  97. /data/test/{orfs → unit/orfs}/prefix_orf_test.rb +0 -0
  98. /data/test/{path_attributes → unit/path_attributes}/aggregator_test.rb +0 -0
  99. /data/test/{path_attributes → unit/path_attributes}/as_path_test.rb +0 -0
  100. /data/test/{path_attributes → unit/path_attributes}/atomic_aggregate_test.rb +0 -0
  101. /data/test/{path_attributes → unit/path_attributes}/attribute_test.rb +0 -0
  102. /data/test/{path_attributes → unit/path_attributes}/cluster_list_test.rb +0 -0
  103. /data/test/{path_attributes → unit/path_attributes}/communities_test.rb +0 -0
  104. /data/test/{path_attributes → unit/path_attributes}/local_pref_test.rb +0 -0
  105. /data/test/{path_attributes → unit/path_attributes}/mp_unreach_test.rb +0 -0
  106. /data/test/{path_attributes → unit/path_attributes}/multi_exit_disc_test.rb +0 -0
  107. /data/test/{path_attributes → unit/path_attributes}/next_hop_test.rb +0 -0
  108. /data/test/{path_attributes → unit/path_attributes}/origin_test.rb +0 -0
  109. /data/test/{path_attributes → unit/path_attributes}/originator_id_test.rb +0 -0
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright 2008, 2009 Jean-Michel Esnault.
2
+ # Copyright 2008-2009, 2011 Jean-Michel Esnault.
3
3
  # All rights reserved.
4
4
  # See LICENSE.txt for permissions.
5
5
  #
@@ -25,82 +25,122 @@ require 'bgp/nlris/nlris'
25
25
 
26
26
  module BGP
27
27
 
28
- class Mp_reach < Attr
29
-
30
- attr_reader :safi, :nlris, :path_id
28
+ module MpReachCommon
31
29
 
32
- def initialize(*args)
33
- @safi, @nexthops, @nlris, @path_id= 1, [], [], nil # default is ipv4/unicast
34
- @flags, @type = OPTIONAL, MP_REACH
35
- if args[0].is_a?(String) and args[0].is_packed?
36
- parse(*args)
37
- elsif args[0].is_a?(self.class)
38
- s = args.shift.encode
39
- parse(s, *args)
40
- elsif args[0].is_a?(Hash) and args.size==1
41
- set(*args)
42
- else
43
- raise ArgumentError, "invalid argument"
44
- end
45
- end
46
-
47
- def afi
48
- @afi ||= @nexthops[0].afi
30
+ def self.included(obj)
31
+ obj.extend ClassMethods
49
32
  end
50
33
 
51
34
  def set(h)
52
35
  @safi = h[:safi]
53
- @path_id = path_id = h[:path_id]
54
- case @safi
55
- when 1,2,4 ; @nexthops = [h[:nexthop]].flatten.collect { |nh| Prefix.new(nh) }
56
- when 128,129 ; @nexthops = [h[:nexthop]].flatten.collect { |nh| Vpn.new(nh) }
57
- else
58
- end
59
- case @safi
60
- when 1
61
- @nlris = [h[:nlris]].flatten.collect do |n|
62
- case n
63
- when String
64
- nlri = Inet_unicast.new(n)
65
- path_id ? Ext_Nlri.new(path_id, nlri) : nlri
66
- when Hash
67
- path_id = n[:path_id] if n[:path_id]
68
- nlri = Inet_unicast.new(n[:prefix])
69
- path_id ? Ext_Nlri.new(path_id, nlri) : nlri
70
- else
71
- raise ArgumentError, "Invalid: #{n.inspect}"
72
- end
73
- end
74
- when 2
75
- @nlris = [h[:nlris]].flatten.collect do |n|
36
+ @path_id = h[:path_id]
37
+ @afi = h.has_key?(:afi) ? h[:afi] : self.class.afi_from_nlris(h[:nlris])
38
+ case safi
39
+ when 1,2
40
+ pfx_klass = prefix_klass(afi, safi)
41
+ @nlris = [h[:nlris]].flatten.compact.collect do |n|
76
42
  case n
77
43
  when String
78
- nlri = Inet_multicast.new(n)
79
- path_id ? Ext_Nlri.new(path_id, nlri) : nlri
44
+ path_id ? pfx_klass.new(path_id, n) : pfx_klass.new(n)
80
45
  when Hash
81
46
  path_id = n[:path_id] if n[:path_id]
82
- nlri = Inet_multicast.new(n[:prefix])
83
- path_id ? Ext_Nlri.new(path_id, nlri) : nlri
47
+ pfx = n[:prefix]
48
+ path_id ? pfx_klass.new(path_id, pfx) : pfx_klass.new(pfx)
84
49
  else
85
50
  raise ArgumentError, "Invalid: #{n.inspect}"
86
51
  end
87
52
  end
88
53
  when 4
89
- @nlris = [h[:nlris]].flatten.collect do |n|
54
+ @nlris = [h[:nlris]].flatten.compact.collect do |n|
90
55
  path_id = n[:path_id] || @path_id
91
56
  prefix = n[:prefix].is_a?(String) ? Prefix.new(n[:prefix]) : n[:prefix]
92
- nlri = Labeled.new(prefix, *n[:label])
93
- path_id ? Ext_Nlri.new(path_id, nlri) : nlri
57
+ Labeled.new_with_path_id(path_id,prefix, *n[:label])
94
58
  end
95
59
  when 128,129
96
- @nlris = [h[:nlris]].flatten.collect do |n|
60
+ @nlris = [h[:nlris]].flatten.compact.collect do |n|
97
61
  path_id = n[:path_id] || @path_id
98
62
  prefix = n[:prefix].is_a?(Prefix) ? n[:prefix] : Prefix.new(n[:prefix])
99
63
  rd = n[:rd].is_a?(Rd) ? n[:rd] : Rd.new(*n[:rd])
100
- nlri = Labeled.new(Vpn.new(prefix,rd), *n[:label])
101
- path_id ? Ext_Nlri.new(path_id, nlri) : nlri
64
+ Labeled.new_with_path_id(path_id,Vpn.new(prefix,rd), *n[:label])
102
65
  end
103
66
  else
67
+ raise "SAFI #{safi} not implemented!"
68
+ end
69
+ @nexthops = [h[:nexthop]].flatten.collect { |nh| nexthop_klass(afi,safi).new(nh) } if h[:nexthop]
70
+ self
71
+ end
72
+
73
+ module ClassMethods
74
+ def afi_from_nlris(arg)
75
+ case arg
76
+ when String
77
+ _arg = arg
78
+ when Hash,Array
79
+ case [arg].flatten[0]
80
+ when Hash
81
+ _arg = [arg].flatten[0][:prefix]
82
+ when String
83
+ _arg = [arg].flatten[0]
84
+ else
85
+ raise
86
+ end
87
+ when Hash
88
+ _arg = arg[:prefix]
89
+ else
90
+ raise
91
+ end
92
+
93
+ if _arg.respond_to?(:afi)
94
+ _arg.afi
95
+ elsif _arg =~ /^49\./
96
+ 3
97
+ else
98
+ IPAddr.new(_arg).ipv4? ? 1 : 2
99
+ end
100
+ end
101
+ end
102
+
103
+ private
104
+
105
+ def prefix_klass(afi, safi)
106
+ case afi
107
+ when 1,2
108
+ _afi='Inet'
109
+ when 3
110
+ return ::BGP.const_get('Prefix')
111
+ else
112
+ raise
113
+ end
114
+ _safi = case safi
115
+ when 1 ; 'unicast'
116
+ when 2 ; 'multicast'
117
+ else
118
+ raise
119
+ end
120
+ ::BGP.const_get([_afi,_safi].join('_'))
121
+ end
122
+
123
+ end
124
+
125
+
126
+ class Mp_reach < Attr
127
+
128
+ include MpReachCommon
129
+
130
+ attr_reader :safi, :nlris, :path_id, :afi
131
+
132
+ def initialize(*args)
133
+ @safi, @nexthops, @nlris, @path_id= 1, [], [], nil # default is ipv4/unicast
134
+ @flags, @type = OPTIONAL, MP_REACH
135
+ if args[0].is_a?(String) and args[0].is_packed?
136
+ parse(*args)
137
+ elsif args[0].is_a?(self.class)
138
+ s = args.shift.encode
139
+ parse(s, *args)
140
+ elsif args[0].is_a?(Hash) and args.size==1
141
+ set(*args)
142
+ else
143
+ raise ArgumentError, "invalid argument"
104
144
  end
105
145
  end
106
146
 
@@ -109,7 +149,7 @@ module BGP
109
149
  end
110
150
 
111
151
  def mp_reach
112
- "\n AFI #{IANA.afi(afi)} (#{afi}), SAFI #{IANA.safi(safi)} (#{safi})" +
152
+ "\n AFI #{IANA.afi?(afi)} (#{afi}), SAFI #{IANA.safi?(safi)} (#{safi})" +
113
153
  "\n nexthop: " + nexthops +
114
154
  (['']+ @nlris.collect { |nlri| nlri.to_s }).join("\n ")
115
155
  end
@@ -122,40 +162,83 @@ module BGP
122
162
  end
123
163
 
124
164
  def parse(s,arg=false)
125
-
165
+
126
166
  @flags, @type, len, value = super(s)
127
167
  @afi, @safi, nh_len = value.slice!(0,4).unpack('nCC')
128
- parse_next_hops value.slice!(0,nh_len).is_packed
129
- value.slice!(0,1)
130
-
131
- if arg.respond_to?(:path_id?)
132
- path_id_flag = arg.path_id? :recv, @afi, @safi
168
+
169
+ case @afi
170
+ when 3
171
+
172
+ parse_iso_mapped_next_hops value.slice!(0,nh_len).is_packed
173
+ value.slice!(0,1)
174
+
175
+ if arg.respond_to?(:path_id?)
176
+ path_id_flag = arg.path_id? :recv, @afi, @safi
177
+ else
178
+ path_id_flag = arg
179
+ end
180
+
181
+ while value.size>0
182
+ path_id = value.slice!(0,4).unpack('N')[0] if path_id_flag
183
+ blen = value.slice(0,1).unpack('C')[0]
184
+ nlri = Nlri.factory(value.slice!(0,(blen+7)/8+1), @afi, @safi, path_id)
185
+ # nlri = Nsap.new_ntoh(value.slice!(0,(blen+7)/8+1))
186
+ @nlris << nlri
187
+ end
188
+
133
189
  else
134
- path_id_flag = arg
135
- end
136
-
137
- while value.size>0
138
- path_id = value.slice!(0,4).unpack('N')[0] if path_id_flag
139
- blen = value.slice(0,1).unpack('C')[0]
140
- nlri = Nlri.factory(value.slice!(0,(blen+7)/8+1), @afi, @safi)
141
- if path_id_flag
142
- @nlris << Ext_Nlri.new(path_id, nlri)
190
+
191
+ parse_next_hops value.slice!(0,nh_len).is_packed
192
+ value.slice!(0,1)
193
+
194
+ if arg.respond_to?(:path_id?)
195
+ path_id_flag = arg.path_id? :recv, @afi, @safi
143
196
  else
197
+ path_id_flag = arg
198
+ end
199
+
200
+ while value.size>0
201
+ path_id = path_id_flag ? value.slice!(0,4).unpack('N')[0] : nil
202
+ blen = value.slice(0,1).unpack('C')[0]
203
+ nlri = Nlri.factory(value.slice!(0,(blen+7)/8+1), @afi, @safi, path_id)
144
204
  @nlris << nlri
145
205
  end
146
206
  end
147
207
  raise RuntimeError, "leftover afer parsing: #{value.unpack('H*')}" if value.size>0
148
208
  end
149
209
 
210
+ def parse_iso_mapped_next_hops(s)
211
+ raise unless @afi == 3
212
+ while s.size>0
213
+ s.slice!(0,8) if (128..129)===@safi
214
+ case s.slice(0,1).unpack('C')[0]
215
+ when 0x47
216
+ s.slice!(0,4)
217
+ @nexthops << Iso_ip_mapped.new(Prefix.new_ntop([32,s.slice!(0,4)].pack('Ca*'),1).to_s)
218
+ when 0x35
219
+ s.slice!(0,3)
220
+ @nexthops << Iso_ip_mapped.new(Prefix.new_ntop([128,s.slice!(0,16)].pack('Ca*'),2).to_s)
221
+ else
222
+ raise
223
+ end
224
+ # skip magic
225
+ s.slice!(0,1)
226
+ end
227
+ end
228
+
150
229
  def parse_next_hops(s)
151
230
  while s.size>0
152
231
  case @safi
153
232
  when 1,2,4
154
233
  case @afi
155
234
  when 1
156
- @nexthops << Prefix.new([32,s.slice!(0,4)].pack('Ca*'),1)
235
+ @nexthops << Prefix.new_ntop([32,s.slice!(0,4)].pack('Ca*'),1)
157
236
  when 2
158
- @nexthops << Prefix.new([128,s.slice!(0,16)].pack('Ca*'),2)
237
+ @nexthops << Prefix.new_ntop([128,s.slice!(0,16)].pack('Ca*'),2)
238
+ when 3
239
+ raise "TBD"
240
+ else
241
+ raise "SHOULD NOT BE HERE ...."
159
242
  end
160
243
  when 128,129
161
244
  @nexthops << Vpn.new([64+32,s.slice!(0,12)].pack('Ca*'))
@@ -168,8 +251,9 @@ module BGP
168
251
  def encode(what=:mp_reach)
169
252
  case what
170
253
  when :mp_reach
171
- nexthops = @nexthops.collect { |nh| nh.encode(false) }.join
172
- super([afi, @safi, nexthops.size, nexthops, 0, @nlris.collect { |n| n.encode }.join].pack('nCCa*Ca*'))
254
+ nexthops = @nexthops.collect { |nh| nh.encode_next_hop(safi) }.join
255
+ nlris = @nlris.collect { |n| n.encode }.join
256
+ super([afi, @safi, nexthops.size, nexthops, 0, nlris ].pack('nCCa*Ca*'))
173
257
  when :mp_unreach
174
258
  super([afi, @safi, @nlris.collect { |n| n.encode }.join].pack('nCa*'))
175
259
  end
@@ -180,9 +264,27 @@ module BGP
180
264
  s[1]= [MP_UNREACH].pack('C')
181
265
  Mp_unreach.new(s)
182
266
  end
183
-
267
+
268
+ private
269
+
270
+ def nexthop_klass(afi, safi)
271
+ case afi
272
+ when 3
273
+ ::BGP::const_get('Iso_ip_mapped')
274
+ else
275
+ case safi
276
+ when 1,2,4
277
+ ::BGP::const_get('Prefix')
278
+ when 128,129
279
+ ::BGP::const_get('Vpn')
280
+ else
281
+ raise
282
+ end
283
+ end
284
+ end
285
+
184
286
  end
185
287
 
186
288
  end
187
289
 
188
- load "../../test/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
290
+ load "../../test/unit/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
@@ -21,13 +21,16 @@
21
21
  #++
22
22
 
23
23
  require 'bgp/path_attributes/attribute'
24
+ require 'bgp/path_attributes/mp_reach'
24
25
  require 'bgp/nlris/nlris'
25
26
 
26
27
  module BGP
27
28
 
28
29
  class Mp_unreach < Attr
29
30
 
30
- attr_reader :safi, :nlris
31
+ include MpReachCommon
32
+
33
+ attr_reader :safi, :nlris, :path_id
31
34
 
32
35
  def initialize(*args)
33
36
  @safi, @nexthops, @nlris, @path_id= 1, [], [], nil # default is ipv4/unicast
@@ -44,66 +47,12 @@ module BGP
44
47
  end
45
48
  end
46
49
 
47
- def afi
50
+ def afi
48
51
  @afi ||= @nlris[0].afi
49
52
  end
50
53
 
51
- # FIXME: refactor with mp_reach ....
52
- def set(h)
53
- h[:nlris] ||=[]
54
- @afi = h[:afi] if h[:afi]
55
- @safi = h[:safi]
56
- @path_id = path_id = h[:path_id]
57
- case @safi
58
- when 1
59
- @nlris = [h[:nlris]].flatten.collect do |n|
60
- case n
61
- when String
62
- nlri = Inet_unicast.new(n)
63
- path_id ? Ext_Nlri.new(path_id, nlri) : nlri
64
- when Hash
65
- path_id = n[:path_id] if n[:path_id]
66
- nlri = Inet_unicast.new(n[:prefix])
67
- path_id ? Ext_Nlri.new(path_id, nlri) : nlri
68
- else
69
- raise ArgumentError, "Invalid: #{n.inspect}"
70
- end
71
- end
72
- when 2
73
- @nlris = [h[:nlris]].flatten.collect do |n|
74
- case n
75
- when String
76
- nlri = Inet_multicast.new(n)
77
- path_id ? Ext_Nlri.new(path_id, nlri) : nlri
78
- when Hash
79
- path_id = n[:path_id] if n[:path_id]
80
- nlri = Inet_multicast.new(n[:prefix])
81
- path_id ? Ext_Nlri.new(path_id, nlri) : nlri
82
- else
83
- raise ArgumentError, "Invalid: #{n.inspect}"
84
- end
85
- end
86
- when 4
87
- @nlris = [h[:nlris]].flatten.collect do |n|
88
- path_id = n[:path_id] || @path_id
89
- prefix = n[:prefix].is_a?(String) ? Prefix.new(n[:prefix]) : n[:prefix]
90
- nlri = Labeled.new(prefix, *n[:label])
91
- path_id ? Ext_Nlri.new(path_id, nlri) : nlri
92
- end
93
- when 128,129
94
- @nlris = [h[:nlris]].flatten.collect do |n|
95
- path_id = n[:path_id] || @path_id
96
- prefix = n[:prefix].is_a?(Prefix) ? n[:prefix] : Prefix.new(n[:prefix])
97
- rd = n[:rd].is_a?(Rd) ? n[:rd] : Rd.new(*n[:rd])
98
- nlri = Labeled.new(Vpn.new(prefix,rd), *n[:label])
99
- path_id ? Ext_Nlri.new(path_id, nlri) : nlri
100
- end
101
- else
102
- end
103
- end
104
-
105
54
  def mp_unreach
106
- "\n AFI #{IANA.afi(afi)} (#{afi}), SAFI #{IANA.safi(safi)} (#{safi})" +
55
+ "\n AFI #{IANA.afi?(afi)} (#{afi}), SAFI #{IANA.safi?(safi)} (#{safi})" +
107
56
  (['']+ @nlris.collect { |nlri| nlri.to_s }).join("\n ")
108
57
  end
109
58
 
@@ -125,26 +74,21 @@ module BGP
125
74
  while value.size>0
126
75
  path_id = value.slice!(0,4).unpack('N')[0] if path_id_flag
127
76
  blen = value.slice(0,1).unpack('C')[0]
128
- nlri = Nlri.factory(value.slice!(0,(blen+7)/8+1), @afi, @safi)
129
- if path_id_flag
130
- @nlris << Ext_Nlri.new(path_id, nlri)
131
- else
132
- @nlris << nlri
133
- end
77
+ nlri = Nlri.factory(value.slice!(0,(blen+7)/8+1), @afi, @safi, path_id)
78
+ @nlris << nlri
134
79
  end
135
- raise RuntimeError, "leftover afer parsing: #{value.unpack('H*')}" if value.size>0
80
+ raise RuntimeError, "leftover after parsing: #{value.unpack('H*')}" if value.size>0
136
81
  end
137
82
 
138
-
139
83
  def encode
140
84
  super([afi, @safi, @nlris.collect { |n| n.encode }.join].pack('nCa*'))
141
85
  rescue => e
142
86
  p nlris[0].prefix
143
87
  raise
144
88
  end
145
-
89
+
146
90
  end
147
91
 
148
92
  end
149
93
 
150
- load "../../test/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
94
+ load "../../test/unit/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
@@ -77,4 +77,4 @@ module BGP
77
77
  end
78
78
 
79
79
  end
80
- load "../../test/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
80
+ load "../../test/unit/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
@@ -60,4 +60,4 @@ module BGP
60
60
  end
61
61
 
62
62
  end
63
- load "../../test/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
63
+ load "../../test/unit/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
@@ -84,5 +84,5 @@ module BGP
84
84
 
85
85
  end
86
86
 
87
- load "../../test/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
87
+ load "../../test/unit/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
88
88
 
@@ -70,4 +70,4 @@ module BGP
70
70
 
71
71
  end
72
72
 
73
- load "../../test/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
73
+ load "../../test/unit/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
@@ -280,4 +280,4 @@ module BGP
280
280
  end
281
281
  end
282
282
 
283
- load "../../test/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
283
+ load "../../test/unit/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0