bgp4r 0.0.14 → 0.0.15

Sign up to get free protection for your applications and to get access to all the features.
@@ -39,6 +39,7 @@ module ::BGP
39
39
  end
40
40
 
41
41
  def encode(message='')
42
+ raise unless @msg_type.is_a?(Integer)
42
43
  len = message.size+19
43
44
  [[255]*16,len,@msg_type,message].flatten.pack('C16nCa*')
44
45
  end
@@ -56,6 +56,7 @@ class BGP::Update < BGP::Message
56
56
  end
57
57
 
58
58
  def initialize(*args, &block)
59
+ @msg_type=UPDATE
59
60
  @nlri, @path_attribute, @withdrawn=nil,nil,nil
60
61
  @session_info = Info.new
61
62
  if args[0].is_a?(String) and args[0].is_packed?
@@ -66,6 +67,10 @@ class BGP::Update < BGP::Message
66
67
  end
67
68
  elsif args[0].is_a?(self.class)
68
69
  parse(args[0].encode, *args[1..-1])
70
+ elsif args[0].is_a?(Hash)
71
+ @withdrawn = Withdrawn.new(*args[0][:withdrawns]) if args[0].has_key?(:withdrawns)
72
+ @path_attribute = Path_attribute.new(args[0][:path_attributes]) if args[0].has_key?(:path_attributes)
73
+ @nlri = Nlri.new(*args[0][:nlris]) if args[0].has_key?(:nlris)
69
74
  else
70
75
  @msg_type=UPDATE
71
76
  set(*args)
@@ -86,7 +86,7 @@ module BGP
86
86
  end
87
87
 
88
88
  def to_hash
89
- {:asn=> asn, :address=> address}
89
+ {:aggregator=> {:asn=> asn, :address=> address}}
90
90
  end
91
91
 
92
92
  end
@@ -24,7 +24,7 @@ module BGP
24
24
  end
25
25
 
26
26
  def to_hash
27
- {:metric=> to_i}
27
+ {:aigp=> to_i}
28
28
  end
29
29
 
30
30
  def accumulated_igp_metric
@@ -51,8 +51,8 @@ module BGP
51
51
  class Aigp
52
52
  class << self
53
53
  def new_hash(_arg={})
54
- arg = {:metric=>0}.merge(_arg)
55
- new arg[:metric]
54
+ arg = {:aigp=>0}.merge(_arg)
55
+ new arg[:aigp]
56
56
  end
57
57
  end
58
58
  end
@@ -188,7 +188,7 @@ module BGP
188
188
  attr_reader :type
189
189
 
190
190
  def <=>(o)
191
- 0
191
+ type <=> o.type
192
192
  end
193
193
 
194
194
  def method_missing(name, *args, &block)
@@ -1,5 +1,6 @@
1
1
  %w{
2
- origin next_hop
2
+ origin
3
+ next_hop
3
4
  local_pref
4
5
  multi_exit_disc
5
6
  as_path
@@ -11,6 +12,7 @@
11
12
  mp_reach
12
13
  mp_unreach
13
14
  extended_communities
15
+ originator_id
14
16
  path_attribute
15
17
  aigp
16
18
  }.each do |attr|
@@ -55,6 +55,8 @@ module BGP
55
55
  parse(args[0])
56
56
  elsif args[0].is_a?(self.class)
57
57
  parse(args[0].encode, *args[1..-1])
58
+ elsif args[0].is_a?(Hash)
59
+ add *args[0][:cluster_list]
58
60
  else
59
61
  add(*args)
60
62
  end
@@ -102,7 +104,7 @@ module BGP
102
104
  end
103
105
 
104
106
  def to_hash
105
- {:cluster_ids=>@cluster_ids.collect { |c| c.to_s }}
107
+ {:cluster_list=>@cluster_ids.collect { |c| c.to_s }}
106
108
  end
107
109
 
108
110
  def sort!
@@ -116,25 +118,6 @@ module BGP
116
118
 
117
119
  end
118
120
 
119
- class Cluster_list
120
- class << self
121
- def new_hash(arg={})
122
- o = new
123
- [:cluster_ids].each do |set_type|
124
- next unless arg.has_key? set_type
125
- case set_type
126
- when :cluster_ids
127
- o << arg[set_type]
128
- else
129
- raise
130
- end
131
- end
132
- o
133
-
134
- end
135
- end
136
- end
137
-
138
121
  end
139
122
 
140
123
  load "../../test/unit/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
@@ -29,20 +29,24 @@ module BGP
29
29
  class Extended_communities < Attr
30
30
 
31
31
  class << self
32
- def new_hash(arg={})
32
+ def new_hash(*args)
33
+ raise unless args[0].is_a?(Hash)
33
34
  o = new
34
- arg.keys.each do |comm|
35
- case comm
36
- when :color ; o << Color.new(*arg[comm])
37
- when :route_target ; o << Route_target.new(*arg[comm])
38
- when :link_bandwidth ; o << Link_bandwidth.new(*arg[comm])
39
- when :ospf_domain_id ; o << Ospf_domain_id.new(*arg[comm])
40
- when :encapsulation ; o << Encapsulation.new(*arg[comm])
41
- when :route_origin ; o << Route_origin.new(*arg[comm])
42
- when :ospf_router_id ; o << Ospf_router_id.new(arg[comm])
43
- else
44
- raise
45
- end
35
+ args.each do |arg|
36
+ arg.keys.each do |comm|
37
+ case comm
38
+ when :extended_communities ; o = new_hash *args[0][:extended_communities]
39
+ when :color ; o << Color.new(*arg[comm])
40
+ when :route_target ; o << Route_target.new(*arg[comm])
41
+ when :link_bandwidth ; o << Link_bandwidth.new(*arg[comm])
42
+ when :ospf_domain_id ; o << Ospf_domain_id.new(*arg[comm])
43
+ when :encapsulation ; o << Encapsulation.new(*arg[comm])
44
+ when :route_origin ; o << Route_origin.new(*arg[comm])
45
+ when :ospf_router_id ; o << Ospf_router_id.new(*arg[comm])
46
+ else
47
+ raise
48
+ end
49
+ end
46
50
  end
