bgp4r 0.0.15 → 0.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 71db0cc737f4499799b737953e4cfa4659601d80
4
+ data.tar.gz: c002a569edc6e2c77daa7d0fc4288ba675798820
5
+ SHA512:
6
+ metadata.gz: 61dbb8e76c0191d02ba0080b4e43a54cdb68566516bdba06edb90b7d8610ce86c24b0f151c4a3c97bdca455c5320817fadd45930ef66df28fe7b6ad42c391809
7
+ data.tar.gz: 65d345be33cae08fea7290cea4ee8d45f78231eaf2afc8169f1ad0e9a8ac08b950e8c644a264cd60ba928cad78b3d50867326fb23cb0aed48403c3b7a979e7b8
data/bgp/common.rb CHANGED
@@ -55,10 +55,21 @@ class IPAddr
55
55
  def +(i)
56
56
  [IPAddr.create(to_i + i).to_s, mlen].join("/")
57
57
  end
58
- def ^(i)
58
+
59
+ def increment
59
60
  @increment ||= _generate_network_inc_
60
- [IPAddr.create(to_i + @increment.call(i)).to_s, mlen].join("/")
61
61
  end
62
+
63
+ def ^(i)
64
+ x = to_i + increment.call(i)
65
+ if ipv4?
66
+ [IPAddr.create(x).to_s, mlen].join("/")
67
+ else
68
+ y = [(format "%032x",x)].pack('H*')
69
+ [IPAddr.new_ntoh(y).to_s ,mlen].join("/")
70
+ end
71
+ end
72
+
62
73
  private :_generate_network_inc_
63
74
 
64
75
  def netmask
data/bgp/io.rb CHANGED
@@ -81,7 +81,10 @@ module BGP
81
81
  end
82
82
  if @buf.size>18
83
83
  @len, @type=@buf[16,3].unpack('nC')
84
- return @buf.slice!(0,@len) if @len<=@buf.size
84
+ if @len<=@buf.size
85
+ bgp_message = @buf.slice!(0,@len)
86
+ return bgp_message
87
+ end
85
88
  end
86
89
  end
87
90
  end
@@ -22,9 +22,13 @@ module BGP
22
22
  class Keepalive < Message
23
23
  def initialize
24
24
  @msg_type=KEEPALIVE
25
+ @keepalive=[[0xffffffff]*4,"001304"].flatten.pack('NNNNH6')
25
26
  end
26
27
  def to_s
27
28
  "Keepalive Message (#{KEEPALIVE}), length: 19" + ", [#{self.to_shex[32..-1]}]"
28
29
  end
30
+ def encode
31
+ @keepalive
32
+ end
29
33
  end
30
34
  end
@@ -74,7 +74,7 @@ module ::BGP
74
74
  end
75
75
  end
76
76
  def self.keepalive
77
- Keepalive.new.encode
77
+ @keepalive ||= Keepalive.new.encode
78
78
  end
79
79
  def self.route_refresh(afi,safi)
80
80
  Route_refresh.new(afi,safi).encode
@@ -243,7 +243,9 @@ module BGP
243
243
 
244
244
  def send_message(m)
245
245
  raise if m.nil?
246
- return unless @out
246
+ unless @out
247
+ log_warn "Could not Send#{m.class.to_s.split('::')[-1]} @out is nil"
248
+ end
247
249
  unless m.is_a?(String)
248
250
  log_info "Send#{m.class.to_s.split('::')[-1]}"
249
251
  log_debug "Send #{m.is_a?(Update) ? m.to_s : m }\n"
@@ -0,0 +1,28 @@
1
+ #--
2
+ # Copyright 2014 Jean-Michel Esnault.
3
+ # All rights reserved.
4
+ # See LICENSE.txt for permissions.
5
+ #
6
+ #
7
+ # This file is part of BGP4R.
8
+ #
9
+
10
+ require 'bgp/common'
11
+
12
+ module BGP
13
+ class Ipv4_mapped < IPAddr
14
+ def initialize(ipaddr)
15
+ super
16
+ raise unless ipv4?
17
+ end
18
+ def nexthop
19
+ to_s
20
+ end
21
+ def encode(*args)
22
+ [0,0,0,0xffff,hton].pack('N2n2a*')
23
+ end
24
+ alias encode_next_hop encode
25
+ end
26
+ end
27
+
28
+ load "../../test/unit/nlris/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
data/bgp/nlris/nlris.rb CHANGED
@@ -4,5 +4,6 @@
4
4
  inet
