bgp4r 0.0.11 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. data/bgp/common.rb +14 -13
  2. data/bgp/iana.rb +26 -1
  3. data/bgp/messages/capability.rb +3 -2
  4. data/bgp/messages/message.rb +3 -2
  5. data/bgp/messages/open.rb +2 -1
  6. data/bgp/messages/update.rb +80 -30
  7. data/bgp/neighbor/add_path_cap.rb +125 -0
  8. data/bgp/{neighbor.rb → neighbor/neighbor.rb} +64 -68
  9. data/bgp/nlris/nlri.rb +289 -15
  10. data/bgp/nlris/prefix.rb +3 -2
  11. data/bgp/nlris/vpn.rb +1 -8
  12. data/bgp/optional_parameters/add_path.rb +160 -0
  13. data/bgp/optional_parameters/capabilities.rb +1 -0
  14. data/bgp/optional_parameters/capability.rb +6 -0
  15. data/bgp/optional_parameters/graceful_restart.rb +6 -6
  16. data/bgp/optional_parameters/optional_parameter.rb +1 -0
  17. data/bgp/path_attributes/as_path.rb +1 -1
  18. data/bgp/path_attributes/attribute.rb +12 -5
  19. data/bgp/path_attributes/mp_reach.rb +142 -96
  20. data/bgp/path_attributes/mp_unreach.rb +73 -20
  21. data/bgp/path_attributes/path_attribute.rb +28 -5
  22. data/bgp4r.gemspec +21 -6
  23. data/bgp4r.rb +1 -1
  24. data/examples/unit-testing/malformed_update.rb +2 -1
  25. data/examples/unit-testing/test.rb +82 -0
  26. data/examples/unit-testing/test1.rb +82 -0
  27. data/examples/unit-testing/test2.rb +44 -0
  28. data/test/common_test.rb +7 -0
  29. data/test/helpers/server.rb +20 -0
  30. data/test/iana_test.rb +43 -0
  31. data/test/messages/open_test.rb +7 -2
  32. data/test/messages/update_test.rb +133 -36
  33. data/test/neighbor/add_path_cap_test.rb +54 -0
  34. data/test/neighbor/neighbor_test.rb +161 -0
  35. data/test/nlris/ext_nlri_test.rb +25 -60
  36. data/test/nlris/nlri_test.rb +93 -115
  37. data/test/optional_parameters/add_path_test.rb +53 -0
  38. data/test/optional_parameters/capability_test.rb +10 -0
  39. data/test/optional_parameters/graceful_restart_test.rb +1 -0
  40. data/test/path_attributes/mp_reach_test.rb +206 -8
  41. data/test/path_attributes/mp_unreach_test.rb +113 -5
  42. data/test/path_attributes/path_attribute_test.rb +34 -2
  43. metadata +20 -7
  44. data/test/neighbor_test.rb +0 -62
@@ -24,21 +24,13 @@ require 'socket'
24
24
  require 'thread'
25
25
  require 'observer'
26
26
  require 'bgp/io'
27
+ require 'bgp/neighbor/add_path_cap'
27
28
 
28
29
  module BGP
29
30
 
30
31
  class Neighbor
31
32
  include Observable
32
33
 
33
- # def self.deprecate(old_method, new_method)
34
- # define_method(old_method) do |*args, &block|
35
- # log_warn "#{old_method}() is deprecated. Use #{new_method}()."
36
- # __send__(new_method, *args, &block)
37
- # end
38
- # end
39
- #
40
- # deprecate :send_message, :send
41
-
42
34
  def log_info(txt)
43
35
  Log.info "#{self.class} #{txt}"
44
36
  end
@@ -63,8 +55,8 @@ module BGP
63
55
  else
64
56
  @version, @my_as, @holdtime, @id, @remote_addr, @local_addr = args
65
57
  end
66
- @as4byte=false
67
58
  @state = :Idle
59
+ @session_info=nil
68
60
  @threads=ThreadGroup.new
69
61
  @mutex = Mutex.new
70
62
  @eventQ = Queue.new
@@ -77,12 +69,15 @@ module BGP
77
69
  end
78
70
  end
79
71
 
72
+ # FIXME:
73
+ # neighbor.add_capability
74
+ # neighbor.remove_capability
80
75
  # neighbor.capability :as4_byte | :as4 | :as4byte
81
76
  # neighbor.capability :route_refresh, :rr
82
77
  # neighbor.capability :route_refresh, 128
