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,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,218 @@
1
+ #TODO: finish external LSA and add Unit Tests.
2
+
3
+ require "test/unit"
4
+
5
+ # require "lsa/external"
6
+ require_relative "../../../lib/lsa/external"
7
+
8
+ class TestLsaExternal < Test::Unit::TestCase
9
+ include OSPFv2
10
+ def setup
11
+ AsExternal.reset
12
+ end
13
+ def tests
14
+ h_lsa = {
15
+ :advertising_router=>"1.1.1.1",
16
+ :ls_id=>"10.0.0.0",
17
+ :netmask => "255.255.255.0",
18
+ :forwarding_address => "1.2.3.0",
19
+ :metric => 1,
20
+ :type => :e2,
21
+ :tag=> 255
22
+ }
23
+ ext = OSPFv2::AsExternal.new(h_lsa)
24
+ assert_equal '000000050a0000000101010180000001b40b0024ffffff008000000101020300000000ff', ext.to_shex
25
+
26
+
27
+ ext.type=:e1
28
+ assert_equal '000000050a0000000101010180000001310f0024ffffff000000000101020300000000ff', ext.to_shex
29
+ ext.metric=10
30
+ assert_equal '000000050a00000001010101800000018bab0024ffffff000000000a01020300000000ff', ext.to_shex
31
+ ext.tag=0xff00
32
+ assert_equal '000000050a00000001010101800000018bab0024ffffff000000000a010203000000ff00', ext.to_shex
33
+ ext.forwarding_address='5.4.3.2'
34
+ assert_equal '000000050a0000000101010180000001eb430024ffffff000000000a050403020000ff00', ext.to_shex
35
+ h_lsa = {
36
+ :advertising_router=>"1.1.1.1", :network => '10.0.0.0/24',
37
+ :forwarding_address => "1.2.3.0",
38
+ :metric => 1,
39
+ :type => :e2,
40
+ :tag=> 255
41
+ }
42
+ ext2 = OSPFv2::AsExternal.new(h_lsa)
43
+ ext2.type=:e1
44
+ ext2.metric=10
45
+ ext2.tag=0xff00
46
+ ext2.forwarding_address='5.4.3.2'
47
+ assert_equal ext.encode, ext2.encode
48
+ end
49
+
50
+ def test_count
51
+ AsExternal.new_lsdb
52
+ assert_equal "50.0.0.#{AsExternal.count}/24", AsExternal.network
53
+ AsExternal.new_lsdb
54
+ assert_equal 2, AsExternal.count
55
+ assert_equal "50.0.0.#{AsExternal.count}/24", AsExternal.network
56
+ end
57
+
58
+
59
+
60
+ def test_new_lsdb
61
+ ( AsExternal.new_lsdb :advertising_router=> 1)
62
+ ( AsExternal.new_lsdb :advertising_router=> 1)
63
+ assert_equal 2, AsExternal.count
64
+ end
65
+
66
+ def test_add_mt
67
+ h_lsa = {
68
+ :advertising_router=>"1.1.1.1", :network => '10.0.0.0/24',
69
+ :forwarding_address => "1.2.3.0",
70
+ :metric => 0,
71
+ :type => :e2,
72
+ :tag=> 255
73
+ }
74
+ ext = OSPFv2::AsExternal.new(h_lsa)
75
+
76
+ ext << {
77
+ :id=>20,
78
+ :forwarding_address => "1.2.3.0",
79
+ :metric => 20,
80
+ :type => :e2,
81
+ :tag=> 255
82
+ }
83
+
84
+ puts ext
85
+ end
86
+
87
+ def test_add_mt
88
+ h_lsa = {
89
+ :advertising_router=>"1.1.1.1", :network => '10.0.0.0/24',
90
+ :forwarding_address => "1.2.3.0",
91
+ :metric => 0,
92
+ :type => :e2,
93
+ :tag=> 255,
94
+
95
+ :mt_metrics => [
96
+ {:mt_id=>20,
97
+ :forwarding_address => "1.2.3.0",
98
+ :metric => 20,
99
+ :type => :e2,
100
+ :tag=> 255
101
+ },
102
+ {:mt_id=>33,
103
+ :forwarding_address => "1.2.3.0",
104
+ :metric => 30,
105
+ :type => :e1,
106
+ :tag=> 255
107
+ }
108
+ ]
109
+ }
110
+ ext = OSPFv2::AsExternal.new(h_lsa)
111
+
112
+ ext << {
113
+ :mt_id=>20,
114
+ :forwarding_address => "1.2.3.0",
115
+ :metric => 20,
116
+ :type => :e2,
117
+ :tag=> 255
118
+ }
119
+
120
+ assert_equal ext.encode, AsExternal.new(ext).encode
121
+
122
+ end
123
+
124
+ end
125
+
126
+ __END__
127
+
128
+
129
+ R1#show ip ospf database external
130
+
131
+ OSPF Router with ID (1.1.1.1) (Process ID 1)
132
+
133
+ Type-5 AS External Link States
134
+
135
+ Routing Bit Set on this LSA
136
+ LS age: 12
137
+ Options: (No TOS-capability, No DC)
138
+ LS Type: AS External Link
139
+ Link State ID: 50.0.1.0 (External Network Number )
140
+ Advertising Router: 0.1.0.1
141
+ LS Seq Number: 80000001
142
+ Checksum: 0x9556
143
+ Length: 48
144
+ Network Mask: /24
145
+ Metric Type: 1 (Comparable directly to link state metric)
146
+ TOS: 0
147
+ Metric: 0
148
+ Forward Address: 0.0.0.0
149
+ External Route Tag: 0
150
+ Metric Type: 1 (Comparable directly to link state metric)
151
+ TOS: 10
152
+ Metric: 20
153
+ Forward Address: 0.0.0.0
154
+ External Route Tag: 10
155
+
156
+ Routing Bit Set on this LSA
157
+ LS age: 19
158
+ Options: (No TOS-capability, No DC)
159
+ LS Type: AS External Link
160
+ Link State ID: 50.0.2.0 (External Network Number )
161
+ Advertising Router: 0.1.0.1
162
+ LS Seq Number: 80000001
163
+ Checksum: 0x8A60
164
+ Length: 48
165
+ Network Mask: /24
166
+ Metric Type: 1 (Comparable directly to link state metric)
167
+ TOS: 0
168
+ Metric: 0
169
+ Forward Address: 0.0.0.0
170
+ External Route Tag: 0
171
+ Metric Type: 1 (Comparable directly to link state metric)
172
+ TOS: 10
173
+ Metric: 20
174
+ Forward Address: 0.0.0.0
175
+ External Route Tag: 10
176
+
177
+
178
+
179
+
180
+
181
+ 00000005
182
+ 0a000000
183
+ 01010101
184
+ 80000001
185
+ b40b0024
186
+
187
+ ffffff00
188
+ 80000001
189
+ 01020300
190
+ 000000ff
191
+
192
+ 0 1 2 3
193
+ 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
194
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
195
+ | LS age | Options | 5 |
196
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
197
+ | Link State ID |
198
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
199
+ | Advertising Router |
200
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
201
+ | LS sequence number |
202
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
203
+ | LS checksum | length |
204
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
205
+ | Network Mask |
206
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
207
+ |E| 0 | metric |
208
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
209
+ | Forwarding address |
210
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
211
+ | External Route Tag |
212
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
213
+ |E| TOS | TOS metric |
214
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
215
+ | Forwarding address |
216
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
217
+ | External Route Tag |
218
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@@ -0,0 +1,314 @@
1
+ require "test/unit"
2
+ require "lsa/lsa_factory"
3
+
4
+ class TestLsaLsa < Test::Unit::TestCase
5
+ def test_asbr_summary
6
+ s = ['000000040101010101010101800000012f27001c0000000000000000'].pack('H*')
7
+ lsa = OSPFv2::Lsa.factory(s)
8
+ assert_equal OSPFv2::AsbrSummary, lsa.class
9
+ end
10
+ def test_summary
11
+ s = ['000000030a000000010101018000000188680024ffffff000000000121000014220000ff'].pack('H*')
12
+ lsa = OSPFv2::Lsa.factory(s)
13
+ assert_equal OSPFv2::Summary, lsa.class
14
+ end
15
+ def test_router
16
+ s = ['000022010047000b0047000b8000000155d70084000000090047000bffffffff030000010046000b0d0044b6010000010d0044b4fffffffc030000010047000a0d0044ba010000010d0044b8fffffffc030000010047000c0d0044c1010000010d0044c0fffffffc030000010048000b0d0045b1010000010d0045b0fffffffc03000001'].pack('H*')
17
+ lsa = OSPFv2::Lsa.factory(s)
18
+ assert_equal OSPFv2::Router, lsa.class
19
+ assert_equal s, lsa.encode
20
+ end
21
+
22
+ def test_external
23
+ #TODO unit-test lsa factory external lsa
24
+ end
25
+
26
+ def test_network
27
+ #TODO unit-test lsa factory network lsa
28
+ end
29
+
30
+ def test_traffic_engineering_header_only
31
+ s = ['0000000a010000ff0202020280000001cd890014'].pack('H*')
32
+ lsa = OSPFv2::Lsa.factory(s)
33
+ assert_equal(OSPFv2::TrafficEngineering, lsa.class)
34
+ assert_equal(s, lsa.encode)
35
+ end
36
+
37
+ def test_traffic_engineering_link_tlv
38
+ s = '0000000a010000000000000080000001b2ac0074
39
+ 0002 005c
40
+ 0001 0001 01 000000
41
+ 0002 0004 01020304
42
+ 0003 0004 01010101
43
+ 0004 0004 02020202
44
+ 0005 0004 000000ff
45
+ 0006 0004 449c4000
46
+ 0007 0004 445ac000
47
+ 0008 0020 4148000041480000414800004148000041480000414800004148000041480000'.split.join
48
+ lsa = OSPFv2::Lsa.factory([s].pack('H*'))
49
+ assert_equal(OSPFv2::TrafficEngineering, lsa.class)
50
+ assert_equal(s, lsa.to_shex)
51
+ end
52
+
53
+ # LSA #3
54
+ # Advertising Router 10.255.245.46, seq 0x8000001e, age 8s, length 104
55
+ # Area Local Opaque LSA (10), Opaque-Type Traffic Engineering LSA (1), Opaque-ID 5
56
+ # Options: [External, Demand Circuit]
57
+ # Link TLV (2), length: 100
58
+ # Link Type subTLV (1), length: 1, Point-to-point (1)
59
+ # Link ID subTLV (2), length: 4, 12.1.1.1 (0x0c010101)
60
+ # Local Interface IP address subTLV (3), length: 4, 192.168.208.88
61
+ # Remote Interface IP address subTLV (4), length: 4, 192.168.208.89
62
+ # Traffic Engineering Metric subTLV (5), length: 4, Metric 1
63
+ # Maximum Bandwidth subTLV (6), length: 4, 155.520 Mbps
64
+ # Maximum Reservable Bandwidth subTLV (7), length: 4, 155.520 Mbps
65
+ # Unreserved Bandwidth subTLV (8), length: 32
66
+ # TE-Class 0: 155.520 Mbps
67
+ # TE-Class 1: 155.520 Mbps
68
+ # TE-Class 2: 155.520 Mbps
69
+ # TE-Class 3: 155.520 Mbps
70
+ # TE-Class 4: 155.520 Mbps
71
+ # TE-Class 5: 155.520 Mbps
72
+ # TE-Class 6: 155.520 Mbps
73
+ # TE-Class 7: 155.520 Mbps
74
+ # Administrative Group subTLV (9), length: 4, 0x00000000
75
+ # 0200 0000 45c0 01b0 d0ff 0000 0159 7520
76
+ # c0a8 d067 e000 0005 0204 019c 0aff f531
77
+ # 0000 0000 2dde 0000 0000 0000 0000 0000
78
+ # 0000 0003 000a 2202 c0a8 a42f 0c01 0101
79
+ # 8000 0eba b7e3 0020 ffff fc00 0c01 0101
80
+ # 7c01 0001 000a 2201 0c01 0101 0c01 0101
81
+ # 8000 3313 0ed3 00e4 0000 0011 c0a8 d043
82
+ # c0a8 d044 0200 0001 c0a8 a42f c0a8 a42f
83
+ # 0200 0001 0c01 0101 ffff ffff 0300 0000
84
+ # 0aff f52f ffff ffff 0300 0000 7c01 0101
85
+ # 7c01 0002 0200 0001 7c01 0201 7c01 0003
86
+ # 0200 0001 0a01 0000 ffff 0000 0300 0001
87
+ # 0a01 0000 ffff 0000 0300 0001 0a02 0000
88
+ # ffff 0000 0300 0001 0a01 0000 ffff 0000
89
+ # 0300 0001 0a02 0000 ffff 0000 0300 0001
90
+ # 0aff f52e c0a8 d05b 0100 0001 c0a8 d05a
91
+ # ffff fffe 0300 0001 0aff f52e c0a8 d059
92
+ # 0100 0001 c0a8 d058 ffff fffe 0300 0001
93
+ # 0aff f52e c0a8 d057 0100 0001 c0a8 d056
94
+ # ffff fffe 0300 0001 0008 220a 0100 0005
95
+ # 0aff f52e 8000 001e d240 007c 0002 0064
96
+ # 0001 0001 0100 0000 0002 0004 0c01 0101
97
+ # 0003 0004 c0a8 d058 0004 0004 c0a8 d059
98
+ # 0005 0004 0000 0001 0006 0004 4b94 50c0
99
+ # 0007 0004 4b94 50c0 0008 0020 4b94 50c0
100
+ # 4b94 50c0 4b94 50c0 4b94 50c0 4b94 50c0
101
+ # 4b94 50c0 4b94 50c0 4b94 50c0 0009 0004
102
+ # 0000 0000
103
+ require 'packet/ospf_packet'
104
+ require 'lsa/tlv/tlv_factory'
105
+
106
+ def test_traffic_engineering_link_tlv_2
107
+ s = "
108
+ 0204 019c
109
+ 0aff f531
110
+ 0000 0000
111
+ 2dde 0000
112
+ 0000 0000
113
+ 0000 0000
114
+
115
+ 0000 0003
116
+
117
+ 000a 22 02
118
+ c0a8a42f
119
+ 0c010101
120
+ 80000eba
121
+ b7e3 0020
122
+ fffffc00
123
+ 0c010101
124
+ 7c010001
125
+
126
+ 000a 22 01
127
+ 0c010101
128
+ 0c010101
129
+ 80003313
130
+ 0ed3 00e4
131
+ 0000 0011
132
+
133
+ c0 a8d043
134
+ c0a8d044
135
+ 0200 0001 c0a8 a42f c0a8 a42f
136
+ 0200 0001 0c01 0101 ffff ffff 0300 0000
137
+ 0aff f52f ffff ffff 0300 0000 7c01 0101
138
+ 7c01 0002 0200 0001 7c01 0201 7c01 0003
139
+ 0200 0001 0a01 0000 ffff 0000 0300 0001
140
+ 0a01 0000 ffff 0000 0300 0001 0a02 0000
141
+ ffff 0000 0300 0001 0a01 0000 ffff 0000
142
+ 0300 0001 0a02 0000 ffff 0000 0300 0001
143
+ 0aff f52e c0a8 d05b 0100 0001 c0a8 d05a
144
+ ffff fffe 0300 0001 0aff f52e c0a8 d059
145
+ 0100 0001 c0a8 d058 ffff fffe 0300 0001
146
+ 0aff f52e c0a8 d057 0100 0001 c0a8 d056
147
+ ffff fffe 0300 0001 0008 220a 0100 0005
148
+ 0aff f52e 8000 001e d240 007c
149
+
150
+ 0002 0064
151
+ 0001 0001 0100 0000
152
+ 0002 0004 0c01 0101
153
+ 0003 0004 c0a8 d058
154
+ 0004 0004 c0a8 d059
155
+ 0005 0004 0000 0001
156
+ 0006 0004 4b94 50c0
157
+ 0007 0004 4b94 50c0
158
+ 0008 0020 4b94 50c0 4b94 50c0 4b94 50c0 4b94 50c0 4b94 50c0
159
+ 4b94 50c0 4b94 50c0 4b94 50c0
160
+ 0009 0004 0000 0000
161
+ ".split.join
162
+ sbin = [s].pack('H*')
163
+ packet = OSPFv2::OspfPacket.factory([s].pack('H*'))
164
+ assert_equal(OSPFv2::LinkStateUpdate, packet.class)
165
+ assert_equal(3, packet.lsas.size)
166
+ assert_equal([OSPFv2::Network, OSPFv2::Router, OSPFv2::TrafficEngineering],
167
+ packet.lsas.collect { |lsa| lsa.class })
168
+ # puts packet.lsas[2].to_s_verbose
169
+ assert_equal(s, packet.to_shex)
170
+ end
171
+
172
+ def test_router_lsa_from_hash
173
+
174
+ h_lsa =
175
+ {
176
+ :sequence_number=>2147483650,
177
+ :advertising_router=>"1.2.0.0",
178
+ :ls_id=>"0.0.4.5",
179
+ :nwveb=>1,
180
+ :ls_type=>:router,
181
+ :options=> 0x21,
182
+ :ls_age=>10,
183
+ :links=>[
184
+ {
185
+ :link_id=>"1.1.1.1",
186
+ :link_data=>"255.255.255.255",
187
+ :router_link_type=>:point_to_point,
188
+ :metric=>11,
189
+ :mt_metrics=>[]
190
+ },
191
+ {
192
+ :link_id=>"1.1.1.2",
193
+ :link_data=>"255.255.255.255",
194
+ :router_link_type=>:point_to_point,
195
+ :metric=>12,
196
+ :mt_metrics=>[]
197
+ }
198
+ ],
199
+ }
200
+
201
+ lsa = OSPFv2::Lsa.factory h_lsa
202
+ assert_equal OSPFv2::Router, lsa.class
203
+ assert_equal h_lsa, lsa.to_hash
204
+ end
205
+
206
+ def test_network_lsa_from_hash
207
+ h_lsa = {
208
+ :ls_id=>"192.168.0.1",
209
+ :ls_age=>0,
210
+ :ls_type=>:network,
211
+ :advertising_router=>"1.1.1.1",
212
+ :sequence_number=>2147483649,
213
+ :options=>0,
214
+ :network_mask=>"255.255.255.0",
215
+ :attached_routers=>["1.1.1.1", "2.2.2.2", "3.3.3.3"],
216
+ }
217
+ lsa = OSPFv2::Lsa.factory h_lsa
218
+ assert_equal OSPFv2::Network, lsa.class
219
+ assert_equal h_lsa, lsa.to_hash
220
+ end
221
+
222
+ def test_summary_lsa_from_hash
223
+ h_lsa = {
224
+ :sequence_number=>2147483649,
225
+ :advertising_router=>"1.1.1.1",
226
+ :ls_id=>"10.0.0.0",
227
+ :ls_age=>0,
228
+ :options=>0,
229
+ :ls_type=>:summary,
230
+ :netmask=>"255.255.255.0",
231
+ :metric=>1,
232
+ :mt_metrics=>[{:id=>33, :metric=>20}, {:id=>34, :metric=>255}]
233
+ }
234
+ lsa = OSPFv2::Lsa.factory h_lsa
235
+ assert_equal OSPFv2::Summary, lsa.class
236
+ assert_equal h_lsa, lsa.to_hash
237
+ end
238
+
239
+ def test_asbr_summary_lsa_hash
240
+ h_lsa = {
241
+ :sequence_number=>2147483649,
242
+ :advertising_router=>"1.1.1.1",
243
+ :ls_id=>"10.0.0.0",
244
+ :ls_age=>0,
245
+ :metric=>1,
246
+ :options=>0,
247
+ :ls_type=>:asbr_summary,
248
+ :netmask=>"255.255.255.0",
249
+ :mt_metrics=>[{:id=>33, :metric=>20}, {:id=>34, :metric=>255}]
250
+ }
251
+ lsa = OSPFv2::Lsa.factory h_lsa
252
+ assert_equal OSPFv2::AsbrSummary, lsa.class
253
+ assert_equal h_lsa, lsa.to_hash
254
+ end
255
+
256
+ def test_external_lsa_hash
257
+ h_lsa = {
258
+ :sequence_number=>2147483649,
259
+ :ls_age => 13,
260
+ :options=>0,
261
+ :ls_type => :as_external,
262
+ :advertising_router=>"1.1.1.1",
263
+ :ls_id=>"10.0.0.0",
264
+ :netmask => "255.255.255.0",
265
+ :external_route=> {
266
+ :type=>:e2,
267
+ :forwarding_address=>"1.2.3.0",
268
+ :metric=>1,
269
+ :tag=>255
270
+ },
271
+ :mt_metrics=>[]
272
+ }
273
+ lsa = OSPFv2::Lsa.factory h_lsa
274
+ assert_equal OSPFv2::AsExternal, lsa.class
275
+ assert_equal h_lsa, lsa.to_hash
276
+ end
277
+
278
+ def test_traffic_engineering_lsa_from_hash
279
+ h_lsa = {:ls_age=>0,
280
+ :ls_type=>:area,
281
+ :advertising_router=>"0.0.0.0",
282
+ :sequence_number=>2147483649,
283
+ :opaque_id=>0,
284
+ :opaque_type=>:te_lsa,
285
+ :top_lvl_tlv=>
286
+ {:tlv_type=>2,
287
+ :tlvs=>
288
+ [{:tlv_type=>1, :link_type=>1},
289
+ {:tlv_type=>2, :link_id=>"1.2.3.4"},
290
+ {:ip_address=>"1.1.1.1", :tlv_type=>3},
291
+ {:ip_address=>"2.2.2.2", :tlv_type=>4},
292
+ {:tlv_type=>5, :te_metric=>255},
293
+ {:max_bw=>10000, :tlv_type=>6},
294
+ {:tlv_type=>7, :max_resv_bw=>7000},
295
+ {:tlv_type=>8,
296
+ :unreserved_bw=>[100, 100, 100, 100, 100, 100, 100, 100]}]},
297
+ :options=>0}
298
+
299
+ lsa = OSPFv2::Lsa.factory h_lsa
300
+ assert_equal OSPFv2::TrafficEngineering, lsa.class
301
+ assert_equal h_lsa, lsa.to_hash
302
+ end
303
+
304
+ def test_external_lsa_hash_mt_metrics
305
+ lsa1 = OSPFv2::AsExternal.new_lsdb(:advertising_router=> 1, :mt_metrics=>[{:mt_id=>10, :metric=>20, :tag=>10, :forwarding_address=> '1.1.1.1'}])
306
+ lsa2 = OSPFv2::Lsa.factory lsa1
307
+ assert_equal lsa1.to_shex, lsa2.to_shex
308
+ assert_equal lsa1.to_shex, OSPFv2::Lsa.factory(lsa2.to_hash).to_shex
309
+ assert_equal lsa1.to_hash, lsa2.to_hash
310
+
311
+ end
312
+
313
+ end
314
+