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,135 @@
1
+ require "test/unit"
2
+ require "lsa/summary"
3
+
4
+ class TestLsaSummary < Test::Unit::TestCase
5
+ include OSPFv2
6
+
7
+ def setup
8
+ Summary.reset
9
+ end
10
+
11
+ def test_new
12
+ h = {
13
+ :advertising_router=>"1.1.1.1",
14
+ :ls_id=>"10.0.0.0",
15
+ :metric =>1,
16
+ :netmask => "255.255.255.0"
17
+ }
18
+ summary = Summary.new h
19
+ assert_equal "000000030a0000000101010180000001f25d001cffffff0000000001", summary.to_shex
20
+ end
21
+
22
+ def test_mt_metric
23
+ h = {
24
+ :advertising_router=>"1.1.1.1",
25
+ :ls_id=>"10.0.0.0",
26
+ :metric => 1,
27
+ :netmask => "255.255.255.0",
28
+ :mt_metrics => [{:id=>33, :metric=>20}, {:id=>34, :metric=>255}]
29
+ }
30
+ summary = Summary.new h
31
+ assert_equal("000000030a000000010101018000000188680024ffffff000000000121000014220000ff",summary.to_shex)
32
+ assert_equal summary.to_shex, Summary.new(summary.to_hash).to_shex
33
+ assert_equal summary.to_shex, Summary.new(summary).to_shex
34
+ h = summary.to_hash
35
+ assert_equal 0, h[:ls_age]
36
+ assert_equal '1.1.1.1', h[:advertising_router]
37
+ assert_equal '10.0.0.0', h[:ls_id]
38
+ assert_equal :summary, h[:ls_type]
39
+ assert_equal 0x80000001, h[:sequence_number]
40
+ assert_equal '255.255.255.0', h[:netmask]
41
+ assert_equal 0, h[:options]
42
+ assert_equal 33, h[:mt_metrics][0][:id]
43
+ assert_equal 20, h[:mt_metrics][0][:metric]
44
+ assert_equal 1, h[:metric]
45
+ s = Summary.new_ntop(summary.encode)
46
+ assert_equal summary.to_shex, s.to_shex
47
+ assert_match /Topology \(ID 33\) -> Metric: 20/, summary.to_s_junos_verbose
48
+ assert_match /Topology \(ID 34\) -> Metric: 255/, summary.to_s_junos_verbose
49
+ end
50
+
51
+ def test_fix_hash
52
+ h1 = {
53
+ :advertising_router=>"1.1.1.1",
54
+ :ls_id=>"10.0.0.0",
55
+ :metric => 1,
56
+ :netmask => "255.255.255.0",
57
+ :mt_metrics => [{:id=>33, :metric=>20}, {:id=>34, :metric=>255}]
58
+ }
59
+ summary1 = Summary.new h1
60
+ h2 = {
61
+ :advertising_router=>"1.1.1.1",
62
+ :network=>"10.0.0.0/24",
63
+ :metric => 1,
64
+ :mt_metrics => [{:id=>33, :metric=>20}, {:id=>34, :metric=>255}]
65
+ }
66
+ summary2 = Summary.new h2
67
+ assert_equal(summary2.encode, summary1.encode)
68
+ assert summary1.summary?
69
+
70
+ # puts summary1.to_s_ios
71
+ # puts summary1.to_s_ios_verbose
72
+
73
+ end
74
+
75
+ def test_count
76
+ Summary.new_lsdb
77
+ assert_equal "30.0.0.#{Summary.count}/24", Summary.network
78
+ Summary.new_lsdb
79
+ assert_equal 2, Summary.count
80
+ assert_equal "30.0.0.#{Summary.count}/24", Summary.network
81
+
82
+ end
83
+
84
+ def test_new_lsdb
85
+ #FIXME: finish the work: what was the intent?
86
+ # puts Summary.new_lsdb :advertising_router=> 1, :metric => (Summary.count) +1
87
+ # puts Summary.new_lsdb :advertising_router=> 1, :metric => (Summary.count) +1
88
+ end
89
+
90
+ end
91
+
92
+
93
+ class TestLsaAsbrSummary < Test::Unit::TestCase
94
+ include OSPFv2
95
+ def test_asbr_new
96
+ asbr_summary = AsbrSummary.new(:advertising_router=>"1.1.1.1", :ls_id=>"1.1.1.1")
97
+ assert_equal("000000040101010101010101800000012f27001c0000000000000000",asbr_summary.to_shex)
98
+ assert_equal asbr_summary.to_shex, AsbrSummary.new(asbr_summary.to_hash).to_shex
99
+ assert_equal asbr_summary.to_shex, AsbrSummary.new(asbr_summary).to_shex
100
+ end
101
+ end
102
+
103
+
104
+ __END__
105
+
106
+ R1#show ip ospf database summary
107
+
108
+ OSPF Router with ID (1.1.1.1) (Process ID 1)
109
+
110
+ Summary Net Link States (Area 0)
111
+
112
+ Routing Bit Set on this LSA
113
+ LS age: 67
114
+ Options: (No TOS-capability, No DC, Upward)
115
+ LS Type: Summary Links(Network)
116
+ Link State ID: 30.0.1.0 (summary Network Number)
117
+ Advertising Router: 0.1.0.1
118
+ LS Seq Number: 80000001
119
+ Checksum: 0xE855
120
+ Length: 28
121
+ Network Mask: /24
122
+ TOS: 0 Metric: 0
123
+
124
+ Routing Bit Set on this LSA
125
+ LS age: 67
126
+ Options: (No TOS-capability, No DC, Upward)
127
+ LS Type: Summary Links(Network)
128
+ Link State ID: 30.0.2.0 (summary Network Number)
129
+ Advertising Router: 0.1.0.1
130
+ LS Seq Number: 80000001
131
+ Checksum: 0xDD5F
132
+ Length: 28
133
+ Network Mask: /24
134
+ TOS: 0 Metric: 0
135
+
@@ -0,0 +1,39 @@
1
+ #TODO find spec for this TLV and rename it ?
2
+ # LSA #3
3
+ # Advertising Router 10.255.245.46, seq 0x8000001e, age 8s, length 104
4
+ # Area Local Opaque LSA (10), Opaque-Type Traffic Engineering LSA (1), Opaque-ID 5
5
+ # Options: [External, Demand Circuit]
6
+ # Link TLV (2), length: 100
7
+ # Link Type subTLV (1), length: 1, Point-to-point (1)
8
+ # Link ID subTLV (2), length: 4, 12.1.1.1 (0x0c010101)
9
+ # Local Interface IP address subTLV (3), length: 4, 192.168.208.88
10
+ # Remote Interface IP address subTLV (4), length: 4, 192.168.208.89
11
+ # Traffic Engineering Metric subTLV (5), length: 4, Metric 1
12
+ # Maximum Bandwidth subTLV (6), length: 4, 155.520 Mbps
13
+ # Maximum Reservable Bandwidth subTLV (7), length: 4, 155.520 Mbps
14
+ # Unreserved Bandwidth subTLV (8), length: 32
15
+ # TE-Class 0: 155.520 Mbps
16
+ # TE-Class 1: 155.520 Mbps
17
+ # TE-Class 2: 155.520 Mbps
18
+ # TE-Class 3: 155.520 Mbps
19
+ # TE-Class 4: 155.520 Mbps
20
+ # TE-Class 5: 155.520 Mbps
21
+ # TE-Class 6: 155.520 Mbps
22
+ # TE-Class 7: 155.520 Mbps
23
+ # Administrative Group subTLV (9), length: 4, 0x00000000
24
+
25
+ require "test/unit"
26
+
27
+ require "lsa/tlv/color"
28
+
29
+ class TestLsaTlvColor < Test::Unit::TestCase
30
+ include OSPFv2
31
+ def test_new
32
+ assert_equal("0009000400000000", Color_Tlv.new().to_shex)
33
+ assert_equal("OSPFv2::Color_Tlv: 254", Color_Tlv.new({:color=>254}).to_s)
34
+ assert_equal("00090004000000fe", Color_Tlv.new({:color=>254}).to_shex)
35
+ assert_equal(255, Color_Tlv.new({:color=>255}).to_hash[:color])
36
+ assert_equal("000900040000ffff", Color_Tlv.new(Color_Tlv.new({:color=>0xffff}).encode).to_shex)
37
+ end
38
+ end
39
+
@@ -0,0 +1,14 @@
1
+ require "test/unit"
2
+
3
+ require "lsa/tlv/link_id"
4
+
5
+ class TestLsaTlvLinkId < Test::Unit::TestCase
6
+ include OSPFv2
7
+ def test_new
8
+ assert_equal("0002000400000000", LinkId_Tlv.new().to_shex)
9
+ assert_equal("Link ID : 1.1.1.1", LinkId_Tlv.new({:link_id=>"1.1.1.1"}).to_s)
10
+ assert_equal("1.1.1.1", LinkId_Tlv.new({:link_id=>"1.1.1.1"}).to_hash[:link_id])
11
+ assert_equal("0002000401010101", LinkId_Tlv.new({:link_id=>"1.1.1.1"}).to_shex)
12
+ assert_equal("0002000401010101", LinkId_Tlv.new(LinkId_Tlv.new({:link_id=>"1.1.1.1"}).encode).to_shex)
13
+ end
14
+ end
@@ -0,0 +1,413 @@
1
+ require "test/unit"
2
+
3
+ require "lsa/tlv/link"
4
+ require 'lsa/tlv/tlv_factory'
5
+
6
+ class TestLsaTlvLink < Test::Unit::TestCase
7
+ include OSPFv2
8
+ def test_new
9
+
10
+ link_tlv = Link_Tlv.new
11
+ assert_equal('00020000', link_tlv.to_shex)
12
+
13
+ link_tlv << LinkType_Tlv.new
14
+ assert_equal('000200080001000101000000', link_tlv.to_shex)
15
+
16
+ link_tlv << LinkId_Tlv.new(:link_id=>'1.2.3.4')
17
+ assert_equal('0002001000010001010000000002000401020304', link_tlv.to_shex)
18
+
19
+ link_tlv << LocalInterfaceIpAddress_Tlv.new(:ip_address=>"1.1.1.1")
20
+ assert_equal('00020018000100010100000000020004010203040003000401010101', link_tlv.to_shex)
21
+
22
+ link_tlv << RemoteInterfaceIpAddress_Tlv.new(:ip_address=>"2.2.2.2")
23
+ assert_equal('000200200001000101000000000200040102030400030004010101010004000402020202', link_tlv.to_shex)
24
+
25
+ link_tlv << TrafficEngineeringMetric_Tlv.new(:te_metric=>255)
26
+ s = '0002002800010001010000000002000401020304'
27
+ s +='0003000401010101000400040202020200050004000000ff'
28
+ assert_equal(s, link_tlv.to_shex)
29
+
30
+ link_tlv << MaximumBandwidth_Tlv.new(:max_bw=>100_000_000)
31
+ s = '0002003000010001010000000002000401020304'
32
+ s += '0003000401010101000400040202020200050004000000ff'
33
+ s += '000600044b3ebc20'
34
+ assert_equal(s, link_tlv.to_shex)
35
+
36
+ link_tlv << MaximumReservableBandwidth_Tlv.new(:max_resv_bw=>100_000_000)
37
+ s = '000200380001000101000000'
38
+ s += '0002000401020304'
39
+ s += '0003000401010101'
40
+ s += '0004000402020202'
41
+ s += '00050004000000ff'
42
+ s += '000600044b3ebc20'
43
+ s += '000700044b3ebc20'
44
+ assert_equal(s, link_tlv.to_shex)
45
+ link_tlv << UnreservedBandwidth_Tlv.new(:unreserved_bw=>[100_000_000]*8)
46
+ s = '0002 005c
47
+ 0001 0001 01 000000
48
+ 0002 0004 01020304
49
+ 0003 0004 01010101
50
+ 0004 0004 02020202
51
+ 0005 0004 000000ff
52
+ 000600044b3ebc20
53
+ 000700044b3ebc20
54
+ 0008 0020 4b3ebc20 4b3ebc20 4b3ebc20 4b3ebc20 4b3ebc20 4b3ebc20 4b3ebc20 4b3ebc20'
55
+ assert_equal(s.split.join, link_tlv.to_shex)
56
+
57
+ puts link_tlv
58
+ end
59
+ def test_tlv_type_6
60
+ link_type = SubTlv.factory(['0006 0004 4b3e bc20'.split.join].pack('H*'))
61
+ assert_equal(MaximumBandwidth_Tlv,link_type.class)
62
+ assert_equal(100000000.0,link_type.max_bw)
63
+ assert_equal({:tlv_type=>6, :max_bw=>100000000},link_type.to_hash)
64
+ assert_equal('000600044b3ebc20', SubTlv.factory({:tlv_type=>6, :max_bw=>100_000_000.0}).to_shex)
65
+ assert_equal(MaximumBandwidth_Tlv,link_type.class)
66
+ assert_equal(100000000.0,link_type.max_bw)
67
+ end
68
+ def test_tlv_type_7
69
+ link_type = SubTlv.factory(['0007 0004 4b3e bc20'.split.join].pack('H*'))
70
+ assert_equal(MaximumReservableBandwidth_Tlv,link_type.class)
71
+ assert_equal('Maximum reservable bandwidth : 100000000',link_type.to_s)
72
+ assert_equal({:tlv_type=>7, :max_resv_bw=>100000000},link_type.to_hash)
73
+ assert_equal('000700044b3ebc20', SubTlv.factory({:tlv_type=>7, :max_resv_bw=>100000000}).to_shex)
74
+
75
+
76
+ assert_equal(100000000.0, link_type.max_resv_bw)
77
+ end
78
+
79
+ def test_tlv_type_8
80
+ link_type = SubTlv.factory(['0008 0020 4b3e bc20 4b3e bc20 4b3e bc20 4b3e bc20 4b3e bc20 4b3e bc20 4b3e bc20 4b3e bc20 '.split.join].pack('H*'))
81
+ assert_equal(100000000.0, link_type.unreserved_bw[0])
82
+ link_type = SubTlv.factory(['0008 0020 4b94 50c0
83
+ 4b94 50c0 4b94 50c0 4b94 50c0 4b94 50c0
84
+ 4b94 50c0 4b94 50c0 4b94 50c0 '.split.join].pack('H*'))
85
+ assert_equal(8,link_type.tlv_type)
86
+ assert_equal(UnreservedBandwidth_Tlv,link_type.class)
87
+ assert_equal(155520000.0, link_type.unreserved_bw[0])
88
+ assert_equal("Unreserved bandwidth : 155520000, 155520000, 155520000, 155520000, 155520000, 155520000, 155520000, 155520000", link_type.to_s)
89
+ end
90
+
91
+ end
92
+
93
+
94
+ __END__
95
+
96
+
97
+ __END__
98
+
99
+
100
+ TODO: to_s_ios
101
+
102
+ Type-10 Opaque Link Area Link States (Area 0)
103
+
104
+ Link ID ADV Router Age Seq# Checksum Opaque ID
105
+ 1.0.0.0 0.0.0.3 23 0x80000001 0x000D12 0
106
+ 1.0.0.255 0.0.0.1 23 0x80000001 0x00ACB1 255
107
+
108
+
109
+
110
+
111
+ R1#show ip ospf database opaque-area
112
+
113
+ OSPF Router with ID (1.1.1.1) (Process ID 1)
114
+
115
+ Type-10 Opaque Link Area Link States (Area 0)
116
+
117
+ LS age: 44
118
+ Options: (No TOS-capability, No DC)
119
+ LS Type: Opaque Area Link
120
+ Link State ID: 1.0.0.0
121
+ Opaque Type: 1
122
+ Opaque ID: 0
123
+ Advertising Router: 0.0.0.3
124
+ LS Seq Number: 80000001
125
+ Checksum: 0xD12
126
+ Length: 116
127
+ Fragment number : 0
128
+
129
+ Link connected to Point-to-Point network
130
+ Link ID : 5.6.7.8
131
+ Interface Address : 111.111.111.111
132
+ Neighbor Address : 222.222.222.222
133
+ Admin Metric : 255
134
+ Maximum bandwidth : 1250
135
+ Maximum reservable bandwidth : 875
136
+ Number of Priority : 8
137
+ Priority 0 : 12 Priority 1 : 12
138
+ Priority 2 : 12 Priority 3 : 12
139
+ Priority 4 : 12 Priority 5 : 12
140
+ Priority 6 : 12 Priority 7 : 12
141
+
142
+ Number of Links : 1
143
+
144
+ LS age: 45
145
+ Options: (No TOS-capability, No DC)
146
+ LS Type: Opaque Area Link
147
+ Link State ID: 1.0.0.255
148
+ Opaque Type: 1
149
+ Opaque ID: 255
150
+ Advertising Router: 0.0.0.1
151
+ LS Seq Number: 80000001
152
+ Checksum: 0xACB1
153
+ Length: 116
154
+ Fragment number : 255
155
+
156
+ Link connected to Point-to-Point network
157
+ Link ID : 1.2.3.4
158
+ Interface Address : 1.1.1.1
159
+ Neighbor Address : 2.2.2.2
160
+ Admin Metric : 255
161
+ Maximum bandwidth : 1250
162
+ Maximum reservable bandwidth : 875
163
+ Number of Priority : 8
164
+ Priority 0 : 12 Priority 1 : 12
165
+ Priority 2 : 12 Priority 3 : 12
166
+ Priority 4 : 12 Priority 5 : 12
167
+ Priority 4 : 12 Priority 5 : 12
168
+ Priority 6 : 12 Priority 7 : 12
169
+
170
+ Number of Links : 1
171
+
172
+ LS age: 45
173
+ Options: (No TOS-capability, No DC)
174
+ LS Type: Opaque Area Link
175
+ Link State ID: 1.0.0.255
176
+ Opaque Type: 1
177
+ Opaque ID: 255
178
+ Advertising Router: 0.0.0.1
179
+ LS Seq Number: 80000001
180
+ Checksum: 0xACB1
181
+ Length: 116
182
+ Fragment number : 255
183
+
184
+ Link connected to Point-to-Point network
185
+ Link ID : 1.2.3.4
186
+ Interface Address : 1.1.1.1
187
+ Neighbor Address : 2.2.2.2
188
+ Admin Metric : 255
189
+ Maximum bandwidth : 1250
190
+ Maximum reservable bandwidth : 875
191
+ Number of Priority : 8
192
+ Priority 0 : 12 Priority 1 : 12
193
+ Priority 2 : 12 Priority 3 : 12
194
+ Priority 4 : 12 Priority 5 : 12
195
+ Priority 6 : 12 Priority 7 : 12
196
+
197
+ Number of Links : 1
198
+
199
+ R1#
200
+
201
+
202
+ class LinkTLV_Test < Test::Unit::TestCase # :nodoc:
203
+ include Ospf
204
+
205
+ def setup
206
+ @link_tlv = LinkTLV.new()
207
+ link_type = LinkTypeSubTLV.new({:link_type=>1})
208
+ link_id = LinkID_SubTLV.new({:link_id=>'12.1.1.1'})
209
+ local_if_addr = LocalInterfaceIP_Address_SubTLV.new({:local_interface_ip_address => '192.168.208.86', })
210
+ rmt_if_addr = RemoteInterfaceIP_Address_SubTLV.new({:remote_interface_ip_address => '192.168.208.87', })
211
+ te_metric = TE_MetricSubTLV.new({:te_metric => 1, })
212
+ max_bw = MaximumBandwidth_SubTLV.new({:max_bw => 155.52*1000000, })
213
+ max_resv_bw = MaximumReservableBandwidth_SubTLV.new({:max_resv_bw => 155.52*1000000, })
214
+ unresv_bw = UnreservedBandwidth_SubTLV.new({:unreserved_bw => [155.52*1000000]*8, })
215
+ @link_tlv << link_type << link_id << local_if_addr << rmt_if_addr << te_metric << max_bw << max_resv_bw << unresv_bw
216
+ @te_lsa = TrafficEngineeringLSA.new({:advr=>'0.1.0.1',}) # default to area lstype 10
217
+ @te_lsa << @link_tlv
218
+ end
219
+
220
+ def test_init
221
+ link_type = SubTLV_Factory.create({:tlv_type=>1, :link_type=>1})
222
+ link_id = SubTLV_Factory.create({:tlv_type=>2, :link_id=>"1.1.1.1"})
223
+ # type len type len va filler type len value
224
+ assert_equal("0002 0010 0001 0001 01 000000 0002 0004 01010101".split.join,
225
+ (LinkTLV.new() << link_type << link_id).to_shex)
226
+ link_type = SubTLV_Factory.create({:tlv_type=>1, :link_type=>1})
227
+ link_id = SubTLV_Factory.create({:tlv_type=>2, :link_id=>"1.1.1.1"})
228
+ rmt_ip = RemoteInterfaceIP_Address_SubTLV.new({:remote_interface_ip_address=>"1.1.1.1"})
229
+ l = LinkTLV.new()
230
+ l << link_type
231
+ l << link_id
232
+ l = LinkTLV.new() << link_type << link_id << rmt_ip
233
+ l.to_shex
234
+ l.to_hash
235
+ l1 = LinkTLV.new(l.enc)
236
+ assert_equal(1,l1.tlvs[0].to_hash[:link_type])
237
+ assert_equal(l1.to_shex, l.to_shex)
238
+ end
239
+ def test_tlv_type_1
240
+ link_type = SubTLV_Factory.create(['0001000101000000'].pack('H*'))
241
+ assert_equal(LinkTypeSubTLV,link_type.class)
242
+ end
243
+ def test_tlv_type_2
244
+ link_type = SubTLV_Factory.create(['000200040afff530'].pack('H*'))
245
+ assert_equal(LinkID_SubTLV,link_type.class)
246
+ end
247
+ def test_tlv_type_3
248
+ link_type = SubTLV_Factory.create(['0003 0004 c0a8 a431'.split.join].pack('H*'))
249
+ assert_equal(LocalInterfaceIP_Address_SubTLV,link_type.class)
250
+ assert_match(/192\.168\.164\.49/, link_type.to_s)
251
+ end
252
+ def test_tlv_type_4
253
+ link_type = SubTLV_Factory.create(['0004 0004 c0a8 a430'.split.join].pack('H*'))
254
+ assert_equal(RemoteInterfaceIP_Address_SubTLV,link_type.class)
255
+ end
256
+ def test_tlv_type_5
257
+ link_type = SubTLV_Factory.create(['0005 0004 0000 0001'.split.join].pack('H*'))
258
+ assert_equal(TE_MetricSubTLV,link_type.class)
259
+ end
260
+ def test_tlv_type_6
261
+ link_type = SubTLV_Factory.create(['0006 0004 4b3e bc20'.split.join].pack('H*'))
262
+ assert_equal(MaximumBandwidth_SubTLV,link_type.class)
263
+ assert_equal(100000000.0,link_type.max_bw)
264
+ assert_equal({:tlv_type=>6, :max_bw=>100000000.0},link_type.to_hash)
265
+ assert_equal('000600044b3ebc20', SubTLV_Factory.create({:tlv_type=>6, :max_bw=>100000000.0}).to_shex)
266
+ assert_equal(MaximumBandwidth_SubTLV,link_type.class)
267
+ assert_equal(100000000.0,link_type.max_bw)
268
+ end
269
+ def test_tlv_type_7
270
+ link_type = SubTLV_Factory.create(['0007 0004 4b3e bc20'.split.join].pack('H*'))
271
+ assert_equal(MaximumReservableBandwidth_SubTLV,link_type.class)
272
+ assert_equal(100000000.0, link_type.max_resv_bw)
273
+
274
+ end
275
+ def test_tlv_type_8
276
+ link_type = SubTLV_Factory.create(['0008 0020 4b3e bc20 4b3e bc20 4b3e bc20 4b3e bc20 4b3e bc20 4b3e bc20 4b3e bc20 4b3e bc20 '.split.join].pack('H*'))
277
+ assert_equal(100000000.0, link_type.unreserved_bw[0])
278
+ link_type = SubTLV_Factory.create(['0008 0020 4b94 50c0
279
+ 4b94 50c0 4b94 50c0 4b94 50c0 4b94 50c0
280
+ 4b94 50c0 4b94 50c0 4b94 50c0 '.split.join].pack('H*'))
281
+ assert_equal(UnreservedBandwidth_SubTLV,link_type.class)
282
+ assert_equal(155520000.0, link_type.unreserved_bw[0])
283
+ assert_equal("Ospf::UnreservedBandwidth_SubTLV: 155520000.0, 155520000.0, 155520000.0, 155520000.0, 155520000.0, 155520000.0, 155520000.0, 155520000.0", link_type.to_s)
284
+ end
285
+ def test_tlv_type_9
286
+ stlv = SubTLV_Factory.create(['0009 0004 0000 0001'.split.join].pack('H*'))
287
+ assert_equal(Color_SubTLV,stlv.class)
288
+ assert_equal(1,stlv.color)
289
+ end
290
+ def test_link_tlv_has?
291
+ assert_equal(8, @link_tlv.has?.size)
292
+ assert_equal(LinkTypeSubTLV,@link_tlv.has?[0])
293
+ assert_equal(true, @link_tlv.has?(LinkTypeSubTLV))
294
+ end
295
+ def test_link_tlv_index
296
+ assert_equal(LinkTypeSubTLV, @link_tlv[LinkTypeSubTLV].class)
297
+ assert_equal(LinkTypeSubTLV, @link_tlv.find(LinkTypeSubTLV).class)
298
+ assert_equal(['192.168.208.87'], @link_tlv[RemoteInterfaceIP_Address_SubTLV].remote_interface_ip_address)
299
+ end
300
+ def test_link_tlv_replace
301
+ rmt_ip = RemoteInterfaceIP_Address_SubTLV.new({:remote_interface_ip_address=>"1.1.1.1"})
302
+ @link_tlv.replace(rmt_ip)
303
+ assert_equal(['1.1.1.1'], @link_tlv[RemoteInterfaceIP_Address_SubTLV].remote_interface_ip_address)
304
+ end
305
+ def test_link_tlv_remove
306
+ @link_tlv.remove(RemoteInterfaceIP_Address_SubTLV)
307
+ assert_nil(@link_tlv[RemoteInterfaceIP_Address_SubTLV])
308
+ end
309
+
310
+ def test_link_tlv_create
311
+ h={}
312
+ h.store(:link_type,1)
313
+ h.store(:link_id,'1.1.1.1')
314
+ h.store(:local_interface_ip_address,'1.2.3.4')
315
+ h.store(:remote_interface_ip_address,'5.6.7.8')
316
+ h.store(:te_metric,10)
317
+ h.store(:max_bw,1.0*10**9)
318
+ h.store(:max_resv_bw,1.0*10**9)
319
+ h.store(:unreserved_bw,[1.0*10**9]*8)
320
+ link_tlv = Ospf::LinkTLV.create(h)
321
+ assert_equal(1,link_tlv[LinkTypeSubTLV].link_type)
322
+ assert_equal('1.1.1.1',link_tlv[LinkID_SubTLV ].link_id)
323
+ assert_equal(['1.2.3.4'],link_tlv[LocalInterfaceIP_Address_SubTLV].local_interface_ip_address)
324
+ assert_equal(['5.6.7.8'],link_tlv[RemoteInterfaceIP_Address_SubTLV].remote_interface_ip_address)
325
+ assert_equal(10,link_tlv[TE_MetricSubTLV].te_metric)
326
+ assert_equal(1000000000.0,link_tlv[MaximumBandwidth_SubTLV].max_bw)
327
+ assert_equal(1000000000.0,link_tlv[MaximumReservableBandwidth_SubTLV].max_resv_bw)
328
+ assert_equal([1000000000.0]*8,link_tlv[UnreservedBandwidth_SubTLV].unreserved_bw)
329
+ end
330
+
331
+ def test_te_lsa_2
332
+
333
+ ##### LSA #3
334
+ ##### Advertising Router 10.255.245.46, seq 0x8000001e, age 8s, length 104
335
+ ##### Area Local Opaque LSA (10), Opaque-Type Traffic Engineering LSA (1), Opaque-ID 5
336
+ ##### Options: [External, Demand Circuit]
337
+ ##### Link TLV (2), length: 100
338
+ ##### Link Type subTLV (1), length: 1, Point-to-point (1)
339
+ ##### Link ID subTLV (2), length: 4, 12.1.1.1 (0x0c010101)
340
+ ##### Local Interface IP address subTLV (3), length: 4, 192.168.208.88
341
+ ##### Remote Interface IP address subTLV (4), length: 4, 192.168.208.89
342
+ ##### Traffic Engineering Metric subTLV (5), length: 4, Metric 1
343
+ ##### Maximum Bandwidth subTLV (6), length: 4, 155.520 Mbps
344
+ ##### Maximum Reservable Bandwidth subTLV (7), length: 4, 155.520 Mbps
345
+ ##### Unreserved Bandwidth subTLV (8), length: 32
346
+ ##### TE-Class 0: 155.520 Mbps
347
+ ##### TE-Class 1: 155.520 Mbps
348
+ ##### TE-Class 2: 155.520 Mbps
349
+ ##### TE-Class 3: 155.520 Mbps
350
+ ##### TE-Class 4: 155.520 Mbps
351
+ ##### TE-Class 5: 155.520 Mbps
352
+ ##### TE-Class 6: 155.520 Mbps
353
+ ##### TE-Class 7: 155.520 Mbps
354
+ ##### Administrative Group subTLV (9), length: 4, 0x00000000
355
+ ##### 0200 0000 45c0 01b0 d0ff 0000 0159 7520
356
+ ##### c0a8 d067 e000 0005 0204 019c 0aff f531
357
+ ##### 0000 0000 2dde 0000 0000 0000 0000 0000
358
+ ##### 0000 0003 000a 2202 c0a8 a42f 0c01 0101
359
+ ##### 8000 0eba b7e3 0020 ffff fc00 0c01 0101
360
+ ##### 7c01 0001 000a 2201 0c01 0101 0c01 0101
361
+ ##### 8000 3313 0ed3 00e4 0000 0011 c0a8 d043
362
+ ##### c0a8 d044 0200 0001 c0a8 a42f c0a8 a42f
363
+ ##### 0200 0001 0c01 0101 ffff ffff 0300 0000
364
+ ##### 0aff f52f ffff ffff 0300 0000 7c01 0101
365
+ ##### 7c01 0002 0200 0001 7c01 0201 7c01 0003
366
+ ##### 0200 0001 0a01 0000 ffff 0000 0300 0001
367
+ ##### 0a01 0000 ffff 0000 0300 0001 0a02 0000
368
+ ##### ffff 0000 0300 0001 0a01 0000 ffff 0000
369
+ ##### 0300 0001 0a02 0000 ffff 0000 0300 0001
370
+ ##### 0aff f52e c0a8 d05b 0100 0001 c0a8 d05a
371
+ ##### ffff fffe 0300 0001 0aff f52e c0a8 d059
372
+ ##### 0100 0001 c0a8 d058 ffff fffe 0300 0001
373
+ ##### 0aff f52e c0a8 d057 0100 0001 c0a8 d056
374
+ ##### ffff fffe 0300 0001 0008 220a 0100 0005
375
+ ##### 0aff f52e 8000 001e d240 007c 0002 0064
376
+ ##### 0001 0001 0100 0000 0002 0004 0c01 0101
377
+ ##### 0003 0004 c0a8 d058 0004 0004 c0a8 d059
378
+ ##### 0005 0004 0000 0001 0006 0004 4b94 50c0
379
+ ##### 0007 0004 4b94 50c0 0008 0020 4b94 50c0
380
+ ##### 4b94 50c0 4b94 50c0 4b94 50c0 4b94 50c0
381
+ ##### 4b94 50c0 4b94 50c0 4b94 50c0 0009 0004
382
+ ##### 0000 0000
383
+
384
+ te_lsa_shex = %{
385
+ 0008 220a 0100 0005
386
+ 0aff f52e 8000 001e d240 007c 0002 0064
387
+ 0001 0001 0100 0000 0002 0004 0c01 0101
388
+ 0003 0004 c0a8 d058 0004 0004 c0a8 d059
389
+ 0005 0004 0000 0001 0006 0004 4b94 50c0
390
+ 0007 0004 4b94 50c0 0008 0020 4b94 50c0
391
+ 4b94 50c0 4b94 50c0 4b94 50c0 4b94 50c0
392
+ 4b94 50c0 4b94 50c0 4b94 50c0 0009 0004
393
+ 0000 0000
394
+ }.split.join
395
+
396
+ link_tlv = LinkTLV.new()
397
+ link_type = LinkTypeSubTLV.new({:link_type=>1})
398
+ link_id = LinkID_SubTLV.new({:link_id=>'12.1.1.1'})
399
+ local_if_addr = LocalInterfaceIP_Address_SubTLV.new({:local_interface_ip_address => '192.168.208.88', })
400
+ rmt_if_addr = RemoteInterfaceIP_Address_SubTLV.new({:remote_interface_ip_address => '192.168.208.89', })
401
+ te_metric = TE_MetricSubTLV.new({:te_metric => 1, })
402
+ max_bw = MaximumBandwidth_SubTLV.new({:max_bw => 155.52*1000000, })
403
+ max_resv_bw = MaximumReservableBandwidth_SubTLV.new({:max_resv_bw => 155.52*1000000, })
404
+ unresv_bw = UnreservedBandwidth_SubTLV.new({:unreserved_bw => [155.52*1000000]*8, })
405
+ color = Color_SubTLV.new({:color=>0})
406
+ link_tlv << link_type << link_id << local_if_addr << rmt_if_addr << te_metric << max_bw << max_resv_bw << unresv_bw << color
407
+ te_lsa = TrafficEngineeringLSA.new({:advr=>'10.255.245.46',:lsage=>8, :options => 0x22, :seqn=> 0x8000001e, :opaque_id => 5, }) # default to area lstype 10
408
+ te_lsa << link_tlv
409
+ assert_equal(te_lsa_shex, te_lsa.to_shex)
410
+ #puts te_lsa.to_s_junos_style
411
+ #puts te_lsa
412
+
413
+ end