bgp4r 0.0.5 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/bgp/common.rb CHANGED
@@ -130,7 +130,11 @@ class String
130
130
  end
131
131
  if l.size%2 >0
132
132
  ns = if l.size>1 then 1 else 0 end
133
- ls.last << format("%s%2.2x",' '*ns,l[-1].unpack('C')[0])
133
+ if RUBY_VERSION.split('.').join[0,2] > "18"
134
+ ls.last << format("%s%2.2x",' '*ns,l[-1].unpack('C')[0])
135
+ else
136
+ ls.last << format("%s%2.2x",' '*ns,l[-1])
137
+ end
134
138
  end
135
139
  ls
136
140
  end
data/bgp/message.rb CHANGED
@@ -419,8 +419,12 @@ module BGP
419
419
 
420
420
 
421
421
  class Update < Message
422
+ def as4byte?
423
+ @as4byte ||= false
424
+ end
422
425
  def initialize(*args)
423
426
  if args[0].is_a?(String) and args[0].is_packed?
427
+ @as4byte=false
424
428
  parse(*args)
425
429
  elsif args[0].is_a?(self.class)
426
430
  parse(args[0].encode, *args[1..-1])
@@ -454,7 +458,8 @@ module BGP
454
458
  @path_attribute=val if val.is_a?(Path_attribute)
455
459
  end
456
460
 
457
- def encode(as4byte=false)
461
+ #TODO refactor out passing an argument to encode...
462
+ def encode(as4byte=@as4byte)
458
463
  withdrawn, path_attribute, nlri = '', '', ''
459
464
  withdrawn = @withdrawn.encode(false) if defined? @withdrawn and @withdrawn
460
465
  path_attribute = @path_attribute.encode(as4byte) if defined?(@path_attribute) and @path_attribute
@@ -468,7 +473,9 @@ module BGP
468
473
 
469
474
  attr_reader :path_attribute, :nlri, :withdrawn
470
475
 
476
+ # CHANGED ME: NO DEFAULT HERE, the factory calling us has to tell what it is giving us.
471
477
  def parse(s, as4byte=false)
478
+ @as4byte=as4byte
472
479
  update = super(s)
473
480
  len = update.slice!(0,2).unpack('n')[0]
474
481
  self.withdrawn=Withdrawn.new(update.slice!(0,len).is_packed) if len>0
@@ -494,12 +501,13 @@ module BGP
494
501
  end
495
502
  end
496
503
 
497
- def to_s(as4byte=false, fmt=:tcpdump)
498
- if as4byte
499
- msg = self.encode(true)
500
- else
501
- msg = self.encode
502
- end
504
+ def to_s(as4byte=@as4byte, fmt=:tcpdump)
505
+ msg = encode(as4byte)
506
+ # if as4byte
507
+ # msg = self.encode(true)
508
+ # else
509
+ # msg = self.encode
510
+ # end
503
511
  s = []
504
512
  s << @withdrawn.to_s if defined?(@withdrawn) and @withdrawn
505
513
  s << @path_attribute.to_s(fmt, as4byte) if defined?(@path_attribute) and @path_attribute
@@ -886,6 +894,10 @@ module BGP
886
894
  {:code=> @code, :subcode=> @subcode, :data=>@data}
887
895
  end
888
896
 
897
+ def to_string
898
+ Notification.code_to_s(@code, @subcode)
899
+ end
900
+
889
901
  def to_s
890
902
  msg = self.encode
891
903
  s = "Notification (#{MESSAGE::NOTIFICATION}), length: #{msg.size}: "
data/bgp/neighbor.rb CHANGED
@@ -28,6 +28,14 @@ module BGP
28
28
 
29
29
  class Neighbor
30
30
  include Observable
31
+
32
+ def log_info(txt)
33
+ Log.info "#{self.class} #{txt}"
34
+ end
35
+
36
+ def log_debug(txt)
37
+ Log.debug "#{self.class} #{txt}"
38
+ end
31
39
 
32
40
  def initialize(*args)
33
41
  @opt_parms = []
@@ -49,19 +57,30 @@ module BGP
49
57
  event_dispatch
50
58
  end
51
59
 
52
- # neighbor.capability :as4_byte
53
- # neighbor.capability :route_refresh
60
+ [:Idle, :Established, :OpenRecv, :OpenConfirm, :Active, :OpenSent].each do |state|
61
+ define_method("is_#{state.to_s.downcase}?") do
62
+ @state == state
63
+ end
64
+ end
65
+
66
+ # neighbor.capability :as4_byte | :as4 | :as4byte
67
+ # neighbor.capability :route_refresh, :rr
54
68
  # neighbor.capability :route_refresh, 128
