bgp4r 0.0.12 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. data/README.rdoc +21 -15
  2. data/bgp/common.rb +13 -12
  3. data/bgp/iana.rb +28 -205
  4. data/bgp/io.rb +0 -1
  5. data/bgp/messages/capability.rb +1 -1
  6. data/bgp/messages/message.rb +1 -1
  7. data/bgp/messages/open.rb +1 -1
  8. data/bgp/messages/route_refresh.rb +4 -7
  9. data/bgp/messages/update.rb +9 -6
  10. data/bgp/misc/live_feed.rb +1 -2
  11. data/bgp/neighbor/add_path_cap.rb +14 -13
  12. data/bgp/neighbor/neighbor.rb +30 -18
  13. data/bgp/nlris/inet.rb +9 -11
  14. data/bgp/nlris/label.rb +1 -1
  15. data/bgp/nlris/labeled.rb +31 -4
  16. data/bgp/nlris/nlri.rb +23 -183
  17. data/bgp/nlris/nsap.rb +101 -0
  18. data/bgp/nlris/prefix.rb +162 -24
  19. data/bgp/nlris/rd.rb +1 -1
  20. data/bgp/nlris/vpn.rb +23 -5
  21. data/bgp/optional_parameters/add_path.rb +11 -37
  22. data/bgp/optional_parameters/as4.rb +1 -1
  23. data/bgp/optional_parameters/capability.rb +1 -11
  24. data/bgp/optional_parameters/dynamic.rb +1 -1
  25. data/bgp/optional_parameters/graceful_restart.rb +35 -22
  26. data/bgp/optional_parameters/mbgp.rb +23 -37
  27. data/bgp/optional_parameters/orf.rb +1 -1
  28. data/bgp/optional_parameters/route_refresh.rb +1 -1
  29. data/bgp/orfs/prefix_orf.rb +3 -6
  30. data/bgp/path_attributes/aggregator.rb +1 -1
  31. data/bgp/path_attributes/as_path.rb +1 -1
  32. data/bgp/path_attributes/atomic_aggregate.rb +1 -1
  33. data/bgp/path_attributes/cluster_list.rb +1 -1
  34. data/bgp/path_attributes/communities.rb +1 -1
  35. data/bgp/path_attributes/extended_communities.rb +1 -1
  36. data/bgp/path_attributes/extended_community.rb +55 -26
  37. data/bgp/path_attributes/local_pref.rb +1 -1
  38. data/bgp/path_attributes/mp_reach.rb +178 -76
  39. data/bgp/path_attributes/mp_unreach.rb +11 -67
  40. data/bgp/path_attributes/multi_exit_disc.rb +1 -1
  41. data/bgp/path_attributes/next_hop.rb +1 -1
  42. data/bgp/path_attributes/origin.rb +1 -1
  43. data/bgp/path_attributes/originator_id.rb +1 -1
  44. data/bgp/path_attributes/path_attribute.rb +1 -1
  45. data/bgp4r.gemspec +130 -183
  46. data/examples/routegen +0 -1
  47. data/examples/test.rb +15 -0
  48. data/examples/test2.rb +116 -0
  49. data/examples/unit-testing/{malformed_update.rb → malformed_update_test.rb} +6 -6
  50. data/examples/unit-testing/{no_export.rb → no_export_test.rb} +6 -6
  51. data/examples/unit-testing/{prepend_aspath.rb → prepend_aspath_test.rb} +6 -6
  52. data/test/functional/add_path_test.rb +32 -0
  53. data/test/helpers/server.rb +11 -4
  54. data/test/{common_test.rb → unit/common_test.rb} +7 -10
  55. data/test/{iana_test.rb → unit/iana_test.rb} +7 -6
  56. data/test/{messages → unit/messages}/capability_test.rb +26 -9
  57. data/test/{messages → unit/messages}/route_refresh_test.rb +4 -4
  58. data/test/{messages → unit/messages}/update_test.rb +28 -17
  59. data/test/{neighbor → unit/neighbor}/add_path_cap_test.rb +41 -0
  60. data/test/{neighbor → unit/neighbor}/neighbor_test.rb +31 -13
  61. data/test/unit/nlris/labeled_test.rb +30 -0
  62. data/test/unit/nlris/nlri_test.rb +103 -0
  63. data/test/unit/nlris/nsap_test.rb +80 -0
  64. data/test/unit/nlris/prefix_test.rb +136 -0
  65. data/test/{optional_parameters → unit/optional_parameters}/capability_test.rb +0 -5
  66. data/test/unit/optional_parameters/graceful_restart_test.rb +41 -0
  67. data/test/{optional_parameters → unit/optional_parameters}/mbgp_test.rb +20 -0
  68. data/test/unit/path_attributes/aigp.rb +59 -0
  69. data/test/{path_attributes → unit/path_attributes}/extended_communities_test.rb +4 -0
  70. data/test/{path_attributes → unit/path_attributes}/extended_community_test.rb +9 -0
  71. data/test/unit/path_attributes/mp_reach_test.rb +563 -0
  72. data/test/{path_attributes → unit/path_attributes}/path_attribute_test.rb +1 -1
  73. metadata +128 -136
  74. data/examples/unit-testing/test.rb +0 -82
  75. data/examples/unit-testing/test1.rb +0 -82
  76. data/examples/unit-testing/test2.rb +0 -44
  77. data/test/nlris/ext_nlri_test.rb +0 -32
  78. data/test/nlris/nlri_test.rb +0 -130
  79. data/test/optional_parameters/graceful_restart_test.rb +0 -24
  80. data/test/path_attributes/mp_reach_test.rb +0 -305
  81. /data/examples/unit-testing/{unknown_transitive_attr.rb → unknown_transitive_attr_test.rb} +0 -0
  82. /data/test/{misc → functional}/live_feed_test.rb +0 -0
  83. /data/test/{messages → unit/messages}/keepalive_test.rb +0 -0
  84. /data/test/{messages → unit/messages}/markers_test.rb +0 -0
  85. /data/test/{messages → unit/messages}/message_test.rb +0 -0
  86. /data/test/{messages → unit/messages}/notification_test.rb +0 -0
  87. /data/test/{messages → unit/messages}/open_test.rb +0 -0
  88. /data/test/{nlris → unit/nlris}/inet_test.rb +0 -0
  89. /data/test/{nlris/labeled_test.rb → unit/nlris/label_test.rb} +0 -0
  90. /data/test/{nlris → unit/nlris}/rd_test.rb +0 -0
  91. /data/test/{optional_parameters → unit/optional_parameters}/add_path_test.rb +0 -0
  92. /data/test/{optional_parameters → unit/optional_parameters}/as4_test.rb +0 -0
  93. /data/test/{optional_parameters → unit/optional_parameters}/dynamic_test.rb +0 -0
  94. /data/test/{optional_parameters → unit/optional_parameters}/optional_parameter_test.rb +0 -0
  95. /data/test/{optional_parameters → unit/optional_parameters}/orf_test.rb +0 -0
  96. /data/test/{optional_parameters → unit/optional_parameters}/route_refresh_test.rb +0 -0
  97. /data/test/{orfs → unit/orfs}/prefix_orf_test.rb +0 -0
  98. /data/test/{path_attributes → unit/path_attributes}/aggregator_test.rb +0 -0
  99. /data/test/{path_attributes → unit/path_attributes}/as_path_test.rb +0 -0
  100. /data/test/{path_attributes → unit/path_attributes}/atomic_aggregate_test.rb +0 -0
  101. /data/test/{path_attributes → unit/path_attributes}/attribute_test.rb +0 -0
  102. /data/test/{path_attributes → unit/path_attributes}/cluster_list_test.rb +0 -0
  103. /data/test/{path_attributes → unit/path_attributes}/communities_test.rb +0 -0
  104. /data/test/{path_attributes → unit/path_attributes}/local_pref_test.rb +0 -0
  105. /data/test/{path_attributes → unit/path_attributes}/mp_unreach_test.rb +0 -0
  106. /data/test/{path_attributes → unit/path_attributes}/multi_exit_disc_test.rb +0 -0
  107. /data/test/{path_attributes → unit/path_attributes}/next_hop_test.rb +0 -0
  108. /data/test/{path_attributes → unit/path_attributes}/origin_test.rb +0 -0
  109. /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.encode(false)].pack('Ca*a*')