47
51
  o
48
52
  end
@@ -55,11 +59,13 @@ module BGP
55
59
 
56
60
  if args[0].is_a?(String) and args[0].is_packed?
57
61
  parse(args[0])
62
+ return
58
63
  elsif args[0].is_a?(self.class)
59
64
  parse(args[0].encode, *args[1..-1])
60
65
  else
61
66
  add(*args)
62
67
  end
68
+ yield(self) if block_given?
63
69
  end
64
70
 
65
71
  def add(*args)
@@ -80,9 +86,7 @@ module BGP
80
86
  alias << add
81
87
 
82
88
  def to_hash
83
- h = {}
84
- @communities.each { |c| h = h.merge( { c.class.to_s.split('::').last.downcase.to_sym => c.instance_eval { value2 } }) }
85
- h
89
+ {:extended_communities=> @communities.collect { |c| c.to_hash }}
86
90
  end
87
91
 
88
92
  def extended_communities
@@ -94,6 +98,24 @@ module BGP
94
98
  s.join("\n")
95
99
  end
96
100
 
101
+ def find(klass)
102
+ communities.find { |c| c.is_a?(klass) }
103
+ end
104
+
105
+ %w{
106
+ color
107
+ route_target
108
+ link_bandwidth
109
+ ospf_domain_id
110
+ encapsulation
111
+ route_origin
112
+ ospf_router_id
113
+ }.each do |ecom|
114
+ define_method("#{ecom}") do
115
+ find(BGP.const_get(ecom.capitalize))
116
+ end
117
+ end
118
+
97
119
  def to_s(method=:default)
98
120
  super(extended_communities, method)
99
121
  end
@@ -47,8 +47,7 @@ module BGP
47
47
  FLOAT = -1
48
48
 
49
49
  DEFAULT_OPAQUE_ENCODING = 'H12'
50
-
51
-
50
+
52
51
  def encode
53
52
  [@type, @subtype, _encoded_value_].pack('CCa6')
54
53
  end
@@ -128,6 +127,10 @@ module BGP
128
127
  def to_s
129
128
  "#{name}: #{value}"
130
129
  end
130
+
131
+ def to_hash
132
+ { self.class.to_s.split('::').last.downcase.to_sym => value2 }
133
+ end
131
134
 
132
135
  private
133
136
 
@@ -75,7 +75,7 @@ module BGP
75
75
  end
76
76
 
77
77
  def to_hash
78
- {:multi_exit_disc=>to_i}
78
+ {:med=>to_i}
79
79
  end
80
80
 
81
81
  private
@@ -32,7 +32,7 @@ module BGP
32
32
 
33
33
  class << self
34
34
  def new_hash(arg={})
35
- new arg[:origin_id]
35
+ new arg[:originator_id]
36
36
  end
37
37
  end
38
38
 
@@ -69,7 +69,7 @@ module BGP
69
69
  end
70
70
 
71
71
  def to_hash
72
- {:origin_id=> originator_id}
72
+ {:originator_id=> originator_id}
73
73
  end
74
74
 
75
75
  def originator_id=(val)
@@ -35,6 +35,7 @@ module BGP
35
35
  @attributes=[]
36
36
  while s.size>0
37
37
  @attributes << Attr.factory(*args)
38
+ @attributes
38
39
  end
39
40
  elsif args.size ==1 and args[0].is_a?(Hash)
40
41
  @attributes = []
@@ -48,13 +49,15 @@ module BGP
48
49
  when :as_path ; As_path.new_hash(args[0][attr])
49
50
  when :as4_path ; As4_path.new_hash(args[0][attr])
50
51
  when :origin ; Origin.new(args[0][attr])
52
+ when :originator_id ; Originator_id.new(args[0][attr])
51
53
  when :cluster_list ; Cluster_list.new(*args[0][attr])
52
54
  when :aggregator ; Aggregator.new(args[0][attr])
53
55
  when :as4_aggregator ; As4_aggregator.new(args[0][attr])
54
56
  when :originator_id ; Originator_id.new(args[0][attr])
55
57
  when :communities, :community; Communities.new(args[0][attr])
58
+ when :aigp ; Aigp.new(args[0][attr])
56
59
  when :extended_communities, :extended_community
57
- Extended_communities.new_hash(args[0][attr])
60
+ Extended_communities.new_hash(*args[0][attr])
58
61
  when :atomic_aggregate ; Atomic_aggregate.new
59
62
  # FIXME: add other attr here ...
60
63
  else
@@ -192,7 +195,21 @@ module BGP
192
195
  self
193
196
  end
194
197
 
195
- def delete(*klasses)
198
+ def sort
199
+ attributes.sort { |a,b| a.type <=> b.type }
200
+ Path_attribute.new(*attributes.sort { |a,b| a.type <=> b.type })
201
+ end
202
+
203
+ def sort!
204
+ attributes.sort! { |a,b| a.type <=> b.type }
205
+ self
206
+ end
207
+
208
+ def <=>(other)
209
+ self.sort.to_shex <=> other.sort.to_shex
210
+ end
211
+
212
+ def delete(*klasses)
196
213
  for klass in klasses
197
214
  next unless klass.is_a?(Class)
198
215
  attributes.delete_if { |x| x.class == klass }
@@ -214,10 +231,14 @@ module BGP
214
231
  mp_reach
215
232
  mp_unreach
216
233
  extended_communities
217
- }.each do |attr|
234
+ }.each do |attr|
218
235
  define_method("has_a_#{attr}_attr?") do
219
236
  has? BGP.const_get(attr.capitalize)
220
237
  end
