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.
- data/.gitmodules +3 -0
- data/.travis.yml +13 -0
- data/.yardopts +4 -0
- data/Gemfile +2 -3
- data/README.md +43 -97
- data/Rakefile +60 -4
- data/Rantfile +11 -10
- data/cruise.rb +4 -6
- data/features/example.packetin_filter_config.feature +10 -10
- data/features/example.switch_monitor.feature +14 -2
- data/features/step_definitions/kill_steps.rb +2 -2
- data/features/step_definitions/{off_steps.rb → killall_steps.rb} +2 -2
- data/features/step_definitions/misc_steps.rb +1 -1
- data/features/step_definitions/up_steps.rb +30 -0
- data/features/trema.feature +1 -0
- data/features/trema.run.feature +1 -0
- data/locale/README.ja.md +19 -0
- data/locale/ja/yard.po +3762 -0
- data/locale/yard.pot +3740 -0
- data/ruby/extconf.rb +4 -1
- data/ruby/trema/action-common.c +3 -17
- data/ruby/trema/action-common.h +3 -7
- data/ruby/trema/action.rb +33 -0
- data/ruby/trema/app.rb +1 -1
- data/ruby/trema/barrier-request.c +1 -0
- data/ruby/trema/command/run.rb +13 -9
- data/ruby/trema/command/usage.rb +1 -0
- data/ruby/trema/command/version.rb +1 -1
- data/ruby/trema/controller.c +133 -50
- data/ruby/trema/controller.rb +2 -2
- data/ruby/trema/desc-stats-reply.rb +77 -0
- data/ruby/trema/dsl/configuration.rb +3 -14
- data/ruby/trema/dsl/rswitch.rb +47 -0
- data/ruby/trema/dsl/runner.rb +4 -1
- data/ruby/trema/dsl/syntax.rb +11 -8
- data/ruby/trema/echo-reply.c +59 -45
- data/ruby/trema/echo-reply.h +1 -3
- data/ruby/trema/echo-request.c +49 -71
- data/ruby/trema/echo-request.h +0 -2
- data/ruby/trema/echo.c +99 -0
- data/ruby/trema/{action-enqueue.h → echo.h} +6 -7
- data/ruby/trema/enqueue.rb +87 -0
- data/ruby/trema/error.c +109 -104
- data/ruby/trema/error.h +0 -2
- data/ruby/trema/features-reply.c +89 -35
- data/ruby/trema/features-reply.h +0 -6
- data/ruby/trema/features-request.c +63 -37
- data/ruby/trema/features-request.h +0 -2
- data/ruby/trema/flow-mod.c +149 -0
- data/ruby/trema/{action-output.h → flow-mod.h} +6 -6
- data/ruby/trema/get-config-request.c +1 -0
- data/ruby/trema/hardware-switch.rb +88 -0
- data/ruby/trema/hello.c +55 -31
- data/ruby/trema/hello.h +0 -2
- data/ruby/trema/ip.rb +12 -2
- data/ruby/trema/logger.rb +29 -0
- data/ruby/trema/mac.rb +57 -36
- data/ruby/trema/match.c +7 -9
- data/ruby/trema/monkey-patch/integer/ranges.rb +0 -2
- data/ruby/trema/network-component.rb +1 -1
- data/ruby/trema/open-vswitch.rb +2 -2
- data/ruby/trema/openflow-switch.rb +3 -54
- data/ruby/trema/{packet_in.c → packet-in.c} +262 -175
- data/ruby/trema/{packet_in.h → packet-in.h} +0 -2
- data/ruby/trema/packet-queue.rb +4 -3
- data/ruby/trema/port-mod.c +8 -9
- data/ruby/trema/port-status-add.rb +60 -0
- data/ruby/trema/port-status-delete.rb +60 -0
- data/ruby/trema/port-status-modify.rb +60 -0
- data/ruby/trema/port-status.c +48 -15
- data/ruby/trema/port-status.h +6 -8
- data/ruby/trema/port.c +63 -8
- data/ruby/trema/queue-get-config-request.c +1 -0
- data/ruby/trema/ruby-switch.rb +62 -0
- data/ruby/trema/send-out-port.rb +97 -0
- data/ruby/trema/set-config.c +1 -0
- data/ruby/trema/set-eth-addr.rb +45 -0
- data/ruby/trema/set-eth-dst-addr.rb +54 -0
- data/ruby/trema/set-eth-src-addr.rb +54 -0
- data/ruby/trema/set-ip-addr.rb +47 -0
- data/ruby/trema/set-ip-dst-addr.rb +53 -0
- data/ruby/trema/set-ip-src-addr.rb +52 -0
- data/ruby/trema/set-ip-tos.rb +63 -0
- data/ruby/trema/set-transport-dst-port.rb +53 -0
- data/ruby/trema/set-transport-port.rb +52 -0
- data/ruby/trema/set-transport-src-port.rb +54 -0
- data/ruby/trema/set-vlan-priority.rb +65 -0
- data/ruby/trema/set-vlan-vid.rb +64 -0
- data/ruby/trema/shell/down.rb +1 -1
- data/ruby/trema/shell/link.rb +4 -4
- data/ruby/trema/shell/run.rb +8 -6
- data/ruby/trema/shell/up.rb +3 -3
- data/ruby/trema/stats-reply.c +27 -2
- data/ruby/trema/stats-request.c +64 -23
- data/ruby/trema/strip-vlan-header.rb +41 -0
- data/ruby/trema/switch.c +196 -0
- data/ruby/trema/{action-vendor.h → switch.h} +5 -7
- data/ruby/trema/switch.rb +28 -9
- data/ruby/trema/trema-ruby-utils.c +66 -0
- data/ruby/trema/{action-set-dl-src.h → trema-ruby-utils.h} +9 -11
- data/ruby/trema/trema.c +61 -61
- data/ruby/trema/vendor-action.rb +73 -0
- data/ruby/trema/vendor.c +121 -52
- data/ruby/trema/vendor.h +6 -10
- data/ruby/trema/version.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- data/spec/support/action.rb +52 -0
- data/spec/support/mandatory-option.rb +56 -0
- data/spec/support/openflow-message.rb +91 -7
- data/spec/support/port-status.rb +38 -0
- data/spec/trema/controller_spec.rb +0 -26
- data/spec/trema/dsl/configuration_spec.rb +3 -3
- data/spec/trema/dsl/runner_spec.rb +12 -32
- data/spec/trema/dsl/syntax_spec.rb +2 -11
- data/spec/trema/echo-reply_spec.rb +49 -14
- data/spec/trema/echo-request_spec.rb +86 -34
- data/spec/trema/enqueue_spec.rb +76 -0
- data/spec/trema/error_spec.rb +43 -58
- data/spec/trema/features-reply_spec.rb +58 -24
- data/spec/trema/features-request_spec.rb +54 -28
- data/spec/trema/flow-mod_spec.rb +99 -0
- data/spec/trema/{openflow-switch_spec.rb → hardware-switch_spec.rb} +3 -3
- data/spec/trema/hello_spec.rb +28 -14
- data/spec/trema/ip_spec.rb +54 -0
- data/spec/trema/mac_spec.rb +49 -64
- data/spec/trema/match_spec.rb +1 -1
- data/spec/trema/open-vswitch_spec.rb +7 -7
- data/spec/trema/packet-in_spec.rb +73 -16
- data/spec/trema/port-status-add_spec.rb +32 -0
- data/spec/trema/port-status-delete_spec.rb +32 -0
- data/spec/trema/port-status-modify_spec.rb +71 -0
- data/spec/trema/port-status_spec.rb +5 -76
- data/spec/trema/{action-output_spec.rb → send-out-port_spec.rb} +20 -47
- data/spec/trema/set-eth-dst-addr_spec.rb +75 -0
- data/spec/trema/set-eth-src-addr_spec.rb +72 -0
- data/spec/trema/set-ip-dst-addr_spec.rb +58 -0
- data/spec/trema/set-ip-src-addr_spec.rb +58 -0
- data/spec/trema/set-ip-tos_spec.rb +65 -0
- data/spec/trema/set-transport-dst-port_spec.rb +65 -0
- data/spec/trema/set-transport-src-port_spec.rb +65 -0
- data/spec/trema/set-vlan-priority_spec.rb +65 -0
- data/spec/trema/set-vlan-vid_spec.rb +65 -0
- data/spec/trema/shell/vhost_spec.rb +4 -1
- data/spec/trema/shell/vswitch_spec.rb +11 -11
- data/spec/trema/stats-reply_spec.rb +59 -13
- data/spec/trema/stats-request_spec.rb +6 -0
- data/spec/trema/{action-strip-vlan_spec.rb → strip-vlan-header_spec.rb} +3 -17
- data/spec/trema/switch-daemon_spec.rb +39 -0
- data/spec/trema/vendor-action_spec.rb +81 -0
- data/spec/trema/vendor_spec.rb +76 -0
- data/spec/trema_spec.rb +56 -0
- data/src/examples/dumper/dumper.c +0 -8
- data/src/examples/dumper/dumper.rb +52 -52
- data/src/examples/hello_trema/hello_trema.c +0 -2
- data/src/examples/learning_switch/learning-switch.rb +3 -3
- data/src/examples/multi_learning_switch/multi-learning-switch.rb +3 -3
- data/src/examples/openflow_message/features-request.rb +3 -3
- data/src/examples/packetin_filter_config/utils.c +4 -4
- data/src/examples/repeater_hub/repeater-hub.rb +3 -3
- data/src/examples/switch_info/switch_info.rb +2 -2
- data/src/examples/switch_monitor/switch_monitor.c +1 -1
- data/src/examples/traffic_monitor/traffic-monitor.rb +3 -3
- data/src/lib/arp.h +4 -1
- data/src/lib/chibach.c +391 -0
- data/src/lib/chibach.h +71 -0
- data/src/lib/chibach_private.c +170 -0
- data/src/lib/chibach_private.h +52 -0
- data/src/lib/ether.c +2 -1
- data/src/lib/ether.h +0 -1
- data/src/lib/ipv4.h +13 -14
- data/{ruby/trema/action-set-nw-src.h → src/lib/ipv6.h} +13 -9
- data/src/lib/log.c +161 -58
- data/src/lib/log.h +11 -16
- data/src/lib/messenger.c +36 -1
- data/src/lib/messenger.h +1 -0
- data/src/lib/openflow_application_interface.c +128 -28
- data/src/lib/openflow_application_interface.h +31 -6
- data/src/lib/openflow_message.c +2 -1
- data/src/lib/openflow_service_interface.h +1 -0
- data/src/lib/openflow_switch_interface.c +1380 -0
- data/src/lib/openflow_switch_interface.h +264 -0
- data/src/lib/packet_info.c +94 -11
- data/src/lib/packet_info.h +22 -3
- data/src/lib/packet_parser.c +38 -2
- data/src/lib/secure_channel.c +498 -0
- data/{ruby/trema/vendor-request.h → src/lib/secure_channel.h} +11 -10
- data/src/lib/tcp.h +0 -3
- data/src/lib/trema.c +38 -5
- data/{ruby/trema/action-set-nw-dst.h → src/lib/trema.hpp} +17 -8
- data/src/lib/trema_wrapper.c +5 -0
- data/src/lib/trema_wrapper.h +4 -0
- data/src/lib/utility.c +93 -4
- data/src/lib/utility.h +1 -0
- data/src/lib/wrapper.c +30 -7
- data/src/lib/wrapper.h +2 -0
- data/src/switch_manager/ofpmsg_recv.c +44 -30
- data/src/switch_manager/ofpmsg_send.c +40 -1
- data/src/switch_manager/ofpmsg_send.h +2 -0
- data/src/switch_manager/switch.c +153 -8
- data/src/switch_manager/switch.h +1 -0
- data/src/switch_manager/switchinfo.h +5 -0
- data/src/tremashark/README +2 -2
- data/src/tremashark/plugin/packet-trema/packet-trema.c +1 -0
- data/trema +1 -1
- data/unittests/lib/log_test.c +158 -34
- data/unittests/lib/openflow_application_interface_test.c +252 -69
- data/unittests/lib/openflow_message_test.c +3 -1
- data/unittests/lib/packet_parser_test.c +60 -15
- data/unittests/lib/test_packets/icmp6_echo_rep.cap +0 -0
- data/unittests/lib/test_packets/icmp6_echo_req.cap +0 -0
- data/unittests/lib/trema_test.c +2 -0
- data/unittests/lib/utility_test.c +65 -2
- data/unittests/lib/wrapper_test.c +29 -0
- data/vendor/{README → README.md} +2 -12
- data/vendor/packet-openflow.diff +13 -0
- metadata +86 -53
- data/GPL2 +0 -339
- data/ruby/trema/action-enqueue.c +0 -161
- data/ruby/trema/action-output.c +0 -169
- data/ruby/trema/action-set-dl-dst.c +0 -131
- data/ruby/trema/action-set-dl-dst.h +0 -44
- data/ruby/trema/action-set-dl-src.c +0 -131
- data/ruby/trema/action-set-nw-dst.c +0 -135
- data/ruby/trema/action-set-nw-src.c +0 -140
- data/ruby/trema/action-set-nw-tos.c +0 -124
- data/ruby/trema/action-set-nw-tos.h +0 -42
- data/ruby/trema/action-set-tp-dst.c +0 -122
- data/ruby/trema/action-set-tp-dst.h +0 -42
- data/ruby/trema/action-set-tp-src.c +0 -124
- data/ruby/trema/action-set-tp-src.h +0 -42
- data/ruby/trema/action-set-vlan-pcp.c +0 -128
- data/ruby/trema/action-set-vlan-pcp.h +0 -42
- data/ruby/trema/action-set-vlan-vid.c +0 -125
- data/ruby/trema/action-set-vlan-vid.h +0 -42
- data/ruby/trema/action-strip-vlan.c +0 -81
- data/ruby/trema/action-strip-vlan.h +0 -42
- data/ruby/trema/action-vendor.c +0 -121
- data/ruby/trema/vendor-request.c +0 -193
- data/spec/trema/action-enqueue_spec.rb +0 -100
- data/spec/trema/action-set-dl-dst_spec.rb +0 -95
- data/spec/trema/action-set-dl-src_spec.rb +0 -92
- data/spec/trema/action-set-nw-dst_spec.rb +0 -96
- data/spec/trema/action-set-nw-src_spec.rb +0 -97
- data/spec/trema/action-set-nw-tos_spec.rb +0 -88
- data/spec/trema/action-set-tp-dst_spec.rb +0 -88
- data/spec/trema/action-set-tp-src_spec.rb +0 -88
- data/spec/trema/action-set-vlan-pcp_spec.rb +0 -91
- data/spec/trema/action-set-vlan-vid_spec.rb +0 -91
- data/spec/trema/action-vendor_spec.rb +0 -90
- data/spec/trema/vendor-request_spec.rb +0 -79
data/src/lib/log.h
CHANGED
|
@@ -36,28 +36,23 @@
|
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
#include "bool.h"
|
|
39
|
+
#include <syslog.h>
|
|
39
40
|
|
|
40
41
|
|
|
41
|
-
/**
|
|
42
|
-
* Constants specifying the level of log messages.
|
|
43
|
-
*/
|
|
44
42
|
typedef enum {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
bool init_log( const char *ident, const char *log_directory, bool run_as_daemon );
|
|
55
|
-
void restart_log( const char *ident, const char *log_directory );
|
|
56
|
-
void rename_log( const char *old_ident, const char *new_ident, const char *directory );
|
|
43
|
+
LOGGING_TYPE_FILE = 0x1,
|
|
44
|
+
LOGGING_TYPE_SYSLOG = 0x2,
|
|
45
|
+
LOGGING_TYPE_STDOUT = 0x4,
|
|
46
|
+
} logging_type;
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
bool init_log( const char *ident, const char *log_directory, logging_type type );
|
|
50
|
+
void restart_log( const char *new_ident );
|
|
51
|
+
void rename_log( const char *new_ident );
|
|
57
52
|
bool finalize_log( void );
|
|
58
53
|
|
|
59
54
|
bool set_logging_level( const char *level );
|
|
60
|
-
extern
|
|
55
|
+
extern int ( *get_logging_level )( void );
|
|
61
56
|
|
|
62
57
|
extern void ( *critical )( const char *format, ... );
|
|
63
58
|
extern void ( *error )( const char *format, ... );
|
data/src/lib/messenger.c
CHANGED
|
@@ -1052,7 +1052,7 @@ push_message_to_send_queue( const char *service_name, const uint8_t message_type
|
|
|
1052
1052
|
}
|
|
1053
1053
|
|
|
1054
1054
|
set_writable( sq->server_socket, true );
|
|
1055
|
-
if ( sq->buffer->data_length
|
|
1055
|
+
if ( sq->buffer->data_length > messenger_send_length_for_flush ) {
|
|
1056
1056
|
on_send_write( sq->server_socket, sq );
|
|
1057
1057
|
}
|
|
1058
1058
|
return true;
|
|
@@ -1152,6 +1152,41 @@ _send_reply_message( const messenger_context_handle *handle, const uint16_t tag,
|
|
|
1152
1152
|
bool ( *send_reply_message )( const messenger_context_handle *handle, const uint16_t tag, const void *data, size_t len ) = _send_reply_message;
|
|
1153
1153
|
|
|
1154
1154
|
|
|
1155
|
+
static bool
|
|
1156
|
+
_clear_send_queue( const char *service_name ) {
|
|
1157
|
+
assert( service_name != NULL );
|
|
1158
|
+
|
|
1159
|
+
debug( "Deleting all messages from send queue ( service_name = %s ).", service_name );
|
|
1160
|
+
|
|
1161
|
+
if ( send_queues == NULL ) {
|
|
1162
|
+
error( "All send queues are already deleted or not created yet." );
|
|
1163
|
+
return false;
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1166
|
+
send_queue *sq = lookup_hash_entry( send_queues, service_name );
|
|
1167
|
+
|
|
1168
|
+
if ( NULL == sq ) {
|
|
1169
|
+
error( "Send queue is already deleted or not created yet ( service_name = %s ).", service_name );
|
|
1170
|
+
return false;
|
|
1171
|
+
}
|
|
1172
|
+
if ( NULL == sq->buffer ) {
|
|
1173
|
+
error( "Message buffer is already deleted or not created yet ( send_queue = %p, service_name = %s ).",
|
|
1174
|
+
sq, service_name );
|
|
1175
|
+
return false;
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1178
|
+
if ( sq->buffer->data_length > 0 ) {
|
|
1179
|
+
set_writable( sq->server_socket, false );
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1182
|
+
sq->buffer->head_offset = 0;
|
|
1183
|
+
sq->buffer->data_length = 0;
|
|
1184
|
+
|
|
1185
|
+
return true;
|
|
1186
|
+
}
|
|
1187
|
+
bool ( *clear_send_queue )( const char *service_name ) = _clear_send_queue;
|
|
1188
|
+
|
|
1189
|
+
|
|
1155
1190
|
static void
|
|
1156
1191
|
number_of_send_queue( int *connected_count, int *sending_count, int *reconnecting_count, int *closed_count ) {
|
|
1157
1192
|
assert( connected_count != NULL );
|
data/src/lib/messenger.h
CHANGED
|
@@ -121,6 +121,7 @@ extern bool ( *delete_message_replied_callback )( const char *service_name, void
|
|
|
121
121
|
extern bool ( *send_message )( const char *service_name, const uint16_t tag, const void *data, size_t len );
|
|
122
122
|
extern bool ( *send_request_message )( const char *to_service_name, const char *from_service_name, const uint16_t tag, const void *data, size_t len, void *user_data );
|
|
123
123
|
extern bool ( *send_reply_message )( const messenger_context_handle *handle, const uint16_t tag, const void *data, size_t len );
|
|
124
|
+
extern bool ( *clear_send_queue ) ( const char *service_name );
|
|
124
125
|
|
|
125
126
|
bool init_messenger( const char *working_directory );
|
|
126
127
|
bool finalize_messenger( void );
|
|
@@ -89,6 +89,12 @@ bool mock_delete_message_received_callback( char *service_name,
|
|
|
89
89
|
bool mock_delete_message_replied_callback( char *service_name,
|
|
90
90
|
void ( *callback )( uint16_t tag, void *data, size_t len, void *user_data ) );
|
|
91
91
|
|
|
92
|
+
#ifdef clear_send_queue
|
|
93
|
+
#undef clear_send_queue
|
|
94
|
+
#endif
|
|
95
|
+
#define clear_send_queue mock_clear_send_queue
|
|
96
|
+
bool mock_clear_send_queue( const char *service_name );
|
|
97
|
+
|
|
92
98
|
#ifdef getpid
|
|
93
99
|
#undef getpid
|
|
94
100
|
#endif
|
|
@@ -293,6 +299,26 @@ set_error_handler( error_handler callback, void *user_data ) {
|
|
|
293
299
|
}
|
|
294
300
|
|
|
295
301
|
|
|
302
|
+
bool
|
|
303
|
+
set_echo_reply_handler( echo_reply_handler callback, void *user_data ) {
|
|
304
|
+
if ( callback == NULL ) {
|
|
305
|
+
die( "Callback function ( echo_reply_handler ) must not be NULL." );
|
|
306
|
+
}
|
|
307
|
+
assert( callback != NULL );
|
|
308
|
+
|
|
309
|
+
maybe_init_openflow_application_interface();
|
|
310
|
+
assert( openflow_application_interface_initialized );
|
|
311
|
+
|
|
312
|
+
debug( "Setting a echo reply handler ( callback = %p, user_data = %p ).",
|
|
313
|
+
callback, user_data );
|
|
314
|
+
|
|
315
|
+
event_handlers.echo_reply_callback = callback;
|
|
316
|
+
event_handlers.echo_reply_user_data = user_data;
|
|
317
|
+
|
|
318
|
+
return true;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
|
|
296
322
|
bool
|
|
297
323
|
set_vendor_handler( vendor_handler callback, void *user_data ) {
|
|
298
324
|
if ( callback == NULL ) {
|
|
@@ -536,6 +562,57 @@ handle_error( const uint64_t datapath_id, buffer *data ) {
|
|
|
536
562
|
}
|
|
537
563
|
|
|
538
564
|
|
|
565
|
+
static void
|
|
566
|
+
handle_echo_reply( const uint64_t datapath_id, buffer *data ) {
|
|
567
|
+
uint16_t body_length;
|
|
568
|
+
uint32_t transaction_id;
|
|
569
|
+
buffer *body;
|
|
570
|
+
struct ofp_header *header;
|
|
571
|
+
|
|
572
|
+
if ( ( data == NULL ) || ( ( data != NULL ) && ( data->length == 0 ) ) ) {
|
|
573
|
+
critical( "An OpenFlow message must be filled before calling handle_echo_reply()." );
|
|
574
|
+
assert( 0 );
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
header = ( struct ofp_header * ) data->data;
|
|
578
|
+
|
|
579
|
+
transaction_id = ntohl( header->xid );
|
|
580
|
+
|
|
581
|
+
body_length = ( uint16_t ) ( ntohs( header->length )
|
|
582
|
+
- sizeof( struct ofp_header ) );
|
|
583
|
+
|
|
584
|
+
debug( "A echo reply message is received from %#" PRIx64
|
|
585
|
+
" ( transaction_id = %#x, body length = %u ).",
|
|
586
|
+
datapath_id, transaction_id, body_length );
|
|
587
|
+
|
|
588
|
+
if ( event_handlers.echo_reply_callback == NULL ) {
|
|
589
|
+
debug( "Callback function for echo reply events is not set." );
|
|
590
|
+
return;
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
if ( body_length > 0 ) {
|
|
594
|
+
body = duplicate_buffer( data );
|
|
595
|
+
remove_front_buffer( body, sizeof( struct ofp_header ) );
|
|
596
|
+
}
|
|
597
|
+
else {
|
|
598
|
+
body = NULL;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
debug( "Calling echo reply handler ( callback = %p, user_data = %p ).",
|
|
602
|
+
event_handlers.echo_reply_callback, event_handlers.echo_reply_user_data );
|
|
603
|
+
|
|
604
|
+
event_handlers.echo_reply_callback( datapath_id,
|
|
605
|
+
transaction_id,
|
|
606
|
+
body,
|
|
607
|
+
event_handlers.echo_reply_user_data );
|
|
608
|
+
|
|
609
|
+
if ( body != NULL ) {
|
|
610
|
+
free_buffer( body );
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
|
|
615
|
+
|
|
539
616
|
static void
|
|
540
617
|
handle_vendor( const uint64_t datapath_id, buffer *data ) {
|
|
541
618
|
uint16_t body_length;
|
|
@@ -631,7 +708,7 @@ handle_features_reply( const uint64_t datapath_id, buffer *data ) {
|
|
|
631
708
|
ntoh_phy_port( p, phy_port );
|
|
632
709
|
append_to_tail( &phy_ports_head, ( void * ) p );
|
|
633
710
|
phy_port_to_string( p, description, sizeof( description ) );
|
|
634
|
-
debug( "[%
|
|
711
|
+
debug( "[%p] %s", phy_port, description );
|
|
635
712
|
phy_port++;
|
|
636
713
|
}
|
|
637
714
|
}
|
|
@@ -1114,7 +1191,7 @@ static void
|
|
|
1114
1191
|
handle_barrier_reply( const uint64_t datapath_id, buffer *data ) {
|
|
1115
1192
|
uint32_t transaction_id;
|
|
1116
1193
|
struct ofp_header *header;
|
|
1117
|
-
|
|
1194
|
+
|
|
1118
1195
|
if ( ( data == NULL ) || ( ( data != NULL ) && ( data->length == 0 ) ) ) {
|
|
1119
1196
|
critical( "An OpenFlow message must be filled before calling handle_barrier_reply()." );
|
|
1120
1197
|
assert( 0 );
|
|
@@ -1252,6 +1329,9 @@ update_switch_event_stats( uint16_t type, int send_receive, bool result ) {
|
|
|
1252
1329
|
case MESSENGER_OPENFLOW_DISCONNECTED:
|
|
1253
1330
|
snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "switch_disconnected", direction, suffix );
|
|
1254
1331
|
break;
|
|
1332
|
+
case MESSENGER_OPENFLOW_FAILD_TO_CONNECT:
|
|
1333
|
+
snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "switch_failed_to_connect", direction, suffix );
|
|
1334
|
+
break;
|
|
1255
1335
|
default:
|
|
1256
1336
|
snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "undefined_switch_event", direction, suffix );
|
|
1257
1337
|
break;
|
|
@@ -1286,39 +1366,43 @@ handle_switch_ready( uint64_t datapath_id ) {
|
|
|
1286
1366
|
|
|
1287
1367
|
|
|
1288
1368
|
static void
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1369
|
+
handle_messenger_openflow_disconnected( uint64_t datapath_id ) {
|
|
1370
|
+
if ( event_handlers.switch_disconnected_callback != NULL ) {
|
|
1371
|
+
debug( "Calling switch disconnected handler (callback = %p, user_data = %p).",
|
|
1372
|
+
event_handlers.switch_disconnected_callback, event_handlers.switch_disconnected_user_data );
|
|
1373
|
+
event_handlers.switch_disconnected_callback( datapath_id, event_handlers.switch_disconnected_user_data );
|
|
1374
|
+
}
|
|
1375
|
+
else {
|
|
1376
|
+
debug( "Callback function for switch disconnected events is not set." );
|
|
1377
|
+
}
|
|
1378
|
+
delete_openflow_messages( datapath_id );
|
|
1379
|
+
}
|
|
1380
|
+
|
|
1292
1381
|
|
|
1382
|
+
static void
|
|
1383
|
+
handle_switch_events( uint16_t type, void *data, size_t length ) {
|
|
1293
1384
|
assert( data != NULL );
|
|
1294
1385
|
assert( length == sizeof( openflow_service_header_t ) );
|
|
1295
1386
|
|
|
1296
|
-
debug( "
|
|
1387
|
+
debug( "Received a switch event (type = %u) from remote.", type );
|
|
1297
1388
|
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
datapath_id = ntohll( message->datapath_id );
|
|
1389
|
+
openflow_service_header_t *message = data;
|
|
1390
|
+
uint64_t datapath_id = ntohll( message->datapath_id );
|
|
1301
1391
|
|
|
1302
1392
|
switch ( type ) {
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
debug( "Callback function for switch disconnected events is not set." );
|
|
1317
|
-
}
|
|
1318
|
-
break;
|
|
1319
|
-
default:
|
|
1320
|
-
error( "Unhandled switch event ( type = %u ).", type );
|
|
1321
|
-
break;
|
|
1393
|
+
case MESSENGER_OPENFLOW_CONNECTED:
|
|
1394
|
+
case MESSENGER_OPENFLOW_FAILD_TO_CONNECT:
|
|
1395
|
+
// Do nothing.
|
|
1396
|
+
break;
|
|
1397
|
+
case MESSENGER_OPENFLOW_READY:
|
|
1398
|
+
handle_switch_ready( datapath_id );
|
|
1399
|
+
break;
|
|
1400
|
+
case MESSENGER_OPENFLOW_DISCONNECTED:
|
|
1401
|
+
handle_messenger_openflow_disconnected( datapath_id );
|
|
1402
|
+
break;
|
|
1403
|
+
default:
|
|
1404
|
+
error( "Unhandled switch event (type = %u).", type );
|
|
1405
|
+
break;
|
|
1322
1406
|
}
|
|
1323
1407
|
|
|
1324
1408
|
update_switch_event_stats( type, OPENFLOW_MESSAGE_RECEIVE, true );
|
|
@@ -1471,6 +1555,9 @@ handle_openflow_message( void *data, size_t length ) {
|
|
|
1471
1555
|
case OFPT_ERROR:
|
|
1472
1556
|
handle_error( datapath_id, buffer );
|
|
1473
1557
|
break;
|
|
1558
|
+
case OFPT_ECHO_REPLY:
|
|
1559
|
+
handle_echo_reply( datapath_id, buffer );
|
|
1560
|
+
break;
|
|
1474
1561
|
case OFPT_VENDOR:
|
|
1475
1562
|
handle_vendor( datapath_id, buffer );
|
|
1476
1563
|
break;
|
|
@@ -1520,6 +1607,7 @@ handle_message( uint16_t type, void *data, size_t length ) {
|
|
|
1520
1607
|
case MESSENGER_OPENFLOW_MESSAGE:
|
|
1521
1608
|
return handle_openflow_message( data, length );
|
|
1522
1609
|
case MESSENGER_OPENFLOW_CONNECTED:
|
|
1610
|
+
case MESSENGER_OPENFLOW_FAILD_TO_CONNECT:
|
|
1523
1611
|
case MESSENGER_OPENFLOW_READY:
|
|
1524
1612
|
case MESSENGER_OPENFLOW_DISCONNECTED:
|
|
1525
1613
|
return handle_switch_events( type, data, length );
|
|
@@ -1665,6 +1753,18 @@ send_list_switches_request( void *user_data ) {
|
|
|
1665
1753
|
}
|
|
1666
1754
|
|
|
1667
1755
|
|
|
1756
|
+
bool
|
|
1757
|
+
delete_openflow_messages( uint64_t datapath_id ) {
|
|
1758
|
+
debug( "Deleting OpenFlow messages in a send queue ( datapath_id = %#" PRIx64 " ).", datapath_id );
|
|
1759
|
+
|
|
1760
|
+
char remote_service_name[ MESSENGER_SERVICE_NAME_LENGTH ];
|
|
1761
|
+
memset( remote_service_name, '\0', sizeof( remote_service_name ) );
|
|
1762
|
+
snprintf( remote_service_name, sizeof( remote_service_name ),
|
|
1763
|
+
"switch.%#" PRIx64, datapath_id );
|
|
1764
|
+
return clear_send_queue( remote_service_name );
|
|
1765
|
+
}
|
|
1766
|
+
|
|
1767
|
+
|
|
1668
1768
|
/*
|
|
1669
1769
|
* Local variables:
|
|
1670
1770
|
* c-basic-offset: 2
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
#define OPENFLOW_APPLICATION_INTERFACE_H
|
|
25
25
|
|
|
26
26
|
|
|
27
|
+
#include <arpa/inet.h>
|
|
27
28
|
#include "buffer.h"
|
|
28
29
|
#include "linked_list.h"
|
|
29
30
|
#include "openflow.h"
|
|
@@ -72,6 +73,14 @@ typedef void ( *error_handler )(
|
|
|
72
73
|
);
|
|
73
74
|
|
|
74
75
|
|
|
76
|
+
typedef void ( *echo_reply_handler )(
|
|
77
|
+
uint64_t datapath_id,
|
|
78
|
+
uint32_t transaction_id,
|
|
79
|
+
const buffer *data,
|
|
80
|
+
void *user_data
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
|
|
75
84
|
typedef void ( *vendor_handler )(
|
|
76
85
|
uint64_t datapath_id,
|
|
77
86
|
uint32_t transaction_id,
|
|
@@ -210,6 +219,9 @@ typedef struct openflow_event_handlers {
|
|
|
210
219
|
error_handler error_callback;
|
|
211
220
|
void *error_user_data;
|
|
212
221
|
|
|
222
|
+
echo_reply_handler echo_reply_callback;
|
|
223
|
+
void *echo_reply_user_data;
|
|
224
|
+
|
|
213
225
|
vendor_handler vendor_callback;
|
|
214
226
|
void *vendor_user_data;
|
|
215
227
|
|
|
@@ -252,10 +264,10 @@ bool set_openflow_event_handlers( const openflow_event_handlers_t handlers );
|
|
|
252
264
|
#define set_switch_ready_handler( callback, user_data ) \
|
|
253
265
|
{ \
|
|
254
266
|
if ( __builtin_types_compatible_p( typeof( callback ), simple_switch_ready_handler ) ) { \
|
|
255
|
-
_set_switch_ready_handler( true, callback, user_data );
|
|
267
|
+
_set_switch_ready_handler( true, ( void * ) callback, user_data ); \
|
|
256
268
|
} \
|
|
257
269
|
else if ( __builtin_types_compatible_p( typeof( callback ), switch_ready_handler ) ) { \
|
|
258
|
-
_set_switch_ready_handler( false, callback, user_data );
|
|
270
|
+
_set_switch_ready_handler( false, ( void * ) callback, user_data ); \
|
|
259
271
|
} \
|
|
260
272
|
else { \
|
|
261
273
|
_set_switch_ready_handler( false, NULL, NULL ); \
|
|
@@ -266,6 +278,7 @@ bool _set_switch_ready_handler( bool simple_callback, void *callback, void *user
|
|
|
266
278
|
|
|
267
279
|
bool set_switch_disconnected_handler( switch_disconnected_handler callback, void *user_data );
|
|
268
280
|
bool set_error_handler( error_handler callback, void *user_data );
|
|
281
|
+
bool set_echo_reply_handler( echo_reply_handler callback, void *user_data );
|
|
269
282
|
bool set_vendor_handler( vendor_handler callback, void *user_data );
|
|
270
283
|
bool set_features_reply_handler( features_reply_handler callback, void *user_data );
|
|
271
284
|
bool set_get_config_reply_handler( get_config_reply_handler callback, void *user_data );
|
|
@@ -274,10 +287,10 @@ bool set_get_config_reply_handler( get_config_reply_handler callback, void *user
|
|
|
274
287
|
#define set_packet_in_handler( callback, user_data ) \
|
|
275
288
|
{ \
|
|
276
289
|
if ( __builtin_types_compatible_p( typeof( callback ), simple_packet_in_handler ) ) { \
|
|
277
|
-
_set_packet_in_handler( true, callback, user_data );
|
|
290
|
+
_set_packet_in_handler( true, ( void * ) callback, user_data ); \
|
|
278
291
|
} \
|
|
279
292
|
else if ( __builtin_types_compatible_p( typeof( callback ), packet_in_handler ) ) { \
|
|
280
|
-
_set_packet_in_handler( false, callback, user_data );
|
|
293
|
+
_set_packet_in_handler( false, ( void * ) callback, user_data ); \
|
|
281
294
|
} \
|
|
282
295
|
else { \
|
|
283
296
|
_set_packet_in_handler( false, NULL, NULL ); \
|
|
@@ -289,10 +302,10 @@ bool _set_packet_in_handler( bool simple_callback, void *callback, void *user_da
|
|
|
289
302
|
#define set_flow_removed_handler( callback, user_data ) \
|
|
290
303
|
{ \
|
|
291
304
|
if ( __builtin_types_compatible_p( typeof( callback ), simple_flow_removed_handler ) ) { \
|
|
292
|
-
_set_flow_removed_handler( true, callback, user_data );
|
|
305
|
+
_set_flow_removed_handler( true, ( void * ) callback, user_data ); \
|
|
293
306
|
} \
|
|
294
307
|
else if ( __builtin_types_compatible_p( typeof( callback ), flow_removed_handler ) ) { \
|
|
295
|
-
_set_flow_removed_handler( false, callback, user_data );
|
|
308
|
+
_set_flow_removed_handler( false, ( void * ) callback, user_data ); \
|
|
296
309
|
} \
|
|
297
310
|
else { \
|
|
298
311
|
_set_flow_removed_handler( false, NULL, NULL ); \
|
|
@@ -315,9 +328,21 @@ bool set_list_switches_reply_handler( list_switches_reply_handler callback );
|
|
|
315
328
|
|
|
316
329
|
bool send_openflow_message( const uint64_t datapath_id, buffer *message );
|
|
317
330
|
|
|
331
|
+
|
|
332
|
+
/********************************************************************************
|
|
333
|
+
* Function for retrieving the list of switches from Switch Manager.
|
|
334
|
+
********************************************************************************/
|
|
335
|
+
|
|
318
336
|
bool send_list_switches_request( void *user_data );
|
|
319
337
|
|
|
320
338
|
|
|
339
|
+
/********************************************************************************
|
|
340
|
+
* Function for deleting OpenFlow messages in a send queue
|
|
341
|
+
********************************************************************************/
|
|
342
|
+
|
|
343
|
+
bool delete_openflow_messages( uint64_t datapath_id );
|
|
344
|
+
|
|
345
|
+
|
|
321
346
|
#endif // OPENFLOW_APPLICATION_INTERFACE_H
|
|
322
347
|
|
|
323
348
|
|
data/src/lib/openflow_message.c
CHANGED
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
#include <string.h>
|
|
26
26
|
#include <sys/socket.h>
|
|
27
27
|
#include <sys/types.h>
|
|
28
|
+
#include <syslog.h>
|
|
28
29
|
#include <unistd.h>
|
|
29
30
|
#include "openflow_message.h"
|
|
30
31
|
#include "packet_info.h"
|
|
@@ -139,7 +140,7 @@ create_error( const uint32_t transaction_id, const uint16_t type,
|
|
|
139
140
|
debug( "Creating an error ( xid = %#x, type = %#x, code = %#x, data length = %u ).",
|
|
140
141
|
transaction_id, type, code, data_len );
|
|
141
142
|
|
|
142
|
-
length =
|
|
143
|
+
length = ( uint16_t ) ( sizeof( struct ofp_error_msg ) + data_len );
|
|
143
144
|
buffer = create_header( transaction_id, OFPT_ERROR, length );
|
|
144
145
|
assert( buffer != NULL );
|
|
145
146
|
|