5
5
  labeled
6
6
  vpn
7
- rd
7
+ rd
8
+ mapped_ipv4
8
9
  }.each { |n| require "bgp/nlris/#{n}" }
@@ -31,18 +31,24 @@ module BGP
31
31
  if args[0].is_a?(String) and args[0].is_packed?
32
32
  parse(*args)
33
33
  elsif args.size==2 and
34
- args[0].is_a?(String) and (args[1].is_a?(Fixnum) or args[1].is_a?(Bignum))
34
+ args[0].is_a?(String) and args[1].is_a?(Integer)
35
35
  @ip_address = IPAddr.create(args[0])
36
- @as = args[1]
36
+ self.asn = args[1]
37
37
  elsif args[0].is_a?(self.class)
38
38
  parse(args[0].encode, *args[1..-1])
39
39
  elsif args[0].is_a?(Hash)
40
40
  @ip_address = IPAddr.create(args[0][:address])
41
- @as = args[0][:asn]
41
+ self.asn = args[0][:asn]
42
42
  else
43
43
  raise ArgumentError, "invalid argument, #{args.inspect}"
44
44
  end
45
45
  end
46
+
47
+ def asn=(arg)
48
+ raise unless arg.is_a?(Integer)
49
+ @as=arg
50
+ end
51
+
46
52
 
47
53
  def address=(val)
48
54
  @ip_address=IPAddr.create(val)
@@ -268,16 +268,16 @@ module BGP
268
268
 
269
269
  class << self
270
270
  def new_set(*args)
271
- new_hash :set=>args
271
+ new_hash :set=>args.flatten
272
272
  end
273
273
  def new_sequence(*args)
274
- new_hash :sequence=>args
274
+ new_hash :sequence=>args.flatten
275
275
  end
276
276
  def new_confed_set(*args)
277
- new_hash :confed_set=>args
277
+ new_hash :confed_set=>args.flatten
278
278
  end
279
279
  def new_confed_sequence(*args)
280
- new_hash :confed_sequence=>args
280
+ new_hash :confed_sequence=>args.flatten
281
281
  end
282
282
  end
283
283
  end
@@ -98,9 +98,42 @@ module BGP
98
98
  s.join("\n")
99
99
  end
100
100
 
101
+ def insert(*args)
102
+ for arg in args
103
+ next unless arg.is_a?(Extended_community)
104
+ communities.insert(0,arg)
105
+ end
106
+ self
107
+ end
108
+
109
+ def append(*args)
110
+ for arg in args
111
+ next unless arg.is_a?(Extended_community)
112
+ communities << (arg)
113
+ end
114
+ self
115
+ end
116
+
117
+ def replace(*args)
118
+ for arg in args
119
+ next unless arg.is_a?(Extended_community)
120
+ ind = communities.find_index { |x| x.class == arg.class }
121
+ if ind
122
+ communities[ind] = arg
123
+ else
124
+ append(arg)
125
+ end
126
+ end
127
+ self
128
+ end
129
+
101
130
  def find(klass)
102
131
  communities.find { |c| c.is_a?(klass) }
103
132
  end
133
+
134
+ def find_all(klass)
135
+ communities.find_all { |c| c.is_a?(klass) }
136
+ end
104
137
 
105
138
  %w{
106
139
  color
@@ -112,7 +145,12 @@ module BGP
112
145
  ospf_router_id
113
146
  }.each do |ecom|
114
147
  define_method("#{ecom}") do
115
- find(BGP.const_get(ecom.capitalize))
148
+ ecs = find_all(BGP.const_get(ecom.capitalize))
149
+ ecs.size==1 ? ecs[0] : ecs
150
+ end
151
+ define_method("#{ecom}=") do |*args|
152
+ k = BGP.const_get(ecom.capitalize)
153
+ replace(k.new(*args))
116
154
  end
117
155
  end
118
156
 
@@ -62,7 +62,7 @@ module BGP
62
62
  case self
63
63
  when Color
64
64
  _,@global = s.unpack('nN')
