ospfv2 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. checksums.yaml +7 -0
  2. data/COPYING +674 -0
  3. data/LICENSE.txt +53 -0
  4. data/README +50 -0
  5. data/bin/ospfv2 +112 -105
  6. data/changelog.txt +7 -0
  7. data/gemspec +17 -0
  8. data/lib/ie/external_route.rb +9 -0
  9. data/lib/ie/id.rb +3 -4
  10. data/lib/ie/ie.rb +12 -0
  11. data/lib/ie/ls_age.rb +35 -5
  12. data/lib/ie/ls_type.rb +40 -37
  13. data/lib/ie/opaque_id.rb +46 -0
  14. data/lib/ie/opaque_type.rb +96 -0
  15. data/lib/ie/options.rb +5 -3
  16. data/lib/ie/router_link.rb +30 -7
  17. data/lib/ie/router_link_type.rb +116 -27
  18. data/lib/ie/sequence_number.rb +7 -3
  19. data/lib/infra/ospf_common.rb +1 -12
  20. data/lib/infra/ospf_io.rb +14 -8
  21. data/lib/infra/ospf_socket.rb +14 -14
  22. data/lib/infra/parse_options.rb +69 -25
  23. data/lib/ls_db/advertised_routers.rb +1 -1
  24. data/lib/ls_db/link_state_database.rb +74 -39
  25. data/lib/ls_db/link_state_database_build.rb +3 -3
  26. data/lib/ls_db/link_state_database_links.rb +7 -2
  27. data/lib/ls_db/lsdb_ios.rb +59 -0
  28. data/lib/lsa/external.rb +35 -2
  29. data/lib/lsa/lsa.rb +128 -35
  30. data/lib/lsa/lsa_factory.rb +20 -7
  31. data/lib/lsa/network.rb +44 -9
  32. data/lib/lsa/router.rb +14 -2
  33. data/lib/lsa/summary.rb +16 -3
  34. data/lib/lsa/tlv/color.rb +47 -0
  35. data/lib/lsa/tlv/link.rb +122 -0
  36. data/lib/lsa/tlv/link_id.rb +55 -0
  37. data/lib/lsa/tlv/link_type.rb +44 -0
  38. data/lib/lsa/tlv/local_interface.rb +56 -0
  39. data/lib/lsa/tlv/maximum_bandwidth.rb +55 -0
  40. data/lib/lsa/tlv/maximum_reservable_bandwidth.rb +52 -0
  41. data/lib/lsa/tlv/remote_interface.rb +58 -0
  42. data/lib/lsa/tlv/router_address.rb +57 -0
  43. data/lib/lsa/tlv/tlv.rb +32 -0
  44. data/lib/lsa/tlv/tlv_factory.rb +72 -0
  45. data/lib/lsa/tlv/traffic_engineering_metric.rb +52 -0
  46. data/lib/lsa/tlv/unreserved_bandwidth.rb +55 -0
  47. data/lib/lsa/traffic_engineering.rb +95 -0
  48. data/lib/neighbor/neighbor.rb +9 -9
  49. data/lib/packet/link_state_update.rb +16 -14
  50. data/lib/packet/ospf_packet.rb +13 -9
  51. data/test/unit/ie/au_type_test.rb +18 -0
  52. data/test/unit/ie/external_route_test.rb +51 -0
  53. data/test/unit/ie/id_test.rb +22 -0
  54. data/test/unit/ie/interface_mtu_test.rb +23 -0
  55. data/test/unit/ie/ls_age_test.rb +46 -0
  56. data/test/unit/ie/ls_type_test.rb +41 -0
  57. data/test/unit/ie/metric_test.rb +24 -0
  58. data/test/unit/ie/mt_metric_test.rb +27 -0
  59. data/test/unit/ie/opaque_id_test.rb +22 -0
  60. data/test/unit/ie/opaque_type_test.rb +22 -0
  61. data/test/unit/ie/options_test.rb +142 -0
  62. data/test/unit/ie/ospf_version_test.rb +0 -0
  63. data/test/unit/ie/packet_type_test.rb +33 -0
  64. data/test/unit/ie/router_link_factory_test.rb +26 -0
  65. data/test/unit/ie/router_link_test.rb +276 -0
  66. data/test/unit/ie/router_link_type_test.rb +24 -0
  67. data/test/unit/ie/sequence_number_test.rb +31 -0
  68. data/test/unit/ie/tos_metric_test.rb +27 -0
  69. data/test/unit/infra/ospf_common_test.rb +42 -0
  70. data/test/unit/infra/parse_options_test.rb +58 -0
  71. data/test/unit/infra/timer_test.rb +94 -0
  72. data/test/unit/ls_db/all +10 -0
  73. data/test/unit/ls_db/link_state_database_build_test.rb +140 -0
  74. data/test/unit/ls_db/link_state_database_links_tests.rb +74 -0
  75. data/test/unit/ls_db/link_state_database_test.rb +444 -0
  76. data/test/unit/ls_db/links_test.rb +49 -0
  77. data/test/unit/lsa/all +10 -0
  78. data/test/unit/lsa/external_test.rb +218 -0
  79. data/test/unit/lsa/lsa_factory_test.rb +314 -0
  80. data/test/unit/lsa/lsa_test.rb +191 -0
  81. data/test/unit/lsa/network_test.rb +107 -0
  82. data/test/unit/lsa/router_test.rb +614 -0
  83. data/test/unit/lsa/summary_test.rb +135 -0
  84. data/test/unit/lsa/tlv/color_test.rb +39 -0
  85. data/test/unit/lsa/tlv/link_id_test.rb +14 -0
  86. data/test/unit/lsa/tlv/link_test.rb +413 -0
  87. data/test/unit/lsa/tlv/link_type_test.rb +16 -0
  88. data/test/unit/lsa/tlv/local_interface_test.rb +15 -0
  89. data/test/unit/lsa/tlv/maximum_bandwidth_test.rb +14 -0
  90. data/test/unit/lsa/tlv/maximum_reservable_bandwidth_test.rb +13 -0
  91. data/test/unit/lsa/tlv/remote_interface_test.rb +14 -0
  92. data/test/unit/lsa/tlv/router_address_test.rb +16 -0
  93. data/test/unit/lsa/tlv/tlv_factory_test.rb +89 -0
  94. data/test/unit/lsa/tlv/traffic_engineering_metric_test.rb +15 -0
  95. data/test/unit/lsa/traffic_engineering_test.rb +65 -0
  96. data/test/unit/neighbor/neighbor_test.rb +82 -0
  97. data/test/unit/packet/all +10 -0
  98. data/test/unit/packet/database_description_test.rb +114 -0
  99. data/test/unit/packet/hello_test.rb +107 -0
  100. data/test/unit/packet/link_state_ack_test.rb +64 -0
  101. data/test/unit/packet/link_state_request_test.rb +168 -0
  102. data/test/unit/packet/link_state_update_test.rb +62 -0
  103. data/test/unit/packet/ospf_packet_test.rb +91 -0
  104. metadata +106 -51
  105. data/lib/infra/to_s.rb +0 -38
  106. data/lib/lsa/lsa_base.rb +0 -430
  107. data/lib/lsa/opaque.rb +0 -143