45
+ [bit_length, @rd.encode, @prefix.encode_with_len_without_path_id].pack('Ca*a*')
38
46
  else
39
- @rd.encode + @prefix.encode(false)
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.new([nbits-64,vpn].pack('Ca*'), afi)
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.ipv4? ? 'IPv4' : 'IPv6'}=#{@prefix.to_s}"
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, afi,safi)
65
- @af[[_afi(afi), _safi(safi)]] = _send_recv(sr)
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 _afi(val)
138
- if val.is_a?(Fixnum)
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
- def _safi(val)
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
@@ -56,4 +56,4 @@ end
56
56
  end
57
57
  end
58
58
 
59
- load "../../test/optional_parameters/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
59
+ 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,flags)
40
- @tuples << [_afi(afi), _safi(safi), flags]
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: 4"
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 & 1 == 0
107
+ if flags & 0x80 == 0
84
108
  "Forwarding state not preserved (0x#{flags.to_s(16)})"
85
- elsif flags & 1 == 1
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
- if val.is_a?(Fixnum)
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
- if val.is_a?(Fixnum)
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
- def self.ipv4_unicast
30
- Mbgp.new(1,1)
31
- end
32
-
33
- def self.ipv4_multicast
34
- Mbgp.new(1,2)
35
- end
36
-
37
- def self.ipv6_unicast
38
- Mbgp.new(2,2)
39
- end
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=(val)
55
- @afi = if val.is_a?(Fixnum)
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
- def safi=(val)
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
@@ -87,4 +87,4 @@ class Orf < BGP::OPT_PARM::Capability
87
87
  end
