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
data/src/lib/chibach.h ADDED
@@ -0,0 +1,71 @@
1
+ /*
2
+ * Chibach common functions.
3
+ *
4
+ * Author: Yasuhito Takamiya <yasuhito@gmail.com>, Yasunobu Chiba
5
+ *
6
+ * Copyright (C) 2008-2012 NEC Corporation
7
+ *
8
+ * This program is free software; you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License, version 2, as
10
+ * published by the Free Software Foundation.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License along
18
+ * with this program; if not, write to the Free Software Foundation, Inc.,
19
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
+ */
21
+
22
+
23
+ #ifndef CHIBACH_H
24
+ #define CHIBACH_H
25
+
26
+
27
+ #include "bool.h"
28
+ #include "buffer.h"
29
+ #include "byteorder.h"
30
+ #include "checks.h"
31
+ #include "doubly_linked_list.h"
32
+ #include "ether.h"
33
+ #include "event_handler.h"
34
+ #include "hash_table.h"
35
+ #include "linked_list.h"
36
+ #include "log.h"
37
+ #include "match.h"
38
+ #include "match_table.h"
39
+ #include "message_queue.h"
40
+ #include "messenger.h"
41
+ #include "openflow_service_interface.h"
42
+ #include "openflow_switch_interface.h"
43
+ #include "openflow_message.h"
44
+ #include "packet_info.h"
45
+ #include "stat.h"
46
+ #include "timer.h"
47
+ #include "utility.h"
48
+ #include "wrapper.h"
49
+
50
+
51
+ void init_chibach( int *argc, char ***argv );
52
+ void start_chibach( void );
53
+ void stop_chibach( void );
54
+ void flush( void );
55
+ const char *get_chibach_home( void );
56
+ const char *get_chibach_tmp( void );
57
+ const char *get_chibach_name( void );
58
+ void set_chibach_name( const char *name );
59
+ __attribute__( ( weak ) ) void usage( void );
60
+ uint64_t get_datapath_id( void );
61
+
62
+
63
+ #endif // CHIBACH_H
64
+
65
+
66
+ /*
67
+ * Local variables:
68
+ * c-basic-offset: 2
69
+ * indent-tabs-mode: nil
70
+ * End:
71
+ */
@@ -0,0 +1,170 @@
1
+ /*
2
+ * Author: Yasuhito Takamiya <yasuhito@gmail.com>, Yasunobu Chiba
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 <assert.h>
22
+ #include <errno.h>
23
+ #include <limits.h>
24
+ #include <stdint.h>
25
+ #include <stdio.h>
26
+ #include <stdlib.h>
27
+ #include <string.h>
28
+ #include "bool.h"
29
+ #include "chibach_private.h"
30
+ #include "log.h"
31
+ #include "trema_wrapper.h"
32
+ #include "wrapper.h"
33
+
34
+
35
+ static const char CHIBACH_HOME[] = "CHIBACH_HOME";
36
+ static const char CHIBACH_TMP[] = "CHIBACH_TMP";
37
+ static char *chibach_home = NULL;
38
+ static char *chibach_tmp = NULL;
39
+
40
+
41
+ static bool
42
+ expand( const char *path, char *absolute_path ) {
43
+ assert( path != NULL );
44
+ assert( absolute_path != NULL );
45
+
46
+ char buf[ 256 ];
47
+ char *result = realpath( path, absolute_path );
48
+ if ( result == NULL ) {
49
+ trema_fprintf( stderr, "Could not get the absolute path of %s: %s.\n", path, strerror_r( errno, buf, sizeof( buf ) ) );
50
+ return false;
51
+ }
52
+
53
+ return true;
54
+ }
55
+
56
+
57
+ /**
58
+ * Sets chibach home directory for your chibach session.
59
+ */
60
+ void
61
+ set_chibach_home( void ) {
62
+ if ( getenv( CHIBACH_HOME ) == NULL ) {
63
+ setenv( CHIBACH_HOME, "/", 1 );
64
+ chibach_home = xstrdup( "/" );
65
+ }
66
+ else {
67
+ char absolute_path[ PATH_MAX ];
68
+ if ( !expand( getenv( CHIBACH_HOME ), absolute_path ) ) {
69
+ trema_fprintf( stderr, "Falling back CHIBACH_HOME to \"/\".\n" );
70
+ strncpy( absolute_path, "/", 2 );
71
+ }
72
+ setenv( CHIBACH_HOME, absolute_path, 1 );
73
+ chibach_home = xstrdup( absolute_path );
74
+ }
75
+ }
76
+
77
+
78
+ /**
79
+ * Returns chibach home directory used in your chibach session.
80
+ */
81
+ const char *
82
+ get_chibach_home( void ) {
83
+ if ( chibach_home == NULL ) {
84
+ set_chibach_home();
85
+ }
86
+ return chibach_home;
87
+ }
88
+
89
+
90
+ /**
91
+ * Unsets chibach home directory used in your chibach session.
92
+ */
93
+ void unset_chibach_home( void ) {
94
+ if ( chibach_home != NULL ) {
95
+ xfree( chibach_home );
96
+ chibach_home = NULL;
97
+ }
98
+ }
99
+
100
+
101
+ /**
102
+ * Sets temporary directory for your Chibach session.
103
+ */
104
+ void
105
+ set_chibach_tmp( void ) {
106
+ char path[ PATH_MAX ];
107
+
108
+ if ( getenv( CHIBACH_TMP ) == NULL ) {
109
+ const char *chibach_home = get_chibach_home();
110
+ if ( chibach_home[ strlen( chibach_home ) - 1 ] == '/' ) {
111
+ snprintf( path, PATH_MAX, "%stmp", chibach_home );
112
+ }
113
+ else {
114
+ snprintf( path, PATH_MAX, "%s/tmp", chibach_home );
115
+ }
116
+ path[ PATH_MAX - 1 ] = '\0';
117
+ }
118
+ else {
119
+ if ( !expand( getenv( CHIBACH_TMP ), path ) ) {
120
+ trema_fprintf( stderr, "Falling back CHIBACH_TMP to \"/tmp\".\n" );
121
+ strncpy( path, "/tmp", 5 );
122
+ }
123
+ }
124
+
125
+ chibach_tmp = xstrdup( path );
126
+ setenv( CHIBACH_TMP, chibach_tmp, 1 );
127
+ }
128
+
129
+
130
+ /**
131
+ * Returns temporary directory used in your Chibach session.
132
+ */
133
+ const char *
134
+ get_chibach_tmp( void ) {
135
+ if ( chibach_tmp == NULL ) {
136
+ set_chibach_tmp();
137
+ }
138
+ return chibach_tmp;
139
+ }
140
+
141
+
142
+ /**
143
+ * Unsets temporary directory used in your Chibach session.
144
+ */
145
+ void unset_chibach_tmp( void ) {
146
+ if ( chibach_tmp != NULL ) {
147
+ xfree( chibach_tmp );
148
+ chibach_tmp = NULL;
149
+ }
150
+ }
151
+
152
+
153
+ const char *
154
+ _get_chibach_home( void ) {
155
+ return chibach_home;
156
+ }
157
+
158
+
159
+ const char *
160
+ _get_chibach_tmp( void ) {
161
+ return chibach_tmp;
162
+ }
163
+
164
+
165
+ /*
166
+ * Local variables:
167
+ * c-basic-offset: 2
168
+ * indent-tabs-mode: nil
169
+ * End:
170
+ */
@@ -0,0 +1,52 @@
1
+ /*
2
+ * Private functions that are only called from [chibach]/src/lib.
3
+ *
4
+ * Author: Yasuhito Takamiya <yasuhito@gmail.com>
5
+ *
6
+ * Copyright (C) 2008-2012 NEC Corporation
7
+ *
8
+ * This program is free software; you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License, version 2, as
10
+ * published by the Free Software Foundation.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License along
18
+ * with this program; if not, write to the Free Software Foundation, Inc.,
19
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
+ */
21
+
22
+
23
+ #ifndef CHIBACH_PRIVATE_H
24
+ #define CHIBACH_PRIVATE_H
25
+
26
+
27
+ #include "bool.h"
28
+
29
+
30
+ void set_chibach_home( void );
31
+ const char *get_chibach_home( void );
32
+ void unset_chibach_home( void );
33
+
34
+ void set_chibach_tmp( void );
35
+ const char *get_chibach_tmp( void );
36
+ void unset_chibach_tmp( void );
37
+
38
+ const char *get_chibach_name( void );
39
+
40
+ const char *_get_chibach_home( void );
41
+ const char *_get_chibach_tmp( void );
42
+
43
+
44
+ #endif // CHIBACH_PRIVATE_H
45
+
46
+
47
+ /*
48
+ * Local variables:
49
+ * c-basic-offset: 2
50
+ * indent-tabs-mode: nil
51
+ * End:
52
+ */
data/src/lib/ether.c CHANGED
@@ -34,7 +34,8 @@ fill_ether_padding( buffer *buf ) {
34
34
  padding_length = ETH_MINIMUM_LENGTH - buf->length - ETH_FCS_LENGTH;
35
35
  debug( "Adding %u octets padding ( original frame length = %u ).",
36
36
  buf->length, padding_length );
37
- append_back_buffer( buf, padding_length );
37
+ void *padding = append_back_buffer( buf, padding_length );
38
+ memset( padding, 0, padding_length );
38
39
  }
