bgp4r 0.0.11 → 0.0.12

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.
Files changed (44) hide show
  1. data/bgp/common.rb +14 -13
  2. data/bgp/iana.rb +26 -1
  3. data/bgp/messages/capability.rb +3 -2
  4. data/bgp/messages/message.rb +3 -2
  5. data/bgp/messages/open.rb +2 -1
  6. data/bgp/messages/update.rb +80 -30
  7. data/bgp/neighbor/add_path_cap.rb +125 -0
  8. data/bgp/{neighbor.rb → neighbor/neighbor.rb} +64 -68
  9. data/bgp/nlris/nlri.rb +289 -15
  10. data/bgp/nlris/prefix.rb +3 -2
  11. data/bgp/nlris/vpn.rb +1 -8
  12. data/bgp/optional_parameters/add_path.rb +160 -0
  13. data/bgp/optional_parameters/capabilities.rb +1 -0
  14. data/bgp/optional_parameters/capability.rb +6 -0
  15. data/bgp/optional_parameters/graceful_restart.rb +6 -6
  16. data/bgp/optional_parameters/optional_parameter.rb +1 -0
  17. data/bgp/path_attributes/as_path.rb +1 -1
  18. data/bgp/path_attributes/attribute.rb +12 -5
  19. data/bgp/path_attributes/mp_reach.rb +142 -96
  20. data/bgp/path_attributes/mp_unreach.rb +73 -20
  21. data/bgp/path_attributes/path_attribute.rb +28 -5
  22. data/bgp4r.gemspec +21 -6
  23. data/bgp4r.rb +1 -1
  24. data/examples/unit-testing/malformed_update.rb +2 -1
  25. data/examples/unit-testing/test.rb +82 -0
  26. data/examples/unit-testing/test1.rb +82 -0
  27. data/examples/unit-testing/test2.rb +44 -0
  28. data/test/common_test.rb +7 -0
  29. data/test/helpers/server.rb +20 -0
  30. data/test/iana_test.rb +43 -0
  31. data/test/messages/open_test.rb +7 -2
  32. data/test/messages/update_test.rb +133 -36
  33. data/test/neighbor/add_path_cap_test.rb +54 -0
  34. data/test/neighbor/neighbor_test.rb +161 -0
  35. data/test/nlris/ext_nlri_test.rb +25 -60
  36. data/test/nlris/nlri_test.rb +93 -115
  37. data/test/optional_parameters/add_path_test.rb +53 -0
  38. data/test/optional_parameters/capability_test.rb +10 -0
  39. data/test/optional_parameters/graceful_restart_test.rb +1 -0
  40. data/test/path_attributes/mp_reach_test.rb +206 -8
  41. data/test/path_attributes/mp_unreach_test.rb +113 -5
  42. data/test/path_attributes/path_attribute_test.rb +34 -2
  43. metadata +20 -7
  44. data/test/neighbor_test.rb +0 -62
@@ -20,133 +20,111 @@
20
20
  # along with BGP4R. If not, see <http://www.gnu.org/licenses/>.
21
21
  #++
22
22
 
23
+ require 'test/unit'
23
24
  require 'bgp/nlris/nlris'
24
- # require 'bgp/nlris/vpn'
25
- # require 'bgp/nlris/inet'
26
- # require 'bgp/nlris/labeled'
27
25
 
28
- require 'test/unit'
29
- class NLRI_Ip4_Test < Test::Unit::TestCase
26
+ class Nlri_Test < Test::Unit::TestCase
30
27
  include BGP
31
- def test_1
32
- el = Nlri::Ip4.new('20.0.0.0/16')
33
- el2 = Nlri::Ip4.new(el)
34
- assert_equal(el2.to_shex, el.to_shex)
35
- assert_equal(Nlri::Ip4, el2.class)
36
- assert_equal('0f1400', Nlri::Ip4.new('20.0.0.0/15').to_shex)
37
- assert_equal('101400', Nlri::Ip4.new('20.0.0.0/16').to_shex)
38
- assert_equal('11140000', Nlri::Ip4.new('20.0.0.0/17').to_shex)
39
- assert_equal('17140000', Nlri::Ip4.new('20.0.0.0/23').to_shex)
40
- assert_equal('18140000', Nlri::Ip4.new('20.0.0.0/24').to_shex)
41
- assert_equal('1914000000', Nlri::Ip4.new('20.0.0.0/25').to_shex)
42
- assert_equal('20.0.0.0/25', Nlri::Ip4.new('20.0.0.0/25').to_s)
28
+ def test_ip4_element
29
+ el = Base_nlri::Ip4.new('10.0.0.8/9')
30
+ assert_equal('10.0.0.0/9', el.to_s)
31
+ assert_equal('070a', Base_nlri::Ip4.new('10.0.0.8/7').to_shex)
32
+ assert_equal('080a', Base_nlri::Ip4.new('10.0.0.8/8').to_shex)
33
+ assert_equal('090a00', Base_nlri::Ip4.new('10.0.0.8/9').to_shex)
34
+ assert_equal('0f0a00', Base_nlri::Ip4.new('10.0.0.8/15').to_shex)
35
+ assert_equal('100a00', Base_nlri::Ip4.new('10.0.0.8/16').to_shex)
36
+ assert_equal('110a0000', Base_nlri::Ip4.new('10.0.0.8/17').to_shex)
37
+ assert_equal('170a0000', Base_nlri::Ip4.new('10.0.0.8/23').to_shex)
38
+ assert_equal('180a0000', Base_nlri::Ip4.new('10.0.0.8/24').to_shex)
39
+ assert_equal('190a000000', Base_nlri::Ip4.new('10.0.0.8/25').to_shex)
40
+ assert_equal('200a000008', Base_nlri::Ip4.new('10.0.0.8/32').to_shex)
43
41
  end