65
- when Encapsulation
65
+ # when Encapsulation
66
66
  _,@global = s.unpack('Nn')
67
67
  else
68
68
  @global = s.unpack('H12')
@@ -175,8 +175,8 @@ module BGP
175
175
  case self
176
176
  when BGP::Color
177
177
  [0,@global].pack('nN')
178
- when BGP::Encapsulation
179
- [0,@global].pack('Nn')
178
+ # when BGP::Encapsulation
179
+ # [0,@global].pack('Nn')
180
180
  else
181
181
  [@global].pack('H12')
182
182
  end
@@ -209,9 +209,10 @@ module BGP
209
209
  when BGP_DATA_COLLECT ; Bgp_data_collect.new(s)
210
210
  when LINK_BANDWIDTH ; Link_bandwidth.new(s)
211
211
  when COLOR ; Color.new(s)
212
- when ENCAPSULATION ; Encapsulation.new(s)
212
+ # when ENCAPSULATION ; Encapsulation.new(s)
213
213
  else
214
214
  puts "too bad type #{type.to_s(16)}, subtype #{subtype.to_s(16)} : #{s.unpack('H*')}"
215
+ raise
215
216
  Extended_community.new(s)
216
217
  end
217
218
  end
@@ -248,7 +249,7 @@ module BGP
248
249
  if args[0].is_a?(String) and args[0].is_packed?
249
250
  super(*args)
250
251
  else
251
- super(0, ROUTE_TARGET, *args)
252
+ super(*[0, ROUTE_TARGET, *args].flatten)
252
253
  end
253
254
  end
254
255
  end
@@ -258,7 +259,7 @@ module BGP
258
259
  if args[0].is_a?(String) and args[0].is_packed?
259
260
  super(*args)
260
261
  else
261
- super(0,ROUTE_ORIGIN,*args)
262
+ super(*[0,ROUTE_ORIGIN,*args].flatten)
262
263
  end
263
264
  end
264
265
  end
@@ -339,33 +340,38 @@ module BGP
339
340
  end
340
341
  end
341
342
 
342
- class Encapsulation < Opaque
343
- def initialize(*args)
344
- args = 0 if args.empty?
345
- if args[0].is_a?(String) and args[0].is_packed?
346
- super(*args)
347
- else
348
- case args[0]
349
- when :l2tpv3 ; tunnel_type = 1
350
- when :gre ; tunnel_type = 2
351
- when :ipip ; tunnel_type = 7
352
- else
353
- tunnel_type = *args
354
- end
355
- super(TRANSITIVE, ENCAPSULATION, tunnel_type)
356
- end
357
- end
358
- def value2
359
- case @global
360
- when 1 ; :l2tpv3
361
- when 2 ; :gre
362
- when 7 ; :ipip
363
- else
364
- @global
365
- end
366
- end
367
- end
343
+ # class Encapsulation < Opaque
344
+ # def initialize(*args)
345
+ # args = 0 if args.empty?
346
+ # if args[0].is_a?(String) and args[0].is_packed?
347
+ # super(*args)
348
+ # else
349
+ # case args[0]
350
+ # when :l2tpv3 ; tunnel_type = 1
351
+ # when :gre ; tunnel_type = 2
352
+ # when :ipip ; tunnel_type = 7
353
+ # else
354
+ # tunnel_type = *args
355
+ # end
356
+ # super(TRANSITIVE, ENCAPSULATION, tunnel_type)
357
+ # end
358
+ # end
359
+ # def value2
360
+ # case @global
361
+ # when 1 ; :l2tpv3
362
+ # when 2 ; :gre
363
+ # when 7 ; :ipip
364
+ # else
365
+ # @global
366
+ # end
367
+ # end
368
+ # end
368
369
 
369
370
  end
370
371
 
372
+
373
+
374
+ __END__
375
+
376
+
371
377
  load "../../test/unit/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
@@ -34,7 +34,7 @@ module BGP
34
34
  def set(h)
35
35
  @safi = h[:safi]
36
36
  @path_id = h[:path_id]
37
- @afi = h.has_key?(:afi) ? h[:afi] : self.class.afi_from_nlris(h[:nlris])
37
+ @afi = h[:afi] || self.class.afi_from_nlris(h[:nlris])
38
38
  case safi
