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,7 +1,7 @@
1
1
  /*
2
- * Ruby wrapper class for OFPT_VENDOR message.
2
+ * OpenFlow Switch Listener
3
3
  *
4
- * Author: Nick Karanatsios <nickkaranatsios@gmail.com>
4
+ * Author: Yasunobu Chiba
5
5
  *
6
6
  * Copyright (C) 2008-2012 NEC Corporation
7
7
  *
@@ -20,20 +20,21 @@
20
20
  */
21
21
 
22
22
 
23
- #ifndef VENDOR_REQUEST_H
24
- #define VENDOR_REQUEST_H
23
+ #ifndef SECURE_CANNEL_H
24
+ #define SECURE_CANNEL_H
25
25
 
26
26
 
27
- #include "ruby.h"
27
+ typedef void ( *connected_handler )( void );
28
+ typedef void ( *disconnected_handler ) ( void );
28
29
 
29
30
 
30
- extern VALUE cVendorRequest;
31
+ bool init_secure_channel( uint32_t ip, uint16_t port,
32
+ connected_handler connected_callback, disconnected_handler disconnected_callback );
33
+ bool finalize_secure_channel();
34
+ bool send_message_to_secure_channel( buffer *message );
31
35
 
32
36
 
33
- void Init_vendor_request( void );
34
-
35
-
36
- #endif // VENDOR_REQUEST_H
37
+ #endif // SECURE_CANNEL_H
37
38
 
38
39
 
