ospfv2 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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"