bgp4r 0.0.12 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. data/README.rdoc +21 -15
  2. data/bgp/common.rb +13 -12
  3. data/bgp/iana.rb +28 -205
  4. data/bgp/io.rb +0 -1
  5. data/bgp/messages/capability.rb +1 -1
  6. data/bgp/messages/message.rb +1 -1
  7. data/bgp/messages/open.rb +1 -1
  8. data/bgp/messages/route_refresh.rb +4 -7
  9. data/bgp/messages/update.rb +9 -6
  10. data/bgp/misc/live_feed.rb +1 -2
  11. data/bgp/neighbor/add_path_cap.rb +14 -13
  12. data/bgp/neighbor/neighbor.rb +30 -18
  13. data/bgp/nlris/inet.rb +9 -11
  14. data/bgp/nlris/label.rb +1 -1
  15. data/bgp/nlris/labeled.rb +31 -4
  16. data/bgp/nlris/nlri.rb +23 -183
  17. data/bgp/nlris/nsap.rb +101 -0
  18. data/bgp/nlris/prefix.rb +162 -24
  19. data/bgp/nlris/rd.rb +1 -1
  20. data/bgp/nlris/vpn.rb +23 -5
  21. data/bgp/optional_parameters/add_path.rb +11 -37
  22. data/bgp/optional_parameters/as4.rb +1 -1
  23. data/bgp/optional_parameters/capability.rb +1 -11
  24. data/bgp/optional_parameters/dynamic.rb +1 -1
  25. data/bgp/optional_parameters/graceful_restart.rb +35 -22
  26. data/bgp/optional_parameters/mbgp.rb +23 -37
  27. data/bgp/optional_parameters/orf.rb +1 -1
  28. data/bgp/optional_parameters/route_refresh.rb +1 -1
  29. data/bgp/orfs/prefix_orf.rb +3 -6
  30. data/bgp/path_attributes/aggregator.rb +1 -1
  31. data/bgp/path_attributes/as_path.rb +1 -1
  32. data/bgp/path_attributes/atomic_aggregate.rb +1 -1
  33. data/bgp/path_attributes/cluster_list.rb +1 -1
  34. data/bgp/path_attributes/communities.rb +1 -1
  35. data/bgp/path_attributes/extended_communities.rb +1 -1
  36. data/bgp/path_attributes/extended_community.rb +55 -26
  37. data/bgp/path_attributes/local_pref.rb +1 -1
  38. data/bgp/path_attributes/mp_reach.rb +178 -76
  39. data/bgp/path_attributes/mp_unreach.rb +11 -67
  40. data/bgp/path_attributes/multi_exit_disc.rb +1 -1
  41. data/bgp/path_attributes/next_hop.rb +1 -1
  42. data/bgp/path_attributes/origin.rb +1 -1
  43. data/bgp/path_attributes/originator_id.rb +1 -1
  44. data/bgp/path_attributes/path_attribute.rb +1 -1
  45. data/bgp4r.gemspec +130 -183
  46. data/examples/routegen +0 -1
  47. data/examples/test.rb +15 -0
  48. data/examples/test2.rb +116 -0
  49. data/examples/unit-testing/{malformed_update.rb → malformed_update_test.rb} +6 -6
  50. data/examples/unit-testing/{no_export.rb → no_export_test.rb} +6 -6
  51. data/examples/unit-testing/{prepend_aspath.rb → prepend_aspath_test.rb} +6 -6
  52. data/test/functional/add_path_test.rb +32 -0
  53. data/test/helpers/server.rb +11 -4
  54. data/test/{common_test.rb → unit/common_test.rb} +7 -10
  55. data/test/{iana_test.rb → unit/iana_test.rb} +7 -6
  56. data/test/{messages → unit/messages}/capability_test.rb +26 -9
  57. data/test/{messages → unit/messages}/route_refresh_test.rb +4 -4
  58. data/test/{messages → unit/messages}/update_test.rb +28 -17
  59. data/test/{neighbor → unit/neighbor}/add_path_cap_test.rb +41 -0
  60. data/test/{neighbor → unit/neighbor}/neighbor_test.rb +31 -13
  61. data/test/unit/nlris/labeled_test.rb +30 -0
  62. data/test/unit/nlris/nlri_test.rb +103 -0
  63. data/test/unit/nlris/nsap_test.rb +80 -0
  64. data/test/unit/nlris/prefix_test.rb +136 -0
  65. data/test/{optional_parameters → unit/optional_parameters}/capability_test.rb +0 -5
  66. data/test/unit/optional_parameters/graceful_restart_test.rb +41 -0
  67. data/test/{optional_parameters → unit/optional_parameters}/mbgp_test.rb +20 -0
  68. data/test/unit/path_attributes/aigp.rb +59 -0
  69. data/test/{path_attributes → unit/path_attributes}/extended_communities_test.rb +4 -0
  70. data/test/{path_attributes → unit/path_attributes}/extended_community_test.rb +9 -0
  71. data/test/unit/path_attributes/mp_reach_test.rb +563 -0
  72. data/test/{path_attributes → unit/path_attributes}/path_attribute_test.rb +1 -1
  73. metadata +128 -136
  74. data/examples/unit-testing/test.rb +0 -82
  75. data/examples/unit-testing/test1.rb +0 -82
  76. data/examples/unit-testing/test2.rb +0 -44
  77. data/test/nlris/ext_nlri_test.rb +0 -32
  78. data/test/nlris/nlri_test.rb +0 -130
  79. data/test/optional_parameters/graceful_restart_test.rb +0 -24
  80. data/test/path_attributes/mp_reach_test.rb +0 -305
  81. /data/examples/unit-testing/{unknown_transitive_attr.rb → unknown_transitive_attr_test.rb} +0 -0
  82. /data/test/{misc → functional}/live_feed_test.rb +0 -0
  83. /data/test/{messages → unit/messages}/keepalive_test.rb +0 -0
  84. /data/test/{messages → unit/messages}/markers_test.rb +0 -0
  85. /data/test/{messages → unit/messages}/message_test.rb +0 -0
  86. /data/test/{messages → unit/messages}/notification_test.rb +0 -0
  87. /data/test/{messages → unit/messages}/open_test.rb +0 -0
  88. /data/test/{nlris → unit/nlris}/inet_test.rb +0 -0
  89. /data/test/{nlris/labeled_test.rb → unit/nlris/label_test.rb} +0 -0
  90. /data/test/{nlris → unit/nlris}/rd_test.rb +0 -0
  91. /data/test/{optional_parameters → unit/optional_parameters}/add_path_test.rb +0 -0
  92. /data/test/{optional_parameters → unit/optional_parameters}/as4_test.rb +0 -0
  93. /data/test/{optional_parameters → unit/optional_parameters}/dynamic_test.rb +0 -0
  94. /data/test/{optional_parameters → unit/optional_parameters}/optional_parameter_test.rb +0 -0
  95. /data/test/{optional_parameters → unit/optional_parameters}/orf_test.rb +0 -0
  96. /data/test/{optional_parameters → unit/optional_parameters}/route_refresh_test.rb +0 -0
  97. /data/test/{orfs → unit/orfs}/prefix_orf_test.rb +0 -0
  98. /data/test/{path_attributes → unit/path_attributes}/aggregator_test.rb +0 -0
  99. /data/test/{path_attributes → unit/path_attributes}/as_path_test.rb +0 -0
  100. /data/test/{path_attributes → unit/path_attributes}/atomic_aggregate_test.rb +0 -0
  101. /data/test/{path_attributes → unit/path_attributes}/attribute_test.rb +0 -0
  102. /data/test/{path_attributes → unit/path_attributes}/cluster_list_test.rb +0 -0
  103. /data/test/{path_attributes → unit/path_attributes}/communities_test.rb +0 -0
  104. /data/test/{path_attributes → unit/path_attributes}/local_pref_test.rb +0 -0
  105. /data/test/{path_attributes → unit/path_attributes}/mp_unreach_test.rb +0 -0
  106. /data/test/{path_attributes → unit/path_attributes}/multi_exit_disc_test.rb +0 -0
  107. /data/test/{path_attributes → unit/path_attributes}/next_hop_test.rb +0 -0
  108. /data/test/{path_attributes → unit/path_attributes}/origin_test.rb +0 -0
  109. /data/test/{path_attributes → unit/path_attributes}/originator_id_test.rb +0 -0