@@ -0,0 +1,16 @@
1
+ require "test/unit"
2
+
3
+ require "lsa/tlv/link_type"
4
+
5
+ class TestLsaTlvLinkType < Test::Unit::TestCase
6
+ include OSPFv2
7
+ def test_new
8
+ assert_equal("0001000101000000", LinkType_Tlv.new().to_shex)
9
+ assert_equal("Link Type : p2p", LinkType_Tlv.new({:link_type=>1}).to_s)
10
+ assert_equal("Link Type : multiaccess", LinkType_Tlv.new({:link_type=>2}).to_s)
11
+ assert_equal(1, LinkType_Tlv.new({:link_type=>1}).to_hash[:link_type])
12
+ assert_equal("0001000101000000", LinkType_Tlv.new({:link_type=>1}).to_shex)
13
+ assert_equal("0001000101000000", LinkType_Tlv.new(LinkType_Tlv.new({:link_type=>1}).encode).to_shex)
14
+ assert_equal(true, LinkType_Tlv.new({:link_type=>1}).kind_of?(SubTlv))
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ require "test/unit"
2
+
3
+ require "lsa/tlv/local_interface"
4
+
5
+ class TestTlvLsaLocalInterface < Test::Unit::TestCase
6
+ include OSPFv2
7
+ def test_new
8
+ assert_equal("0003000400000000", LocalInterfaceIpAddress_Tlv.new().to_shex)
9
+ assert_equal("Interface Address : 1.1.1.1", LocalInterfaceIpAddress_Tlv.new({:ip_address=>"1.1.1.1"}).to_s)
10
+ assert_equal("1.1.1.1", LocalInterfaceIpAddress_Tlv.new({:ip_address=>"1.1.1.1"}).to_hash[:ip_address])
11
+ assert_equal("0003000401010101", LocalInterfaceIpAddress_Tlv.new({:ip_address=>"1.1.1.1"}).to_shex)
12
+ assert_equal("0003000401010101", LocalInterfaceIpAddress_Tlv.new(LocalInterfaceIpAddress_Tlv.new({:ip_address=>"1.1.1.1"}).encode).to_shex)
13
+ end
14
+ end
15
+
@@ -0,0 +1,14 @@
1
+ require "test/unit"
2
+
3
+ require "lsa/tlv/maximum_bandwidth"
4
+
5
+ class TestLsaTlvMaximumBandwidth < Test::Unit::TestCase
6
+ include OSPFv2
7
+ def test_case_name
8
+ assert_equal("0006000400000000", MaximumBandwidth_Tlv.new().to_shex)
9
+ assert_equal("Maximum bandwidth : 10000", MaximumBandwidth_Tlv.new( :max_bw=>10_000.0 ).to_s)
10
+ assert_equal("00060004449c4000", MaximumBandwidth_Tlv.new( :max_bw=>10_000.0 ).to_shex)
11
+ assert_equal(10000, MaximumBandwidth_Tlv.new( :max_bw=>10_000.0 ).to_hash[:max_bw])
12
+ assert_equal("00060004449c4000", MaximumBandwidth_Tlv.new(['00060004449c4000'].pack('H*')).to_shex)
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ require "test/unit"
2
+
3
+ require "lsa/tlv/maximum_reservable_bandwidth"
4
+
5
+ class TestLsaTlvMaximumReservableBandwitdh < Test::Unit::TestCase
6
+ include OSPFv2
7
+ def test_new
8
+ assert_equal("0007000400000000", MaximumReservableBandwidth_Tlv.new().to_shex)
9
+ assert_equal("Maximum reservable bandwidth : 10000", MaximumReservableBandwidth_Tlv.new({:max_resv_bw=>10_000}).to_s)
10
+ assert_equal(255, MaximumReservableBandwidth_Tlv.new({:max_resv_bw=>255}).to_hash[:max_resv_bw])
11
+ assert_equal("0007000445ffff00", MaximumReservableBandwidth_Tlv.new({:max_resv_bw=>0xffff}).to_shex)
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ require "test/unit"
2
+
3
+ require "lsa/tlv/remote_interface"
4
+
5
+ class TestLsaTlvRemoteInterface < Test::Unit::TestCase
6
+ include OSPFv2
7
+ def test_new
8
+ assert_equal("0004000400000000", RemoteInterfaceIpAddress_Tlv.new().to_shex)
9
+ assert_equal("Neighbor Address : 1.1.1.1", RemoteInterfaceIpAddress_Tlv.new({:ip_address=>"1.1.1.1"}).to_s)
10
+ assert_equal("1.1.1.1", RemoteInterfaceIpAddress_Tlv.new({:ip_address=>"1.1.1.1"}).to_hash[:ip_address])
11
+ assert_equal("0004000401010101", RemoteInterfaceIpAddress_Tlv.new({:ip_address=>"1.1.1.1"}).to_shex)
12
+ assert_equal("0004000401010101", RemoteInterfaceIpAddress_Tlv.new(RemoteInterfaceIpAddress_Tlv.new({:ip_address=>"1.1.1.1"}).encode).to_shex)
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ require "test/unit"
2
+
3
+ require "lsa/tlv/router_address"
4
+
5
+ class TestLsaTlvRouterAddress < Test::Unit::TestCase
6
+ include OSPFv2
7
+ def test_new
8
+ assert_equal("0001000400000000", RouterAddress_Tlv.new().to_shex)
9
+ assert_equal("RouterID TLV: 1.1.1.1", RouterAddress_Tlv.new(:ip_address=>"1.1.1.1").to_s)
10
+ assert_equal("1.1.1.1", RouterAddress_Tlv.new(:ip_address=>"1.1.1.1").to_hash[:ip_address])
11
+ assert_equal("0001000401010101", RouterAddress_Tlv.new(:ip_address=>"1.1.1.1").to_shex)
12
+ assert_equal("0001000401010101", RouterAddress_Tlv.new(RouterAddress_Tlv.new(:ip_address=>"1.1.1.1").encode).to_shex)
13
+ assert_equal(true, RouterAddress_Tlv.new(:ip_address=>"1.1.1.1").is_a?(Tlv))
14
+ assert_equal(1, RouterAddress_Tlv.new(:ip_address=>"1.1.1.1").tlv_type)
15
+ end
16
+ end
@@ -0,0 +1,89 @@
1
+ require "test/unit"
2
+
3
+ require "lsa/tlv/tlv_factory"
4
+
5
+ class TestLsaTlvTlvFactory < Test::Unit::TestCase
6
+ include OSPFv2
7
+ def test_router_address
8
+ h = {:tlv_type=>1, :ip_address=>"1.1.1.1"}
9
+ tlv = Tlv.factory(h)
10
+ assert_equal(h, tlv.to_hash)
11
+ assert_equal(h, Tlv.factory(tlv.to_hash).to_hash)
12
+ end
13
+ def test_link
14
+ h = {
15
+ :tlv_type=>2,
16
+ :tlvs=> [
17
+ {:tlv_type=>1, :link_type=>1},
18
+ {:tlv_type=>2, :link_id=>"1.2.3.4"},
19
+ {:tlv_type=>3, :ip_address=>"1.1.1.1"},
20
+ {:tlv_type=>4, :ip_address=>"2.2.2.2"},
21
+ {:tlv_type=>5, :te_metric=>255},
22
+ {:max_bw=>10000, :tlv_type=>6},
23
+ {:tlv_type=>7, :max_resv_bw=>0.0},
24
+ {:tlv_type=>8, :unreserved_bw=>[100, 100, 100, 100, 100, 100, 100, 100]}
25
+ ]}
26
+ tlv = Tlv.factory(h)
27
+ assert_equal(h, tlv.to_hash)
28
+ assert_equal(h, Tlv.factory(tlv.to_hash).to_hash)
29
+ end
30
+
31
+ end
32
+
33
+ class TestSubTlvFactory < Test::Unit::TestCase
34
+ include OSPFv2
35
+ def test_link_type_sub_tlv
36
+ s = ['0001000101000000'].pack('H*')
37
+ tlv = SubTlv.factory(s)
38
+ assert_equal(LinkType_Tlv, tlv.class)
39
+ assert_equal(s, tlv.encode)
40
+ tlv = SubTlv.factory(:tlv_type=>1, :link_type=>1)
41
+ assert_equal(LinkType_Tlv, tlv.class)
42
+ assert_equal({:link_type=>1, :tlv_type=>1}, tlv.to_hash)
43
+ assert_equal('0001000101000000', tlv.to_shex)
44
+ end
45
+ def test_link_id_sub_tlv
46
+ s = ['0002000401020304'].pack('H*')
47
+ tlv = SubTlv.factory(s)
48
+ assert_equal(LinkId_Tlv, tlv.class)
49
+ assert_equal(s, tlv.encode)
50
+ end
51
+ def test_local_interface_sub_tlv
52
+ s = ['0003000401020304'].pack('H*')
53
+ tlv = SubTlv.factory(s)
54
+ assert_equal(LocalInterfaceIpAddress_Tlv, tlv.class)
55
+ assert_equal(s, tlv.encode)
56
+ end
57
+ def test_remote_interface_sub_tlv
58
+ s = ['0004000401020304'].pack('H*')
59
+ tlv = SubTlv.factory(s)
60
+ assert_equal(RemoteInterfaceIpAddress_Tlv, tlv.class)
61
+ assert_equal(s, tlv.encode)
62
+ end
63
+ def test_te_metric_sub_tlv
64
+ s = ['0005000400000064'].pack('H*')
65
+ tlv = SubTlv.factory(s)
66
+ assert_equal(TrafficEngineeringMetric_Tlv, tlv.class)
67
+ assert_equal(s, tlv.encode)
68
+ end
69
+ def test_max_bw_sub_tlv
70
+ s = ['000600043f800000'].pack('H*')
71
+ tlv = SubTlv.factory(s)
72
+ assert_equal(MaximumBandwidth_Tlv, tlv.class)
73
+ assert_equal(s, tlv.encode)
74
+ end
75
+ def test_max_reserv_bw_sub_tlv
76
+ s = ['000700043f800000'].pack('H*')
77
+ tlv = SubTlv.factory(s)
78
+ assert_equal(MaximumReservableBandwidth_Tlv, tlv.class)
79
+ assert_equal(s, tlv.encode)
80
+ end
81
+ def test_unreserv_bw_sub_tlv
82
+ s = ['000800203e0000003e8000003ec000003f0000003f2000003f4000003f6000003f800000'].pack('H*')
83
+ tlv = SubTlv.factory(s)
84
+ assert_equal(UnreservedBandwidth_Tlv, tlv.class)
85
+ assert_equal(s, tlv.encode)
86
+ end
87
+
88
+ end
89
+
@@ -0,0 +1,15 @@
1
+ require "test/unit"
2
+
3
+ require "lsa/tlv/traffic_engineering_metric"
4
+
5
+ class TestLsaTlvTrafficEngineeringMetric < Test::Unit::TestCase
6
+ include OSPFv2
7
+ def test_test
8
+ assert_equal("0005000400000000", TrafficEngineeringMetric_Tlv.new().to_shex)
9
+ assert_equal("Admin Metric : 254", TrafficEngineeringMetric_Tlv.new({:te_metric=>254}).to_s)
10
+ assert_equal(255, TrafficEngineeringMetric_Tlv.new({:te_metric=>255}).to_hash[:te_metric])
11
+ assert_equal("000500040000ffff", TrafficEngineeringMetric_Tlv.new(TrafficEngineeringMetric_Tlv.new({:te_metric=>0xffff}).encode).to_shex)
12
+
13
+ end
14
+ end
15
+
@@ -0,0 +1,65 @@
1
+ require "test/unit"
2
+
3
+ require "lsa/traffic_engineering"
4
+ require 'lsa/tlv/tlv_factory'
5
+
6
+ class TestLsaTlvTrafficEngineering < Test::Unit::TestCase
7
+ include OSPFv2
8
+ def test_new_from_hash
9
+ h_lsa = {:ls_age=>0,
10
+ :ls_type=>:area,
11
+ :advertising_router=>"0.0.0.0",
12
+ :sequence_number=>2147483649,
13
+ :opaque_id=>0,
14
+ :opaque_type=>:te_lsa,
15
+ :top_lvl_tlv=>
16
+ {:tlv_type=>2,
17
+ :tlvs=>
18
+ [{:tlv_type=>1, :link_type=>1},
19
+ {:tlv_type=>2, :link_id=>"1.2.3.4"},
20
+ {:ip_address=>"1.1.1.1", :tlv_type=>3},
21
+ {:ip_address=>"2.2.2.2", :tlv_type=>4},
22
+ {:tlv_type=>5, :te_metric=>255},
23
+ {:max_bw=>10000, :tlv_type=>6},
24
+ {:tlv_type=>7, :max_resv_bw=>7000},
25
+ {:tlv_type=>8,
26
+ :unreserved_bw=>[100, 100, 100, 100, 100, 100, 100, 100]}]},
27
+ :options=>0}
28
+ lsa = TrafficEngineering.new_hash(h_lsa)
29
+ assert_equal OSPFv2::TrafficEngineering, lsa.class
30
+ assert_equal h_lsa, lsa.to_hash
31
+ end
32
+
33
+ def test_new_link_tlv
34
+ link_tlv = Link_Tlv.new
35
+
36
+ lsa = TrafficEngineering.new :advertising_router=>1, :opaque_id=>0xff, :top_lvl_tlv=> link_tlv
37
+ assert_equal('0000000a010000ff00000001800000011444001800020000', lsa.to_shex)
38
+
39
+ link_tlv << LinkType_Tlv.new
40
+ assert_equal('0000000a010000ff000000018000000171d30020000200080001000101000000', lsa.to_shex)
41
+ link_tlv << LinkId_Tlv.new(:link_id=>'1.2.3.4')
42
+ assert_equal('0000000a010000ff0000000180000001ec3800280002001000010001010000000002000401020304', lsa.to_shex)
43
+ link_tlv << LocalInterfaceIpAddress_Tlv.new(:ip_address=>"1.1.1.1")
44
+ assert_equal('0000000a010000ff000000018000000150b9003000020018000100010100000000020004010203040003000401010101', lsa.to_shex)
45
+ link_tlv << RemoteInterfaceIpAddress_Tlv.new(:ip_address=>"2.2.2.2")
46
+ link_tlv << TrafficEngineeringMetric_Tlv.new(:te_metric=>255)
47
+ link_tlv << MaximumBandwidth_Tlv.new(:max_bw=>10_000)
48
+ link_tlv << MaximumReservableBandwidth_Tlv.new(:max_resv_bw=>7_000)
49
+ link_tlv << UnreservedBandwidth_Tlv.new(:unreserved_bw=>[100]*8)
50
+
51
+ end
52
+
53
+ def test_new_router_address_tlv
54
+ router_address = RouterAddress_Tlv.new(:ip_address=>'1.2.3.4')
55
+ lsa = TrafficEngineering.new :advertising_router=>1, :opaque_id=>0xff, :top_lvl_tlv=> router_address
56
+ assert_equal('0000000a010000ff00000001800000018abc001c0001000401020304', lsa.to_shex)
57
+
58
+ lsa = TrafficEngineering.new :advertising_router=>'255.255.255.255',
59
+ :opaque_id=>0xdeadff,
60
+ :top_lvl_tlv=> { :tlv_type=> 1, :ip_address=> '10.11.12.13'}
61
+ assert_equal('0000000a01deadffffffffff80000001dabc001c000100040a0b0c0d', lsa.to_shex)
62
+
63
+ end
64
+
65
+ end
@@ -0,0 +1,82 @@
1
+ require "test/unit"
2
+ require 'lsa/router'
3
+
4
+ require "neighbor/neighbor"
5
+
6
+ class TestNeighborNeighbor < Test::Unit::TestCase
7
+ include OSPFv2
8
+ def test_states
9
+ assert Neighbor.new
10
+ assert_equal :down, Neighbor.new.state
11
+ assert Neighbor.new.in_state?(:down)
12
+ assert ! Neighbor.new.in_state?(:full)
13
+ assert Neighbor.new.in_state?(:full, :down)
14
+ end
15
+
16
+ def test_flood
17
+
18
+ neighbor = Neighbor.new
19
+ def neighbor.send(packet,dest)
20
+ ret=[]
21
+ [packet].flatten.each { |p|
22
+ ret << [p.class,dest]
23
+ }
24
+ ret
25
+ end
26
+ assert_equal [[String, "dest"]], neighbor.send( 'a packet', 'dest')
27
+ assert_equal [[String, 'dest'], [String, 'dest']], neighbor.send( ['one','two'], 'dest')
28
+
29
+ lsas = []
30
+ lsas << Router.new
31
+ lsas << Router.new
32
+
33
+ assert_equal 1, neighbor.flood(:lsas =>lsas).size
34
+ assert_equal [OSPFv2::LinkStateUpdate, "224.0.0.5"], neighbor.flood(:lsas =>lsas)[0]
35
+ end
36
+
37
+ end
38
+
39
+ __END__
40
+
41
+
42
+ TODO:
43
+
44
+ require 'test/unit'
45
+ require 'ospfv2/neighbor'
46
+
47
+ class TestOspfv2Neighbor < Test::Unit::TestCase # :nodoc:
48
+ def test_init
49
+ neighbor = OSPFv2::Neighbor.new("1.1.1.1", "0.0.0.0", "10.0.0.1", {:netmask => '255.255.255.0', :options => 0x2})
50
+ assert_equal(10,neighbor.helloInt)
51
+ assert_equal(40,neighbor.deadInt)
52
+ assert_equal("1.1.1.1",neighbor.router_id)
53
+ end
54
+ def test_hello_int
55
+ neighbor = OSPFv2::Neighbor.new("1.1.1.1", "0.0.0.0", "10.0.0.1", {:netmask => '255.255.255.0', :options => 0x2})
56
+ neighbor.set({:helloInt => 5,})
57
+ assert_equal(5*4,neighbor.deadInt)
58
+ neighbor.set({:deadInt => 45,})
59
+ assert_equal(45,neighbor.deadInt)
60
+ neighbor.set({:deadInt => 0,})
61
+ assert_equal(20,neighbor.deadInt)
62
+ end
63
+
64
+ def test_states
65
+ n = OSPFv2::Neighbor.new("1.1.1.1", "0.0.0.0", "10.0.0.1", {:netmask => '255.255.255.0', :options => 0x2})
66
+ assert_equal(:Down,n.state?)
67
+ assert_raise(NoMethodError) {n.newState}
68
+ def n.set_state(state, comment="who cares")
69
+ newState(state,comment)
70
+ state?
71
+ end
72
+ def n.INFO(s); end
73
+ assert_equal(:Down,n.state?)
74
+ assert_equal(:Full,n.set_state(:Full))
75
+ assert_equal(true,n.state?(:Full))
76
+ assert_equal(true,n.state?(:Init, :Full, :Exchange))
77
+ assert_equal(:Loading,n.set_state(:Loading))
78
+ assert_equal(false,n.state?(:Init, :Full, :Exchange))
79
+ assert_equal(true,n.state?(:Init, :Loading, :Exchange))
80
+ end
81
+ end
82
+
@@ -0,0 +1,10 @@
1
+ require 'fileutils'
2
+ dir = File.dirname(File.expand_path(__FILE__ ))
3
+
4
+ FileUtils.chdir(dir) do
5
+ Dir.glob("**/*rb") do |filename|
6
+ next if __FILE__ == filename
7
+ require File.join(dir,filename) unless filename == File.basename(__FILE__)
8
+ end
9
+ end
10
+
@@ -0,0 +1,114 @@
1
+ require "test/unit"
2
+ require 'pp'
3
+ require "packet/database_description"
4
+
5
+ class TestPacketDatabaseDescription < Test::Unit::TestCase
6
+ include OSPFv2
7
+ include OSPFv2::LSDB
8
+ def test_new
9
+ s = "020200340404040400000002ea7e0000000000000000000005d8000700000080" +
10
+ "000a00010000001401020304000000c800000000" +
11
+ "000a00010000001401020304000000c800000000" +
12
+ "000a00010000001401020304000000c800000000" +
13
+ "000a00010000001401020304000000c800000000" +
14
+ "000a00010000001401020304000000c800000000" +
15
+ "000a00010000001401020304000000c800000000" +
16
+ "000a00010000001401020304000000c800000000" +
17
+ "000a00010000001401020304000000c800000000" +
18
+ "000a00010000001401020304000000c800000000"
19
+ dd = DatabaseDescription.new([s].pack('H*'))
20
+ assert_equal dd.to_shex, DatabaseDescription.new(dd).to_shex
21
+ assert DatabaseDescription.new # dd = DatabaseDescription.new
22
+ dd1 = DatabaseDescription.new
23
+ dd1.imms=7
24
+ dd1.dd_sequence_number= 0xc0aa4f18
25
+ dd1.options=Options.new 0x42
26
+
27
+ #puts dd.to_s
28
+
29
+ s1 = '02020020c0a801c80000000008740000000000000000000005dc0007c0a56c70'
30
+ s2 = '02020020c0a801c80000000025c70000000000000000000005dc0007c0aa4f18'
31
+
32
+ dd2 = DatabaseDescription.new([s1].pack('H*'))
33
+ assert_equal s1, dd2.to_shex
34
+ dd2 = DatabaseDescription.new([s2].pack('H*'))
35
+ assert_equal s2, dd2.to_shex
36
+ assert_equal 3232386840, dd2.dd_sequence_number
37
+ assert_equal 3232386840, dd2.seqn
38
+ assert_equal 1500, dd2.interface_mtu.to_i
39
+ assert dd2.master?
40
+ assert dd2.init?
41
+ assert dd2.more?
42
+
43
+ h = {:imms=>7,
44
+ :au_type=>:null,
45
+ :lsas=>[],
46
+ :dd_sequence_number=>3232386840,
47
+ :packet_type=>:dd,
48
+ :area_id=>"0.0.0.0",
49
+ :interface_mtu=>1500,
50
+ :router_id=>"192.168.1.200",
51
+ :options=> 0,
52
+ :ospf_version=>2}
53
+ assert_equal(h, dd2.to_hash)
54
+ end
55
+ def _test_recv
56
+ s = "\002\002\0004\300\250\001\310\000\000\000\000\221\372\000\000\000\000\000\000\000\000\000\000\005\334B\001\300\241\326\356\000\000\"\001\300\250\001\310\300\250\001\310\200\000\000\320\242\r\0000"
57
+ dd = DatabaseDescription.new s
58
+ assert_equal 'database_description', dd.packet_name
59
+ end
60
+ def test_ls_db
61
+ ls_db = LinkStateDatabase.new(:area_id=> 0)
62
+ ls_db.add_loopback :router_id=>'2.2.2.2', :address=>'192.168.1.1', :metric=>10
63
+ ls_db.add_loopback :router_id=>'3.3.3.3', :address=>'192.168.1.2', :metric=>20
64
+ ls_db.add_adjacency(1, 2, '192.168.0.1/24', 2)
65
+
66
+ assert_equal 3, ls_db.size
67
+
68
+ dd = OspfPacket.factory( :packet_type=>:dd, :area_id=>"0.0.0.0", :au_type=>:null, :router_id=>"192.168.1.200", :dd_sequence_number=>3232386840, :ospf_version=>2, :interface_mtu=>1500, :lsas=>[], :options=>0, :ls_db => ls_db, :number_of_lsa=>1)
69
+ assert_equal 1, dd.instance_eval { @lsas.size }
70
+ assert_equal 1, ls_db.offset
71
+ assert_equal '00002201020202020202020280000001a8030024', dd.to_shex[-40.. -1]
72
+ assert dd.more?
73
+
74
+ dd = OspfPacket.factory( :packet_type=>:dd, :area_id=>"0.0.0.0", :au_type=>:null, :router_id=>"192.168.1.200", :dd_sequence_number=>3232386840, :ospf_version=>2, :interface_mtu=>1500, :lsas=>[], :options=>0, :ls_db => ls_db, :number_of_lsa=>1)
75
+ assert_equal 1, dd.instance_eval { @lsas.size }
76
+ assert_equal 2, ls_db.offset
77
+ assert_equal '000022010303030303030303800000011b7d0024', dd.to_shex[-40.. -1]
78
+ assert dd.more?
79
+
80
+ dd = OspfPacket.factory( :packet_type=>:dd, :area_id=>"0.0.0.0", :au_type=>:null, :router_id=>"192.168.1.200", :dd_sequence_number=>3232386840, :ospf_version=>2, :interface_mtu=>1500, :lsas=>[], :options=>0, :ls_db => ls_db, :number_of_lsa=>1)
81
+ assert_equal 1, dd.instance_eval { @lsas.size }
82
+ assert_equal 3, ls_db.offset
83
+ assert_equal '0000220100000001000000018000000158f00030', dd.to_shex[-40.. -1]
84
+ assert ! dd.more?
85
+
86
+ dd = OspfPacket.factory( :packet_type=>:dd, :area_id=>"0.0.0.0", :au_type=>:null, :router_id=>"192.168.1.200", :dd_sequence_number=>3232386840, :ospf_version=>2, :interface_mtu=>1500, :lsas=>[], :options=>0, :ls_db => ls_db, :number_of_lsa=>1)
87
+ assert_equal 0, dd.instance_eval { @lsas.size }
88
+ assert_equal 4, ls_db.offset
89
+ assert ! dd.more?
90
+ assert_equal 24+8, dd.encode.size # no lsa headers
91
+
92
+ ls_db.offset=0
93
+ dd = OspfPacket.factory( :packet_type=>:dd, :area_id=>"0.0.0.0", :au_type=>:null, :router_id=>"192.168.1.200", :dd_sequence_number=>3232386840, :ospf_version=>2, :interface_mtu=>1500, :lsas=>[], :options=>0, :ls_db => ls_db)
94
+ assert_equal 3, dd.instance_eval { @lsas.size }
95
+ assert (ls_db.offset > 50)
96
+ assert ! dd.more?
97
+ assert_equal 24+8+3*20, dd.encode.size # 3 lsa headers
98
+
99
+ shex = %{0202005cc0a801c8000000000e8b0000000000000000000005dc0000c0aa4f1800002201020202020202020280000001a8030024000022010303030303030303800000011b7d00240000220100000001000000018000000158f00030
100
+ }.split.join
101
+ assert_equal shex, dd.to_shex
102
+
103
+ end
104
+ def test_new_from_hash
105
+ h_dd = {:packet_type=>:dd, :area_id=>"0.0.0.0", :imms=>7, :au_type=>:null, :router_id=>"192.168.1.200", :dd_sequence_number=>3232386840, :ospf_version=>2, :interface_mtu=>1500, :options=>0}
106
+ dd = DatabaseDescription.new(h_dd)
107
+ assert_equal DatabaseDescription, dd.class
108
+ assert_equal h_dd.merge(:lsas=>[]), dd.to_hash()
109
+ end
110
+ def test_new_from_hash_with_ls_db
111
+ end
112
+
113
+
114
+ end