55
69
  # neighbor.capability :mbgp, :ipv4, :unicast
56
70
  # neighbor.capability :mbgp, :ipv4, :multicast
57
71
  def capability(*args)
58
72
  @opt_parms << if args[0].is_a?(Symbol)
59
73
  case args[0]
60
- when :route_refresh ; Route_refresh_cap.new(*args[1..-1])
61
- when :mbgp ; Mbgp_cap.new(*args[1..-1])
62
- when :as4_byte ; As4_cap.new(@my_as)
74
+ when :route_refresh, :rr
75
+ Route_refresh_cap.new(*args[1..-1])
76
+ when :mbgp
77
+ Mbgp_cap.new(*args[1..-1])
78
+ when :as4_byte, :as4byte, :as4
79
+ As4_cap.new(@my_as)
80
+ else
81
+ raise ArgumentError, "Invalid argument #{args.inspect}", caller
63
82
  end
64
- elsif args[0].is_a?(Capability) and args.size==1
83
+ elsif args[0].is_a?(Capability)
65
84
  args[0]
66
85
  else
67
86
  raise ArgumentError, "Invalid argument"
@@ -69,7 +88,7 @@ module BGP
69
88
  end
70
89
 
71
90
  def state
72
- @state.to_s
91
+ "#{@state}"
73
92
  end
74
93
 
75
94
  def retry_thread(action=:start)
@@ -96,10 +115,9 @@ module BGP
96
115
  ev, type, m = eventQ.deq
97
116
  case ev
98
117
  when :ev_msg
99
- msg = BGP::Message.factory(m)
100
- Log.info "Recv#{msg.class.to_s.split('::')[-1]}"
101
- Log.debug "Recv #{msg}\n"
102
- changed and notify_observers(msg)
118
+ msg = BGP::Message.factory(m, @as4byte)
119
+ log_info "Recv#{msg.class.to_s.split('::').last}"
120
+ log_debug "Recv #{msg}\n"
103
121
  if msg.is_a?(Update)
104
122
  rcv_update(msg)
105
123
  elsif msg.is_a?(Notification)
@@ -115,6 +133,7 @@ module BGP
115
133
  else
116
134
  Log.error "unexpected message type #{type}"
117
135
  end
136
+ changed and notify_observers(msg)
118
137
  when :ev_conn_reset
119
138
  Log.warn "#{type}"
120
139
  disable
@@ -131,23 +150,28 @@ module BGP
131
150
  def clean
132
151
  @threads.list.each { |x|
133
152
  x.exit; x.join
134
- Log.info "#{x['name']}: stopped at #{Time.now.strftime("%I:%M:%S%P")}"
153
+ log_info "#{x['name']}: stopped at #{Time.now.strftime("%I:%M:%S%P")}"
135
154
  }
136
155
  end
137
-
138
-
139
- def _open_msg_
140
- @open = BGP::Open.new(@version, @my_as, @holdtime, @id, *@opt_parms)
156
+
157
+ def open
158
+ @open ||= BGP::Open.new(version, @my_as, holdtime, @id, *@opt_parms)
141
159
  end
142
- private :_open_msg_
143
-
160
+
161
+ def version
162
+ @version ||= 4
163
+ end
164
+
165
+ def holdtime
166
+ @holdtime ||= 180
167
+ end
168
+
144
169
  def enable(auto_retry=:no_auto_retry, wait= :wait)
145
170
  return if @state == :Established
146
171
  disable unless @state == :Idle
147
172
 
148
173
  init_socket
149
174
  init_io
150
- @open = _open_msg_
151
175
 
