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,42 +0,0 @@
1
- /*
2
- * Author: Nick Karanatsios <nickkaranatsios@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
- #ifndef ACTION_SET_VLAN_VID_H
22
- #define ACTION_SET_VLAN_VID_H
23
-
24
-
25
- #include "ruby.h"
26
-
27
-
28
- extern VALUE cActionSetVlanVid;
29
-
30
-
31
- void Init_action_set_vlan_vid( void );
32
-
33
-
34
- #endif // ACTION_SET_VLAN_VID_H
35
-
36
-
37
- /*
38
- * Local variables:
39
- * c-basic-offset: 2
40
- * indent-tabs-mode: nil
41
- * End:
42
- */
@@ -1,81 +0,0 @@
1
- /*
2
- * Author: Nick Karanatsios <nickkaranatsios@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
- #include "trema.h"
22
- #include "ruby.h"
23
-
24
-
25
- extern VALUE mTrema;
26
- VALUE cActionStripVlan;
27
-
28
-
29
- /*
30
- * Strips the VLAN tag of a packet.
31
- *
32
- * @overload initialize()
33
- *
34
- * @return [ActionStripVlan] an object that encapsulates this action.
35
- */
36
- static VALUE
37
- action_strip_vlan_init( VALUE self ) {
38
- return self;
39
- }
40
-
41
-
42
- /*
43
- * Appends its action(strip VLAN tag) to the list of actions.
44
- *
45
- * @return [ActionStripVlan] self
46
- */
47
- static VALUE
48
- action_strip_vlan_append( VALUE self, VALUE action_ptr ) {
49
- openflow_actions *actions;
50
- Data_Get_Struct( action_ptr, openflow_actions, actions );
51
- append_action_strip_vlan( actions );
52
- return self;
53
- }
54
-
55
-
56
- /*
57
- * (see ActionEnqueue#inspect)
58
- */
59
- static VALUE
60
- action_strip_vlan_inspect( VALUE self ) {
61
- char str[ 64 ];
62
- sprintf( str, "#<%s>", rb_obj_classname( self ) );
63
- return rb_str_new2( str );
64
- }
65
-
66
-
67
- void
68
- Init_action_strip_vlan() {
69
- cActionStripVlan = rb_define_class_under( mTrema, "ActionStripVlan", rb_cObject );
70
- rb_define_method( cActionStripVlan, "initialize", action_strip_vlan_init, 0 );
71
- rb_define_method( cActionStripVlan, "append", action_strip_vlan_append, 1 );
72
- rb_define_method( cActionStripVlan, "inspect", action_strip_vlan_inspect, 0 );
73
- }
74
-
75
-
76
- /*
77
- * Local variables:
78
- * c-basic-offset: 2
79
- * indent-tabs-mode: nil
80
- * End:
81
- */
@@ -1,42 +0,0 @@
1
- /*
2
- * Author: Nick Karanatsios <nickkaranatsios@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
- #ifndef ACTION_STRIP_VLAN_H
22
- #define ACTION_STRIP_VLAN_H
23
-
24
-
25
- #include "ruby.h"
26
-
27
-
28
- extern VALUE cActionStripVlan;
29
-
30
-
31
- void Init_action_strip_vlan( void );
32
-
33
-
34
- #endif // ACTION_STRIP_VLAN_H
35
-
36
-
37
- /*
38
- * Local variables:
39
- * c-basic-offset: 2
40
- * indent-tabs-mode: nil
41
- * End:
42
- */
@@ -1,121 +0,0 @@
1
- /*
2
- * Author: Nick Karanatsios <nickkaranatsios@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
- #include "trema.h"
22
- #include "ruby.h"
23
-
24
-
25
- extern VALUE mTrema;
26
- VALUE cActionVendor;
27
-
28
-
29
- /*
30
- * An action to set vendor specific extensions.
31
- *
32
- * @overload initialize(options={})
33
- *
34
- * @example
35
- * ActionVendor.new( :vendor => VENDOR_ID )
36
- * @param [Hash] options
37
- * the options hash to create this action class instance with.
38
- *
39
- * @option options [Number] vendor
40
- * the vendor id this action refers to.
41
- *
42
- * @raise [ArgumentError] if vendor argument is not supplied.
43
- * @raise [ArgumentError] if vendor is not an unsigned 32-bit integer.
44
- * @raise [TypeError] if options is not a Hash.
45
- *
46
- * @return [ActionVendor]
47
- * an object that encapsulates this action.
48
- */
49
- static VALUE
50
- action_vendor_init( int argc, VALUE *argv, VALUE self ) {
51
- VALUE options;
52
-
53
- if ( rb_scan_args( argc, argv, "10", &options ) == 1 ) {
54
- Check_Type( options, T_HASH );
55
- VALUE vendor;
56
- if ( ( vendor = rb_hash_aref( options, ID2SYM( rb_intern( "vendor" ) ) ) ) != Qnil ) {
57
- if ( rb_funcall( vendor, rb_intern( "unsigned_32bit?" ), 0 ) == Qfalse ) {
58
- rb_raise( rb_eArgError, "Vendor id must be an unsigned 32-bit integer" );
59
- }
60
- rb_iv_set( self, "@vendor", vendor );
61
- }
62
- }
63
- return self;
64
- }
65
-
66
-
67
- /*
68
- * The vendor id of this action.
69
- *
70
- * @return [Number] the value of vendor.
71
- */
72
- static VALUE
73
- action_get_vendor( VALUE self ) {
74
- return rb_iv_get( self, "@vendor" );
75
- }
76
-
77
-
78
- /*
79
- * Appends its action(vendor) to the list of actions.
80
- *
81
- * @return [ActionVendor] self
82
- */
83
- static VALUE
84
- action_vendor_append( VALUE self, VALUE action_ptr ) {
85
- openflow_actions *actions;
86
- uint32_t vendor = ( uint32_t ) NUM2UINT( action_get_vendor( self ) );
87
-
88
- Data_Get_Struct( action_ptr, openflow_actions, actions );
89
- append_action_vendor( actions, vendor, NULL );
90
- return self;
91
- }
92
-
93
-
94
- /*
95
- * (see ActionEnqueue#inspect)
96
- */
97
- static VALUE
98
- action_vendor_inspect( VALUE self ) {
99
- uint32_t vendor = ( uint32_t ) NUM2UINT( action_get_vendor( self ) );
100
- char str[ 64 ];
101
- sprintf( str, "#<%s vendor=%u>", rb_obj_classname( self ), vendor );
102
- return rb_str_new2( str );
103
- }
104
-
105
-
106
- void
107
- Init_action_vendor() {
108
- cActionVendor = rb_define_class_under( mTrema, "ActionVendor", rb_cObject );
109
- rb_define_method( cActionVendor, "initialize", action_vendor_init, -1 );
110
- rb_define_method( cActionVendor, "vendor", action_get_vendor, 0 );
111
- rb_define_method( cActionVendor, "append", action_vendor_append, 1 );
112
- rb_define_method( cActionVendor, "inspect", action_vendor_inspect, 0 );
113
- }
114
-
115
-
116
- /*
117
- * Local variables:
118
- * c-basic-offset: 2
119
- * indent-tabs-mode: nil
120
- * End:
121
- */
@@ -1,193 +0,0 @@
1
- /*
2
- * Author: Nick Karanatsios <nickkaranatsios@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
- #include "trema.h"
22
- #include "ruby.h"
23
-
24
-
25
- #define VENDOR_ID 0xccddeeff
26
-
27
-
28
- extern VALUE mTrema;
29
- VALUE cVendorRequest;
30
-
31
-
32
- static VALUE
33
- vendor_request_alloc( VALUE klass ) {
34
- buffer *data = alloc_buffer_with_length( 16 );
35
- append_back_buffer( data, 16 );
36
- memset( data->data, 'a', 16 );
37
- buffer *vendor_request = create_vendor( get_transaction_id(), VENDOR_ID, data );
38
- free_buffer( data );
39
-
40
- return Data_Wrap_Struct( klass, NULL, free_buffer, vendor_request );
41
- }
42
-
43
-
44
- /*
45
- * Creates a {VendorRequest} instance to facilitate sending of vendor
46
- * experimental messages.
47
- *
48
- * @overload initialize(options={})
49
- *
50
- * @example
51
- * vendor_data = "test".unpack( "C*" ) => [ 116, 101, 115, 116 ]
52
- * VendorRequest.new
53
- * VendorRequest.new( :vendor_id => 0x3000 )
54
- * VendorRequest.new( :vendor_id => 0x3000, :vendor_data => vendor_data )
55
- * VendorRequest.new( :vendor_id => 0x3000, :vendor_data => vendor_data, :transaction_id => 123 )
56
- *
57
- * @param [Hash] options
58
- * the options to create a message with.
59
- *
60
- * @option options [Number] :transaction_id
61
- * Auto-generated transaction_id if not specified.
62
- *
63
- * @option options [Number] :vendor_id
64
- * The assigned vendor id defaults to 0xccddeeff if not specified.
65
- *
66
- * @option options [Array] :vendor_data
67
- * Fixed 16 bytes of data if not specified. User can set upto 16 bytes of any
68
- * vendor specific data.
69
- *
70
- * @raise [ArgumentError] if transaction id is not an unsigned 32-bit integer.
71
- * @raise [ArgumentError] if user data is not an array of bytes.
72
- * @raise [TypeError] if options is not a hash.
73
- *
74
- * @return [VendorRequest]
75
- * an object that encapsulates the +OFPT_VENDOR+ OpenFlow message.
76
- */
77
- static VALUE
78
- vendor_request_init( int argc, VALUE *argv, VALUE self ) {
79
- buffer *vendor_request;
80
- uint32_t xid = get_transaction_id();
81
- uint32_t vendor = VENDOR_ID;
82
- VALUE options;
83
-
84
- Data_Get_Struct( self, buffer, vendor_request );
85
- if ( rb_scan_args( argc, argv, "01", &options ) == 1 ) {
86
- Check_Type( options, T_HASH );
87
- VALUE xid_r;
88
- if ( ( xid_r = rb_hash_aref( options, ID2SYM( rb_intern( "transaction_id" ) ) ) ) != Qnil ) {
89
- if ( rb_funcall( xid_r, rb_intern( "unsigned_32bit?" ), 0 ) == Qfalse ) {
90
- rb_raise( rb_eArgError, "Transaction ID must be an unsigned 32-bit integer" );
91
- }
92
- xid = ( uint32_t ) NUM2UINT( xid_r );
93
- }
94
- VALUE vendor_r;
95
- if ( ( vendor_r = rb_hash_aref( options, ID2SYM( rb_intern( "vendor_id" ) ) ) ) != Qnil ) {
96
- vendor = ( uint32_t ) NUM2UINT( vendor_r );
97
- }
98
- VALUE data_r;
99
- if ( ( data_r = rb_hash_aref( options, ID2SYM( rb_intern( "vendor_data" ) ) ) ) != Qnil ) {
100
- if ( TYPE( data_r ) == T_ARRAY ) {
101
- uint8_t *buf;
102
- uint16_t data_length = ( uint16_t ) ( vendor_request->length - sizeof( struct ofp_vendor_header ) );
103
- int32_t i;
104
- buf = ( uint8_t * ) ( ( char * ) vendor_request->data + sizeof( struct ofp_vendor_header ) );
105
- memset( buf, 0, data_length );
106
- for ( i = 0; i < data_length && i < RARRAY( data_r )->len; i++ ) {
107
- buf[ i ] = ( uint8_t ) FIX2INT( RARRAY_PTR( data_r )[ i ] );
108
- }
109
- }
110
- else {
111
- rb_raise( rb_eTypeError, "Vendor data must be specified as an array of bytes" );
112
- }
113
- }
114
- }
115
- ( ( struct ofp_header * ) ( vendor_request->data ) )->xid = htonl( xid );
116
- ( ( struct ofp_vendor_header * ) ( vendor_request->data ) )->vendor = htonl( vendor );
117
- return self;
118
- }
119
-
120
-
121
- /*
122
- * Transaction ids, message sequence numbers matching requests to replies.
123
- *
124
- * @return [Number] the value of transaction id.
125
- */
126
- static VALUE
127
- vendor_request_transaction_id( VALUE self ) {
128
- buffer *vendor_request;
129
- Data_Get_Struct( self, buffer, vendor_request );
130
- uint32_t xid = ntohl( ( ( struct ofp_header * ) ( vendor_request->data ) )->xid );
131
- return UINT2NUM( xid );
132
- }
133
-
134
-
135
- /*
136
- * A 32-bit value that uniquely identifies the vendor.
137
- *
138
- * @return [Number] the value of vendor id.
139
- */
140
- static VALUE
141
- vendor_request_vendor( VALUE self ) {
142
- buffer *vendor_request;
143
- Data_Get_Struct( self, buffer, vendor_request );
144
- uint32_t vendor = ntohl( ( ( struct ofp_vendor_header * ) ( vendor_request->data ) )->vendor );
145
- return UINT2NUM( vendor );
146
- }
147
-
148
-
149
- /*
150
- * Vendor specific data payload.
151
- *
152
- * @return [Array] an array of data payload bytes.
153
- * @return [nil] vendor specific data not found.
154
- */
155
- static VALUE
156
- vendor_request_data( VALUE self ) {
157
- VALUE data_arr;
158
- buffer *vendor_request;
159
- uint8_t *buf;
160
- uint32_t i;
161
-
162
- Data_Get_Struct( self, buffer, vendor_request );
163
- uint16_t data_length = ( uint16_t ) ( vendor_request->length - sizeof ( struct ofp_vendor_header ) );
164
-
165
- if ( data_length > 0 ) {
166
- data_arr = rb_ary_new2( data_length );
167
- buf = ( uint8_t * ) ( ( char * ) vendor_request->data + sizeof ( struct ofp_vendor_header ) );
168
- for ( i = 0; i < data_length; i++ ) {
169
- rb_ary_push( data_arr, INT2FIX( buf[i] ) );
170
- }
171
- return data_arr;
172
- }
173
- return Qnil;
174
- }
175
-
176
-
177
- void
178
- Init_vendor_request() {
179
- cVendorRequest = rb_define_class_under( mTrema, "VendorRequest", rb_cObject );
180
- rb_define_alloc_func( cVendorRequest, vendor_request_alloc );
181
- rb_define_method( cVendorRequest, "initialize", vendor_request_init, -1 );
182
- rb_define_method( cVendorRequest, "transaction_id", vendor_request_transaction_id, 0 );
183
- rb_define_method( cVendorRequest, "vendor", vendor_request_vendor, 0 );
184
- rb_define_method( cVendorRequest, "data", vendor_request_data, 0 );
185
- }
186
-
187
-
188
- /*
189
- * Local variables:
190
- * c-basic-offset: 2
191
- * indent-tabs-mode: nil
192
- * End:
193
- */