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,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
+