88
88
  end
89
89
 
90
- load "../../test/optional_parameters/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
90
+ load "../../test/unit/optional_parameters/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
@@ -33,4 +33,4 @@ module BGP::OPT_PARM::CAP
33
33
  end
34
34
  end
35
35
 
36
- load "../../test/optional_parameters/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
36
+ load "../../test/unit/optional_parameters/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
@@ -120,18 +120,15 @@ module BGP
120
120
  end
121
121
 
122
122
  def size
123
- @prefix.nbyte+7+1
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.new(prefix.is_packed, afi)
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
 
@@ -101,4 +101,4 @@ module BGP
101
101
 
102
102
  end
103
103
 
104
- load "../../test/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
104
+ load "../../test/unit/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
@@ -227,5 +227,5 @@ module BGP
227
227
 
228
228
  end
229
229
 
230
- load "../../test/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
230
+ load "../../test/unit/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
231
231
 
@@ -39,4 +39,4 @@ module BGP
39
39
 
40
40
  end
41
41
 
42
- load "../../test/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
42
+ load "../../test/unit/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
@@ -114,4 +114,4 @@ module BGP
114
114
 
115
115
  end
116
116
 
117
- load "../../test/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
117
+ load "../../test/unit/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
@@ -171,4 +171,4 @@ module BGP
171
171
  end
172
172
 
173
173
  end
174
- load "../../test/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
174
+ load "../../test/unit/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
@@ -104,4 +104,4 @@ module BGP
104
104
 
105
105
  end
106
106
 
107
- load "../../test/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
107
+ load "../../test/unit/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
@@ -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 @type & 3
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
@@ -76,4 +76,4 @@ module BGP
76
76
  end
77
77
 
78
78
  end
79
- load "../../test/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
79
+ load "../../test/unit/path_attributes/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0