238
+ define_method("#{attr}") do
239
+ k = BGP.const_get(attr.capitalize)
240
+ @attributes.find { |a| a.is_a?(k) }
241
+ end
221
242
  eval "alias :has_an_#{attr}? :has_a_#{attr}_attr?" if (attr =~ /^[aeiou]/)
222
243
  end
223
244
 
@@ -237,6 +258,11 @@ module BGP
237
258
  when :communities, :community ; Communities
238
259
  end
239
260
  end
261
+
262
+ def method_missing(name, *args, &block)
263
+ super
264
+ end
265
+
240
266
  end
241
267
  end
242
268
 
@@ -318,39 +344,6 @@ module BGP
318
344
  Unknown.new(s)
319
345
  end
320
346
  end
321
-
322
- # def self.new_hash(_arg={:arg=>nil})
323
- # #FIXME:
324
- #
325
- # arg = _arg.delete(:arg)
326
- #
327
- # if arg.is_a?(Neighbor::Capabilities)
328
- # as4byte_flag = arg.as4byte?
329
- # path_id_flag = arg
330
- # elsif arg.is_a?(Hash)
331
- # as4byte_flag=arg[:as4byte]
332
- # path_id_flag=arg[:path_id]
333
- # elsif arg.is_a?(TrueClass)
334
- # as4byte_flag=true
335
- # path_id_flag=nil
336
- # elsif arg.respond_to? :as4byte?
337
- # as4byte_flag = arg.as4byte?
338
- # path_id_flag = arg
339
- # else
340
- # as4byte_flag=nil
341
- # path_id_flag=nil
342
- # end
343
- #
344
- # _arg.keys.each { |attr|
345
- # case attr
346
- # when :local_pref ; Local_pref.new(_arg[attr])
347
- # when :next_hop ; Next_hop.new(_arg[attr])
348
- # else
349
- # end
350
- # }
351
- # end
352
-
353
-
354
347
 
355
348
  end
356
349
 
@@ -360,9 +353,7 @@ module BGP
360
353
  #
361
354
  # p = Path_attribute.new :local_pref=>100, :next_hop => '10.0.0.1', :med=>300
362
355
  # # p p
363
- # puts p
364
-
365
-
356
+ # puts p
366
357
 
367
358
  end
368
359
  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.13"
8
+ s.version = "0.0.15"
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 = "2011-10-27"
12
+ s.date = "2012-02-13"
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 = [
@@ -57,6 +57,7 @@ Gem::Specification.new do |s|
57
57
  "bgp/orfs/orf.rb",
58
58
  "bgp/orfs/prefix_orf.rb",
59
59
  "bgp/path_attributes/aggregator.rb",
60
+ "bgp/path_attributes/aigp.rb",
60
61
  "bgp/path_attributes/as_path.rb",
61
62
  "bgp/path_attributes/atomic_aggregate.rb",
62
63
  "bgp/path_attributes/attribute.rb",
@@ -79,8 +80,6 @@ Gem::Specification.new do |s|
79
80
  "examples/routegen",
80
81
  "examples/routegen.yml",
81
82
  "examples/simple.rb",
82
- "examples/test.rb",
83
- "examples/test2.rb",
84
83
  "examples/unit-testing/malformed_update_test.rb",
85
84
  "examples/unit-testing/no_export_test.rb",
86
85
  "examples/unit-testing/prepend_aspath_test.rb",
@@ -108,6 +107,7 @@ Gem::Specification.new do |s|
108
107
  "test/unit/nlris/nsap_test.rb",
109
108
  "test/unit/nlris/prefix_test.rb",
110
109
  "test/unit/nlris/rd_test.rb",
110
+ "test/unit/nlris/vpn_test.rb",
111
111
  "test/unit/optional_parameters/add_path_test.rb",
112
112
  "test/unit/optional_parameters/as4_test.rb",
113
113
  "test/unit/optional_parameters/capability_test.rb",
@@ -119,7 +119,7 @@ Gem::Specification.new do |s|
119
119
  "test/unit/optional_parameters/route_refresh_test.rb",
120
120
  "test/unit/orfs/prefix_orf_test.rb",
121
121
  "test/unit/path_attributes/aggregator_test.rb",
122
- "test/unit/path_attributes/aigp.rb",
122
+ "test/unit/path_attributes/aigp_test.rb",
123
123
  "test/unit/path_attributes/as_path_test.rb",
124
124
  "test/unit/path_attributes/atomic_aggregate_test.rb",
125
125
  "test/unit/path_attributes/attribute_test.rb",
@@ -134,15 +134,16 @@ Gem::Specification.new do |s|
134
134
  "test/unit/path_attributes/next_hop_test.rb",
135
135
  "test/unit/path_attributes/origin_test.rb",
136
136
  "test/unit/path_attributes/originator_id_test.rb",
137
- "test/unit/path_attributes/path_attribute_test.rb"
137
+ "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"
138
139
  ]
139
140
  s.homepage = "http://github.com/jesnault/bgp4r/tree/master"
140
141
  s.require_paths = ["."]
141
142
  s.required_ruby_version = Gem::Requirement.new(">= 1.8.6")
142
143
  s.rubyforge_project = "bgp4r"
143
- s.rubygems_version = "1.8.10"
144
+ s.rubygems_version = "1.8.11"
144
145
  s.summary = "A BGP-4 Ruby Library"
145
- 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/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.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"]
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"]
146
147
 
147
148
  if s.respond_to? :specification_version then
148
149
  s.specification_version = 3
@@ -51,12 +51,12 @@ class Update_Test < Test::Unit::TestCase
51
51
  :path_attributes=> {
52
52
  :origin=>:incomplete,
53
53
  :as_path=>{},
54
- :multi_exit_disc=>0,
54
+ :med=>0,
55
55
  :local_pref=>100,
56
56
  :communities=>["10283:20103"],
57
- :route_target=>[10283, 30000],
58
- :cluster_ids=>["0.0.0.1"],
59
- :origin_id=>"81.52.17.128",
57
+ :extended_communities=>[{:route_target=>[10283, 30000]}],
58
+ :cluster_list=>["0.0.0.1"],
59
+ :originator_id=>"81.52.17.128",
60
60
  :mp_reach=> {
61
61
  :safi=>128,
62
62
  :afi=>1,
@@ -66,8 +66,15 @@ class Update_Test < Test::Unit::TestCase
66
66
  }
67
67
  }