39
39
  when 1,2
40
40
  pfx_klass = prefix_klass(afi, safi)
@@ -66,7 +66,7 @@ module BGP
66
66
  else
67
67
  raise "SAFI #{safi} not implemented!"
68
68
  end
69
- @nexthops = [h[:nexthop]].flatten.collect { |nh| nexthop_klass(afi,safi).new(nh) } if h[:nexthop]
69
+ @nexthops = [h[:nexthop]].flatten.collect { |nh| nexthop_klass(afi,safi,nh).new(nh) } if h[:nexthop]
70
70
  self
71
71
  end
72
72
 
@@ -106,6 +106,8 @@ module BGP
106
106
  when Hash
107
107
  _arg = arg[:prefix]
108
108
  else
109
+ p "**********************"
110
+ p arg
109
111
  raise
110
112
  end
111
113
 
@@ -159,6 +161,7 @@ module BGP
159
161
  elsif args[0].is_a?(Hash) and args.size==1
160
162
  set(*args)
161
163
  else
164
+ p args
162
165
  raise ArgumentError, "invalid argument"
163
166
  end
164
167
  end
@@ -286,14 +289,18 @@ module BGP
286
289
 
287
290
  private
288
291
 
289
- def nexthop_klass(afi, safi)
292
+ def nexthop_klass(afi, safi, nh)
290
293
  case afi
291
294
  when 3
292
295
  ::BGP::const_get('Iso_ip_mapped')
293
296
  else
294
297
  case safi
295
298
  when 1,2,4
296
- ::BGP::const_get('Prefix')
299
+ if afi==2 && IPAddr.new(nh).ipv4?
300
+ ::BGP::const_get('Ipv4_mapped')
301
+ else
302
+ ::BGP::const_get('Prefix')
303
+ end
297
304
  when 128,129
298
305
  ::BGP::const_get('Vpn')
299
306
  else
@@ -240,6 +240,12 @@ module BGP
240
240
  @attributes.find { |a| a.is_a?(k) }
241
241
  end
242
242
  eval "alias :has_an_#{attr}? :has_a_#{attr}_attr?" if (attr =~ /^[aeiou]/)
243
+
244
+ define_method("#{attr}=") do |*args|
245
+ k = BGP.const_get(attr.capitalize)
246
+ replace(k.new(*args))
247
+ end
248
+
243
249
  end
244
250
 
245
251
  def to_hash
@@ -260,7 +266,13 @@ module BGP
260
266
  end
261
267
 
262
268
  def method_missing(name, *args, &block)
263
- super
269
+ if name.to_s == 'med='
270
+ multi_exit_disc= *args
271
+ elsif name.to_s =~ /^as_path_(.+)=$/
272
+ replace(As_path, As_path.send("new_#{$1}", *args))
273
+ else
274
+ super
275
+ end
264
276
  end
265
277
 
266
278
  end
@@ -346,14 +358,6 @@ module BGP
346
358
  end
347
359
 
348
360
  end
349
-
350
- # require 'bgp/path_attributes/local_pref'
351
- # require 'bgp/path_attributes/next_hop'
352
- # require 'bgp/path_attributes/multi_exit_disc'
353
- #
354
- # p = Path_attribute.new :local_pref=>100, :next_hop => '10.0.0.1', :med=>300
355
- # # p p
356
- # puts p
357
361
 
358
362
  end
359
363
  load "../../test/unit/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
data/bgp4r.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "bgp4r"
8
- s.version = "0.0.15"
8
+ s.version = "0.0.16"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Jean-Michel Esnault"]
12
- s.date = "2012-02-13"
12
+ s.date = "2014-05-07"
13
13
  s.description = "BGP4R is a BGP-4 ruby library to create, send, and receive BGP messages in an object oriented manner"
14
14
  s.email = "bgp4r@esnault.org"
