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.
- data/bgp/common.rb +14 -13
 - data/bgp/iana.rb +26 -1
 - data/bgp/messages/capability.rb +3 -2
 - data/bgp/messages/message.rb +3 -2
 - data/bgp/messages/open.rb +2 -1
 - data/bgp/messages/update.rb +80 -30
 - data/bgp/neighbor/add_path_cap.rb +125 -0
 - data/bgp/{neighbor.rb → neighbor/neighbor.rb} +64 -68
 - data/bgp/nlris/nlri.rb +289 -15
 - data/bgp/nlris/prefix.rb +3 -2
 - data/bgp/nlris/vpn.rb +1 -8
 - data/bgp/optional_parameters/add_path.rb +160 -0
 - data/bgp/optional_parameters/capabilities.rb +1 -0
 - data/bgp/optional_parameters/capability.rb +6 -0
 - data/bgp/optional_parameters/graceful_restart.rb +6 -6
 - data/bgp/optional_parameters/optional_parameter.rb +1 -0
 - data/bgp/path_attributes/as_path.rb +1 -1
 - data/bgp/path_attributes/attribute.rb +12 -5
 - data/bgp/path_attributes/mp_reach.rb +142 -96
 - data/bgp/path_attributes/mp_unreach.rb +73 -20
 - data/bgp/path_attributes/path_attribute.rb +28 -5
 - data/bgp4r.gemspec +21 -6
 - data/bgp4r.rb +1 -1
 - data/examples/unit-testing/malformed_update.rb +2 -1
 - data/examples/unit-testing/test.rb +82 -0
 - data/examples/unit-testing/test1.rb +82 -0
 - data/examples/unit-testing/test2.rb +44 -0
 - data/test/common_test.rb +7 -0
 - data/test/helpers/server.rb +20 -0
 - data/test/iana_test.rb +43 -0
 - data/test/messages/open_test.rb +7 -2
 - data/test/messages/update_test.rb +133 -36
 - data/test/neighbor/add_path_cap_test.rb +54 -0
 - data/test/neighbor/neighbor_test.rb +161 -0
 - data/test/nlris/ext_nlri_test.rb +25 -60
 - data/test/nlris/nlri_test.rb +93 -115
 - data/test/optional_parameters/add_path_test.rb +53 -0
 - data/test/optional_parameters/capability_test.rb +10 -0
 - data/test/optional_parameters/graceful_restart_test.rb +1 -0
 - data/test/path_attributes/mp_reach_test.rb +206 -8
 - data/test/path_attributes/mp_unreach_test.rb +113 -5
 - data/test/path_attributes/path_attribute_test.rb +34 -2
 - metadata +20 -7
 - data/test/neighbor_test.rb +0 -62
 
| 
         @@ -30,7 +30,6 @@ class Update_Test < Test::Unit::TestCase 
     | 
|
| 
       30 
30 
     | 
    
         
             
                sbin = [s].pack('H*')
         
     | 
| 
       31 
31 
     | 
    
         
             
                u = Update.new(sbin)
         
     | 
| 
       32 
32 
     | 
    
         
             
                assert_equal(Update, Message.factory(sbin).class)
         
     | 
| 
       33 
     | 
    
         
            -
                #TODO: more tests with nrli, with withdrawns....
         
     | 
| 
       34 
33 
     | 
    
         
             
              end
         
     | 
| 
       35 
34 
     | 
    
         
             
              def test_2
         
     | 
| 
       36 
35 
     | 
    
         
             
                s = "
         
     | 
| 
         @@ -59,29 +58,28 @@ class Update_Test < Test::Unit::TestCase 
     | 
|
| 
       59 
58 
     | 
    
         
             
                m = Message.factory([s].pack('H*'))
         
     | 
| 
       60 
59 
     | 
    
         
             
                w = Update.withdrawn(m)
         
     | 
| 
       61 
60 
     | 
    
         
             
                assert_equal(Update,w.class)
         
     | 