83
78
  # neighbor.capability :mbgp, :ipv4, :unicast
84
79
  # neighbor.capability :mbgp, :ipv4, :multicast
85
-
80
+
86
81
  def capability(*args)
87
82
  @opt_parms << if args[0].is_a?(Symbol)
88
83
  case args[0]
@@ -103,6 +98,7 @@ module BGP
103
98
  raise ArgumentError, "Invalid argument"
104
99
  end
105
100
  end
101
+ alias :add_cap :capability
106
102
 
107
103
  def state
108
104
  "#{@state}"
@@ -115,7 +111,7 @@ module BGP
115
111
  Thread.current['name']='restart'
116
112
  loop do
117
113
  enable if @state == :Idle
118
- sleep(5)
114
+ sleep(4)
119
115
  end
120
116
  end
121
117
 
@@ -132,7 +128,7 @@ module BGP
132
128
  ev, type, m = eventQ.deq
133
129
  case ev
134
130
  when :ev_msg
135
- msg = BGP::Message.factory(m, @as4byte)
131
+ msg = BGP::Message.factory(m, @session_info)
136
132
  log_info "Recv#{msg.class.to_s.split('::').last}"
137
133
  log_debug "Recv #{msg}\n"
138
134
  if msg.is_a?(Update)
@@ -153,17 +149,17 @@ module BGP
153
149
  changed and notify_observers(msg)
154
150
  when :ev_conn_reset
155
151
  Log.warn "#{type}"
156
- disable
152
+ stop
157
153
  when :ev_holdtime_expire
158
154
  Log.warn "Holdtime expire: #{type}"
159
- disable
155
+ stop
160
156
  else
161
157
  Log.error "unexpected event #{ev}"
162
158
  end
163
159
  end
164
160
  end
165
161
  end
166
-
162
+
167
163
  def clean
