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,107 @@
1
+ require "test/unit"
2
+ require "packet/hello"
3
+
4
+ class TestHello < Test::Unit::TestCase
5
+ include OSPFv2
6
+ def test_neighbors
7
+ assert Hello::Neighbors.new
8
+ nbrs = Hello::Neighbors.new
9
+ nbrs + '0.0.0.1'
10
+ assert_equal 1, nbrs.ids[0]
11
+ assert nbrs.has?'0.0.0.1'
12
+ assert ! nbrs.has?('0.0.0.2')
13
+ nbrs + '0.0.0.2'
14
+ nbrs + '0.0.0.2'
15
+ nbrs + '0.0.0.2'
16
+ nbrs + '0.0.0.2'
17
+ assert nbrs.has?('0.0.0.2')
18
+ nbrs - '0.0.0.2'
19
+ assert ! nbrs.has?('0.0.0.2')
20
+ assert_equal '00000001', nbrs.to_shex
21
+ nbrs + '0.0.0.2'
22
+ assert_equal '0000000100000002', nbrs.to_shex
23
+ end
24
+
25
+ def test_new
26
+ hh = {
27
+ :netmask=> 0xffffffaa,
28
+ :designated_router_id=> '1.1.1.1',
29
+ :backup_designated_router_id=> '2.2.2.2',
30
+ :helloInt=>10,
31
+ :options=>2,
32
+ :rtr_pri=>0,
33
+ :deadInt=>40,
34
+ :neighbors=> ["1.1.1.1", "2.2.2.2", "3.3.3.3"]
35
+ }
36
+
37
+ hello = Hello.new(hh)
38
+ assert_equal 1, hello.packet_type.to_i
39
+ assert_equal 'RouterId: 0.0.0.0',hello.router_id.to_s
40
+ assert_equal Hello::Neighbors, hello.neighbors.class
41
+ assert hello.has_neighbor?('1.1.1.1')
42
+ assert hello.has_neighbor?('2.2.2.2')
43
+ assert hello.has_neighbor?('3.3.3.3')
44
+ assert ! hello.has_neighbor?('1.1.1.4')
45
+ assert_equal '020100380000000000000000e9d700000000000000000000ffffffaa000a0200000000280101010102020202010101010202020203030303', hello.to_shex
46
+ hello.remove_neighbor '1.1.1.1'
47
+ assert_equal '020100340000000000000000ebdd00000000000000000000ffffffaa000a02000000002801010101020202020202020203030303', hello.to_shex
48
+ hello.remove_neighbor '3.3.3.3'
49
+ assert_equal '020100300000000000000000f1e700000000000000000000ffffffaa000a020000000028010101010202020202020202', hello.to_shex
50
+ end
51
+
52
+
53
+ def test_1
54
+ s = "0201002c 0aff 0801 0000 0000 0000 0000 0000 0000 0000 0000 ffff ff00 000a 0280 0000 0028 0000 0000 0000 0000".split.join
55
+ hello = OSPFv2::Hello.new([s].pack('H*'))
56
+ assert_equal("0201002c0aff080100000000e91f00000000000000000000ffffff00000a0280000000280000000000000000",hello.to_shex)
57
+ assert_equal("0.0.0.0",hello.to_hash[:designated_router_id])
58
+ assert_equal("0.0.0.0",hello.to_hash[:backup_designated_router_id])
59
+ assert_equal(2,hello.options.to_i)
60
+ assert_equal(128,hello.to_hash[:rtr_pri])
61
+ assert_equal(10,hello.to_hash[:hello_interval])
62
+ assert_equal(40,hello.to_hash[:router_dead_interval])
63
+ assert_equal(Hello::Neighbors,hello.to_hash[:neighbors].class)
64
+ hello = OSPFv2::Hello.new
65
+ hello.neighbors= "1.1.1.1"
66
+ hello.neighbors= "2.2.2.2"
67
+ hello.neighbors= "3.3.3.3"
68
+ assert_equal(3,hello.to_hash[:neighbors].ids.size)
69
+
70
+ hello2 = OSPFv2::Hello.new(hello.encode)
71
+ assert_equal hello2.to_shex, hello.to_shex
72
+ assert_equal(hello2.encode, hello.encode)
73
+ assert_equal(hello2.to_s, hello.to_s)
74
+
75
+ end
76
+
77
+ def test_has_neighbor?
78
+ hello = OSPFv2::Hello.new
79
+ assert ! hello.has_neighbor?('2.2.2.2')
80
+ hello.neighbors= "1.1.1.1"
81
+ hello.neighbors= "2.2.2.2"
82
+ hello.neighbors= "3.3.3.3"
83
+ # puts hello
84
+ assert hello.has_neighbor?('2.2.2.2')
85
+ assert hello.has_neighbor?('2.2.2.2')
86
+ assert ! hello.has_neighbor?('4.4.4.4')
87
+ end
88
+
89
+ def test_add_neighbor
90
+ hello1 = OSPFv2::Hello.new :router_id=>'1.1.1.1'
91
+ hello2 = OSPFv2::Hello.new :router_id=>'2.2.2.2'
92
+ hello2.neighbors=hello1.router_id.to_hash
93
+ #puts hello2
94
+ end
95
+ def test_attr_delegate
96
+ hello = OSPFv2::Hello.new
97
+ assert_equal '0.0.0.0', hello.designated_router_id.to_ip
98
+ hello.designated_router_id='1.1.1.1'
99
+ hello.backup_designated_router_id='2.2.2.2'
100
+ assert_equal OSPFv2::Hello::DesignatedRouterId, hello.designated_router_id.class
101
+ assert_equal '1.1.1.1', hello.designated_router_id.to_ip
102
+ assert_equal '2.2.2.2', hello.backup_designated_router_id.to_ip
103
+
104
+ end
105
+
106
+
107
+ end
@@ -0,0 +1,64 @@
1
+ require "test/unit"
2
+ require 'lsa/router'
3
+ require 'lsa/summary'
4
+ require 'lsa/network'
5
+
6
+ require "packet/link_state_ack"
7
+ require 'packet/link_state_update'
8
+
9
+
10
+ class TestPacketLinkStateAck < Test::Unit::TestCase
11
+ include OSPFv2
12
+ def setup
13
+ @r = Router.new
14
+ @n = Network.new
15
+ @a = AsbrSummary.new
16
+ @s = Summary.new
17
+ @e = AsExternal.new
18
+ end
19
+ def tests
20
+ assert LinkStateAck.new
21
+ assert_equal '020500180000000000000000fde200000000000000000000', LinkStateAck.new.to_shex
22
+
23
+ ls_ack = LinkStateAck.new
24
+ ls_ack.lsa_headers << @r
25
+ ls_ack.lsa_headers << @n
26
+ ls_ack.lsa_headers << @s
27
+ ls_ack.lsa_headers << @a
28
+ ls_ack.lsa_headers << @e
29
+
30
+ # 0205007c00000000000000001c6000000000000000000000
31
+ # 0000000100000000000000008000000195d30014
32
+ # 0000000200000000000000008000000187e00014
33
+ # 0000000300000000000000008000000179ed0014
34
+ # 000000040000000000000000800000016bfa0014
35
+ # 000000050000000000000000800000015d080014
36
+ #
37
+ # 0205007c0000000000000000cbb000000000000000000000
38
+ # 000000010000000000000000800000019dc70018
39
+ # 000000020000000000000000800000018fd40018
40
+ # 0000000300000000000000008000000189d5001c
41
+ # 000000040000000000000000800000017be2001c
42
+ # 000000050000000000000000800000017dd70024
43
+
44
+ end
45
+
46
+ def test1
47
+ s = "020500e0010101010000000086690000000000000000000000a122010101010101010101800000020000000000a122010101010201010102800000040000000000a122010202020202020202800000020000000000a722010aff08020aff08028000001a00000000009f000218000002010101028000000100000000009f000319000100010101028000000100000000009f000319000200010101028000000100000000009f000319000300010101028000000100000000009f000319000400010101028000000100000000009f000319000500010101028000000100000000".split.join
48
+ ls_ack = LinkStateAck.new([s].pack('H*'))
49
+ assert_equal 10, ls_ack.lsa_headers.size
50
+ # p $style
51
+ # $style=:junos_verbose
52
+ # puts ls_ack
53
+ end
54
+ def test_2
55
+ s = '0204006cc0a801c8000000004115000000000000000000000000000200012201c0a801c8c0a801c8800001a7b626003000000002c7000000ffffff0003000001c0a801c8c0a801c80200000a00012202c0a801c8c0a801c880000001e0bb0020ffffff00c0a801c801010101'
56
+ ls_update = LinkStateUpdate.new([s].pack('H*'))
57
+ #puts ls_update
58
+ ls_ack = LinkStateAck.ack_ls_update ls_update, :area_id=> '1.2.3.4', :router_id=>'5.6.7.8'
59
+ #puts ls_ack
60
+ assert_equal 'link_state_ack', ls_ack.packet_name
61
+
62
+ # puts ls_update.to_s_junos
63
+ end
64
+ end
@@ -0,0 +1,168 @@
1
+ require "test/unit"
2
+
3
+ require "packet/link_state_request"
4
+
5
+ class TestPacketLinkStateRequest < Test::Unit::TestCase
6
+ include OSPFv2
7
+ def test_new_from_bits
8
+ assert LinkStateRequest.new
9
+ s = '0203003cc0a801c800000000273700000000000000000000000000010202020202020202000000010303030303030303000000010000000100000001'
10
+ assert_equal s, LinkStateRequest.new([s].pack('H*')).to_shex
11
+ # puts LinkStateRequest.new([s].pack('H*')).to_s
12
+ end
13
+ def test_to_lsu
14
+ ls_db = OSPFv2::LSDB::LinkStateDatabase.new(:area_id=> 0)
15
+ ls_db.add_loopback :router_id=> '2.2.2.2', :address=> '192.168.1.1', :metric=>10
16
+ ls_db.add_loopback :router_id=> '3.3.3.3', :address=> '192.168.1.2', :metric=>20
17
+ ls_db.add_adjacency(1, 2, '192.168.0.1/24', 2)
18
+ s = '0203003cc0a801c800000000273700000000000000000000000000010202020202020202000000010303030303030303000000010000000100000001'
19
+ lsr = LinkStateRequest.new([s].pack('H*'))
20
+ assert_equal 3, lsr.requests.size
21
+ assert_equal Array, lsr.to_lsu(ls_db).class
22
+ lsr.to_lsu(ls_db)
23
+ assert_equal 1, lsr.to_lsu(ls_db).size
24
+ assert_equal 3, lsr.to_lsu(ls_db, :area_id=> '1.2.3.4')[0].lsas.size
25
+
26
+ end
27
+
28
+ def test_new_from_key
29
+ reqlist=[[1,2,3],[4,5,6]]
30
+ lr = LinkStateRequest.new :area_id => 1, :router_id=> 2, :requests=> reqlist
31
+ assert_equal 2, lr.requests.size
32
+ end
33
+
34
+
35
+ end
36
+
37
+
38
+ __END__
39
+
40
+ #
41
+ # Created by Jean-Michel Esnault.
42
+ # Copyright (c) 2008. All rights reserved.
43
+ #
44
+
45
+ require 'test/unit'
46
+ require 'pp'
47
+ require 'dd'
48
+ require 'lsr'
49
+
50
+ class RequestLSA_Test < Test::Unit::TestCase # :nodoc:
51
+ include Ospf
52
+ def test_init
53
+ _req1 = {:lstype => 1, :lsid=> "255.254.253.251", :advr=> "255.1.2.255",}
54
+ assert_equal("00000001fffefdfbff0102ff", Ospf::RequestLSA.new(_req1).to_shex)
55
+ assert_equal("lstype: 1, lsid: 255.254.253.251, advr: 255.1.2.255", Ospf::RequestLSA.new(_req1).to_s)
56
+ assert_equal("255.254.253.251", Ospf::RequestLSA.new(_req1).to_hash[:lsid])
57
+ assert_equal("255.1.2.255", Ospf::RequestLSA.new(_req1).to_hash[:advr])
58
+ assert_equal(1, Ospf::RequestLSA.new(_req1).to_hash[:lstype])
59
+ req1 = Ospf::RequestLSA.new(_req1)
60
+ assert_equal(req1.to_shex, Ospf::RequestLSA.new(req1.enc).to_shex)
61
+ assert_equal([1, "255.254.253.251", "255.1.2.255"],req1.key)
62
+ end
63
+ end
64
+
65
+ class LSR_Test < Test::Unit::TestCase # :nodoc:
66
+ include Ospf
67
+ def test_init
68
+ lsr = Ospf::LSR.new({:area=>"0.0.0.0", :rid=>"10.255.8.1"})
69
+ lsr.add(Ospf::RequestLSA.new({:lstype => 1, :lsid=> "255.254.253.251", :advr=> "255.1.1.255",}))
70
+ assert_equal("020300240aff080100000000ebdb0000000000000000000000000001fffefdfbff0101ff", lsr.to_shex)
71
+ lsr.add(Ospf::RequestLSA.new({:lstype => 2, :lsid=> "255.254.253.252", :advr=> "255.1.2.255",}))
72
+ lsr.add(Ospf::RequestLSA.new({:lstype => 3, :lsid=> "255.254.253.253", :advr=> "255.1.3.255",}))
73
+ lsr.add(Ospf::RequestLSA.new({:lstype => 4, :lsid=> "255.254.253.254", :advr=> "255.1.4.255",}))
74
+ assert_equal("version: 2, type: 3, rid: 10.255.8.1, area: 0.0.0.0, \nLink State Request:\n lstype: 1, lsid: 255.254.253.251, advr: 255.1.1.255\n lstype: 2, lsid: 255.254.253.252, advr: 255.1.2.255\n lstype: 3, lsid: 255.254.253.253, advr: 255.1.3.255\n lstype: 4, lsid: 255.254.253.254, advr: 255.1.4.255", lsr.to_s)
75
+ lsr.each { |req| assert_equal(3,req.key.size) }
76
+ end
77
+ def test_build
78
+
79
+ s = "
80
+ 02 03 01 14 0a ff f5 2c 00 00 00 00
81
+ 50 1d 00 00 00 00 00 00 00 00 00 00 00 00 00 04
82
+ 00 02 00 01 00 02 00 01 00 00 00 05 41 00 03 00
83
+ 00 01 00 01 00 00 00 05 41 00 01 00 00 01 00 01
84
+ 00 00 00 03 21 00 04 00 00 02 00 02 00 00 00 05
85
+ 51 00 04 00 00 02 00 01 00 00 00 05 41 00 04 00
86
+ 00 01 00 01 00 00 00 01 00 01 00 02 00 01 00 02
87
+ 00 00 00 05 51 00 05 00 00 02 00 01 00 00 00 03
88
+ 21 00 01 00 00 02 00 02 00 00 00 03 21 00 05 00
89
+ 00 02 00 02 00 00 00 03 21 00 02 00 00 02 00 02
90
+ 00 00 00 01 00 02 00 02 00 02 00 02 00 00 00 03
91
+ 21 00 03 00 00 02 00 02 00 00 00 04 00 01 00 01
92
+ 00 01 00 01 00 00 00 01 00 02 00 01 00 02 00 01
93
+ 00 00 00 05 51 00 03 00 00 02 00 01 00 00 00 05
94
+ 51 00 02 00 00 02 00 01 00 00 00 05 51 00 01 00
95
+ 00 02 00 01 00 00 00 05 41 00 02 00 00 01 00 01
96
+ 00 00 00 05 41 00 05 00 00 01 00 01 00 00 00 01
97
+ 00 01 00 01 00 01 00 01
98
+ ".split.join
99
+
100
+ lsr = Ospf::LSR.new([s].pack('H*'))
101
+ assert_equal(s, lsr.to_shex)
102
+
103
+
104
+ sdd = "
105
+ 02 02 01 c4 00 01 00 01 00 00 00 00
106
+ 91 d9 00 00 00 00 00 00 00 00 00 00 05 dc 00 00
107
+ 0a fc a4 1e 00 08 00 04 00 02 00 01 00 02 00 01
108
+ 80 00 00 01 00 00 00 00 00 08 00 05 41 00 03 00
109
+ 00 01 00 01 80 00 00 01 00 00 00 00 00 08 00 05
110
+ 41 00 01 00 00 01 00 01 80 00 00 01 00 00 00 00
111
+ 00 08 00 03 21 00 04 00 00 02 00 02 80 00 00 01
112
+ 00 00 00 00 00 08 00 05 51 00 04 00 00 02 00 01
113
+ 80 00 00 01 00 00 00 00 00 08 00 05 41 00 04 00
114
+ 00 01 00 01 80 00 00 01 00 00 00 00 00 08 22 01
115
+ 00 01 00 02 00 01 00 02 80 00 00 01 00 00 00 00
116
+ 00 08 00 05 51 00 05 00 00 02 00 01 80 00 00 01
117
+ 00 00 00 00 00 08 00 03 21 00 01 00 00 02 00 02
118
+ 80 00 00 01 00 00 00 00 00 08 00 03 21 00 05 00
119
+ 00 02 00 02 80 00 00 01 00 00 00 00 00 08 00 03
120
+ 21 00 02 00 00 02 00 02 80 00 00 01 00 00 00 00
121
+ 00 08 22 01 00 02 00 02 00 02 00 02 80 00 00 01
122
+ 00 00 00 00 00 08 00 03 21 00 03 00 00 02 00 02
123
+ 80 00 00 01 00 00 00 00 00 08 00 04 00 01 00 01
124
+ 00 01 00 01 80 00 00 01 00 00 00 00 00 08 22 01
125
+ 00 02 00 01 00 02 00 01 80 00 00 01 00 00 00 00
126
+ 00 08 00 05 51 00 03 00 00 02 00 01 80 00 00 01
127
+ 00 00 00 00 00 08 00 05 51 00 02 00 00 02 00 01
128
+ 80 00 00 01 00 00 00 00 00 08 00 05 51 00 01 00
129
+ 00 02 00 01 80 00 00 01 00 00 00 00 00 08 00 05
130
+ 41 00 02 00 00 01 00 01 80 00 00 01 00 00 00 00
131
+ 00 08 00 05 41 00 05 00 00 01 00 01 80 00 00 01
132
+ 00 00 00 00 00 08 22 01 00 01 00 01 00 01 00 01
133
+ 80 00 00 01 00 00 00 00
134
+
135
+ ".split.join
136
+
137
+ dd = DD.new([sdd].pack('H*'))
138
+
139
+ lsr_list = {}
140
+ dd.each { |lsa|
141
+ lsr_list.store(lsa.key,lsa)
142
+ }
143
+
144
+ lsr = Ospf::LSR.build('0.0.0.0', '1.1.1.1', lsr_list.collect{ |k,lsa_h| lsa_h})[0]
145
+ assert_equal("0203011401010101000000004e4700000000000000000000000000032100040000020002000000054100010000010001000000054100030000010001000000040002000100020001000000010001000200010002000000054100040000010001000000055100040000020001000000055100050000020001000000032100010000020002000000010002000200020002000000032100020000020002000000032100050000020002000000032100030000020002000000010002000100020001000000040001000100010001000000054100020000010001000000055100010000020001000000055100020000020001000000055100030000020001000000010001000100010001000000054100050000010001", lsr.to_shex)
146
+ assert_equal(lsr.enc, LSR.new(lsr.enc).enc)
147
+
148
+ lsdb = LinkStateDatabase.create(50,5)
149
+ assert_equal(4, LSR.build('1.1.1.1', '0.0.0.0', lsdb.lsas_headers).size)
150
+ end
151
+
152
+ end
153
+
154
+
155
+ OSPF link state database, Area 0.0.0.0
156
+ Age Options Type Link-State ID Advr Router Sequence Checksum Length
157
+ 0x22 router 0.0.0.1 0.0.0.1 0x80000001 0x58f0 48
158
+ 0x22 router 2.2.2.2 2.2.2.2 0x80000001 0xa803 36
159
+ 0x22 router 3.3.3.3 3.3.3.3 0x80000001 0x1b7d 36
160
+
161
+
162
+ @ls_db={[1, 33686018, 33686018]=>
163
+ #<OSPFv2::Router:0x007ff42bb40498 @ls_age=#<OSPFv2::Lsa::LsAge:0x007ff42bb40420 @age=0>,@sequence_number=#<OSPFv2::SequenceNumber:0x007ff42bb403f8 @seqn="\x01\x00\x00\x80">, @options=#<OSPFv2::Options:0x007ff42bb4be88 @options=34>, @ls_id=#<OSPFv2::Lsa::LsId:0x007ff42bb4bca8 @id=33686018>, @ls_type=#<OSPFv2::LsType:0x007ff42bb4b3e8 @ls_type=1>, @advertising_router=#<OSPFv2::Lsa::AdvertisingRouter:0x007ff42bb4b690 @id=33686018>, @_length=0, @_rxmt_=false, @links=[#<OSPFv2::RouterLink::StubNetwork:0x007ff42bb49c28 @metric=#<OSPFv2::Metric:0x007ff42bb49840 @metric=10>, @router_link_type=#<OSPFv2::RouterLinkType:0x007ff42bb495c0 @router_link_type=3>, @link_data=#<OSPFv2::RouterLink::LinkData:0x007ff42bb493e0 @id=4294967295>, @link_id=#<OSPFv2::RouterLink::LinkId:0x007ff42bb48fa8 @id=3232235777>, @mt_metrics=[]>], @nwveb=2, @_size="\x00$", @_csum="\xA8\x03">,
164
+
165
+ [1, 50529027, 50529027]=>#<OSPFv2::Router:0x007ff42bb486e8 @ls_age=#<OSPFv2::Lsa::LsAge:0x007ff42bb48670 @age=0>, @sequence_number=#<OSPFv2::SequenceNumber:0x007ff42bb48648 @seqn="\x01\x00\x00\x80">, @options=#<OSPFv2::Options:0x007ff42bb48120 @options=34>, @ls_id=#<OSPFv2::Lsa::LsId:0x007ff42bb53ef8 @id=50529027>, @ls_type=#<OSPFv2::LsType:0x007ff42bb53638 @ls_type=1>, @advertising_router=#<OSPFv2::Lsa::AdvertisingRouter:0x007ff42bb538e0 @id=50529027>, @_length=0, @_rxmt_=false, @links=[#<OSPFv2::RouterLink::StubNetwork:0x007ff42bb52da0 @metric=#<OSPFv2::Metric:0x007ff42bb529b8 @metric=20>, @router_link_type=#<OSPFv2::RouterLinkType:0x007ff42bb52738 @router_link_type=3>, @link_data=#<OSPFv2::RouterLink::LinkData:0x007ff42bb52558 @id=4294967295>, @link_id=#<OSPFv2::RouterLink::LinkId:0x007ff42bb52120 @id=3232235778>, @mt_metrics=[]>], @nwveb=2, @_size="\x00$", @_csum="\e}">,
166
+
167
+
168
+ [1, 1, 1]=>#<OSPFv2::Router:0x007ff42bb51680 @ls_age=#<OSPFv2::Lsa::LsAge:0x007ff42bb51608 @age=0>, @sequence_number=#<OSPFv2::SequenceNumber:0x007ff42bb515e0 @seqn="\x01\x00\x00\x80">, @options=#<OSPFv2::Options:0x007ff42bb510b8 @options=34>, @ls_id=#<OSPFv2::Lsa::LsId:0x007ff42bb50ed8 @id=1>, @ls_type=#<OSPFv2::LsType:0x007ff42bb50ac8 @ls_type=1>, @advertising_router=#<OSPFv2::Lsa::AdvertisingRouter:0x007ff42bb50b18 @id=1>, @_length=0, @_rxmt_=false, @links=[#<OSPFv2::RouterLink::PointToPoint:0x007ff42bb509d8 @metric=#<OSPFv2::Metric:0x007ff42bb505f0 @metric=2>, @router_link_type=#<OSPFv2::RouterLinkType:0x007ff42bb50370 @router_link_type=1>, @link_data=#<OSPFv2::RouterLink::LinkData:0x007ff42bb50190 @id=3232235521>, @link_id=#<OSPFv2::RouterLink::LinkId:0x007ff42bb5bce8 @id=2>, @mt_metrics=[]>, #<OSPFv2::RouterLink::StubNetwork:0x007ff42bb5bc98 @metric=#<OSPFv2::Metric:0x007ff42bb5b8b0 @metric=2>, @router_link_type=#<OSPFv2::RouterLinkType:0x007ff42bb5b630 @router_link_type=3>, @link_data=#<OSPFv2::RouterLink::LinkData:0x007ff42bb5b450 @id=4294967040>, @link_id=#<OSPFv2::RouterLink::LinkId:0x007ff42bb5afa0 @id=3232235520>, @mt_metrics=[]>], @nwveb=0, @_size="\x000", @_csum="X\xF0">}, @area_id=#<OSPFv2::LSDB::LinkStateDatabase::AreaId:0x007ff42bb40b78 @id=0>, @advertised_routers=#<OSPFv2::LSDB::AdvertisedRouters:0x007ff42bb40f88 @set=#<Set: {33686018, 50529027, 1}>>, @ls_refresh_interval=180, @offset=0>
@@ -0,0 +1,62 @@
1
+ require "test/unit"
2
+
3
+ require "packet/link_state_update"
4
+
5
+ class TestPacketLinkStateUpdate < Test::Unit::TestCase
6
+ include OSPFv2
7
+ def test_1
8
+ s = "0204 0088 0aff 0801 0000 0000
9
+ 0x0020: 3fea 0000 0000 0000 0000 0000 0000 0001
10
+ 0x0030: 0033 2201 0aff 0801 0aff 0801 8000 0421
11
+ 0x0040: 3d40 006c 0000 0007 0101 0101 0d0d 0d01
12
+ 0x0050: 0100 0001 0d0d 0d00 ffff ff00 0300 0001
13
+ 0x0060: 0aff 0801 ffff ffff 0300 0000 0aff 0804
14
+ 0x0070: c0a8 0831 0100 0001 c0a8 0830 ffff fffc
15
+ 0x0080: 0300 0001 0aff 0802 c0a8 082d 0100 0001
16
+ 0x0090: c0a8 082c ffff fffc 0300 0001
17
+ ".split.find_all { |n| n =~/^[[:xdigit:]]{4}$/ }.join
18
+ assert LinkStateUpdate.new([s].pack('H*'))
19
+ ls_update = LinkStateUpdate.new([s].pack('H*'))
20
+ assert_equal 1, ls_update.number_of_lsa
21
+ assert_equal OSPFv2::Router, ls_update[0].class
22
+
23
+ end
24
+
25
+ def test_2
26
+ ls_db = OSPFv2::LSDB::LinkStateDatabase.new(:area_id=> 0)
27
+ ls_db.add_loopback :router_id=> '2.2.2.2', :address=> '192.168.1.1', :metric=>10
28
+ ls_db.add_loopback :router_id=> '3.3.3.3', :address=> '192.168.1.2', :metric=>20
29
+ lsu = LinkStateUpdate.new :lsas => ls_db.lsas
30
+ assert_equal 2, lsu.lsas.size
31
+ assert_equal "AdvertisingRouter: 2.2.2.2", lsu[0].advertising_router.to_s
32
+ end
33
+
34
+ def test_ls_ack
35
+
36
+ s = %{
37
+ 0x0000: 0204 0100 0101 0101 0000 0000 4ba5 0000
38
+ 0x0001: 0000 0000 0000 0000 0000 0004 0000 2201
39
+ 0x0002: 0000 0002 0000 0002 8000 008a efc0 0030
40
+ 0x0003: 0200 0002 0000 0003 c0a8 0501 0100 0002
41
+ 0x0004: c0a8 0500 ffff ff00 0300 0002 0000 2201
42
+ 0x0005: 0000 0001 0000 0001 8000 008a 8cb0 0054
43
+ 0x0006: 0200 0005 0000 0002 c0a8 0001 0100 0002
44
+ 0x0007: c0a8 0000 ffff ff00 0300 0002 0000 0003
45
+ 0x0008: c0a8 0301 0100 0002 0000 0004 c0a8 0301
46
+ 0x0009: 0100 0002 c0a8 0300 ffff ff00 0300 0002
47
+ 0x000a: 0000 2201 0000 0003 0000 0003 8000 008a
48
+ 0x000b: 0c9f 0030 0200 0002 0000 0004 c0a8 0601
49
+ 0x000c: 0100 0002 c0a8 0600 ffff ff00 0300 0002
50
+ 0x000d: 0000 2201 0000 0005 0000 0005 8000 008a
51
+ 0x000e: 0e97 0030 0200 0002 0000 0004 c0a8 0701
52
+ 0x000f: 0100 0002 c0a8 0700 ffff ff00 0300 0002
53
+ }.split.find_all { |n| n =~/^[[:xdigit:]]{4}$/ }.join
54
+
55
+ ls_update = LinkStateUpdate.new([s].pack('H*'))
56
+ #
57
+ # $style = :junos_verbose
58
+ # puts ls_update
59
+
60
+ end
61
+
62
+ end
@@ -0,0 +1,91 @@
1
+
2
+ require "test/unit"
3
+ require 'packet/ospf_packet'
4
+
5
+ class TestOspfPacket < Test::Unit::TestCase
6
+ include OSPFv2
7
+
8
+ def test_new
9
+ p1 = OspfPacket.new :version=>4, :router_id=>'1.1.1.1', :area_id=>'2.2.2.2', :packet_type=> :hello
10
+ p2 = OspfPacket.new p1.to_hash
11
+ p3 = OspfPacket.new p1.encode
12
+ assert_equal p1.to_hash, p2.to_hash
13
+ assert_equal p1.to_shex, p2.to_shex
14
+ assert_equal p2.to_shex, p3.to_shex
15
+ assert_equal 'RouterId: 1.1.1.1', p1.router_id.to_s
16
+ assert_equal 'AreaId: 2.2.2.2' , p1.area_id.to_s
17
+ assert_equal 'PacketType: hello', p1.packet_type.to_s
18
+ assert_equal 'AuType: null authentication', p1.au_type.to_s
19
+
20
+ p1.router_id = '2.2.2.2'
21
+ assert_equal 'RouterId: 2.2.2.2', p1.router_id.to_s
22
+ p1.area_id = '3.3.3.3'
23
+ assert_equal 'AreaId: 3.3.3.3', p1.area_id.to_s
24
+ end
25
+
26
+ def _test_factory_hello_from_hash
27
+
28
+ # :ls_update
29
+ # :ls_ack
30
+
31
+ hello_packet = Hello.new :packet_type=> :hello, :router_id=>0x0a010101, :area_id=>255
32
+ p hello_packet
33
+ puts hello_packet
34
+ packet = OspfPacket.factory(hello_packet.encode)
35
+ assert_equal OSPFv2::Hello, packet.class
36
+ assert_equal hello_packet.to_shex, packet.to_shex
37
+ end
38
+
39
+ def test_factory_lsr_from_bits
40
+ s = '0203003cc0a801c800000000273700000000000000000000000000010202020202020202000000010303030303030303000000010000000100000001'
41
+ end
42
+ def test_factory_lsr_from_hash
43
+ end
44
+
45
+ def test_factory_lsu
46
+
47
+ s = '0204006cc0a801c8000000007dd8000000000000000000000000000200012201c0a801c8c0a801c88000014679c4003000000002c7000000ffffff0003000001c0a801c8c0a801c80200000a00012202c0a801c8c0a801c880000001e0bb0020ffffff00c0a801c801010101'
48
+ assert_equal LinkStateUpdate, (pq = OspfPacket.factory([s].pack('H*'))).class
49
+ # puts pq
50
+
51
+ end
52
+
53
+ def test_dd_from_bits
54
+ end
55
+
56
+ def test_factory_dd_from_bits
57
+ s = '02020020c0a801c800000000ce4c0000000000000000000005dc4207c0a46498'
58
+ assert_equal DatabaseDescription, (pq = OspfPacket.factory([s].pack('H*'))).class
59
+ end
60
+
61
+ def test_dd_from_hash
62
+ h = {:packet_type=>:dd, :area_id=>"0.0.0.0", :imms=>7, :au_type=>:null, :router_id=>"192.168.1.200", :dd_sequence_number=>1, :ospf_version=>2, :interface_mtu=>1500, :options=>0}
63
+ dd = OspfPacket.factory :packet_type=>:dd, :area_id=>"0.0.0.0", :imms=>7, :au_type=>:null, :router_id=>"192.168.1.200", :dd_sequence_number=>1, :ospf_version=>2, :interface_mtu=>1500, :lsas=>[], :options=>0, :csum=>9671
64
+ assert_equal DatabaseDescription, dd.class
65
+ assert_equal h.merge(:lsas=>[]), dd.to_hash
66
+ end
67
+
68
+ end
69
+
70
+ __END__
71
+
72
+ puts OspfPacket.factory([@s].pack('H*'))
73
+
74
+ 0 1 2 3
75
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
76
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
77
+ | Version # | Type | Packet length |
78
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
79
+ | Router ID |
80
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
81
+ | Area ID |
82
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
83
+ | Checksum | AuType |
84
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
85
+ | Authentication |
86
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
87
+ | Authentication |
88
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
89
+
90
+ "02 01 0018 01010101 02020202 f7e0 00000000000000000000"
91
+ "02 s00 0018 01010101 02020202 f7e1 00000000000000000000"