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,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
data/ruby/trema/echo.c ADDED
@@ -0,0 +1,99 @@
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
+ #include "ruby.h"
20
+ #include "trema-ruby-utils.h"
21
+
22
+
23
+ VALUE
24
+ echo_init( int argc, VALUE *argv, VALUE self ) {
25
+ buffer *echo = NULL;
26
+ Data_Get_Struct( self, buffer, echo );
27
+ VALUE options = Qnil;
28
+
29
+ if ( rb_scan_args( argc, argv, "01", &options ) == 0 ) {
30
+ set_xid( echo, get_transaction_id() );
31
+ }
32
+ else {
33
+ if ( options == Qnil ) {
34
+ set_xid( echo, get_transaction_id() );
35
+ }
36
+ else if ( rb_obj_is_kind_of( options, rb_cInteger ) == Qtrue ) {
37
+ validate_xid( options );
38
+ set_xid( echo, ( uint32_t ) NUM2UINT( options ) );
39
+ }
40
+ else {
41
+ Check_Type( options, T_HASH );
42
+ VALUE tmp = Qnil;
43
+ VALUE xid = Qnil;
44
+
45
+ tmp = rb_hash_aref( options, ID2SYM( rb_intern( "transaction_id" ) ) );
46
+ if ( tmp != Qnil ) {
47
+ xid = tmp;
48
+ }
49
+ tmp = rb_hash_aref( options, ID2SYM( rb_intern( "xid" ) ) );
50
+ if ( tmp != Qnil ) {
51
+ xid = tmp;
52
+ }
53
+ if ( xid != Qnil ) {
54
+ validate_xid( xid );
55
+ set_xid( echo, ( uint32_t ) NUM2UINT( xid ) );
56
+ }
57
+ else {
58
+ set_xid( echo, get_transaction_id() );
59
+ }
60
+
61
+ VALUE user_data = rb_hash_aref( options, ID2SYM( rb_intern( "user_data" ) ) );
62
+ if ( user_data != Qnil ) {
63
+ Check_Type( user_data, T_STRING );
64
+ uint16_t length = ( u_int16_t ) RSTRING_LEN( user_data );
65
+ append_back_buffer( echo, length );
66
+ set_length( echo, length );
67
+ memcpy( ( char * ) echo->data + sizeof( struct ofp_header ), RSTRING_PTR( user_data ), length );
68
+ }
69
+ }
70
+ }
71
+
72
+ return self;
73
+ }
74
+
75
+
76
+ VALUE
77
+ echo_transaction_id( VALUE self ) {
78
+ return get_xid( self );
79
+ }
80
+
81
+
82
+ VALUE
83
+ echo_user_data( VALUE self ) {
84
+ buffer *echo;
85
+ Data_Get_Struct( self, buffer, echo );
86
+ if ( echo->length > sizeof( struct ofp_header ) ) {
87
+ return rb_str_new( ( char * ) echo->data + sizeof( struct ofp_header ),
88
+ ( long ) ( echo->length - sizeof( struct ofp_header ) ) );
89
+ }
90
+ return Qnil;
91
+ }
92
+
93
+
94
+ /*
95
+ * Local variables:
96
+ * c-basic-offset: 2
97
+ * indent-tabs-mode: nil
98
+ * End:
99
+ */
@@ -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
@@ -18,18 +16,19 @@
18
16
  */
19
17
 
20
18
 
21
- #ifndef ACTION_ENQUEUE_H
22
- #define ACTION_ENQUEUE_H
19
+ #ifndef ECHO_H
20
+ #define ECHO_H
23
21
 
24
22
 
25
23
  #include "ruby.h"
26
24
 
27
25
 
28
- extern VALUE cActionEnqueue;
29
- void Init_action_enqueue( void );
26
+ VALUE echo_init( int argc, VALUE *argv, VALUE self );
27
+ VALUE echo_transaction_id( VALUE self );
28
+ VALUE echo_user_data( VALUE self );
30
29
 