44
-
45
- def test_2
46
- assert_equal('0f1400',Nlri::Ip4.new(['0f1400'].pack('H*')).to_shex)
47
- assert_equal('101400',Nlri::Ip4.new(['101400'].pack('H*')).to_shex)
48
- assert_equal('11140000',Nlri::Ip4.new(['11140000'].pack('H*')).to_shex)
49
- assert_equal('18140000',Nlri::Ip4.new(['18140000'].pack('H*')).to_shex)
50
- assert_equal('1914000000',Nlri::Ip4.new(['1914000000'].pack('H*')).to_shex)
51
- s = ['0f140010140011140000'].pack('H*')
52
- ip4 = Nlri::Ip4.new(s)
53
- assert_equal('10140011140000', s.unpack('H*')[0])
54
- ip4 = Nlri::Ip4.new(s)
55
- assert_equal('11140000', s.unpack('H*')[0])
56
- ip4 = Nlri::Ip4.new(s)
57
- assert_equal('', s.unpack('H*')[0])
58
-
42
+ def test_ext_element
43
+ assert_equal('ID: 100, 10.0.0.0/7', Base_nlri::Ext_Nlri_element.new(100, '10.0.0.0/7').to_s)
44
+ assert_equal('00000064070a', Base_nlri::Ext_Nlri_element.new(100, '10.0.0.0/7').to_shex)
45
+ assert_equal('00000064190a000000', Base_nlri::Ext_Nlri_element.new(100, '10.0.0.0/25').to_shex)
46
+ sbin = Base_nlri::Ext_Nlri_element.new(100, '10.0.0.0/25').encode
47
+ assert_equal('00000064190a000000', Base_nlri::Ext_Nlri_element.new(sbin).to_shex)
48
+ sbin = ['000000650764000000660766000000670766000000680768000000690869'].pack('H*')
49
+ Base_nlri::Ext_Nlri_element.new(sbin)
50
+ assert_equal('000000660766000000670766000000680768000000690869', sbin.unpack('H*')[0])
51
+ Base_nlri::Ext_Nlri_element.new(sbin)
52
+ assert_equal('000000670766000000680768000000690869', sbin.unpack('H*')[0])
53
+ Base_nlri::Ext_Nlri_element.new(sbin)
54
+ assert_equal('000000680768000000690869', sbin.unpack('H*')[0])
55
+ Base_nlri::Ext_Nlri_element.new(sbin)
56
+ assert_equal('000000690869', sbin.unpack('H*')[0])
57
+ Base_nlri::Ext_Nlri_element.new(sbin)
58
+ assert_equal('', sbin.unpack('H*')[0])
59
+
60
+ # sbin=['0f140010140011140000'].pack('H*')
61
+ # Base_nlri::Nlri_element.new(sbin)
62
+ # assert_equal('', sbin.unpack('H*')[0])
63
+
64
+
59
65
  end
60
- end
61
- class NLRI_Ip6_Test < Test::Unit::TestCase
62
- include BGP
63
- def test_1
64
- assert_equal('0410',Nlri::Ip6.new('1111:2222:3333:4444:5555:6666:7777:8888/4').to_shex)
65
- assert_equal('0510',Nlri::Ip6.new('1111:2222:3333:4444:5555:6666:7777:8888/5').to_shex)
66
- assert_equal('0710',Nlri::Ip6.new('1111:2222:3333:4444:5555:6666:7777:8888/7').to_shex)
67
- assert_equal('0811',Nlri::Ip6.new('1111:2222:3333:4444:5555:6666:7777:8888/8').to_shex)
68
- assert_equal('091100',Nlri::Ip6.new('1111:2222:3333:4444:5555:6666:7777:8888/9').to_shex)
69
- assert_equal('30111122223333',Nlri::Ip6.new('1111:2222:3333:4444:5555:6666:7777:8888/48').to_shex)
70
- assert_equal('3111112222333300',Nlri::Ip6.new('1111:2222:3333:4444:5555:6666:7777:8888/49').to_shex)
71
- assert_equal('401111222233334444',Nlri::Ip6.new('1111:2222:3333:4444:5555:6666:7777:8888/64').to_shex)
72
- assert_equal('41111122223333444400',Nlri::Ip6.new('1111:2222:3333:4444:5555:6666:7777:8888/65').to_shex)
73
- assert_equal('7f11112222333344445555666677778888',Nlri::Ip6.new('1111:2222:3333:4444:5555:6666:7777:8888/127').to_shex)
74
- assert_equal('8011112222333344445555666677778888',Nlri::Ip6.new('1111:2222:3333:4444:5555:6666:7777:8888/128').to_shex)
75
- end
76
- end
77
-
78
- class Withdrawn_Test < Test::Unit::TestCase
79
- include BGP
80
- def test_1
81
- nlri1 = Withdrawn.new
82
- assert_equal('0000', nlri1.to_shex)
83
- nlri1 << Withdrawn::Ip4.new('20.0.0.0/15')
66
+ def test_nlri
67
+ nlri1 = Nlri.new
68
+ nlri1 << Base_nlri::Ip4.new('20.0.0.0/15')
84
69
  nlri1 << '20.0.0.0/17'