39
40
  return ( uint16_t ) padding_length;
40
41
  }
data/src/lib/ether.h CHANGED
@@ -24,7 +24,6 @@
24
24
  #define ETHER_H
25
25
 
26
26
 
27
- #include <endian.h>
28
27
  #include <stdint.h>
29
28
  #include "bool.h"
30
29
  #include "buffer.h"
data/src/lib/ipv4.h CHANGED
@@ -24,27 +24,26 @@
24
24
  #define IPV4_H
25
25
 
26
26
 
27
- #include <netinet/ip.h>
28
27
  #include "buffer.h"
29
28
 
30
29
 
31
30
  typedef struct {
32
31
  #if __BYTE_ORDER == __LITTLE_ENDIAN
33
- unsigned int ihl:4;
34
- unsigned int version:4;
32
+ uint8_t ihl:4;
33
+ uint8_t version:4;
35
34
  #elif __BYTE_ORDER == __BIG_ENDIAN
36
- unsigned int version:4;
37
- unsigned int ihl:4;
35
+ uint8_t version:4;
36
+ uint8_t ihl:4;
38
37
  #endif
39
- u_int8_t tos;
40
- u_int16_t tot_len;
41
- u_int16_t id;
42
- u_int16_t frag_off;
43
- u_int8_t ttl;
44
- u_int8_t protocol;
45
- u_int16_t csum;
46
- u_int32_t saddr;
47
- u_int32_t daddr;
38
+ uint8_t tos;
39
+ uint16_t tot_len;
40
+ uint16_t id;
41
+ uint16_t frag_off;
42
+ uint8_t ttl;
43
+ uint8_t protocol;
44
+ uint16_t csum;
45
+ uint32_t saddr;
46
+ uint32_t daddr;
48
47
  } ipv4_header_t;