168
164
  @threads.list.each { |x|
169
165
  x.exit; x.join
@@ -183,42 +179,42 @@ module BGP
183
179
  @holdtime ||= 180
184
180
  end
185
181
 
186
- def enable(auto_retry=:no_auto_retry, wait= :wait)
182
+ def start_session(session)
183
+ @socket=session
184
+ return unless @state == :Idle
185
+ init_io
186
+ send_open :ev_send_open
187
+ end
188
+
189
+ def start(arg={})
190
+ options = {:port=> 179, :auto_retry=> false, :no_blocking=>false, :waitfor=> :Established}.merge(arg)
187
191
  return if @state == :Established
188
- disable unless @state == :Idle
189
-
190
- init_socket
192
+ stop unless @state == :Idle
193
+ if options[:session]
194
+ @socket = session
195
+ else
196
+ @socket = TCPSocket.new(@remote_addr, options[:port])
197
+ end
191
198
  init_io
192
-
193
- [@in, @out].each { |io|
194
- io.start
195
- @threads.add io.thread
196
- }
197
-
198
199
  send_open :ev_send_open
199
-
200
- retry_thread if auto_retry == :auto_retry
201
-
202
- if wait == :wait
200
+ retry_thread if options[:auto_retry] == true
201
+ unless options[:no_blocking] == true
203
202
  loop do
204
203
  sleep(0.3)
205
- break if @state == :Established
204
+ break if @state == options[:waitfor]
206
205
  end
207
206
  log_info "#{self} started"
208
207
  end
209
-
210
208
  rescue => e
211
209
  Log.error "#{e}"
212
- disable
210
+ stop
213
211
  end
214
- alias start enable
215
212
 
216
- def disable
213
+ def stop
217
214
  @socket.close if defined?(@socket) and not @socket.closed?
218
215
  clean
219
216
  new_state :Idle, "Disable"
220
217
  end
221
- alias stop disable
222
218
 
223
219
  define_method(:in) do
224
220
  @in.thread
@@ -227,7 +223,11 @@ module BGP
227
223
  @out.thread
228
224
  end
229
225
 
230
- attr_reader :as4byte
226
+ attr_reader :as4byte, :session_info
227
+
228
+ def as4byte?
229
+ @session_info.as4byte?
230
+ end
231
231
 
232
232
  def send_message(m)
233
233
  raise if m.nil?
@@ -236,30 +236,23 @@ module BGP
236
236
  log_info "Send#{m.class.to_s.split('::')[-1]}"
237
237
  log_debug "Send #{m.is_a?(Update) ? m.to_s : m }\n"
238
238
  end
239
- #FIXME: enqueue [m, as4byte]
240
239
  if m.is_a?(Update)
241
- @out.enq m.encode(as4byte)
240
+ send_update m
242
241
  else
243
242
  @out.enq m
244
243
  end
245
244
  end
246
-
247
- def init_socket
248
- @socket = Socket.new(Socket::PF_INET, Socket::SOCK_STREAM, Socket::IPPROTO_TCP)
249
- remote = Socket.pack_sockaddr_in(179, @remote_addr)
250
- local = Socket.pack_sockaddr_in(0, @local_addr) unless @local_addr.nil?
251
- remote_sock_addr = Socket.pack_sockaddr_in(179, @remote_addr)
252
- local_sock_addr = Socket.pack_sockaddr_in(0, @local_addr) unless @local_addr.nil?
253
- @socket.bind(local_sock_addr) unless @local_addr.nil?
254
- @socket.connect(remote_sock_addr)
255
- end
256
-
245
+
257
246
  def init_io
258
247
  @in = BGP::IO::Input.new(@socket, holdtime, self)
259
248
  @out = BGP::IO::Output.new(@socket, @holdtime, self)
260
249
  new_state(:Active, "Open Socket")
250
+ [@in, @out].each { |io|
251
+ io.start
252
+ @threads.add io.thread
253
+ }
261
254
  end
262
-
255
+
263
256
  def update(*args)
264
257
  @eventQ.enq(args)
265
258
  end
@@ -268,7 +261,11 @@ module BGP
268
261
  log_info "#{txt} old state #{@state} new state #{state}"
269
262
  @state = state
270
263
  end
271
-
264
+
265
+ def send_update(u)
266
+ @out.enq u.encode(@session_info)
267
+ end
268
+
272
269
  def send_open(ev)
273
270
  case @state
274
271
  when :OpenRecv
@@ -277,18 +274,17 @@ module BGP
277
274
  send_message open ; new_state :OpenSent, ev
278
275
  else
279
276
  Log.warn "#{self.class}: attempt to send OPEN msg while in #{@state}"
280
- end
277
+ end
281
278
  end
282
279
 
283
- def rcv_open(o)
284
- @rmt_version = o.version
285
- @rmt_as = o.local_as
286
- @rmt_bgp_id = o.bgp_id
287
-
288
- if @holdtime > o.holdtime
289
- @out.holdtime = @in.holdtime = o.holdtime
290
- end
291
-
280
+ def rcv_open(peer_open)
281
+ @session_info = Neighbor::Capabilities.new open, peer_open
282
+
283
+ @rmt_version = peer_open.version
284
+ @rmt_as = peer_open.local_as
285
+ @rmt_bgp_id = peer_open.bgp_id
286
+ @out.holdtime = @in.holdtime = peer_open.holdtime if @holdtime > peer_open.holdtime
287
+
292
288
  case @state
293
289
  when :OpenSent
294
290
  send_message(BGP::Message.keepalive)
@@ -299,7 +295,7 @@ module BGP
299
295
  else
300
296
  Log.warn "#{self.class}: received open message while in state #{@state}"
301
297
  end
302
- @as4byte = (open.has?(OPT_PARM::CAP::As4) && o.has?(OPT_PARM::CAP::As4))
298
+
303
299
  end
304
300
 
305
301
  def rcv_keepalive
@@ -317,25 +313,25 @@ module BGP
317
313
  @threads.add(@keepalive_thread)
318
314
  end
319
315
  end
320
-
316
+
321
317
  def rcv_notification(m)
322
318
  log_info "#{m}"
323
319
  changed and notify_observers(m)
324
- disable
320
+ stop
325
321
  end
326
322
 
327
323
  def rcv_route_refresh(m)
328
324
  end
329
-
325
+
330
326
  def rcv_update(m)
331
327
  end
332
328
 
333
329
  def to_s
334
330
  "version: #{version}, id: #{@id}, as: #{@my_as}, holdtime: #{@holdtime}, peer addr: #{@remote_addr}, local addr: #{@local_addr}"
335
331
  end
336
-
332
+
337
333
  end
338
334
 
339
335
  end
340
336
 
341
- load "../test/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
337
+ load "../../test/neighbor/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
data/bgp/nlris/nlri.rb CHANGED
@@ -29,6 +29,7 @@ module BGP
29
29
  class Base_nlri
30
30
 
31
31
  class Nlri_element < IPAddr
32
+
32
33
  def to_s
33
34
  [super, mlen].join('/')
34
35
  end
@@ -36,7 +37,7 @@ module BGP
36
37
  hton
37
38
  end
38
39
  def nbyte
39
- (mlen+7)/8
40
+ (mlen+7)/8
40
41
  end
41
42
  def encode(len_included=true)
42
43
  nbyte = (mlen+7)/8
@@ -46,13 +47,14 @@ module BGP
46
47
  [hton].pack("a#{nbyte}")
47
48
  end
48
49
  end
49
- def parse4(arg)
50
+ def parse(arg)
50
51
  s = arg.dup
51
52
  s +=([0]*3).pack('C*')
52
53
  plen, *nlri = s.unpack('CC4')
53
54
  arg.slice!(0,1+(plen+7)/8) # trim arg accordingly
54
55
  ipaddr = nlri.collect { |n| n.to_s }.join('.') + "/" + plen .to_s
55
56
  end
57
+ alias :parse4 :parse
56
58
  def parse6(arg)
57
59
  s = arg.dup
58
60
  s +=([0]*16).pack('C*')
@@ -71,6 +73,10 @@ module BGP
71
73
  else
72
74
  super(arg)
73
75
  end
76
+ rescue => e
77
+ p e
78
+ p arg
79
+ raise
74
80
  end
75
81
  end
76
82
 
@@ -86,18 +92,90 @@ module BGP
86
92
  end
87
93
  end
88
94
 
95
+ class Ext_Nlri_element < Nlri_element
96
+ def initialize(*args)
97
+ if args.size>1
98
+ @path_id = args.shift
99
+ super
100
+ elsif args.size==1 and args[0].is_a?(String)
101
+ super parse(*args)
102
+ elsif args.size==1 and args[0].is_a?(Hash)
103
+ @path_id=args[0][:path_id]
104
+ super args[0][:nlri_element]
105
+ else
106
+ raise
107
+ end
108
+ rescue => e
109
+ p e
110
+ p args
111
+ raise
112
+ end
113
+ attr_reader :path_id
114
+ def encode
115
+ [path_id, super].pack('Na*')
116
+ end
117
+ def to_s
118
+ "ID: #{path_id}, #{super}"
119
+ end
120
+ def parse(s)
121
+ @path_id = s.slice!(0,4).unpack('N')[0]
122
+ super s
123
+ end
124
+ end
125
+
89
126
  attr_reader :nlris
127
+
128
+ class << self
129
+ def new_ntop(s, extended=false)
130
+ if extended
131
+ nlri = new
132
+ while s.size>0
133
+ nlri.add Base_nlri::Ext_Nlri_element.new(s)
134
+ end
135
+ nlri
136
+ else
137
+ new(s.is_packed)
138
+ end
139
+ end
140
+ end
90
141
 
91
142
  def initialize(*args)
92
143
  if args[0].is_a?(String) and args[0].is_packed?
93
- parse(args[0])
144
+ parse(*args)
94
145
  else
95
146
  add(*args)
96
147
  end
97
148
  end
98
149
  def add(*args)
99
150
  @nlris ||=[]
100
- args.flatten.each { |arg| @nlris << Ip4.new(arg) }
151
+ args.each { |arg|
152
+ case arg
153
+ when Hash
154
+ if arg.has_key? :path_id
155
+ @nlris << Ext_Nlri_element.new(arg)
156
+ else
157
+ raise
158
+ end
159
+ when String
160
+ # p "JME: IN ADD/ STRING:"
161
+ # p arg
162
+ # p arg.is_packed?
163
+ # p "---"
164
+ o = Ip4.new(arg)
165
+ # p o
166
+ @nlris << o
167
+ when Array
168
+ if arg[0].is_a?(Integer)
169
+ @nlris << Ext_Nlri_element.new(*arg)
170
+ else
171
+ raise
172
+ end
173
+ when Ext_Nlri_element, Ip4
174
+ @nlris << arg
175
+ else
176
+ raise ArgumentError, "Invalid argument #{arg.class} #{arg.inspect}"
177
+ end
178
+ }
101
179
  end
102
180
  alias << add
103
181
 
@@ -117,10 +195,10 @@ module BGP
117
195
  end
118
196
  end
119
197
 
120
- def to_s
121
- @nlris.join("\n")
198
+ def to_s(indent=0)
199
+ @nlris.join("\n#{([' ']*indent).join}")
122
200
  end
123
-
201
+
124
202
  def size
125
203
  @nlris.size
126
204
  end
@@ -132,23 +210,219 @@ module BGP
132
210
  super
133
211
  end
134
212
  end
213
+
135
214
  class Withdrawn < Base_nlri
136
- def encode(len_included=true)
137
- super(len_included)
215
+ class << self
216
+ def new_top(*args)
217
+ super
218
+ end
219
+ end
220
+ class << self
221
+ def new_ntop(s, extended=false)
222
+ if extended
223
+ nlri = new
224
+ while s.size>0
225
+ nlri.add Base_nlri::Ext_Nlri_element.new(s)
226
+ end
227
+ nlri
228
+ else
229
+ new(s.is_packed)
230
+ end
231
+ end
232
+ end
233
+ def encode
234
+ super
138
235
  end
139
236
  end
140
237
 
141
238
  class Nlri
142
- def self.factory(s, afi, safi)
143
- case safi
144
- when 1,2
145
- Prefix.new(s.is_packed, afi)
146
- when 4,128,129
147
- Labeled.new(s.is_packed, afi, safi)
239
+ def self.factory(s, afi, safi, extended=false)
240
+ if afi== 1 and safi==1
241
+ Nlri.new_ntop(s.is_packed, extended)
242
+ else
243
+ case safi
244
+ when 1,2
245
+ Prefix.new(s.is_packed, afi)
246
+ when 4,128,129
247
+ Labeled.new(s.is_packed, afi, safi)
248
+ else
249
+ raise RuntimeError, "Afi #{afi} Safi #{safi} not supported!"
250
+ end
148
251
  end
149
252
  end
150
253
  end
151
254
 
255
+ class Ext_Nlri
256
+ def self.factory(s, afi, safi)
257
+ new_ntop s, afi, safi
258
+ end
259
+ def self.new_ntop(s, afi=1, safi=1)
260
+ path_id = s.slice!(0,4).unpack('N')[0]
261
+ nlri = Nlri.factory(s, afi, safi)
262
+ new path_id, nlri
263
+ end
264
+ attr :path_id, :nlri
265
+ def initialize(path_id, nlri)
266
+ @path_id=path_id
267
+ @nlri = nlri
268
+ end
269
+ def afi
270
+ @nlri.afi
271
+ end
272
+ def to_s
273
+ s = []
274
+ s << "ID=#{@path_id}"
275
+ s << @nlri.to_s
276
+ s.join(", ")
277
+ end
278
+ def encode
279
+ [@path_id, @nlri.encode].pack('Na*')
280
+ end
281
+ end
282
+
152
283
  end
153
284
 
154
285
  load "../../test/nlris/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
286
+
287
+
288
+ __END__
289
+
290
+
291
+ Nlri is a collection of Nlri_elements or a collection of Path_nlri_elements
292
+
293
+
294
+ Path_nlri_element
295
+
296
+ - path_id
297
+ - Nlri_element
298
+
299
+
300
+
301
+ 3. Extended NLRI Encodings
302
+
303
+ In order to carry the Path Identifier in an UPDATE message, the
304
+ existing NLRI encodings are extended by prepending the Path
305
+ Identifier field, which is of four-octets.
306
+
307
+ For example, the NLRI encodings specified in [RFC4271, RFC4760] are
308
+ extended as the following:
309
+
310
+
311
+ +--------------------------------+
312
+ | Path Identifier (4 octets) |
313
+ +--------------------------------+
314
+ | Length (1 octet) |
315
+ +--------------------------------+
316
+ | Prefix (variable) |
317
+ +--------------------------------+
318
+
319
+
320
+ and the NLRI encoding specified in [RFC3107] is extended as the
321
+ following:
322
+
323
+
324
+
325
+
326
+
327
+ Walton, et al Expiration Date February 2011 [Page 3]
328
+
329
+
330
+
331
+
332
+
333
+ INTERNET DRAFT draft-ietf-idr-add-paths-04.txt August 2010
334
+
335
+
336
+ +--------------------------------+
337
+ | Path Identifier (4 octets) |
338
+ +--------------------------------+
339
+ | Length (1 octet) |
340
+ +--------------------------------+
341
+ | Label (3 octets) |
342
+ +--------------------------------+
343
+ | ... |
344
+ +--------------------------------+
345
+ | Prefix (variable) |
346
+ +--------------------------------+
347
+
348
+
349
+ The usage of the extended NLRI encodings is specified in the
350
+ Operation section.
351
+
352
+
353
+
354
+ =======
355
+
356
+ RFC 3107 Carrying Label Information in BGP-4 May 2001
357
+
358
+
359
+ 3. Carrying Label Mapping Information
360
+
361
+ Label mapping information is carried as part of the Network Layer
362
+ Reachability Information (NLRI) in the Multiprotocol Extensions
363
+ attributes. The AFI indicates, as usual, the address family of the
364
+ associated route. The fact that the NLRI contains a label is
365
+ indicated by using SAFI value 4.
366
+
367
+ The Network Layer Reachability information is encoded as one or more
368
+ triples of the form <length, label, prefix>, whose fields are
369
+ described below:
370
+
371
+ +---------------------------+
372
+ | Length (1 octet) |
373
+ +---------------------------+
374
+ | Label (3 octets) |
375
+ +---------------------------+
376
+ .............................
377
+ +---------------------------+
378
+ | Prefix (variable) |
379
+ +---------------------------+
380
+
381
+ The use and the meaning of these fields are as follows:
382
+
383
+ a) Length:
384
+
385
+ The Length field indicates the length in bits of the address
386
+ prefix plus the label(s).
387
+
388
+ b) Label:
389
+
390
+ The Label field carries one or more labels (that corresponds to
391
+ the stack of labels [MPLS-ENCAPS]). Each label is encoded as 3
392
+ octets, where the high-order 20 bits contain the label value,
393
+ and the low order bit contains "Bottom of Stack" (as defined in
394
+ [MPLS-ENCAPS]).
395
+
396
+ c) Prefix:
397
+
398
+ The Prefix field contains address prefixes followed by enough
399
+ trailing bits to make the end of the field fall on an octet
400
+ boundary. Note that the value of trailing bits is irrelevant.
401
+
402
+
403
+
404
+ Rekhter & Rosen Standards Track [Page 3]
405
+
406
+ RFC 3107 Carrying Label Information in BGP-4 May 2001
407
+
408
+
409
+ The label(s) specified for a particular route (and associated with
410
+ its address prefix) must be assigned by the LSR which is identified
411
+ by the value of the Next Hop attribute of the route.
412
+
413
+ When a BGP speaker redistributes a route, the label(s) assigned to
414
+ that route must not be changed (except by omission), unless the
415
+ speaker changes the value of the Next Hop attribute of the route.
416
+
417
+ A BGP speaker can withdraw a previously advertised route (as well as
418
+ the binding between this route and a label) by either (a) advertising
419
+ a new route (and a label) with the same NLRI as the previously
420
+ advertised route, or (b) listing the NLRI of the previously
421
+ advertised route in the Withdrawn Routes field of an Update message.
422
+ The label information carried (as part of NLRI) in the Withdrawn
423
+ Routes field should be set to 0x800000. (Of course, terminating the
424
+ BGP session also withdraws all the previously advertised routes.)
425
+
426
+
427
+
428
+
data/bgp/nlris/prefix.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'bgp/nlris/nlri'
2
2
  module BGP