85
70
  nlri1 << '20.0.0.0/24'
86
71
  s = '0f140010140011140000'
87
- nlri2 = Withdrawn.new([s].pack('H*'))
88
- assert_equal('000a0f140010140011140000', nlri2.to_shex)
89
- assert_equal('000a0f140010140011140000', nlri2.to_shex(true))
90
- assert_equal('0f140010140011140000', nlri2.to_shex(false))
72
+ nlri2 = Nlri.new([s].pack('H*'))
73
+ assert_equal('0f140010140011140000', nlri2.to_shex)
74
+ assert_raise(ArgumentError) { nlri2.to_shex(true) }
91
75
  assert_equal(3,nlri2.nlris.size)
92
76
  end
93
- end
94
-
95
- class Prefix_Test < Test::Unit::TestCase
96
- include BGP
97
- def test_1
98
- assert_equal('::/128',Prefix.new.to_s)
99
- assert_equal(2,Prefix.new.afi)
100
- assert_equal('192.168.0.0/16',Prefix.new('192.168.0.0/16').to_s)
101
- assert_equal(1,Prefix.new('192.168.0.0/16').afi)
102
- assert(Prefix.new('192.168.0.0/16').ipv4?)
103
- assert_equal('10c0a8',Prefix.new('192.168.0.0/16').to_shex)
104
- assert_equal('402009000400040000',Prefix.new('2009:4:4::/64').to_shex)
105
- assert Prefix.new('2009:4:4::/64').ipv6?
106
- assert_equal('2009:4:4::/64',Prefix.new('2009:4:4::/64').to_s)
77
+ def test_nlris
78
+ nlri = Nlri.new
79
+ nlri << [101, '101.0.0.0/8']
80
+ nlri << [102, '102.0.0.0/8']
81
+ nlri << [103, '103.0.0.0/8']
82
+ nlri << { :path_id=> 104, :nlri_element=> '104.0.0.0/8' }
83
+ nlri << { :path_id=> 105, :nlri_element=> '105.0.0.0/8' }
84
+ assert_match(/ID: 102, 102.0/, nlri.to_s)
85
+ assert_match(/ID: 104, 104.0/, nlri.to_s)
86
+ assert_match(/ID: 105, 105.0/, nlri.to_s)
107
87
  end
108
- end
109
-
110
- class Vpn_Test < Test::Unit::TestCase
111
- include BGP
112
- def test_1
113
- assert_equal('5800000001000000010a0000', Vpn.new('10.0.0.1/24', Rd.new(1,1)).to_shex)
114
- assert_equal('00000001000000010a0000', Vpn.new('10.0.0.1/24', Rd.new(1,1)).to_shex(false))
115
- assert_equal('RD=1:1, IPv4=10.0.0.0/24', Vpn.new('10.0.0.1/24', Rd.new(1,1)).to_s)
116
- assert_equal(88, Vpn.new('10.0.0.1/24', Rd.new(1,1)).bit_length)
117
- assert_equal(1,Vpn.new('10.0.0.1/24', Rd.new(1,1)).afi)
118
- assert_equal(true,Vpn.new('10.0.0.1/24', Rd.new(1,1)).ipv4?)
119
- assert_equal(false,Vpn.new('10.0.0.1/24', Rd.new(1,1)).ipv6?)
120
- assert_equal(2,Vpn.new('2009:4:5::/105', Rd.new(1,1)).afi)
121
- assert_equal(false,Vpn.new('2009:4:5::/105', Rd.new(1,1)).ipv4?)
122
- assert_equal(true,Vpn.new('2009:4:5::/105', Rd.new(1,1)).ipv6?)
123
- assert_equal('RD=1:1, IPv6=2009:4:5::/105',Vpn.new('2009:4:5::/105', Rd.new(1,1)).to_s)
124
- assert_equal('700000000100000001200900040005',Vpn.new('2009:4:5::/48', Rd.new(1,1)).to_shex)
125
- assert_equal(169,Vpn.new('2009:4:5::/105', Rd.new(1,1)).bit_length)
88
+ def test_withdrawns_ext
89
+ nlri = Withdrawn.new
90
+ nlri << [101, '101.0.0.0/8']
91
+ nlri << [102, '102.0.0.0/8']
92
+ nlri << [103, '103.0.0.0/8']
93
+ nlri << { :path_id=> 104, :nlri_element=> '104.0.0.0/8' }
94
+ nlri << { :path_id=> 105, :nlri_element=> '105.0.0.0/8' }
95
+ assert_match(/ID: 102, 102.0/, nlri.to_s)
96
+ assert_match(/ID: 104, 104.0/, nlri.to_s)
97
+ assert_match(/ID: 105, 105.0/, nlri.to_s)
126
98
  end