49
48
 
50
49
 
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Author: Nick Karanatsios <nickkaranatsios@gmail.com>
2
+ * IPv6 header definitions
3
3
  *
4
4
  * Copyright (C) 2008-2012 NEC Corporation
5
5
  *
@@ -18,20 +18,24 @@
18
18
  */
19
19
 
20
20
 
21
- #ifndef ACTION_SET_NW_SRC_H
22
- #define ACTION_SET_NW_SRC_H
21
+ #ifndef IPV6_H
22
+ #define IPV6_H
23
23
 
24
24
 
25
- #include "ruby.h"
25
+ #define IPV6_ADDRLEN 16
26
26
 
27
27
 
28
- extern VALUE cActionSetNwSrc;
28
+ typedef struct {
29
+ uint32_t hdrctl;
30
+ uint16_t plen;
31
+ uint8_t nexthdr;
32
+ uint8_t hoplimit;
33
+ uint8_t saddr[ IPV6_ADDRLEN ];
34
+ uint8_t daddr[ IPV6_ADDRLEN ];
35
+ } ipv6_header_t;
29
36
 
30
37
 
31
- void Init_action_set_nw_src( void );
32
-
33
-
34
- #endif // ACTION_SET_NW_SRC_H
38
+ #endif // IPV6_H
35
39
 
