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.
- checksums.yaml +7 -0
- data/COPYING +674 -0
- data/LICENSE.txt +53 -0
- data/README +50 -0
- data/bin/ospfv2 +112 -105
- data/changelog.txt +7 -0
- data/gemspec +17 -0
- data/lib/ie/external_route.rb +9 -0
- data/lib/ie/id.rb +3 -4
- data/lib/ie/ie.rb +12 -0
- data/lib/ie/ls_age.rb +35 -5
- data/lib/ie/ls_type.rb +40 -37
- data/lib/ie/opaque_id.rb +46 -0
- data/lib/ie/opaque_type.rb +96 -0
- data/lib/ie/options.rb +5 -3
- data/lib/ie/router_link.rb +30 -7
- data/lib/ie/router_link_type.rb +116 -27
- data/lib/ie/sequence_number.rb +7 -3
- data/lib/infra/ospf_common.rb +1 -12
- data/lib/infra/ospf_io.rb +14 -8
- data/lib/infra/ospf_socket.rb +14 -14
- data/lib/infra/parse_options.rb +69 -25
- data/lib/ls_db/advertised_routers.rb +1 -1
- data/lib/ls_db/link_state_database.rb +74 -39
- data/lib/ls_db/link_state_database_build.rb +3 -3
- data/lib/ls_db/link_state_database_links.rb +7 -2
- data/lib/ls_db/lsdb_ios.rb +59 -0
- data/lib/lsa/external.rb +35 -2
- data/lib/lsa/lsa.rb +128 -35
- data/lib/lsa/lsa_factory.rb +20 -7
- data/lib/lsa/network.rb +44 -9
- data/lib/lsa/router.rb +14 -2
- data/lib/lsa/summary.rb +16 -3
- data/lib/lsa/tlv/color.rb +47 -0
- data/lib/lsa/tlv/link.rb +122 -0
- data/lib/lsa/tlv/link_id.rb +55 -0
- data/lib/lsa/tlv/link_type.rb +44 -0
- data/lib/lsa/tlv/local_interface.rb +56 -0
- data/lib/lsa/tlv/maximum_bandwidth.rb +55 -0
- data/lib/lsa/tlv/maximum_reservable_bandwidth.rb +52 -0
- data/lib/lsa/tlv/remote_interface.rb +58 -0
- data/lib/lsa/tlv/router_address.rb +57 -0
- data/lib/lsa/tlv/tlv.rb +32 -0
- data/lib/lsa/tlv/tlv_factory.rb +72 -0
- data/lib/lsa/tlv/traffic_engineering_metric.rb +52 -0
- data/lib/lsa/tlv/unreserved_bandwidth.rb +55 -0
- data/lib/lsa/traffic_engineering.rb +95 -0
- data/lib/neighbor/neighbor.rb +9 -9
- data/lib/packet/link_state_update.rb +16 -14
- data/lib/packet/ospf_packet.rb +13 -9
- data/test/unit/ie/au_type_test.rb +18 -0
- data/test/unit/ie/external_route_test.rb +51 -0
- data/test/unit/ie/id_test.rb +22 -0
- data/test/unit/ie/interface_mtu_test.rb +23 -0
- data/test/unit/ie/ls_age_test.rb +46 -0
- data/test/unit/ie/ls_type_test.rb +41 -0
- data/test/unit/ie/metric_test.rb +24 -0
- data/test/unit/ie/mt_metric_test.rb +27 -0
- data/test/unit/ie/opaque_id_test.rb +22 -0
- data/test/unit/ie/opaque_type_test.rb +22 -0
- data/test/unit/ie/options_test.rb +142 -0
- data/test/unit/ie/ospf_version_test.rb +0 -0
- data/test/unit/ie/packet_type_test.rb +33 -0
- data/test/unit/ie/router_link_factory_test.rb +26 -0
- data/test/unit/ie/router_link_test.rb +276 -0
- data/test/unit/ie/router_link_type_test.rb +24 -0
- data/test/unit/ie/sequence_number_test.rb +31 -0
- data/test/unit/ie/tos_metric_test.rb +27 -0
- data/test/unit/infra/ospf_common_test.rb +42 -0
- data/test/unit/infra/parse_options_test.rb +58 -0
- data/test/unit/infra/timer_test.rb +94 -0
- data/test/unit/ls_db/all +10 -0
- data/test/unit/ls_db/link_state_database_build_test.rb +140 -0
- data/test/unit/ls_db/link_state_database_links_tests.rb +74 -0
- data/test/unit/ls_db/link_state_database_test.rb +444 -0
- data/test/unit/ls_db/links_test.rb +49 -0
- data/test/unit/lsa/all +10 -0
- data/test/unit/lsa/external_test.rb +218 -0
- data/test/unit/lsa/lsa_factory_test.rb +314 -0
- data/test/unit/lsa/lsa_test.rb +191 -0
- data/test/unit/lsa/network_test.rb +107 -0
- data/test/unit/lsa/router_test.rb +614 -0
- data/test/unit/lsa/summary_test.rb +135 -0
- data/test/unit/lsa/tlv/color_test.rb +39 -0
- data/test/unit/lsa/tlv/link_id_test.rb +14 -0
- data/test/unit/lsa/tlv/link_test.rb +413 -0
- data/test/unit/lsa/tlv/link_type_test.rb +16 -0
- data/test/unit/lsa/tlv/local_interface_test.rb +15 -0
- data/test/unit/lsa/tlv/maximum_bandwidth_test.rb +14 -0
- data/test/unit/lsa/tlv/maximum_reservable_bandwidth_test.rb +13 -0
- data/test/unit/lsa/tlv/remote_interface_test.rb +14 -0
- data/test/unit/lsa/tlv/router_address_test.rb +16 -0
- data/test/unit/lsa/tlv/tlv_factory_test.rb +89 -0
- data/test/unit/lsa/tlv/traffic_engineering_metric_test.rb +15 -0
- data/test/unit/lsa/traffic_engineering_test.rb +65 -0
- data/test/unit/neighbor/neighbor_test.rb +82 -0
- data/test/unit/packet/all +10 -0
- data/test/unit/packet/database_description_test.rb +114 -0
- data/test/unit/packet/hello_test.rb +107 -0
- data/test/unit/packet/link_state_ack_test.rb +64 -0
- data/test/unit/packet/link_state_request_test.rb +168 -0
- data/test/unit/packet/link_state_update_test.rb +62 -0
- data/test/unit/packet/ospf_packet_test.rb +91 -0
- metadata +106 -51
- data/lib/infra/to_s.rb +0 -38
- data/lib/lsa/lsa_base.rb +0 -430
- 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"
|