bgp4r 0.0.3
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.
- data/COPYING +674 -0
- data/LICENSE.txt +53 -0
- data/README.rdoc +259 -0
- data/bgp/aggregator.rb +104 -0
- data/bgp/as_path.rb +223 -0
- data/bgp/atomic_aggregate.rb +42 -0
- data/bgp/attribute.rb +181 -0
- data/bgp/attributes.rb +34 -0
- data/bgp/cluster_list.rb +117 -0
- data/bgp/common.rb +204 -0
- data/bgp/communities.rb +139 -0
- data/bgp/extended_communities.rb +107 -0
- data/bgp/extended_community.rb +254 -0
- data/bgp/iana.rb +269 -0
- data/bgp/io.rb +116 -0
- data/bgp/label.rb +94 -0
- data/bgp/local_pref.rb +75 -0
- data/bgp/message.rb +894 -0
- data/bgp/mp_reach.rb +208 -0
- data/bgp/multi_exit_disc.rb +76 -0
- data/bgp/neighbor.rb +291 -0
- data/bgp/next_hop.rb +63 -0
- data/bgp/nlri.rb +303 -0
- data/bgp/orf.rb +88 -0
- data/bgp/origin.rb +88 -0
- data/bgp/originator_id.rb +73 -0
- data/bgp/path_attribute.rb +210 -0
- data/bgp/prefix_orf.rb +263 -0
- data/bgp/rd.rb +107 -0
- data/examples/bgp +65 -0
- data/examples/routegen +85 -0
- data/examples/routegen.yml +50 -0
- data/test/aggregator_test.rb +66 -0
- data/test/as_path_test.rb +149 -0
- data/test/atomic_aggregate_test.rb +35 -0
- data/test/attribute_test.rb +57 -0
- data/test/cluster_list_test.rb +39 -0
- data/test/common_test.rb +68 -0
- data/test/communities_test.rb +75 -0
- data/test/extended_communities_test.rb +111 -0
- data/test/extended_community_test.rb +93 -0
- data/test/label_test.rb +50 -0
- data/test/local_pref_test.rb +43 -0
- data/test/message_test.rb +294 -0
- data/test/mp_reach_test.rb +143 -0
- data/test/multi_exit_disc_test.rb +46 -0
- data/test/neighbor_test.rb +50 -0
- data/test/next_hop_test.rb +37 -0
- data/test/nlri_test.rb +189 -0
- data/test/origin_test.rb +57 -0
- data/test/originator_id_test.rb +38 -0
- data/test/path_attribute_test.rb +127 -0
- data/test/prefix_orf_test.rb +97 -0
- data/test/rd_test.rb +44 -0
- metadata +133 -0
data/examples/routegen
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
#--
|
2
|
+
#
|
3
|
+
# Copyright 2008, 2009 Jean-Michel Esnault.
|
4
|
+
# All rights reserved.
|
5
|
+
# See LICENSE.txt for permissions.
|
6
|
+
#
|
7
|
+
#++
|
8
|
+
|
9
|
+
require 'rubygems'
|
10
|
+
require 'bgp4r'
|
11
|
+
require 'yaml'
|
12
|
+
include BGP
|
13
|
+
|
14
|
+
require 'pp'
|
15
|
+
config_file = ARGV[0] ||= File.basename($0) + ".yml"
|
16
|
+
|
17
|
+
Log.create
|
18
|
+
Log.level=Logger::DEBUG
|
19
|
+
config = YAML::load_file(config_file)
|
20
|
+
|
21
|
+
p config
|
22
|
+
|
23
|
+
config.keys.each do |k|
|
24
|
+
case k
|
25
|
+
when 'neighbor'
|
26
|
+
neighbor = config['neighbor']
|
27
|
+
neighbor.keys.each do |k|
|
28
|
+
case k
|
29
|
+
when /router\s+id/ ; @router_id = neighbor[k]
|
30
|
+
when /my\s+as/ ; @my_as = neighbor[k]
|
31
|
+
when 'holdtime' ; @holdtime = neighbor[k]
|
32
|
+
when /neighbor\s+address/ ; @neighbor_addr = neighbor[k]
|
33
|
+
when /local\s+address/ ; @local_addr = neighbor[k]
|
34
|
+
when 'capabilities'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
when 'routes'
|
38
|
+
routes = config['routes']
|
39
|
+
routes.keys.each do |k|
|
40
|
+
case k
|
41
|
+
when /nlri(|s)/
|
42
|
+
_pfx, _npfx, _pack = routes[k].split(',')
|
43
|
+
@nlri = IPAddr.new _pfx
|
44
|
+
@times = _npfx.to_i ||=1
|
45
|
+
@pack = _pack.to_i ||=1
|
46
|
+
when /next\s*hop/ ; @nexthop= routes[k]
|
47
|
+
when /local\s*pref/ ; @local_pref= routes[k]
|
48
|
+
when /med/ ; @med = routes[k]
|
49
|
+
when /origin/ ; @origin = routes[k]
|
50
|
+
when /communities/ ; @communities = routes[k]
|
51
|
+
when /as\s*path/ ; @as_path= routes[k]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
neighbor = Neighbor.new \
|
58
|
+
:version => 4,
|
59
|
+
:my_as=> @my_as,
|
60
|
+
:remote_addr => @neighbor_addr,
|
61
|
+
:local_addr => @local_addr,
|
62
|
+
:id=> @router_id,
|
63
|
+
:holdtime=> @holdtime
|
64
|
+
|
65
|
+
# neighbor.capability :as4_byte
|
66
|
+
|
67
|
+
pa = Path_attribute.new(
|
68
|
+
Origin.new(@origin),
|
69
|
+
Next_hop.new(@nexthop),
|
70
|
+
Local_pref.new(@local_pref),
|
71
|
+
Communities.new(*(@communities.split.map { |com| com.to_i})),
|
72
|
+
As_path.new(*(@as_path.split.map { |as| as.to_i}))
|
73
|
+
)
|
74
|
+
|
75
|
+
neighbor.start
|
76
|
+
|
77
|
+
nlris = Nlri.new
|
78
|
+
(1..@times.to_i).each do |n|
|
79
|
+
nlris << (@nlri ^ n)
|
80
|
+
next unless (n % @pack) == 0 or (n == @times)
|
81
|
+
neighbor.send_message Update.new(pa, nlris)
|
82
|
+
nlris = Nlri.new
|
83
|
+
end
|
84
|
+
|
85
|
+
Thread.stop
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# YAML config file for routegen demo.
|
2
|
+
# $ ruby routegen routegen.yaml
|
3
|
+
---
|
4
|
+
neighbor:
|
5
|
+
router id: 1.1.1.1
|
6
|
+
my as: 100
|
7
|
+
holdtime: 180
|
8
|
+
local address: 192.168.1.6
|
9
|
+
neighbor address: 192.168.1.199
|
10
|
+
capabilities:
|
11
|
+
- four byte as
|
12
|
+
routes:
|
13
|
+
nlris: 11.0.0.0/28, 1999, 127
|
14
|
+
next hop: 192.168.1.6
|
15
|
+
local pref: 100
|
16
|
+
med: 100
|
17
|
+
origin: 1
|
18
|
+
communities: 100:1 200:1 300:1
|
19
|
+
as path: 200 300 400 500
|
20
|
+
|
21
|
+
...
|
22
|
+
|
23
|
+
produces:
|
24
|
+
|
25
|
+
ios#show ip route summary | inc bgp
|
26
|
+
bgp 100 0 1999 107946 287856
|
27
|
+
ios#
|
28
|
+
|
29
|
+
ios#show ip bgp ipv4 unicast
|
30
|
+
BGP table version is 13995, local router ID is 172.21.2.1
|
31
|
+
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
|
32
|
+
r RIB-failure
|
33
|
+
Origin codes: i - IGP, e - EGP, ? - incomplete
|
34
|
+
|
35
|
+
Network Next Hop Metric LocPrf Weight Path
|
36
|
+
*>i11.0.0.16/28 192.168.1.6 100 0 200 300 400 500 e
|
37
|
+
*>i11.0.0.32/28 192.168.1.6 100 0 200 300 400 500 e
|
38
|
+
*>i11.0.0.48/28 192.168.1.6 100 0 200 300 400 500 e
|
39
|
+
*>i11.0.0.64/28 192.168.1.6 100 0 200 300 400 500 e
|
40
|
+
*>i11.0.0.80/28 192.168.1.6 100 0 200 300 400 500 e
|
41
|
+
*>i11.0.0.96/28 192.168.1.6 100 0 200 300 400 500 e
|
42
|
+
*>i11.0.0.112/28 192.168.1.6 100 0 200 300 400 500 e
|
43
|
+
*>i11.0.0.128/28 192.168.1.6 100 0 200 300 400 500 e
|
44
|
+
*>i11.0.0.144/28 192.168.1.6 100 0 200 300 400 500 e
|
45
|
+
*>i11.0.0.160/28 192.168.1.6 100 0 200 300 400 500 e
|
46
|
+
*>i11.0.0.176/28 192.168.1.6 100 0 200 300 400 500 e
|
47
|
+
|
48
|
+
...
|
49
|
+
|
50
|
+
|
@@ -0,0 +1,66 @@
|
|
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
|
+
|
24
|
+
require 'bgp/aggregator'
|
25
|
+
require 'test/unit'
|
26
|
+
class Aggregator_Test < Test::Unit::TestCase
|
27
|
+
include BGP
|
28
|
+
def test_1
|
29
|
+
aggregator = Aggregator.new('10.0.0.1',100)
|
30
|
+
aggregator.encode4
|
31
|
+
assert_equal(aggregator.encode4, aggregator.encode)
|
32
|
+
assert_equal('10.0.0.1, 100', aggregator.aggregator)
|
33
|
+
assert_equal('c0070600640a000001', aggregator.to_shex)
|
34
|
+
assert_equal('c00708000000640a000001', aggregator.to_shex(true))
|
35
|
+
assert_equal(aggregator.to_shex, Aggregator.new(aggregator.encode).to_shex)
|
36
|
+
assert_equal("[OTcr] (7) Aggregator: [c0070600640a000001] '10.0.0.1, 100'", aggregator.to_s)
|
37
|
+
end
|
38
|
+
def test_2
|
39
|
+
aggregator = Aggregator.new('10.0.0.1',100)
|
40
|
+
assert_equal('10.0.0.1, 0.100', aggregator.aggregator(true))
|
41
|
+
aggregator = Aggregator.new('10.0.0.1',0xdeadbeef)
|
42
|
+
assert_equal('10.0.0.1, 57005.48879', aggregator.aggregator(true))
|
43
|
+
assert_equal('c00708deadbeef0a000001', aggregator.to_shex(true))
|
44
|
+
aggregator = Aggregator.new(aggregator.encode(true),true)
|
45
|
+
assert_equal('10.0.0.1, 3735928559', aggregator.aggregator)
|
46
|
+
assert_equal(0xdeadbeef, aggregator.as)
|
47
|
+
end
|
48
|
+
def test3
|
49
|
+
ag2 = Aggregator.new('10.0.0.1',100)
|
50
|
+
ag4 = As4_aggregator.new('10.0.0.1',100)
|
51
|
+
assert_equal('c01208000000640a000001', ag4.to_shex)
|
52
|
+
assert_not_equal(ag2.to_shex(true), ag4.to_shex)
|
53
|
+
assert_equal('10.0.0.1, 0.100',ag4.aggregator)
|
54
|
+
assert_equal("[OTcr] (18) As4 Aggregator: [c01208000000640a00000...] '10.0.0.1, 0.100'",ag4.to_s)
|
55
|
+
assert_equal(ag4.to_shex,As4_aggregator.new(ag4.encode).to_shex)
|
56
|
+
end
|
57
|
+
def test4
|
58
|
+
ag2 = Aggregator.new('10.0.0.1',100)
|
59
|
+
ag = Aggregator.new(ag2)
|
60
|
+
assert_equal(ag2.encode, ag.encode)
|
61
|
+
ag4 = As4_aggregator.new('10.0.0.1',100)
|
62
|
+
ag = As4_aggregator.new(ag4)
|
63
|
+
assert_raise(ArgumentError) {As4_aggregator.new(ag2)}
|
64
|
+
assert_equal(ag4.encode, ag.encode)
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,149 @@
|
|
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 'bgp/as_path'
|
24
|
+
require 'test/unit'
|
25
|
+
|
26
|
+
class Segment_Test < Test::Unit::TestCase
|
27
|
+
include BGP
|
28
|
+
def test_1
|
29
|
+
assert_equal(BGP::ATTR::SEQUENCE, As_path::Segment.new(:sequence, 1).seg_type)
|
30
|
+
assert_equal([1], As_path::Segment.new(:sequence, 1).as)
|
31
|
+
assert_equal([1,2,3], As_path::Segment.new(:sequence, 1,2,3).as)
|
32
|
+
assert_equal('1 2 3', As_path::Segment.new(:sequence, 1,2,3).to_s)
|
33
|
+
end
|
34
|
+
def test_2
|
35
|
+
assert_equal('02010001', As_path::Segment.new(:sequence, 1).to_shex)
|
36
|
+
assert_equal('020100000001', As_path::Segment.new(:sequence, 1).to_shex(true))
|
37
|
+
assert_equal('02010001', As_path::Segment.new(['02010001'].pack('H*')).to_shex)
|
38
|
+
assert_equal('0203000100020003', As_path::Segment.new(:sequence, 1,2,3).to_shex)
|
39
|
+
assert_equal('0203000100020003', As_path::Sequence.new(1,2,3).to_shex)
|
40
|
+
end
|
41
|
+
def test_3
|
42
|
+
assert_equal('01010001', As_path::Segment.new(:set, 1).to_shex)
|
43
|
+
assert_equal('030100000001', As_path::Segment.new(:confed_sequence, 1).to_shex(true))
|
44
|
+
assert_equal('030100000001', As_path::Segment.new(:confed_sequence, 1).to_shex(true))
|
45
|
+
assert_equal('030100000001', As_path::Confed_sequence.new(1).to_shex(true))
|
46
|
+
assert_equal('040100000001', As_path::Confed_set.new(1).to_shex(true))
|
47
|
+
assert_equal('02010001', As_path::Segment.new(['02010001'].pack('H*')).to_shex)
|
48
|
+
end
|
49
|
+
def test_4
|
50
|
+
seg = As_path::Segment.factory(['0203000100020003'].pack('H*'))
|
51
|
+
assert_equal(As_path::Sequence,seg.class)
|
52
|
+
seg = As_path::Segment.factory(['0103000100020003'].pack('H*'))
|
53
|
+
assert_equal(As_path::Set,seg.class)
|
54
|
+
seg = As_path::Segment.factory(['0303000100020003'].pack('H*'))
|
55
|
+
assert_equal(As_path::Confed_sequence,seg.class)
|
56
|
+
seg = As_path::Segment.factory(['0403000100020003'].pack('H*'))
|
57
|
+
assert_equal(As_path::Confed_set,seg.class)
|
58
|
+
seg = As_path::Segment.factory(['0203000100020003'].pack('H*'))
|
59
|
+
assert_equal(As_path::Sequence,seg.class)
|
60
|
+
assert_equal('0203000100020003', seg.to_shex)
|
61
|
+
assert_equal('0203000000010000000200000003', seg.to_shex(true))
|
62
|
+
seg = As_path::Segment.factory(['0203000000010000000200000003'].pack('H*'), true)
|
63
|
+
assert_equal('0203000000010000000200000003', seg.to_shex(true))
|
64
|
+
assert_equal('0203000100020003', seg.to_shex(false))
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
class As_path_Test < Test::Unit::TestCase
|
69
|
+
include BGP
|
70
|
+
def test_1
|
71
|
+
assert_equal('400200', As_path.new.to_shex)
|
72
|
+
path = As_path.new(1)
|
73
|
+
assert_equal("40020402010001", As_path.new(1).to_shex)
|
74
|
+
assert_equal("40020402010001", As_path.new(As_path::Sequence.new(1)).to_shex)
|
75
|
+
assert_equal("40020402010001", As_path.new(As_path::Segment.new(:sequence,1)).to_shex)
|
76
|
+
assert_equal("4002080203000100020003", As_path.new(1,2,3).to_shex)
|
77
|
+
assert_equal("4002080203000100020003", As_path.new(As_path::Sequence.new(1,2,3)).to_shex)
|
78
|
+
assert_equal("4002080203000100020003", As_path.new(As_path::Segment.new(:sequence,1,2,3)).to_shex)
|
79
|
+
end
|
80
|
+
def test_2
|
81
|
+
path = As_path.new(['4002080203000100020003'].pack('H*').is_packed)
|
82
|
+
assert_equal('4002080203000100020003', path.to_shex)
|
83
|
+
path << As_path::Set.new(1,2,3)
|
84
|
+
path << As_path::Confed_sequence.new(1,2,3)
|
85
|
+
assert_equal('400218020300010002000301030001000200030303000100020003', path.to_shex)
|
86
|
+
assert_equal('40021802030...', path.to_shex_len(10))
|
87
|
+
assert_equal("[wTcr] (2) As Path: [400218020300010002000...] '1 2 3 {1, 2, 3} (1 2 3)'", path.to_s)
|
88
|
+
end
|
89
|
+
def test_3
|
90
|
+
path = As_path.new(1,2,3)
|
91
|
+
path.as4byte=true
|
92
|
+
assert_equal('40020e0203000000010000000200000003', path.to_shex)
|
93
|
+
assert_equal('4002080203000100020003', path.to_shex(false))
|
94
|
+
path.as4byte=false
|
95
|
+
assert_equal('4002080203000100020003', path.to_shex)
|
96
|
+
assert_equal('40020e0203000000010000000200000003', path.to_shex(true))
|
97
|
+
end
|
98
|
+
def test_4
|
99
|
+
assert_equal('400200', As_path.new.to_shex)
|
100
|
+
path = As_path.new(1)
|
101
|
+
assert_equal("1", As_path.new(1).as_path)
|
102
|
+
assert_equal("1", As_path.new(As_path::Sequence.new(1)).as_path)
|
103
|
+
assert_equal("1", As_path.new(As_path::Segment.new(:sequence,1)).as_path)
|
104
|
+
assert_equal("1 2 3 4 5 6 7", As_path.new(1,2,3,4,5,6,7).as_path)
|
105
|
+
assert_equal("{1, 2, 3}", As_path.new(As_path::Set.new(1,2,3)).as_path)
|
106
|
+
assert_equal("(1 2 3)", As_path.new(As_path::Segment.new(:confed_sequence,1,2,3)).as_path)
|
107
|
+
assert_equal("[1, 2, 3]", As_path.new(As_path::Segment.new(:confed_set,1,2,3)).as_path)
|
108
|
+
assert_equal("[wTcr] (2) As Path: [400208040300010002000...] '[1, 2, 3]'", As_path.new(As_path::Segment.new(:confed_set,1,2,3)).to_s)
|
109
|
+
end
|
110
|
+
def test_5
|
111
|
+
two_byte_as = '4002080203000100020003'
|
112
|
+
four_byte_as = '40020e0203000000010000000200000003'
|
113
|
+
path = As_path.new([four_byte_as].pack('H*'),true)
|
114
|
+
assert_equal(two_byte_as, path.to_shex)
|
115
|
+
assert_equal(four_byte_as, path.to_shex(true))
|
116
|
+
path = As_path.new([two_byte_as].pack('H*'))
|
117
|
+
assert_equal(two_byte_as, path.to_shex)
|
118
|
+
assert_equal(four_byte_as, path.to_shex(true))
|
119
|
+
asp = As_path.new(['40020c020500010002000300040005c0080c051f00010137003b0af50040'].pack('H*'))
|
120
|
+
asp2 = As_path.new(asp)
|
121
|
+
assert_equal(asp.encode, asp2.encode)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
class As4_path_Test < Test::Unit::TestCase
|
126
|
+
include BGP
|
127
|
+
def test_1
|
128
|
+
assert_equal('c01100', As4_path.new.to_shex)
|
129
|
+
path = As4_path.new(1)
|
130
|
+
assert_equal("c01106020100000001", As4_path.new(1).to_shex)
|
131
|
+
assert_equal("c01106020100000001", As4_path.new(As_path::Sequence.new(1)).to_shex)
|
132
|
+
assert_equal("c01106020100000001", As4_path.new(As_path::Segment.new(:sequence,1)).to_shex)
|
133
|
+
assert_equal("c0110e0203000000010000000200000003", As4_path.new(1,2,3).to_shex)
|
134
|
+
assert_equal("c0110e0203000000010000000200000003", As4_path.new(As_path::Sequence.new(1,2,3)).to_shex)
|
135
|
+
assert_equal("c0110e0203000000010000000200000003", As4_path.new(As_path::Segment.new(:sequence,1,2,3)).to_shex)
|
136
|
+
end
|
137
|
+
def test_2
|
138
|
+
path = As4_path.new(['c0110e0203000000010000000200000003'].pack('H*'))
|
139
|
+
assert_equal('c0110e0203000000010000000200000003', path.to_shex)
|
140
|
+
path << As_path::Set.new(1,2,3)
|
141
|
+
path << As_path::Confed_sequence.new(1,2,3)
|
142
|
+
assert_equal('c0112a020300000001000000020000000301030000000100000002000000030303000000010000000200000003', path.to_shex)
|
143
|
+
assert_equal('c0112a02030...', path.to_shex_len(10))
|
144
|
+
assert_equal('1 2 3 {1, 2, 3} (1 2 3)',path.as_path)
|
145
|
+
assert_equal("[OTcr] (17) As4 Path: [c0112a020300000001000...] '1 2 3 {1, 2, 3} (1 2 3)'",path.to_s)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
#MiniTest::Unit.autorun
|
@@ -0,0 +1,35 @@
|
|
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 "bgp/atomic_aggregate"
|
24
|
+
|
25
|
+
require 'test/unit'
|
26
|
+
class Atomic_aggregate_Test < Test::Unit::TestCase
|
27
|
+
include BGP
|
28
|
+
def test_1
|
29
|
+
assert_equal("800600", Atomic_aggregate.new.to_shex)
|
30
|
+
assert_equal("Atomic Aggregate (6), length: 0, Flags [O]: ", Atomic_aggregate.new.to_s)
|
31
|
+
obj = Atomic_aggregate.new
|
32
|
+
assert_equal("800600", Atomic_aggregate.new(obj.encode).to_shex)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
@@ -0,0 +1,57 @@
|
|
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 'bgp/common'
|
24
|
+
require 'bgp/path_attribute'
|
25
|
+
require 'test/unit'
|
26
|
+
|
27
|
+
class ATTR_Test < Test::Unit::TestCase
|
28
|
+
include BGP
|
29
|
+
class Attr_test < Attr
|
30
|
+
def initialize
|
31
|
+
@type, @flags = 0, 0
|
32
|
+
end
|
33
|
+
def encode
|
34
|
+
@type=0xee
|
35
|
+
@flags=0xf
|
36
|
+
super()
|
37
|
+
end
|
38
|
+
end
|
39
|
+
def test_1
|
40
|
+
assert_equal('f0ee00',Attr_test.new.to_shex)
|
41
|
+
attr = Attr_test.new
|
42
|
+
assert_equal(attr.encode4, attr.encode)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
class Attr_factory_Test < Test::Unit::TestCase
|
46
|
+
include BGP
|
47
|
+
def test_1
|
48
|
+
s = ['400101014003040a000001800404000000644005040000006440020c020500010002000300040005c0080c051f00010137003b0af50040'].pack('H*')
|
49
|
+
assert_equal(Origin, BGP::Attr.factory(s).class)
|
50
|
+
assert_equal(Next_hop, BGP::Attr.factory(s).class)
|
51
|
+
assert_equal(Multi_exit_disc, BGP::Attr.factory(s).class)
|
52
|
+
assert_equal(Local_pref, BGP::Attr.factory(s).class)
|
53
|
+
assert_equal(As_path, BGP::Attr.factory(s).class)
|
54
|
+
assert_equal(Communities, BGP::Attr.factory(s).class)
|
55
|
+
assert_equal('',s)
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,39 @@
|
|
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 'bgp/cluster_list'
|
24
|
+
require 'test/unit'
|
25
|
+
class Cluster_list_Test < Test::Unit::TestCase
|
26
|
+
include BGP
|
27
|
+
def test_1
|
28
|
+
list1 = Cluster_list.new('192.168.0.1','10.0.0.1')
|
29
|
+
list2 = Cluster_list.new('192.168.0.1 10.0.0.1')
|
30
|
+
assert_equal('800a08c0a800010a000001', list1.to_shex)
|
31
|
+
assert_equal(list1.to_shex, list2.to_shex)
|
32
|
+
assert_equal('192.168.0.1 10.0.0.1',list1.cluster_list)
|
33
|
+
assert_equal("[Oncr] (10) Cluster List: [800a08c0a800010a00000...] '192.168.0.1 10.0.0.1'", list1.to_s)
|
34
|
+
list3 = Cluster_list.new(['800a08c0a800010a000001'].pack('H*'))
|
35
|
+
assert_equal(list1.encode, list3.encode)
|
36
|
+
list4 = Cluster_list.new(list3)
|
37
|
+
assert_equal(list3.encode, list4.encode)
|
38
|
+
end
|
39
|
+
end
|
data/test/common_test.rb
ADDED
@@ -0,0 +1,68 @@
|
|
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 "bgp/common"
|
24
|
+
|
25
|
+
require 'test/unit'
|
26
|
+
class Common_Test < Test::Unit::TestCase
|
27
|
+
def test_ipaddr_1
|
28
|
+
s = [1,2,3].pack('C*')
|
29
|
+
assert(s.is_packed?)
|
30
|
+
assert( ! "1234".is_packed?)
|
31
|
+
end
|
32
|
+
def test_ipaddr_2
|
33
|
+
ip = IPAddr.new('10.0.0.1')
|
34
|
+
assert_equal('0a000001', ip.to_shex)
|
35
|
+
assert_equal('0a000001', IPAddr.create(ip.encode).to_shex)
|
36
|
+
assert_equal('0a000001', IPAddr.create(ip.to_i).to_shex)
|
37
|
+
end
|
38
|
+
def test_ipaddr_3
|
39
|
+
assert_equal(32, IPAddr.new('10.0.0.1').mlen)
|
40
|
+
assert_equal(16, IPAddr.new('10.0.0.1/16').mlen)
|
41
|
+
assert_equal(7, IPAddr.new('10.0.0.0/7').mlen)
|
42
|
+
assert_equal(128, IPAddr.new('0::0').mlen)
|
43
|
+
assert_equal(96, IPAddr.new('2004::0001:3/96').mlen)
|
44
|
+
assert_equal('255.255.255.255', IPAddr.new('1.1.1.1').netmask)
|
45
|
+
assert_equal('255.255.255.255', IPAddr.new('1.1.1.1/32').netmask)
|
46
|
+
assert_equal('255.255.255.254', IPAddr.new('1.1.1.1/31').netmask)
|
47
|
+
assert_equal('255.255.255.252', IPAddr.new('1.1.1.1/30').netmask)
|
48
|
+
assert_equal('255.255.255.248', IPAddr.new('1.1.1.1/29').netmask)
|
49
|
+
end
|
50
|
+
def test_ipaddr_4
|
51
|
+
ip1 = IPAddr.new('10.0.0.1/28')
|
52
|
+
ip2 = IPAddr.new('10.0.0.1/24')
|
53
|
+
ip3 = IPAddr.new('10.0.0.1/12')
|
54
|
+
assert_equal('10.0.0.16/28', ip1 ^ 1)
|
55
|
+
assert_equal('10.0.0.32/28', ip1 ^ 2)
|
56
|
+
assert_equal('10.0.1.0/24', ip2 ^ 1)
|
57
|
+
assert_equal('10.0.2.0/24', ip2 ^ 2)
|
58
|
+
assert_equal('10.16.0.0/12', ip3 ^ 1)
|
59
|
+
assert_equal('10.32.0.0/12', ip3 ^ 2)
|
60
|
+
end
|
61
|
+
def test_string_1
|
62
|
+
sbin = ['0a000001'].pack('H*')
|
63
|
+
assert_equal('0x0000: 0a00 0001',sbin.hexlify.join)
|
64
|
+
end
|
65
|
+
def test_nlri
|
66
|
+
assert_equal('14000000', IPAddr.new_nlri4(['101400'].pack('H*')).to_shex)
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,75 @@
|
|
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 'bgp/communities'
|
24
|
+
|
25
|
+
require 'test/unit'
|
26
|
+
class Community_Test < Test::Unit::TestCase
|
27
|
+
include BGP
|
28
|
+
def test_1
|
29
|
+
assert_equal(0xFFFFFF01,Communities::Community.new(:no_export).to_i)
|
30
|
+
assert_equal(0xFFFFFF02,Communities::Community.new(:no_advertise).to_i)
|
31
|
+
assert_equal(0xFFFFFF03,Communities::Community.new(:no_export_sub_confed).to_i)
|
32
|
+
assert_equal(0xFFFFFF04,Communities::Community.new(:no_peer).to_i)
|
33
|
+
assert_equal(0xdeadbeef,Communities::Community.new(0xdeadbeef).to_i)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
class Communities_Test < Test::Unit::TestCase
|
37
|
+
include BGP
|
38
|
+
def test_1
|
39
|
+
assert_equal('113:10 113:20 113:30 113:40', Communities.new("113:10", "113:20", "113:30", "113:40").communities)
|
40
|
+
assert_equal('113:10 113:20 113:30 113:40', Communities.new("113:10 113:20 113:30 113:40").communities)
|
41
|
+
assert_equal('113:10 113:20 113:30 113:40', Communities.new("113:10, 113:20, 113:30, 113:40").communities)
|
42
|
+
assert_equal('113:20', Communities.new("113:20").communities)
|
43
|
+
com = Communities.new
|
44
|
+
com << '113:10'
|
45
|
+
assert_equal('113:10', com.communities)
|
46
|
+
com << '113:20'
|
47
|
+
assert_equal('113:10 113:20', com.communities)
|
48
|
+
com << '113:30'
|
49
|
+
assert_equal('113:10 113:20 113:30', com.communities)
|
50
|
+
assert_equal('c0080c0071000a007100140071001e', com.to_shex)
|
51
|
+
com1 = Communities.new("145:30", "145:40", "145:50", "145:60")
|
52
|
+
com2 = Communities.new("145:30,145:40,145:50,145:60")
|
53
|
+
assert_equal(com1.to_shex, com2.to_shex)
|
54
|
+
assert_equal(["0x91001e", "0x910028", "0x910032", "0x91003c"], com2.to_ary.collect { |c| "0x#{c.to_s(16)}" })
|
55
|
+
assert_equal('c008100091001e00910028009100320091003c',com1.to_shex)
|
56
|
+
com3 = Communities.new(0x91001E, 0x910028, 0x910032, 0x91003c)
|
57
|
+
assert_equal('c008100091001e00910028009100320091003c',com3.to_shex)
|
58
|
+
assert_equal('145:30 145:40 145:50 145:60', com3.communities)
|
59
|
+
assert_equal("[OTcr] (8) Communities: [c008100091001e0091002...] '145:30 145:40 145:50 145:60'", com3.to_s)
|
60
|
+
assert_equal(com3.to_shex, Communities.new(com3.encode).to_shex)
|
61
|
+
end
|
62
|
+
def test_2
|
63
|
+
com1 = Communities.new("145:60", "145:10", "145:30", "145:20")
|
64
|
+
com2 = Communities.new("145:30,145:20,145:10,145:60")
|
65
|
+
assert(com1 == com2)
|
66
|
+
com1.sort
|
67
|
+
assert_equal('145:60 145:10 145:30 145:20', com1.communities)
|
68
|
+
com1.sort!
|
69
|
+
assert_equal('145:10 145:20 145:30 145:60', com1.communities)
|
70
|
+
com3 = Communities.new(com1)
|
71
|
+
assert_equal(com1.encode, com3.encode)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
#MiniTest::Unit.autorun
|