31
30
 
32
- #endif // ACTION_ENQUEUE_H
31
+ #endif // ECHO_H
33
32
 
34
33
 
35
34
  /*
@@ -0,0 +1,87 @@
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
+ require "trema/action"
20
+ require "trema/monkey-patch/integer"
21
+
22
+
23
+ module Trema
24
+ #
25
+ # An action to enqueue the packet on the specified queue attached to
26
+ # a port.
27
+ #
28
+ class Enqueue < Action
29
+ attr_reader :port_number
30
+ attr_reader :queue_id
31
+
32
+
33
+ #
34
+ # Creates an action to enqueue the packet on the specified queue
35
+ # attached to a port. When a queue is configured the user can
36
+ # associate a flow with this action to forward a packet through
37
+ # the specific queue in that port.
38
+ #
39
+ # @example
40
+ # Enqueue.new( :port_number => 1, :queue_id => 2 )
41
+ #
42
+ # @param [Hash] options
43
+ # the options hash to create this action class instance with.
44
+ #
45
+ # @option options [Number] :port_number
46
+ # the port the queue is attached to.
47
+ #
48
+ # @option options [Number] :queue_id
49
+ # the configured queue. Currently only minimum rate queues provided.
50
+ #
51
+ # @raise [TypeError] if options is not a Hash.
52
+ # @raise [ArgumentError] if both port_number and queue_id arguments not supplied.
53
+ # @raise [ArgumentError] if port_number is not an unsigned 16-bit integer.
54
+ # @raise [ArgumentError] if queue id is not an unsigned 32-bit integer.
55
+ #
56
+ def initialize options
57
+ if options.is_a?( Hash )
58
+ @port_number = options[ :port_number ]
59
+ @queue_id = options[ :queue_id ]
60
+ if @port_number.nil?
61
+ raise ArgumentError, "Port number is a mandatory option"
62
+ end
63
+ if not @port_number.unsigned_16bit?
64
+ raise ArgumentError, "Port number must be an unsigned 16-bit integer"
65
+ end
66
+ if @queue_id.nil?
67
+ raise ArgumentError, "Queue ID is a mandatory option"
68
+ end
69
+ if not @queue_id.unsigned_32bit?
70
+ raise ArgumentError, "Queue ID must be an unsigned 32-bit integer"
71
+ end
72
+ else
73
+ raise "Invalid option"
74
+ end
75
+ end
76
+ end
77
+
78
+
79
+ ActionEnqueue = Enqueue
80
+ end
81
+
82
+
83
+ ### Local variables:
84
+ ### mode: Ruby
85
+ ### coding: utf-8-unix
86
+ ### indent-tabs-mode: nil
87
+ ### End:
data/ruby/trema/error.c 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
@@ -18,111 +16,116 @@
18
16
  */
19
17
 
20
18
 
21
- #include "trema.h"
22
19
  #include "ruby.h"
20
+ #include "trema-ruby-utils.h"
21
+ #include "trema.h"
23
22
 
24
23
 
25
24
  extern VALUE mTrema;
26
25
  VALUE cError;
27
26
 
28
27
 