15
15
  s.extra_rdoc_files = [
@@ -44,6 +44,7 @@ Gem::Specification.new do |s|
44
44
  "bgp/nlris/prefix.rb",
45
45
  "bgp/nlris/rd.rb",
46
46
  "bgp/nlris/vpn.rb",
47
+ "bgp/nlris/mapped_ipv4.rb",
47
48
  "bgp/optional_parameters/add_path.rb",
48
49
  "bgp/optional_parameters/as4.rb",
49
50
  "bgp/optional_parameters/capabilities.rb",
@@ -84,6 +85,7 @@ Gem::Specification.new do |s|
84
85
  "examples/unit-testing/no_export_test.rb",
85
86
  "examples/unit-testing/prepend_aspath_test.rb",
86
87
  "examples/unit-testing/unknown_transitive_attr_test.rb",
88
+ "examples/bgp-vyatta-ipv6.rb",
87
89
  "test/functional/add_path_test.rb",
88
90
  "test/functional/live_feed_test.rb",
89
91
  "test/helpers/server.rb",
@@ -108,6 +110,7 @@ Gem::Specification.new do |s|
108
110
  "test/unit/nlris/prefix_test.rb",
109
111
  "test/unit/nlris/rd_test.rb",
110
112
  "test/unit/nlris/vpn_test.rb",
113
+ "test/unit/nlris/mapped_ipv4_test.rb",
111
114
  "test/unit/optional_parameters/add_path_test.rb",
112
115
  "test/unit/optional_parameters/as4_test.rb",
113
116
  "test/unit/optional_parameters/capability_test.rb",
@@ -135,7 +138,6 @@ Gem::Specification.new do |s|
135
138
  "test/unit/path_attributes/origin_test.rb",
136
139
  "test/unit/path_attributes/originator_id_test.rb",
137
140
  "test/unit/path_attributes/path_attribute_test.rb",
138
- "test/unit/path_attributes/tunnel_encapsulation_test (Jean-Michel's Laptop's conflicted copy 2011-11-02).rb"
139
141
  ]
140
142
  s.homepage = "http://github.com/jesnault/bgp4r/tree/master"
141
143
  s.require_paths = ["."]
@@ -143,7 +145,7 @@ Gem::Specification.new do |s|
143
145
  s.rubyforge_project = "bgp4r"
144
146
  s.rubygems_version = "1.8.11"
145
147
  s.summary = "A BGP-4 Ruby Library"