68
68
 
69
+ assert_equal(h[:path_attributes][:originator_id], m.to_hash[:path_attributes][:originator_id])
70
+ assert_equal(h[:path_attributes][:as_path], m.to_hash[:path_attributes][:as_path])
71
+ assert_equal(h[:path_attributes][:multi_exit_disc], m.to_hash[:path_attributes][:multi_exit_disc])
72
+ assert_equal(h[:path_attributes][:local_pref], m.to_hash[:path_attributes][:local_pref])
73
+ assert_equal(h[:path_attributes][:originator_id], m.to_hash[:path_attributes][:originator_id])
74
+ assert_equal(h[:path_attributes][:mp_unreach], m.to_hash[:path_attributes][:mp_unreach])
75
+ assert_equal(h[:path_attributes], m.to_hash[:path_attributes])
69
76
  assert_equal(h, m.to_hash)
70
-
77
+
71
78
  s = 'ffffffffffffffffffffffffffffffff0050020000002f40010101400304c0a80105800404000000644005040000006440020402010064c0080c051f00010137003b0af50040200a0a0a0a2020202020'
72
79
  m = Message.factory([s].pack('H*'))
73
80
  assert_equal(Update, m.class)
@@ -132,6 +139,20 @@ class Update_Test < Test::Unit::TestCase
132
139
  assert_equal 2, an_update.nlri.size
133
140
  an_update << Nlri.new('21.0.0.0/11', '22.0.0.0/22')
134
141
  assert_equal 4, an_update.nlri.size
142
+
143
+ h = {
144
+ :path_attributes=> {
145
+ :multi_exit_disc=>100,
146
+ :local_pref=>113,
147
+ :next_hop=>"10.0.0.1",
148
+ :origin=>:egp
149
+ },
150
+ :nlris=> ["77.0.0.0/17", "88.0.0.0/18", "21.0.0.0/11", "22.0.0.0/22"]
151
+ }
152
+
153
+ upd = Update.new h
154
+ assert_equal(0, an_update.path_attribute <=> upd.path_attribute)
155
+
135
156
  end
136
157
 
137
158
  def test_factory_to_build_update_with_session_info