39
40
  /*
data/src/lib/tcp.h CHANGED
@@ -24,9 +24,6 @@
24
24
  #define TCP_H
25
25
 
26
26
 
27
- #include <endian.h>
28
-
29
-
30
27
  typedef struct tcp_header {
31
28
  uint16_t src_port;
32
29
  uint16_t dst_port;
data/src/lib/trema.c CHANGED
@@ -50,7 +50,7 @@
50
50
  #undef init_log
51
51
  #endif
52
52
  #define init_log mock_init_log
53
- bool mock_init_log( const char *ident, const char *log_directory, bool run_as_daemon );
53
+ bool mock_init_log( const char *ident, const char *log_directory, logging_type type );
54
54
 
55
55
  #ifdef error
56
56
  #undef error
@@ -275,6 +275,7 @@ static char *executable_name = NULL;
275
275
  static char *trema_log = NULL;
276
276
  static char *trema_pid = NULL;
277
277
  static char *trema_sock = NULL;
278
+ static logging_type log_output_type = LOGGING_TYPE_FILE;
278
279
  static pthread_mutex_t mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
279
280
 
280
281
 
@@ -282,10 +283,11 @@ static struct option long_options[] = {
282
283
  { "name", 1, NULL, 'n' },
283
284
  { "daemonize", 0, NULL, 'd' },
284
285
  { "logging_level", 1, NULL, 'l' },
286
+ { "syslog", 0, NULL, 'g' },
285
287
  { "help", 0, NULL, 'h' },
286
288
  { NULL, 0, NULL, 0 },
287
289
  };
288
- static char short_options[] = "n:dl:h";
290
+ static char short_options[] = "n:dl:gh";
289
291
 
290
292
 
291
293
  /**
@@ -302,6 +304,7 @@ usage() {
302
304
  " -n, --name=SERVICE_NAME service name\n"
303
305
  " -d, --daemonize run in the background\n"
304
306
  " -l, --logging_level=LEVEL set logging level\n"
307
+ " -g, --syslog output log messages to syslog\n"
305
308
  " -h, --help display this help and exit\n",
306
309
  executable_name
307
310
  );
@@ -437,6 +440,9 @@ parse_argv( int *argc, char ***argv ) {
437
440
  case 'l':
438
441
  set_logging_level( optarg );
439
442
  break;
443
+ case 'g':
444
+ log_output_type = LOGGING_TYPE_SYSLOG;
445
+ break;
440
446
  case 'h':
441
447
  usage();
442
448
  xfree( trema_name );
@@ -494,6 +500,28 @@ set_exit_handler() {
494
500
  }
495
501
 
496
502
 
503
+ static void
504
+ do_restart_log() {
505
+ restart_log( NULL );
506
+ }
507
+
508
+
509
+ static void
510
+ set_do_restart_log_as_external_callback() {
511
+ set_external_callback( do_restart_log );
512
+ }
513
+
514
+
515
+ static void
516
+ set_hup_handler() {
517
+ struct sigaction signal_hup;
518
+
519
+ memset( &signal_hup, 0, sizeof( struct sigaction ) );
520
+ signal_hup.sa_handler = ( void * ) set_do_restart_log_as_external_callback;
521
+ sigaction( SIGHUP, &signal_hup, NULL );
522
+ }
523
+
524
+
497
525
  static void
498
526
  set_dump_stats_as_external_callback() {
499
527
  set_external_callback( dump_stats );
@@ -561,14 +589,19 @@ init_trema( int *argc, char ***argv ) {
561
589
  initialized = false;
562
590
  trema_started = false;
563
591
  run_as_daemon = false;
592
+ log_output_type = LOGGING_TYPE_FILE;
564
593
 
565
594
  parse_argv( argc, argv );
566
595
  set_trema_home();
567
596
  set_trema_tmp();
568
597
  check_trema_tmp();
569
- init_log( get_trema_name(), get_trema_log(), run_as_daemon );
598
+ if ( !run_as_daemon ) {
599
+ log_output_type |= LOGGING_TYPE_STDOUT;
600
+ }
601
+ init_log( get_trema_name(), get_trema_log(), log_output_type );
570
602
  ignore_sigpipe();
571
603
  set_exit_handler();
604
+ set_hup_handler();
572
605
  set_usr1_handler();
573
606
  set_usr2_handler();
574
607
  init_messenger( get_trema_sock() );
@@ -638,14 +671,14 @@ set_trema_name( const char *name ) {
638
671
  if ( trema_name != NULL ) {
639
672
  if ( trema_started ) {
640
673
  rename_pid( get_trema_pid(), trema_name, name );
641
- rename_log( trema_name, name, get_trema_log() );
674
+ rename_log( name );
642
675
  }
643
676
  xfree( trema_name );
644
677
  }
645
678
  trema_name = xstrdup( name );
646
679
 
647
680
  if ( initialized ) {
648
- restart_log( trema_name, get_trema_log() );
681
+ restart_log( trema_name );
649
682
  }
650
683
  }
651
684
 
@@ -1,7 +1,9 @@
1
1
  /*
2
- * Author: Nick Karanatsios <nickkaranatsios@gmail.com>
2
+ * Trema C++ wrapper.
3
3
  *
4
- * Copyright (C) 2008-2012 NEC Corporation
4
+ * Author: Vladimir Olteanu <vladimir.olteanu@cs.pub.ro>
5
+ *
6
+ * Copyright (C) 2012 Vladimir Olteanu
5
7
  *
6
8
  * This program is free software; you can redistribute it and/or modify
7
9
  * it under the terms of the GNU General Public License, version 2, as
@@ -18,20 +20,27 @@
18
20
  */
19
21
 
20
22
 
21
- #ifndef ACTION_SET_NW_DST_H
22
- #define ACTION_SET_NW_DST_H
23
+ #ifndef TREMA_HPP
24
+ #define TREMA_HPP
23
25
 
24
26
 
25
- #include "ruby.h"
27
+ template <typename type1, typename type2> struct _types_compatible_p {
28
+ static const bool result = false;
29
+ };
26
30
 
31
+ template <typename type1> struct _types_compatible_p<type1, type1> {
32
+ static const bool result = true;
33
+ };
27
34
 
28
- extern VALUE cActionSetNwDst;
35
+ #define __builtin_types_compatible_p( type1, type2 ) _types_compatible_p< type1, type2 >::result
29
36
 
30
37
 
31
- void Init_action_set_nw_dst( void );
38
+ extern "C" {
39
+ #include "trema.h"
40
+ }
32
41
 
33
42
 
34
- #endif // ACTION_SET_NW_DST_H
43
+ #endif // TREMA_HPP
35
44
 
36
45
 