152
176
  [@in, @out].each { |io|
153
177
  io.start
@@ -166,7 +190,7 @@ module BGP
166
190
  sleep(0.3)
167
191
  break if @state == :Established
168
192
  end
169
- Log.info "#{self} started"
193
+ log_info "#{self} started"
170
194
  end
171
195
 
172
196
  rescue => e
@@ -183,10 +207,11 @@ module BGP
183
207
  alias stop disable
184
208
 
185
209
  def send_message(m)
210
+ raise if m.nil?
186
211
  return unless @out
187
212
  unless m.is_a?(String)
188
- Log.info "Send#{m.class.to_s.split('::')[-1]}"
189
- Log.debug "Send #{m.is_a?(Update) ? m.to_s(@as4byte) : m }\n"
213
+ log_info "Send#{m.class.to_s.split('::')[-1]}"
214
+ log_debug "Send #{m.is_a?(Update) ? m.to_s(@as4byte) : m }\n"
190
215
  end
191
216
  if m.is_a?(Update)
192
217
  @out.enq m.encode(@as4byte)
@@ -216,21 +241,16 @@ module BGP
216
241
  end
217
242
 
218
243
  def new_state(state, txt='')
219
- Log.info "#{txt} old state #{@state} new state #{state}"
244
+ log_info "#{txt} old state #{@state} new state #{state}"
220
245
  @state = state
221
246
  end
222
247
 
223
- def _send_open_(open)
224
- send_message open
225
- end
226
- private :_send_open_
227
-
228
248
  def send_open(ev)
229
249
  case @state
230
250
  when :OpenRecv
231
- _send_open_ @open ; new_state :OpenConfirm, ev
251
+ send_message open ; new_state :OpenConfirm, ev
232
252
  when :Active
233
- _send_open_ @open ; new_state :OpenSent, ev
253
+ send_message open ; new_state :OpenSent, ev
234
254
  else
235
255
  Log.warn "#{self.class}: attempt to send OPEN msg while in #{@state}"
236
256
  end
@@ -255,14 +275,13 @@ module BGP
255
275
  else
256
276
  Log.warn "#{self.class}: received open message while in state #{@state}"
257
277
  end
258
-
259
- @as4byte = (@open.has?(As4_cap) and o.has?(As4_cap))
278
+ @as4byte = (open.has?(As4_cap) && o.has?(As4_cap))
260
279
  end
261
280
 
262
281
  def rcv_keepalive
263
282
  if @state == :OpenConfirm
264
283
  send_message(BGP::Keepalive.new)
265
- Log.debug "SendKeepAlive"
284
+ log_debug "SendKeepAlive state is #{@state}"
266
285
  new_state(:Established, 'RecvKeepAlive')
267
286
  @keepalive_thread = Thread.new(@holdtime/3) do |h|
268
287
  Thread.current['name'] = "BGP Keepalive interval:(#{h})"
@@ -276,10 +295,16 @@ module BGP
276
295
  end
277
296
 
278
297
  def rcv_notification(m)
279
- Log.info "#{m}"
298
+ log_info "#{m}"
280
299
  disable
281
300
  end
282
301
 
302
+ def rcv_route_refresh(m)
303
+ end
304
+
305
+ def rcv_update(m)
306
+ end
307
+
283
308
  def to_s
284
309
  "version: #{@version}, id: #{@id}, as: #{@my_as}, holdtime: #{@holdtime}, peer addr: #{@remote_addr}, local addr: #{@local_addr}"
285
310
  end
@@ -32,7 +32,7 @@ module BGP
32
32
  s = args[0]
33
33
  @attributes=[]
34
34
  while s.size>0
35
- @attributes << Attr.factory(s)
35
+ @attributes << Attr.factory(*args)
36
36
  end
37
37
  else
38
38
  add(*args)
@@ -160,13 +160,13 @@ module BGP
160
160
 
161
161
  class Attr
162
162
  include BGP::ATTR
163
- def self.factory(s)
163
+ def self.factory(s, as4byte=false)
164
164
  flags, type = s.unpack('CC')
165
165
  case type
166
166
  when ORIGIN
167
167
  Origin.new(s)
168
168
  when AS_PATH
169
- As_path.new(s)
169
+ As_path.new(s,as4byte)
170
170
  when NEXT_HOP
171
171
  Next_hop.new(s)
172
172
  when MULTI_EXIT_DISC
data/bgp/version.rb ADDED
@@ -0,0 +1,3 @@
1
+ module BGP
2
+ VERSION = '0.0.6'
3
+ end
data/bgp4r.gemspec CHANGED
@@ -1,12 +1,15 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
1
4
  # -*- encoding: utf-8 -*-
2
5
 
3
6
  Gem::Specification.new do |s|
4
7
  s.name = %q{bgp4r}
5
- s.version = "0.0.5"
8
+ s.version = "0.0.7"
6
9
 
7
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
11
  s.authors = ["Jean-Michel Esnault"]
9
- s.date = %q{2010-08-14}
12
+ s.date = %q{2010-09-12}
10
13
  s.description = %q{BGP4R is a BGP-4 ruby library to create, send, and receive BGP messages in an object oriented manner}
11
14
  s.email = %q{jesnault@gmail.com}
12
15
  s.extra_rdoc_files = [
@@ -43,11 +46,14 @@ Gem::Specification.new do |s|
43
46
  "bgp/path_attribute.rb",
44
47
  "bgp/prefix_orf.rb",
45
48
  "bgp/rd.rb",
49
+ "bgp/version.rb",
46
50
  "bgp4r.gemspec",
47
51
  "bgp4r.rb",
48
- "examples/bgp",
49
52
  "examples/routegen",
50
53
  "examples/routegen.yml",
54
+ "examples/simple.rb",
55
+ "examples/unit-testing/malformed_update.rb",
56
+ "examples/unit-testing/prepend_aspath.rb",
51
57
  "test/aggregator_test.rb",
52
58
  "test/as_path_test.rb",
53
59
  "test/atomic_aggregate_test.rb",
@@ -76,7 +82,7 @@ Gem::Specification.new do |s|
76
82
  s.require_paths = ["."]
77
83
  s.required_ruby_version = Gem::Requirement.new(">= 1.8.6")
78
84
  s.rubyforge_project = %q{bgp4r}
79
- s.rubygems_version = %q{1.3.7}
85
+ s.rubygems_version = %q{1.3.6}
80
86
  s.summary = %q{A BGP-4 Ruby Library}
81
87
  s.test_files = [
82
88
  "test/aggregator_test.rb",
@@ -106,9 +112,11 @@ Gem::Specification.new do |s|
106
112
  if s.respond_to? :specification_version then
107
113
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
108
114
  s.specification_version = 3
115
+
109
116
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
110
117
  else
111
118
  end
112
119
  else
113
120
  end
114
121
  end
122
+
data/bgp4r.rb CHANGED
@@ -24,3 +24,4 @@ require 'bgp/common'
24
24
  require 'bgp/io'
25
25
  require 'bgp/neighbor'
26
26
  require 'bgp/message'
27
+ require 'bgp/version'
@@ -5,16 +5,16 @@ neighbor:
5
5
  router id: 1.1.1.1
6
6
  my as: 100
7
7
  holdtime: 180
8
- local address: 192.168.1.6
9
- neighbor address: 192.168.1.199
8
+ local address: 199.0.0.5
9
+ neighbor address: 199.0.0.6
10
10
  capabilities:
11
11
  - four byte as
12
12
  routes:
13
13
  nlris: 11.0.0.0/28, 1999, 127
14
- next hop: 192.168.1.6
14
+ next hop: 199.0.0.5
15
15
  local pref: 100
16
16
  med: 100
17
- origin: 1
17
+ origin: 0
18
18
  communities: 100:1 200:1 300:1
19
19
  as path: 200 300 400 500
20
20
 
@@ -0,0 +1,81 @@
1
+
2
+ require "test/unit"
3
+ require 'bgp4r'
4
+ require 'timeout'
5
+
6
+ Thread.abort_on_exception=true
7
+
8
+ class TestBgp < Test::Unit::TestCase
9
+
10
+ include BGP
11
+
12
+ # Log.create
13
+ # Log.level=Logger::DEBUG
14
+
15
+ N100 = Class.new(BGP::Neighbor)
16
+
17
+ class RecvMsgHandler
18
+ def initialize(q)
19
+ @q = q
20
+ end
21
+ def update(bgp_msg)
22
+ @q.enq bgp_msg
23
+ end
24
+ end
25
+
26
+ def setup
27
+ @n100 = N100.new(:my_as=> 100, :remote_addr => '40.0.0.2', :local_addr => '40.0.0.1', :id=> '13.11.19.59')
28
+ start_peering
29
+ end
30
+
31
+ def test_verify_missing_well_known_attribute_is_greeting_with_a_notification_from_as200
32
+ assert @n100.is_established?, "Expected to be in Established state. <> #{@n100.state}"
33
+ queue = Queue.new
34
+ @n100.add_observer RecvMsgHandler.new(queue)
35
+ @n100.send_message malformed_update
36
+ msg = recv(queue)
37
+ assert msg, "Did not receive expected BGP update message."
38
+ assert_instance_of(Notification, msg)
39
+ assert_equal 'Missing Well-known Attribute', msg.to_string
40
+ assert @n100.is_idle?
41
+ end
42
+
43
+ def teardown
44
+ @n100.stop
45
+ sleep(0.5)
46
+ end
47
+
48
+ private
49
+
50
+ def start_peering
51
+ @n100.capability :as4_byte
52
+ @n100.start
53
+ end
54
+
55
+ def recv(q, timeout=5)
56
+ begin
57
+ Timeout::timeout(timeout) do |t|
58
+ msg = q.deq
59
+ end
60
+ rescue Timeout::Error => e
61
+ nil
62
+ end
63
+ end
64
+
65
+ def malformed_update
66
+ update = Update.new(
67
+ Path_attribute.new(
68
+ Origin.new(0),
69
+ Multi_exit_disc.new(100),
70
+ Local_pref.new(100),
71
+ As_path.new(100),
72
+ ),
73
+ Nlri.new('77.0.0.0/17', '78.0.0.0/18', '79.0.0.0/19')
74
+ )
75
+ end
76
+
77
+ def send_update_to(n)
78
+ n.send_message update1
79
+ end
80
+
81
+ end
@@ -0,0 +1,87 @@
1
+ require "test/unit"
2
+ require 'bgp4r'
3
+ require 'timeout'
4
+
5
+ Thread.abort_on_exception=true
6
+
7
+ class TestBgp < Test::Unit::TestCase
8
+
9
+ include BGP
10
+
11
+ Log.create
12
+ Log.level=Logger::DEBUG
13
+
14
+ N100 = Class.new(BGP::Neighbor)
15
+ N300 = Class.new(BGP::Neighbor)
16
+
17
+ class RecvMsgHandler
18
+ def initialize(q)
19
+ @q = q
20
+ end
21
+ def update(bgp_msg)
22
+ @q.enq bgp_msg
23
+ end
24
+ end
25
+
26
+ def setup
27
+ @n100 = N100.new(:my_as=> 100, :remote_addr => '40.0.0.2', :local_addr => '40.0.0.1', :id=> '13.11.19.59')
28
+ @n300 = N300.new(:my_as=> 300, :remote_addr => '40.0.1.1', :local_addr => '40.0.1.2', :id=> '13.11.19.57')
29
+ start_peering
30
+ end
31
+
32
+ def test_verify_that_200_is_prepended_to_aspath
33
+ assert @n100.is_established?, "Expected to be in Established state. <> #{@n100.state}"
34
+ assert @n300.is_established?, "Expected to be in Established state. <> #{@n300.state}"
35
+ queue = Queue.new
36
+ @n300.add_observer RecvMsgHandler.new(queue)
37
+ send_update_to @n100
38
+ msg = recv(queue)
39
+ assert msg, "Did not receive expected BGP update message."
40
+ assert msg.path_attribute.has?(As_path)
41
+ assert_not_nil msg.path_attribute[:as_path]
42
+ assert_equal '200 100', msg.path_attribute[:as_path].as_path
43
+ end
44
+
45
+ def teardown
46
+ [@n100, @n300].each { |n| n.stop }
47
+ sleep(0.5)
48
+ end
49
+
50
+ private
51
+
52
+ def start_peering
53
+ [@n100, @n300].each { |n|
54
+ n.capability :as4_byte
55
+ n.start
56
+ }
57
+ end
58
+
59
+ def recv(q, timeout=5)
60
+ begin
61
+ Timeout::timeout(timeout) do |t|
62
+ msg = q.deq
63
+ end
64
+ rescue Timeout::Error => e
65
+ nil
66
+ end
67
+ end
68
+
69
+ def update1
70
+ update = Update.new(
71
+ Path_attribute.new(
72
+ Origin.new(0),
73
+ Next_hop.new('40.0.0.1'),
74
+ Multi_exit_disc.new(100),
75
+ Local_pref.new(100),
76
+ As_path.new(100),
77
+ Communities.new('1311:1 311:59 2805:64')
78
+ ),
79
+ Nlri.new('77.0.0.0/17', '78.0.0.0/18', '79.0.0.0/19')
80
+ )
81
+ end
82
+
83
+ def send_update_to(n)
84
+ n.send_message update1
85
+ end
86
+
87
+ end
data/test/message_test.rb CHANGED
@@ -125,6 +125,14 @@ class Update_Test < Test::Unit::TestCase
125
125
  an_update << Nlri.new('21.0.0.0/11', '22.0.0.0/22')
126
126
  assert_equal 4, an_update.nlri.size
127
127
  end
128
+
129
+ def test_6
130
+ s = 'ffffffffffffffffffffffffffffffff004a02000000274001010040020a0202000000c80000006440030428000101c0080c0137003b051f00010af50040114d0000124e0000134f0000'
131
+ m = Message.factory([s].pack('H*'), true)
132
+ assert_not_nil m
133
+ assert_instance_of(Update, m)
134
+ assert m.as4byte?
135
+ end
128
136
 
129
137
  end
130
138
 
@@ -40,11 +40,24 @@ class TestBgpNeighbor < Test::Unit::TestCase
40
40
  neighbor.capability Route_refresh_cap.new
41
41
  neighbor.capability Route_refresh_cap.new 128
42
42
  neighbor.capability As4_cap.new(100)
43
- open_msg = neighbor.instance_eval { _open_msg_ }
43
+ open_msg = neighbor.open
44
44
  assert_equal(5,open_msg.opt_parms.size)
45
45
  assert_equal(4,open_msg.version)
46
46
  assert_equal(20,open_msg.holdtime)
47
47
  assert_equal(100,open_msg.local_as)
48
48
  # puts neighbor
49
49
  end
50
+ def test_states
51
+ neighbor = Neighbor.new \
52
+ :version=> 4,
53
+ :my_as=> 100,
54
+ :remote_addr => '192.168.1.200',
55
+ :local_addr => '192.168.1.5',
56
+ :id=> '1.1.1.1',
57
+ :holdtime=> 20
58
+ assert neighbor.is_idle?
59
+ assert ! neighbor.is_established?
60
+ assert ! neighbor.is_openrecv?
61
+ assert ! neighbor.is_openconfirm?
62
+ end
50
63
  end
@@ -124,4 +124,15 @@ class Path_attribute_Test < Test::Unit::TestCase # :nodoc:
124
124
 
125
125
  end
126
126
 
127
+ def test_4
128
+ s = '4001010040020a0202000000c80000006440030428000101c0080c0137003b051f00010af50040'
129
+ sbin = [s].pack('H*')
130
+ assert_instance_of(Origin, attr = Attr.factory(sbin))
131
+ assert_instance_of(As_path, attr = Attr.factory(sbin,true))
132
+ assert_equal '200 100', attr.as_path
133
+ assert_instance_of(Next_hop, Attr.factory(sbin,true))
134
+ assert_instance_of(Communities, Attr.factory(sbin,true))
135
+ assert_equal 0, sbin.size
136
+ end
137
+
127
138
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 5
9
- version: 0.0.5
8
+ - 7
9
+ version: 0.0.7
10
10
  platform: ruby
11
11
  authors:
12
12
  - Jean-Michel Esnault
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-08-14 00:00:00 -07:00
17
+ date: 2010-09-12 00:00:00 -07:00
18
18
  default_executable:
19
19
  dependencies: []
20
20
 
@@ -57,11 +57,14 @@ files:
57
57
  - bgp/path_attribute.rb
58
58
  - bgp/prefix_orf.rb
59
59
  - bgp/rd.rb
60
+ - bgp/version.rb
60
61
  - bgp4r.gemspec
61
62
  - bgp4r.rb
62
- - examples/bgp
63
63
  - examples/routegen
64
64
  - examples/routegen.yml
65
+ - examples/simple.rb
66
+ - examples/unit-testing/malformed_update.rb
67
+ - examples/unit-testing/prepend_aspath.rb
65
68
  - test/aggregator_test.rb
66
69
  - test/as_path_test.rb
67
70
  - test/atomic_aggregate_test.rb
@@ -97,7 +100,6 @@ rdoc_options:
97
100
  require_paths:
98
101
  - .
99
102
  required_ruby_version: !ruby/object:Gem::Requirement
100
- none: false
101
103
  requirements:
102
104
  - - ">="
103
105
  - !ruby/object:Gem::Version
@@ -107,7 +109,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
107
109
  - 6
108
110
  version: 1.8.6
109
111
  required_rubygems_version: !ruby/object:Gem::Requirement
110
- none: false
111
112
  requirements:
112
113
  - - ">="
113
114
  - !ruby/object:Gem::Version
@@ -117,7 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
117
118
  requirements: []
118
119
 
119
120
  rubyforge_project: bgp4r
120
- rubygems_version: 1.3.7
121
+ rubygems_version: 1.3.6
121
122
  signing_key:
122
123
  specification_version: 3
123
124
  summary: A BGP-4 Ruby Library
File without changes