trema 0.2.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. data/.gitmodules +3 -0
  2. data/.travis.yml +13 -0
  3. data/.yardopts +4 -0
  4. data/Gemfile +2 -3
  5. data/README.md +43 -97
  6. data/Rakefile +60 -4
  7. data/Rantfile +11 -10
  8. data/cruise.rb +4 -6
  9. data/features/example.packetin_filter_config.feature +10 -10
  10. data/features/example.switch_monitor.feature +14 -2
  11. data/features/step_definitions/kill_steps.rb +2 -2
  12. data/features/step_definitions/{off_steps.rb → killall_steps.rb} +2 -2
  13. data/features/step_definitions/misc_steps.rb +1 -1
  14. data/features/step_definitions/up_steps.rb +30 -0
  15. data/features/trema.feature +1 -0
  16. data/features/trema.run.feature +1 -0
  17. data/locale/README.ja.md +19 -0
  18. data/locale/ja/yard.po +3762 -0
  19. data/locale/yard.pot +3740 -0
  20. data/ruby/extconf.rb +4 -1
  21. data/ruby/trema/action-common.c +3 -17
  22. data/ruby/trema/action-common.h +3 -7
  23. data/ruby/trema/action.rb +33 -0
  24. data/ruby/trema/app.rb +1 -1
  25. data/ruby/trema/barrier-request.c +1 -0
  26. data/ruby/trema/command/run.rb +13 -9
  27. data/ruby/trema/command/usage.rb +1 -0
  28. data/ruby/trema/command/version.rb +1 -1
  29. data/ruby/trema/controller.c +133 -50
  30. data/ruby/trema/controller.rb +2 -2
  31. data/ruby/trema/desc-stats-reply.rb +77 -0
  32. data/ruby/trema/dsl/configuration.rb +3 -14
  33. data/ruby/trema/dsl/rswitch.rb +47 -0
  34. data/ruby/trema/dsl/runner.rb +4 -1
  35. data/ruby/trema/dsl/syntax.rb +11 -8
  36. data/ruby/trema/echo-reply.c +59 -45
  37. data/ruby/trema/echo-reply.h +1 -3
  38. data/ruby/trema/echo-request.c +49 -71
  39. data/ruby/trema/echo-request.h +0 -2
  40. data/ruby/trema/echo.c +99 -0
  41. data/ruby/trema/{action-enqueue.h → echo.h} +6 -7
  42. data/ruby/trema/enqueue.rb +87 -0
  43. data/ruby/trema/error.c +109 -104
  44. data/ruby/trema/error.h +0 -2
  45. data/ruby/trema/features-reply.c +89 -35
  46. data/ruby/trema/features-reply.h +0 -6
  47. data/ruby/trema/features-request.c +63 -37
  48. data/ruby/trema/features-request.h +0 -2
  49. data/ruby/trema/flow-mod.c +149 -0
  50. data/ruby/trema/{action-output.h → flow-mod.h} +6 -6
  51. data/ruby/trema/get-config-request.c +1 -0
  52. data/ruby/trema/hardware-switch.rb +88 -0
  53. data/ruby/trema/hello.c +55 -31
  54. data/ruby/trema/hello.h +0 -2
  55. data/ruby/trema/ip.rb +12 -2
  56. data/ruby/trema/logger.rb +29 -0
  57. data/ruby/trema/mac.rb +57 -36
  58. data/ruby/trema/match.c +7 -9
  59. data/ruby/trema/monkey-patch/integer/ranges.rb +0 -2
  60. data/ruby/trema/network-component.rb +1 -1
  61. data/ruby/trema/open-vswitch.rb +2 -2
  62. data/ruby/trema/openflow-switch.rb +3 -54
  63. data/ruby/trema/{packet_in.c → packet-in.c} +262 -175
  64. data/ruby/trema/{packet_in.h → packet-in.h} +0 -2
  65. data/ruby/trema/packet-queue.rb +4 -3
  66. data/ruby/trema/port-mod.c +8 -9
  67. data/ruby/trema/port-status-add.rb +60 -0
  68. data/ruby/trema/port-status-delete.rb +60 -0
  69. data/ruby/trema/port-status-modify.rb +60 -0
  70. data/ruby/trema/port-status.c +48 -15
  71. data/ruby/trema/port-status.h +6 -8
  72. data/ruby/trema/port.c +63 -8
  73. data/ruby/trema/queue-get-config-request.c +1 -0
  74. data/ruby/trema/ruby-switch.rb +62 -0
  75. data/ruby/trema/send-out-port.rb +97 -0
  76. data/ruby/trema/set-config.c +1 -0
  77. data/ruby/trema/set-eth-addr.rb +45 -0
  78. data/ruby/trema/set-eth-dst-addr.rb +54 -0
  79. data/ruby/trema/set-eth-src-addr.rb +54 -0
  80. data/ruby/trema/set-ip-addr.rb +47 -0
  81. data/ruby/trema/set-ip-dst-addr.rb +53 -0
  82. data/ruby/trema/set-ip-src-addr.rb +52 -0
  83. data/ruby/trema/set-ip-tos.rb +63 -0
  84. data/ruby/trema/set-transport-dst-port.rb +53 -0
  85. data/ruby/trema/set-transport-port.rb +52 -0
  86. data/ruby/trema/set-transport-src-port.rb +54 -0
  87. data/ruby/trema/set-vlan-priority.rb +65 -0
  88. data/ruby/trema/set-vlan-vid.rb +64 -0
  89. data/ruby/trema/shell/down.rb +1 -1
  90. data/ruby/trema/shell/link.rb +4 -4
  91. data/ruby/trema/shell/run.rb +8 -6
  92. data/ruby/trema/shell/up.rb +3 -3
  93. data/ruby/trema/stats-reply.c +27 -2
  94. data/ruby/trema/stats-request.c +64 -23
  95. data/ruby/trema/strip-vlan-header.rb +41 -0
  96. data/ruby/trema/switch.c +196 -0
  97. data/ruby/trema/{action-vendor.h → switch.h} +5 -7
  98. data/ruby/trema/switch.rb +28 -9
  99. data/ruby/trema/trema-ruby-utils.c +66 -0
  100. data/ruby/trema/{action-set-dl-src.h → trema-ruby-utils.h} +9 -11
  101. data/ruby/trema/trema.c +61 -61
  102. data/ruby/trema/vendor-action.rb +73 -0
  103. data/ruby/trema/vendor.c +121 -52
  104. data/ruby/trema/vendor.h +6 -10
  105. data/ruby/trema/version.rb +1 -1
  106. data/spec/spec_helper.rb +1 -1
  107. data/spec/support/action.rb +52 -0
  108. data/spec/support/mandatory-option.rb +56 -0
  109. data/spec/support/openflow-message.rb +91 -7
  110. data/spec/support/port-status.rb +38 -0
  111. data/spec/trema/controller_spec.rb +0 -26
  112. data/spec/trema/dsl/configuration_spec.rb +3 -3
  113. data/spec/trema/dsl/runner_spec.rb +12 -32
  114. data/spec/trema/dsl/syntax_spec.rb +2 -11
  115. data/spec/trema/echo-reply_spec.rb +49 -14
  116. data/spec/trema/echo-request_spec.rb +86 -34
  117. data/spec/trema/enqueue_spec.rb +76 -0
  118. data/spec/trema/error_spec.rb +43 -58
  119. data/spec/trema/features-reply_spec.rb +58 -24
  120. data/spec/trema/features-request_spec.rb +54 -28
  121. data/spec/trema/flow-mod_spec.rb +99 -0
  122. data/spec/trema/{openflow-switch_spec.rb → hardware-switch_spec.rb} +3 -3
  123. data/spec/trema/hello_spec.rb +28 -14
  124. data/spec/trema/ip_spec.rb +54 -0
  125. data/spec/trema/mac_spec.rb +49 -64
  126. data/spec/trema/match_spec.rb +1 -1
  127. data/spec/trema/open-vswitch_spec.rb +7 -7
  128. data/spec/trema/packet-in_spec.rb +73 -16
  129. data/spec/trema/port-status-add_spec.rb +32 -0
  130. data/spec/trema/port-status-delete_spec.rb +32 -0
  131. data/spec/trema/port-status-modify_spec.rb +71 -0
  132. data/spec/trema/port-status_spec.rb +5 -76
  133. data/spec/trema/{action-output_spec.rb → send-out-port_spec.rb} +20 -47
  134. data/spec/trema/set-eth-dst-addr_spec.rb +75 -0
  135. data/spec/trema/set-eth-src-addr_spec.rb +72 -0
  136. data/spec/trema/set-ip-dst-addr_spec.rb +58 -0
  137. data/spec/trema/set-ip-src-addr_spec.rb +58 -0
  138. data/spec/trema/set-ip-tos_spec.rb +65 -0
  139. data/spec/trema/set-transport-dst-port_spec.rb +65 -0
  140. data/spec/trema/set-transport-src-port_spec.rb +65 -0
  141. data/spec/trema/set-vlan-priority_spec.rb +65 -0
  142. data/spec/trema/set-vlan-vid_spec.rb +65 -0
  143. data/spec/trema/shell/vhost_spec.rb +4 -1
  144. data/spec/trema/shell/vswitch_spec.rb +11 -11
  145. data/spec/trema/stats-reply_spec.rb +59 -13
  146. data/spec/trema/stats-request_spec.rb +6 -0
  147. data/spec/trema/{action-strip-vlan_spec.rb → strip-vlan-header_spec.rb} +3 -17
  148. data/spec/trema/switch-daemon_spec.rb +39 -0
  149. data/spec/trema/vendor-action_spec.rb +81 -0
  150. data/spec/trema/vendor_spec.rb +76 -0
  151. data/spec/trema_spec.rb +56 -0
  152. data/src/examples/dumper/dumper.c +0 -8
  153. data/src/examples/dumper/dumper.rb +52 -52
  154. data/src/examples/hello_trema/hello_trema.c +0 -2
  155. data/src/examples/learning_switch/learning-switch.rb +3 -3
  156. data/src/examples/multi_learning_switch/multi-learning-switch.rb +3 -3
  157. data/src/examples/openflow_message/features-request.rb +3 -3
  158. data/src/examples/packetin_filter_config/utils.c +4 -4
  159. data/src/examples/repeater_hub/repeater-hub.rb +3 -3
  160. data/src/examples/switch_info/switch_info.rb +2 -2
  161. data/src/examples/switch_monitor/switch_monitor.c +1 -1
  162. data/src/examples/traffic_monitor/traffic-monitor.rb +3 -3
  163. data/src/lib/arp.h +4 -1
  164. data/src/lib/chibach.c +391 -0
  165. data/src/lib/chibach.h +71 -0
  166. data/src/lib/chibach_private.c +170 -0
  167. data/src/lib/chibach_private.h +52 -0
  168. data/src/lib/ether.c +2 -1
  169. data/src/lib/ether.h +0 -1
  170. data/src/lib/ipv4.h +13 -14
  171. data/{ruby/trema/action-set-nw-src.h → src/lib/ipv6.h} +13 -9
  172. data/src/lib/log.c +161 -58
  173. data/src/lib/log.h +11 -16
  174. data/src/lib/messenger.c +36 -1
  175. data/src/lib/messenger.h +1 -0
  176. data/src/lib/openflow_application_interface.c +128 -28
  177. data/src/lib/openflow_application_interface.h +31 -6
  178. data/src/lib/openflow_message.c +2 -1
  179. data/src/lib/openflow_service_interface.h +1 -0
  180. data/src/lib/openflow_switch_interface.c +1380 -0
  181. data/src/lib/openflow_switch_interface.h +264 -0
  182. data/src/lib/packet_info.c +94 -11
  183. data/src/lib/packet_info.h +22 -3
  184. data/src/lib/packet_parser.c +38 -2
  185. data/src/lib/secure_channel.c +498 -0
  186. data/{ruby/trema/vendor-request.h → src/lib/secure_channel.h} +11 -10
  187. data/src/lib/tcp.h +0 -3
  188. data/src/lib/trema.c +38 -5
  189. data/{ruby/trema/action-set-nw-dst.h → src/lib/trema.hpp} +17 -8
  190. data/src/lib/trema_wrapper.c +5 -0
  191. data/src/lib/trema_wrapper.h +4 -0
  192. data/src/lib/utility.c +93 -4
  193. data/src/lib/utility.h +1 -0
  194. data/src/lib/wrapper.c +30 -7
  195. data/src/lib/wrapper.h +2 -0
  196. data/src/switch_manager/ofpmsg_recv.c +44 -30
  197. data/src/switch_manager/ofpmsg_send.c +40 -1
  198. data/src/switch_manager/ofpmsg_send.h +2 -0
  199. data/src/switch_manager/switch.c +153 -8
  200. data/src/switch_manager/switch.h +1 -0
  201. data/src/switch_manager/switchinfo.h +5 -0
  202. data/src/tremashark/README +2 -2
  203. data/src/tremashark/plugin/packet-trema/packet-trema.c +1 -0
  204. data/trema +1 -1
  205. data/unittests/lib/log_test.c +158 -34
  206. data/unittests/lib/openflow_application_interface_test.c +252 -69
  207. data/unittests/lib/openflow_message_test.c +3 -1
  208. data/unittests/lib/packet_parser_test.c +60 -15
  209. data/unittests/lib/test_packets/icmp6_echo_rep.cap +0 -0
  210. data/unittests/lib/test_packets/icmp6_echo_req.cap +0 -0
  211. data/unittests/lib/trema_test.c +2 -0
  212. data/unittests/lib/utility_test.c +65 -2
  213. data/unittests/lib/wrapper_test.c +29 -0
  214. data/vendor/{README → README.md} +2 -12
  215. data/vendor/packet-openflow.diff +13 -0
  216. metadata +86 -53
  217. data/GPL2 +0 -339
  218. data/ruby/trema/action-enqueue.c +0 -161
  219. data/ruby/trema/action-output.c +0 -169
  220. data/ruby/trema/action-set-dl-dst.c +0 -131
  221. data/ruby/trema/action-set-dl-dst.h +0 -44
  222. data/ruby/trema/action-set-dl-src.c +0 -131
  223. data/ruby/trema/action-set-nw-dst.c +0 -135
  224. data/ruby/trema/action-set-nw-src.c +0 -140
  225. data/ruby/trema/action-set-nw-tos.c +0 -124
  226. data/ruby/trema/action-set-nw-tos.h +0 -42
  227. data/ruby/trema/action-set-tp-dst.c +0 -122
  228. data/ruby/trema/action-set-tp-dst.h +0 -42
  229. data/ruby/trema/action-set-tp-src.c +0 -124
  230. data/ruby/trema/action-set-tp-src.h +0 -42
  231. data/ruby/trema/action-set-vlan-pcp.c +0 -128
  232. data/ruby/trema/action-set-vlan-pcp.h +0 -42
  233. data/ruby/trema/action-set-vlan-vid.c +0 -125
  234. data/ruby/trema/action-set-vlan-vid.h +0 -42
  235. data/ruby/trema/action-strip-vlan.c +0 -81
  236. data/ruby/trema/action-strip-vlan.h +0 -42
  237. data/ruby/trema/action-vendor.c +0 -121
  238. data/ruby/trema/vendor-request.c +0 -193
  239. data/spec/trema/action-enqueue_spec.rb +0 -100
  240. data/spec/trema/action-set-dl-dst_spec.rb +0 -95
  241. data/spec/trema/action-set-dl-src_spec.rb +0 -92
  242. data/spec/trema/action-set-nw-dst_spec.rb +0 -96
  243. data/spec/trema/action-set-nw-src_spec.rb +0 -97
  244. data/spec/trema/action-set-nw-tos_spec.rb +0 -88
  245. data/spec/trema/action-set-tp-dst_spec.rb +0 -88
  246. data/spec/trema/action-set-tp-src_spec.rb +0 -88
  247. data/spec/trema/action-set-vlan-pcp_spec.rb +0 -91
  248. data/spec/trema/action-set-vlan-vid_spec.rb +0 -91
  249. data/spec/trema/action-vendor_spec.rb +0 -90
  250. data/spec/trema/vendor-request_spec.rb +0 -79
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Author: Yasuhito Takamiya <yasuhito@gmail.com>
2
+ * Ruby wrapper class of OpenFlow FlowMod message.
3
3
  *