@@ -0,0 +1,563 @@
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 'bgp4r'
24
+ require 'test/unit'
25
+
26
+ class Mp_reach_Test < Test::Unit::TestCase
27
+ include BGP
28
+
29
+ def test_iso_mapped_ip_addr
30
+ mapped_addr = Iso_ip_mapped.new('10.0.0.1')
31
+ assert_equal('470006010a00000100', mapped_addr.to_shex)
32
+ mapped_addr = Iso_ip_mapped.new('2011::1')
33
+ assert_equal('3500002011000000000000000000000000000100', mapped_addr.to_shex)
34
+ end
35
+
36
+ def test_afi_3_safi_1_ipv4_mapped_nexthops
37
+ mpr1 = Mp_reach.new( :afi=>3,
38
+ :safi=>1,
39
+ :nexthop=> ['10.0.0.1',],
40
+ :nlris=> '49.0001.0002.0003.0004.0005.0006/64' )
41
+
42
+ s = '80 0e 17 0003 01 09 470006010a00000100 00 40 4900010002000300'
43
+
44
+ assert_equal(s.split.join, mpr1.to_shex)
45
+
46
+ mpr2 = Mp_reach.new(:afi=>3,
47
+ :safi=>1,
48
+ :nexthop=> ['1.1.1.1','2.2.2.2'],
49
+ :nlris => '49.0001.0002.0003.0004.0005.0006')
50
+
51
+ s = '80 0e 29 0003 01 10 4700060101010101 4700060102020202 00 98 49000100020003000400050006000000000000'
52
+ s = '80 0e 2b 0003 01 12 470006010101010100 470006010202020200 00 98 49000100020003000400050006000000000000'
53
+ assert_equal(s.split.join, mpr2.to_shex)
54
+
55
+ mpr2 = Mp_reach.new( :afi=>3,
56
+ :safi=>1,
57
+ :nexthop=> ['1.1.1.1','2.2.2.2'],
58
+ :nlris => ['49.0001.0002.0003.0004.0005.0006','49.0011.0012.0013.0014.0015.0016']
59
+ )
60
+
61
+ s = "80 0e 3d 0003 01 10 4700060101010101 4700060102020202 00
62
+ 98 49000100020003000400050006000000000000
63
+ 98 49001100120013001400150016000000000000"
64
+ s = '80 0e 3f 0003 01 12 470006010101010100 470006010202020200 00
65
+ 98 49000100020003000400050006000000000000
66
+ 9849001100120013001400150016000000000000'
67
+
68
+ assert_equal(s.split.join, mpr2.to_shex)
69
+
70
+ mpr3 = Mp_reach.new( :afi=>3,
71
+ :safi=>1,
72
+ :nexthop=> '1.1.1.1',
73
+ :nlris => ['49.0001.0002.0003.0004.0005.0006/48','49.0011.0012.0013.0014.0015.0016/72']
74
+ )
75
+
76
+ s = "80 0e 1f 0003 01 09 470006010101010100 00 3049000100020048490011001200130014"
77
+
78
+ assert_equal(s.split.join, mpr3.to_shex)
79
+
80
+ end
81
+
82
+ def test_afi_3_safi_1_ipv6_mapped_nexthops
83
+ mpr1 = Mp_reach.new(:afi=>3, :safi=>1, :nexthop=> ['2011::1'], :nlris=> '49.0001.0002.0003.0004.0005.0006/72' )
84
+
85
+ s = '80 0e 23 000301143500002011000000000000000000000000000100 00 48490001000200030004'
86
+ assert_equal(s.split.join, mpr1.to_shex)
87
+
88
+ mpr2 = Mp_reach.new(:afi=>3, :safi=>1, :nexthop=> ['2011::1', '2011::2'], :nlris=> '49.0001.0002.0003.0004.0005.0006/103' )
89
+
90
+ s = '
91
+ 80 0e 3b 0003 01 28
92
+ 350000 2011000000000000000000000000000100
93
+ 350000 2011000000000000000000000000000200 00
94
+ 6749000100020003000400050006'
95
+ assert_equal(s.split.join, mpr2.to_shex)
96
+
97
+ end
98
+
99
+ def test_afi_3_safi_1_ipv6_mapped_nexthops_with_path_id
100
+ mpr1 = Mp_reach.new(:afi=>3, :safi=>1, :nexthop=> ['2011::1'], :nlris=> '49.0001.0002.0003.0004.0005.0006/72', :path_id=>100 )
101
+
102
+ s = '80 0e 27 0003 01 14 350000 2011000000000000000000000000000100 00 00000064 48490001000200030004'
103
+ assert_equal(s.split.join, mpr1.to_shex)
104
+
105
+ mpr2 = Mp_reach.new(:afi=>3, :safi=>1, :nexthop=> ['2011::1', '2011::2'], :nlris=> '49.0001.0002.0003.0004.0005.0006/103' )
106
+
107
+ s = '
108
+ 80 0e 3b 0003 01 28
109
+ 350000 2011000000000000000000000000000100
110
+ 350000 2011000000000000000000000000000200 00
111
+ 6749000100020003000400050006'
112
+ assert_equal(s.split.join, mpr2.to_shex)
113
+
114
+ end
115
+
116
+ def test_afi_3_safi_1_ipv4_mapped_nexthops_ntoh
117
+
118
+ # Mp Reach (14), length: 27, Flags [O]:
119
+ # AFI (3), SAFI Unicast (1)
120
+ # nexthop: 10.0.0.1
121
+ # 49.0001.0002.0003.0004.0005.0006
122
+ # 0x0000: 0003 0108 4700 0601 0a00 0001 0068 4900
123
+ # 0x0001: 0100 0200 0300 0400 0500 06
124
+
125
+ s = '800e1c00030109470006010a00000100006849000100020003000400050006'
126
+ sbin = [s.split.join].pack('H*')
127
+ mpr = Mp_reach.new(sbin)
128
+
129
+ assert_equal(s.split.join, mpr.to_shex)
130
+ assert_equal("[Oncr] (14) Mp Reach: [800e1c000301094700060...] '\n AFI NSAP (3), SAFI Unicast (1)\n nexthop: 10.0.0.1\n 49.0001.0002.0003.0004.0005.0006.0000.0000.0000.00/104'", mpr.to_s)
131
+
132
+ end
133
+
134
+ def test_afi_3_safi_128_ipv4_mapped_nexthops
135
+ mpr = Mp_reach.new(:afi=>3, :safi=>128, :nexthop=> '1.1.1.1', :nlris=> [
136
+ {:rd=> [100,100], :prefix=> '49.abab.cdcd.efef/48', :label=>100},
137
+ ]
138
+ )
139
+ smpr = '800e280003801100000000000000004700060101010101000088000641000000640000006449ababcdcdef'
140
+ assert_equal(smpr, mpr.to_shex)
141
+
142
+ end
143
+
144
+ def test_afi_3_safi_128_ipv6_mapped_nexthops
145
+ mpr = Mp_reach.new(:afi=>3, :safi=>128, :nexthop=> '2011:03:26::1', :nlris=> [
146
+ {:rd=> [100,100], :prefix=> '49.abab.cdcd.efef/48', :label=>100},
147
+ ]
148
+ )
149
+ smpr = '80 0e 33 0003 80
150
+ 1c 0000000000000000 350000 2011000300260000000000000000000100 00 88 000641 0000006400000064 49ababcdcdef'
151
+ assert_equal(smpr.split.join, mpr.to_shex)
152
+ end
153
+
154
+ def test_afi_3_safi_128_ipv6_mapped_nexthops_ntoh
155
+ s = '80 0e 33 0003 80
156
+ 1c 0000000000000000 350000 2011000300260000000000000000000100 00 88 000641 0000006400000064 49ababcdcdef'
157
+ sbin = [s.split.join].pack('H*')
158
+ mpr = Mp_reach.new(sbin)
159
+
160
+ assert_equal(s.split.join, mpr.to_shex)
161
+ assert_match(/nexthop: 2011:3:26::1/, mpr.to_s())
162
+ assert_match(/Label Stack=100 \(bottom\) RD=100:100/, mpr.to_s())
163
+ assert_match(/NSAP=49.abab.cdcd.ef00.0000.0000.0000.0000.0000.0000.00\/48/, mpr.to_s())
164
+
165
+ mpr = Mp_reach.new(:afi=>3, :safi=>128, :nexthop=> '2011:03:26::1', :nlris=> [
166
+ {:rd=> [100,100], :prefix=> '49.abab.cdcd.efef/48', :label=>100},
167
+ ]
168
+ )
169
+ smpr = '80 0e 33 0003 80
170
+ 1c 0000000000000000 350000 2011000300260000000000000000000100 00 88 000641 0000006400000064 49ababcdcdef'
171
+ assert_equal(smpr.split.join, mpr.to_shex)
172
+ end
173
+
174
+
175
+
176
+
177
+ def test_afi_3_safi_1_ipv6_mapped_nexthops_ntoh
178
+
179
+ # Mp Reach (14), length: 57, Flags [O]:
180
+ # AFI (3), SAFI Unicast (1)
181
+ # nexthop: 2011::1, 2011::2
182
+ # 49.0001.0002.0003.0004.0005.0006
183
+ # 0x0000: 0003 0126 3500 0020 1100 0000 0000 0000
184
+ # 0x0001: 0000 0000 0000 0135 0000 2011 0000 0000
185
+ # 0x0002: 0000 0000 0000 0000 0002 0068 4900 0100
186
+ # 0x0003: 0200 0300 0400 0500 06
187
+
188
+ s = '
189
+ 80 0e 3b 0003 01
190
+ 28
191
+ 350000 2011000000000000000000000000000100
192
+ 350000 2011000000000000000000000000000200
193
+ 00
194
+ 68 49000100020003000400050006'
195
+ sbin = [s.split.join].pack('H*')
196
+
197
+ mpr = Mp_reach.new(sbin)
198
+
199
+ assert_equal(s.split.join, mpr.to_shex)
200
+ assert_equal("[Oncr] (14) Mp Reach: [800e3b000301283500002...] '\n AFI NSAP (3), SAFI Unicast (1)\n nexthop: 2011::1, 2011::2\n 49.0001.0002.0003.0004.0005.0006.0000.0000.0000.00/104'", mpr.to_s())
201
+ end
202
+
203
+ def test_afi_2_safi_2
204
+ s = '800e30000202102009000900190000000000000000000100402009000100000000402009000200000000402009000300000000'
205
+ sbin = [s].pack('H*')
206
+ mpr = Mp_reach.new(sbin)
207
+ 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)
208
+ assert_equal(2, mpr.afi)
209
+ assert_equal(2, mpr.safi)
210
+ assert_equal(s, mpr.to_shex)
211
+ end
212
+ def test_afi_2_safi_1_nexthop_2
213
+ s = "800e2500020120200900090019000000000000000000012009000900190000000000000000000200"
214
+ sbin = [s].pack('H*')
215
+ mpr = Mp_reach.new(sbin)
216
+ assert_equal("\n AFI IPv6 (2), SAFI Unicast (1)\n nexthop: 2009:9:19::1, 2009:9:19::2", mpr.mp_reach)
217
+ assert_equal(2, mpr.afi)
218
+ assert_equal(1, mpr.safi)
219
+ assert_equal(s, mpr.to_shex)
220
+ end
221
+ def test_afi_1_safi_2_nexthop_2
222
+ s = "800e0d000102080a0000010a00000200"
223
+ sbin = [s].pack('H*')
224
+ mpr = Mp_reach.new(sbin)
225
+ assert_equal("\n AFI IPv4 (1), SAFI Multicast (2)\n nexthop: 10.0.0.1, 10.0.0.2", mpr.mp_reach)
226
+ assert_equal(1, mpr.afi)
227
+ assert_equal(2, mpr.safi)
228
+ assert_equal(s, mpr.to_shex)
229
+ end
230
+ def test_afi_1_safi_2_nexthop_1
231
+ s = "800e11000102040a0000010018c0a80118c0a802"
232
+ sbin = [s].pack('H*')
233
+ mpr = Mp_reach.new(sbin)
234
+ assert_equal("\n AFI IPv4 (1), SAFI Multicast (2)\n nexthop: 10.0.0.1\n 192.168.1.0/24\n 192.168.2.0/24", mpr.mp_reach)
235
+ assert_equal(1, mpr.afi)
236
+ assert_equal(2, mpr.safi)
237
+ assert_equal(s, mpr.to_shex)
238
+ end
239
+ def test_afi_2_safi_4_nexthop_1
240
+ s = "800e39000204102009000900190000000000000000000100580006512009000100000000580006612009000200000000580006712009000300000000"
241
+ sbin = [s].pack('H*')
242
+ mpr = Mp_reach.new(sbin)
243
+ assert_equal("\n AFI IPv6 (2), SAFI Labeled NLRI (4)\n nexthop: 2009:9:19::1\n Label Stack=101 (bottom) 2009:1::/64\n Label Stack=102 (bottom) 2009:2::/64\n Label Stack=103 (bottom) 2009:3::/64", mpr.mp_reach)
244
+ assert_equal(2, mpr.afi)
245
+ assert_equal(4, mpr.safi)
246
+ assert_equal(s, mpr.to_shex)
247
+ #puts mpr
248
+ end
249
+ def test_afi_1_2_safi_1_2_4_128_hash
250
+ mpr = Mp_reach.new(:safi=>2, :nexthop=> ['2009:9:19::1/128'], :nlris=> ['2009:1::/64', '2009:2::/64', '2009:3::/64'])
251
+ 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)
252
+ assert_equal(mpr.to_shex, Mp_reach.new(mpr.encode).to_shex)
253
+ mpr = Mp_reach.new(:safi=>1, :nexthop=> ['10.0.0.1','10.0.0.2'], :nlris=> '192.168.0.0/24')
254
+ 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)
255
+ assert_equal(mpr.to_shex, Mp_reach.new(mpr.encode).to_shex)
256
+ mpr = Mp_reach.new(:safi=>4, :nexthop=> ['10.0.0.1','10.0.0.2'], :nlris=> {:prefix=> '192.168.0.0/24', :label=>101} )
257
+ 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)
258
+ assert_equal(mpr.to_shex, Mp_reach.new(mpr.encode).to_shex)
259
+ 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})
260
+ 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)
261
+ assert_equal(mpr.to_shex, Mp_reach.new(mpr.encode).to_shex)
262
+ 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})
263
+ 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)
264
+ assert_equal(mpr.to_shex, Mp_reach.new(mpr.encode).to_shex)
265
+ end
266
+ def ___test_afi_1_2_safi_1_2_4_128_hash
267
+ 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})
268
+ 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)
269
+ assert_equal(mpr.to_shex, Mp_reach.new(mpr.encode).to_shex)
270
+ end
271
+ def test_afi_1_2_safi_1_2_hash_multiple_prefix
272
+ mpr = Mp_reach.new(:safi=>2, :nexthop=> '2009:9:19::1/128', :nlris=> [
273
+ '2009:1::/64', '2009:2::/64', '2009:3::/64', '2009:4::/64', '2009:5::/64', '2009:6::/64'])
274
+ 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)
275
+ mpr = Mp_reach.new(:safi=>1, :nexthop=> '10.0.0.1', :nlris=> [
276
+ '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'])
277
+ 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)
278
+ end
279
+ def test_8
280
+ mpr = Mp_reach.new(:safi=>1, :nexthop=> '10.0.0.1', :nlris=> [
281
+ '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'])
282
+ assert_equal(Mp_unreach,mpr.new_unreach.class)
283
+ mpr2 = Mp_reach.new(mpr)
284
+ assert_equal(mpr.encode, mpr2.encode)
285
+ assert_equal(Mp_unreach, Mp_unreach.new(mpr.new_unreach).class)
286
+ end
287
+
288
+ def test_afi_1
289
+ mpr1 = Mp_reach.new(:safi=>1, :nexthop=> ['10.0.0.1'], :nlris=> '192.168.1.0/24')
290
+ mpr2 = Mp_reach.new(:safi=>1, :nexthop=> ['10.0.0.1'], :nlris=> '192.168.1.0/24', :path_id=>100)
291
+ mpr3 = Mp_reach.new(:safi=>2, :nexthop=> ['10.0.0.1'], :nlris=> ['192.168.1.0/24','192.168.2.0/24'])
292
+ 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)
293
+ mpr5 = Mp_reach.new(:safi=>1, :nexthop=> ['10.0.0.1'], :nlris=> [
294
+ {:prefix=> '192.168.1.0/24', :path_id=> 100},
295
+ {:prefix=> '192.168.2.0/24', :path_id=> 101},
296
+ {:prefix=> '192.168.2.0/24', :path_id=> 102},
297
+ ])
298
+
299
+ assert_equal('800e 0d 0001 01 04 0a000001 00 18c0a801'.split.join, mpr1.to_shex)
300
+ assert_equal('800e 11 0001 01 04 0a000001 00 00000064 18c0a801'.split.join, mpr2.to_shex)
301
+ assert_equal attr_len(mpr1)+4, attr_len(mpr2)
302
+
303
+ assert_equal('800e11000102040a0000010018c0a80118c0a802', mpr3.to_shex)
304
+ assert_equal('800e19000102040a000001000000006418c0a8010000006418c0a802', mpr4.to_shex)
305
+ assert_equal attr_len(mpr3)+8, attr_len(mpr4)
306
+
307
+ assert_equal('800e21000101040a000001000000006418c0a8010000006518c0a8020000006618c0a802', mpr5.to_shex)
308
+
309
+ end
310
+
311
+ def test_afi_1_ntop
312
+
313
+ s = '800e11000102040a0000010018c0a80118c0a802'
314
+ sbin = [s].pack('H*')
315
+ mpr = Mp_reach.new(sbin, false)
316
+ assert_match(/^\s+192.168.1.0\/24/, mpr.to_s)
317
+ assert_match(/^\s+192.168.1.0\/24/, mpr.to_s)
318
+
319
+ s = '800e19000102040a000001000000006418c0a8010000006418c0a802'
320
+ sbin = [s].pack('H*')
321
+ mpr = Mp_reach.new(sbin, true)
322
+ assert_match(/^\s+ID=100, 192.168.1.0\/24/, mpr.to_s)
323
+ assert_match(/^\s+ID=100, 192.168.1.0\/24/, mpr.to_s)
324
+ end
325
+
326
+ def test_afi_2
327
+ mpr1 = Mp_reach.new(:safi=>1, :nexthop=> ['2011:1:7::1'], :nlris=> '2011:1::/32')
328
+ mpr2 = Mp_reach.new(:safi=>1, :nexthop=> ['2011:1:7::1'], :nlris=> '2011:1::/32', :path_id=>100)
329
+ mpr3 = Mp_reach.new(:safi=>2, :nexthop=> ['2011:1:7::1'], :nlris=> ['2011:1::/32','2011:2::/32'])
330
+ mpr4 = Mp_reach.new(:safi=>2, :nexthop=> ['2011:1:7::1'], :nlris=> ['2011:1::/32','2011:2::/32'], :path_id=>100)
331
+ mpr5 = Mp_reach.new(:safi=>1, :nexthop=> ['2011:1:7::1'], :nlris=> [
332
+ {:prefix=> '2011:1::/32', :path_id=> 100},
333
+ {:prefix=> '2011:2::/32', :path_id=> 101},
334
+ {:prefix=> '2011:3::/32', :path_id=> 102},
335
+ ])
336
+
337
+ assert_equal('800e1a0 002 01 10 20110001000700000000000000000001 00 2020110001'.split.join, mpr1.to_shex)
338
+ assert_equal('800e1e000201102011000100070000000000000000000100000000642020110001', mpr2.to_shex)
339
+ assert_equal attr_len(mpr1)+4, attr_len(mpr2)
340
+
341
+ assert_equal('800e1f00020210201100010007000000000000000000010020201100012020110002', mpr3.to_shex)
342
+ assert_equal('800e27000202102011000100070000000000000000000100000000642020110001000000642020110002', mpr4.to_shex)
343
+ assert_equal attr_len(mpr3)+8, attr_len(mpr4)
344
+ assert_equal('800e30000201102011000100070000000000000000000100000000642020110001000000652020110002000000662020110003', mpr5.to_shex)
345
+ end
346
+
347
+ def test_afi_2_ntop
348
+
349
+ s = '800e1f00020210201100010007000000000000000000010020201100012020110002'
350
+ sbin = [s].pack('H*')
351
+ mpr = Mp_reach.new(sbin, false)
352
+ assert_match(/^\s+2011:1::\/32/, mpr.to_s)
353
+ assert_match(/^\s+2011:2::\/32/, mpr.to_s)
354
+
355
+ s = '800e27000202102011000100070000000000000000000100000000642020110001000000642020110002'
356
+ sbin = [s].pack('H*')
357
+ mpr = Mp_reach.new(sbin, true)
358
+ assert_match(/^\s+ID=100, 2011:1::\/32/, mpr.to_s)
359
+ assert_match(/^\s+ID=100, 2011:2::\/32/, mpr.to_s)
360
+ end
361
+
362
+ def test_afi_3_safi_1
363
+ # TODO: either use :iso_nexthop=> ''2011:3:27::1'
364
+ # :afi=> :iso or :nasp
365
+ # test :afi=> ipv4 ipv6 osi nsap
366
+ # test :safi unicast multicast
367
+ mpr1 = Mp_reach.new(:afi=>3, :safi=>1, :nexthop=> '2011:3:27::1', :nlris=> '49.0001.0002.0000/48')
368
+ mpr2 = Mp_reach.new(:afi=>3, :safi=>1, :nexthop=> '2011:3:27::1', :nlris=> '49.0001.0002.0000/48', :path_id=>100)
369
+ mpr3 = Mp_reach.new(:afi=>3, :safi=>1, :nexthop=> '2011:3:27::1', :nlris=> ['49.0001.0002.0000/48','49.0a00.0b00/32'])
370
+ mpr4 = Mp_reach.new(:afi=>3, :safi=>1, :nexthop=> '2011:3:27::1', :nlris=> ['49.0001.0002.0000/48','49.0a00.0b00/32'], :path_id=>100)
371
+ mpr5 = Mp_reach.new(:afi=>3, :safi=>1, :nexthop=> '2011:3:27::1', :nlris=> [
372
+ {:prefix=> '49.0a00.0b00/32', :path_id=> 100},
373
+ {:prefix=> '49.0a00.0b00/32', :path_id=> 101},
374
+ {:prefix=> '49.0a00.0b00/32', :path_id=> 102},
375
+ ])
376
+
377
+ assert_equal('80 0e 20 0003 01 14 3500002011000300270000000000000000000100 00 30 490001000200'.split.join, mpr1.to_shex)
378
+ assert_equal('80 0e 24 0003 01 14 3500002011000300270000000000000000000100 00 00000064 30 490001000200'.split.join, mpr2.to_shex)
379
+ assert_equal attr_len(mpr1)+4, attr_len(mpr2)
380
+
381
+ assert_equal('800e25000301143500002011000300270000000000000000000100 00 30 49000100020020 490a000b'.split.join, mpr3.to_shex)
382
+ assert_equal('800e2d0003011435000020110003002700000000000000000001000000000064304900010002000000006420490a000b'.split.join, mpr4.to_shex)
383
+ assert_equal attr_len(mpr3)+8, attr_len(mpr4)
384
+
385
+ smpr5 = '
386
+ 80 0e 34 0003 01 14 3500002011000300270000000000000000000100 00
387
+ 00000064 20490a000b
388
+ 0000006520490a000b
389
+ 0000006620490a000b'
390
+ assert_equal(smpr5.split.join, mpr5.to_shex)
391
+ end
392
+
393
+ def test_afi_3_safi_1_ntop
394
+ s = '800e25000301143500002011000300270000000000000000000100 00 30 49000100020020 490a000b'
395
+ sbin = [s.split.join].pack('H*')
396
+ mpr = Mp_reach.new(sbin, false)
397
+ assert_match(/nexthop: 2011:3:27::1/, mpr.to_s)
398
+ assert_match(/^\s+49.0001.0002.0000.0000.0000.0000.0000.0000.0000.00\/48/, mpr.to_s)
399
+ assert_match(/^\s+49.0a00.0b00.0000.0000.0000.0000.0000.0000.0000.00\/32/, mpr.to_s)
400
+
401
+ s = '
402
+ 80 0e 34 0003 01 14 3500002011000300270000000000000000000100 00
403
+ 00000064 20490a100b
404
+ 00000065 20490a200b
405
+ 00000066 20490a300b'
406
+ sbin = [s.split.join].pack('H*')
407
+ mpr = Mp_reach.new(sbin, true)
408
+
409
+ assert_match(/nexthop: 2011:3:27::1/, mpr.to_s)
410
+ assert_match(/ID=100, 49.0a10.0b00.0000.0000.0000.0000.0000.0000.0000.00\/32/, mpr.to_s)
411
+ assert_match(/ID=101, 49.0a20.0b00.0000.0000.0000.0000.0000.0000.0000.00\/32/, mpr.to_s)
412
+ assert_match(/ID=102, 49.0a30.0b00.0000.0000.0000.0000.0000.0000.0000.00\/32/, mpr.to_s)
413
+
414
+
415
+ end
416
+
417
+
418
+ def test_safi_4
419
+ mpr1 = Mp_reach.new(:safi=>4, :nexthop=> ['10.0.0.1'], :nlris=> {:prefix=> '192.168.0.0/24', :label=>101} )
420
+ mpr2 = Mp_reach.new(:safi=>4, :nexthop=> ['10.0.0.1'], :nlris=> {:prefix=> '192.168.0.0/24', :label=>101, :path_id=>100} )
421
+ mpr3 = Mp_reach.new(:safi=>4, :nexthop=> ['10.0.0.1'], :nlris=> [
422
+ {:prefix=> '192.168.0.0/24', :label=>101,},
423
+ {:prefix=> '192.168.1.0/24', :label=>102,},
424
+ {:prefix=> '192.168.1.0/24', :label=>103,}
425
+ ])
426
+ mpr4 = Mp_reach.new(:safi=>4, :nexthop=> ['10.0.0.1'], :path_id=> 100, :nlris=> [
427
+ {:prefix=> '192.168.0.0/24', :label=>101,},
428
+ {:prefix=> '192.168.1.0/24', :label=>102,},
429
+ {:prefix=> '192.168.1.0/24', :label=>103,}
430
+ ])
431
+ mpr5 = Mp_reach.new(:safi=>4, :nexthop=> ['10.0.0.1'], :nlris=> [
432
+ {:prefix=> '192.168.0.0/24', :label=>101, :path_id=>100},
433
+ {:prefix=> '192.168.1.0/24', :label=>102, :path_id=>101},
434
+ {:prefix=> '192.168.1.0/24', :label=>103, :path_id=>103},
435
+ ])
436
+
437
+ assert_equal('800e10000104040a0000010030000651c0a800', mpr1.to_shex)
438
+ assert_equal('800e14000104040a000001000000006430000651c0a800', mpr2.to_shex)
439
+
440
+
441
+ assert_equal attr_len(mpr1)+4, attr_len(mpr2)
442
+
443
+ assert_equal('800e1e000104040a0000010030000651c0a80030000661c0a80130000671c0a801', mpr3.to_shex)
444
+ assert_equal('800e2a000104040a000001000000006430000651c0a8000000006430000661c0a8010000006430000671c0a801', mpr4.to_shex)
445
+ assert_equal attr_len(mpr3)+12, attr_len(mpr4)
446
+
447
+ assert_equal('800e2a000104040a000001000000006430000651c0a8000000006530000661c0a8010000006730000671c0a801', mpr5.to_shex)
448
+
449
+ end
450
+
451
+ def test_afi_1_safi_128
452
+
453
+ smpr1 = '80 0e 20 0001 80 0c 00000000000000000a000001 00 70 000651 0000006400000064 c0a800'
454
+ smpr2 = '80 0e 24 0001 80 0c 00000000000000000a000001 00 00000064 70 000651 0000006400000064 c0a800'
455
+ smpr3 = '80 0e 3e 0001 80 0c 00000000000000000a000001 00
456
+ 70 000651 0000006400000064 c0a800
457
+ 70 000661 0000006400000064 c0a801
458
+ 70 000671 0000006400000064 c0a802'
459
+ smpr4 = '80 0e 4a 0001 80 0c 00000000000000000a000001 00
460
+ 00000064 70 000651 0000006400000064 c0a800
461
+ 00000064 70 000661 0000006400000064 c0a801
462
+ 00000064 70 000671 0000006400000064 c0a802'
463
+ smpr5 = '80 0e 4a 0001 80 0c 00000000000000000a000001 00
464
+ 00000065 70 000651 0000006400000064 c0a800
465
+ 00000066 70 000661 0000006400000064 c0a801
466
+ 00000067 70 000671 0000006400000064 c0a802'
467
+
468
+ mpr1 = Mp_reach.new :safi=>128, :nexthop=> ['10.0.0.1'],
469
+ :nlris=> {:rd=> [100,100], :prefix=> '192.168.0.0/24', :label=>101}
470
+ mpr2 = Mp_reach.new :safi=>128, :nexthop=> ['10.0.0.1'],
471
+ :nlris=> {:rd=> [100,100], :prefix=> '192.168.0.0/24', :label=>101, :path_id=>100}
472
+ mpr3 = Mp_reach.new :safi=>128, :nexthop=> ['10.0.0.1'], :nlris=> [
473
+ {:rd=> [100,100], :prefix=> '192.168.0.0/24', :label=>101},
474
+ {:rd=> [100,100], :prefix=> '192.168.1.0/24', :label=>102},
475
+ {:rd=> [100,100], :prefix=> '192.168.2.0/24', :label=>103},
476
+ ]
477
+ mpr4 = Mp_reach.new :safi=>128, :nexthop=> ['10.0.0.1'], :path_id=> 100, :nlris=> [
478
+ {:rd=> [100,100], :prefix=> '192.168.0.0/24', :label=>101},
479
+ {:rd=> [100,100], :prefix=> '192.168.1.0/24', :label=>102},
480
+ {:rd=> [100,100], :prefix=> '192.168.2.0/24', :label=>103},
481
+ ]
482
+ mpr5 = Mp_reach.new :safi=>128, :nexthop=> ['10.0.0.1'], :nlris=> [
483
+ {:rd=> [100,100], :prefix=> '192.168.0.0/24', :label=>101, :path_id=>101},
484
+ {:rd=> [100,100], :prefix=> '192.168.1.0/24', :label=>102, :path_id=>102},
485
+ {:rd=> [100,100], :prefix=> '192.168.2.0/24', :label=>103, :path_id=>103},
486
+ ]
487
+
488
+ assert_equal(smpr1.split.join, mpr1.to_shex)
489
+ assert_equal(smpr2.split.join, mpr2.to_shex)
490
+ assert_equal attr_len(mpr1)+4, attr_len(mpr2)
491
+ assert_equal(smpr3.split.join, mpr3.to_shex)
492
+ assert_equal(smpr4.split.join, mpr4.to_shex)
493
+ assert_equal attr_len(mpr3)+12, attr_len(mpr4)
494
+ assert_equal(smpr5.split.join, mpr5.to_shex)
495
+
496
+ end
497
+
498
+ def test_afi_1safi_4_ntop
499
+
500
+ s = '80 0e 1e 0001 04 04 0a000001 00 30000651 c0a800
501
+ 30000661 c0a801
502
+ 30000671 c0a801'
503
+ sbin = [s.split.join].pack('H*')
504
+ mpr = Mp_reach.new(sbin, false)
505
+ assert_match(/^\s+Label Stack=101 /, mpr.to_s)
506
+ assert_match(/^\s+Label Stack=102 /, mpr.to_s)
507
+ assert_match(/^\s+Label Stack=103 /, mpr.to_s)
508
+
509
+ s = '80 0e 2a 0001 04 04 0a000001 00 00000064 30000651 c0a800
510
+ 00000064 30000661 c0a801
511
+ 00000064 30000671 c0a801'
512
+
513
+ sbin = [s.split.join].pack('H*')
514
+ mpr = Mp_reach.new(sbin, true)
515
+ assert_match(/Stack=101 \(bottom\) ID=100/, mpr.to_s)
516
+ assert_match(/Stack=102 \(bottom\) ID=100/, mpr.to_s)
517
+ assert_match(/Stack=103 \(bottom\) ID=100/, mpr.to_s)
518
+ end
519
+
520
+ def test_afi_1_safi_128_ntop
521
+
522
+ s = '80 0e 3e 0001 80 0c 0000000000000000 0a000001 00 70 000651 0000006400000064 c0a800
523
+ 70 000661 0000006400000064 c0a801
524
+ 70 000671 0000006400000064 c0a802'
525
+ sbin = [s.split.join].pack('H*')
526
+ mpr = Mp_reach.new(sbin, false)
527
+ assert_match(/^\s+Label Stack=101 /, mpr.to_s)
528
+ assert_match(/^\s+Label Stack=102 /, mpr.to_s)
529
+ assert_match(/^\s+Label Stack=103 /, mpr.to_s)
530
+
531
+ s = '80 0e 4a 0001 80 0c 00000000000000000a000001 00 00000065 70 000651 0000006400000064 c0a800
532
+ 00000066 70 000661 0000006400000064 c0a801
533
+ 00000067 70 000671 0000006400000064 c0a802'
534
+ sbin = [s.split.join].pack('H*')
535
+ mpr = Mp_reach.new(sbin, true)
536
+ assert_match(/Label Stack=101.*ID=101, /, mpr.to_s)
537
+ assert_match(/Label Stack=102.*ID=102, /, mpr.to_s)
538
+ assert_match(/Label Stack=103.*ID=103, /, mpr.to_s)
539
+
540
+ end
541
+
542
+ def test_derive_afi_from_nlris
543
+ assert_equal(1, Mp_reach.afi_from_nlris('192.168.1.0/24'))
544
+ assert_equal(2, Mp_reach.afi_from_nlris('2011:1::/32'))
545
+ assert_equal(3, Mp_reach.afi_from_nlris('49.0001.0002.0003.0004.0005.0006/64'))
546
+ assert_equal(1, Mp_reach.afi_from_nlris(['192.168.1.0/24','192.168.2.0/24' ]))
547
+ assert_equal(2, Mp_reach.afi_from_nlris(['2011:1::/32','2011:2::/32']))
548
+ assert_equal(3, Mp_reach.afi_from_nlris(['49.0001.0002.0003.0004.0005.0006/64','49.0001.0002/32']))
549
+ assert_equal(1, Mp_reach.afi_from_nlris(:prefix=>'192.168.1.0/24'))
550
+ assert_equal(3, Mp_reach.afi_from_nlris(:prefix=>'49.0001.0002.0003.0004.0005.0006/64'))
551
+ assert_equal(1, Mp_reach.afi_from_nlris([{:prefix=>'192.168.1.0/24'}]))
552
+ assert_equal(3, Mp_reach.afi_from_nlris([
553
+ {:rd=> [100,100], :prefix=> '49.abab.cdcd.efef/48', :label=>100},
554
+ ]))
555
+ end
556
+
557
+ private
558
+
559
+ def attr_len(attr)
560
+ attr.encode[2,1].unpack('C')[0]
561
+ end
562
+
563
+ end
@@ -164,7 +164,7 @@ class Path_attribute_Test < Test::Unit::TestCase # :nodoc:
164
164
  {:rd=> [100,100], :prefix=> '192.168.2.0/24', :label=>103},
165
165
  ])
166
166
  )
167
- assert_match(/ID=100, Label Stack=101/, path_attr.to_s)
167
+ assert_match(/ID=100, IPv4=192.168.0.0/, path_attr.to_s)
168
168
  path_attr_new = Path_attribute.new(path_attr.encode(true), :as4byte=> true, :path_id=>true)
169
169
  assert_equal(path_attr.to_shex, path_attr_new.to_shex)
170
170