127
- def test_2
128
- vpn = Vpn.new(['5800000001000000010a0000'].pack('H*'))
129
- assert_equal( '5800000001000000010a0000', vpn.to_shex)
130
- assert_equal( '00000001000000010a0000', vpn.to_shex(false))
131
- vpn = Vpn.new(['700000000100000001200900040005'].pack('H*'), 2)
132
- assert_equal( '700000000100000001200900040005', vpn.to_shex)
133
- vpn = Vpn.new(['700000000100000001200900040005'].pack('H*'), 2)
134
- assert_equal( '700000000100000001200900040005', vpn.to_shex)
99
+ def test_withdrawns
100
+ nlri = Withdrawn.new
101
+ nlri << '101.0.0.0/8'
102
+ nlri << '102.0.0.0/8'
103
+ nlri << '103.0.0.0/8'
104
+ assert_equal('086508660867', nlri.to_shex)
105
+ assert_match(/102.0/, nlri.to_s)
106
+ assert_match(/103.0/, nlri.to_s)
107
+ nlri1 = Withdrawn.new nlri.encode[2..-1].is_packed
108
+ nlri2 = Nlri.factory nlri.encode[2..-1].is_packed, 1, 1
109
+ assert_equal(nlri1.to_shex, nlri2.to_shex)
110
+
111
+ # 16d403741755c68816d40830
135
112
  end
136
- end
137
-
138
- class Labeled_Test < Test::Unit::TestCase
139
- include BGP
140
- def test_1
141
- assert_equal('Label Stack=1,2,3 (bottom) 10.0.0.0/24', Labeled.new(Prefix.new('10.0.0.1/24'),1,2,3).to_s)
142
- assert_equal(3*24+24, Labeled.new(Prefix.new('10.0.0.1/24'),1,2,3).bit_length)
143
- assert_equal('600000100000200000310a0000', Labeled.new(Prefix.new('10.0.0.1/24'),1,2,3).to_shex)
144
- assert_equal('6b0006510000006400000064c0a800',Labeled.new(Vpn.new('192.168.0.0/19', Rd.new(100,100)),101).to_shex)
145
- assert_equal('d8000651000000640000006420090004000500000000000000000001',Labeled.new(Vpn.new('2009:4:5::1', Rd.new(100,100)),101).to_shex)
146
- assert_equal(24+64+128,Labeled.new(Vpn.new('2009:4:5::1', Rd.new(100,100)),101).bit_length)
147
- assert_equal(24+64+64,Labeled.new(Vpn.new('2009:4:5::1/64', Rd.new(100,100)),101).bit_length)
148
- assert_equal(24*3+64+48,Labeled.new(Vpn.new('2009:4:5::1/48', Rd.new(100,100)),101,102,103).bit_length)
149
- assert_equal('9800065100000064000000642009000400050000',Labeled.new(Vpn.new('2009:4:5::1/64', Rd.new(100,100)),101).to_shex)
150
- assert_equal('9800065100000064000000642009000400050000',Labeled.new(['9800065100000064000000642009000400050000'].pack('H*'),2).to_shex)
113
+
114
+ def test_factory_ip4_elements
115
+ s = '07640766076607680869'
116
+ nlri = Nlri.factory([s].pack('H*'),1,1)
117
+ s = '0f140010140011140000'
118
+ nlri = Nlri.factory([s].pack('H*'),1,1)
119
+ assert_equal("20.0.0.0/15\n20.0.0.0/16\n20.0.0.0/17", nlri.to_s)
120
+ assert_equal(s, nlri.to_shex)
121
+ end
122
+ def test_factory_ip4_elements_extented
123
+ s = '000000650764000000660766000000670766000000680768000000690869'
124
+ nlri = Nlri.factory([s].pack('H*'),1,1,true)
125
+ assert_match(/ID: 102, 102.0/, nlri.to_s)
126
+ assert_match(/ID: 104, 104.0/, nlri.to_s)
127
+ assert_match(/ID: 105, 105.0/, nlri.to_s)
128
+ assert_equal(s, nlri.to_shex)
151
129
  end
152
130
  end
@@ -0,0 +1,53 @@
1
+ #--
2
+ # Copyright 2011 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
+ require "bgp/optional_parameters/add_path"
26
+
27
+ class TestBgpOptionalParametersAddPath < Test::Unit::TestCase
28
+ include BGP::OPT_PARM::CAP
29
+ def test_1
30
+ ap = Add_path.new
31
+ ap.add( :send, 1, 1)
32
+ assert_equal '0206450400010101', ap.to_shex
33
+ ap.add( :recv, 2, 128)
34
+ assert_equal '020a45080001010100028002', ap.to_shex
35
+ ap.add :send_and_receive, :ipv6, :unicast
36
+ assert_equal '020e450c000101010002010300028002', ap.to_shex
37
+ end
38
+ def test_2
39
+ ap = Add_path.new
40
+ ap.add( :send, 1, 1)
41
+ ap.add( :send, 2, 128)
42
+ ap.add( :send_and_recv, 2, 128)
43
+ assert ap.send? 1, 1
44
+ assert ! ap.send?( 1, 2)
45
+ assert ap.send?( 2, 128)
46
+ assert ap.recv?( 2, 128)
47
+ end
48
+ def test_3
49
+ ap1 = Add_path.new_array [[1, 1 ,2 ], [2, 10, 10]]
50
+ ap2 = Add_path.new_array [[:send, :ipv4 ,:multicast], [:recv, 10, 10]]
51
+ assert_equal ap1.to_shex, ap2.to_shex
52
+ end
53
+ end
@@ -38,6 +38,11 @@ class Capability_Test < Test::Unit::TestCase
38
38
  cap = Capability.factory([s].pack('H*'))
39
39
  assert_instance_of(Graceful_restart, cap)
40
40
  end
41
+ def test_factory_add_path
42
+ s = '020e450c000101010002800200020103'
43
+ cap = Capability.factory([s].pack('H*'))
44
+ assert_instance_of(Add_path, cap)
45
+ end
41
46
  def test_factory_as4