36
40
 
37
41
  /*
data/src/lib/log.c CHANGED
@@ -25,6 +25,7 @@
25
25
  #include <stdarg.h>
26
26
  #include <stdlib.h>
27
27
  #include <string.h>
28
+ #include <syslog.h>
28
29
  #include <time.h>
29
30
  #include "bool.h"
30
31
  #include "log.h"
@@ -34,32 +35,35 @@
34
35
 
35
36
  typedef struct {
36
37
  const char *name;
37
- const logging_level value;
38
+ const int value;
38
39
  } priority;
39
40
 
40
41
 
42
+ static bool initialized = false;
41
43
  static FILE *fd = NULL;
42
- static logging_level level = -1;
43
- static bool daemonized = false;
44
+ static int level = -1;
45
+ static char ident_string[ PATH_MAX ];
46
+ static char log_directory[ PATH_MAX ];
47
+ static logging_type output = LOGGING_TYPE_FILE;
44
48
  static pthread_mutex_t mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
45
49
 
46
50
 
47
51
  static priority priorities[][ 3 ] = {
48
52
  {
49
- { .name = "critical", .value = LOG_CRITICAL },
50
- { .name = "crit", .value = LOG_CRITICAL },
53
+ { .name = "critical", .value = LOG_CRIT },
54
+ { .name = "crit", .value = LOG_CRIT },
51
55
  { .name = NULL },
52
56
  },
53
57
 
54
58
  {
55
- { .name = "error", .value = LOG_ERROR },
56
- { .name = "err", .value = LOG_ERROR },
59
+ { .name = "error", .value = LOG_ERR },
60
+ { .name = "err", .value = LOG_ERR },
57
61
  { .name = NULL },
58
62
  },
59
63
 
60
64
  {
61
- { .name = "warn", .value = LOG_WARN },
62
- { .name = "warning", .value = LOG_WARN },
65
+ { .name = "warn", .value = LOG_WARNING },
66
+ { .name = "warning", .value = LOG_WARNING },
63
67
  { .name = NULL },
64
68
  },
65
69
 
@@ -83,8 +87,8 @@ static priority priorities[][ 3 ] = {
83
87
 
84
88
 
85
89
  static const char *
86
- priority_name_from( logging_level level ) {
87
- const char *name = priorities[ level ][ 0 ].name;
90
+ priority_name_from( int level ) {
91
+ const char *name = priorities[ level - LOG_CRIT ][ 0 ].name;
88
92
  assert( name != NULL );
89
93
  return name;
90
94
  }
@@ -93,7 +97,7 @@ priority_name_from( logging_level level ) {
93
97
  static const size_t max_message_length = 1024;
94
98
 
95
99
  static void
96
- log_file( logging_level priority, const char *format, va_list ap ) {
100
+ log_file( int priority, const char *format, va_list ap ) {
97
101
  time_t tm = time( NULL );
98
102
  char now[ 26 ];
99
103
  asctime_r( localtime( &tm ), now );
@@ -122,13 +126,61 @@ log_stdout( const char *format, va_list ap ) {
122
126
  }
123
127
 
124
128
 
125
- static FILE*
126
- open_log( const char *ident, const char *log_directory, bool append ) {
129
+ static void
130
+ log_syslog( int priority, const char *format, va_list ap ) {
131
+ trema_vsyslog( priority, format, ap );
132
+ }
133
+
134
+
135
+ static void
136
+ unset_ident_string() {
137
+ memset( ident_string, '\0', sizeof( ident_string ) );
138
+ }
139
+
140
+
141
+ static void
142
+ set_ident_string( const char *ident ) {
127
143
  assert( ident != NULL );
128
- assert( log_directory != NULL );
144
+
145
+ unset_ident_string();
146
+ strncpy( ident_string, ident, sizeof( ident_string ) - 1 );
147
+ }
148
+
149
+
150
+ static const char *
151
+ get_ident_string() {
152
+ return ident_string;
153
+ }
154
+
155
+
156
+ static void
157
+ unset_log_directory() {
158
+ memset( log_directory, '\0', sizeof( log_directory ) );
159
+ }
160
+
161
+
162
+ static void
163
+ set_log_directory( const char *directory ) {
164
+ assert( directory != NULL );
165
+
166
+ unset_log_directory();
167
+ strncpy( log_directory, directory, sizeof( log_directory ) - 1 );
168
+ }
169
+
170
+
171
+ static const char *
172
+ get_log_directory() {
173
+ return log_directory;
174
+ }
175
+
176
+
177
+ static FILE*
178
+ open_log_file( bool append ) {
179
+ assert( strlen( get_log_directory() ) > 0 );
180
+ assert( strlen( get_ident_string() ) > 0 );
129
181
 
130
182
  char pathname[ PATH_MAX ];
131
- sprintf( pathname, "%s/%s.log", log_directory, ident );
183
+ sprintf( pathname, "%s/%s.log", get_log_directory(), get_ident_string() );
132
184
  FILE *log = fopen( pathname, append ? "a" : "w" );
133
185
 
134
186
  if ( log == NULL ) {
@@ -142,27 +194,51 @@ open_log( const char *ident, const char *log_directory, bool append ) {
142
194
  }
143
195
 
144
196
 
197
+ static void
198
+ open_log_syslog() {
199
+ assert( strlen( get_ident_string() ) > 0 );
200
+
201
+ trema_openlog( get_ident_string(), LOG_NDELAY, LOG_USER );
202
+ }
203
+
204
+
145
205
  /**
146
206
  * Initializes the Logger. This creates a log file to which messages
147
207
  * are written.
148
208
  *
149
209
  * @param ident name of the log file, used as an identifier.
150
210
  * @param log_directory the directory in which log file is created.
151
- * @param run_as_daemon determines if messages should be reported to terminal as well.
211
+ * @param type log output type.
152
212
  * @return true on success; false otherwise.
153
213
  */