@@ -237,7 +258,7 @@ class Update_Test < Test::Unit::TestCase
237
258
  h = {
238
259
  :path_attributes=>{
239
260
  :as_path=>{:sequence=>[100]},
240
- :multi_exit_disc=>20,
261
+ :med=>20,
241
262
  :mp_reach=>{
242
263
  :nexthop=>["10.0.0.1"],
243
264
  :safi=>128,
@@ -307,7 +328,7 @@ class Update_Test < Test::Unit::TestCase
307
328
  h = {
308
329
  :path_attributes=>{
309
330
  :as_path=>{},
310
- :multi_exit_disc=>0,
331
+ :med=>0,
311
332
  :mp_reach=>{
312
333
  :nexthop=>["1.1.1.1"],
313
334
  :safi=>128,
@@ -316,10 +337,14 @@ class Update_Test < Test::Unit::TestCase
316
337
  },
317
338
  :local_pref=>1,
318
339
  :origin=>:egp,
319
- :route_target=>[4, 1]
340
+ :extended_communities=>[{:route_target=>[4, 1] }]
320
341
  }
321
342
  }
322
343
  assert_equal(h, upd.to_hash)
344
+ assert_equal(BGP::Route_target, upd.path_attribute.extended_communities.route_target.class)
345
+ assert_equal(BGP::Route_target, upd.path_attribute.extended_communities.route_target.to_s)
346
+ assert_equal(128, upd.path_attribute.mp_reach.safi)
347
+ assert_equal('Label Stack=16000 (bottom) RD=19:17, ID=1, IPv4=10.1.1.0/24', upd.path_attribute.mp_reach.nlris[0].to_s)
323
348
  end
324
349
 
325
350
  def test_factory_to_build_a_withdrawn_update_for_inet_mpls_vpn_unicast_with_path_id
@@ -342,6 +367,102 @@ class Update_Test < Test::Unit::TestCase
342
367
  }
343
368
  }
344
369
  assert_equal(h, upd.to_hash)
370
+ upd2 = Update.new upd.to_hash
371
+ assert_equal(upd2.to_shex, upd.to_shex)
345
372
  end
373
+
374
+ def test_to_hash
375
+ h = {:nlris=>
376
+ ["59.88.128.0/18",
377
+ "59.88.192.0/18",
378
+ "59.89.0.0/18",
379
+ "59.89.192.0/18",
380
+ "59.90.0.0/18",
381
+ "59.90.64.0/18",
382
+ "59.90.128.0/18",
383
+ "59.90.192.0/18",
384
+ "59.91.192.0/18",
385
+ "59.93.128.0/18",
386
+ "59.93.192.0/18",
387
+ "59.94.0.0/18",
388
+ "59.94.64.0/18",
389
+ "59.94.128.0/18",
390
+ "59.94.192.0/18",
391
+ "59.95.0.0/18",
392
+ "59.95.128.0/18",
393
+ "59.96.128.0/18",
394
+ "59.96.192.0/18",
395
+ "59.97.128.0/18",
396
+ "59.97.192.0/18",
397
+ "59.98.192.0/18",
398
+ "59.99.0.0/18",
399
+ "59.99.64.0/18",
400
+ "117.197.0.0/18",
401
+ "117.197.64.0/18",
402
+ "117.197.128.0/18",
403
+ "117.198.128.0/18",
404
+ "117.198.192.0/18",
405
+ "117.199.64.0/18",
406
+ "117.199.128.0/18",
407
+ "117.199.192.0/18",
408
+ "117.200.0.0/18",
409
+ "117.200.64.0/18",
410
+ "117.201.0.0/18",
411
+ "117.201.64.0/18",
412
+ "117.202.192.0/18",
413
+ "117.203.0.0/18",
414
+ "117.203.128.0/18",
415
+ "117.203.192.0/18",
416
+ "117.205.0.0/18",
417
+ "117.205.64.0/18",
418
+ "117.205.192.0/18",
419
+ "117.206.128.0/18",
420
+ "117.206.192.0/18",
421
+ "117.207.0.0/18",
422
+ "117.207.128.0/18",
423
+ "117.209.192.0/18",
424
+ "117.210.0.0/18",
425
+ "117.210.64.0/18",
426
+ "117.210.128.0/18",
427
+ "117.210.192.0/18",
428
+ "117.212.0.0/18",
429
+ "117.212.64.0/18",
430
+ "117.214.0.0/18",
431
+ "117.214.128.0/18",
432
+ "117.214.192.0/18",
433
+ "117.218.0.0/18",
434
+ "117.239.0.0/18",
435
+ "117.239.64.0/18",
436
+ "117.239.128.0/18",
437
+ "117.239.192.0/18",
438
+ "117.241.0.0/18",
439
+ "117.241.64.0/18",
440
+ "117.241.128.0/18",
441
+ "117.241.192.0/18",
442
+ "117.242.0.0/18",
443
+ "117.242.64.0/18",
444
+ "117.242.128.0/18",
445
+ "117.242.192.0/18",
446
+ "210.212.0.0/18",
447
+ "210.212.64.0/18",
448
+ "210.212.128.0/18",
449
+ "210.212.192.0/18",
450
+ "218.248.0.0/18",
451
+ "218.248.128.0/18"],
452
+ :path_attributes=> {
453
+ :communities=>["28289:65500"],
454
+ :origin=>:igp,
455
+ :as_path=>{:sequence=>[28289, 53131, 16735, 3549, 9829, 9829, 9829]},
456
+ :next_hop=>"187.121.193.33"
457
+ }
458
+ }
459
+ u = Update.new h
460
+ assert_equal(h, u.to_hash)
461
+
462
+ # s = "ffffffffffffffffffffffffffffffff016c02000000254001010040021002076e81cf8b415f0ddd266526652665400304bb79c121c008046e81ffdc123b5880123b58c0123b5900123b59c0123b5a00123b5a40123b5a80123b5ac0123b5bc0123b5d80123b5dc0123b5e00123b5e40123b5e80123b5ec0123b5f00123b5f80123b6080123b60c0123b6180123b61c0123b62c0123b6300123b63401275c5001275c5401275c5801275c6801275c6c01275c7401275c7801275c7c01275c8001275c8401275c9001275c9401275cac01275cb001275cb801275cbc01275cd001275cd401275cdc01275ce801275cec01275cf001275cf801275d1c01275d2001275d2401275d2801275d2c01275d4001275d4401275d6001275d6801275d6c01275da001275ef001275ef401275ef801275efc01275f1001275f1401275f1801275f1c01275f2001275f2401275f2801275f2c012d2d40012d2d44012d2d48012d2d4c012daf80012daf880"
463
+ # assert_equal(s, u.to_shex)
464
+ end
465
+
466
+
346
467
 
347
468
  end
@@ -67,6 +67,6 @@ class Aggregator_Test < Test::Unit::TestCase
67
67
  ag1 = Aggregator.new('10.0.0.1', 100)
68
68
  ag2 = Aggregator.new :asn=> 100, :address=> '10.0.0.1'
69
69
  assert_equal(ag1.encode,ag2.encode)
70
- assert_equal({:asn=>100, :address=>"10.0.0.1"}, ag2.to_hash)
70
+ assert_equal({:asn=>100, :address=>"10.0.0.1"}, ag2.to_hash[:aggregator])
71
71
  end
72
72
  end
@@ -19,11 +19,11 @@ class TestAigp < Test::Unit::TestCase
19
19
  end
20
20
  def test_2
21
21
  assert Aigp.new_hash
22
- assert Aigp.new_hash :metric=> 0x1f2f3f4f5f6f7f8f
22
+ assert Aigp.new_hash :aigp=> 0x1f2f3f4f5f6f7f8f
23
23
  m1 = Aigp.new 0x1f2f3f4f5f6f7f8f
24
- m2 = Aigp.new_hash :metric=> 0x1f2f3f4f5f6f7f8f
24
+ m2 = Aigp.new_hash :aigp=> 0x1f2f3f4f5f6f7f8f
25
25
  assert_equal(m1.encode, m2.encode)
26
- assert_equal({:metric=>2247084349217275791}, m2.to_hash)
26
+ assert_equal({:aigp=>2247084349217275791}, m2.to_hash)
27
27
  end
28
28
  end
29
29
 
@@ -38,7 +38,7 @@ class Cluster_list_Test < Test::Unit::TestCase
38
38
  end
39
39
  def test_2
40
40
  cids = ['1.1.1.1', '2.2.2.2', '3.3.3.3']
41
- clist1 = Cluster_list.new_hash :cluster_ids=> cids
42
- assert_equal( cids, clist1.to_hash[:cluster_ids])
41
+ clist1 = Cluster_list.new :cluster_list=> cids
42
+ assert_equal( cids, clist1.to_hash[:cluster_list])
43
43
  end
44
44
  end
@@ -67,7 +67,10 @@ class Extended_communitiesTest < Test::Unit::TestCase
67
67
  ec2 = Extended_communities.new_hash(ec.to_hash)
68
68
  assert_equal(ec.to_hash, Extended_communities.new_hash(ec.to_hash).to_hash)
69
69
  ec = Extended_communities.new_hash :color => 100, :link_bandwidth => 999_999_999, :route_origin => ['10.0.1.2', 10], :encapsulation => :ipip
70
- assert_equal(100, ec.to_hash[:color])
70
+ assert_equal(ec.to_hash, Extended_communities.new_hash(ec.to_hash).to_hash)
71
+ assert_equal({:color=>100}, ec.color.to_hash)
72
+ ec = Extended_communities.new_hash :extended_communities=>[{:route_target=>[13111, 26054]}]
73
+ assert_equal({:extended_communities=>[{:route_target=>[13111, 26054]}]}, ec.to_hash)
71
74
  end
72
75
  def test_sort
73
76
  ec = Extended_communities.new
@@ -137,7 +140,28 @@ class Extended_communitiesTest < Test::Unit::TestCase
137
140
  assert_equal(0, ec <=> ec2)
138
141
  assert(! ec.eql?(ec2))
139
142
  end
143
+ def test_getters
144
+ ec = Extended_communities.new do |c|
145
+ c.add(Color.new(100))
146
+ c.add(Link_bandwidth.new(999_999_999))
147
+ c.add(Route_target.new('10.0.1.2',10))
148
+ c.add(Ospf_domain_id.new('9.1.0.1'))
149
+ c.add(Route_target.new('11.0.1.1',10))
150
+ c.add(Route_target.new('8.0.1.1',10))
151
+ c.add(Route_target.new('7.0.1.1',8))
152
+ c.add(Encapsulation.new(:l2tpv3))
153
+ c.add(Ospf_domain_id.new('20.0.0.1'))
154
+ c.add(Route_origin.new('10.0.3.2',9))
155
+ c.add(Route_target.new('10.0.3.2',7))
156
+ c.add(Ospf_router_id.new('10.0.0.1'))
157
+ end
158
+ assert_equal('Color: 100',ec.color.to_s)
159
+ assert_equal('Route target: 10.0.1.2:10',ec.route_target.to_s)
160
+ assert_equal('Ospf domain id: 9.1.0.1:0',ec.ospf_domain_id.to_s)
161
+ assert_equal('Encapsulation: 1',ec.encapsulation.to_s)
162
+ assert_equal('Ospf router id: 10.0.0.1:0',ec.ospf_router_id.to_s)
163
+ assert_equal('Link bandwidth: 1000000000.0',ec.link_bandwidth.to_s)
164
+ assert_equal('Route origin: 10.0.3.2:9',ec.route_origin.to_s)
165
+ end
140
166
 
141
167
  end
142
-
143
- #MiniTest::Unit.autorun
@@ -180,7 +180,7 @@ class Path_attribute_Test < Test::Unit::TestCase # :nodoc:
180
180
  :as_path=> {:set=> [1,2], :sequence=>[3,4], :confed_sequence=>[5,6], :confed_set=>[7,8]},
181
181
  :cluster_list=> ['1.1.1.1', '2.2.2.2', '3.3.3.3'],
182
182
  :communities=> ["145:30", "145:40", "145:50", "145:60", :no_export, :no_advertise,],
183
- :extended_communities=> { :color => 100, :link_bandwidth => 999_999_999, :route_origin => ['10.0.1.2', 10], :encapsulation => :ipip },
183
+ :extended_communities=> [ :color => 100, :link_bandwidth => 999_999_999, :route_origin => ['10.0.1.2', 10], :encapsulation => :ipip ],
184
184
  :aggregator=> { :address=>'1.1.1.1', :asn=>100 },
185
185
  :originator_id=> '2.2.2.2',
186
186
  :as4_aggregator=> { :asn=> 200, :address=> '4.4.4.4' },
@@ -204,6 +204,31 @@ class Path_attribute_Test < Test::Unit::TestCase # :nodoc:
204
204
 
205
205
  end
206
206
 
207
+ def test_9
208
+ pa1 = Path_attribute.new { |p|
209
+ p << Multi_exit_disc.new(222)
210
+ p << Next_hop.new('1.1.1.1')
211
+ p << Local_pref.new(333)
212
+ p << As_path.new( :set=> [1,2,3,4], :sequence=> [11,12,13])
213
+ p << Origin.new(1)
214
+ }
215
+ pa2 = Path_attribute.new { |p|
216
+ p << Next_hop.new('1.1.1.1')
217
+ p << Origin.new(1)
218
+ p << Local_pref.new(333)
219
+ p << As_path.new(:sequence=> [11,12,14], :set=> [1,2,3,4])
220
+ p << Multi_exit_disc.new(222)
221
+ }
222
+ assert_not_equal(pa1.to_shex,pa2.to_shex)
223
+ assert_equal(pa1.sort.to_shex, pa2.sort.to_shex)
224
+ assert_equal(0, pa1 <=> pa2)
225
+ pa1.add(Communities.new("1:1"))
226
+ assert_equal(1, pa1 <=> pa2)
227
+ pa2.insert(Communities.new("1:1"))
228
+ assert_equal(0, pa1 <=> pa2)
229
+ end
230
+
231
+
207
232
  def test_path_attribute_path_id_true_and_as4byte_false
208
233
  path_attr = Path_attribute.new
209
234
  path_attr.insert(
@@ -223,6 +248,63 @@ class Path_attribute_Test < Test::Unit::TestCase # :nodoc:
223
248
  # TODO: UT: a path attr with mp_unreach w path_id
224
249
  # TODO: UT: a path attr with mp_reach w path_id and as4
225
250
 
226
- end
251
+ end
227
252
 
253
+ def test_hash
254
+
255
+ h = {
256
+ :aigp=> 0x1f2f3f4f5f6f7f8f,
257
+ :aggregator=>{:asn=>100, :address=>"10.0.0.1"},
258
+ :cluster_list=>["1.0.1.1"],
259
+ :as_path=>{},
260
+ :communities=>["1133:2015"],
261
+ :local_pref=>113,
262
+ :origin=>:incomplete,
263
+ :med=>10,
264
+ :extended_communities=>[{:route_target=>[13111, 26054]}],
265
+ :originator_id=>"196.168.28.123",
266
+ :mp_reach=>{
267
+ :nexthop=>["10.0.0.2"], :afi=>1, :safi=>128,
268
+ :nlris=>[
269
+ {:label=>2226, :prefix=>"172.23.21.113/32", :rd=>[1311, 4567814]},
270
+ {:label=>2151, :prefix=>"10.48.9.175/32", :rd=>[1311, 32117824]},
271
+ {:label=>3382, :prefix=>"172.33.169.92/32", :rd=>[1311, 80037224]},
272
+ {:label=>1452, :prefix=>"10.46.52.31/32", :rd=>[1311, 3117824]},
273
+ {:label=>3785, :prefix=>"172.41.96.104/32", :rd=>[1311, 45657424]},
274
+ {:label=>5228, :prefix=>"10.46.53.69/32", :rd=>[1311, 59407624]},
275
+ {:label=>5141, :prefix=>"172.21.55.36/32", :rd=>[1311, 321617824]},
276
+ {:label=>3724, :prefix=>"10.99.25.81/32", :rd=>[1311, 311197824]},
277
+ {:label=>2281, :prefix=>"10.35.9.169/32", :rd=>[1311, 321147824]},
278
+ {:label=>4615, :prefix=>"10.65.128.200/32", :rd=>[1311, 6627884]},
279
+ {:label=>3404, :prefix=>"172.29.96.8/32", :rd=>[1311, 45657824]},
280
+ {:label=>3767, :prefix=>"10.32.19.165/32", :rd=>[1311, 44657824]},
281
+ {:label=>3451, :prefix=>"10.14.186.28/32", :rd=>[1311, 45657824]},
282
+ {:label=>3027, :prefix=>"10.95.176.91/32", :rd=>[1311, 371197824]},
283
+ {:label=>5034, :prefix=>"10.24.176.99/32", :rd=>[1311, 321197824]},
284
+ {:label=>3565, :prefix=>"10.72.83.239/32", :rd=>[1311, 311197824]},
285
+ {:label=>3551, :prefix=>"10.45.142.161/32", :rd=>[1311, 321157824]},
286
+ {:label=>5238, :prefix=>"10.32.83.219/32", :rd=>[1311, 351177824]},
287
+ {:label=>5223, :prefix=>"10.13.142.117/32", :rd=>[1311, 321197824]},
288
+ {:label=>3360, :prefix=>"172.50.34.141/32", :rd=>[1311, 348987824]},
289
+ {:label=>3579, :prefix=>"10.26.42.36/32", :rd=>[1311, 325697824]},
290
+ {:label=>4118, :prefix=>"10.76.42.34/32", :rd=>[1311, 347517824]},
291
+ {:label=>3971, :prefix=>"172.21.192.24/32", :rd=>[1311, 86627824]},
292
+ {:label=>4223, :prefix=>"10.12.209.131/32", :rd=>[1311, 42655824]},
293
+ {:label=>2241, :prefix=>"10.34.186.201/32", :rd=>[1311, 42656824]},
294
+ ],
295
+ }
296
+ }
297
+
298
+ assert_equal(h[:local_pref], Path_attribute.new(h).to_hash[:local_pref])
299
+ assert_equal(h[:as_path], Path_attribute.new(h).to_hash[:as_path])
300
+ assert_equal(h[:extended_communities], Path_attribute.new(h).to_hash[:extended_communities])
301
+ assert_equal(h[:communities], Path_attribute.new(h).to_hash[:communities])
302
+ assert_equal(h[:cluster_list], Path_attribute.new(h).to_hash[:cluster_list])
303
+ assert_equal(h[:aggregator], Path_attribute.new(h).to_hash[:aggregator])
304
+ assert_equal(h[:mp_reach], Path_attribute.new(h).to_hash[:mp_reach])
305
+ assert_equal(h, Path_attribute.new(h).to_hash)
306
+
307
+ end
308
+
228
309
  end
310
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bgp4r
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.14
4
+ version: 0.0.15
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-05 00:00:00.000000000Z
12
+ date: 2012-02-13 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: BGP4R is a BGP-4 ruby library to create, send, and receive BGP messages
15
15
  in an object oriented manner
@@ -77,15 +77,12 @@ files:
77
77
  - bgp/path_attributes/origin.rb
78
78
  - bgp/path_attributes/originator_id.rb
79
79
  - bgp/path_attributes/path_attribute.rb
80
- - bgp/path_attributes/tlvs/tlv.rb
81
80
  - bgp4r.gemspec
82
81
  - bgp4r.rb
83
82
  - examples/a_live_feed
84
83
  - examples/routegen
85
84
  - examples/routegen.yml
86
85
  - examples/simple.rb
87
- - examples/test.rb
88
- - examples/test2.rb
89
86
  - examples/unit-testing/malformed_update_test.rb
90
87
  - examples/unit-testing/no_export_test.rb
91
88
  - examples/unit-testing/prepend_aspath_test.rb
@@ -141,7 +138,6 @@ files:
141
138
  - test/unit/path_attributes/origin_test.rb
142
139
  - test/unit/path_attributes/originator_id_test.rb
143
140
  - test/unit/path_attributes/path_attribute_test.rb
144
- - test/unit/path_attributes/tlvs/tlv_test.rb
145
141
  - test/unit/path_attributes/tunnel_encapsulation_test (Jean-Michel's Laptop's conflicted
146
142
  copy 2011-11-02).rb
147
143
  homepage: http://github.com/jesnault/bgp4r/tree/master
@@ -164,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
164
160
  version: '0'
165
161
  requirements: []
166
162
  rubyforge_project: bgp4r
167
- rubygems_version: 1.8.10
163
+ rubygems_version: 1.8.11
168
164
  signing_key:
169
165
  specification_version: 3
170
166
  summary: A BGP-4 Ruby Library
@@ -220,6 +216,5 @@ test_files:
220
216
  - test/unit/path_attributes/origin_test.rb
221
217
  - test/unit/path_attributes/originator_id_test.rb
222
218
  - test/unit/path_attributes/path_attribute_test.rb
223
- - test/unit/path_attributes/tlvs/tlv_test.rb
224
219
  - test/unit/path_attributes/tunnel_encapsulation_test (Jean-Michel's Laptop's conflicted
225
220
  copy 2011-11-02).rb
@@ -1,18 +0,0 @@
1
- module BGP
2
- module TLV
3
- attr_accessor :tlv_type
4
- def encode(value)
5
- p 'IN ENCODE TLV'
6
- [@tlv_type, value.size, value].pack('nna*')
7
- end
8
- end
9
- module STLV
10
- attr_accessor :stlv_type
11
- def encode(value)
12
- [@stlv_type, value.size, value].pack('CCa*')
13
- end
14
- end
15
- end
16
-
17
- load "../../../test/unit/path_attributes/tlvs/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
18
-
data/examples/test.rb DELETED
@@ -1,15 +0,0 @@
1
- require 'bgp4r'
2
- include BGP
3
- Log.create
4
- n = Neighbor.new 4, 1, 180, '1.1.1.1','127.0.0.1', '127.0.0.1'
5
- # n.start :auto_retry => true
6
- n.start :port=> 8090
7
-
8
- sleep(200)
9
-
10
-
11
- __END__
12
-
13
-
14
- @c = Neighbor.new(4, 100, 180, '0.0.0.2', '127.0.0.1', '127.0.0.1')
15
- @c.add_cap add_path_cap2
data/examples/test2.rb DELETED
@@ -1,116 +0,0 @@
1
-
2
- require 'rubygems'
3
- require 'eventmachine'
4
- require 'bgp4r'
5
-
6
-
7
- include BGP
8
-
9
- pa = Path_attribute.new(
10
- Origin.new,
11
- Next_hop.new('10.0.0.1'),
12
- Local_pref.new(300),
13
- Communities.new('10:1 10:2 10:3'),
14
- As_path.new('100 200 300 400')
15
- )
16
-
17
- times = 133
18
- pack=13
19
- nlri = IPAddr.new '11.0.0.1/24'
20
-
21
- nlris = Nlri.new
22
-
23
- updates = Fiber.new do
24
- (1..times.to_i).each do |n|
25
- nlris << (nlri ^ n)
26
- next unless (n % pack) == 0 or (n == times)
27
- Fiber.yield Update.new(pa, nlris)
28
- nlris = Nlri.new
29
- end
30
- end
31
-
32
- p updates.resume
33
- p updates.resume
34
- p updates.resume
35
-
36
-
37
-
38
-
39
-
40
- __END__
41
-
42
-
43
- pa = Path_attribute.new(
44
- Origin.new(@origin),
45
- Next_hop.new(@nexthop),
46
- Local_pref.new(@local_pref),
47
- Communities.new(*(@communities.split.map { |com| com.to_i})),
48
- As_path.new(*(@as_path.split.map { |as| as.to_i}))
49
- )
50
-
51
-
52
- nlris = Nlri.new
53
- (1..@times.to_i).each do |n|
54
- nlris << (@nlri ^ n)
55
- next unless (n % @pack) == 0 or (n == @times)
56
- neighbor.send_message Update.new(pa, nlris)
57
- nlris = Nlri.new
58
- end
59
-
60
- words = Fiber.new do File.foreach("testfile") do |line|
61
- line.scan(/\w+/) do |word| Fiber.yield word.downcase
62
- end end
63
- end
64
- Prepared exclusively for Jean-Michel Esnault
65
- FIBERS 176
66
- counts = Hash.new(0) while word = words.resume
67
- counts[word] += 1
68
- end
69
-
70
-
71
-
72
-
73
- __END__
74
-
75
-
76
-
77
-
78
- Thread.abort_on_exception = true
79
-
80
- Log.create
81
-
82
- class Session
83
- def initialize
84
- end
85
- def start(arg={})
86
- options = {:duration=> 120, :as=> 1, :holdtime=> 180, :id=> '2.2.2.2', :peer=> '127.0.0.1'}.merge(arg)
87
-
88
- Thread.new do
89
- EM.run do
90
- @c = EM.connect(options[:peer], 8090,
91
- BGP::ConnectionHandler, 4,
92
- options[:as], options[:holdtime], options[:id], options[:peer])
93
- @c.add_observer(self)
94
- end
95
- end
96
- end
97
-
98
- def update(*args)
99
- end
100
-
101
- def stop
102
- EM.stop
103
- end
104
- end
105
-
106
- n = Session.new
107
- n.start :duration=> 120, :as=> 1, :holdtime=> 10, :id=> '2.2.2.2', :peer=> '127.0.0.1'
108
-
109
- p 'HERE ABOUT TO SLEEP'
110
- sleep(20)
111
- p $c
112
- p "ABOUT TO SHUT DOWN EM"
113
- n.stop
114
-
115
-
116
- __END__
@@ -1,33 +0,0 @@
1
- require "test/unit"
2
-
3
- require "bgp/path_attributes/tlvs/tlv"
4
- require 'bgp/path_attributes/attribute'
5
-
6
- module BGP
7
- class MyAttr < Attr
8
- include TLV
9
- include STLV
10
- def initialize(value)
11
- @flags, @type = OPTIONAL_NON_TRANSITIVE, 55
12
- @value = value
13
- @tlv_type=1
14
- @stlv_type=2
15
- end
16
- def encode
17
- super(@value)
18
- end
19
- end
20
- end
21
-
22
- class TestBgpPathAttributesTlvsTlv < Test::Unit::TestCase
23
- include BGP
24
- def test_1
25
- attr = MyAttr.new([0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef].pack('N*'))
26
- assert_equal('803716 0001 0012 02 10 deadbeef deadbeef deadbeef deadbeef'.split.join, attr.to_shex)
27
- assert_equal(2, attr.stlv_type)
28
- assert_equal(1, attr.tlv_type)
29
- end
30
- end
31
-
32
-
33
-