bgp4r 0.0.12 → 0.0.13
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +21 -15
- data/bgp/common.rb +13 -12
- data/bgp/iana.rb +28 -205
- data/bgp/io.rb +0 -1
- data/bgp/messages/capability.rb +1 -1
- data/bgp/messages/message.rb +1 -1
- data/bgp/messages/open.rb +1 -1
- data/bgp/messages/route_refresh.rb +4 -7
- data/bgp/messages/update.rb +9 -6
- data/bgp/misc/live_feed.rb +1 -2
- data/bgp/neighbor/add_path_cap.rb +14 -13
- data/bgp/neighbor/neighbor.rb +30 -18
- data/bgp/nlris/inet.rb +9 -11
- data/bgp/nlris/label.rb +1 -1
- data/bgp/nlris/labeled.rb +31 -4
- data/bgp/nlris/nlri.rb +23 -183
- data/bgp/nlris/nsap.rb +101 -0
- data/bgp/nlris/prefix.rb +162 -24
- data/bgp/nlris/rd.rb +1 -1
- data/bgp/nlris/vpn.rb +23 -5
- data/bgp/optional_parameters/add_path.rb +11 -37
- data/bgp/optional_parameters/as4.rb +1 -1
- data/bgp/optional_parameters/capability.rb +1 -11
- data/bgp/optional_parameters/dynamic.rb +1 -1
- data/bgp/optional_parameters/graceful_restart.rb +35 -22
- data/bgp/optional_parameters/mbgp.rb +23 -37
- data/bgp/optional_parameters/orf.rb +1 -1
- data/bgp/optional_parameters/route_refresh.rb +1 -1
- data/bgp/orfs/prefix_orf.rb +3 -6
- data/bgp/path_attributes/aggregator.rb +1 -1
- data/bgp/path_attributes/as_path.rb +1 -1
- data/bgp/path_attributes/atomic_aggregate.rb +1 -1
- data/bgp/path_attributes/cluster_list.rb +1 -1
- data/bgp/path_attributes/communities.rb +1 -1
- data/bgp/path_attributes/extended_communities.rb +1 -1
- data/bgp/path_attributes/extended_community.rb +55 -26
- data/bgp/path_attributes/local_pref.rb +1 -1
- data/bgp/path_attributes/mp_reach.rb +178 -76
- data/bgp/path_attributes/mp_unreach.rb +11 -67
- data/bgp/path_attributes/multi_exit_disc.rb +1 -1
- data/bgp/path_attributes/next_hop.rb +1 -1
- data/bgp/path_attributes/origin.rb +1 -1
- data/bgp/path_attributes/originator_id.rb +1 -1
- data/bgp/path_attributes/path_attribute.rb +1 -1
- data/bgp4r.gemspec +130 -183
- data/examples/routegen +0 -1
- data/examples/test.rb +15 -0
- data/examples/test2.rb +116 -0
- data/examples/unit-testing/{malformed_update.rb → malformed_update_test.rb} +6 -6
- data/examples/unit-testing/{no_export.rb → no_export_test.rb} +6 -6
- data/examples/unit-testing/{prepend_aspath.rb → prepend_aspath_test.rb} +6 -6
- data/test/functional/add_path_test.rb +32 -0
- data/test/helpers/server.rb +11 -4
- data/test/{common_test.rb → unit/common_test.rb} +7 -10
- data/test/{iana_test.rb → unit/iana_test.rb} +7 -6
- data/test/{messages → unit/messages}/capability_test.rb +26 -9
- data/test/{messages → unit/messages}/route_refresh_test.rb +4 -4
- data/test/{messages → unit/messages}/update_test.rb +28 -17
- data/test/{neighbor → unit/neighbor}/add_path_cap_test.rb +41 -0
- data/test/{neighbor → unit/neighbor}/neighbor_test.rb +31 -13
- data/test/unit/nlris/labeled_test.rb +30 -0
- data/test/unit/nlris/nlri_test.rb +103 -0
- data/test/unit/nlris/nsap_test.rb +80 -0
- data/test/unit/nlris/prefix_test.rb +136 -0
- data/test/{optional_parameters → unit/optional_parameters}/capability_test.rb +0 -5
- data/test/unit/optional_parameters/graceful_restart_test.rb +41 -0
- data/test/{optional_parameters → unit/optional_parameters}/mbgp_test.rb +20 -0
- data/test/unit/path_attributes/aigp.rb +59 -0
- data/test/{path_attributes → unit/path_attributes}/extended_communities_test.rb +4 -0
- data/test/{path_attributes → unit/path_attributes}/extended_community_test.rb +9 -0
- data/test/unit/path_attributes/mp_reach_test.rb +563 -0
- data/test/{path_attributes → unit/path_attributes}/path_attribute_test.rb +1 -1
- metadata +128 -136
- data/examples/unit-testing/test.rb +0 -82
- data/examples/unit-testing/test1.rb +0 -82
- data/examples/unit-testing/test2.rb +0 -44
- data/test/nlris/ext_nlri_test.rb +0 -32
- data/test/nlris/nlri_test.rb +0 -130
- data/test/optional_parameters/graceful_restart_test.rb +0 -24
- data/test/path_attributes/mp_reach_test.rb +0 -305
- /data/examples/unit-testing/{unknown_transitive_attr.rb → unknown_transitive_attr_test.rb} +0 -0
- /data/test/{misc → functional}/live_feed_test.rb +0 -0
- /data/test/{messages → unit/messages}/keepalive_test.rb +0 -0
- /data/test/{messages → unit/messages}/markers_test.rb +0 -0
- /data/test/{messages → unit/messages}/message_test.rb +0 -0
- /data/test/{messages → unit/messages}/notification_test.rb +0 -0
- /data/test/{messages → unit/messages}/open_test.rb +0 -0
- /data/test/{nlris → unit/nlris}/inet_test.rb +0 -0
- /data/test/{nlris/labeled_test.rb → unit/nlris/label_test.rb} +0 -0
- /data/test/{nlris → unit/nlris}/rd_test.rb +0 -0
- /data/test/{optional_parameters → unit/optional_parameters}/add_path_test.rb +0 -0
- /data/test/{optional_parameters → unit/optional_parameters}/as4_test.rb +0 -0
- /data/test/{optional_parameters → unit/optional_parameters}/dynamic_test.rb +0 -0
- /data/test/{optional_parameters → unit/optional_parameters}/optional_parameter_test.rb +0 -0
- /data/test/{optional_parameters → unit/optional_parameters}/orf_test.rb +0 -0
- /data/test/{optional_parameters → unit/optional_parameters}/route_refresh_test.rb +0 -0
- /data/test/{orfs → unit/orfs}/prefix_orf_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/aggregator_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/as_path_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/atomic_aggregate_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/attribute_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/cluster_list_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/communities_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/local_pref_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/mp_unreach_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/multi_exit_disc_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/next_hop_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/origin_test.rb +0 -0
- /data/test/{path_attributes → unit/path_attributes}/originator_id_test.rb +0 -0
data/bgp/nlris/vpn.rb
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2011 Jean-Michel Esnault.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
# This file is part of BGP4R.
|
8
|
+
#
|
1
9
|
|
2
10
|
module BGP
|
3
11
|
class Vpn
|
@@ -29,16 +37,26 @@ module BGP
|
|
29
37
|
end
|
30
38
|
end
|
31
39
|
# len_included arg is used by labeled encode()
|
32
|
-
def encode_next_hop
|
40
|
+
def encode_next_hop(*args)
|
33
41
|
Rd.new.encode + @prefix.encode(false)
|
34
42
|
end
|
35
43
|
def encode(len_included=true)
|
36
44
|
if len_included
|
37
|
-
[bit_length, @rd.encode, @prefix.
|
45
|
+
[bit_length, @rd.encode, @prefix.encode_with_len_without_path_id].pack('Ca*a*')
|
38
46
|
else
|
39
|
-
@rd.encode + @prefix.
|
47
|
+
@rd.encode + @prefix.encode_without_len_without_path_id
|
40
48
|
end
|
41
49
|
end
|
50
|
+
def encode_without_len_without_path_id
|
51
|
+
encode(false)
|
52
|
+
end
|
53
|
+
def path_id
|
54
|
+
@prefix.path_id
|
55
|
+
rescue
|
56
|
+
end
|
57
|
+
def path_id=(val)
|
58
|
+
@prefix.path_id=val
|
59
|
+
end
|
42
60
|
def bit_length
|
43
61
|
@rd.bit_length + @prefix.mlen
|
44
62
|
end
|
@@ -55,14 +73,14 @@ module BGP
|
|
55
73
|
nbits = s.slice!(0,1).unpack('C')[0]
|
56
74
|
rd,vpn = s.slice!(0,(7+nbits)/8).unpack("a8a*")
|
57
75
|
@rd = Rd.new(rd.is_packed)
|
58
|
-
@prefix= Prefix.
|
76
|
+
@prefix= Prefix.new_ntop([nbits-64,vpn].pack('Ca*'), afi)
|
59
77
|
end
|
60
78
|
def nexthop
|
61
79
|
@prefix.nexthop
|
62
80
|
end
|
63
81
|
def to_s
|
64
82
|
#Label Stack=5806 (bottom) RD=3215:317720610, IPv4=10.45.142.64/32
|
65
|
-
"#{@rd.to_s(false)}, #{@prefix.
|
83
|
+
"#{@rd.to_s(false)}, #{@prefix.to_s_with_afi}"
|
66
84
|
end
|
67
85
|
end
|
68
86
|
end
|
@@ -24,19 +24,6 @@ require 'bgp/optional_parameters/capability'
|
|
24
24
|
|
25
25
|
module BGP::OPT_PARM::CAP
|
26
26
|
|
27
|
-
#
|
28
|
-
# Belongs to Neighbor this is a session attribute....
|
29
|
-
# def include_path_id?(speeker, peer, sr, afi, safi)
|
30
|
-
# # when sending afi, safi, speaker agrees to send and peer to receive
|
31
|
-
# # when receiving afi, safi, speaker agrees to recv and peer agress to send
|
32
|
-
# case sr
|
33
|
-
# when :recv
|
34
|
-
# speeker.has?(:recv, afi, safi) && peer.has?(:send, afi, safi)
|
35
|
-
# when :send
|
36
|
-
# speeker.has?(:send, afi, safi) && peer.has?(:recv, afi, safi)
|
37
|
-
# end
|
38
|
-
# end
|
39
|
-
|
40
27
|
class Add_path < BGP::OPT_PARM::Capability
|
41
28
|
|
42
29
|
class << self
|
@@ -60,9 +47,9 @@ module BGP::OPT_PARM::CAP
|
|
60
47
|
raise
|
61
48
|
end
|
62
49
|
end
|
63
|
-
|
64
|
-
def add(sr,
|
65
|
-
@af[[_afi
|
50
|
+
|
51
|
+
def add(sr, _afi,_safi)
|
52
|
+
@af[[afi(_afi), safi(_safi)]] = _send_recv(sr)
|
66
53
|
end
|
67
54
|
|
68
55
|
def parse(s)
|
@@ -111,7 +98,7 @@ module BGP::OPT_PARM::CAP
|
|
111
98
|
|
112
99
|
def address_family_to_s(af, sr)
|
113
100
|
afi, safi = af
|
114
|
-
"AFI #{IANA.afi(afi)} (#{afi}), SAFI #{IANA.safi(safi)} (#{safi}), #{send_recv_to_s(sr)}"
|
101
|
+
"AFI #{IANA.afi?(afi)} (#{afi}), SAFI #{IANA.safi?(safi)} (#{safi}), #{send_recv_to_s(sr)}"
|
115
102
|
end
|
116
103
|
|
117
104
|
def _send_recv(val)
|
@@ -133,28 +120,15 @@ module BGP::OPT_PARM::CAP
|
|
133
120
|
'bogus'
|
134
121
|
end
|
135
122
|
end
|
136
|
-
|
137
|
-
def
|
138
|
-
|
139
|
-
val
|
140
|
-
elsif val == :ipv4
|
141
|
-
1
|
142
|
-
elsif val == :ipv6
|
143
|
-
2
|
144
|
-
end
|
123
|
+
|
124
|
+
def afi(arg)
|
125
|
+
IANA.afi(arg)
|
145
126
|
end
|
146
|
-
|
147
|
-
|
148
|
-
if val.is_a?(Fixnum)
|
149
|
-
val
|
150
|
-
elsif val == :unicast
|
151
|
-
1
|
152
|
-
elsif val == :multicast
|
153
|
-
2
|
154
|
-
end
|
127
|
+
def safi(arg)
|
128
|
+
IANA.safi(arg)
|
155
129
|
end
|
156
|
-
|
130
|
+
|
157
131
|
end
|
158
132
|
end
|
159
133
|
|
160
|
-
load "../../test/optional_parameters/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|
134
|
+
load "../../test/unit/optional_parameters/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|
@@ -80,14 +80,6 @@ module BGP::OPT_PARM
|
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
|
-
def method_missing()
|
84
|
-
if name == :to_s_brief
|
85
|
-
"#{self.class.to_s.split('::').last}"
|
86
|
-
else
|
87
|
-
super
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
83
|
end
|
92
84
|
end
|
93
85
|
|
@@ -98,8 +90,6 @@ module BGP
|
|
98
90
|
end
|
99
91
|
end
|
100
92
|
|
101
|
-
# require 'bgp4r'
|
102
|
-
|
103
93
|
module BGP::OPT_PARM
|
104
94
|
def Capability.factory(s)
|
105
95
|
code = s.slice(2,1).unpack('C')[0]
|
@@ -148,4 +138,4 @@ module BGP::OPT_PARM
|
|
148
138
|
end
|
149
139
|
end
|
150
140
|
|
151
|
-
load "../../test/optional_parameters/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|
141
|
+
load "../../test/unit/optional_parameters/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|
@@ -34,4 +34,4 @@ class Dynamic < BGP::OPT_PARM::Capability
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
load "../../test/optional_parameters/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|
37
|
+
load "../../test/unit/optional_parameters/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|
@@ -36,8 +36,8 @@ class Graceful_restart < BGP::OPT_PARM::Capability
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
def add(afi,safi,
|
40
|
-
@tuples << [_afi(afi), _safi(safi),
|
39
|
+
def add(afi,safi,af_flags=0)
|
40
|
+
@tuples << [_afi(afi), _safi(safi), af_flags]
|
41
41
|
end
|
42
42
|
|
43
43
|
def parse(s)
|
@@ -59,16 +59,40 @@ class Graceful_restart < BGP::OPT_PARM::Capability
|
|
59
59
|
end
|
60
60
|
def to_s
|
61
61
|
s = []
|
62
|
-
s << "\n Graceful Restart Extension (#{CAP_GR}), length:
|
62
|
+
s << "\n Graceful Restart Extension (#{CAP_GR}), length: #{encode.size}"
|
63
63
|
s << " Restart Flags: #{restart_flag}, Restart Time #{@restart_time}s"
|
64
64
|
s = s.join("\n ")
|
65
65
|
super + (s + (['']+@tuples.collect { |af| address_family(*af)}).join("\n "))
|
66
66
|
end
|
67
67
|
|
68
|
+
def method_missing(name, *args, &block)
|
69
|
+
if name.to_s =~ /^(.+)_forwarding_state_(.+)/
|
70
|
+
state = $2
|
71
|
+
afi_safi = $1
|
72
|
+
afi, *safi = afi_safi.to_s.split('_')
|
73
|
+
_afi = IANA.afi?(afi.to_sym)
|
74
|
+
_safi = IANA.safi?((safi.join('_')).to_sym)
|
75
|
+
if state == 'preserved'
|
76
|
+
_state = 0x80
|
77
|
+
elsif state == 'not_preserved'
|
78
|
+
_state = 0
|
79
|
+
else
|
80
|
+
super
|
81
|
+
end
|
82
|
+
if _afi and _safi
|
83
|
+
add _afi,_safi, _state
|
84
|
+
else
|
85
|
+
super
|
86
|
+
end
|
87
|
+
else
|
88
|
+
super
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
68
92
|
private
|
69
93
|
|
70
94
|
def address_family(afi, safi, flags)
|
71
|
-
"AFI #{IANA.afi(afi)} (#{afi}), SAFI #{IANA.safi(safi)} (#{safi}), #{address_family_flags(flags)}"
|
95
|
+
"AFI #{IANA.afi?(afi)} (#{afi}), SAFI #{IANA.safi?(safi)} (#{safi}), #{address_family_flags(flags)}"
|
72
96
|
end
|
73
97
|
|
74
98
|
def restart_flag
|
@@ -80,37 +104,26 @@ class Graceful_restart < BGP::OPT_PARM::Capability
|
|
80
104
|
end
|
81
105
|
|
82
106
|
def address_family_flags(flags)
|
83
|
-
if flags &
|
107
|
+
if flags & 0x80 == 0
|
84
108
|
"Forwarding state not preserved (0x#{flags.to_s(16)})"
|
85
|
-
elsif flags &
|
109
|
+
elsif flags & 0x80 == 0x80
|
86
110
|
"Forwarding state preserved (0x#{flags.to_s(16)})"
|
111
|
+
else
|
112
|
+
"Flags (0x#{flags.to_s(16)}"
|
87
113
|
end
|
88
114
|
end
|
89
115
|
|
90
116
|
def _afi(val)
|
91
|
-
|
92
|
-
val
|
93
|
-
elsif val == :ipv4
|
94
|
-
1
|
95
|
-
elsif val == :ipv6
|
96
|
-
2
|
97
|
-
end
|
117
|
+
IANA.afi(val)
|
98
118
|
end
|
99
119
|
|
100
120
|
def _safi(val)
|
101
|
-
|
102
|
-
val
|
103
|
-
elsif val == :unicast
|
104
|
-
1
|
105
|
-
elsif val == :multicast
|
106
|
-
2
|
107
|
-
end
|
121
|
+
IANA.safi(val)
|
108
122
|
end
|
109
123
|
|
110
|
-
|
111
124
|
end
|
112
125
|
end
|
113
126
|
|
114
|
-
load "../../test/optional_parameters/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|
127
|
+
load "../../test/unit/optional_parameters/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|
115
128
|
|
116
129
|
|
@@ -25,21 +25,18 @@ require 'bgp/optional_parameters/capability'
|
|
25
25
|
module BGP::OPT_PARM::CAP
|
26
26
|
|
27
27
|
class Mbgp < BGP::OPT_PARM::Capability
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
def self.ipv6_multicast
|
42
|
-
Mbgp.new(2,2)
|
28
|
+
|
29
|
+
class << self
|
30
|
+
def method_missing(name, *args, &block)
|
31
|
+
afi, *safi = name.to_s.split('_')
|
32
|
+
_afi = IANA.afi?(afi.to_sym)
|
33
|
+
_safi = IANA.safi?((safi.join('_')).to_sym)
|
34
|
+
if _afi and _safi
|
35
|
+
new _afi,_safi
|
36
|
+
else
|
37
|
+
super
|
38
|
+
end
|
39
|
+
end
|
43
40
|
end
|
44
41
|
|
45
42
|
def initialize(afi,safi=nil)
|
@@ -50,27 +47,16 @@ module BGP::OPT_PARM::CAP
|
|
50
47
|
self.safi, self.afi = safi, afi
|
51
48
|
end
|
52
49
|
end
|
53
|
-
|
54
|
-
def afi=(
|
55
|
-
@afi =
|
56
|
-
val
|
57
|
-
elsif val == :ipv4
|
58
|
-
1
|
59
|
-
elsif val == :ipv6
|
60
|
-
2
|
61
|
-
end
|
50
|
+
|
51
|
+
def afi=(arg)
|
52
|
+
@afi = IANA.afi(arg)
|
62
53
|
end
|
63
|
-
|
64
|
-
|
65
|
-
@safi = if val.is_a?(Fixnum)
|
66
|
-
val
|
67
|
-
elsif val == :unicast
|
68
|
-
1
|
69
|
-
elsif val == :multicast
|
70
|
-
2
|
71
|
-
end
|
54
|
+
def safi=(arg)
|
55
|
+
@safi = IANA.safi(arg)
|
72
56
|
end
|
73
|
-
|
57
|
+
|
58
|
+
attr_reader :afi, :safi
|
59
|
+
|
74
60
|
def encode
|
75
61
|
super([@afi,0,@safi].pack('nCC'))
|
76
62
|
end
|
@@ -81,11 +67,11 @@ module BGP::OPT_PARM::CAP
|
|
81
67
|
|
82
68
|
def to_s
|
83
69
|
super + "\n Multiprotocol Extensions (#{CAP_MBGP}), length: 4" +
|
84
|
-
"\n AFI #{IANA.afi(@afi)} (#{@afi}), SAFI #{IANA.safi(@safi)} (#{@safi})"
|
70
|
+
"\n AFI #{IANA.afi?(@afi)} (#{@afi}), SAFI #{IANA.safi?(@safi)} (#{@safi})"
|
85
71
|
end
|
86
72
|
|
87
73
|
def to_s_brief
|
88
|
-
"MBGP #{IANA.afi(@afi)}, #{IANA.safi(@safi)}"
|
74
|
+
"MBGP #{IANA.afi?(@afi)}, #{IANA.safi?(@safi)}"
|
89
75
|
end
|
90
76
|
|
91
77
|
def to_hash
|
@@ -94,4 +80,4 @@ module BGP::OPT_PARM::CAP
|
|
94
80
|
end
|
95
81
|
end
|
96
82
|
|
97
|
-
load "../../test/optional_parameters/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|
83
|
+
load "../../test/unit/optional_parameters/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|
data/bgp/orfs/prefix_orf.rb
CHANGED
@@ -120,18 +120,15 @@ module BGP
|
|
120
120
|
end
|
121
121
|
|
122
122
|
def size
|
123
|
-
@prefix.
|
123
|
+
@prefix.nbytes+7+1
|
124
124
|
end
|
125
125
|
|
126
126
|
def _parse_(s, afi=1)
|
127
|
-
#puts "s before parse: #{s.unpack('H*')}"
|
128
127
|
o1, @seqn, @min, @max, prefix = s.unpack('CNCCa*')
|
129
128
|
@action = o1 >> 6
|
130
129
|
@match = (o1 >> 5) & 1
|
131
|
-
@prefix = BGP::Prefix.
|
132
|
-
#puts "size of orf entry is : #{size}"
|
130
|
+
@prefix = BGP::Prefix.new_ntop(prefix.is_packed, afi)
|
133
131
|
s.slice!(0,size)
|
134
|
-
#puts "s after parse: #{s.unpack('H*')}"
|
135
132
|
end
|
136
133
|
|
137
134
|
def self.add(*args) ; Prefix_entry.new(0,*args) ; end
|
@@ -178,7 +175,7 @@ class BGP::Prefix_orf < BGP::Orf
|
|
178
175
|
|
179
176
|
end
|
180
177
|
|
181
|
-
load "../../test/orfs/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|
178
|
+
load "../../test/unit/orfs/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
|
182
179
|
|
183
180
|
__END__
|
184
181
|
|
@@ -30,6 +30,7 @@ module BGP
|
|
30
30
|
|
31
31
|
ROUTE_TARGET = 2
|
32
32
|
ROUTE_ORIGIN = 3
|
33
|
+
LINK_BANDWIDTH = 4
|
33
34
|
OSPF_DOMAIN_ID = 5
|
34
35
|
OSPF_ROUTER_ID = 7
|
35
36
|
BGP_DATA_COLLECT = 8
|
@@ -40,19 +41,7 @@ module BGP
|
|
40
41
|
TWO_OCTET_AS = 0
|
41
42
|
IPV4_ADDR = 1
|
42
43
|
OPAQUE = 3
|
43
|
-
|
44
|
-
def _encoded_value_
|
45
|
-
case @type & 3
|
46
|
-
when TWO_OCTET_AS
|
47
|
-
[@global, @local].pack('nN')
|
48
|
-
when IPV4_ADDR
|
49
|
-
[@global, @local].pack('Nn')
|
50
|
-
when OPAQUE
|
51
|
-
[@global].pack('H12')
|
52
|
-
else
|
53
|
-
raise RuntimeError, "bogus type: #{@type}"
|
54
|
-
end
|
55
|
-
end
|
44
|
+
FLOAT = -1
|
56
45
|
|
57
46
|
def encode
|
58
47
|
[@type, @subtype, _encoded_value_].pack('CCa6')
|
@@ -60,12 +49,14 @@ module BGP
|
|
60
49
|
|
61
50
|
def parse(s)
|
62
51
|
@type, @subtype = s.slice!(0,2).unpack('CC')
|
63
|
-
case
|
52
|
+
case community_structure
|
64
53
|
when TWO_OCTET_AS ; @global, @local = s.unpack('nN')
|
65
54
|
when IPV4_ADDR
|
66
55
|
@global, @local = s.unpack('Nn')
|
67
56
|
when OPAQUE
|
68
57
|
@global = s.unpack('H12')
|
58
|
+
when FLOAT
|
59
|
+
_, @global = s.unpack('ng')
|
69
60
|
end
|
70
61
|
end
|
71
62
|
|
@@ -121,6 +112,44 @@ module BGP
|
|
121
112
|
def name
|
122
113
|
self.class.to_s.split('::').last.gsub('_',' ')
|
123
114
|
end
|
115
|
+
|
116
|
+
def to_s
|
117
|
+
case community_structure
|
118
|
+
when TWO_OCTET_AS
|
119
|
+
"#{name}: #{@global}:#{@local}"
|
120
|
+
when IPV4_ADDR
|
121
|
+
"#{name}: #{IPAddr.create(@global)}:#{@local}"
|
122
|
+
when OPAQUE
|
123
|
+
"#{name}: #{@global}"
|
124
|
+
when FLOAT
|
125
|
+
"#{name}: #{[@global].pack('g').unpack('g')[0]}"
|
126
|
+
else
|
127
|
+
raise RuntimeError, "bogus type: #{@type}"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
private
|
132
|
+
|
133
|
+
def community_structure
|
134
|
+
cs = @type & 3
|
135
|
+
cs = FLOAT if cs == TWO_OCTET_AS and @subtype == LINK_BANDWIDTH
|
136
|
+
return cs
|
137
|
+
end
|
138
|
+
|
139
|
+
def _encoded_value_
|
140
|
+
case community_structure
|
141
|
+
when TWO_OCTET_AS
|
142
|
+
[@global, @local].pack('nN')
|
143
|
+
when IPV4_ADDR
|
144
|
+
[@global, @local].pack('Nn')
|
145
|
+
when OPAQUE
|
146
|
+
[@global].pack('H12')
|
147
|
+
when FLOAT
|
148
|
+
[0,@global].pack('ng')
|
149
|
+
else
|
150
|
+
raise RuntimeError, "bogus type: #{@type}"
|
151
|
+
end
|
152
|
+
end
|
124
153
|
|
125
154
|
end
|
126
155
|
|
@@ -142,6 +171,7 @@ module BGP
|
|
142
171
|
when OSPF_DOMAIN_ID ; Ospf_domain_id.new(s)
|
143
172
|
when OSPF_ROUTER_ID ; Ospf_router_id.new(s)
|
144
173
|
when BGP_DATA_COLLECT ; Bgp_data_collect.new(s)
|
174
|
+
when LINK_BANDWIDTH ; Link_bandwidth.new(s)
|
145
175
|
else
|
146
176
|
puts "too bad type #{type}, subtype #{subtype} : #{s.unpack('H*')}"
|
147
177
|
Extended_community.new(s)
|
@@ -173,18 +203,6 @@ module BGP
|
|
173
203
|
end
|
174
204
|
end
|
175
205
|
|
176
|
-
def to_s
|
177
|
-
case @type & 3
|
178
|
-
when TWO_OCTET_AS
|
179
|
-
"#{name}: #{@global}:#{@local}"
|
180
|
-
when IPV4_ADDR
|
181
|
-
"#{name}: #{IPAddr.create(@global)}:#{@local}"
|
182
|
-
when OPAQUE
|
183
|
-
"#{name}: #{@global}"
|
184
|
-
else
|
185
|
-
raise RuntimeError, "bogus type: #{@type}"
|
186
|
-
end
|
187
|
-
end
|
188
206
|
|
189
207
|
end
|
190
208
|
|
@@ -250,5 +268,16 @@ module BGP
|
|
250
268
|
end
|
251
269
|
end
|
252
270
|
end
|
271
|
+
|
272
|
+
class Link_bandwidth < Extended_community
|
273
|
+
def initialize(*args)
|
274
|
+
if args[0].is_a?(String) and args[0].is_packed?
|
275
|
+
super(*args)
|
276
|
+
else
|
277
|
+
args += [0]
|
278
|
+
super(NON_TRANSITIVE | TWO_OCTET_AS, LINK_BANDWIDTH, *args)
|
279
|
+
end
|
280
|
+
end
|
281
|
+
end
|
253
282
|
|
254
283
|
end
|