146
- s.test_files = ["test/functional", "test/functional/add_path_test.rb", "test/functional/live_feed_test.rb", "test/helpers", "test/helpers/server.rb", "test/misc", "test/misc/misc.rb", "test/unit", "test/unit/common_test.rb", "test/unit/iana_test.rb", "test/unit/messages", "test/unit/messages/capability_test.rb", "test/unit/messages/keepalive_test.rb", "test/unit/messages/markers_test.rb", "test/unit/messages/message_test.rb", "test/unit/messages/notification_test.rb", "test/unit/messages/open_test.rb", "test/unit/messages/route_refresh_test.rb", "test/unit/messages/update_test.rb", "test/unit/neighbor", "test/unit/neighbor/add_path_cap_test.rb", "test/unit/neighbor/neighbor_test.rb", "test/unit/nlris", "test/unit/nlris/inet_test.rb", "test/unit/nlris/label_test.rb", "test/unit/nlris/labeled_test.rb", "test/unit/nlris/nlri_test.rb", "test/unit/nlris/nsap_test.rb", "test/unit/nlris/prefix_test.rb", "test/unit/nlris/rd_test.rb", "test/unit/nlris/vpn_test.rb", "test/unit/optional_parameters", "test/unit/optional_parameters/add_path_test.rb", "test/unit/optional_parameters/as4_test.rb", "test/unit/optional_parameters/capability_test.rb", "test/unit/optional_parameters/dynamic_test.rb", "test/unit/optional_parameters/graceful_restart_test.rb", "test/unit/optional_parameters/mbgp_test.rb", "test/unit/optional_parameters/optional_parameter_test.rb", "test/unit/optional_parameters/orf_test.rb", "test/unit/optional_parameters/route_refresh_test.rb", "test/unit/orfs", "test/unit/orfs/prefix_orf_test.rb", "test/unit/path_attributes", "test/unit/path_attributes/aggregator_test.rb", "test/unit/path_attributes/aigp_test.rb", "test/unit/path_attributes/as_path_test.rb", "test/unit/path_attributes/atomic_aggregate_test.rb", "test/unit/path_attributes/attribute_test.rb", "test/unit/path_attributes/cluster_list_test.rb", "test/unit/path_attributes/communities_test.rb", "test/unit/path_attributes/extended_communities_test.rb", "test/unit/path_attributes/extended_community_test.rb", "test/unit/path_attributes/local_pref_test.rb", "test/unit/path_attributes/mp_reach_test.rb", "test/unit/path_attributes/mp_unreach_test.rb", "test/unit/path_attributes/multi_exit_disc_test.rb", "test/unit/path_attributes/next_hop_test.rb", "test/unit/path_attributes/origin_test.rb", "test/unit/path_attributes/originator_id_test.rb", "test/unit/path_attributes/path_attribute_test.rb", "test/unit/path_attributes/tunnel_encapsulation_test (Jean-Michel's Laptop's conflicted copy 2011-11-02).rb"]
148
+ s.test_files = ["test/functional", "test/functional/add_path_test.rb", "test/functional/live_feed_test.rb", "test/helpers", "test/helpers/server.rb", "test/misc", "test/misc/misc.rb", "test/unit", "test/unit/common_test.rb", "test/unit/iana_test.rb", "test/unit/messages", "test/unit/messages/capability_test.rb", "test/unit/messages/keepalive_test.rb", "test/unit/messages/markers_test.rb", "test/unit/messages/message_test.rb", "test/unit/messages/notification_test.rb", "test/unit/messages/open_test.rb", "test/unit/messages/route_refresh_test.rb", "test/unit/messages/update_test.rb", "test/unit/neighbor", "test/unit/neighbor/add_path_cap_test.rb", "test/unit/neighbor/neighbor_test.rb", "test/unit/nlris", "test/unit/nlris/inet_test.rb", "test/unit/nlris/label_test.rb", "test/unit/nlris/labeled_test.rb", "test/unit/nlris/nlri_test.rb", "test/unit/nlris/nsap_test.rb", "test/unit/nlris/prefix_test.rb", "test/unit/nlris/rd_test.rb", "test/unit/nlris/vpn_test.rb", "test/unit/optional_parameters", "test/unit/optional_parameters/add_path_test.rb", "test/unit/optional_parameters/as4_test.rb", "test/unit/optional_parameters/capability_test.rb", "test/unit/optional_parameters/dynamic_test.rb", "test/unit/optional_parameters/graceful_restart_test.rb", "test/unit/optional_parameters/mbgp_test.rb", "test/unit/optional_parameters/optional_parameter_test.rb", "test/unit/optional_parameters/orf_test.rb", "test/unit/optional_parameters/route_refresh_test.rb", "test/unit/orfs", "test/unit/orfs/prefix_orf_test.rb", "test/unit/path_attributes", "test/unit/path_attributes/aggregator_test.rb", "test/unit/path_attributes/aigp_test.rb", "test/unit/path_attributes/as_path_test.rb", "test/unit/path_attributes/atomic_aggregate_test.rb", "test/unit/path_attributes/attribute_test.rb", "test/unit/path_attributes/cluster_list_test.rb", "test/unit/path_attributes/communities_test.rb", "test/unit/path_attributes/extended_communities_test.rb", "test/unit/path_attributes/extended_community_test.rb", "test/unit/path_attributes/local_pref_test.rb", "test/unit/path_attributes/mp_reach_test.rb", "test/unit/path_attributes/mp_unreach_test.rb", "test/unit/path_attributes/multi_exit_disc_test.rb", "test/unit/path_attributes/next_hop_test.rb", "test/unit/path_attributes/origin_test.rb", "test/unit/path_attributes/originator_id_test.rb", "test/unit/path_attributes/path_attribute_test.rb"]
147
149
 
148
150
  if s.respond_to? :specification_version then
149
151
  s.specification_version = 3
data/bgp4r.rb CHANGED
@@ -1,3 +1,9 @@
1
+
2
+ if Object.const_defined? :Encoding
3
+ Encoding.default_external="BINARY"
4
+ Encoding.default_internal="BINARY"
5
+ end
6
+
1
7
  require 'bgp/common'
2
8
  require 'bgp/iana'
3
9
  require 'bgp/messages/messages'