28
+ static VALUE
29
+ error_alloc( VALUE klass ) {
30
+ buffer *error = create_error( 0, 0, 0, NULL );
31
+ return Data_Wrap_Struct( klass, NULL, free_buffer, error );
32
+ }
33
+
34
+
29
35
  /*
30
- * @overload initialize(options={})
36
+ * @overload initialize(options)
31
37
  * @example
32
38
  * Error.new(
33
- * :type => Error::OFPET_BAD_REQUEST,
34
- * :code => Error::OFPBRC_BAD_TYPE,
39
+ * :type => OFPET_BAD_REQUEST,
40
+ * :code => OFPBRC_BAD_TYPE,
35
41
  * )
36
42
  * Error.new(
37
- * :type => Errr::OFPET_BAD_REQUEST,
38
- * :code => Error::OFPBRC_BAD_TYPE,
43
+ * :type => OFPET_BAD_REQUEST,
44
+ * :code => OFPBRC_BAD_TYPE,
39
45
  * :transcation_id => 123
40
46
  * )
41
47
  * Error.new(
42
- * :type => Errr::OFPET_BAD_REQUEST,
43
- * :code => Error::OFPBRC_BAD_TYPE,
48
+ * :type => OFPET_BAD_REQUEST,
49
+ * :code => OFPBRC_BAD_TYPE,
44
50
  * :transcation_id => 123
45
- * :user_data => "Error!!"
51
+ * :data => "Error!!"
46
52
  * )
47
- *
48
- * @param [Hash] options
53
+ * @param [Hash] options
49
54
  * the options to create a message with.
50
- *
51
55
  * @option options [Number] :type
52
56
  * a command or action that failed.
53
- *
54
57
  * @option options [Number] :code
55
58
  * the reason of the failed type error.
56
- *
59
+ * @option options [String] :data
60
+ * a more user friendly explanation of the error. Defaults to nil
61
+ * if not specified.
62
+ * @option options [Number] :xid
57
63
  * @option options [Number] :transaction_id
58
- * a positive number, not recently attached to any previous pending commands to
59
- * guarantee message integrity auto-generated if not specified.
60
- *
61
- * @option options [String] :user_data
62
- * a more user friendly explanation of the error. Defaults to nil if not
63
- * specified.
64
- *
65
- * @raise [ArgumentError] if transaction_id is not an unsigned 32bit integer.
64
+ * An unsigned 32bit integer number associated with this message.
65
+ * If not specified, an auto-generated value is set.
66
+ * @raise [ArgumentError] if transaction ID is not an unsigned 32bit integer.
66
67
  * @raise [ArgumentError] if type and code are not supplied.
67
68
  * @raise [ArgumentError] if user data is not a string.
68
69
  * @raise [TypeError] if options is not a hash.
69
- *
70
70
  * @return [Error]
71
- * an object that encapsulates the +OFPT_ERROR+ OpenFlow message.
72
71
  */
73
72
  static VALUE