3
- class Prefix < Nlri::Nlri_element
3
+ class Prefix < Base_nlri::Nlri_element
4
4
  def initialize(*args)
5
5
  if args[0].is_a?(String) and args[0].packed?
6
6
  afi = args[1] ||=1
@@ -30,4 +30,5 @@ module BGP
30
30
  end
31
31
  end
32
32
 
33
- load "../../test/nlris/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
33
+ # FIXME:
34
+ # load "../../test/nlris/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
data/bgp/nlris/vpn.rb CHANGED
@@ -52,17 +52,10 @@ module BGP
52
52
  @prefix.ipv6?
53
53
  end
54
54
  def parse(s, afi=1)
55
- # p "-----------"
56
- # p s.unpack('H*')
57
- # p afi
58
55
  nbits = s.slice!(0,1).unpack('C')[0]
59
56
  rd,vpn = s.slice!(0,(7+nbits)/8).unpack("a8a*")
60
57
  @rd = Rd.new(rd.is_packed)
61
- # p @rd
62
- # p nbits
63
- # p vpn.unpack('H*')
64
- raise if nbits-64==0
65
- @prefix= Prefix.new([nbits-64,vpn].pack('Ca*'), afi) if nbits-64>0
58
+ @prefix= Prefix.new([nbits-64,vpn].pack('Ca*'), afi)
66
59
  end
67
60
  def nexthop
68
61
  @prefix.nexthop