4
4
  * Copyright (C) 2008-2012 NEC Corporation
5
5
  *
@@ -18,20 +18,20 @@
18
18
  */
19
19
 
20
20
 
21
- #ifndef ACTION_OUTPUT_H
22
- #define ACTION_OUTPUT_H
21
+ #ifndef RUBY_FLOW_MOD_H
22
+ #define RUBY_FLOW_MOD_H
23
23
 
24
24
 
25
25
  #include "ruby.h"
26
26
 
27
27
 
28
- extern VALUE cActionOutput;
28
+ extern VALUE cFlowMod;
29
29
 
30
30
 
31
- void Init_action_output( void );
31
+ void Init_flow_mod( void );
32
32
 
33
33
 
34
- #endif // ACTION_OUTPUT_H
34
+ #endif // RUBY_FLOW_MOD_H
35
35
 
36
36
 
37
37
  /*
@@ -96,6 +96,7 @@ Init_get_config_request() {
96
96
  rb_define_alloc_func( cGetConfigRequest, get_config_request_alloc );
97
97
  rb_define_method( cGetConfigRequest, "initialize", get_config_request_init, -1 );
98
98
  rb_define_method( cGetConfigRequest, "transaction_id", get_config_request_transaction_id, 0 );
99
+ rb_alias( cGetConfigRequest, rb_intern( "xid" ), rb_intern( "transaction_id" ) );
99
100
  }
100
101
 
101
102
 
@@ -0,0 +1,88 @@
1
+ #
2
+ # Author: Yasuhito Takamiya <yasuhito@gmail.com>
3
+ #
4
+ # Copyright (C) 2008-2012 NEC Corporation
5
+ #
6
+ # This program is free software; you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License, version 2, as
8
+ # published by the Free Software Foundation.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License along
16
+ # with this program; if not, write to the Free Software Foundation, Inc.,
17
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
+ #
19
+
20
+
21
+ require "trema/openflow-switch"
22
+
23
+
24
+ module Trema
25
+ #
26
+ # Hardware switch that supports OpenFlow protocol.
27
+ #
28
+ class HardwareSwitch
29
+ #
30
+ # The name of this switch
31
+ #
32
+ # @example
33
+ # switch.name #=> "My expensive OpenFlow switch"
34
+ #
35
+ # @return [String]
36
+ #
37
+ attr_reader :name
38
+
39
+
40
+ #
41
+ # Creates a new HardwareSwitch from {DSL::Switch}
42
+ #
43
+ # @example
44
+ # switch = Trema::HardwareSwitch.new( stanza )
45
+ #
46
+ # @return [HardwareSwitch]
47
+ #
48
+ def initialize stanza
49
+ stanza.validate
50
+ @name = stanza.name
51
+ @stanza = stanza
52
+ OpenflowSwitch.add self
53
+ end
54
+
55
+
56
+ #
57
+ # Returns datapath id in long format
58
+ #
59
+ # @example
60
+ # switch.dpid_long #=> "0000000000000abc"
61
+ #
62
+ # @return [String]
63
+ #
64
+ def dpid_long
65
+ @stanza.fetch :dpid_long
66
+ end
67
+
68
+
69
+ #
70
+ # Returns datapath id prefixed with "0x"
71
+ #
72
+ # @example
73
+ # switch.dpid_short #=> "0xabc"
74
+ #
75
+ # @return [String]
76
+ #
77
+ def dpid_short
78
+ @stanza.fetch :dpid_short
79
+ end
80
+ end
81
+ end
82
+
83
+
84
+ ### Local variables:
85
+ ### mode: Ruby
86
+ ### coding: utf-8-unix
87
+ ### indent-tabs-mode: nil
88
+ ### End:
data/ruby/trema/hello.c CHANGED
@@ -1,6 +1,4 @@
1
1
  /*
2
- * Author: Yasuhito Takamiya <yasuhito@gmail.com>
3
- *
4
2
  * Copyright (C) 2008-2012 NEC Corporation
5
3
  *
6
4
  * This program is free software; you can redistribute it and/or modify
@@ -18,8 +16,9 @@
18
16
  */
