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
@@ -24,6 +24,7 @@
24
24
 
25
25
  extern VALUE mTrema;
26
26
  VALUE cStatsRequest;
27
+ VALUE cDescStatsRequest;
27
28
  VALUE cFlowStatsRequest;
28
29
  VALUE cAggregateStatsRequest;
29
30
  VALUE cTableStatsRequest;
@@ -119,6 +120,13 @@ subclass_stats_request_init( VALUE self, VALUE options ) {
119
120
  }
120
121
 
121
122
 
123
+ static VALUE
124
+ desc_stats_request_alloc( VALUE klass ) {
125
+ buffer *desc_stats_request = create_desc_stats_request( MY_TRANSACTION_ID, NO_FLAGS );
126
+ return Data_Wrap_Struct( klass, NULL, free_buffer, desc_stats_request );
127
+ }
128
+
129
+
122
130
  static VALUE
123
131
  flow_stats_request_alloc( VALUE klass ) {
124
132
  buffer *flow_stats_request = create_flow_stats_request( MY_TRANSACTION_ID, NO_FLAGS, MATCH, TABLE_ID, OUT_PORT );
@@ -226,7 +234,7 @@ stats_out_port( VALUE self ) {
226
234
  /*
227
235
  * Restrict port statistics to a specific port_no or to all ports.
228
236
  *
229
- * @return [Number] the value of port_no.
237
+ @return [Number] the value of port_no.
230
238
  */
231
239
  static VALUE
232
240
  stats_port_no( VALUE self ) {
@@ -274,11 +282,47 @@ get_stats_request_table_id( VALUE self ) {
274
282
  }
275
283
 
276
284
 
277
- struct ofp_match
278
- get_stats_request_match( VALUE self ) {
279
- const struct ofp_match *match;
280
- Data_Get_Struct( rb_iv_get( self, "@match" ), struct ofp_match, match );
281
- return *match;
285
+ static VALUE
286
+ parse_common_arguments( int argc, VALUE *argv, VALUE self ) {
287
+ VALUE options;
288
+ if ( !rb_scan_args( argc, argv, "01", &options )) {
289
+ options = rb_hash_new();
290
+ }
291
+ rb_call_super( 1, &options );
292
+ buffer *message;
293
+ Data_Get_Struct( self, buffer, message );
294
+ ( ( struct ofp_header * ) ( message->data ) )->xid = htonl( get_stats_request_num2uint( self, "@transaction_id" ) );
295
+ struct ofp_stats_request *stats_request;
296
+ stats_request = ( struct ofp_stats_request * ) message->data;
297
+ stats_request->flags = htons ( get_stats_request_num2uint16( self, "@flags" ) );
298
+ return self;
299
+ }
300
+
301
+
302
+ /*
303
+ * A {DescStatsRequest} object instance to request descriptive information of vswitch.
304
+ * Such information includes switch manufacturer, hardware revision and serial number
305
+ *
306
+ * @overload initialize(options={})
307
+ *
308
+ * @example
309
+ * DescStatsRequest.new(
310
+ * :transaction_id => 1234
311
+ * )
312
+ *
313
+ * @param [Hash] options
314
+ * the options to create a message with.
315
+ *
316
+ * @option options [Number] :transaction_id
317
+ * set the transaction_id as specified or auto-generate it.
318
+ *
319
+ * @return [TableStatsRequest]
320
+ * an object that encapsulates the +OFPT_STATS_REQUEST(OFPST_DSST)+ openflow
321
+ * message.
322
+ */
323
+ static VALUE
324
+ desc_stats_request_init( int argc, VALUE *argv, VALUE self ) {
325
+ return parse_common_arguments( argc, argv, self );
282
326
  }
283
327
 
284
328
 
@@ -327,8 +371,9 @@ flow_stats_request_init( VALUE self, VALUE options ) {
327
371
 
328
372
  stats_request->flags = htons ( get_stats_request_num2uint16( self, "@flags" ) );
329
373
 
330
- struct ofp_match m = get_stats_request_match( self );
331
- hton_match( &flow_stats_request->match, &m ) ;
374
+ const struct ofp_match *match;
375
+ Data_Get_Struct( rb_iv_get( self, "@match" ), struct ofp_match, match );
376
+ hton_match( &flow_stats_request->match, match );
332
377
  flow_stats_request->table_id = get_stats_request_table_id( self );
333
378
  flow_stats_request->out_port = htons( get_stats_request_num2uint16( self, "@out_port" ) );
334
379
  return self;
@@ -379,8 +424,9 @@ aggregate_stats_request_init( VALUE self, VALUE options ) {
379
424
 
380
425
  stats_request->flags = htons ( get_stats_request_num2uint16( self, "@flags" ) );
381
426
 
382
- struct ofp_match m = get_stats_request_match( self );
383
- hton_match( &aggregate_stats_request->match, &m ) ;
427
+ const struct ofp_match *match;
428
+ Data_Get_Struct( rb_iv_get( self, "@match" ), struct ofp_match, match );
429
+ hton_match( &aggregate_stats_request->match, match );
384
430
  aggregate_stats_request->table_id = get_stats_request_table_id( self );
385
431
  aggregate_stats_request->out_port = htons( get_stats_request_num2uint16( self, "@out_port" ) );
386
432
  return self;
@@ -411,18 +457,7 @@ aggregate_stats_request_init( VALUE self, VALUE options ) {
411
457
  */
412
458
  static VALUE
413
459
  table_stats_request_init( int argc, VALUE *argv, VALUE self ) {
414
- VALUE options;
415
- if ( !rb_scan_args( argc, argv, "01", &options )) {
416
- options = rb_hash_new();
417
- }
418
- rb_call_super( 1, &options );
419
- buffer *message;
420
- Data_Get_Struct( self, buffer, message );
421
- ( ( struct ofp_header * ) ( message->data ) )->xid = htonl( get_stats_request_num2uint( self, "@transaction_id" ) );
422
- struct ofp_stats_request *stats_request;
423
- stats_request = ( struct ofp_stats_request * ) message->data;
424
- stats_request->flags = htons ( get_stats_request_num2uint16( self, "@flags" ) );
425
- return self;
460
+ return parse_common_arguments( argc, argv, self );
426
461
  }
427
462
 
428
463
 
@@ -586,11 +621,17 @@ vendor_stats_request_init( int argc, VALUE *argv, VALUE self ) {
586
621
  void
587
622
  Init_stats_request(){
588
623
  cStatsRequest = rb_define_class_under( mTrema, "StatsRequest", rb_cObject );
624
+
625
+ cDescStatsRequest = rb_define_class_under( mTrema, "DescStatsRequest", cStatsRequest );
626
+ rb_define_alloc_func( cDescStatsRequest, desc_stats_request_alloc );
627
+ rb_define_method( cDescStatsRequest, "initialize", desc_stats_request_init, -1 );
628
+
589
629
  cFlowStatsRequest = rb_define_class_under( mTrema, "FlowStatsRequest", cStatsRequest );
590
630
  rb_define_method( cStatsRequest, "initialize", stats_request_init, 1 );
591
631
  rb_define_method( cStatsRequest, "transaction_id", stats_transaction_id, 0 );
632
+ rb_alias( cStatsRequest, rb_intern( "xid" ), rb_intern( "transaction_id" ) );
592
633
  rb_define_method( cStatsRequest, "flags", stats_flags, 0 );
593
-
634
+
594
635
  rb_define_alloc_func( cFlowStatsRequest, flow_stats_request_alloc );
595
636
  rb_define_method( cFlowStatsRequest, "initialize", flow_stats_request_init, 1 );
596
637
  rb_define_method( cFlowStatsRequest, "match", stats_match, 0 );
@@ -0,0 +1,41 @@
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
+
21
+
22
+ module Trema
23
+ #
24
+ # Strips the VLAN tag of a packet.
25
+ #
26
+ class StripVlanHeader < Action
27
+ #
28
+ # Creates an action that strips the VLAN tag of a packet.
29
+ #
30
+ def initialize
31
+ # Do nothing.
32
+ end
33
+ end
34
+ end
35
+
36
+
37
+ ### Local variables:
38
+ ### mode: Ruby
39
+ ### coding: utf-8-unix
40
+ ### indent-tabs-mode: nil
41
+ ### End:
@@ -0,0 +1,196 @@
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 "chibach.h"
20
+ #include "flow-mod.h"
21
+ #include "logger.h"
22
+ #include "ruby.h"
23
+ #include "rubysig.h"
24
+ #include "switch.h"
25
+
26
+
27
+ VALUE mTrema;
28
+ VALUE cSwitch;
29
+
30
+
31
+ static VALUE
32
+ switch_send_message( VALUE self, VALUE message ) {
33
+ buffer *buf;
34
+ Data_Get_Struct( message, buffer, buf );
35
+ switch_send_openflow_message( buf );
36
+ return self;
37
+ }
38
+
39
+
40
+ static void
41
+ handle_controller_connected( void *rbswitch ) {
42
+ if ( rb_respond_to( ( VALUE ) rbswitch, rb_intern( "controller_connected" ) ) == Qtrue ) {
43
+ rb_funcall( ( VALUE ) rbswitch, rb_intern( "controller_connected" ), 0 );
44
+ }
45
+ }
46
+
47
+
48
+ static void
49
+ handle_hello( uint32_t transaction_id, uint8_t version, void *rbswitch ) {
50
+ if ( rb_respond_to( ( VALUE ) rbswitch, rb_intern( "hello" ) ) == Qtrue ) {
51
+ rb_funcall( ( VALUE ) rbswitch, rb_intern( "hello" ), 2, UINT2NUM( transaction_id ), UINT2NUM( version ) );
52
+ }
53
+ }
54
+
55
+
56
+ static void
57
+ handle_features_request( uint32_t transaction_id, void *rbswitch ) {
58
+ if ( rb_respond_to( ( VALUE ) rbswitch, rb_intern( "features_request" ) ) == Qtrue ) {
59
+ rb_funcall( ( VALUE ) rbswitch, rb_intern( "features_request" ), 1, UINT2NUM( transaction_id ) );
60
+ }
61
+ }
62
+
63
+
64
+ static void
65
+ handle_set_config( uint32_t transaction_id, uint16_t flags, uint16_t miss_send_len, void *rbswitch ) {
66
+ if ( rb_respond_to( ( VALUE ) rbswitch, rb_intern( "set_config" ) ) == Qtrue ) {
67
+ rb_funcall( ( VALUE ) rbswitch, rb_intern( "set_config" ), 3, UINT2NUM( transaction_id ), UINT2NUM( flags ), UINT2NUM( miss_send_len ) );
68
+ }
69
+ }
70
+
71
+
72
+ static void
73
+ handle_flow_mod(
74
+ uint32_t transaction_id,
75
+ struct ofp_match match,
76
+ uint64_t cookie,
77
+ uint16_t command,
78
+ uint16_t idle_timeout,
79
+ uint16_t hard_timeout,
80
+ uint16_t priority,
81
+ uint32_t buffer_id,
82
+ uint16_t out_port,
83
+ uint16_t flags,
84
+ const openflow_actions *actions,
85
+ void *rbswitch
86
+ ){
87
+ UNUSED( match );
88
+ UNUSED( cookie );
89
+ UNUSED( priority );
90
+ UNUSED( buffer_id );
91
+ UNUSED( out_port );
92
+ UNUSED( flags );
93
+ UNUSED( actions );
94
+ if ( rb_respond_to( ( VALUE ) rbswitch, rb_intern( "flow_mod" ) ) == Qtrue ) {
95
+ VALUE options = rb_hash_new();
96
+ rb_hash_aset( options, ID2SYM( rb_intern( "transaction_id" ) ), UINT2NUM( transaction_id ) );
97
+ rb_hash_aset( options, ID2SYM( rb_intern( "command" ) ), UINT2NUM( command ) );
98
+ rb_hash_aset( options, ID2SYM( rb_intern( "idle_timeout" ) ), UINT2NUM( idle_timeout ) );
99
+ rb_hash_aset( options, ID2SYM( rb_intern( "hard_timeout" ) ), UINT2NUM( hard_timeout ) );
100
+ VALUE flow_mod = rb_funcall( cFlowMod, rb_intern( "new" ), 1, options );
101
+ rb_funcall( ( VALUE ) rbswitch, rb_intern( "flow_mod" ), 2, UINT2NUM( transaction_id ), flow_mod );
102
+ }
103
+ }
104
+
105
+
106
+ static void
107
+ handle_echo_request( uint32_t transaction_id, const buffer *body, void *rbswitch ) {
108
+ if ( rb_respond_to( ( VALUE ) rbswitch, rb_intern( "echo_request" ) ) == Qtrue ) {
109
+ VALUE rbody = rb_str_new( body->data, ( long ) body->length );
110
+ rb_funcall( ( VALUE ) rbswitch, rb_intern( "echo_request" ), 2, UINT2NUM( transaction_id ), rbody );
111
+ }
112
+ }
113
+
114
+
115
+ static VALUE
116
+ switch_run( VALUE self ) {
117
+ setenv( "CHIBACH_HOME", STR2CSTR( rb_funcall( mTrema, rb_intern( "home" ), 0 ) ), 1 );
118
+
119
+ VALUE name = rb_funcall( self, rb_intern( "name" ), 0 );
120
+ rb_gv_set( "$PROGRAM_NAME", name );
121
+
122
+ int argc = 6;
123
+ char **argv = xmalloc( sizeof( char * ) * ( uint32_t ) ( argc + 1 ) );
124
+ argv[ 0 ] = STR2CSTR( name );
125
+ argv[ 1 ] = ( char * ) ( uintptr_t ) "--name";
126
+ argv[ 2 ] = STR2CSTR( name );
127
+ argv[ 3 ] = ( char * ) ( uintptr_t ) "--datapath_id";
128
+ argv[ 4 ] = STR2CSTR( rb_funcall( rb_iv_get( self, "@dpid" ), rb_intern( "to_hex" ), 0 ) );
129
+ argv[ 5 ] = ( char * ) ( uintptr_t ) "--daemonize";
130
+ argv[ 6 ] = NULL;
131
+ init_chibach( &argc, &argv );
132
+ xfree( argv );
133
+
134
+ set_controller_connected_handler( handle_controller_connected, ( void * ) self );
135
+ set_hello_handler( handle_hello, ( void * ) self );
136
+ set_features_request_handler( handle_features_request, ( void * ) self );
137
+ set_set_config_handler( handle_set_config, ( void * ) self );
138
+ set_flow_mod_handler( handle_flow_mod, ( void * ) self );
139
+ set_echo_request_handler( handle_echo_request, ( void * ) self );
140
+
141
+ if ( rb_respond_to( self, rb_intern( "start" ) ) == Qtrue ) {
142
+ rb_funcall( self, rb_intern( "start" ), 0 );
143
+ }
144
+
145
+ rb_funcall( self, rb_intern( "start_chibach" ), 0 );
146
+
147
+ return self;
148
+ }
149
+
150
+
151
+ static void
152
+ thread_pass( void *user_data ) {
153
+ UNUSED( user_data );
154
+ CHECK_INTS;
155
+ rb_funcall( rb_cThread, rb_intern( "pass" ), 0 );
156
+ }
157
+
158
+
159
+ static VALUE
160
+ switch_start_chibach( VALUE self ) {
161
+ struct itimerspec interval;
162
+ interval.it_interval.tv_sec = 0;
163
+ interval.it_interval.tv_nsec = 1000000;
164
+ interval.it_value.tv_sec = 0;
165
+ interval.it_value.tv_nsec = 0;
166
+ add_timer_event_callback( &interval, thread_pass, NULL );
167
+
168
+ start_chibach();
169
+
170
+ return self;
171
+ }
172
+
173
+
174
+ /********************************************************************************
175
+ * Init Switch module.
176
+ ********************************************************************************/
177
+
178
+ void
179
+ Init_switch() {
180
+ cSwitch = rb_define_class_under( mTrema, "Switch", rb_cObject );
181
+ rb_include_module( cSwitch, mLogger );
182
+
183
+ rb_define_method( cSwitch, "run!", switch_run, 0 );
184
+ rb_define_method( cSwitch, "send_message", switch_send_message, 1 );
185
+ rb_define_private_method( cSwitch, "start_chibach", switch_start_chibach, 0 );
186
+
187
+ rb_require( "trema/switch" );
188
+ }
189
+
190
+
191
+ /*
192
+ * Local variables:
193
+ * c-basic-offset: 2
194
+ * indent-tabs-mode: nil
195
+ * End:
196
+ */
@@ -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,20 +16,20 @@
18
16
  */
19
17
 
20
18
 
21
- #ifndef ACTION_VENDOR_H
22
- #define ACTION_VENDOR_H
19
+ #ifndef SWITCH_H
20
+ #define SWITCH_H
23
21
 
24
22
 
25
23
  #include "ruby.h"
26
24
 
27
25
 
28
- extern VALUE cActionVendor;
26
+ extern VALUE cSwitch;
29
27
 
30
28
 
31
- void Init_action_vendor( void );
29
+ void Init_switch( void );
32
30
 
33
31
 
34
- #endif // ACTION_VENDOR_H
32
+ #endif // SWITCH_H
35
33
 
36
34
 
37
35
  /*
data/ruby/trema/switch.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
@@ -18,20 +16,41 @@
18
16
  #
19
17
 
20
18
 
21
- require "trema/network-component"
19
+ module Trema
20
+ class Switch
21
+ attr_reader :dpid
22
+ alias :datapath_id :dpid
22
23
 
23
24
 
24
- module Trema
25
- #
26
- # Keeps a list of {OpenflowSwitch} and {OpenVswitch}
27
- #
28
- class Switch < NetworkComponent
25
+ def self.inherited subclass
26
+ at_exit { subclass.new( eval ARGV[ 0 ] ).run! }
27
+ end
28
+
29
+
30
+ def initialize dpid
31
+ @dpid = dpid
32
+ end
33
+
34
+
35
+ def name
36
+ self.class.to_s.split( "::" ).last
37
+ end
38
+
39
+
40
+ def controller_connected
41
+ send_message Hello.new
42
+ end
43
+
44
+
45
+ def features_request xid
46
+ send_message FeaturesReply.new( :datapath_id => @dpid, :transaction_id => xid )
47
+ end
29
48
  end
30
49
  end
31
50
 
32
51
 
33
52
  ### Local variables:
34
53
  ### mode: Ruby
35
- ### coding: utf-8-unix
54
+ ### coding: utf-8
36
55
  ### indent-tabs-mode: nil
37
56
  ### End: