bgp4r 0.0.11 → 0.0.12
Sign up to get free protection for your applications and to get access to all the features.
- data/bgp/common.rb +14 -13
- data/bgp/iana.rb +26 -1
- data/bgp/messages/capability.rb +3 -2
- data/bgp/messages/message.rb +3 -2
- data/bgp/messages/open.rb +2 -1
- data/bgp/messages/update.rb +80 -30
- data/bgp/neighbor/add_path_cap.rb +125 -0
- data/bgp/{neighbor.rb → neighbor/neighbor.rb} +64 -68
- data/bgp/nlris/nlri.rb +289 -15
- data/bgp/nlris/prefix.rb +3 -2
- data/bgp/nlris/vpn.rb +1 -8
- data/bgp/optional_parameters/add_path.rb +160 -0
- data/bgp/optional_parameters/capabilities.rb +1 -0
- data/bgp/optional_parameters/capability.rb +6 -0
- data/bgp/optional_parameters/graceful_restart.rb +6 -6
- data/bgp/optional_parameters/optional_parameter.rb +1 -0
- data/bgp/path_attributes/as_path.rb +1 -1
- data/bgp/path_attributes/attribute.rb +12 -5
- data/bgp/path_attributes/mp_reach.rb +142 -96
- data/bgp/path_attributes/mp_unreach.rb +73 -20
- data/bgp/path_attributes/path_attribute.rb +28 -5
- data/bgp4r.gemspec +21 -6
- data/bgp4r.rb +1 -1
- data/examples/unit-testing/malformed_update.rb +2 -1
- data/examples/unit-testing/test.rb +82 -0
- data/examples/unit-testing/test1.rb +82 -0
- data/examples/unit-testing/test2.rb +44 -0
- data/test/common_test.rb +7 -0
- data/test/helpers/server.rb +20 -0
- data/test/iana_test.rb +43 -0
- data/test/messages/open_test.rb +7 -2
- data/test/messages/update_test.rb +133 -36
- data/test/neighbor/add_path_cap_test.rb +54 -0
- data/test/neighbor/neighbor_test.rb +161 -0
- data/test/nlris/ext_nlri_test.rb +25 -60
- data/test/nlris/nlri_test.rb +93 -115
- data/test/optional_parameters/add_path_test.rb +53 -0
- data/test/optional_parameters/capability_test.rb +10 -0
- data/test/optional_parameters/graceful_restart_test.rb +1 -0
- data/test/path_attributes/mp_reach_test.rb +206 -8
- data/test/path_attributes/mp_unreach_test.rb +113 -5
- data/test/path_attributes/path_attribute_test.rb +34 -2
- metadata +20 -7
- data/test/neighbor_test.rb +0 -62
@@ -26,36 +26,48 @@ require 'test/unit'
|
|
26
26
|
class Mp_unreach_Test < Test::Unit::TestCase
|
27
27
|
include BGP
|
28
28
|
def test_1
|
29
|
-
mpur = Mp_unreach.new(:safi=>1, :
|
29
|
+
mpur = Mp_unreach.new(:safi=>1, :nlris=>['10.0.0.0/16', '10.1.0.0/16'])
|
30
30
|
assert_raise(ArgumentError) { Mp_unreach.new }
|
31
31
|
end
|
32
32
|
|
33
33
|
def test_2
|
34
|
-
mpur = Mp_unreach.new(:safi=>2, :
|
34
|
+
mpur = Mp_unreach.new(:safi=>2, :nlris=>['192.168.1.0/24', '192.168.2.0/24'])
|
35
35
|
assert_equal('800f0b00010218c0a80118c0a802', mpur.to_shex)
|
36
36
|
|
37
|
-
mpur = Mp_unreach.new(:safi=>2, :
|
37
|
+
mpur = Mp_unreach.new(:safi=>2, :nlris=>['2007:1::/64', '2007:2::/64','2007:3::/64'])
|
38
38
|
assert_equal('800f1e000202402007000100000000402007000200000000402007000300000000', mpur.to_shex)
|
39
39
|
|
40
40
|
#mpur = Mp_unreach.new(:safi=>2, :prefix=>['2007:1::/64, 101', '2007:2::/64,102','2007:3::/64, 103'])
|
41
|
-
mpur = Mp_unreach.new(:safi=>4, :
|
41
|
+
mpur = Mp_unreach.new(:safi=>4, :nlris=> [
|
42
42
|
{:prefix=>'2007:1::/64', :label=> 101},
|
43
43
|
{:prefix=>'2007:2::/64', :label=> 102},
|
44
44
|
{:prefix=>'2007:3::/64', :label=> 103},])
|
45
|
+
|
46
|
+
|
45
47
|
assert_equal('800f27000204580006512007000100000000580006612007000200000000580006712007000300000000', mpur.to_shex)
|
46
48
|
assert_match(/^800f..000204/,mpur.to_shex)
|
47
49
|
assert_match(/58000651200700010000000058/,mpur.to_shex)
|
48
50
|
assert_match(/58000661200700020000000058/,mpur.to_shex)
|
49
51
|
assert_match(/580006712007000300000000$/,mpur.to_shex)
|
50
52
|
|
51
|
-
mpur = Mp_unreach.new(:safi=>128, :
|
53
|
+
mpur = Mp_unreach.new(:safi=>128, :nlris=> [
|
52
54
|
{:rd=> Rd.new(100,100), :prefix=> Prefix.new('192.168.1.0/24'), :label=>101},
|
53
55
|
{:rd=> Rd.new(100,100), :prefix=> Prefix.new('192.168.2.0/24'), :label=>102},
|
54
56
|
{:rd=> Rd.new(100,100), :prefix=> Prefix.new('192.168.3.0/24'), :label=>103},])
|
57
|
+
|
58
|
+
|
55
59
|
assert_match(/^800f..000180/,mpur.to_shex)
|
56
60
|
assert_equal("700006510000006400000064c0a801",mpur.nlris[0].to_shex)
|
57
61
|
assert_equal("700006610000006400000064c0a802",mpur.nlris[1].to_shex)
|
58
62
|
|
63
|
+
mpur = Mp_unreach.new(:safi=>128, :nlris=> [
|
64
|
+
{:rd=> Rd.new(100,100), :prefix=> '192.168.1.0/24', :label=>101},
|
65
|
+
{:rd=> Rd.new(100,100), :prefix=> '192.168.2.0/24', :label=>102},
|
66
|
+
{:rd=> Rd.new(100,100), :prefix=> '192.168.3.0/24', :label=>103},])
|
67
|
+
assert_match(/^800f..000180/,mpur.to_shex)
|
68
|
+
assert_equal("700006510000006400000064c0a801",mpur.nlris[0].to_shex)
|
69
|
+
assert_equal("700006610000006400000064c0a802",mpur.nlris[1].to_shex)
|
70
|
+
|
59
71
|
end
|
60
72
|
|
61
73
|
def test_3
|
@@ -64,4 +76,100 @@ class Mp_unreach_Test < Test::Unit::TestCase
|
|
64
76
|
assert_equal '800f03000102', Mp_unreach.new(:afi=>1, :safi=>2).to_shex
|
65
77
|
end
|
66
78
|
|
79
|
+
def test_afi_1
|
80
|
+
mpr1 = Mp_unreach.new(:safi=>1, :nlris=> '192.168.1.0/24')
|
81
|
+
mpr2 = Mp_unreach.new(:safi=>1, :nlris=> '192.168.1.0/24', :path_id=>100)
|
82
|
+
mpr3 = Mp_unreach.new(:safi=>2, :nlris=> ['192.168.1.0/24','192.168.2.0/24'])
|
83
|
+
mpr4 = Mp_unreach.new(:safi=>2, :nlris=> ['192.168.1.0/24','192.168.2.0/24'], :path_id=>100)
|
84
|
+
mpr5 = Mp_unreach.new(:safi=>1, :nlris=> [
|
85
|
+
{:prefix=> '192.168.1.0/24', :path_id=> 100},
|
86
|
+
{:prefix=> '192.168.2.0/24', :path_id=> 101},
|
87
|
+
{:prefix=> '192.168.2.0/24', :path_id=> 102},
|
88
|
+
])
|
89
|
+
|
90
|
+
|
91
|
+
#
|
92
|
+
# puts mpr1
|
93
|
+
# puts mpr2
|
94
|
+
# puts mpr3
|
95
|
+
# puts mpr4
|
96
|
+
# puts mpr5
|
97
|
+
#
|
98
|
+
assert_equal('800f0700010118c0a801', mpr1.to_shex)
|
99
|
+
assert_equal('800f0b0001010000006418c0a801', mpr2.to_shex)
|
100
|
+
assert_equal attr_len(mpr1)+4, attr_len(mpr2)
|
101
|
+
|
102
|
+
assert_equal('800f0b00010218c0a80118c0a802', mpr3.to_shex)
|
103
|
+
assert_equal('800f130001020000006418c0a8010000006418c0a802', mpr4.to_shex)
|
104
|
+
assert_equal attr_len(mpr3)+8, attr_len(mpr4)
|
105
|
+
|
106
|
+
assert_equal('800f1b0001010000006418c0a8010000006518c0a8020000006618c0a802', mpr5.to_shex)
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_safi_2_afi_2
|
111
|
+
unreach1 = Mp_unreach.new( :safi=>2, :nlris=> [
|
112
|
+
{:prefix=> '2007:1::/64'},
|
113
|
+
{:prefix=> '2007:2::/64'},
|
114
|
+
{:prefix=> '2007:3::/64'}
|
115
|
+
]
|
116
|
+
)
|
117
|
+
assert_equal(3, unreach1.nlris.size)
|
118
|
+
assert_equal(2,unreach1.afi)
|
119
|
+
assert_equal(2,unreach1.safi)
|
120
|
+
|
121
|
+
unreach2 = Mp_unreach.new( :safi=>2, :nlris=> [
|
122
|
+
{:prefix=> '2007:1::/64', :path_id=> 101},
|
123
|
+
{:prefix=> '2007:2::/64', :path_id=> 102},
|
124
|
+
{:prefix=> '2007:3::/64', :path_id=> 103}
|
125
|
+
]
|
126
|
+
)
|
127
|
+
|
128
|
+
s1 = '80 0f 1e 0002 02 40 2007000100000000 40 2007000200000000 40 2007000300000000'
|
129
|
+
s2 = '80 0f 2a 0002 02 00000065 40 2007000100000000 00000066 40 2007000200000000 00000067 40 2007000300000000'
|
130
|
+
assert_equal(s1.split.join,unreach1.to_shex)
|
131
|
+
assert_equal(s2.split.join,unreach2.to_shex)
|
132
|
+
|
133
|
+
assert_equal(s1.split.join, Mp_unreach.new(unreach1.encode).to_shex)
|
134
|
+
assert_equal(s2.split.join, Mp_unreach.new(unreach2.encode,true).to_shex)
|
135
|
+
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_safi_128
|
139
|
+
|
140
|
+
# ffff ffff ffff ffff ffff ffff ffff ffff
|
141
|
+
# 0031 0200 0000 1a
|
142
|
+
# 90 0f 0016 0001 80 00000001 70 800000 00000001000000010a0101
|
143
|
+
# 80 0f 12 0001 80 70 03e801 00000001000000010a0101
|
144
|
+
# 80 0f 16 0001 80 00000001 70 03e801 00000001000000010a0101
|
145
|
+
|
146
|
+
# Mp Reach (14), length: 9216, Flags [OE]:
|
147
|
+
# AFI IPv4 (1), SAFI Labeled VPN Unicast (128)
|
148
|
+
# nexthop: 1.1.1.1
|
149
|
+
# ID=1, Label Stack=16000 (bottom) RD=1:1, IPv4=10.1.1.0/24
|
150
|
+
# 0x0000: 0180 0c00 0000 0000 0000 0001 0101 0100
|
151
|
+
# 0x0001: 0000 0001 7003 e801 0000 0001 0000 0001
|
152
|
+
# 0x0002: 0a01 01
|
153
|
+
|
154
|
+
unreach1 = Mp_unreach.new( :safi=> 128, :nlris => [{:rd=> Rd.new(1,1), :prefix=> '10.1.1.0/24', :label=>16000},])
|
155
|
+
unreach2 = Mp_unreach.new( :safi=> 128, :nlris => [{:rd=> Rd.new(1,1), :prefix=> '10.1.1.0/24', :label=>16000, :path_id=> 1},])
|
156
|
+
|
157
|
+
assert_equal(16000, Label.new(['03e801'].pack('H*')).to_hash[:label])
|
158
|
+
assert_equal(524288, Label.new(['800000'].pack('H*')).to_hash[:label])
|
159
|
+
|
160
|
+
s1 = '80 0f 12 0001 80 70 03e801 000000010000000 10a0101'.split.join
|
161
|
+
s2 = '80 0f 16 0001 80 00000001 70 03e801 00000001000000010a0101'.split.join
|
162
|
+
assert_equal(s1, unreach1.to_shex)
|
163
|
+
assert_equal(s1, Mp_unreach.new(unreach1.encode).to_shex)
|
164
|
+
assert_equal(s2, unreach2.to_shex)
|
165
|
+
assert_equal(s2, Mp_unreach.new(unreach2.encode,true).to_shex)
|
166
|
+
|
167
|
+
end
|
168
|
+
|
169
|
+
private
|
170
|
+
|
171
|
+
def attr_len(attr)
|
172
|
+
attr.encode[2,1].unpack('C')[0]
|
173
|
+
end
|
174
|
+
|
67
175
|
end
|
@@ -22,6 +22,7 @@
|
|
22
22
|
|
23
23
|
require 'test/unit'
|
24
24
|
require 'bgp/path_attributes/path_attribute'
|
25
|
+
require 'bgp/path_attributes/attributes'
|
25
26
|
|
26
27
|
class Path_attribute_Test < Test::Unit::TestCase # :nodoc:
|
27
28
|
include BGP
|
@@ -141,5 +142,36 @@ class Path_attribute_Test < Test::Unit::TestCase # :nodoc:
|
|
141
142
|
assert @pa.has_a_local_pref_attr?
|
142
143
|
assert ! @pa.has_a_aggregator_attr?
|
143
144
|
assert ! @pa.has_a_mp_unreach_attr?
|
144
|
-
end
|
145
|
-
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_7
|
148
|
+
s = '800e1000010404ffffffff0030000651c0a800'
|
149
|
+
sbin = [s].pack('H*')
|
150
|
+
assert_equal(BGP::Mp_reach, Attr.factory(sbin, :path_id=>false).class)
|
151
|
+
s = '800e1400010404ffffffff000000006430000651c0a800'
|
152
|
+
sbin = [s].pack('H*')
|
153
|
+
assert_equal(BGP::Mp_reach, Attr.factory(sbin, :path_id=>true).class)
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_path_attribute_path_id_true_and_as4byte_false
|
157
|
+
path_attr = Path_attribute.new
|
158
|
+
path_attr.insert(
|
159
|
+
Origin.new,
|
160
|
+
As_path.new(100),
|
161
|
+
Mp_reach.new( :safi=>128, :nexthop=> ['10.0.0.1'], :path_id=> 100, :nlris=> [
|
162
|
+
{:rd=> [100,100], :prefix=> '192.168.0.0/24', :label=>101},
|
163
|
+
{:rd=> [100,100], :prefix=> '192.168.1.0/24', :label=>102},
|
164
|
+
{:rd=> [100,100], :prefix=> '192.168.2.0/24', :label=>103},
|
165
|
+
])
|
166
|
+
)
|
167
|
+
assert_match(/ID=100, Label Stack=101/, path_attr.to_s)
|
168
|
+
path_attr_new = Path_attribute.new(path_attr.encode(true), :as4byte=> true, :path_id=>true)
|
169
|
+
assert_equal(path_attr.to_shex, path_attr_new.to_shex)
|
170
|
+
|
171
|
+
# TODO: UT: a path attr with mp_reach w path_id and ! as4
|
172
|
+
# TODO: UT: a path attr with mp_unreach w path_id
|
173
|
+
# TODO: UT: a path attr with mp_reach w path_id and as4
|
174
|
+
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 12
|
9
|
+
version: 0.0.12
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jean-Michel Esnault
|
@@ -14,12 +14,12 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-
|
17
|
+
date: 2011-02-13 00:00:00 -08:00
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|
21
21
|
description: BGP4R is a BGP-4 ruby library to create, send, and receive BGP messages in an object oriented manner
|
22
|
-
email:
|
22
|
+
email: bgp4r@esnault.org
|
23
23
|
executables: []
|
24
24
|
|
25
25
|
extensions: []
|
@@ -44,7 +44,8 @@ files:
|
|
44
44
|
- bgp/messages/route_refresh.rb
|
45
45
|
- bgp/messages/update.rb
|
46
46
|
- bgp/misc/live_feed.rb
|
47
|
-
- bgp/neighbor.rb
|
47
|
+
- bgp/neighbor/add_path_cap.rb
|
48
|
+
- bgp/neighbor/neighbor.rb
|
48
49
|
- bgp/nlris/inet.rb
|
49
50
|
- bgp/nlris/label.rb
|
50
51
|
- bgp/nlris/labeled.rb
|
@@ -53,6 +54,7 @@ files:
|
|
53
54
|
- bgp/nlris/prefix.rb
|
54
55
|
- bgp/nlris/rd.rb
|
55
56
|
- bgp/nlris/vpn.rb
|
57
|
+
- bgp/optional_parameters/add_path.rb
|
56
58
|
- bgp/optional_parameters/as4.rb
|
57
59
|
- bgp/optional_parameters/capabilities.rb
|
58
60
|
- bgp/optional_parameters/capability.rb
|
@@ -90,8 +92,13 @@ files:
|
|
90
92
|
- examples/unit-testing/malformed_update.rb
|
91
93
|
- examples/unit-testing/no_export.rb
|
92
94
|
- examples/unit-testing/prepend_aspath.rb
|
95
|
+
- examples/unit-testing/test.rb
|
96
|
+
- examples/unit-testing/test1.rb
|
97
|
+
- examples/unit-testing/test2.rb
|
93
98
|
- examples/unit-testing/unknown_transitive_attr.rb
|
94
99
|
- test/common_test.rb
|
100
|
+
- test/helpers/server.rb
|
101
|
+
- test/iana_test.rb
|
95
102
|
- test/messages/capability_test.rb
|
96
103
|
- test/messages/keepalive_test.rb
|
97
104
|
- test/messages/markers_test.rb
|
@@ -102,12 +109,14 @@ files:
|
|
102
109
|
- test/messages/update_test.rb
|
103
110
|
- test/misc/live_feed_test.rb
|
104
111
|
- test/misc/misc.rb
|
105
|
-
- test/
|
112
|
+
- test/neighbor/add_path_cap_test.rb
|
113
|
+
- test/neighbor/neighbor_test.rb
|
106
114
|
- test/nlris/ext_nlri_test.rb
|
107
115
|
- test/nlris/inet_test.rb
|
108
116
|
- test/nlris/labeled_test.rb
|
109
117
|
- test/nlris/nlri_test.rb
|
110
118
|
- test/nlris/rd_test.rb
|
119
|
+
- test/optional_parameters/add_path_test.rb
|
111
120
|
- test/optional_parameters/as4_test.rb
|
112
121
|
- test/optional_parameters/capability_test.rb
|
113
122
|
- test/optional_parameters/dynamic_test.rb
|
@@ -167,6 +176,8 @@ specification_version: 3
|
|
167
176
|
summary: A BGP-4 Ruby Library
|
168
177
|
test_files:
|
169
178
|
- test/common_test.rb
|
179
|
+
- test/helpers/server.rb
|
180
|
+
- test/iana_test.rb
|
170
181
|
- test/messages/capability_test.rb
|
171
182
|
- test/messages/keepalive_test.rb
|
172
183
|
- test/messages/markers_test.rb
|
@@ -177,12 +188,14 @@ test_files:
|
|
177
188
|
- test/messages/update_test.rb
|
178
189
|
- test/misc/live_feed_test.rb
|
179
190
|
- test/misc/misc.rb
|
180
|
-
- test/
|
191
|
+
- test/neighbor/add_path_cap_test.rb
|
192
|
+
- test/neighbor/neighbor_test.rb
|
181
193
|
- test/nlris/ext_nlri_test.rb
|
182
194
|
- test/nlris/inet_test.rb
|
183
195
|
- test/nlris/labeled_test.rb
|
184
196
|
- test/nlris/nlri_test.rb
|
185
197
|
- test/nlris/rd_test.rb
|
198
|
+
- test/optional_parameters/add_path_test.rb
|
186
199
|
- test/optional_parameters/as4_test.rb
|
187
200
|
- test/optional_parameters/capability_test.rb
|
188
201
|
- test/optional_parameters/dynamic_test.rb
|
data/test/neighbor_test.rb
DELETED
@@ -1,62 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# Copyright 2008, 2009 Jean-Michel Esnault.
|
3
|
-
# All rights reserved.
|
4
|
-
# See LICENSE.txt for permissions.
|
5
|
-
#
|
6
|
-
#
|
7
|
-
# This file is part of BGP4R.
|
8
|
-
#
|
9
|
-
# BGP4R is free software: you can redistribute it and/or modify
|
10
|
-
# it under the terms of the GNU General Public License as published by
|
11
|
-
# the Free Software Foundation, either version 3 of the License, or
|
12
|
-
# (at your option) any later version.
|
13
|
-
#
|
14
|
-
# BGP4R is distributed in the hope that it will be useful,
|
15
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
17
|
-
# GNU General Public License for more details.
|
18
|
-
#
|
19
|
-
# You should have received a copy of the GNU General Public License
|
20
|
-
# along with BGP4R. If not, see <http://www.gnu.org/licenses/>.
|
21
|
-
#++
|
22
|
-
|
23
|
-
require "test/unit"
|
24
|
-
require 'bgp4r'
|
25
|
-
|
26
|
-
class TestBgpNeighbor < Test::Unit::TestCase
|
27
|
-
include BGP
|
28
|
-
include BGP::OPT_PARM::CAP
|
29
|
-
def test_open_msg
|
30
|
-
neighbor = Neighbor.new \
|
31
|
-
:version=> 4,
|
32
|
-
:my_as=> 100,
|
33
|
-
:remote_addr => '192.168.1.200',
|
34
|
-
:local_addr => '192.168.1.5',
|
35
|
-
:id=> '1.1.1.1',
|
36
|
-
:holdtime=> 20
|
37
|
-
neighbor.capability Mbgp.ipv4_unicast
|
38
|
-
neighbor.capability Mbgp.ipv4_multicast
|
39
|
-
neighbor.capability Route_refresh.new
|
40
|
-
neighbor.capability Route_refresh.new 128
|
41
|
-
neighbor.capability As4.new(100)
|
42
|
-
open_msg = neighbor.open
|
43
|
-
assert_equal(5,open_msg.opt_parms.size)
|
44
|
-
assert_equal(4,open_msg.version)
|
45
|
-
assert_equal(20,open_msg.holdtime)
|
46
|
-
assert_equal(100,open_msg.local_as)
|
47
|
-
# puts neighbor
|
48
|
-
end
|
49
|
-
def test_states
|
50
|
-
neighbor = Neighbor.new \
|
51
|
-
:version=> 4,
|
52
|
-
:my_as=> 100,
|
53
|
-
:remote_addr => '192.168.1.200',
|
54
|
-
:local_addr => '192.168.1.5',
|
55
|
-
:id=> '1.1.1.1',
|
56
|
-
:holdtime=> 20
|
57
|
-
assert neighbor.is_idle?
|
58
|
-
assert ! neighbor.is_established?
|
59
|
-
assert ! neighbor.is_openrecv?
|
60
|
-
assert ! neighbor.is_openconfirm?
|
61
|
-
end
|
62
|
-
end
|