19
17
 
20
18
 
21
- #include "trema.h"
22
19
  #include "ruby.h"
20
+ #include "trema.h"
21
+ #include "trema-ruby-utils.h"
23
22
 
24
23
 
25
24
  extern VALUE mTrema;
@@ -36,60 +35,84 @@ hello_alloc( VALUE klass ) {
36
35
  /*
37
36
  * Creates a Hello OpenFlow message.
38
37
  *
39
- * @overload initialize(options={})
40
- *
38
+ * @overload initialize()
41
39
  * @example
42
40
  * Hello.new
43
- * Hello.new( :transaction_id => 123 )
44
41
  *
42
+ * @overload initialize(transaction_id)
43
+ * @example
44
+ * Hello.new( 123 )
45
+ * @param [Integer] transaction_id
46
+ * An unsigned 32bit integer number associated with this message.
47
+ *
48
+ * @overload initialize(options)
49
+ * @example
50
+ * Hello.new( :xid => 123 )
51
+ * Hello.new( :transaction_id => 123 )
45
52
  * @param [Hash] options
46
53
  * the options to create a message with.
47
- *
54
+ * @option options [Number] :xid
48
55
  * @option options [Number] :transaction_id
49
56
  * An unsigned 32bit integer number associated with this message.
50
57
  * If not specified, an auto-generated value is set.
51
58
  *
52
- * @raise [ArgumentError] if transaction ID is not an unsigned 32-bit integer.
53
- * @raise [TypeError] if options is not a Hash.
54
- *
55
- * @return [Hello]
56
- * an object that encapsulates the +OPFT_HELLO+ OpenFlow message.
59
+ * @raise [ArgumentError] if transaction ID is not an unsigned 32-bit integer.
60
+ * @raise [TypeError] if argument is not a Integer or a Hash.
61
+ * @return [Hello]
57
62
  */
58
63
  static VALUE
59
64
  hello_init( int argc, VALUE *argv, VALUE self ) {
60
- buffer *hello;
65
+ buffer *hello = NULL;
61
66
  Data_Get_Struct( self, buffer, hello );
62
- uint32_t xid = get_transaction_id();
63
- VALUE options;
64
-
65
- if ( rb_scan_args( argc, argv, "01", &options ) == 1 ) {
66
- Check_Type( options, T_HASH );
67
- VALUE xid_ruby;
68
- if ( ( xid_ruby = rb_hash_aref( options, ID2SYM( rb_intern( "transaction_id" ) ) ) ) != Qnil ) {
69
- if ( rb_funcall( xid_ruby, rb_intern( "unsigned_32bit?" ), 0 ) == Qfalse ) {
70
- rb_raise( rb_eArgError, "Transaction ID must be an unsigned 32-bit integer" );
67
+ VALUE options = Qnil;
68
+
69
+ if ( rb_scan_args( argc, argv, "01", &options ) == 0 ) {
70
+ set_xid( hello, get_transaction_id() );
71
+ }
72
+ else {
73
+ if ( options == Qnil ) {
74
+ set_xid( hello, get_transaction_id() );
75
+ }
76
+ else if ( rb_obj_is_kind_of( options, rb_cInteger ) == Qtrue ) {
77
+ validate_xid( options );
78
+ set_xid( hello, ( uint32_t ) NUM2UINT( options ) );
79
+ }
80
+ else {
81
+ Check_Type( options, T_HASH );
82
+ VALUE tmp = Qnil;
83
+ VALUE xid = Qnil;
84
+
85
+ tmp = rb_hash_aref( options, ID2SYM( rb_intern( "transaction_id" ) ) );
86
+ if ( tmp != Qnil ) {
87
+ xid = tmp;
88
+ }
89
+ tmp = rb_hash_aref( options, ID2SYM( rb_intern( "xid" ) ) );
90
+ if ( tmp != Qnil ) {
91
+ xid = tmp;
92
+ }
93
+
94
+ if ( xid != Qnil ) {
95
+ validate_xid( xid );
96
+ set_xid( hello, ( uint32_t ) NUM2UINT( xid ) );
97
+ }
98
+ else {
99
+ set_xid( hello, get_transaction_id() );
71
100
  }
72
- xid = ( uint32_t ) NUM2UINT( xid_ruby );
73
101
  }
74
102
  }
75
- ( ( struct ofp_header * ) ( hello->data ) )->xid = htonl( xid );
103
+
76
104
  return self;
77
105
  }
78
106
 
79
107
 
80
108
  /*
81
- * An unsigned 32bit integer number associated with this
82
- * message. Replies use the same id as was in the request to
83
- * facilitate pairing.
109
+ * Transaction ids, message sequence numbers matching requests to replies.
84
110
  *
85
111
  * @return [Number] the value of transaction ID.
86
112
  */
87
113
  static VALUE
88
114
  hello_transaction_id( VALUE self ) {
89
- buffer *hello;
90
- Data_Get_Struct( self, buffer, hello );
91
- uint32_t xid = ntohl( ( ( struct ofp_header * ) ( hello->data ) )->xid );
92
- return UINT2NUM( xid );
115
+ return get_xid( self );
93
116
  }
94
117
 
95
118
 
@@ -99,6 +122,7 @@ Init_hello() {
99
122
  rb_define_alloc_func( cHello, hello_alloc );
100
123
  rb_define_method( cHello, "initialize", hello_init, -1 );
101
124
  rb_define_method( cHello, "transaction_id", hello_transaction_id, 0 );
125
+ rb_alias( cHello, rb_intern( "xid" ), rb_intern( "transaction_id" ) );
102
126
  }
103
127
 
104
128
 
data/ruby/trema/hello.h CHANGED
@@ -1,8 +1,6 @@
1
1
  /*
2
2
  * Ruby wrapper class of OpenFlow hello message.
3
3
  *
4
- * Author: Yasuhito Takamiya <yasuhito@gmail.com>
5
- *
6
4
  * Copyright (C) 2008-2012 NEC Corporation
7
5
  *
8
6
  * This program is free software; you can redistribute it and/or modify
data/ruby/trema/ip.rb CHANGED
@@ -1,6 +1,4 @@
1
1
  #
2
- # Author: Nick Karanatsios <nickkaranatsios@gmail.com>
3
- #
4
2
  # Copyright (C) 2008-2012 NEC Corporation
5
3
  #
6
4
  # This program is free software; you can redistribute it and/or modify
@@ -90,6 +88,18 @@ module Trema
90
88
  def to_i
91
89
  @value.to_i
92
90
  end
91
+
92
+
93
+ #
94
+ # @return [Array]
95
+ # an array of decimal numbers converted from IP address.
96
+ #
97
+ def to_a
98
+ to_s.split( "." ).collect do | each |
99
+ each.to_i
100
+ end
101
+ end
102
+ alias :to_array :to_a
93
103
  end
94
104
  end
95
105
 
@@ -0,0 +1,29 @@
1
+ #
2
+ # Copyright (C) 2008-2012 NEC Corporation
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License, version 2, as
6
+ # published by the Free Software Foundation.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along
14
+ # with this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
+ #
17
+
18
+
19
+ module Trema
20
+ module Logger
21
+ end
22
+ end
23
+
24
+
25
+ ### Local variables:
26
+ ### mode: Ruby
27
+ ### coding: utf-8
28
+ ### indent-tabs-mode: nil
29
+ ### End:
data/ruby/trema/mac.rb CHANGED
@@ -1,6 +1,4 @@
1
1
  #
2
- # Author: Yasuhito Takamiya <yasuhito@gmail.com>
3
- #
4
2
  # Copyright (C) 2008-2012 NEC Corporation
5
3
  #
6
4
  # This program is free software; you can redistribute it and/or modify
@@ -23,7 +21,7 @@ require "forwardable"
23
21
 
24
22
  module Trema
25
23
  #
26
- # MAC address class
24
+ # Ethernet address class
27
25
  #
28
26
  class Mac
29
27
  extend Forwardable
@@ -31,18 +29,23 @@ module Trema
31
29
 
32
30
 
33
31
  #
34
- # @return [Number] Ethernet address in its numeric presentation.
32
+ # Returns an Ethernet address in its numeric presentation.
33
+ #
34
+ # @example
35
+ # Mac.new("11:22:33:44:55:66") #=> 18838586676582
36
+ #
37
+ # @return [Number] the Ethernet address in numeric format
35
38
  #
36
39
  attr_reader :value
37
40
 
38
41
 
39
42
  #
40
- # Creates a {Mac} instance that encapsulates Ethernet MAC addresses.
43
+ # Creates a {Mac} instance that encapsulates Ethernet addresses.
41
44
  #
42
45
  # @overload initialize(value)
43
46
  #
44
47
  # @param [String,Integer] value
45
- # the MAC address to set to.
48
+ # the Ethernet address to set to.
46
49
  #
47
50
  # @example address as a hexadecimal string
48
51
  # Mac.new("11:22:33:44:55:66")
@@ -51,25 +54,30 @@ module Trema
51
54
  # Mac.new(0xffffffffffff)
52
55
  #
53
56
  # @raise [ArgumentError] if invalid format is detected.
54
- # @raise [ArgumentError] if supplied argument is not a string or integer.
57
+ # @raise [TypeError] if supplied argument is not a String or Integer.
55
58
  #
56
59
  def initialize value
57
60
  case value
58
- when String
59
- @value = from_string( value )
60
- when Integer
61
- @value = from_integer( value )
62
- else
63
- raise %{Invalid MAC address: #{ value.inspect }}
61
+ when String
62
+ @value = create_from( value )
63
+ when Integer
64
+ @value = value
65
+ validate_value_range
66
+ else
67
+ raise TypeError, "Invalid MAC address: #{ value.inspect }"
64
68
  end
65
69
  @string = string_format
66
70
  end
67
71
 
68
72
 
69
73
  #
70
- # @return [String]
71
- # the Ethernet address as 6 pairs of hexadecimal digits delimited by colons.
72
- # eg. xx:xx:xx:xx:xx:xx
74
+ # Returns the Ethernet address as 6 pairs of hexadecimal digits
75
+ # delimited by colons.
76
+ #
77
+ # @example
78
+ # Mac.new(18838586676582).to_s #=> "11:22:33:44:55:66"
79
+ #
80
+ # @return [String] the Ethernet address in String format
73
81
  #
74
82
  def to_s
75
83
  @string
@@ -77,11 +85,15 @@ module Trema
77
85
 
78
86
 
79
87
  #
80
- # @return [Array]
81
- # an array of decimal numbers converted from Ethernet's address string
82
- # format.
88
+ # Returns an array of decimal numbers converted from Ethernet's
89
+ # address string format.
90
+ #
91
+ # @example
92
+ # Mac.new("11:22:33:44:55:66").to_a #=> [ 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 ]
83
93
  #
84
- def to_short
94
+ # @return [Array] the Ethernet address in Array format
95
+ #
96
+ def to_a
85
97
  @string.split( ":" ).collect do | each |
86
98
  each.hex
87
99
  end
@@ -89,27 +101,38 @@ module Trema
89
101
 
90
102
 
91
103
  #
92
- # @return [Boolean] if other matches or not the attribute type value.
104
+ # @private
93
105
  #
94
106
  def == other
95
107
  @value == other.value
96
108
  end
109
+ alias :eql? :==
97
110
 
98
111
 
99
112
  #
100
- # @return [Boolean] if other matches or not the attribute type value.
113
+ # Returns true if Ethernet address is a multicast address.
101
114
  #
102
- def eql? other
103
- @value == other.value
115
+ # @example
116
+ # Mac.new("01:00:00:00:00:00").multicast? #=> true
117
+ # Mac.new("00:00:00:00:00:00").multicast? #=> false
118
+ #
119
+ # @return [Boolean] whether the Ethernet address is multicast
120
+ #
121
+ def multicast?
122
+ to_a[ 0 ] & 1 == 1
104
123
  end
105
124
 
106
125
 
107
126
  #
108
- # @return [Boolean] if MAC address is multicast or not.
127
+ # Returns true if Ethernet address is a broadcast address.
109
128
  #
110
- def is_multicast?
111
- # check I/G bit
112
- return to_short[0] & 1 == 1
129
+ # @example
130
+ # Mac.new("ff:ff:ff:ff:ff:ff").broadcast? #=> true
131
+ #
132
+ # @return [Boolean] whether the Ethernet address is broadcast
133
+ #
134
+ def broadcast?
135
+ to_a.all? { | each | each == 0xff }
113
136
  end
114
137
 
115
138
 
@@ -118,21 +141,19 @@ module Trema
118
141
  ################################################################################
119
142
 
120
143
 
121
- def from_string string
144
+ def create_from string
122
145
  octet_regex = "[0-9a-fA-F][0-9a-fA-F]"
123
146
  if /^(#{ octet_regex }:){5}(#{ octet_regex })$/=~ string
124
- eval( "0x" + string.gsub( ":", "" ) )
147
+ string.gsub( ":", "" ).hex
125
148
  else
126
- raise %{Invalid MAC address: "#{ string }"}
149
+ raise ArgumentError, %{Invalid MAC address: "#{ string }"}
127
150
  end
128
151
  end
129
152
 
130
153
 
131
- def from_integer integer
132
- if integer >= 0 and integer <= 0xffffffffffff
133
- integer
134
- else
135
- raise %{Invalid MAC address: #{ integer }}
154
+ def validate_value_range
155
+ if not ( @value >= 0 and @value <= 0xffffffffffff )
156
+ raise ArgumentError, "Invalid MAC address: #{ @value }"
136
157
  end
137
158
  end
138
159