| 
       62 
     | 
    
         
            -
                assert_equal(' 
     | 
| 
      
 61 
     | 
    
         
            +
                assert_equal('200a0a0a0a2020202020', w.withdrawn.to_shex)
         
     | 
| 
       63 
62 
     | 
    
         
             
              end
         
     | 
| 
       64 
63 
     | 
    
         
             
              def test_4
         
     | 
| 
       65 
64 
     | 
    
         
             
                an_update = Update.new(
         
     | 
| 
       66 
     | 
    
         
            -
             
     | 
| 
       67 
     | 
    
         
            -
             
     | 
| 
       68 
     | 
    
         
            -
             
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
     | 
    
         
            -
             
     | 
| 
       71 
     | 
    
         
            -
             
     | 
| 
       72 
     | 
    
         
            -
             
     | 
| 
       73 
     | 
    
         
            -
             
     | 
| 
       74 
     | 
    
         
            -
             
     | 
| 
      
 65 
     | 
    
         
            +
                Path_attribute.new(
         
     | 
| 
      
 66 
     | 
    
         
            +
                Origin.new(1),
         
     | 
| 
      
 67 
     | 
    
         
            +
                Next_hop.new('192.168.1.5'),
         
     | 
| 
      
 68 
     | 
    
         
            +
                Multi_exit_disc.new(100),
         
     | 
| 
      
 69 
     | 
    
         
            +
                Local_pref.new(100),
         
     | 
| 
      
 70 
     | 
    
         
            +
                As_path.new(100,200,300),
         
     | 
| 
      
 71 
     | 
    
         
            +
                Communities.new('1311:1 311:59 2805:64')
         
     | 
| 
      
 72 
     | 
    
         
            +
                ),
         
     | 
| 
      
 73 
     | 
    
         
            +
                Nlri.new('77.0.0.0/17', '78.0.0.0/18', '79.0.0.0/19')
         
     | 
| 
       75 
74 
     | 
    
         
             
                )
         
     | 
| 
       76 
     | 
    
         
            -
                 
     | 
| 
      
 75 
     | 
    
         
            +
                
         
     | 
| 
       77 
76 
     | 
    
         
             
                assert_equal(3*2, an_update.encode4.size - an_update.encode.size)
         
     | 
| 
       78 
77 
     | 
    
         
             
              end
         
     | 
| 
       79 
     | 
    
         
            -
              
         
     | 
| 
       80 
78 
     | 
    
         
             
              def test_5
         
     | 
| 
       81 
79 
     | 
    
         
             
                an_update = Update.new( Path_attribute.new( Origin.new(1),
         
     | 
| 
       82 
     | 
    
         
            -
             
     | 
| 
       83 
     | 
    
         
            -
             
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
      
 80 
     | 
    
         
            +
                 Next_hop.new('10.0.0.1'),
         
     | 
| 
      
 81 
     | 
    
         
            +
                 Multi_exit_disc.new(100)
         
     | 
| 
      
 82 
     | 
    
         
            +
                ))
         
     | 
| 
       85 
83 
     | 
    
         
             
                assert ! an_update.path_attribute.has?(Local_pref), "Should not contain a Local Pref attr."
         
     | 
| 
       86 
84 
     | 
    
         
             
                an_update << Local_pref.new(113)
         
     | 
| 
       87 
85 
     | 
    
         
             
                assert an_update.path_attribute.has?(Local_pref), "Should contain a Local Pref attr."
         
     | 
| 
         @@ -94,13 +92,13 @@ class Update_Test < Test::Unit::TestCase 
     | 
|
| 
       94 
92 
     | 
    
         
             
                an_update << Nlri.new('21.0.0.0/11', '22.0.0.0/22')
         
     | 
| 
       95 
93 
     | 
    
         
             
                assert_equal 4, an_update.nlri.size
         
     | 
| 
       96 
94 
     | 
    
         
             
              end
         
     | 
| 
       97 
     | 
    
         
            -
             
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
       98 
96 
     | 
    
         
             
              def test_6
         
     | 
| 
       99 
97 
     | 
    
         
             
                s = 'ffffffffffffffffffffffffffffffff004a02000000274001010040020a0202000000c80000006440030428000101c0080c0137003b051f00010af50040114d0000124e0000134f0000'
         
     | 
| 
       100 
     | 
    
         
            -
                m = Message.factory([s].pack('H*'), true)
         
     | 
| 
      
 98 
     | 
    
         
            +
                m = Message.factory([s].pack('H*'), Update::Info.new(true))
         
     | 
| 
       101 
99 
     | 
    
         
             
                assert_not_nil m
         
     | 
| 
       102 
100 
     | 
    
         
             
                assert_instance_of(Update, m)
         
     | 
| 
       103 
     | 
    
         
            -
                 
     | 
| 
      
 101 
     | 
    
         
            +
                assert_equal(s, m.to_shex(Update::Info.new(true)))
         
     | 
| 
       104 
102 
     | 
    
         
             
              end
         
     | 
| 
       105 
103 
     | 
    
         | 
| 
       106 
104 
     | 
    
         
             
              def test_7
         
     | 
| 
         @@ -127,10 +125,12 @@ class Update_Test < Test::Unit::TestCase 
     | 
|
| 
       127 
125 
     | 
    
         
             
                cluster: 0.0.0.1
         
     | 
| 
       128 
126 
     | 
    
         
             
                "
         
     | 
| 
       129 
127 
     | 
    
         
             
              end
         
     | 
| 
       130 
     | 
    
         
            -
             
     | 
| 
      
 128 
     | 
    
         
            +
             
     | 
| 
       131 
129 
     | 
    
         
             
              def test_8
         
     | 
| 
      
 130 
     | 
    
         
            +
                o = Update::Info.new(true)
         
     | 
| 
      
 131 
     | 
    
         
            +
                def o.recv_inet_unicast? ; false ; end
         
     | 
| 
       132 
132 
     | 
    
         
             
                s = 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0072020000001F4001010040020A0204212C051319351AFE400304557200D9C00804212C045C175D76D6175D76DE1659299C175929981659235C16592D6417592D6417592D6617592D6217C3D228185D73241859284417C3FE84165C727015592190'
         
     | 
| 
       133 
     | 
    
         
            -
                m = Update.new([s].pack('H*'),  
     | 
| 
      
 133 
     | 
    
         
            +
                m = Update.new([s].pack('H*'), o)
         
     | 
| 
       134 
134 
     | 
    
         
             
                pa = m.path_attribute
         
     | 
| 
       135 
135 
     | 
    
         
             
                assert_equal '556533011 422910718', pa[As_path].as_path
         
     | 
| 
       136 
136 
     | 
    
         
             
                assert_equal '85.114.0.217', pa[Next_hop].next_hop
         
     | 
| 
         @@ -139,27 +139,124 @@ class Update_Test < Test::Unit::TestCase 
     | 
|
| 
       139 
139 
     | 
    
         
             
                pa[:as_path].find_sequence.prepend(100)
         
     | 
| 
       140 
140 
     | 
    
         
             
                assert_equal '100 556533011 422910718', pa[As_path].as_path
         
     | 
| 
       141 
141 
     | 
    
         
             
              end
         
     | 
| 
       142 
     | 
    
         
            -
             
     | 
| 
      
 142 
     | 
    
         
            +
             
     | 
| 
       143 
143 
     | 
    
         
             
              def test_9
         
     | 
| 
      
 144 
     | 
    
         
            +
                # FFFFFFFFFF
         
     | 
| 
      
 145 
     | 
    
         
            +
                # 0023 02 000C 16D40374 1755C688 16D40830 0000
         
     | 
| 
       144 
146 
     | 
    
         
             
                s = 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF002302000C16D403741755C68816D408300000'
         
     | 
| 
       145 
147 
     | 
    
         
             
                m = Update.new([s].pack('H*'))
         
     | 
| 
       146 
148 
     | 
    
         
             
                assert m.withdrawn, "Should contain withdrawn routes."
         
     | 
| 
       147 
149 
     | 
    
         
             
                assert_equal 3,m.withdrawn.nlris.size
         
     | 
| 
       148 
150 
     | 
    
         
             
              end
         
     | 
| 
      
 151 
     | 
    
         
            +
             
         
     | 
| 
      
 152 
     | 
    
         
            +
              def test_10
         
     | 
| 
      
 153 
     | 
    
         
            +
                o = Update::Info.new(true)
         
     | 
| 
      
 154 
     | 
    
         
            +
                def o.recv_inet_unicast? ; true ; end
         
     | 
| 
      
 155 
     | 
    
         
            +
                def o.send_inet_unicast? ; true ; end
         
     | 
| 
      
 156 
     | 
    
         
            +
                upd1 = Update.new(
         
     | 
| 
      
 157 
     | 
    
         
            +
                  Path_attribute.new(
         
     | 
| 
      
 158 
     | 
    
         
            +
                   As_path.new(100)
         
     | 
| 
      
 159 
     | 
    
         
            +
                  ),
         
     | 
| 
      
 160 
     | 
    
         
            +
                  Ext_Nlri.new(100, Nlri.new('77.0.0.0/17'))
         
     | 
| 
      
 161 
     | 
    
         
            +
                )
         
     | 
| 
      
 162 
     | 
    
         
            +
                assert_equal('ffffffffffffffffffffffffffffffff0028020000000940020602010000006400000064114d0000', upd1.to_shex(o))
         
     | 
| 
      
 163 
     | 
    
         
            +
                # Need to tell the factory we are dealing with a ext nlri.
         
     | 
| 
      
 164 
     | 
    
         
            +
                upd2 = Update.factory(upd1.encode(o), o)
         
     | 
| 
      
 165 
     | 
    
         
            +
                assert_equal(upd1.to_shex(o), upd2.to_shex(o))
         
     | 
| 
      
 166 
     | 
    
         
            +
              end
         
     | 
| 
       149 
167 
     | 
    
         | 
| 
       150 
     | 
    
         
            -
               
     | 
| 
       151 
     | 
    
         
            -
             
     | 
| 
       152 
     | 
    
         
            -
             
     | 
| 
       153 
     | 
    
         
            -
             
     | 
| 
       154 
     | 
    
         
            -
             
     | 
| 
       155 
     | 
    
         
            -
             
     | 
| 
       156 
     | 
    
         
            -
             
     | 
| 
       157 
     | 
    
         
            -
             
     | 
| 
       158 
     | 
    
         
            -
             
     | 
| 
       159 
     | 
    
         
            -
             
     | 
| 
       160 
     | 
    
         
            -
             
     | 
| 
       161 
     | 
    
         
            -
             
     | 
| 
       162 
     | 
    
         
            -
             
     | 
| 
       163 
     | 
    
         
            -
             
     | 
| 
      
 168 
     | 
    
         
            +
              def test_path_id_and_as4byte
         
     | 
| 
      
 169 
     | 
    
         
            +
                o = Update::Info.new(true)
         
     | 
| 
      
 170 
     | 
    
         
            +
                def o.recv_inet_unicast? ; true ; end
         
     | 
| 
      
 171 
     | 
    
         
            +
                def o.send_inet_unicast? ; true ; end
         
     | 
| 
      
 172 
     | 
    
         
            +
                upd1 = Update.new(
         
     | 
| 
      
 173 
     | 
    
         
            +
                 Path_attribute.new(
         
     | 
| 
      
 174 
     | 
    
         
            +
                  Origin.new,
         
     | 
| 
      
 175 
     | 
    
         
            +
                  As_path.new(100),
         
     | 
| 
      
 176 
     | 
    
         
            +
                  Local_pref.new(10),
         
     | 
| 
      
 177 
     | 
    
         
            +
                  Multi_exit_disc.new(20),
         
     | 
| 
      
 178 
     | 
    
         
            +
                  Mp_reach.new( :safi=>128, :nexthop=> ['10.0.0.1'], :path_id=> 100, :nlris=> [
         
     | 
| 
      
 179 
     | 
    
         
            +
                   {:rd=> [100,100], :prefix=> '192.168.0.0/24', :label=>101},
         
     | 
| 
      
 180 
     | 
    
         
            +
                   {:rd=> [100,100], :prefix=> '192.168.1.0/24', :label=>102},
         
     | 
| 
      
 181 
     | 
    
         
            +
                   {:rd=> [100,100], :prefix=> '192.168.2.0/24', :label=>103},
         
     | 
| 
      
 182 
     | 
    
         
            +
                  ]))
         
     | 
| 
      
 183 
     | 
    
         
            +
                )
         
     | 
| 
      
 184 
     | 
    
         
            +
                assert_match(/ff{16}....020000/, upd1.to_shex)
         
     | 
| 
      
 185 
     | 
    
         
            +
                assert upd1.path_attribute.has_a_mp_reach_attr?, "Expecting a MP_REACH Attr."
         
     | 
| 
      
 186 
     | 
    
         
            +
                assert_match(/ID=100, Label Stack=102/,upd1.path_attribute[:mp_reach].to_s)
         
     | 
| 
      
 187 
     | 
    
         
            +
                
         
     | 
| 
      
 188 
     | 
    
         
            +
                # received as2byte encode aspath attr
         
     | 
| 
      
 189 
     | 
    
         
            +
                upd2 = Update.factory upd1.encode, :as4byte=> false, :path_id=>true
         
     | 
| 
      
 190 
     | 
    
         
            +
                # received as4byte encode aspath attr
         
     | 
| 
      
 191 
     | 
    
         
            +
                upd3 = Update.factory upd1.encode(o), :as4byte=> true, :path_id=>true
         
     | 
| 
      
 192 
     | 
    
         
            +
                assert_equal upd1.to_shex, upd2.to_shex
         
     | 
| 
      
 193 
     | 
    
         
            +
                assert_equal upd2.to_shex, upd3.to_shex
         
     | 
| 
      
 194 
     | 
    
         
            +
                
         
     | 
| 
      
 195 
     | 
    
         
            +
              end
         
     | 
| 
      
 196 
     | 
    
         
            +
              
         
     | 
| 
      
 197 
     | 
    
         
            +
              # updates with path_id
         
     | 
| 
      
 198 
     | 
    
         
            +
              
         
     | 
| 
      
 199 
     | 
    
         
            +
              def ext_update(s)
         
     | 
| 
      
 200 
     | 
    
         
            +
                sbin = [s.split.join].pack('H*')
         
     | 
| 
      
 201 
     | 
    
         
            +
                o = Update::Info.new(true)
         
     | 
| 
      
 202 
     | 
    
         
            +
                def o.path_id?(*args) ; true ; end
         
     | 
| 
      
 203 
     | 
    
         
            +
                def o.recv_inet_unicast? ; true ; end
         
     | 
| 
      
 204 
     | 
    
         
            +
                def o.send_inet_unicast? ; true ; end
         
     | 
| 
      
 205 
     | 
    
         
            +
                Update.factory(sbin,o)
         
     | 
| 
      
 206 
     | 
    
         
            +
              end
         
     | 
| 
      
 207 
     | 
    
         
            +
              
         
     | 
| 
      
 208 
     | 
    
         
            +
              def test_path_id_inet_unicast
         
     | 
| 
      
 209 
     | 
    
         
            +
                upd = ext_update "
         
     | 
| 
      
 210 
     | 
    
         
            +
                ffff ffff ffff ffff ffff ffff ffff ffff
         
     | 
| 
      
 211 
     | 
    
         
            +
                003c 0200 0000 1c40 0101 0040 0200 4003
         
     | 
| 
      
 212 
     | 
    
         
            +
                040a 0000 0180 0404 0000 0066 4005 0400
         
     | 
| 
      
 213 
     | 
    
         
            +
                0000 6500 0000 6419 1400 0000"
         
     | 
| 
      
 214 
     | 
    
         
            +
                assert_equal(BGP::Update, upd.class)
         
     | 
| 
      
 215 
     | 
    
         
            +
                assert_equal 'ID: 100, 20.0.0.0/25', upd.nlri.nlris[0].to_s
         
     | 
| 
      
 216 
     | 
    
         
            +
                
         
     | 
| 
      
 217 
     | 
    
         
            +
              end
         
     | 
| 
      
 218 
     | 
    
         
            +
              
         
     | 
| 
      
 219 
     | 
    
         
            +
              def test_path_id_inet_mpls_vpn_unicast
         
     | 
| 
      
 220 
     | 
    
         
            +
                s = "
         
     | 
| 
      
 221 
     | 
    
         
            +
                ffff ffff ffff ffff ffff ffff ffff ffff
         
     | 
| 
      
 222 
     | 
    
         
            +
                005f 0200 0000 4840 0101 0140 0200 8004
         
     | 
| 
      
 223 
     | 
    
         
            +
                0400 0000 0040 0504 0000 0001 c010 0800
         
     | 
| 
      
 224 
     | 
    
         
            +
                0200 0400 0000 0190 0e00 2400 0180 0c00
         
     | 
| 
      
 225 
     | 
    
         
            +
                0000 0000 0000 0001 0101 0100 0000 0001
         
     | 
| 
      
 226 
     | 
    
         
            +
                7003 e801 0000 0013 0000 0011 0a01 01"
         
     | 
| 
      
 227 
     | 
    
         
            +
                upd = ext_update(s)
         
     | 
| 
      
 228 
     | 
    
         
            +
             
     | 
| 
      
 229 
     | 
    
         
            +
                s2 = "
         
     | 
| 
      
 230 
     | 
    
         
            +
                ffffffffffffffffffffffffffffffff
         
     | 
| 
      
 231 
     | 
    
         
            +
                005e
         
     | 
| 
      
 232 
     | 
    
         
            +
                02
         
     | 
| 
      
 233 
     | 
    
         
            +
                0000
         
     | 
| 
      
 234 
     | 
    
         
            +
                0047
         
     | 
| 
      
 235 
     | 
    
         
            +
                40010101
         
     | 
| 
      
 236 
     | 
    
         
            +
                400200
         
     | 
| 
      
 237 
     | 
    
         
            +
                80040400000000
         
     | 
| 
      
 238 
     | 
    
         
            +
                40050400000001
         
     | 
| 
      
 239 
     | 
    
         
            +
                c010080002000400000001
         
     | 
| 
      
 240 
     | 
    
         
            +
                800e240001800c00000000000000000101010100000000017003e80100000013000000110a0101
         
     | 
| 
      
 241 
     | 
    
         
            +
                "
         
     | 
| 
      
 242 
     | 
    
         
            +
                assert_equal(BGP::Update, upd.class)
         
     | 
| 
      
 243 
     | 
    
         
            +
                assert upd.path_attribute.has_a_mp_reach_attr?
         
     | 
| 
      
 244 
     | 
    
         
            +
                assert_equal s2.split.join, upd.to_shex
         
     | 
| 
      
 245 
     | 
    
         
            +
                assert_equal s2.split.join, ext_update(upd.to_shex).to_shex
         
     | 
| 
      
 246 
     | 
    
         
            +
                
         
     | 
| 
      
 247 
     | 
    
         
            +
              end
         
     | 
| 
      
 248 
     | 
    
         
            +
              
         
     | 
| 
      
 249 
     | 
    
         
            +
              def test_path_id_inet_mpls_vpn_unicast_withdrawn
         
     | 
| 
      
 250 
     | 
    
         
            +
                upd = ext_update "
         
     | 
| 
      
 251 
     | 
    
         
            +
                ffff ffff ffff ffff ffff ffff ffff ffff
         
     | 
| 
      
 252 
     | 
    
         
            +
                0031 0200 0000 1a90 0f00 1600 0180 0000
         
     | 
| 
      
 253 
     | 
    
         
            +
                0001 7080 0001 0000 0001 0000 0001 0a01
         
     | 
| 
      
 254 
     | 
    
         
            +
                01"
         
     | 
| 
      
 255 
     | 
    
         
            +
                assert upd.has_a_path_attribute?
         
     | 
| 
      
 256 
     | 
    
         
            +
                assert upd.path_attribute.has_a_mp_unreach_attr?
         
     | 
| 
      
 257 
     | 
    
         
            +
                mp_unreach = upd.path_attribute[:mp_unreach]
         
     | 
| 
      
 258 
     | 
    
         
            +
                assert_equal 1, mp_unreach.nlris[0].path_id
         
     | 
| 
      
 259 
     | 
    
         
            +
                assert_equal 'ID=1, Label Stack=524288 (bottom) RD=1:1, IPv4=10.1.1.0/24', mp_unreach.nlris[0].to_s
         
     | 
| 
      
 260 
     | 
    
         
            +
              end
         
     | 
| 
       164 
261 
     | 
    
         | 
| 
       165 
262 
     | 
    
         
             
            end
         
     | 
| 
         @@ -0,0 +1,54 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
             
     | 
| 
      
 2 
     | 
    
         
            +
            require "test/unit"
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'bgp4r'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            class TestBgpNeighborAddPathCap < Test::Unit::TestCase
         
     | 
| 
      
 6 
     | 
    
         
            +
              include BGP
         
     | 
| 
      
 7 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 8 
     | 
    
         
            +
              end
         
     | 
| 
      
 9 
     | 
    
         
            +
              def test_as4_cap
         
     | 
| 
      
 10 
     | 
    
         
            +
                speaker = Open.new(4,100, 200, '10.0.0.1', OPT_PARM::CAP::As4.new(100))
         
     | 
| 
      
 11 
     | 
    
         
            +
                peer    = Open.new(4,100, 200, '10.0.0.1')
         
     | 
| 
      
 12 
     | 
    
         
            +
                assert ! Neighbor::Capabilities.new(speaker, peer).as4byte?, "AS 2-Octet encoding expected!"
         
     | 
| 
      
 13 
     | 
    
         
            +
                peer = Open.new(4,100, 200, '10.0.0.1', OPT_PARM::CAP::As4.new(100))
         
     | 
| 
      
 14 
     | 
    
         
            +
                speaker    = Open.new(4,100, 200, '10.0.0.1')
         
     | 
| 
      
 15 
     | 
    
         
            +
                assert ! Neighbor::Capabilities.new(speaker, peer).as4byte?, "AS 2-Octet encoding expected!"
         
     | 
| 
      
 16 
     | 
    
         
            +
                peer     = Open.new(4,100, 200, '10.0.0.1', OPT_PARM::CAP::As4.new(100))
         
     | 
| 
      
 17 
     | 
    
         
            +
                speaker  = Open.new(4,100, 200, '10.0.0.1', OPT_PARM::CAP::As4.new(100))
         
     | 
| 
      
 18 
     | 
    
         
            +
                assert Neighbor::Capabilities.new(speaker, peer).as4byte?, "AS 4-Octet encoding expected!"
         
     | 
| 
      
 19 
     | 
    
         
            +
              end
         
     | 
| 
      
 20 
     | 
    
         
            +
              def test_add_path_send_and_recv_inet_unicast
         
     | 
| 
      
 21 
     | 
    
         
            +
                peer    = Open.new(4,100, 200, '10.0.0.1', OPT_PARM::CAP::Add_path.new( :send_and_receive, 1, 1))
         
     | 
| 
      
 22 
     | 
    
         
            +
                speaker = Open.new(4,100, 200, '10.0.0.1', OPT_PARM::CAP::Add_path.new( :send_and_receive, 1, 1))
         
     | 
| 
      
 23 
     | 
    
         
            +
                session_cap = Neighbor::Capabilities.new(speaker, peer)
         
     | 
| 
      
 24 
     | 
    
         
            +
                assert   session_cap.send_inet_unicast?
         
     | 
| 
      
 25 
     | 
    
         
            +
                assert   session_cap.path_id_recv?(1,1)
         
     | 
| 
      
 26 
     | 
    
         
            +
                assert   session_cap.path_id_send?(1,1)
         
     | 
| 
      
 27 
     | 
    
         
            +
                assert ! session_cap.send_inet_multicast?
         
     | 
| 
      
 28 
     | 
    
         
            +
              end
         
     | 
| 
      
 29 
     | 
    
         
            +
              def test_add_path_send_and_recv_inet6_multicast
         
     | 
| 
      
 30 
     | 
    
         
            +
                peer    = Open.new(4,100, 200, '10.0.0.1', OPT_PARM::CAP::Add_path.new( :send_and_receive, 2, 2))
         
     | 
| 
      
 31 
     | 
    
         
            +
                speaker = Open.new(4,100, 200, '10.0.0.1', OPT_PARM::CAP::Add_path.new( :send_and_receive, 2, 2))
         
     | 
| 
      
 32 
     | 
    
         
            +
                session_cap = Neighbor::Capabilities.new(speaker, peer)
         
     | 
| 
      
 33 
     | 
    
         
            +
                assert  ! session_cap.send_inet_unicast?
         
     | 
| 
      
 34 
     | 
    
         
            +
                assert  session_cap.send_inet6_multicast?
         
     | 
| 
      
 35 
     | 
    
         
            +
                assert  session_cap.recv_inet6_multicast?
         
     | 
| 
      
 36 
     | 
    
         
            +
              end
         
     | 
| 
      
 37 
     | 
    
         
            +
              def test_add_path_send_and_recv_inet_mpls_vpn_unicast
         
     | 
| 
      
 38 
     | 
    
         
            +
                peer    = Open.new(4,100, 200, '10.0.0.1', OPT_PARM::CAP::Add_path.new( :send_and_receive, 1, 128))
         
     | 
| 
      
 39 
     | 
    
         
            +
                speaker = Open.new(4,100, 200, '10.0.0.1', OPT_PARM::CAP::Add_path.new( :send_and_receive, 1, 128))
         
     | 
| 
      
 40 
     | 
    
         
            +
                session_cap = Neighbor::Capabilities.new(speaker, peer)
         
     | 
| 
      
 41 
     | 
    
         
            +
                assert    session_cap.send_inet_mpls_vpn_unicast?
         
     | 
| 
      
 42 
     | 
    
         
            +
                assert  ! session_cap.send_inet6_multicast?
         
     | 
| 
      
 43 
     | 
    
         
            +
                assert  ! session_cap.recv_inet6_multicast?
         
     | 
| 
      
 44 
     | 
    
         
            +
              end
         
     | 
| 
      
 45 
     | 
    
         
            +
              def test_add_path_send_and_recv_inet_mpls_vpn_multicast
         
     | 
| 
      
 46 
     | 
    
         
            +
                peer    = Open.new(4,100, 200, '10.0.0.1', OPT_PARM::CAP::Add_path.new( :send_and_receive, 1, 129))
         
     | 
| 
      
 47 
     | 
    
         
            +
                speaker = Open.new(4,100, 200, '10.0.0.1', OPT_PARM::CAP::Add_path.new( :send_and_receive, 1, 129))
         
     | 
| 
      
 48 
     | 
    
         
            +
                session_cap = Neighbor::Capabilities.new(speaker, peer)
         
     | 
| 
      
 49 
     | 
    
         
            +
                assert    session_cap.send_inet_mpls_vpn_multicast?
         
     | 
| 
      
 50 
     | 
    
         
            +
                assert  ! session_cap.send_inet_mpls_vpn_unicast?
         
     | 
| 
      
 51 
     | 
    
         
            +
                assert  ! session_cap.send_inet6_multicast?
         
     | 
| 
      
 52 
     | 
    
         
            +
                assert  ! session_cap.recv_inet6_multicast?
         
     | 
| 
      
 53 
     | 
    
         
            +
              end
         
     | 
| 
      
 54 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,161 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #--
         
     | 
| 
      
 2 
     | 
    
         
            +
            # Copyright 2008, 2009 Jean-Michel Esnault.
         
     | 
| 
      
 3 
     | 
    
         
            +
            # All rights reserved.
         
     | 
| 
      
 4 
     | 
    
         
            +
            # See LICENSE.txt for permissions.
         
     | 
| 
      
 5 
     | 
    
         
            +
            #
         
     | 
| 
      
 6 
     | 
    
         
            +
            #
         
     | 
| 
      
 7 
     | 
    
         
            +
            # This file is part of BGP4R.
         
     | 
| 
      
 8 
     | 
    
         
            +
            # 
         
     | 
| 
      
 9 
     | 
    
         
            +
            # BGP4R is free software: you can redistribute it and/or modify
         
     | 
| 
      
 10 
     | 
    
         
            +
            # it under the terms of the GNU General Public License as published by
         
     | 
| 
      
 11 
     | 
    
         
            +
            # the Free Software Foundation, either version 3 of the License, or
         
     | 
| 
      
 12 
     | 
    
         
            +
            # (at your option) any later version.
         
     | 
| 
      
 13 
     | 
    
         
            +
            # 
         
     | 
| 
      
 14 
     | 
    
         
            +
            # BGP4R is distributed in the hope that it will be useful,
         
     | 
| 
      
 15 
     | 
    
         
            +
            # but WITHOUT ANY WARRANTY; without even the implied warranty of
         
     | 
| 
      
 16 
     | 
    
         
            +
            # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
         
     | 
| 
      
 17 
     | 
    
         
            +
            # GNU General Public License for more details.
         
     | 
| 
      
 18 
     | 
    
         
            +
            #
         
     | 
| 
      
 19 
     | 
    
         
            +
            # You should have received a copy of the GNU General Public License
         
     | 
| 
      
 20 
     | 
    
         
            +
            # along with BGP4R.  If not, see <http://www.gnu.org/licenses/>.
         
     | 
| 
      
 21 
     | 
    
         
            +
            #++
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            require "test/unit"
         
     | 
| 
      
 24 
     | 
    
         
            +
            require 'bgp4r'
         
     | 
| 
      
 25 
     | 
    
         
            +
            require 'test/helpers/server'
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            class TestBgpNeighbor < Test::Unit::TestCase
         
     | 
| 
      
 28 
     | 
    
         
            +
              include BGP
         
     | 
| 
      
 29 
     | 
    
         
            +
              include BGP::OPT_PARM::CAP
         
     | 
| 
      
 30 
     | 
    
         
            +
              include BGP::TestHelpers
         
     | 
| 
      
 31 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 32 
     | 
    
         
            +
              end
         
     | 
| 
      
 33 
     | 
    
         
            +
              def teardown
         
     | 
| 
      
 34 
     | 
    
         
            +
              end
         
     | 
| 
      
 35 
     | 
    
         
            +
              def test_open_msg
         
     | 
| 
      
 36 
     | 
    
         
            +
                neighbor = Neighbor.new \
         
     | 
| 
      
 37 
     | 
    
         
            +
                  :version=> 4, 
         
     | 
| 
      
 38 
     | 
    
         
            +
                  :my_as=> 100, 
         
     | 
| 
      
 39 
     | 
    
         
            +
                  :remote_addr => '192.168.1.200',
         
     | 
| 
      
 40 
     | 
    
         
            +
                  :local_addr => '192.168.1.5', 
         
     | 
| 
      
 41 
     | 
    
         
            +
                  :id=> '1.1.1.1', 
         
     | 
| 
      
 42 
     | 
    
         
            +
                  :holdtime=> 20
         
     | 
| 
      
 43 
     | 
    
         
            +
                neighbor.capability Mbgp.ipv4_unicast
         
     | 
| 
      
 44 
     | 
    
         
            +
                neighbor.capability Mbgp.ipv4_multicast
         
     | 
| 
      
 45 
     | 
    
         
            +
                neighbor.capability Route_refresh.new
         
     | 
| 
      
 46 
     | 
    
         
            +
                neighbor.capability Route_refresh.new 128
         
     | 
| 
      
 47 
     | 
    
         
            +
                neighbor.capability As4.new(100)
         
     | 
| 
      
 48 
     | 
    
         
            +
                open_msg = neighbor.open
         
     | 
| 
      
 49 
     | 
    
         
            +
                assert_equal(5,open_msg.opt_parms.size)
         
     | 
| 
      
 50 
     | 
    
         
            +
                assert_equal(4,open_msg.version)
         
     | 
| 
      
 51 
     | 
    
         
            +
                assert_equal(20,open_msg.holdtime)
         
     | 
| 
      
 52 
     | 
    
         
            +
                assert_equal(100,open_msg.local_as)
         
     | 
| 
      
 53 
     | 
    
         
            +
                # puts neighbor
         
     | 
| 
      
 54 
     | 
    
         
            +
              end
         
     | 
| 
      
 55 
     | 
    
         
            +
              def test_neighbor_state_methods
         
     | 
| 
      
 56 
     | 
    
         
            +
                neighbor = Neighbor.new \
         
     | 
| 
      
 57 
     | 
    
         
            +
                  :version=> 4, 
         
     | 
| 
      
 58 
     | 
    
         
            +
                  :my_as=> 100, 
         
     | 
| 
      
 59 
     | 
    
         
            +
                  :remote_addr => '192.168.1.200', 
         
     | 
| 
      
 60 
     | 
    
         
            +
                  :local_addr => '192.168.1.5', 
         
     | 
| 
      
 61 
     | 
    
         
            +
                  :id=> '1.1.1.1', 
         
     | 
| 
      
 62 
     | 
    
         
            +
                  :holdtime=> 20
         
     | 
| 
      
 63 
     | 
    
         
            +
                assert neighbor.is_idle?
         
     | 
| 
      
 64 
     | 
    
         
            +
                assert ! neighbor.is_established?
         
     | 
| 
      
 65 
     | 
    
         
            +
                assert ! neighbor.is_openrecv?
         
     | 
| 
      
 66 
     | 
    
         
            +
                assert ! neighbor.is_openconfirm?
         
     | 
| 
      
 67 
     | 
    
         
            +
              end
         
     | 
| 
      
 68 
     | 
    
         
            +
              def test_start
         
     | 
| 
      
 69 
     | 
    
         
            +
                start_server(3456)
         
     | 
| 
      
 70 
     | 
    
         
            +
                @c = Neighbor.new(4, 100, 180, '0.0.0.2', '127.0.0.1', '127.0.0.1')
         
     | 
| 
      
 71 
     | 
    
         
            +
                @c.start :port=> 3456
         
     | 
| 
      
 72 
     | 
    
         
            +
                assert_equal('Established', @c.state)
         
     | 
| 
      
 73 
     | 
    
         
            +
                assert_equal('Established', @s.state)
         
     | 
| 
      
 74 
     | 
    
         
            +
                stop_server
         
     | 
| 
      
 75 
     | 
    
         
            +
              end
         
     | 
| 
      
 76 
     | 
    
         
            +
              def test_start_no_blocking
         
     | 
| 
      
 77 
     | 
    
         
            +
                start_server(3333)
         
     | 
| 
      
 78 
     | 
    
         
            +
                @c = Neighbor.new(4, 100, 180, '0.0.0.2', '127.0.0.1', '127.0.0.1')
         
     | 
| 
      
 79 
     | 
    
         
            +
                @c.start :port=> 3333, :no_blocking=>true
         
     | 
| 
      
 80 
     | 
    
         
            +
                assert_equal('OpenSent', @c.state)
         
     | 
| 
      
 81 
     | 
    
         
            +
                assert_match(/(Active|OpenSent)/, @s.state)
         
     | 
| 
      
 82 
     | 
    
         
            +
                stop_server
         
     | 
| 
      
 83 
     | 
    
         
            +
              end
         
     | 
| 
      
 84 
     | 
    
         
            +
              def test_send_and_receive_path_id_afi_1_safi_1
         
     | 
| 
      
 85 
     | 
    
         
            +
                server_add_path_cap = BGP::OPT_PARM::CAP::Add_path.new
         
     | 
| 
      
 86 
     | 
    
         
            +
                server_add_path_cap.add(:send_and_recv, 1, 1)
         
     | 
| 
      
 87 
     | 
    
         
            +
                start_server(3456, server_add_path_cap)
         
     | 
| 
      
 88 
     | 
    
         
            +
                @c = Neighbor.new(4, 100, 180, '0.0.0.2', '127.0.0.1', '127.0.0.1')
         
     | 
| 
      
 89 
     | 
    
         
            +
                @c.add_cap server_add_path_cap
         
     | 
| 
      
 90 
     | 
    
         
            +
                @c.start :port=> 3456    
         
     | 
| 
      
 91 
     | 
    
         
            +
                assert @s.session_info.recv_inet_unicast?, 
         
     | 
| 
      
 92 
     | 
    
         
            +
                        "Should have the capability to recv inet unicast reachability path info."
         
     | 
| 
      
 93 
     | 
    
         
            +
                assert @s.session_info.send_inet_unicast?, 
         
     | 
| 
      
 94 
     | 
    
         
            +
                        "Should have the capability to send inet unicast reachability path info."
         
     | 
| 
      
 95 
     | 
    
         
            +
                assert @c.session_info.recv_inet_unicast?, 
         
     | 
| 
      
 96 
     | 
    
         
            +
                        "Should have the capability to recv inet unicast reachability path info."
         
     | 
| 
      
 97 
     | 
    
         
            +
                assert @c.session_info.send_inet_unicast?, 
         
     | 
| 
      
 98 
     | 
    
         
            +
                       "Should have the capability to send inet unicast reachability path info."
         
     | 
| 
      
 99 
     | 
    
         
            +
                stop_server
         
     | 
| 
      
 100 
     | 
    
         
            +
              end
         
     | 
| 
      
 101 
     | 
    
         
            +
              def test_send_path_id_afi_1_safi_1
         
     | 
| 
      
 102 
     | 
    
         
            +
                server_add_path_cap = BGP::OPT_PARM::CAP::Add_path.new
         
     | 
| 
      
 103 
     | 
    
         
            +
                server_add_path_cap.add(:send, 1, 1)
         
     | 
| 
      
 104 
     | 
    
         
            +
                client_add_path_cap = BGP::OPT_PARM::CAP::Add_path.new
         
     | 
| 
      
 105 
     | 
    
         
            +
                client_add_path_cap.add(:recv, 1, 1)
         
     | 
| 
      
 106 
     | 
    
         
            +
                start_server(3456, server_add_path_cap)
         
     | 
| 
      
 107 
     | 
    
         
            +
                @c = Neighbor.new(4, 100, 180, '0.0.0.2', '127.0.0.1', '127.0.0.1')
         
     | 
| 
      
 108 
     | 
    
         
            +
                @c.add_cap client_add_path_cap
         
     | 
| 
      
 109 
     | 
    
         
            +
                @c.start :port=> 3456    
         
     | 
| 
      
 110 
     | 
    
         
            +
                assert ! @s.session_info.recv_inet_unicast?, 
         
     | 
| 
      
 111 
     | 
    
         
            +
                        "Should NOT have the capability to recv inet unicast reachability path info."
         
     | 
| 
      
 112 
     | 
    
         
            +
                assert   @s.session_info.send_inet_unicast?, 
         
     | 
| 
      
 113 
     | 
    
         
            +
                        "Should have the capability to send inet unicast reachability path info."
         
     | 
| 
      
 114 
     | 
    
         
            +
                assert @c.session_info.recv_inet_unicast?, 
         
     | 
| 
      
 115 
     | 
    
         
            +
                        "Should have the capability to recv inet unicast reachability path info."
         
     | 
| 
      
 116 
     | 
    
         
            +
                assert ! @c.session_info.send_inet_unicast?, 
         
     | 
| 
      
 117 
     | 
    
         
            +
                       "Should NOT have the capability to send inet unicast reachability path info."
         
     | 
| 
      
 118 
     | 
    
         
            +
                stop_server
         
     | 
| 
      
 119 
     | 
    
         
            +
              end
         
     | 
| 
      
 120 
     | 
    
         
            +
              def test_recv_path_id_afi_1_safi_1
         
     | 
| 
      
 121 
     | 
    
         
            +
                server_add_path_cap = BGP::OPT_PARM::CAP::Add_path.new
         
     | 
| 
      
 122 
     | 
    
         
            +
                server_add_path_cap.add(:recv, 1, 1)
         
     | 
| 
      
 123 
     | 
    
         
            +
                client_add_path_cap = BGP::OPT_PARM::CAP::Add_path.new
         
     | 
| 
      
 124 
     | 
    
         
            +
                client_add_path_cap.add(:send, 1, 1)
         
     | 
| 
      
 125 
     | 
    
         
            +
                start_server(3456, server_add_path_cap)
         
     | 
| 
      
 126 
     | 
    
         
            +
                @c = Neighbor.new(4, 100, 180, '0.0.0.2', '127.0.0.1', '127.0.0.1')
         
     | 
| 
      
 127 
     | 
    
         
            +
                @c.add_cap client_add_path_cap
         
     | 
| 
      
 128 
     | 
    
         
            +
                @c.start :port=> 3456    
         
     | 
| 
      
 129 
     | 
    
         
            +
                assert  @s.session_info.recv_inet_unicast?, 
         
     | 
| 
      
 130 
     | 
    
         
            +
                        "Should have the capability to recv inet unicast reachability path info."
         
     | 
| 
      
 131 
     | 
    
         
            +
                assert !  @s.session_info.send_inet_unicast?, 
         
     | 
| 
      
 132 
     | 
    
         
            +
                        "Should NOT have the capability to send inet unicast reachability path info."
         
     | 
| 
      
 133 
     | 
    
         
            +
                assert ! @c.session_info.recv_inet_unicast?, 
         
     | 
| 
      
 134 
     | 
    
         
            +
                        "Should NOT have the capability to recv inet unicast reachability path info."
         
     | 
| 
      
 135 
     | 
    
         
            +
                assert  @c.session_info.send_inet_unicast?, 
         
     | 
| 
      
 136 
     | 
    
         
            +
                       "Should have the capability to send inet unicast reachability path info."
         
     | 
| 
      
 137 
     | 
    
         
            +
                stop_server
         
     | 
| 
      
 138 
     | 
    
         
            +
              end
         
     | 
| 
      
 139 
     | 
    
         
            +
             
     | 
| 
      
 140 
     | 
    
         
            +
              def test_nor_recv_nor_send_path_id_afi_1_safi_1
         
     | 
| 
      
 141 
     | 
    
         
            +
                server_add_path_cap = BGP::OPT_PARM::CAP::Add_path.new
         
     | 
| 
      
 142 
     | 
    
         
            +
                server_add_path_cap.add(:recv, 1, 1)
         
     | 
| 
      
 143 
     | 
    
         
            +
                client_add_path_cap = BGP::OPT_PARM::CAP::Add_path.new
         
     | 
| 
      
 144 
     | 
    
         
            +
                client_add_path_cap.add(:recv, 1, 1)
         
     | 
| 
      
 145 
     | 
    
         
            +
                start_server(3456, server_add_path_cap)
         
     | 
| 
      
 146 
     | 
    
         
            +
                @c = Neighbor.new(4, 100, 180, '0.0.0.2', '127.0.0.1', '127.0.0.1')
         
     | 
| 
      
 147 
     | 
    
         
            +
                @c.add_cap client_add_path_cap
         
     | 
| 
      
 148 
     | 
    
         
            +
                @c.start :port=> 3456    
         
     | 
| 
      
 149 
     | 
    
         
            +
                assert ! @s.session_info.recv_inet_unicast?, 
         
     | 
| 
      
 150 
     | 
    
         
            +
                        "Should NOT have the capability to recv inet unicast reachability path info."
         
     | 
| 
      
 151 
     | 
    
         
            +
                assert !  @s.session_info.send_inet_unicast?, 
         
     | 
| 
      
 152 
     | 
    
         
            +
                        "Should NOT have the capability to send inet unicast reachability path info."
         
     | 
| 
      
 153 
     | 
    
         
            +
                assert ! @c.session_info.recv_inet_unicast?, 
         
     | 
| 
      
 154 
     | 
    
         
            +
                        "Should NOT have the capability to recv inet unicast reachability path info."
         
     | 
| 
      
 155 
     | 
    
         
            +
                assert ! @c.session_info.send_inet_unicast?, 
         
     | 
| 
      
 156 
     | 
    
         
            +
                       "Should have the capability to send inet unicast reachability path info."
         
     | 
| 
      
 157 
     | 
    
         
            +
                stop_server
         
     | 
| 
      
 158 
     | 
    
         
            +
              end
         
     | 
| 
      
 159 
     | 
    
         
            +
             
     | 
| 
      
 160 
     | 
    
         
            +
             
     | 
| 
      
 161 
     | 
    
         
            +
            end
         
     | 
    
        data/test/nlris/ext_nlri_test.rb
    CHANGED
    
    | 
         @@ -1,67 +1,32 @@ 
     | 
|
| 
       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 
     | 
    
         
            -
            #++
         
     | 
| 
      
 1 
     | 
    
         
            +
            require "test/unit"
         
     | 
| 
       22 
2 
     | 
    
         | 
| 
       23 
     | 
    
         
            -
            require  
     | 
| 
       24 
     | 
    
         
            -
            require  
     | 
| 
      
 3 
     | 
    
         
            +
            require "bgp/nlris/nlri"
         
     | 
| 
      
 4 
     | 
    
         
            +
            require "bgp/nlris/inet"
         
     | 
| 
      
 5 
     | 
    
         
            +
            require "bgp/nlris/vpn"
         
     | 
| 
      
 6 
     | 
    
         
            +
            require "bgp/nlris/labeled"
         
     | 
| 
      
 7 
     | 
    
         
            +
            require "bgp/nlris/rd"
         
     | 
| 
       25 
8 
     | 
    
         | 
| 
       26 
9 
     | 
    
         
             
            class TestExtNlri < Test::Unit::TestCase
         
     | 
| 
       27 
10 
     | 
    
         
             
              include BGP
         
     | 
| 
       28 
     | 
    
         
            -
              def  
     | 
| 
       29 
     | 
    
         
            -
                 
     | 
| 
       30 
     | 
    
         
            -
                 
     | 
| 
       31 
     | 
    
         
            -
                 
     | 
| 
       32 
     | 
    
         
            -
                 
     | 
| 
       33 
     | 
    
         
            -
                s = '0f140010140011140000'
         
     | 
| 
       34 
     | 
    
         
            -
                nlri2 = Nlri.new([s].pack('H*'))
         
     | 
| 
       35 
     | 
    
         
            -
                assert_equal('0f140010140011140000', nlri2.to_shex)
         
     | 
| 
       36 
     | 
    
         
            -
                assert_raise(ArgumentError)  { nlri2.to_shex(true) }
         
     | 
| 
       37 
     | 
    
         
            -
                assert_equal(3,nlri2.nlris.size)    
         
     | 
| 
      
 11 
     | 
    
         
            +
              def test_ext_nlri
         
     | 
| 
      
 12 
     | 
    
         
            +
                ext_nlri = Ext_Nlri.new(100, Nlri.new('10.0.0.0/8'))
         
     | 
| 
      
 13 
     | 
    
         
            +
                assert_equal '00000064080a', ext_nlri.to_shex
         
     | 
| 
      
 14 
     | 
    
         
            +
                assert_equal '00000064080a', Ext_Nlri.new_ntop(ext_nlri.encode).to_shex
         
     | 
| 
      
 15 
     | 
    
         
            +
                assert_equal '00000001200a0a0a0a', Ext_Nlri.new_ntop(['00000001200a0a0a0a'].pack('H*')).to_shex
         
     | 
| 
       38 
16 
     | 
    
         
             
              end
         
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
              def test_1
         
     | 
| 
       44 
     | 
    
         
            -
                nlri1 = Nlri.new
         
     | 
| 
       45 
     | 
    
         
            -
                nlri1 << Nlri::Ip4.new('20.0.0.0/15')
         
     | 
| 
       46 
     | 
    
         
            -
                nlri1 << '20.0.0.0/17'
         
     | 
| 
       47 
     | 
    
         
            -
                nlri1 << '20.0.0.0/24'
         
     | 
| 
       48 
     | 
    
         
            -
                s = '0f140010140011140000'
         
     | 
| 
       49 
     | 
    
         
            -
                nlri2 = Nlri.new([s].pack('H*'))
         
     | 
| 
       50 
     | 
    
         
            -
                assert_equal('0f140010140011140000', nlri2.to_shex)
         
     | 
| 
       51 
     | 
    
         
            -
                assert_raise(ArgumentError)  { nlri2.to_shex(true) }
         
     | 
| 
       52 
     | 
    
         
            -
                assert_equal(3,nlri2.nlris.size)
         
     | 
| 
       53 
     | 
    
         
            -
                     
         
     | 
| 
      
 17 
     | 
    
         
            +
              def _test_ext_nlris
         
     | 
| 
      
 18 
     | 
    
         
            +
                ext_nlri = Ext_Nlri.new(100, Nlri.new('10.0.0.0/8','20.0.0.0/8'))
         
     | 
| 
      
 19 
     | 
    
         
            +
                assert_equal '00000064080a', ext_nlri.to_shex
         
     | 
| 
      
 20 
     | 
    
         
            +
                assert_equal '00000064080a', Ext_Nlri.new_ntop(ext_nlri.encode).to_shex
         
     | 
| 
       54 
21 
     | 
    
         
             
              end
         
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
             
     | 
| 
       57 
     | 
    
         
            -
                 
     | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
                 
     | 
| 
       61 
     | 
    
         
            -
                 
     | 
| 
       62 
     | 
    
         
            -
                 
     | 
| 
       63 
     | 
    
         
            -
                 
     | 
| 
       64 
     | 
    
         
            -
                assert_raise(ArgumentError)  { nlri2.to_shex(true) }
         
     | 
| 
       65 
     | 
    
         
            -
                assert_equal(3,nlri2.nlris.size)      
         
     | 
| 
      
 22 
     | 
    
         
            +
              def test_ext_inet
         
     | 
| 
      
 23 
     | 
    
         
            +
                assert_equal '0000006410c0a8', Ext_Nlri.new(100, Inet_multicast.new('192.168.0.0/16')).to_shex
         
     | 
| 
      
 24 
     | 
    
         
            +
                assert_equal '00000064402011131100000000', Ext_Nlri.new(100, Inet_multicast.new('2011:1311::/64')).to_shex
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
              def test_ext_labeled
         
     | 
| 
      
 27 
     | 
    
         
            +
                assert_equal '00000064600000100000200000310a0000', Ext_Nlri.new(100, Labeled.new(Prefix.new('10.0.0.1/24'),1,2,3)).to_shex
         
     | 
| 
      
 28 
     | 
    
         
            +
                assert_equal '00000064800006500006610000006400000064c0a8', Ext_Nlri.new(100, Labeled.new(Vpn.new('192.168.0.0/16', Rd.new(100,100)),101,102)).to_shex
         
     | 
| 
      
 29 
     | 
    
         
            +
                assert_equal '00000064b80006500006600006710000006400000064200900040005', Ext_Nlri.new(100, Labeled.new(Vpn.new('2009:4:5::1/48', Rd.new(100,100)),101,102,103)).to_shex
         
     | 
| 
      
 30 
     | 
    
         
            +
                assert_match(/ID=100, Label Stack=101/, Ext_Nlri.new(100, Labeled.new(Vpn.new('2009:4:5::1/48', Rd.new(100,100)),101,102,103)).to_s)
         
     | 
| 
       66 
31 
     | 
    
         
             
              end
         
     | 
| 
       67 
     | 
    
         
            -
            end
         
     | 
| 
      
 32 
     | 
    
         
            +
            end
         
     |