bgp4r 0.0.12 → 0.0.13
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +21 -15
- data/bgp/common.rb +13 -12
- data/bgp/iana.rb +28 -205
- data/bgp/io.rb +0 -1
- data/bgp/messages/capability.rb +1 -1
- data/bgp/messages/message.rb +1 -1
- data/bgp/messages/open.rb +1 -1
- data/bgp/messages/route_refresh.rb +4 -7
- data/bgp/messages/update.rb +9 -6
- data/bgp/misc/live_feed.rb +1 -2
- data/bgp/neighbor/add_path_cap.rb +14 -13
- data/bgp/neighbor/neighbor.rb +30 -18
- data/bgp/nlris/inet.rb +9 -11
- data/bgp/nlris/label.rb +1 -1
- data/bgp/nlris/labeled.rb +31 -4
- data/bgp/nlris/nlri.rb +23 -183
- data/bgp/nlris/nsap.rb +101 -0
- data/bgp/nlris/prefix.rb +162 -24
- data/bgp/nlris/rd.rb +1 -1
- data/bgp/nlris/vpn.rb +23 -5
- data/bgp/optional_parameters/add_path.rb +11 -37
- data/bgp/optional_parameters/as4.rb +1 -1
- data/bgp/optional_parameters/capability.rb +1 -11
- data/bgp/optional_parameters/dynamic.rb +1 -1
- data/bgp/optional_parameters/graceful_restart.rb +35 -22
- data/bgp/optional_parameters/mbgp.rb +23 -37
- data/bgp/optional_parameters/orf.rb +1 -1
- data/bgp/optional_parameters/route_refresh.rb +1 -1
- data/bgp/orfs/prefix_orf.rb +3 -6
- data/bgp/path_attributes/aggregator.rb +1 -1
- data/bgp/path_attributes/as_path.rb +1 -1
- data/bgp/path_attributes/atomic_aggregate.rb +1 -1
- data/bgp/path_attributes/cluster_list.rb +1 -1
- data/bgp/path_attributes/communities.rb +1 -1
- data/bgp/path_attributes/extended_communities.rb +1 -1
- data/bgp/path_attributes/extended_community.rb +55 -26
- data/bgp/path_attributes/local_pref.rb +1 -1
- data/bgp/path_attributes/mp_reach.rb +178 -76
- data/bgp/path_attributes/mp_unreach.rb +11 -67
- data/bgp/path_attributes/multi_exit_disc.rb +1 -1
- data/bgp/path_attributes/next_hop.rb +1 -1
- data/bgp/path_attributes/origin.rb +1 -1
- data/bgp/path_attributes/originator_id.rb +1 -1
- data/bgp/path_attributes/path_attribute.rb +1 -1
- data/bgp4r.gemspec +130 -183
- data/examples/routegen +0 -1
- data/examples/test.rb +15 -0
- data/examples/test2.rb +116 -0
- data/examples/unit-testing/{malformed_update.rb → malformed_update_test.rb} +6 -6
- data/examples/unit-testing/{no_export.rb → no_export_test.rb} +6 -6
- data/examples/unit-testing/{prepend_aspath.rb → prepend_aspath_test.rb} +6 -6
- data/test/functional/add_path_test.rb +32 -0
- data/test/helpers/server.rb +11 -4
- data/test/{common_test.rb → unit/common_test.rb} +7 -10
- data/test/{iana_test.rb → unit/iana_test.rb} +7 -6
- data/test/{messages → unit/messages}/capability_test.rb +26 -9
- data/test/{messages → unit/messages}/route_refresh_test.rb +4 -4
- data/test/{messages → unit/messages}/update_test.rb +28 -17
- data/test/{neighbor → unit/neighbor}/add_path_cap_test.rb +41 -0
- data/test/{neighbor → unit/neighbor}/neighbor_test.rb +31 -13
- data/test/unit/nlris/labeled_test.rb +30 -0
- data/test/unit/nlris/nlri_test.rb +103 -0
- data/test/unit/nlris/nsap_test.rb +80 -0
- data/test/unit/nlris/prefix_test.rb +136 -0
- data/test/{optional_parameters → unit/optional_parameters}/capability_test.rb +0 -5
- data/test/unit/optional_parameters/graceful_restart_test.rb +41 -0
- data/test/{optional_parameters → unit/optional_parameters}/mbgp_test.rb +20 -0
- data/test/unit/path_attributes/aigp.rb +59 -0
- data/test/{path_attributes → unit/path_attributes}/extended_communities_test.rb +4 -0
- data/test/{path_attributes → unit/path_attributes}/extended_community_test.rb +9 -0
- data/test/unit/path_attributes/mp_reach_test.rb +563 -0
- data/test/{path_attributes → unit/path_attributes}/path_attribute_test.rb +1 -1
- metadata +128 -136
- data/examples/unit-testing/test.rb +0 -82
- data/examples/unit-testing/test1.rb +0 -82
- data/examples/unit-testing/test2.rb +0 -44
- data/test/nlris/ext_nlri_test.rb +0 -32
- data/test/nlris/nlri_test.rb +0 -130
- data/test/optional_parameters/graceful_restart_test.rb +0 -24
- data/test/path_attributes/mp_reach_test.rb +0 -305
- /data/examples/unit-testing/{unknown_transitive_attr.rb → unknown_transitive_attr_test.rb} +0 -0
- /data/test/{misc → functional}/live_feed_test.rb +0 -0
- /data/test/{messages → unit/messages}/keepalive_test.rb +0 -0
- /data/test/{messages → unit/messages}/markers_test.rb +0 -0
- /data/test/{messages → unit/messages}/message_test.rb +0 -0
- /data/test/{messages → unit/messages}/notification_test.rb +0 -0
- /data/test/{messages → unit/messages}/open_test.rb +0 -0
- /data/test/{nlris → unit/nlris}/inet_test.rb +0 -0
- /data/test/{nlris/labeled_test.rb → unit/nlris/label_test.rb} +0 -0
- /data/test/{nlris → unit/nlris}/rd_test.rb +0 -0
- /data/test/{optional_parameters → unit/optional_parameters}/add_path_test.rb +0 -0
- /data/test/{optional_parameters → unit/optional_parameters}/as4_test.rb +0 -0
- /data/test/{optional_parameters → unit/optional_parameters}/dynamic_test.rb +0 -0
- /data/test/{optional_parameters → unit/optional_parameters}/optional_parameter_test.rb +0 -0
- /data/test/{optional_parameters → unit/optional_parameters}/orf_test.rb +0 -0
- /data/test/{optional_parameters → unit/optional_parameters}/route_refresh_test.rb +0 -0
- /data/test/{orfs → unit/orfs}/prefix_orf_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/aggregator_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/as_path_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/atomic_aggregate_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/attribute_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/cluster_list_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/communities_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/local_pref_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/mp_unreach_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/multi_exit_disc_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/next_hop_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/origin_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/originator_id_test.rb +0 -0
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright 2008,
|
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
|
-
|
29
|
-
|
30
|
-
attr_reader :safi, :nlris, :path_id
|
28
|
+
module MpReachCommon
|
31
29
|
|
32
|
-
def
|
33
|
-
|
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 =
|
54
|
-
|
55
|
-
|
56
|
-
when
|
57
|
-
|
58
|
-
|
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
|
-
|
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
|
-
|
83
|
-
path_id ?
|
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
|
-
|
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
|
-
|
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
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
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
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
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.
|
235
|
+
@nexthops << Prefix.new_ntop([32,s.slice!(0,4)].pack('Ca*'),1)
|
157
236
|
when 2
|
158
|
-
@nexthops << Prefix.
|
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.
|
172
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|