42
47
  s = '0206410400000064'
43
48
  cap = Capability.factory([s].pack('H*'))
@@ -61,6 +66,11 @@ class Capability_Test < Test::Unit::TestCase
61
66
  cap = Capability.factory([s].pack('H*'))
62
67
  assert_equal(Orf, cap.class)
63
68
  end
69
+ def test_factory_add_path
70
+ s = '020e450c000101010002800200020103'
71
+ cap = Capability.factory([s].pack('H*'))
72
+ assert_instance_of(Add_path, cap)
73
+ end
64
74
  def test_factory_unknown
65
75
  s = '0207640576616c7565'
66
76
  cap = Capability.factory([s].pack('H*'))
@@ -1,5 +1,6 @@
1
1
  require "test/unit"
2
2
  require "bgp/optional_parameters/graceful_restart"
3
+ require 'bgp/common'
3
4
 
4
5
  class TestBgpOptionalParametersGracefulCapRestart < Test::Unit::TestCase
5
6
  include BGP::OPT_PARM::CAP
@@ -72,36 +72,234 @@ class Mp_reach_Test < Test::Unit::TestCase
72
72
  #puts mpr
73
73
  end
74
74
  def test_6
75
- mpr = Mp_reach.new(:safi=>2, :nexthop=> ['2009:9:19::1/128'], :prefix=> ['2009:1::/64', '2009:2::/64', '2009:3::/64'])
75
+ mpr = Mp_reach.new(:safi=>2, :nexthop=> ['2009:9:19::1/128'], :nlris=> ['2009:1::/64', '2009:2::/64', '2009:3::/64'])
76
76
  assert_equal("\n AFI IPv6 (2), SAFI Multicast (2)\n nexthop: 2009:9:19::1\n 2009:1::/64\n 2009:2::/64\n 2009:3::/64", mpr.mp_reach)
77
77
  assert_equal(mpr.to_shex, Mp_reach.new(mpr.encode).to_shex)
78
- mpr = Mp_reach.new(:safi=>1, :nexthop=> ['10.0.0.1','10.0.0.2'], :prefix=> '192.168.0.0/24')
78
+ mpr = Mp_reach.new(:safi=>1, :nexthop=> ['10.0.0.1','10.0.0.2'], :nlris=> '192.168.0.0/24')
79
79
  assert_equal("\n AFI IPv4 (1), SAFI Unicast (1)\n nexthop: 10.0.0.1, 10.0.0.2\n 192.168.0.0/24", mpr.mp_reach)
80
80
  assert_equal(mpr.to_shex, Mp_reach.new(mpr.encode).to_shex)
81
- mpr = Mp_reach.new(:safi=>4, :nexthop=> ['10.0.0.1','10.0.0.2'], :nlri=> {:prefix=> '192.168.0.0/24', :label=>101} )
81
+ mpr = Mp_reach.new(:safi=>4, :nexthop=> ['10.0.0.1','10.0.0.2'], :nlris=> {:prefix=> '192.168.0.0/24', :label=>101} )
82
82
  assert_equal("\n AFI IPv4 (1), SAFI Labeled NLRI (4)\n nexthop: 10.0.0.1, 10.0.0.2\n Label Stack=101 (bottom) 192.168.0.0/24", mpr.mp_reach)
83
83
  assert_equal(mpr.to_shex, Mp_reach.new(mpr.encode).to_shex)
84
- mpr = Mp_reach.new(:safi=>128, :nexthop=> ['10.0.0.1','10.0.0.2'], :nlri=> {:rd=> [100,100], :prefix=> '192.168.0.0/24', :label=>101})
84
+ mpr = Mp_reach.new(:safi=>128, :nexthop=> ['10.0.0.1','10.0.0.2'], :nlris=> {:rd=> [100,100], :prefix=> '192.168.0.0/24', :label=>101})
85
85
  assert_equal("\n AFI IPv4 (1), SAFI Labeled VPN Unicast (128)\n nexthop: 10.0.0.1, 10.0.0.2\n Label Stack=101 (bottom) RD=100:100, IPv4=192.168.0.0/24", mpr.mp_reach)
86
86
  assert_equal(mpr.to_shex, Mp_reach.new(mpr.encode).to_shex)
87
- mpr = Mp_reach.new(:safi=>128, :nexthop=> ['10.0.0.1','10.0.0.2'], :nlri=> {:rd=> Rd.new(100,100), :prefix=> Prefix.new('192.168.0.0/24'), :label=>101})
87
+ mpr = Mp_reach.new(:safi=>128, :nexthop=> ['10.0.0.1','10.0.0.2'], :nlris=> {:rd=> Rd.new(100,100), :prefix=> Prefix.new('192.168.0.0/24'), :label=>101})
88
88
  assert_equal("\n AFI IPv4 (1), SAFI Labeled VPN Unicast (128)\n nexthop: 10.0.0.1, 10.0.0.2\n Label Stack=101 (bottom) RD=100:100, IPv4=192.168.0.0/24", mpr.mp_reach)
89
89
  assert_equal(mpr.to_shex, Mp_reach.new(mpr.encode).to_shex)
90
90
  end
91
91
  def test_7