37
46
  /*
@@ -23,6 +23,7 @@
23
23
  #include <stdio.h>
24
24
  #include <stdlib.h>
25
25
  #include <sys/types.h>
26
+ #include <syslog.h>
26
27
  #include <unistd.h>
27
28
 
28
29
 
@@ -40,6 +41,10 @@ int ( *trema_unlink )( const char *pathname ) = unlink;
40
41
 
41
42
  pid_t ( *trema_getpid )( void ) = getpid;
42
43
 
44
+ void ( *trema_openlog ) ( const char *ident, int option, int facility ) = openlog;
45
+ void ( *trema_closelog ) ( void ) = closelog;
46
+ void ( *trema_vsyslog ) ( int priority, const char *format, va_list ap ) = vsyslog;
47
+
43
48
  int ( *trema_sqlite3_open )( const char *filename, sqlite3 **ppDb ) = sqlite3_open;
44
49
  int ( *trema_sqlite3_close )( sqlite3 * ) = sqlite3_close;
45
50
  int ( *trema_sqlite3_exec )( sqlite3 *, const char *sql, int ( *callback ) ( void *, int, char **, char ** ), void *, char **errmsg ) = sqlite3_exec;
@@ -45,6 +45,10 @@ extern int ( *trema_unlink ) ( const char *pathname );
45
45
 
46
46
  extern pid_t ( *trema_getpid )( void );
47
47
 
48
+ extern void ( *trema_openlog ) ( const char *ident, int option, int facility );
49
+ extern void ( *trema_closelog ) ( void );
50
+ extern void ( *trema_vsyslog ) ( int priority, const char *format, va_list ap );
51
+
48
52
  extern int ( *trema_sqlite3_open) ( const char *filename, sqlite3 **ppDb );
49
53
  extern int ( *trema_sqlite3_close ) ( sqlite3 * );
50
54
  extern int ( *trema_sqlite3_exec ) ( sqlite3 *, const char *sql, int ( *callback ) ( void *, int, char **, char ** ), void *, char **errmsg );
data/src/lib/utility.c CHANGED
@@ -143,11 +143,99 @@ string_to_datapath_id( const char *str, uint64_t *datapath_id ) {
143
143
  }
144
144
 
145
145
 
146
+ static bool
147
+ append_string( char *buf, size_t length, const char *string ) {
148
+ assert( buf != NULL );
149
+ assert( length > 0 );
150
+ assert( string != NULL );
151
+
152
+ size_t current_length = strlen( buf );
153
+ size_t length_to_append = strlen( string );
154
+ if ( ( current_length + length_to_append + 1 ) > length ) {
155
+ return false;
156
+ }
157
+ strncpy( buf + current_length, string, length_to_append + 1 );
158
+
159
+ return true;
160
+ }
161
+
162
+
163
+ bool
164
+ wildcards_to_string( uint32_t wildcards, char *str, size_t size ) {
165
+ assert( str != NULL );
166
+ assert( size > 0 );
167
+
168
+ memset( str, '\0', size );
169
+
170
+ bool ret = true;
171
+ if ( ( wildcards & OFPFW_ALL ) == 0 ) {
172
+ ret &= append_string( str, size, "none" );
173
+ return ret;
174
+ }
175
+
176
+ uint32_t nw_src_mask = ( wildcards & OFPFW_NW_SRC_MASK ) >> OFPFW_NW_SRC_SHIFT;
177
+ uint32_t nw_dst_mask = ( wildcards & OFPFW_NW_DST_MASK ) >> OFPFW_NW_DST_SHIFT;
178
+ uint32_t mask = OFPFW_ALL & ~OFPFW_NW_SRC_MASK & ~OFPFW_NW_DST_MASK;
179
+ if ( ( wildcards & mask ) == mask && nw_src_mask >=32 && nw_dst_mask >= 32 ) {
180
+ ret &= append_string( str, size, "all" );
181
+ return ret;
182
+ }
183
+
184
+ if ( wildcards & OFPFW_IN_PORT ) {
185
+ ret &= append_string( str, size, "in_port|" );
186
+ }
187
+ if ( wildcards & OFPFW_DL_SRC ) {
188
+ ret &= append_string( str, size, "dl_src|" );
189
+ }
190
+ if ( wildcards & OFPFW_DL_DST ) {
191
+ ret &= append_string( str, size, "dl_dst|" );
192
+ }
193
+ if ( wildcards & OFPFW_DL_TYPE ) {
194
+ ret &= append_string( str, size, "dl_type|" );
195
+ }
196
+ if ( wildcards & OFPFW_DL_VLAN ) {
197
+ ret &= append_string( str, size, "dl_vlan|" );
198
+ }
199
+ if ( wildcards & OFPFW_DL_VLAN_PCP ) {
200
+ ret &= append_string( str, size, "dl_vlan_pcp|" );
201
+ }
202
+ if ( wildcards & OFPFW_NW_PROTO ) {
203
+ ret &= append_string( str, size, "nw_proto|" );
204
+ }
205
+ if ( wildcards & OFPFW_NW_TOS ) {
206
+ ret &= append_string( str, size, "nw_tos|" );
207
+ }
208
+
209
+ char mask_str[ 16 ];
210
+ if ( nw_src_mask > 0 ) {
211
+ snprintf( mask_str, sizeof( mask_str ), "nw_src(%u)|", nw_src_mask );
212
+ ret &= append_string( str, size, mask_str );
213
+ }
214
+ if ( nw_dst_mask > 0 ) {
215
+ snprintf( mask_str, sizeof( mask_str ), "nw_dst(%u)|", nw_dst_mask );
216
+ ret &= append_string( str, size, mask_str );
217
+ }
218
+ if ( wildcards & OFPFW_TP_SRC ) {
219
+ ret &= append_string( str, size, "tp_src|" );
220
+ }
221
+ if ( wildcards & OFPFW_TP_DST ) {
222
+ ret &= append_string( str, size, "tp_dst|" );
223
+ }
224
+
225
+ if ( strlen( str ) > 0 ) {
226
+ str[ strlen( str ) - 1 ] = '\0';
227
+ }
228
+
229
+ return ret;
230
+ }
231
+
232
+
146
233
  bool
147
234
  match_to_string( const struct ofp_match *match, char *str, size_t size ) {
148
235
  assert( match != NULL );
149
236
  assert( str != NULL );
150
237
 
238
+ char wildcards_str[ 256 ];
151
239
  char nw_src[ 16 ];
152
240
  char nw_dst[ 16 ];
153
241
  struct in_addr addr;
@@ -155,6 +243,7 @@ match_to_string( const struct ofp_match *match, char *str, size_t size ) {
155
243
  unsigned int nw_src_prefixlen;
156
244
  unsigned int nw_dst_prefixlen;
157
245
 
246
+ wildcards_to_string( match->wildcards, wildcards_str, sizeof( wildcards_str ) );
158
247
  addr.s_addr = htonl( match->nw_src );
159
248
  memset( nw_src, '\0', sizeof( nw_src ) );
160
249
  inet_ntop( AF_INET, &addr, nw_src, sizeof( nw_src ) );
@@ -171,20 +260,20 @@ match_to_string( const struct ofp_match *match, char *str, size_t size ) {
171
260
  int ret = snprintf(
172
261
  str,
173
262
  size,
174
- "wildcards = %#x, in_port = %u, "
263
+ "wildcards = %#x(%s), in_port = %u, "
175
264
  "dl_src = %02x:%02x:%02x:%02x:%02x:%02x, "
176
265
  "dl_dst = %02x:%02x:%02x:%02x:%02x:%02x, "
177
266
  "dl_vlan = %u, dl_vlan_pcp = %u, dl_type = %#x, "
178
267
  "nw_tos = %u, nw_proto = %u, nw_src = %s/%u, nw_dst = %s/%u, "
179
268
  "tp_src = %u, tp_dst = %u",
180
- match->wildcards, match->in_port,
269
+ match->wildcards, wildcards_str, match->in_port,
181
270
  match->dl_src[ 0 ], match->dl_src[ 1 ], match->dl_src[ 2 ],
182
271
  match->dl_src[ 3 ], match->dl_src[ 4 ], match->dl_src[ 5 ],
183
272
  match->dl_dst[ 0 ], match->dl_dst[ 1 ], match->dl_dst[ 2 ],
184
273
  match->dl_dst[ 3 ], match->dl_dst[ 4 ], match->dl_dst[ 5 ],
185
274
  match->dl_vlan, match->dl_vlan_pcp, match->dl_type,
186
275
  match->nw_tos, match->nw_proto, nw_src, nw_src_prefixlen,
187
- nw_dst, nw_dst_prefixlen, match->tp_src, match->tp_dst
276
+ nw_dst, nw_dst_prefixlen, match->tp_src, match->tp_dst
188
277
  );
189
278
 
190
279
  if ( ( ret >= ( int ) size ) || ( ret < 0 ) ) {
@@ -205,7 +294,7 @@ phy_port_to_string( const struct ofp_phy_port *phy_port, char *str, size_t size
205
294
  int ret = snprintf(
206
295
  str,
207
296
  size,
208
- "port_no = %u, hw_addr = %02x:%02x:%02x:%02x:%02x:%02x, "
297
+ "port_no = %u, hw_addr = %02x:%02x:%02x:%02x:%02x:%02x, "
209
298
  "name = %s, config = %#x, state = %#x, "
210
299
  "curr = %#x, advertised = %#x, supported = %#x, peer = %#x",
211
300
  phy_port->port_no,
data/src/lib/utility.h CHANGED
@@ -50,6 +50,7 @@ unsigned int hash_datapath_id( const void *key );
50
50
  bool string_to_datapath_id( const char *str, uint64_t *datapath_id );
51
51
 
52
52
  bool match_to_string( const struct ofp_match *match, char *str, size_t size );
53
+ bool wildcards_to_string( uint32_t wildcards, char *str, size_t size );
53
54
  bool phy_port_to_string( const struct ofp_phy_port *phy_port, char *str, size_t size );
54
55
  bool actions_to_string( const struct ofp_action_header *actions, uint16_t actions_length, char *str, size_t str_length );
55
56
 
data/src/lib/wrapper.c CHANGED
@@ -76,19 +76,42 @@ xstrdup( const char *s ) {
76
76
  }
77
77
 
78
78
 
79
+ static char *
80
+ _xvasprintf( const char *format, va_list args, const char *error_message ) {
81
+ va_list args_copy;
82
+ va_copy( args_copy, args );
83
+ int n = vsnprintf( NULL, 0, format, args_copy );
84
+ va_end( args_copy );
85
+ if ( n <= 0 ) {
86
+ return NULL;
87
+ }
88
+ size_t size = ( size_t ) ( n + 1 );
89
+ char *str = _trema_malloc( size, error_message );
90
+ va_copy( args_copy, args );
91
+ n = vsnprintf( str, size, format, args_copy );
92
+ va_end( args_copy );
93
+ if ( n <= 0 || ( size_t ) n > size ) {
94
+ xfree( str );
95
+ return NULL;
96
+ }
97
+ return str;
98
+ }
99
+
100
+
101
+ char *
102
+ xvasprintf( const char *format, va_list args ) {
103
+ return _xvasprintf( format, args, "Out of memory, xvasprintf failed" );
104
+ }
105
+
106
+
79
107
  char *
80
108
  xasprintf( const char *format, ... ) {
81
109
  const char error[] = "Out of memory, xasprintf failed";
82
110
  va_list args;
83
111
  va_start( args, format );
84
- char *str;
85
- if ( trema_vasprintf( &str, format, args ) < 0 ) {
86
- die( error );
87
- }
88
- char *result = _xstrdup( str, error );
89
- free( str );
112
+ char *str = _xvasprintf( format, args, error );
90
113
  va_end( args );
91
- return result;
114
+ return str;
92
115
  }
93
116
 
94
117
 
data/src/lib/wrapper.h CHANGED
@@ -24,6 +24,7 @@
24
24
  #define WRAPPER_H
25
25
 
26
26
 
27
+ #include <stdarg.h>
27
28
  #include <stddef.h>
28
29
  #include <string.h>
29
30
  #include "utility.h"
@@ -62,6 +63,7 @@ void *xcalloc( size_t nmemb, size_t size );
62
63
  void xfree( void *ptr );
63
64
 
64
65
  char *xstrdup( const char *s );
66
+ char *xvasprintf( const char *format, va_list args );
65
67
  char *xasprintf( const char *format, ... );
66
68
 
67
69