154
214
  bool
155
- init_log( const char *ident, const char *log_directory, bool run_as_daemon ) {
215
+ init_log( const char *ident, const char *directory, logging_type type ) {
216
+ assert( ident != NULL );
217
+ assert( directory != NULL );
218
+
156
219
  pthread_mutex_lock( &mutex );
157
220
 
158
- level = LOG_INFO;
221
+ // set_logging_level() may be called before init_log().
222
+ // level = -1 indicates that logging level is not set yet.
223
+ if ( level < 0 || level > LOG_DEBUG ) {
224
+ level = LOG_INFO;
225
+ }
159
226
  char *level_string = getenv( "LOGGING_LEVEL" );
160
227
  if ( level_string != NULL ) {
161
228
  set_logging_level( level_string );
162
229
  }
163
230
 
164
- daemonized = run_as_daemon;
165
- fd = open_log( ident, log_directory, false );
231
+ set_ident_string( ident );
232
+ set_log_directory( directory );
233
+ output = type;
234
+ if ( output & LOGGING_TYPE_FILE ) {
235
+ fd = open_log_file( false );
236
+ }
237
+ if ( output & LOGGING_TYPE_SYSLOG ) {
238
+ open_log_syslog();
239
+ }
240
+
241
+ initialized = true;
166
242
 
167
243
  pthread_mutex_unlock( &mutex );
168
244
 
@@ -171,35 +247,51 @@ init_log( const char *ident, const char *log_directory, bool run_as_daemon ) {
171
247
 
172
248
 
173
249
  void
174
- restart_log( const char *ident, const char *log_directory ) {
250
+ restart_log( const char *new_ident ) {
175
251
  pthread_mutex_lock( &mutex );
176
252
 
177
- if ( fd != NULL ) {
178
- fclose( fd );
253
+ if ( new_ident != NULL ) {
254
+ set_ident_string( new_ident );
255
+ }
256
+
257
+ if ( output & LOGGING_TYPE_FILE ) {
258
+ if ( fd != NULL ) {
259
+ fclose( fd );
260
+ }
261
+ fd = open_log_file( true );
262
+ }
263
+ if ( output & LOGGING_TYPE_SYSLOG ) {
264
+ trema_closelog();
265
+ open_log_syslog();
179
266
  }
180
- fd = open_log( ident, log_directory, true );
181
267
 
182
268
  pthread_mutex_unlock( &mutex );
183
269
  }
184
270
 
185
271
 
186
272
  void
187
- rename_log( const char *old_ident, const char *new_ident, const char *directory ) {
188
- assert( directory != NULL );
189
- assert( old_ident != NULL );
273
+ rename_log( const char *new_ident ) {
190
274
  assert( new_ident != NULL );
191
275
 
192
- char old_path[ PATH_MAX ];
193
- snprintf( old_path, PATH_MAX, "%s/%s.log", directory, old_ident );
194
- old_path[ PATH_MAX - 1 ] = '\0';
195
- char new_path[ PATH_MAX ];
196
- snprintf( new_path, PATH_MAX, "%s/%s.log", directory, new_ident );
197
- new_path[ PATH_MAX - 1 ] = '\0';
198
-
199
- unlink( new_path );
200
- int ret = rename( old_path, new_path );
201
- if ( ret < 0 ) {
202
- die( "Could not rename a log file from %s to %s.", old_path, new_path );
276
+ if ( output & LOGGING_TYPE_FILE ) {
277
+ char old_path[ PATH_MAX ];
278
+ snprintf( old_path, PATH_MAX, "%s/%s.log", get_log_directory(), get_ident_string() );
279
+ old_path[ PATH_MAX - 1 ] = '\0';
280
+ char new_path[ PATH_MAX ];
281
+ set_ident_string( new_ident );
282
+ snprintf( new_path, PATH_MAX, "%s/%s.log", get_log_directory(), get_ident_string() );
283
+ new_path[ PATH_MAX - 1 ] = '\0';
284
+
285
+ unlink( new_path );
286
+ int ret = rename( old_path, new_path );
287
+ if ( ret < 0 ) {
288
+ die( "Could not rename a log file from %s to %s.", old_path, new_path );
289
+ }
290
+ }
291
+ if ( output & LOGGING_TYPE_SYSLOG ) {
292
+ trema_closelog();
293
+ set_ident_string( new_ident );
294
+ open_log_syslog();
203
295
  }
204
296
  }
205
297
 
@@ -214,11 +306,22 @@ finalize_log() {
214
306
  pthread_mutex_lock( &mutex );
215
307
 
216
308
  level = -1;
217
- if ( fd != NULL ) {
218
- fclose( fd );
219
- fd = NULL;
309
+
310
+ if ( output & LOGGING_TYPE_FILE ) {
311
+ if ( fd != NULL ) {
312
+ fclose( fd );
313
+ fd = NULL;
314
+ }
315
+ }
316
+ if ( output & LOGGING_TYPE_SYSLOG ) {
317
+ trema_closelog();
220
318
  }
221
319
 
320
+ unset_ident_string();
321
+ unset_log_directory();
322
+
323
+ initialized = false;
324
+
222
325
  pthread_mutex_unlock( &mutex );
223
326
 
224
327
  return true;
@@ -242,7 +345,7 @@ priority_value_from( const char *name ) {
242
345
  int level_value = -1;
243
346
  char *name_lower = lower( name );
244
347
 
245
- for ( int i = 0; i <= LOG_DEBUG; i++ ) {
348
+ for ( int i = 0; i <= ( LOG_DEBUG - LOG_CRIT ); i++ ) {
246
349
  for ( priority *p = priorities[ i ]; p->name != NULL; p++ ) {
247
350
  if ( strncmp( p->name, name_lower, 20 ) == 0 ) {
248
351
  level_value = p->value;
@@ -257,12 +360,7 @@ priority_value_from( const char *name ) {
257
360
 
258
361
  static bool
259
362
  started() {
260
- if ( fd == NULL ) {
261
- return false;
262
- }
263
- else {
264
- return true;
265
- }
363
+ return initialized;
266
364
  }
267
365
 
268
366
 
@@ -288,19 +386,24 @@ set_logging_level( const char *name ) {
288
386
  }
289
387
 
290
388
 
291
- static logging_level
389
+ static int
292
390
  _get_logging_level() {
293
391
  return level;
294
392
  }
295
- logging_level ( *get_logging_level )( void ) = _get_logging_level;
393
+ int ( *get_logging_level )( void ) = _get_logging_level;
296
394
 
297
395
 
298
396
  static void
299
- do_log( logging_level priority, const char *format, va_list ap ) {
397
+ do_log( int priority, const char *format, va_list ap ) {
300
398
  assert( started() );
301
399
 
302
- log_file( priority, format, ap );
303
- if ( !daemonized ) {
400
+ if ( output & LOGGING_TYPE_FILE ) {
401
+ log_file( priority, format, ap );
402
+ }
403
+ if ( output & LOGGING_TYPE_SYSLOG ) {
404
+ log_syslog( priority, format, ap );
405
+ }
406
+ if ( output & LOGGING_TYPE_STDOUT ) {
304
407
  log_stdout( format, ap );
305
408
  }
306
409
  }
@@ -311,7 +414,7 @@ do_log( logging_level priority, const char *format, va_list ap ) {
311
414
  if ( _format == NULL ) { \
312
415
  trema_abort(); \
313
416
  } \
314
- if ( ( int ) get_logging_level() >= _priority ) { \
417
+ if ( get_logging_level() >= _priority ) { \
315
418
  pthread_mutex_lock( &mutex ); \
316
419
  va_list _args; \
317
420
  va_start( _args, _format ); \
@@ -324,7 +427,7 @@ do_log( logging_level priority, const char *format, va_list ap ) {
324
427
 
325
428
  static void
326
429
  _critical( const char *format, ... ) {
327
- DO_LOG( LOG_CRITICAL, format );
430
+ DO_LOG( LOG_CRIT, format );
328
431
  }
329
432
  /**
330
433
  * Logs an critical message.
@@ -336,7 +439,7 @@ void ( *critical )( const char *format, ... ) = _critical;
336
439
 
337
440
  static void
338
441
  _error( const char *format, ... ) {
339
- DO_LOG( LOG_ERROR, format );
442
+ DO_LOG( LOG_ERR, format );
340
443
  }
341
444
  /**
342
445
  * Logs an error message.
@@ -348,7 +451,7 @@ void ( *error )( const char *format, ... ) = _error;
348
451
 
349
452
  static void
350
453
  _warn( const char *format, ... ) {
351
- DO_LOG( LOG_WARN, format );
454
+ DO_LOG( LOG_WARNING, format );
352
455
  }
353
456
  /**
354
457
  * Logs a warning message.