@@ -0,0 +1,148 @@
1
+ require 'bgp4r'
2
+
3
+ include BGP
4
+
5
+ Log.create
6
+ Log.level=Logger::INFO
7
+
8
+ neighbor = Neighbor.new \
9
+ :version=> 4,
10
+ :my_as=> 100,
11
+ :remote_addr => '169.253.253.102',
12
+ :id=> '20.20.20.20',
13
+ :holdtime=> 180
14
+
15
+ neighbor.capability_mbgp_ipv4_unicast
16
+ neighbor.capability_mbgp_ipv6_unicast
17
+
18
+ nexthop='fe80::20c:29ff:fcab:13b'
19
+
20
+ pa = Path_attribute.new(
21
+ Origin.new(0),
22
+ Multi_exit_disc.new(0),
23
+ As_path.new(),
24
+ )
25
+
26
+ # 22 routes, 5 routes per update
27
+ subnet = Fiber.new do
28
+ ipaddr = IPAddr.new "2014:13:11::1/65"
29
+ pack=5
30
+ prefixes=[]
31
+ 22.times do |i|
32
+ prefixes << (ipaddr ^ i)
33
+ next unless (i%pack)==0
34
+ Fiber.yield prefixes
35
+ prefixes=[]
36
+ end
37
+ Fiber.yield prefixes unless prefixes.empty?
38
+ nil
39
+ end
40
+
41
+ neighbor.start
42
+
43
+ while nets = subnet.resume
44
+ neighbor.send_message Update.new pa.replace(Mp_reach.new(:afi=>2, :safi=>1, :nexthop=> nexthop, :nlris=> nets))
45
+ end
46
+
47
+ sleep(300)
48
+
49
+ __END__
50
+
51
+
52
+ I, [11:26#26571] INFO -- : BGP::Neighbor RecvOpen old state OpenSent new state OpenConfirm
53
+ I, [11:26#26571] INFO -- : BGP::Neighbor RecvKeepalive
54
+ D, [11:26#26571] DEBUG -- : BGP::Neighbor Recv Keepalive Message (4), length: 19, [001304]
55
+
56
+ I, [11:26#26571] INFO -- : BGP::Neighbor SendKeepalive
57
+ D, [11:26#26571] DEBUG -- : BGP::Neighbor Send Keepalive Message (4), length: 19, [001304]
58
+
59
+ D, [11:26#26571] DEBUG -- : BGP::Neighbor SendKeepAlive state is OpenConfirm
60
+ I, [11:26#26571] INFO -- : BGP::Neighbor RecvKeepAlive old state OpenConfirm new state Established
61
+ I, [11:26#26571] INFO -- : BGP::Neighbor RecvKeepalive
62
+ D, [11:26#26571] DEBUG -- : BGP::Neighbor Recv Keepalive Message (4), length: 19, [001304]
63
+
64
+ I, [11:26#26571] INFO -- : BGP::Neighbor version: 4, id: 20.20.20.20, as: 100, holdtime: 180, peer addr: 169.253.253.102, local addr: started
65
+ I, [11:26#26571] INFO -- : BGP::Neighbor SendUpdate
66
+ I, [11:26#26571] INFO -- : BGP::Neighbor SendUpdate
67
+ I, [11:26#26571] INFO -- : BGP::Neighbor SendUpdate
68
+ I, [11:26#26571] INFO -- : BGP::Neighbor SendUpdate
69
+ I, [11:26#26571] INFO -- : BGP::Neighbor SendUpdate
70
+ I, [11:26#26571] INFO -- : BGP::Neighbor SendUpdate
71
+ I, [11:27#26571] INFO -- : BGP::Neighbor RecvUpdate
72
+ I, [12:26#26571] INFO -- : BGP::Neighbor SendKeepalive
73
+ I, [12:26#26571] INFO -- : BGP::Neighbor RecvKeepalive
74
+
75
+
76
+ root@vyatta:~# show ipv6 route
77
+ Codes: K - kernel route, C - connected, S - static, R - RIPng, O - OSPFv3,
78
+ I - ISIS, B - BGP, * - FIB route.
79
+
80
+ C>* ::1/128 is directly connected, lo
81
+ B>* 2014:13:11::/65 [200/0] via fe80::20c:29ff:fcab:13b, eth9, 00:01:01
82
+ B>* 2014:13:11:0:8000::/65 [200/0] via fe80::20c:29ff:fcab:13b, eth9, 00:01:01
83
+ B>* 2014:13:11:1::/65 [200/0] via fe80::20c:29ff:fcab:13b, eth9, 00:01:01
84
+ B>* 2014:13:11:1:8000::/65 [200/0] via fe80::20c:29ff:fcab:13b, eth9, 00:01:01
85
+ B>* 2014:13:11:2::/65 [200/0] via fe80::20c:29ff:fcab:13b, eth9, 00:01:01
86
+ B>* 2014:13:11:2:8000::/65 [200/0] via fe80::20c:29ff:fcab:13b, eth9, 00:01:01
87
+ B>* 2014:13:11:3::/65 [200/0] via fe80::20c:29ff:fcab:13b, eth9, 00:01:01
88
+ B>* 2014:13:11:3:8000::/65 [200/0] via fe80::20c:29ff:fcab:13b, eth9, 00:01:01
89
+ B>* 2014:13:11:4::/65 [200/0] via fe80::20c:29ff:fcab:13b, eth9, 00:01:01
90
+ B>* 2014:13:11:4:8000::/65 [200/0] via fe80::20c:29ff:fcab:13b, eth9, 00:01:01
91
+ B>* 2014:13:11:5::/65 [200/0] via fe80::20c:29ff:fcab:13b, eth9, 00:01:01
92
+ B>* 2014:13:11:5:8000::/65 [200/0] via fe80::20c:29ff:fcab:13b, eth9, 00:01:01
93
+ B>* 2014:13:11:6::/65 [200/0] via fe80::20c:29ff:fcab:13b, eth9, 00:01:01
94
+ B>* 2014:13:11:6:8000::/65 [200/0] via fe80::20c:29ff:fcab:13b, eth9, 00:01:01
95
+ B>* 2014:13:11:7::/65 [200/0] via fe80::20c:29ff:fcab:13b, eth9, 00:01:01
96
+ B>* 2014:13:11:7:8000::/65 [200/0] via fe80::20c:29ff:fcab:13b, eth9, 00:01:01
97
+ B>* 2014:13:11:8::/65 [200/0] via fe80::20c:29ff:fcab:13b, eth9, 00:01:01
98
+ B>* 2014:13:11:8:8000::/65 [200/0] via fe80::20c:29ff:fcab:13b, eth9, 00:01:01
99
+ B>* 2014:13:11:9::/65 [200/0] via fe80::20c:29ff:fcab:13b, eth9, 00:01:01
100
+ B>* 2014:13:11:9:8000::/65 [200/0] via fe80::20c:29ff:fcab:13b, eth9, 00:01:01
101
+ B>* 2014:13:11:a::/65 [200/0] via fe80::20c:29ff:fcab:13b, eth9, 00:01:01
102
+ B>* 2014:13:11:a:8000::/65 [200/0] via fe80::20c:29ff:fcab:13b, eth9, 00:01:01
103
+ C * fe80::/64 is directly connected, eth9
104
+ C>* fe80::/64 is directly connected, eth6
105
+ root@vyatta:~#
106
+
107
+
108
+ vyatta@vyatta:~$ show interfaces
109
+ Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
110
+ Interface IP Address S/L Description
111
+ --------- ---------- --- -----------
112
+ eth6 192.168.244.153/24 u/u
113
+ eth9 169.253.253.102/24 u/u
114
+ lo 127.0.0.1/8 u/u
115
+ ::1/128
116
+
117
+ vyatta@vyatta:~$ show configuration
118
+ interfaces {
119
+ ethernet eth6 {
120
+ duplex auto
121
+ hw-id 00:0c:29:6b:52:a9
122
+ smp_affinity auto
123
+ speed auto
124
+ }
125
+ ethernet eth9 {
126
+ address dhcp
127
+ duplex auto
128
+ hw-id 00:0c:29:6b:52:9f
129
+ smp_affinity auto
130
+ speed auto
131
+ }
132
+ loopback lo {
133
+ }
134
+ }
135
+ protocols {
136
+ bgp 100 {
137
+ neighbor 169.253.253.1 {
138
+ address-family {
139
+ ipv6-unicast {
140
+ }
141
+ }
142
+ remote-as 100
143
+ }
144
+ parameters {
145
+ router-id 1.2.3.4
146
+ }
147
+ }
148
+ }