ospfv2 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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"
|