bgp4r 0.0.13 → 0.0.14
Sign up to get free protection for your applications and to get access to all the features.
- data/bgp/messages/update.rb +8 -0
- data/bgp/nlris/label.rb +9 -1
- data/bgp/nlris/labeled.rb +11 -0
- data/bgp/nlris/nlri.rb +15 -4
- data/bgp/nlris/prefix.rb +11 -0
- data/bgp/nlris/rd.rb +13 -1
- data/bgp/nlris/vpn.rb +59 -10
- data/bgp/path_attributes/aggregator.rb +19 -0
- data/bgp/path_attributes/aigp.rb +63 -0
- data/bgp/path_attributes/as_path.rb +57 -0
- data/bgp/path_attributes/atomic_aggregate.rb +3 -0
- data/bgp/path_attributes/attribute.rb +10 -0
- data/bgp/path_attributes/attributes.rb +1 -0
- data/bgp/path_attributes/cluster_list.rb +24 -1
- data/bgp/path_attributes/communities.rb +32 -1
- data/bgp/path_attributes/extended_communities.rb +26 -0
- data/bgp/path_attributes/extended_community.rb +101 -16
- data/bgp/path_attributes/local_pref.rb +10 -0
- data/bgp/path_attributes/mp_reach.rb +21 -2
- data/bgp/path_attributes/mp_unreach.rb +5 -1
- data/bgp/path_attributes/multi_exit_disc.rb +10 -0
- data/bgp/path_attributes/next_hop.rb +20 -0
- data/bgp/path_attributes/origin.rb +14 -0
- data/bgp/path_attributes/originator_id.rb +17 -6
- data/bgp/path_attributes/path_attribute.rb +87 -2
- data/bgp/path_attributes/tlvs/tlv.rb +18 -0
- data/test/unit/messages/update_test.rb +79 -5
- data/test/unit/neighbor/neighbor_test.rb +0 -1
- data/test/unit/nlris/label_test.rb +6 -0
- data/test/unit/nlris/labeled_test.rb +12 -0
- data/test/unit/nlris/prefix_test.rb +5 -1
- data/test/unit/nlris/rd_test.rb +2 -0
- data/test/unit/nlris/vpn_test.rb +50 -0
- data/test/unit/path_attributes/aggregator_test.rb +6 -0
- data/test/unit/path_attributes/{aigp.rb → aigp_test.rb} +29 -0
- data/test/unit/path_attributes/as_path_test.rb +53 -0
- data/test/unit/path_attributes/atomic_aggregate_test.rb +3 -0
- data/test/unit/path_attributes/cluster_list_test.rb +15 -10
- data/test/unit/path_attributes/communities_test.rb +9 -4
- data/test/unit/path_attributes/extended_communities_test.rb +31 -3
- data/test/unit/path_attributes/extended_community_test.rb +52 -9
- data/test/unit/path_attributes/local_pref_test.rb +5 -0
- data/test/unit/path_attributes/mp_reach_test.rb +51 -4
- data/test/unit/path_attributes/mp_unreach_test.rb +9 -7
- data/test/unit/path_attributes/next_hop_test.rb +3 -0
- data/test/unit/path_attributes/origin_test.rb +1 -0
- data/test/unit/path_attributes/path_attribute_test.rb +53 -2
- data/test/unit/path_attributes/tlvs/tlv_test.rb +33 -0
- data/test/unit/path_attributes/tunnel_encapsulation_test (Jean-Michel's Laptop's conflicted copy 2011-11-02).rb +388 -0
- metadata +14 -4
@@ -410,7 +410,6 @@ class Mp_reach_Test < Test::Unit::TestCase
|
|
410
410
|
assert_match(/ID=100, 49.0a10.0b00.0000.0000.0000.0000.0000.0000.0000.00\/32/, mpr.to_s)
|
411
411
|
assert_match(/ID=101, 49.0a20.0b00.0000.0000.0000.0000.0000.0000.0000.00\/32/, mpr.to_s)
|
412
412
|
assert_match(/ID=102, 49.0a30.0b00.0000.0000.0000.0000.0000.0000.0000.00\/32/, mpr.to_s)
|
413
|
-
|
414
413
|
|
415
414
|
end
|
416
415
|
|
@@ -436,8 +435,7 @@ class Mp_reach_Test < Test::Unit::TestCase
|
|
436
435
|
|
437
436
|
assert_equal('800e10000104040a0000010030000651c0a800', mpr1.to_shex)
|
438
437
|
assert_equal('800e14000104040a000001000000006430000651c0a800', mpr2.to_shex)
|
439
|
-
|
440
|
-
|
438
|
+
|
441
439
|
assert_equal attr_len(mpr1)+4, attr_len(mpr2)
|
442
440
|
|
443
441
|
assert_equal('800e1e000104040a0000010030000651c0a80030000661c0a80130000671c0a801', mpr3.to_shex)
|
@@ -474,6 +472,7 @@ class Mp_reach_Test < Test::Unit::TestCase
|
|
474
472
|
{:rd=> [100,100], :prefix=> '192.168.1.0/24', :label=>102},
|
475
473
|
{:rd=> [100,100], :prefix=> '192.168.2.0/24', :label=>103},
|
476
474
|
]
|
475
|
+
|
477
476
|
mpr4 = Mp_reach.new :safi=>128, :nexthop=> ['10.0.0.1'], :path_id=> 100, :nlris=> [
|
478
477
|
{:rd=> [100,100], :prefix=> '192.168.0.0/24', :label=>101},
|
479
478
|
{:rd=> [100,100], :prefix=> '192.168.1.0/24', :label=>102},
|
@@ -527,7 +526,9 @@ class Mp_reach_Test < Test::Unit::TestCase
|
|
527
526
|
assert_match(/^\s+Label Stack=101 /, mpr.to_s)
|
528
527
|
assert_match(/^\s+Label Stack=102 /, mpr.to_s)
|
529
528
|
assert_match(/^\s+Label Stack=103 /, mpr.to_s)
|
530
|
-
|
529
|
+
|
530
|
+
assert_equal(s.split.join, mpr.to_shex)
|
531
|
+
|
531
532
|
s = '80 0e 4a 0001 80 0c 00000000000000000a000001 00 00000065 70 000651 0000006400000064 c0a800
|
532
533
|
00000066 70 000661 0000006400000064 c0a801
|
533
534
|
00000067 70 000671 0000006400000064 c0a802'
|
@@ -537,6 +538,14 @@ class Mp_reach_Test < Test::Unit::TestCase
|
|
537
538
|
assert_match(/Label Stack=102.*ID=102, /, mpr.to_s)
|
538
539
|
assert_match(/Label Stack=103.*ID=103, /, mpr.to_s)
|
539
540
|
|
541
|
+
s = '80 0e 3b 0001 80 0c 0000000000000000 0a000001 00 70 000651 0000006400000064 c0a800
|
542
|
+
70 000661 0000006400000064 c0a801
|
543
|
+
58 000671 0000006400000064'
|
544
|
+
sbin = [s.split.join].pack('H*')
|
545
|
+
mpr = Mp_reach.new(sbin, false)
|
546
|
+
assert_equal(s.split.join, mpr.to_shex)
|
547
|
+
assert_match(/IPv4=0.0.0.0\/0/, mpr.to_s)
|
548
|
+
|
540
549
|
end
|
541
550
|
|
542
551
|
def test_derive_afi_from_nlris
|
@@ -554,6 +563,44 @@ class Mp_reach_Test < Test::Unit::TestCase
|
|
554
563
|
]))
|
555
564
|
end
|
556
565
|
|
566
|
+
def test_to_hash
|
567
|
+
|
568
|
+
mpr1 = Mp_reach.new :safi=>128, :nexthop=> ['10.0.0.1'],
|
569
|
+
:nlris=> {:rd=> [100,100], :prefix=> '192.168.0.0/24', :label=>101}
|
570
|
+
mpr2 = Mp_reach.new :safi=>128, :nexthop=> ['10.0.0.1'],
|
571
|
+
:nlris=> {:rd=> [100,100], :prefix=> '192.168.0.0/24', :label=>101, :path_id=>100}
|
572
|
+
mpr3 = Mp_reach.new :safi=>128, :nexthop=> ['10.0.0.1'], :nlris=> [
|
573
|
+
{:rd=> [100,100], :prefix=> '192.168.0.0/24', :label=>101},
|
574
|
+
{:rd=> [100,100], :prefix=> '192.168.1.0/24', :label=>102},
|
575
|
+
{:rd=> [100,100], :prefix=> '192.168.2.0/24', :label=>103},
|
576
|
+
]
|
577
|
+
|
578
|
+
h = {:safi=>128, :nexthop=> ['10.0.0.1'],
|
579
|
+
:nlris=> {:rd=> [100,100], :prefix=> '192.168.0.0/24', :label=>101}}
|
580
|
+
|
581
|
+
assert_equal( 128, mpr1.to_hash[:mp_reach][:safi])
|
582
|
+
assert_equal( 1, mpr1.to_hash[:mp_reach][:afi])
|
583
|
+
assert_equal( h[:nexthop], mpr1.to_hash[:mp_reach][:nexthop])
|
584
|
+
assert_equal( h[:nlris], mpr1.to_hash[:mp_reach][:nlris])
|
585
|
+
|
586
|
+
h = {:safi=>128, :nexthop=> ['10.0.0.1'], :nlris=> [
|
587
|
+
{:rd=> [100,100], :prefix=> '192.168.0.0/24', :label=>101},
|
588
|
+
{:rd=> [100,100], :prefix=> '192.168.1.0/24', :label=>102},
|
589
|
+
{:rd=> [100,100], :prefix=> '192.168.2.0/24', :label=>103},
|
590
|
+
]}
|
591
|
+
|
592
|
+
assert_equal( 128, mpr3.to_hash[:mp_reach][:safi])
|
593
|
+
assert_equal( 1, mpr3.to_hash[:mp_reach][:afi])
|
594
|
+
assert_equal( h[:nexthop], mpr3.to_hash[:mp_reach][:nexthop])
|
595
|
+
assert_equal( h[:nlris], mpr3.to_hash[:mp_reach][:nlris])
|
596
|
+
|
597
|
+
|
598
|
+
assert_equal(mpr1.to_hash, Mp_reach.new(mpr1.to_hash[:mp_reach]).to_hash)
|
599
|
+
assert_equal(mpr2.to_hash, Mp_reach.new(mpr2.to_hash[:mp_reach]).to_hash)
|
600
|
+
assert_equal(mpr3.to_hash, Mp_reach.new(mpr3.to_hash[:mp_reach]).to_hash)
|
601
|
+
|
602
|
+
end
|
603
|
+
|
557
604
|
private
|
558
605
|
|
559
606
|
def attr_len(attr)
|
@@ -87,14 +87,16 @@ class Mp_unreach_Test < Test::Unit::TestCase
|
|
87
87
|
{:prefix=> '192.168.2.0/24', :path_id=> 102},
|
88
88
|
])
|
89
89
|
|
90
|
+
h = {:safi=>1, :nlris=> '192.168.1.0/24', :afi=>1}
|
91
|
+
assert_equal(h, mpr1.to_hash[:mp_unreach])
|
90
92
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
93
|
+
assert_equal({:safi=>1, :nlris=>{:prefix=>"192.168.1.0/24", :path_id=>100}, :afi=>1}, mpr2.to_hash[:mp_unreach])
|
94
|
+
|
95
|
+
assert_equal(mpr1.to_hash, Mp_unreach.new(mpr1.to_hash[:mp_unreach]).to_hash)
|
96
|
+
assert_equal(mpr2.to_hash, Mp_unreach.new(mpr2.to_hash[:mp_unreach]).to_hash)
|
97
|
+
assert_equal(mpr3.to_hash, Mp_unreach.new(mpr3.to_hash[:mp_unreach]).to_hash)
|
98
|
+
assert_equal(mpr4.to_hash, Mp_unreach.new(mpr4.to_hash[:mp_unreach]).to_hash)
|
99
|
+
assert_equal(mpr5.to_hash, Mp_unreach.new(mpr5.to_hash[:mp_unreach]).to_hash)
|
98
100
|
assert_equal('800f0700010118c0a801', mpr1.to_shex)
|
99
101
|
assert_equal('800f0b0001010000006418c0a801', mpr2.to_shex)
|
100
102
|
assert_equal attr_len(mpr1)+4, attr_len(mpr2)
|
@@ -54,5 +54,6 @@ class Origin_Test < Test::Unit::TestCase
|
|
54
54
|
assert_equal("[wTcr] (1) Origin: [40010100] 'igp'", Origin.new.to_s)
|
55
55
|
assert_equal("[wTcr] (1) Origin: [40010100] 'igp'", Origin.new(:igp).to_s)
|
56
56
|
assert_equal("Origin (1), length: 1, Flags [T]: igp\n 0x0000: 00", Origin.new.to_s(:tcpdump))
|
57
|
+
assert_equal({:origin=>:egp}, Origin.new(:egp).to_hash)
|
57
58
|
end
|
58
59
|
end
|
@@ -48,8 +48,16 @@ class Path_attribute_Test < Test::Unit::TestCase # :nodoc:
|
|
48
48
|
BGP::Communities], @pa.has?)
|
49
49
|
assert(@pa.has? Multi_exit_disc)
|
50
50
|
assert(@pa.has? As_path)
|
51
|
+
pa = Path_attribute.new { |p|
|
52
|
+
p << Origin.new(1)
|
53
|
+
p << Next_hop.new('1.1.1.1')
|
54
|
+
p << Multi_exit_disc.new(222)
|
55
|
+
p << Local_pref.new(333)
|
56
|
+
p << As_path.new( :set=> [1,2,3,4], :sequence=> [11,12,13])
|
57
|
+
}
|
58
|
+
assert_equal([BGP::Origin,BGP::Next_hop,BGP::Multi_exit_disc,BGP::Local_pref,BGP::As_path], pa.has?)
|
51
59
|
end
|
52
|
-
|
60
|
+
|
53
61
|
def test_2
|
54
62
|
ss = '400101014003040a000001800404000000644005040000006440020c020500010002000300040005c0080c051f00010137003b0af50040'
|
55
63
|
assert_equal(ss, @pa.to_shex)
|
@@ -153,6 +161,49 @@ class Path_attribute_Test < Test::Unit::TestCase # :nodoc:
|
|
153
161
|
assert_equal(BGP::Mp_reach, Attr.factory(sbin, :path_id=>true).class)
|
154
162
|
end
|
155
163
|
|
164
|
+
def test_8
|
165
|
+
|
166
|
+
mp_reach = {:safi=>128, :nexthop=> ['10.0.0.1'], :path_id=> 100, :nlris=> [
|
167
|
+
{:rd=> [100,100], :prefix=> '192.168.0.0/24', :label=>101},
|
168
|
+
{:rd=> [100,100], :prefix=> '192.168.1.0/24', :label=>102},
|
169
|
+
{:rd=> [100,100], :prefix=> '192.168.2.0/24', :label=>103},
|
170
|
+
]}
|
171
|
+
|
172
|
+
mp_unreach = {:safi=>2, :nlris=>['192.168.1.0/24', '192.168.2.0/24']}
|
173
|
+
|
174
|
+
p = Path_attribute.new :local_pref=>100,
|
175
|
+
:next_hop => '10.0.0.1',
|
176
|
+
:med=>300,
|
177
|
+
:mp_reach=> mp_reach,
|
178
|
+
:mp_unreach=> mp_unreach,
|
179
|
+
:origin=> :igp,
|
180
|
+
:as_path=> {:set=> [1,2], :sequence=>[3,4], :confed_sequence=>[5,6], :confed_set=>[7,8]},
|
181
|
+
:cluster_list=> ['1.1.1.1', '2.2.2.2', '3.3.3.3'],
|
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 },
|
184
|
+
:aggregator=> { :address=>'1.1.1.1', :asn=>100 },
|
185
|
+
:originator_id=> '2.2.2.2',
|
186
|
+
:as4_aggregator=> { :asn=> 200, :address=> '4.4.4.4' },
|
187
|
+
:as4_path=> {:set=> [11,12], :sequence=>[13,14], :confed_sequence=>[15,16], :confed_set=>[17,18]},
|
188
|
+
:atomic_aggregate=> 1
|
189
|
+
|
190
|
+
assert p.has?(Origin), "Path attributes should have a Origin attr."
|
191
|
+
assert p.has?(Local_pref), "Path attributes should have a Local_pref attr."
|
192
|
+
assert p.has?(Next_hop), "Path attributes should have a Next_hop attr."
|
193
|
+
assert p.has?(Multi_exit_disc), "Path attributes should have a Multi_exit_disc attr."
|
194
|
+
assert p.has?(As_path), "Path attributes should have a As_path attr."
|
195
|
+
assert p.has?(As4_path), "Path attributes should have a As4_path attr."
|
196
|
+
assert p.has?(As4_aggregator), "Path attributes should have a As4_aggregator attr."
|
197
|
+
assert p.has?(Mp_reach), "Path attributes should have a Mp_reach attr."
|
198
|
+
assert p.has?(Mp_unreach), "Path attributes should have a Mp_unreach attr."
|
199
|
+
assert p.has?(Communities), "Path attributes should have a Communities attr."
|
200
|
+
assert p.has?(Extended_communities), "Path attributes should have a Extended_communities attr."
|
201
|
+
assert p.has?(Atomic_aggregate), "Path attributes should have a Atomic_aggregate attr."
|
202
|
+
assert p.has?(Originator_id), "Path attributes should have a Originator_id attr."
|
203
|
+
assert p.has?(Cluster_list), "Path attributes should have a Cluster_list attr."
|
204
|
+
|
205
|
+
end
|
206
|
+
|
156
207
|
def test_path_attribute_path_id_true_and_as4byte_false
|
157
208
|
path_attr = Path_attribute.new
|
158
209
|
path_attr.insert(
|
@@ -172,6 +223,6 @@ class Path_attribute_Test < Test::Unit::TestCase # :nodoc:
|
|
172
223
|
# TODO: UT: a path attr with mp_unreach w path_id
|
173
224
|
# TODO: UT: a path attr with mp_reach w path_id and as4
|
174
225
|
|
175
|
-
end
|
226
|
+
end
|
176
227
|
|
177
228
|
end
|
@@ -0,0 +1,33 @@
|
|
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
|
+
|
@@ -0,0 +1,388 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "bgp/path_attributes/tunnel_encapsulation"
|
3
|
+
require 'bgp4r'
|
4
|
+
require 'test/helpers/server'
|
5
|
+
|
6
|
+
|
7
|
+
class TestTunnelEncapsulation < Test::Unit::TestCase
|
8
|
+
include BGP
|
9
|
+
|
10
|
+
class TestColor < Test::Unit::TestCase
|
11
|
+
include BGP
|
12
|
+
def test_case_name
|
13
|
+
color = Tunnel_encapsulation::Color.new(10)
|
14
|
+
assert_equal('0408030b00000000000a',color.to_shex)
|
15
|
+
assert_equal(4, color.stlv_type)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class TestProtocolTYpe < Test::Unit::TestCase
|
20
|
+
include BGP
|
21
|
+
def test_case_name
|
22
|
+
protocol_type = Tunnel_encapsulation::Protocol_type.new :ipv4
|
23
|
+
assert_equal('02020800', protocol_type.to_shex)
|
24
|
+
assert_equal(2, protocol_type.stlv_type)
|
25
|
+
assert_equal('020286dd', Tunnel_encapsulation::Protocol_type.new(:ipv6).to_shex)
|
26
|
+
assert_equal('02028847', Tunnel_encapsulation::Protocol_type.new(:mpls).to_shex)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class TestEncapsulationGre < Test::Unit::TestCase
|
31
|
+
include BGP
|
32
|
+
def test_case_name
|
33
|
+
encap = Tunnel_encapsulation::Encap_gre.new(0x12345678)
|
34
|
+
assert_equal('010412345678', encap.to_shex)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class TestEncapsulationL2tpv3 < Test::Unit::TestCase
|
39
|
+
include BGP
|
40
|
+
def test_case_name
|
41
|
+
encap = Tunnel_encapsulation::Encap_l2tpv3.new(0x1234, '1234567890123456789')
|
42
|
+
assert_equal('010e0000123412345678901234567890', encap.to_shex)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class TestTunnel < Test::Unit::TestCase
|
47
|
+
include BGP
|
48
|
+
def test_case_name
|
49
|
+
tlv = Tunnel_encapsulation::Tunnel.new(:tunnel_type=> :l2tpv3, :session_id=> 1, :cookie=> 'ffddeeaabb11ee3344', :proto_type=> :ipv4, :color=> 1234)
|
50
|
+
assert_equal('0001001d010d00000001ffddeeaabb11ee3344020208000408030b0000000004d2', tlv.to_shex)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
def test_case_name
|
56
|
+
tunnel_encap = Tunnel_encapsulation.new
|
57
|
+
assert_equal('c01700', tunnel_encap.to_shex)
|
58
|
+
tunnel_encap.add :tunnel_type=> :l2tpv3, :session_id=> 1, :coockie=> 0x1234, :proto_type=> :ipv4, :color=> 1234
|
59
|
+
assert_equal('c01718 0001 0014 01 04 00000001 02 02 0800 04 08 030b0000000004d2'.split.join, tunnel_encap.to_shex)
|
60
|
+
tunnel_encap.add :tunnel_type=> :l2tpv3, :session_id=> 2, :coockie=> 0x1234, :proto_type=> :ipv6, :color=> 1234
|
61
|
+
assert_equal('c0173000010014010400000001020208000408030b0000000004d200010014010400000002020286dd0408030b0000000004d2'.split.join, tunnel_encap.to_shex)
|
62
|
+
tunnel_encap.add :tunnel_type=> :l2tpv3, :session_id=> 3, :coockie=> 0x1234, :proto_type=> :mpls, :color=> 1234
|
63
|
+
assert_equal('c0174800010014010400000001020208000408030b0000000004d200010014010400000002020286dd0408030b0000000004d200010014010400000003020288470408030b0000000004d2'.split.join, tunnel_encap.to_shex)
|
64
|
+
tunnel_encap.add :tunnel_type=> :gre, :key=> 0x12345678
|
65
|
+
assert_equal('c0175200010014010400000001020208000408030b0000000004d200010014010400000002020286dd0408030b0000000004d200010014010400000003020288470408030b0000000004d200020006010412345678', tunnel_encap.to_shex)
|
66
|
+
end
|
67
|
+
include BGP::TestHelpers
|
68
|
+
|
69
|
+
# def teardown
|
70
|
+
# stop_server
|
71
|
+
# end
|
72
|
+
|
73
|
+
# def test_send_update_with_tunnel_encap_attribute
|
74
|
+
#
|
75
|
+
# start_server(179)
|
76
|
+
#
|
77
|
+
# @c = Neighbor.new(4, 100, 180, '0.0.0.2', '127.0.0.1', '127.0.0.1')
|
78
|
+
# @c.start :port=> 179
|
79
|
+
# assert_equal('Established', @c.state)
|
80
|
+
# assert_equal('Established', @s.state)
|
81
|
+
#
|
82
|
+
# tunnel_encap = Tunnel_encapsulation.new
|
83
|
+
# tunnel_encap.add :tunnel_type=> :l2tpv3, :session_id=> 1, :coockie=> 0x1234, :proto_type=> :ipv4, :color=> 1234
|
84
|
+
# tunnel_encap.add :tunnel_type=> :l2tpv3, :session_id=> 2, :coockie=> 0x1234, :proto_type=> :ipv6, :color=> 1234
|
85
|
+
# tunnel_encap.add :tunnel_type=> :l2tpv3, :session_id=> 3, :coockie=> 0x1234, :proto_type=> :mpls, :color=> 1234
|
86
|
+
# tunnel_encap.add :tunnel_type=> :gre, :key=> 0x12345678
|
87
|
+
#
|
88
|
+
# u = Update.new
|
89
|
+
# u << tunnel_encap
|
90
|
+
#
|
91
|
+
# @c.send_message u
|
92
|
+
# @c.send_message u
|
93
|
+
# @c.send_message u
|
94
|
+
# @c.send_message u
|
95
|
+
# @c.send_message u
|
96
|
+
# sleep 2
|
97
|
+
#
|
98
|
+
# end
|
99
|
+
|
100
|
+
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
__END__
|
106
|
+
|
107
|
+
tunnels=[]
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
Tunnel Type
|
113
|
+
L2TPV3 =1
|
114
|
+
GRE = 2
|
115
|
+
IPIP = 7
|
116
|
+
|
117
|
+
|
118
|
+
tunnel_encap attr:
|
119
|
+
|
120
|
+
tlv type 1:
|
121
|
+
value:
|
122
|
+
stlv-type 1 : session_id + coockie
|
123
|
+
stlv-proto-type 2 : ipv4 0x0800
|
124
|
+
stlv-color 4 : 0x1234
|
125
|
+
|
126
|
+
|
127
|
+
tlv type 1:
|
128
|
+
value:
|
129
|
+
stlv-type 1: session_id + coockie
|
130
|
+
stlv-proto-type 2 : ipv6 0x86dd
|
131
|
+
stlv-color 4 : 0x1234
|
132
|
+
|
133
|
+
tlv type 1:
|
134
|
+
value:
|
135
|
+
stlv-type 1: session_id + coockie
|
136
|
+
stlv-proto-type 2 : mpls 0x8847
|
137
|
+
stlv-color 4 : 0x1234
|
138
|
+
|
139
|
+
|
140
|
+
|
141
|
+
tlv type 2: (gre)
|
142
|
+
value:
|
143
|
+
stlv-type 1: gre key (4)
|
144
|
+
|
145
|
+
|
146
|
+
|
147
|
+
|
148
|
+
|
149
|
+
|
150
|
+
sub-tlv: session_id + coockie
|
151
|
+
|
152
|
+
|
153
|
+
For example, if we want to use three L2TPv3 sessions, one carrying
|
154
|
+
IPv4 packets, one carrying IPv6 packets, and one carrying MPLS
|
155
|
+
packets, the egress router will include three TLVs of L2TPv3
|
156
|
+
encapsulation type, each specifying a different Session ID and a
|
157
|
+
different payload type. The protocol type sub-TLV for these will be
|
158
|
+
IPv4 (protocol type = 0x0800), IPv6 (protocol type = 0x86dd), and
|
159
|
+
MPLS (protocol type = 0x8847), respectively. This informs the
|
160
|
+
ingress routers of the appropriate encapsulation information to use
|
161
|
+
with each of the given protocol types. Insertion of the specified
|
162
|
+
Session ID at the ingress routers allows the egress to process the
|
163
|
+
incoming packets correctly, according to their protocol type.
|
164
|
+
|
165
|
+
|
166
|
+
|
167
|
+
TLVs
|
168
|
+
|
169
|
+
L2TPv3 type = 1
|
170
|
+
GRE = 2
|
171
|
+
IP in IP = 7
|
172
|
+
|
173
|
+
Sub-TLVs
|
174
|
+
|
175
|
+
- Encapsulation: sub-TLV type = 1
|
176
|
+
|
177
|
+
encap_l2tpv3 : session_id(4) + coockie(v)
|
178
|
+
encap_gre: key(4)
|
179
|
+
|
180
|
+
- Protocol type: sub-TLV tye =2
|
181
|
+
|
182
|
+
ethertype(2)
|
183
|
+
|
184
|
+
For example, if we want to use three L2TPv3 sessions, one carrying
|
185
|
+
IPv4 packets, one carrying IPv6 packets, and one carrying MPLS
|
186
|
+
packets, the egress router will include three TLVs of L2TPv3
|
187
|
+
encapsulation type, each specifying a different Session ID and a
|
188
|
+
different payload type. The protocol type sub-TLV for these will be
|
189
|
+
IPv4 (protocol type = 0x0800), IPv6 (protocol type = 0x86dd), and
|
190
|
+
MPLS (protocol type = 0x8847), respectively. This informs the
|
191
|
+
ingress routers of the appropriate encapsulation information to use
|
192
|
+
with each of the given protocol types. Insertion of the specified
|
193
|
+
Session ID at the ingress routers allows the egress to process the
|
194
|
+
incoming packets correctly, according to their protocol type.
|
195
|
+
|
196
|
+
Inclusion of this sub-TLV depends on the tunnel type. It MUST be
|
197
|
+
encoded for L2TPv3 tunnel type. On the other hand, the protocol type
|
198
|
+
sub-TLV is not required for IP in IP or GRE tunnels.
|
199
|
+
|
200
|
+
|
201
|
+
- Protocol type: sub-TLV type = 2
|
202
|
+
- Color: sub-TLV type = 4
|
203
|
+
|
204
|
+
|
205
|
+
|
206
|
+
4. Tunnel Encapsulation Attribute
|
207
|
+
|
208
|
+
The Tunnel Encapsulation attribute is an optional transitive
|
209
|
+
attribute that is composed of a set of Type-Length-Value (TLV)
|
210
|
+
encodings. The type code of the attribute is 23. Each TLV contains
|
211
|
+
information corresponding to a particular tunnel technology. The TLV
|
212
|
+
is structured as follows:
|
213
|
+
|
214
|
+
0 1 2 3
|
215
|
+
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
216
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
217
|
+
| Tunnel Type (2 Octets) | Length (2 Octets) |
|
218
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
219
|
+
| |
|
220
|
+
| Value |
|
221
|
+
| |
|
222
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
223
|
+
|
224
|
+
* Tunnel Type (2 octets): identifies the type of tunneling technology
|
225
|
+
being signaled. This document defines the following types:
|
226
|
+
|
227
|
+
- L2TPv3 over IP [RFC3931]: Tunnel Type = 1
|
228
|
+
- GRE [RFC2784]: Tunnel Type = 2
|
229
|
+
- IP in IP [RFC2003] [RFC4213]: Tunnel Type = 7
|
230
|
+
|
231
|
+
Unknown types are to be ignored and skipped upon receipt.
|
232
|
+
|
233
|
+
* Length (2 octets): the total number of octets of the value field.
|
234
|
+
|
235
|
+
* Value (variable): comprised of multiple sub-TLVs. Each sub-TLV
|
236
|
+
consists of three fields: a 1-octet type, 1-octet length, and zero
|
237
|
+
or more octets of value. The sub-TLV is structured as follows:
|
238
|
+
|
239
|
+
|
240
|
+
|
241
|
+
|
242
|
+
Mohapatra & Rosen Standards Track [Page 5]
|
243
|
+
|
244
|
+
RFC 5512 BGP Encapsulation SAFI and Tunnel Encapsulation April 2009
|
245
|
+
|
246
|
+
|
247
|
+
+-----------------------------------+
|
248
|
+
| Sub-TLV Type (1 Octet) |
|
249
|
+
+-----------------------------------+
|
250
|
+
| Sub-TLV Length (1 Octet) |
|
251
|
+
+-----------------------------------+
|
252
|
+
| Sub-TLV Value (Variable) |
|
253
|
+
| |
|
254
|
+
+-----------------------------------+
|
255
|
+
|
256
|
+
* Sub-TLV Type (1 octet): each sub-TLV type defines a certain
|
257
|
+
property about the tunnel TLV that contains this sub-TLV. The
|
258
|
+
following are the types defined in this document:
|
259
|
+
|
260
|
+
- Encapsulation: sub-TLV type = 1
|
261
|
+
- Protocol type: sub-TLV type = 2
|
262
|
+
- Color: sub-TLV type = 4
|
263
|
+
|
264
|
+
When the TLV is being processed by a BGP speaker that will be
|
265
|
+
performing encapsulation, any unknown sub-TLVs MUST be ignored and
|
266
|
+
skipped. However, if the TLV is understood, the entire TLV MUST
|
267
|
+
NOT be ignored just because it contains an unknown sub-TLV.
|
268
|
+
|
269
|
+
* Sub-TLV Length (1 octet): the total number of octets of the sub-TLV
|
270
|
+
value field.
|
271
|
+
|
272
|
+
* Sub-TLV Value (variable): encodings of the value field depend on
|
273
|
+
the sub-TLV type as enumerated above. The following sub-sections
|
274
|
+
define the encoding in detail.
|
275
|
+
|
276
|
+
4.1. Encapsulation Sub-TLV
|
277
|
+
|
278
|
+
The syntax and semantics of the encapsulation sub-TLV is determined
|
279
|
+
by the tunnel type of the TLV that contains this sub-TLV.
|
280
|
+
|
281
|
+
When the tunnel type of the TLV is L2TPv3 over IP, the following is
|
282
|
+
the structure of the value field of the encapsulation sub-TLV:
|
283
|
+
|
284
|
+
0 1 2 3
|
285
|
+
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
286
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
287
|
+
| Session ID (4 octets) |
|
288
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
289
|
+
| |
|
290
|
+
| Cookie (Variable) |
|
291
|
+
| |
|
292
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
293
|
+
|
294
|
+
|
295
|
+
|
296
|
+
|
297
|
+
|
298
|
+
Mohapatra & Rosen Standards Track [Page 6]
|
299
|
+
|
300
|
+
RFC 5512 BGP Encapsulation SAFI and Tunnel Encapsulation April 2009
|
301
|
+
|
302
|
+
|
303
|
+
* Session ID: a non-zero 4-octet value locally assigned by the
|
304
|
+
advertising router that serves as a lookup key in the incoming
|
305
|
+
packet's context.
|
306
|
+
|
307
|
+
* Cookie: an optional, variable length (encoded in octets -- 0 to 8
|
308
|
+
octets) value used by L2TPv3 to check the association of a received
|
309
|
+
data message with the session identified by the Session ID.
|
310
|
+
Generation and usage of the cookie value is as specified in
|
311
|
+
[RFC3931].
|
312
|
+
|
313
|
+
The length of the cookie is not encoded explicitly, but can be
|
314
|
+
calculated as (sub-TLV length - 4).
|
315
|
+
|
316
|
+
When the tunnel type of the TLV is GRE, the following is the
|
317
|
+
structure of the value field of the encapsulation sub-TLV:
|
318
|
+
|
319
|
+
0 1 2 3
|
320
|
+
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
321
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
322
|
+
| GRE Key (4 octets) |
|
323
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
324
|
+
|
325
|
+
* GRE Key: 4-octet field [RFC2890] that is generated by the
|
326
|
+
advertising router. The actual method by which the key is obtained
|
327
|
+
is beyond the scope of this document. The key is inserted into the
|
328
|
+
GRE encapsulation header of the payload packets sent by ingress
|
329
|
+
routers to the advertising router. It is intended to be used for
|
330
|
+
identifying extra context information about the received payload.
|
331
|
+
|
332
|
+
Note that the key is optional. Unless a key value is being
|
333
|
+
advertised, the GRE encapsulation sub-TLV MUST NOT be present.
|
334
|
+
|
335
|
+
4.2. Protocol Type Sub-TLV
|
336
|
+
|
337
|
+
The protocol type sub-TLV MAY be encoded to indicate the type of the
|
338
|
+
payload packets that will be encapsulated with the tunnel parameters
|
339
|
+
that are being signaled in the TLV. The value field of the sub-TLV
|
340
|
+
contains a 2-octet protocol type that is one of the types defined in
|
341
|
+
[IANA-AF] as ETHER TYPEs.
|
342
|
+
|
343
|
+
For example, if we want to use three L2TPv3 sessions, one carrying
|
344
|
+
IPv4 packets, one carrying IPv6 packets, and one carrying MPLS
|
345
|
+
packets, the egress router will include three TLVs of L2TPv3
|
346
|
+
encapsulation type, each specifying a different Session ID and a
|
347
|
+
different payload type. The protocol type sub-TLV for these will be
|
348
|
+
IPv4 (protocol type = 0x0800), IPv6 (protocol type = 0x86dd), and
|
349
|
+
MPLS (protocol type = 0x8847), respectively. This informs the
|
350
|
+
ingress routers of the appropriate encapsulation information to use
|
351
|
+
with each of the given protocol types. Insertion of the specified
|
352
|
+
Session ID at the ingress routers allows the egress to process the
|
353
|
+
incoming packets correctly, according to their protocol type.
|
354
|
+
|
355
|
+
Inclusion of this sub-TLV depends on the tunnel type. It MUST be
|
356
|
+
encoded for L2TPv3 tunnel type. On the other hand, the protocol type
|
357
|
+
sub-TLV is not required for IP in IP or GRE tunnels.
|
358
|
+
|
359
|
+
4.3. Color Sub-TLV
|
360
|
+
|
361
|
+
The color sub-TLV MAY be encoded as a way to color the corresponding
|
362
|
+
tunnel TLV. The value field of the sub-TLV contains an extended
|
363
|
+
community that is defined as follows:
|
364
|
+
|
365
|
+
4.3.1. Color Extended Community
|
366
|
+
|
367
|
+
The Color Extended Community is an opaque extended community
|
368
|
+
[RFC4360] with the following encoding:
|
369
|
+
|
370
|
+
0 1 2 3
|
371
|
+
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
372
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
373
|
+
| 0x03 | 0x0b | Reserved |
|
374
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
375
|
+
| Color Value |
|
376
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
377
|
+
|
378
|
+
The value of the high-order octet of the extended type field is 0x03,
|
379
|
+
which indicates it is transitive. The value of the low-order octet
|
380
|
+
of the extended type field for this community is 0x0b. The color
|
381
|
+
value is user defined and configured locally on the routers. The
|
382
|
+
same Color Extended Community can then be attached to the UPDATE
|
383
|
+
messages that contain payload prefixes. This way, the BGP speaker
|
384
|
+
can express the fact that it expects the packets corresponding to
|
385
|
+
these payload prefixes to be received with a particular tunnel
|
386
|
+
encapsulation header.
|
387
|
+
|
388
|
+
|