92
- mpr = Mp_reach.new(:safi=>2, :nexthop=> '2009:9:19::1/128', :prefix=> [
92
+ mpr = Mp_reach.new(:safi=>2, :nexthop=> '2009:9:19::1/128', :nlris=> [
93
93
  '2009:1::/64', '2009:2::/64', '2009:3::/64', '2009:4::/64', '2009:5::/64', '2009:6::/64'])
94
94
  assert_equal("\n AFI IPv6 (2), SAFI Multicast (2)\n nexthop: 2009:9:19::1\n 2009:1::/64\n 2009:2::/64\n 2009:3::/64\n 2009:4::/64\n 2009:5::/64\n 2009:6::/64", mpr.mp_reach)
95
- mpr = Mp_reach.new(:safi=>1, :nexthop=> '10.0.0.1', :prefix=> [
95
+ mpr = Mp_reach.new(:safi=>1, :nexthop=> '10.0.0.1', :nlris=> [
96
96
  '192.168.0.0/24', '192.168.1.0/24', '192.168.2.0/24', '192.168.3.0/24', '192.168.4.0/24', '192.168.5.0/24'])
97
97
  assert_equal("\n AFI IPv4 (1), SAFI Unicast (1)\n nexthop: 10.0.0.1\n 192.168.0.0/24\n 192.168.1.0/24\n 192.168.2.0/24\n 192.168.3.0/24\n 192.168.4.0/24\n 192.168.5.0/24", mpr.mp_reach)
98
98
  end
99
99
  def test_8
100
- mpr = Mp_reach.new(:safi=>1, :nexthop=> '10.0.0.1', :prefix=> [
100
+ mpr = Mp_reach.new(:safi=>1, :nexthop=> '10.0.0.1', :nlris=> [
101
101
  '192.168.0.0/24', '192.168.1.0/24', '192.168.2.0/24', '192.168.3.0/24', '192.168.4.0/24', '192.168.5.0/24'])
102
102
  assert_equal(Mp_unreach,mpr.new_unreach.class)
103
103
  mpr2 = Mp_reach.new(mpr)
104
104
  assert_equal(mpr.encode, mpr2.encode)
105
105
  assert_equal(Mp_unreach, Mp_unreach.new(mpr.new_unreach).class)
106
106
  end
107
+
108
+ def test_afi_1
109
+ mpr1 = Mp_reach.new(:safi=>1, :nexthop=> ['10.0.0.1'], :nlris=> '192.168.1.0/24')
110
+ mpr2 = Mp_reach.new(:safi=>1, :nexthop=> ['10.0.0.1'], :nlris=> '192.168.1.0/24', :path_id=>100)
111
+ mpr3 = Mp_reach.new(:safi=>2, :nexthop=> ['10.0.0.1'], :nlris=> ['192.168.1.0/24','192.168.2.0/24'])
112
+ mpr4 = Mp_reach.new(:safi=>2, :nexthop=> ['10.0.0.1'], :nlris=> ['192.168.1.0/24','192.168.2.0/24'], :path_id=>100)
113
+ mpr5 = Mp_reach.new(:safi=>1, :nexthop=> ['10.0.0.1'], :nlris=> [
114
+ {:prefix=> '192.168.1.0/24', :path_id=> 100},
115
+ {:prefix=> '192.168.2.0/24', :path_id=> 101},
116
+ {:prefix=> '192.168.2.0/24', :path_id=> 102},
117
+ ])
118
+
119
+ assert_equal('800e0d000101040a0000010018c0a801', mpr1.to_shex)
120
+ assert_equal('800e11000101040a000001000000006418c0a801', mpr2.to_shex)
121
+ assert_equal attr_len(mpr1)+4, attr_len(mpr2)
122
+
123
+ assert_equal('800e11000102040a0000010018c0a80118c0a802', mpr3.to_shex)
124
+ assert_equal('800e19000102040a000001000000006418c0a8010000006418c0a802', mpr4.to_shex)
125
+ assert_equal attr_len(mpr3)+8, attr_len(mpr4)
126
+
127
+ assert_equal('800e21000101040a000001000000006418c0a8010000006518c0a8020000006618c0a802', mpr5.to_shex)
128
+
129
+ end
130
+
131
+ def test_afi_1_ntop
132
+
133
+ s = '800e11000102040a0000010018c0a80118c0a802'
134
+ sbin = [s].pack('H*')
135
+ mpr = Mp_reach.new(sbin, false)
136
+ assert_match(/^\s+192.168.1.0\/24/, mpr.to_s)
137
+ assert_match(/^\s+192.168.1.0\/24/, mpr.to_s)
138
+
139
+ s = '800e19000102040a000001000000006418c0a8010000006418c0a802'
140
+ sbin = [s].pack('H*')
141
+ mpr = Mp_reach.new(sbin, true)
142
+ assert_match(/^\s+ID=100, 192.168.1.0\/24/, mpr.to_s)
143
+ assert_match(/^\s+ID=100, 192.168.1.0\/24/, mpr.to_s)
144
+ end
145
+
146
+
147
+ def test_afi_2
148
+ mpr1 = Mp_reach.new(:safi=>1, :nexthop=> ['2011:1:7::1'], :nlris=> '2011:1::/32')
149
+ mpr2 = Mp_reach.new(:safi=>1, :nexthop=> ['2011:1:7::1'], :nlris=> '2011:1::/32', :path_id=>100)
150
+ mpr3 = Mp_reach.new(:safi=>2, :nexthop=> ['2011:1:7::1'], :nlris=> ['2011:1::/32','2011:2::/32'])
151
+ mpr4 = Mp_reach.new(:safi=>2, :nexthop=> ['2011:1:7::1'], :nlris=> ['2011:1::/32','2011:2::/32'], :path_id=>100)
152
+ mpr5 = Mp_reach.new(:safi=>1, :nexthop=> ['2011:1:7::1'], :nlris=> [
153
+ {:prefix=> '2011:1::/32', :path_id=> 100},
154
+ {:prefix=> '2011:2::/32', :path_id=> 101},
155
+ {:prefix=> '2011:3::/32', :path_id=> 102},
156
+ ])
157
+
158
+ assert_equal('800e1a0002011020110001000700000000000000000001002020110001', mpr1.to_shex)
159
+ assert_equal('800e1e000201102011000100070000000000000000000100000000642020110001', mpr2.to_shex)
160
+ assert_equal attr_len(mpr1)+4, attr_len(mpr2)
161
+
162
+ assert_equal('800e1f00020210201100010007000000000000000000010020201100012020110002', mpr3.to_shex)
163
+ assert_equal('800e27000202102011000100070000000000000000000100000000642020110001000000642020110002', mpr4.to_shex)
164
+ assert_equal attr_len(mpr3)+8, attr_len(mpr4)
165
+
166
+ assert_equal('800e30000201102011000100070000000000000000000100000000642020110001000000652020110002000000662020110003', mpr5.to_shex)
167
+
168
+
169
+ end
170
+
171
+ def test_afi_2_ntop
172
+
173
+ s = '800e1f00020210201100010007000000000000000000010020201100012020110002'
174
+ sbin = [s].pack('H*')
175
+ mpr = Mp_reach.new(sbin, false)
176
+ assert_match(/^\s+2011:1::\/32/, mpr.to_s)
177
+ assert_match(/^\s+2011:2::\/32/, mpr.to_s)
178
+
179
+ s = '800e27000202102011000100070000000000000000000100000000642020110001000000642020110002'
180
+ sbin = [s].pack('H*')
181
+ mpr = Mp_reach.new(sbin, true)
182
+ assert_match(/^\s+ID=100, 2011:1::\/32/, mpr.to_s)
183
+ assert_match(/^\s+ID=100, 2011:2::\/32/, mpr.to_s)
184
+ end
185
+
186
+ def test_safi_4
187
+ mpr1 = Mp_reach.new(:safi=>4, :nexthop=> ['10.0.0.1'], :nlris=> {:prefix=> '192.168.0.0/24', :label=>101} )
188
+ mpr2 = Mp_reach.new(:safi=>4, :nexthop=> ['10.0.0.1'], :nlris=> {:prefix=> '192.168.0.0/24', :label=>101, :path_id=>100} )
189
+ mpr3 = Mp_reach.new(:safi=>4, :nexthop=> ['10.0.0.1'], :nlris=> [
190
+ {:prefix=> '192.168.0.0/24', :label=>101,},
191
+ {:prefix=> '192.168.1.0/24', :label=>102,},
192
+ {:prefix=> '192.168.1.0/24', :label=>103,}
193
+ ])
194
+ mpr4 = Mp_reach.new(:safi=>4, :nexthop=> ['10.0.0.1'], :path_id=> 100, :nlris=> [
195
+ {:prefix=> '192.168.0.0/24', :label=>101,},
196
+ {:prefix=> '192.168.1.0/24', :label=>102,},
197
+ {:prefix=> '192.168.1.0/24', :label=>103,}
198
+ ])
199
+ mpr5 = Mp_reach.new(:safi=>4, :nexthop=> ['10.0.0.1'], :nlris=> [
200
+ {:prefix=> '192.168.0.0/24', :label=>101, :path_id=>100},
201
+ {:prefix=> '192.168.1.0/24', :label=>102, :path_id=>101},
202
+ {:prefix=> '192.168.1.0/24', :label=>103, :path_id=>103},
203
+ ])
204
+
205
+ assert_equal('800e10000104040a0000010030000651c0a800', mpr1.to_shex)
206
+ assert_equal('800e14000104040a000001000000006430000651c0a800', mpr2.to_shex)
207
+ assert_equal attr_len(mpr1)+4, attr_len(mpr2)
208
+
209
+ assert_equal('800e1e000104040a0000010030000651c0a80030000661c0a80130000671c0a801', mpr3.to_shex)
210
+ assert_equal('800e2a000104040a000001000000006430000651c0a8000000006430000661c0a8010000006430000671c0a801', mpr4.to_shex)
211
+ assert_equal attr_len(mpr3)+12, attr_len(mpr4)
212
+
213
+ assert_equal('800e2a000104040a000001000000006430000651c0a8000000006530000661c0a8010000006730000671c0a801', mpr5.to_shex)
214
+
215
+ end
216
+
217
+ def test_safi_128
218
+ mpr1 = Mp_reach.new :safi=>128, :nexthop=> ['10.0.0.1'], :nlris=> {:rd=> [100,100], :prefix=> '192.168.0.0/24', :label=>101}
219
+ mpr2 = Mp_reach.new :safi=>128, :nexthop=> ['10.0.0.1'], :nlris=> {:rd=> [100,100], :prefix=> '192.168.0.0/24', :label=>101, :path_id=>100}
220
+ mpr3 = Mp_reach.new :safi=>128, :nexthop=> ['10.0.0.1'], :nlris=> [
221
+ {:rd=> [100,100], :prefix=> '192.168.0.0/24', :label=>101},
222
+ {:rd=> [100,100], :prefix=> '192.168.1.0/24', :label=>102},
223
+ {:rd=> [100,100], :prefix=> '192.168.2.0/24', :label=>103},
224
+ ]
225
+ mpr4 = Mp_reach.new :safi=>128, :nexthop=> ['10.0.0.1'], :path_id=> 100, :nlris=> [
226
+ {:rd=> [100,100], :prefix=> '192.168.0.0/24', :label=>101},
227
+ {:rd=> [100,100], :prefix=> '192.168.1.0/24', :label=>102},
228
+ {:rd=> [100,100], :prefix=> '192.168.2.0/24', :label=>103},
229
+ ]
230
+ mpr5 = Mp_reach.new :safi=>128, :nexthop=> ['10.0.0.1'], :nlris=> [
231
+ {:rd=> [100,100], :prefix=> '192.168.0.0/24', :label=>101, :path_id=>101},
232
+ {:rd=> [100,100], :prefix=> '192.168.1.0/24', :label=>102, :path_id=>102},
233
+ {:rd=> [100,100], :prefix=> '192.168.2.0/24', :label=>103, :path_id=>103},
234
+ ]
235
+
236
+ assert_equal('800e200001800c00000000000000000a00000100700006510000006400000064c0a800', mpr1.to_shex)
237
+ assert_equal('800e240001800c00000000000000000a0000010000000064700006510000006400000064c0a800', mpr2.to_shex)
238
+ assert_equal attr_len(mpr1)+4, attr_len(mpr2)
239
+
240
+ assert_equal('800e3e0001800c00000000000000000a00000100700006510000006400000064c0a800700006610000006400000064c0a801700006710000006400000064c0a802', mpr3.to_shex)
241
+ assert_equal('800e4a0001800c00000000000000000a0000010000000064700006510000006400000064c0a80000000064700006610000006400000064c0a80100000064700006710000006400000064c0a802', mpr4.to_shex)
242
+ assert_equal attr_len(mpr3)+12, attr_len(mpr4)
243
+
244
+ assert_equal('800e4a0001800c00000000000000000a0000010000000065700006510000006400000064c0a80000000066700006610000006400000064c0a80100000067700006710000006400000064c0a802', mpr5.to_shex)
245
+
246
+ # 800e3e 0001 80 0c 00000000000000000a000001 00
247
+ # 700006510000006400000064c0a800
248
+ # 700006610000006400000064c0a801
249
+ # 700006710000006400000064c0a802
250
+ #
251
+ #
252
+ # 800e4a0001800c00000000000000000a000001 00
253
+ # 00000064 700006510000006400000064c0a800
254
+ # 00000064 700006610000006400000064c0a801
255
+ # 00000064 700006710000006400000064c0a802
256
+ #
257
+ #
258
+ # 800e4a 0001 80 0c 00000000000000000a000001 00
259
+ # 00000065 700006510000006400000064c0a800
260
+ # 00000066 700006610000006400000064c0a801
261
+ # 00000067 700006710000006400000064c0a802
262
+
263
+ end
264
+
265
+ def test_safi_4_ntop
266
+
267
+ s = '800e1e000104040a0000010030000651c0a80030000661c0a80130000671c0a801'
268
+ sbin = [s].pack('H*')
269
+ mpr = Mp_reach.new(sbin, false)
270
+ assert_match(/^\s+Label Stack=101 /, mpr.to_s)
271
+ assert_match(/^\s+Label Stack=102 /, mpr.to_s)
272
+ assert_match(/^\s+Label Stack=103 /, mpr.to_s)
273
+
274
+ s = '800e2a000104040a000001000000006430000651c0a8000000006430000661c0a8010000006430000671c0a801'
275
+ sbin = [s].pack('H*')
276
+ mpr = Mp_reach.new(sbin, true)
277
+ assert_match(/ID=100, Label Stack=101 /, mpr.to_s)
278
+ assert_match(/ID=100, Label Stack=102 /, mpr.to_s)
279
+ assert_match(/ID=100, Label Stack=103 /, mpr.to_s)
280
+ end
281
+
282
+ def test_safi_128_ntop
283
+
284
+ s = '800e3e0001800c00000000000000000a00000100700006510000006400000064c0a800700006610000006400000064c0a801700006710000006400000064c0a802'
285
+ sbin = [s].pack('H*')
286
+ mpr = Mp_reach.new(sbin, false)
287
+ assert_match(/^\s+Label Stack=101 /, mpr.to_s)
288
+ assert_match(/^\s+Label Stack=102 /, mpr.to_s)
289
+ assert_match(/^\s+Label Stack=103 /, mpr.to_s)
290
+
291
+ s = '800e4a0001800c00000000000000000a0000010000000065700006510000006400000064c0a80000000066700006610000006400000064c0a80100000067700006710000006400000064c0a802'
292
+ sbin = [s].pack('H*')
293
+ mpr = Mp_reach.new(sbin, true)
294
+ assert_match(/ID=101, Label Stack=101 /, mpr.to_s)
295
+ assert_match(/ID=102, Label Stack=102 /, mpr.to_s)
296
+ assert_match(/ID=103, Label Stack=103 /, mpr.to_s)
297
+ end
298
+
299
+ private
300
+
301
+ def attr_len(attr)
302
+ attr.encode[2,1].unpack('C')[0]
303
+ end
304
+
107
305
  end