74
- error_new( int argc, VALUE *argv, VALUE klass ) {
75
- buffer *data = NULL;
76
- uint32_t xid;
77
- uint16_t type;
78
- uint16_t code;
73
+ error_init( int argc, VALUE *argv, VALUE self ) {
74
+ buffer *error = NULL;
75
+ Data_Get_Struct( self, buffer, error );
79
76
  VALUE options;
80
77
 
81
78
  if ( rb_scan_args( argc, argv, "01", &options ) == 1 ) {
82
79
  Check_Type( options, T_HASH );
83
- VALUE type_r;
84
- if ( ( type_r = rb_hash_aref( options, ID2SYM( rb_intern( "type" ) ) ) ) != Qnil ) {
85
- type = ( uint16_t ) NUM2UINT( type_r );
80
+ VALUE tmp = Qnil;
81
+
82
+ tmp = rb_hash_aref( options, ID2SYM( rb_intern( "type" ) ) );
83
+ if ( tmp != Qnil ) {
84
+ ( ( struct ofp_error_msg * ) error->data )->type = htons( ( uint16_t ) NUM2UINT( tmp ) );
86
85
  }
87
86
  else {
88
87
  rb_raise( rb_eArgError, "Type is a mandatory option" );
89
88
  }
90
- VALUE code_r;
91
- if ( ( code_r = rb_hash_aref( options, ID2SYM( rb_intern( "code" ) ) ) ) != Qnil ) {
92
- code = ( uint16_t ) NUM2UINT( code_r );
89
+
90
+ tmp = rb_hash_aref( options, ID2SYM( rb_intern( "code" ) ) );
91
+ if ( tmp != Qnil ) {
92
+ ( ( struct ofp_error_msg * ) error->data )->code = htons( ( uint16_t ) NUM2UINT( tmp ) );
93
93
  }
94
94
  else {
95
95
  rb_raise( rb_eArgError, "Code is a mandatory option" );
96
96
  }
97
- VALUE xid_r;
98
- if ( ( xid_r = rb_hash_aref( options, ID2SYM( rb_intern( "transaction_id" ) ) ) ) != Qnil ) {
99
- if ( rb_funcall( xid_r, rb_intern( "unsigned_32bit?" ), 0 ) == Qfalse ) {
100
- rb_raise( rb_eArgError, "Transaction ID must be an unsigned 32-bit integer" );
101
- }
102
- xid = ( uint32_t ) NUM2UINT( xid_r );
97
+
98
+ VALUE xid = Qnil;
99
+ tmp = rb_hash_aref( options, ID2SYM( rb_intern( "transaction_id" ) ) );
100
+ if ( tmp != Qnil ) {
101
+ xid = tmp;
102
+ }
103
+ tmp = rb_hash_aref( options, ID2SYM( rb_intern( "xid" ) ) );
104
+ if ( tmp != Qnil ) {
105
+ xid = tmp;
106
+ }
107
+ if ( xid != Qnil ) {
108
+ validate_xid( xid );
109
+ set_xid( error, ( uint32_t ) NUM2UINT( xid ) );
103
110
  }
104
111
  else {
105
- xid = get_transaction_id();
112
+ set_xid( error, get_transaction_id() );
106
113
  }
107
- VALUE user_data;
108
- if ( ( user_data = rb_hash_aref( options, ID2SYM( rb_intern( "user_data" ) ) ) ) != Qnil ) {
109
- if ( rb_obj_is_kind_of( user_data, rb_cString ) == Qfalse ) {
110
- rb_raise( rb_eArgError, "User data must be a string" );
111
- }
112
- uint16_t length = ( u_int16_t ) RSTRING_LEN( user_data );
113
- data = alloc_buffer_with_length( length );
114
- void *p = append_back_buffer( data, length );
115
- memcpy( p, RSTRING_PTR( user_data ), length );
114
+
115
+ VALUE data = rb_hash_aref( options, ID2SYM( rb_intern( "data" ) ) );
116
+ if ( data != Qnil ) {
117
+ Check_Type( data, T_STRING );
118
+ uint16_t length = ( u_int16_t ) RSTRING_LEN( data );
119
+ append_back_buffer( error, length );
120
+ ( ( struct ofp_header * ) ( error->data ) )->length = htons( ( uint16_t ) ( offsetof( struct ofp_error_msg, data ) + length ) );
121
+ memcpy( ( char * ) error->data + offsetof( struct ofp_error_msg, data ), RSTRING_PTR( data ), length );
116
122
  }
117
123
  }
118
124
  else {
119
125
  rb_raise( rb_eArgError, "Type and code are mandatory options" );
120
126
  }
121
- buffer *error = create_error( xid, type, code, data );
122
- if ( data != NULL ) {
123
- free_buffer( data );
124
- }
125
- return Data_Wrap_Struct( klass, NULL, free_buffer, error );
127
+
128
+ return self;
126
129
  }
127
130
 
128
131
 
@@ -154,7 +157,7 @@ error_transaction_id( VALUE self ) {
154
157
  * @return [nil] user data payload is not set.
155
158
  */
156
159
  static VALUE
157
- error_user_data( VALUE self ) {
160
+ error_data( VALUE self ) {
158
161
  struct ofp_error_msg *error = get_error( self );
159
162
  long length = ( long ) ( ntohs( error->header.length ) - sizeof( struct ofp_error_msg ) );
160
163
  if ( length > 0 ) {
@@ -192,54 +195,56 @@ error_code( VALUE self ) {
192
195
 
193
196
  void
194
197
  Init_error() {
198
+ rb_define_const( mTrema, "OFPET_HELLO_FAILED", INT2NUM( OFPET_HELLO_FAILED ) );
199
+ rb_define_const( mTrema, "OFPHFC_INCOMPATIBLE", INT2NUM( OFPHFC_INCOMPATIBLE ) );
200
+ rb_define_const( mTrema, "OFPHFC_EPERM", INT2NUM( OFPHFC_EPERM ) );
201
+
202
+ rb_define_const( mTrema, "OFPET_BAD_REQUEST", INT2NUM( OFPET_BAD_REQUEST ) );
203
+ rb_define_const( mTrema, "OFPBRC_BAD_VERSION", INT2NUM( OFPBRC_BAD_VERSION ) );
204
+ rb_define_const( mTrema, "OFPBRC_BAD_TYPE", INT2NUM( OFPBRC_BAD_TYPE ) );
205
+ rb_define_const( mTrema, "OFPBRC_BAD_STAT", INT2NUM( OFPBRC_BAD_STAT ) );
206
+ rb_define_const( mTrema, "OFPBRC_BAD_VENDOR", INT2NUM( OFPBRC_BAD_VENDOR ) );
207
+ rb_define_const( mTrema, "OFPBRC_BAD_SUBTYPE", INT2NUM( OFPBRC_BAD_SUBTYPE ) );
208
+ rb_define_const( mTrema, "OFPBRC_EPERM", INT2NUM( OFPBRC_EPERM ) );
209
+ rb_define_const( mTrema, "OFPBRC_BAD_LEN", INT2NUM( OFPBRC_BAD_LEN ) );
210
+ rb_define_const( mTrema, "OFPBRC_BUFFER_EMPTY", INT2NUM( OFPBRC_BUFFER_EMPTY ) );
211
+ rb_define_const( mTrema, "OFPBRC_BUFFER_UNKNOWN", INT2NUM( OFPBRC_BUFFER_UNKNOWN ) );
212
+
213
+ rb_define_const( mTrema, "OFPET_BAD_ACTION", INT2NUM( OFPET_BAD_ACTION ) );
214
+ rb_define_const( mTrema, "OFPBAC_BAD_TYPE", INT2NUM( OFPBAC_BAD_TYPE ) );
215
+ rb_define_const( mTrema, "OFPBAC_BAD_LEN", INT2NUM( OFPBAC_BAD_LEN ) );
216
+ rb_define_const( mTrema, "OFPBAC_BAD_VENDOR", INT2NUM( OFPBAC_BAD_VENDOR ) );
217
+ rb_define_const( mTrema, "OFPBAC_BAD_VENDOR_TYPE", INT2NUM( OFPBAC_BAD_VENDOR_TYPE ) );
218
+ rb_define_const( mTrema, "OFPBAC_BAD_OUT_PORT", INT2NUM( OFPBAC_BAD_OUT_PORT ) );
219
+ rb_define_const( mTrema, "OFPBAC_BAD_ARGUMENT", INT2NUM( OFPBAC_BAD_ARGUMENT ) );
220
+ rb_define_const( mTrema, "OFPBAC_EPERM", INT2NUM( OFPBAC_EPERM ) );
221
+ rb_define_const( mTrema, "OFPBAC_TOO_MANY", INT2NUM( OFPBAC_TOO_MANY ) );
222
+ rb_define_const( mTrema, "OFPBAC_BAD_QUEUE", INT2NUM( OFPBAC_BAD_QUEUE ) );
223
+
224
+ rb_define_const( mTrema, "OFPET_FLOW_MOD_FAILED", INT2NUM( OFPET_FLOW_MOD_FAILED ) );
225
+ rb_define_const( mTrema, "OFPFMFC_ALL_TABLES_FULL", INT2NUM( OFPFMFC_ALL_TABLES_FULL ) );
226
+ rb_define_const( mTrema, "OFPFMFC_OVERLAP", INT2NUM( OFPFMFC_OVERLAP ) );
227
+ rb_define_const( mTrema, "OFPFMFC_EPERM", INT2NUM( OFPFMFC_EPERM ) );
228
+ rb_define_const( mTrema, "OFPFMFC_BAD_EMERG_TIMEOUT", INT2NUM( OFPFMFC_BAD_EMERG_TIMEOUT ) );
229
+ rb_define_const( mTrema, "OFPFMFC_BAD_COMMAND", INT2NUM( OFPFMFC_BAD_COMMAND ) );
230
+ rb_define_const( mTrema, "OFPFMFC_UNSUPPORTED", INT2NUM( OFPFMFC_UNSUPPORTED ) );
231
+
232
+ rb_define_const( mTrema, "OFPET_PORT_MOD_FAILED", INT2NUM( OFPET_PORT_MOD_FAILED ) );
233
+ rb_define_const( mTrema, "OFPPMFC_BAD_PORT", INT2NUM( OFPPMFC_BAD_PORT ) );
234
+ rb_define_const( mTrema, "OFPPMFC_BAD_HW_ADDR", INT2NUM( OFPPMFC_BAD_HW_ADDR ) );
235
+
236
+ rb_define_const( mTrema, "OFPET_QUEUE_OP_FAILED", INT2NUM( OFPET_QUEUE_OP_FAILED ) );
237
+ rb_define_const( mTrema, "OFPQOFC_BAD_PORT", INT2NUM(OFPQOFC_BAD_PORT));
238
+ rb_define_const( mTrema, "OFPQOFC_BAD_QUEUE", INT2NUM(OFPQOFC_BAD_QUEUE));
239
+ rb_define_const( mTrema, "OFPQOFC_EPERM", INT2NUM(OFPQOFC_EPERM));
240
+
195
241
  cError = rb_define_class_under( mTrema, "Error", rb_cObject );
196
- rb_define_singleton_method( cError, "new", error_new, -1 );
197
- rb_define_const( cError, "OFPET_HELLO_FAILED", INT2NUM( OFPET_HELLO_FAILED ) );
198
- rb_define_const( cError, "OFPET_BAD_REQUEST", INT2NUM( OFPET_BAD_REQUEST ) );
199
- rb_define_const( cError, "OFPET_BAD_ACTION", INT2NUM( OFPET_BAD_ACTION ) );
200
- rb_define_const( cError, "OFPET_FLOW_MOD_FAILED", INT2NUM( OFPET_FLOW_MOD_FAILED ) );
201
- rb_define_const( cError, "OFPET_PORT_MOD_FAILED", INT2NUM( OFPET_PORT_MOD_FAILED ) );
202
- rb_define_const( cError, "OFPET_QUEUE_OP_FAILED", INT2NUM( OFPET_QUEUE_OP_FAILED ) );
203
-
204
- rb_define_const( cError, "OFPHFC_INCOMPATIBLE", INT2NUM( OFPHFC_INCOMPATIBLE ) );
205
- rb_define_const( cError, "OFPHFC_EPERM", INT2NUM( OFPHFC_EPERM ) );
206
-
207
- rb_define_const( cError, "OFPBRC_BAD_VERSION", INT2NUM( OFPBRC_BAD_VERSION ) );
208
- rb_define_const( cError, "OFPBRC_BAD_TYPE", INT2NUM( OFPBRC_BAD_TYPE ) );
209
- rb_define_const( cError, "OFPBRC_BAD_STAT", INT2NUM( OFPBRC_BAD_STAT ) );
210
- rb_define_const( cError, "OFPBRC_BAD_VENDOR", INT2NUM( OFPBRC_BAD_VENDOR ) );
211
- rb_define_const( cError, "OFPBRC_BAD_SUBTYPE", INT2NUM( OFPBRC_BAD_SUBTYPE ) );
212
- rb_define_const( cError, "OFPBRC_EPERM", INT2NUM( OFPBRC_EPERM ) );
213
- rb_define_const( cError, "OFPBRC_BAD_LEN", INT2NUM( OFPBRC_BAD_LEN ) );
214
- rb_define_const( cError, "OFPBRC_BUFFER_EMPTY", INT2NUM( OFPBRC_BUFFER_EMPTY ) );
215
- rb_define_const( cError, "OFPBRC_BUFFER_UNKNOWN", INT2NUM( OFPBRC_BUFFER_UNKNOWN ) );
216
-
217
- rb_define_const( cError, "OFPBAC_BAD_TYPE", INT2NUM( OFPBAC_BAD_TYPE ) );
218
- rb_define_const( cError, "OFPBAC_BAD_LEN", INT2NUM( OFPBAC_BAD_LEN ) );
219
- rb_define_const( cError, "OFPBAC_BAD_VENDOR", INT2NUM( OFPBAC_BAD_VENDOR ) );
220
- rb_define_const( cError, "OFPBAC_BAD_VENDOR_TYPE", INT2NUM( OFPBAC_BAD_VENDOR_TYPE ) );
221
- rb_define_const( cError, "OFPBAC_BAD_OUT_PORT", INT2NUM( OFPBAC_BAD_OUT_PORT ) );
222
- rb_define_const( cError, "OFPBAC_BAD_ARGUMENT", INT2NUM( OFPBAC_BAD_ARGUMENT ) );
223
- rb_define_const( cError, "OFPBAC_EPERM", INT2NUM( OFPBAC_EPERM ) );
224
- rb_define_const( cError, "OFPBAC_TOO_MANY", INT2NUM( OFPBAC_TOO_MANY ) );
225
- rb_define_const( cError, "OFPBAC_BAD_QUEUE", INT2NUM( OFPBAC_BAD_QUEUE ) );
226
-
227
- rb_define_const( cError, "OFPFMFC_ALL_TABLES_FULL", INT2NUM( OFPFMFC_ALL_TABLES_FULL ) );
228
- rb_define_const( cError, "OFPFMFC_OVERLAP", INT2NUM( OFPFMFC_OVERLAP ) );
229
- rb_define_const( cError, "OFPFMFC_EPERM", INT2NUM( OFPFMFC_EPERM ) );
230
- rb_define_const( cError, "OFPFMFC_BAD_EMERG_TIMEOUT", INT2NUM( OFPFMFC_BAD_EMERG_TIMEOUT ) );
231
- rb_define_const( cError, "OFPFMFC_BAD_COMMAND", INT2NUM( OFPFMFC_BAD_COMMAND ) );
232
- rb_define_const( cError, "OFPFMFC_UNSUPPORTED", INT2NUM( OFPFMFC_UNSUPPORTED ) );
233
-
234
- rb_define_const( cError, "OFPPMFC_BAD_PORT", INT2NUM( OFPPMFC_BAD_PORT ) );
235
- rb_define_const( cError, "OFPPMFC_BAD_HW_ADDR", INT2NUM( OFPPMFC_BAD_HW_ADDR ) );
236
-
237
- rb_define_const( cError, "OFPQOFC_BAD_PORT", INT2NUM(OFPQOFC_BAD_PORT));
238
- rb_define_const( cError, "OFPQOFC_BAD_QUEUE", INT2NUM(OFPQOFC_BAD_QUEUE));
239
- rb_define_const( cError, "OFPQOFC_EPERM", INT2NUM(OFPQOFC_EPERM));
240
242
 
243
+ rb_define_alloc_func( cError, error_alloc );
244
+ rb_define_method( cError, "initialize", error_init, -1 );
241
245
  rb_define_method( cError, "transaction_id", error_transaction_id, 0 );
242
- rb_define_method( cError, "user_data", error_user_data, 0 );
246
+ rb_alias( cError, rb_intern( "xid" ), rb_intern( "transaction_id" ) );
247
+ rb_define_method( cError, "data", error_data, 0 );
243
248
  rb_define_method( cError, "error_type", error_type, 0 );
244
249
  rb_define_method( cError, "code", error_code, 0 );
245
250
  }