trema 0.2.5 → 0.2.6
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/.gitignore +1 -1
- data/Doxyfile +1 -1
- data/Gemfile +18 -6
- data/README.md +112 -5
- data/Rakefile +3 -1
- data/Rantfile +88 -1
- data/bin/trema +248 -0
- data/bin/trema-config +59 -0
- data/cruise.rb +1 -1
- data/features/example.dumper.feature +45 -65
- data/features/example.hello_trema.feature +21 -0
- data/features/example.learning_switch.feature +26 -28
- data/features/example.list_switches.feature +19 -33
- data/features/example.message.echo_reply.feature +10 -10
- data/features/example.message.echo_request.feature +2 -2
- data/features/example.message.features_request.feature +6 -5
- data/features/example.message.hello.feature +47 -13
- data/features/example.message.set_config.feature +4 -4
- data/features/example.message.vendor-action.feature +23 -0
- data/features/example.multi_learning_switch.feature +14 -42
- data/features/example.packet_in.feature +31 -0
- data/features/example.packetin_filter_config.feature +11 -7
- data/features/example.patch_panel.feature +29 -0
- data/features/example.repeater_hub.feature +43 -40
- data/features/example.switch_info.feature +51 -0
- data/features/example.switch_monitor.feature +24 -42
- data/features/packetin_filter.feature +28 -22
- data/features/step_definitions/misc_steps.rb +19 -8
- data/features/step_definitions/send_packets_steps.rb +1 -10
- data/features/step_definitions/stats_steps.rb +4 -4
- data/features/support/env.rb +2 -1
- data/features/support/hooks.rb +35 -2
- data/features/switch_manager.feature +18 -12
- data/features/trema-config.feature +26 -39
- data/features/trema.dump_flows.feature +26 -12
- data/features/trema.help.feature +26 -0
- data/features/trema.kill.feature +39 -41
- data/features/trema.killall.feature +23 -23
- data/features/trema.reset_stats.feature +50 -10
- data/features/trema.run.feature +28 -39
- data/features/trema.send_packets.feature +29 -40
- data/features/trema.show_stats.feature +30 -33
- data/features/trema.up.feature +33 -0
- data/features/trema.version.feature +9 -0
- data/ruby/extconf.rb +7 -0
- data/ruby/trema/aggregate-stats-reply.rb +3 -3
- data/ruby/trema/app.rb +5 -1
- data/ruby/trema/barrier-request.c +55 -30
- data/ruby/trema/cli.rb +8 -8
- data/ruby/trema/command.rb +1 -3
- data/ruby/trema/command/dump_flows.rb +5 -24
- data/ruby/trema/command/kill.rb +31 -36
- data/ruby/trema/command/killall.rb +1 -19
- data/{features/step_definitions/kill_steps.rb → ruby/trema/command/netns.rb} +13 -5
- data/ruby/trema/command/reset_stats.rb +3 -23
- data/ruby/trema/command/ruby.rb +2 -19
- data/ruby/trema/command/run.rb +6 -27
- data/ruby/trema/command/send_packets.rb +6 -90
- data/ruby/trema/command/show_stats.rb +21 -40
- data/ruby/trema/command/up.rb +5 -26
- data/ruby/trema/command/version.rb +1 -5
- data/ruby/trema/controller.c +14 -16
- data/ruby/trema/custom-switch.rb +56 -0
- data/ruby/trema/desc-stats-reply.rb +5 -5
- data/ruby/trema/dsl/configuration.rb +4 -0
- data/{features/step_definitions/up_steps.rb → ruby/trema/dsl/custom-switch.rb} +18 -4
- data/ruby/trema/dsl/netns.rb +78 -0
- data/ruby/trema/dsl/parser.rb +2 -0
- data/ruby/trema/dsl/runner.rb +8 -0
- data/ruby/trema/dsl/syntax.rb +18 -0
- data/ruby/trema/echo-reply.h +2 -2
- data/ruby/trema/echo-request.c +3 -5
- data/ruby/trema/enqueue.rb +2 -2
- data/ruby/trema/error.c +3 -3
- data/ruby/trema/executables.rb +26 -2
- data/ruby/trema/features-request.c +3 -5
- data/ruby/trema/flow-removed.c +6 -6
- data/ruby/trema/flow-stats-reply.rb +6 -8
- data/ruby/trema/flow.rb +12 -1
- data/ruby/trema/get-config-request.c +55 -28
- data/ruby/trema/hello.c +3 -5
- data/ruby/trema/host.rb +8 -0
- data/ruby/trema/list-switches-reply.c +1 -1
- data/ruby/trema/mac.rb +1 -1
- data/ruby/trema/match.c +15 -14
- data/ruby/trema/monkey-patch/module/deprecation.rb +0 -2
- data/ruby/trema/netns.rb +127 -0
- data/ruby/trema/ordered-hash.rb +5 -4
- data/ruby/trema/packet-in.c +136 -113
- data/ruby/trema/packet-queue.rb +9 -9
- data/ruby/trema/packetin-filter.rb +1 -1
- data/ruby/trema/phost.rb +16 -7
- data/ruby/trema/port-mod.c +6 -5
- data/ruby/trema/port-stats-reply.rb +2 -2
- data/ruby/trema/process.rb +29 -0
- data/ruby/trema/queue-stats-reply.rb +2 -4
- data/ruby/trema/send-out-port.rb +5 -3
- data/ruby/trema/set-eth-addr.rb +4 -0
- data/ruby/trema/set-ip-addr.rb +4 -2
- data/ruby/trema/set-ip-dst-addr.rb +2 -1
- data/ruby/trema/set-ip-src-addr.rb +2 -1
- data/ruby/trema/set-ip-tos.rb +3 -2
- data/ruby/trema/set-transport-port.rb +3 -2
- data/ruby/trema/set-vlan-priority.rb +3 -2
- data/ruby/trema/set-vlan-vid.rb +5 -4
- data/ruby/trema/shell/reset_stats.rb +2 -1
- data/ruby/trema/shell/run.rb +1 -1
- data/ruby/trema/shell/send_packets.rb +1 -1
- data/ruby/trema/shell/show_stats.rb +1 -1
- data/ruby/trema/stats-helper.rb +3 -3
- data/ruby/trema/stats-reply.c +26 -17
- data/ruby/trema/stats-request.c +39 -41
- data/ruby/trema/switch-daemon.rb +36 -31
- data/ruby/trema/switch.c +1 -1
- data/ruby/trema/table-stats-reply.rb +1 -1
- data/ruby/trema/timers.rb +13 -13
- data/ruby/trema/trema.c +3 -3
- data/ruby/trema/tremashark.rb +9 -2
- data/ruby/trema/util.rb +39 -15
- data/ruby/trema/vendor-action.rb +8 -3
- data/ruby/trema/vendor-stats-reply.rb +4 -6
- data/ruby/trema/vendor.c +1 -1
- data/ruby/trema/version.rb +1 -1
- data/spec/trema/barrier-request_spec.rb +47 -37
- data/spec/trema/controller_spec.rb +1 -0
- data/spec/trema/dsl/runner_spec.rb +8 -3
- data/spec/trema/dsl/vhost_spec.rb +8 -8
- data/spec/trema/echo-request_spec.rb +1 -0
- data/spec/trema/features-request_spec.rb +1 -0
- data/spec/trema/flow-removed_spec.rb +9 -9
- data/spec/trema/get-config-request_spec.rb +51 -39
- data/spec/trema/match_spec.rb +1 -1
- data/spec/trema/openflow-error_spec.rb +11 -11
- data/spec/trema/packet-out_spec.rb +5 -5
- data/spec/trema/queue-get-config-reply_spec.rb +1 -1
- data/spec/trema/queue-get-config-request_spec.rb +1 -1
- data/spec/trema/set-eth-dst-addr_spec.rb +1 -1
- data/spec/trema/set-eth-src-addr_spec.rb +1 -1
- data/spec/trema/set-ip-dst-addr_spec.rb +1 -0
- data/spec/trema/set-ip-src-addr_spec.rb +1 -0
- data/spec/trema/set-ip-tos_spec.rb +1 -0
- data/spec/trema/set-transport-dst-port_spec.rb +1 -0
- data/spec/trema/set-transport-src-port_spec.rb +1 -0
- data/spec/trema/set-vlan-priority_spec.rb +1 -0
- data/spec/trema/set-vlan-vid_spec.rb +2 -1
- data/spec/trema/stats-reply_spec.rb +38 -36
- data/spec/trema/stats-request_spec.rb +6 -6
- data/spec/trema/strip-vlan-header_spec.rb +1 -0
- data/spec/trema/util_spec.rb +3 -2
- data/spec/trema/vendor-action_spec.rb +9 -8
- data/src/examples/dumper/dumper.c +8 -6
- data/src/examples/dumper/dumper.rb +1 -1
- data/{features/step_definitions/killall_steps.rb → src/examples/hello_trema/hello-trema.rb} +6 -5
- data/src/examples/hello_trema/hello_trema.c +4 -4
- data/src/examples/learning_switch/learning_switch.c +1 -1
- data/src/examples/list_switches/list_switches.c +2 -2
- data/src/examples/match_compare/match-compare.rb +2 -2
- data/src/examples/multi_learning_switch/multi-learning-switch.rb +1 -1
- data/src/examples/multi_learning_switch/multi_learning_switch.c +3 -3
- data/src/examples/openflow_message/README +1 -1
- data/src/examples/openflow_message/echo-request.rb +1 -1
- data/src/examples/openflow_message/features_request.c +21 -21
- data/src/examples/openflow_message/hello.c +1 -3
- data/src/examples/openflow_message/hello.rb +9 -24
- data/src/examples/{hello_trema/hello_trema.rb → openflow_message/vendor-action.rb} +17 -7
- data/src/examples/openflow_message/vendor_action.c +105 -0
- data/src/examples/openflow_switch/hello_switch.c +81 -0
- data/src/examples/packet_in/packet-in.rb +9 -13
- data/src/examples/packetin_filter_config/packetin_filter_config.c +2 -2
- data/src/examples/patch_panel/network.conf +14 -0
- data/src/examples/patch_panel/patch-panel.conf +1 -0
- data/{features/step_definitions/show_stats_steps.rb → src/examples/patch_panel/patch-panel.rb} +29 -13
- data/src/examples/switch_info/{switch_info.rb → switch-info.rb} +2 -2
- data/src/examples/switch_info/switch_info.c +4 -4
- data/src/examples/switch_monitor/switch_monitor.c +3 -3
- data/src/examples/traffic_monitor/counter.c +9 -9
- data/src/examples/traffic_monitor/fdb.c +9 -9
- data/src/lib/arp.h +1 -1
- data/src/lib/buffer.c +4 -3
- data/src/lib/byteorder.c +31 -5
- data/src/lib/byteorder.h +2 -2
- data/src/lib/chibach.c +8 -6
- data/src/lib/daemon.c +29 -3
- data/src/lib/doubly_linked_list.c +6 -1
- data/src/lib/ether.c +1 -1
- data/src/lib/ether.h +1 -1
- data/src/lib/event_handler.c +3 -3
- data/src/lib/hash_table.c +1 -1
- data/src/lib/linked_list.c +50 -2
- data/src/lib/linked_list.h +2 -2
- data/src/lib/log.c +122 -22
- data/src/lib/log.h +13 -9
- data/src/lib/management_interface.c +361 -0
- data/src/lib/management_interface.h +42 -0
- data/src/lib/management_service_interface.c +104 -0
- data/src/lib/management_service_interface.h +136 -0
- data/src/lib/match_table.c +5 -5
- data/src/lib/message_queue.c +5 -3
- data/src/lib/message_queue.h +1 -1
- data/src/lib/messenger.c +73 -39
- data/src/lib/messenger.h +3 -2
- data/src/lib/openflow_application_interface.c +17 -17
- data/src/lib/openflow_message.c +175 -23
- data/src/lib/openflow_message.h +2 -1
- data/src/lib/openflow_switch_interface.c +12 -12
- data/src/lib/packet_parser.c +11 -32
- data/src/lib/packetin_filter_interface.c +5 -5
- data/src/lib/persistent_storage.c +7 -7
- data/src/lib/secure_channel.c +6 -6
- data/src/lib/secure_channel.h +1 -1
- data/src/lib/stat.c +54 -17
- data/src/lib/stat.h +9 -0
- data/src/lib/timer.c +11 -10
- data/src/lib/trema.c +38 -9
- data/src/lib/trema.h +1 -0
- data/src/lib/trema_private.h +6 -0
- data/src/lib/trema_wrapper.c +4 -4
- data/src/lib/trema_wrapper.h +10 -10
- data/src/lib/utility.c +6 -6
- data/src/management/application.c +224 -0
- data/src/management/echo.c +185 -0
- data/src/management/set_logging_level.c +153 -0
- data/src/management/show_stats.c +150 -0
- data/src/management/trema_manager +184 -0
- data/src/packetin_filter/packetin_filter.c +31 -29
- data/src/switch_manager/cookie_table.c +7 -7
- data/src/switch_manager/dpid_table.c +3 -3
- data/src/switch_manager/dpid_table.h +0 -1
- data/src/switch_manager/management_interface.h +0 -1
- data/src/switch_manager/ofpmsg_recv.c +3 -3
- data/src/switch_manager/ofpmsg_recv.h +0 -1
- data/src/switch_manager/ofpmsg_send.c +2 -2
- data/src/switch_manager/ofpmsg_send.h +0 -1
- data/src/switch_manager/secure_channel_listener.c +2 -2
- data/src/switch_manager/secure_channel_receiver.c +2 -2
- data/src/switch_manager/secure_channel_receiver.h +0 -1
- data/src/switch_manager/secure_channel_sender.c +8 -1
- data/src/switch_manager/service_interface.c +5 -4
- data/src/switch_manager/switch.c +79 -53
- data/src/switch_manager/switch_manager.c +24 -22
- data/src/switch_manager/xid_table.c +6 -6
- data/src/switch_manager/xid_table.h +0 -1
- data/src/tremashark/README +4 -3
- data/src/tremashark/packet_capture.c +11 -9
- data/src/tremashark/pcap_queue.c +2 -2
- data/src/tremashark/pcap_queue.h +2 -2
- data/src/tremashark/plugin/packet-trema/Makefile +1 -1
- data/src/tremashark/plugin/packet-trema/Makefile.common +1 -1
- data/src/tremashark/plugin/packet-trema/packet-trema.c +50 -37
- data/src/tremashark/queue.c +5 -4
- data/src/tremashark/queue.h +1 -1
- data/src/tremashark/stdin_relay.c +10 -8
- data/src/tremashark/syslog_relay.c +14 -12
- data/src/tremashark/tremashark.c +15 -18
- data/trema +2 -96
- data/trema-config +2 -52
- data/trema.gemspec +12 -1
- data/unittests/cmockery_trema.h +14 -13
- data/unittests/lib/buffer_test.c +1 -1
- data/unittests/lib/byteorder_test.c +108 -25
- data/unittests/lib/daemon_test.c +141 -5
- data/unittests/lib/doubly_linked_list_test.c +5 -1
- data/unittests/lib/ether_test.c +4 -4
- data/unittests/lib/hash_table_test.c +5 -3
- data/unittests/lib/linked_list_test.c +82 -4
- data/unittests/lib/log_test.c +96 -5
- data/unittests/lib/management_interface_test.c +240 -0
- data/unittests/lib/management_service_interface_test.c +319 -0
- data/unittests/lib/message_queue_test.c +6 -2
- data/unittests/lib/messenger_test.c +167 -2
- data/unittests/lib/openflow_application_interface_test.c +16 -22
- data/unittests/lib/openflow_message_test.c +721 -24
- data/unittests/lib/packet_info_test.c +2 -2
- data/unittests/lib/packet_parser_test.c +15 -16
- data/unittests/lib/packetin_filter_interface_test.c +6 -6
- data/unittests/lib/persistent_storage_test.c +11 -11
- data/unittests/lib/stat_test.c +151 -7
- data/unittests/lib/timer_test.c +1 -1
- data/unittests/lib/trema_private_test.c +2 -2
- data/unittests/lib/trema_test.c +40 -12
- data/unittests/lib/utility_test.c +3 -3
- data/unittests/lib/wrapper_test.c +3 -3
- data/unittests/packetin_filter/packetin_filter_test.c +12 -11
- data/unittests/switch_manager/switch_manager_test.c +29 -22
- metadata +99 -20
- data/features/step_definitions/log_steps.rb +0 -90
- data/features/step_definitions/run_steps.rb +0 -91
- data/features/trema.feature +0 -27
- data/features/tutorial.hello_trema.feature +0 -27
- data/features/tutorial.packet_in.feature +0 -47
- data/features/tutorial.switch_info.feature +0 -55
- data/ruby/trema/command/usage.rb +0 -63
data/src/lib/openflow_message.h
CHANGED
@@ -69,7 +69,7 @@ buffer *create_flow_removed( const uint32_t transaction_id, const struct ofp_mat
|
|
69
69
|
const uint32_t duration_nsec, const uint16_t idle_timeout,
|
70
70
|
const uint64_t packet_count, const uint64_t byte_count );
|
71
71
|
buffer *create_port_status( const uint32_t transaction_id, const uint8_t reason,
|
72
|
-
const struct ofp_phy_port desc);
|
72
|
+
const struct ofp_phy_port desc );
|
73
73
|
buffer *create_packet_out( const uint32_t transaction_id, const uint32_t buffer_id,
|
74
74
|
const uint16_t in_port, const openflow_actions *actions,
|
75
75
|
const buffer *data );
|
@@ -275,6 +275,7 @@ bool get_error_type_and_code( const uint8_t type, const int error_no,
|
|
275
275
|
uint16_t *error_type, uint16_t *error_code );
|
276
276
|
void set_match_from_packet( struct ofp_match *match, const uint16_t in_port,
|
277
277
|
const uint32_t wildcards, const buffer *packet );
|
278
|
+
void normalize_match( struct ofp_match *match );
|
278
279
|
|
279
280
|
|
280
281
|
#endif // OPENFLOW_MESSAGE_H
|
@@ -18,9 +18,9 @@
|
|
18
18
|
*/
|
19
19
|
|
20
20
|
|
21
|
+
#include <arpa/inet.h>
|
21
22
|
#include <assert.h>
|
22
23
|
#include <inttypes.h>
|
23
|
-
#include <arpa/inet.h>
|
24
24
|
#include <syslog.h>
|
25
25
|
#include "chibach_private.h"
|
26
26
|
#include "hash_table.h"
|
@@ -458,7 +458,7 @@ handle_error( buffer *data ) {
|
|
458
458
|
buffer *body = duplicate_buffer( data );
|
459
459
|
remove_front_buffer( body, offsetof( struct ofp_error_msg, data ) );
|
460
460
|
|
461
|
-
debug( "An error message is received ( transaction_id = %#x, type =
|
461
|
+
debug( "An error message is received ( transaction_id = %#x, type = %#x, code = %#x, data length = %zu ).",
|
462
462
|
transaction_id, type, code, body->length );
|
463
463
|
|
464
464
|
if ( event_handlers.error_callback == NULL ) {
|
@@ -506,7 +506,7 @@ handle_echo_request( buffer *data ) {
|
|
506
506
|
body,
|
507
507
|
event_handlers.echo_request_user_data );
|
508
508
|
|
509
|
-
event_handlers.echo_request_callback( transaction_id, body, event_handlers.
|
509
|
+
event_handlers.echo_request_callback( transaction_id, body, event_handlers.echo_request_user_data );
|
510
510
|
|
511
511
|
if ( body != NULL ) {
|
512
512
|
free_buffer( body );
|
@@ -540,7 +540,7 @@ handle_echo_reply( buffer *data ) {
|
|
540
540
|
body,
|
541
541
|
event_handlers.echo_reply_user_data );
|
542
542
|
|
543
|
-
event_handlers.echo_reply_callback( transaction_id, body, event_handlers.
|
543
|
+
event_handlers.echo_reply_callback( transaction_id, body, event_handlers.echo_reply_user_data );
|
544
544
|
|
545
545
|
if ( body != NULL ) {
|
546
546
|
free_buffer( body );
|
@@ -701,7 +701,7 @@ handle_packet_out( buffer *data ) {
|
|
701
701
|
}
|
702
702
|
|
703
703
|
debug( "A packet-out is received ( transaction_id = %#x, buffer_id = %#x, in_port = %u, "
|
704
|
-
"actions_len = %
|
704
|
+
"actions_len = %zu, frame_length = %zu ).",
|
705
705
|
transaction_id, buffer_id, in_port, actions_len, frame_length );
|
706
706
|
|
707
707
|
if ( event_handlers.packet_out_callback == NULL ) {
|
@@ -820,7 +820,7 @@ handle_port_mod( buffer *data ) {
|
|
820
820
|
event_handlers.port_mod_user_data );
|
821
821
|
|
822
822
|
event_handlers.port_mod_callback( transaction_id, port_no, hw_addr, config, mask, advertise,
|
823
|
-
event_handlers.
|
823
|
+
event_handlers.port_mod_user_data );
|
824
824
|
|
825
825
|
}
|
826
826
|
|
@@ -855,7 +855,7 @@ handle_stats_request( buffer *data ) {
|
|
855
855
|
{
|
856
856
|
struct ofp_aggregate_stats_request *aggregate = p;
|
857
857
|
ntoh_match( &aggregate->match, &aggregate->match );
|
858
|
-
aggregate->out_port = ntohs( aggregate->out_port );
|
858
|
+
aggregate->out_port = ntohs( aggregate->out_port );
|
859
859
|
}
|
860
860
|
break;
|
861
861
|
|
@@ -980,7 +980,7 @@ handle_openflow_message( buffer *message ) {
|
|
980
980
|
|
981
981
|
int ret = validate_openflow_message( message );
|
982
982
|
if ( ret < 0 ) {
|
983
|
-
error( "Failed to validate an OpenFlow message ( code = %d, length = %
|
983
|
+
error( "Failed to validate an OpenFlow message ( code = %d, length = %zu ).", ret, message->length );
|
984
984
|
return false;
|
985
985
|
}
|
986
986
|
|
@@ -1031,7 +1031,7 @@ handle_openflow_message( buffer *message ) {
|
|
1031
1031
|
handle_queue_get_config_request( message );
|
1032
1032
|
break;
|
1033
1033
|
default:
|
1034
|
-
error( "Unhandled OpenFlow message ( type =
|
1034
|
+
error( "Unhandled OpenFlow message ( type = %#x ).", header->type );
|
1035
1035
|
ret = false;
|
1036
1036
|
break;
|
1037
1037
|
}
|
@@ -1080,7 +1080,7 @@ switch_send_openflow_message( buffer *message ) {
|
|
1080
1080
|
|
1081
1081
|
bool
|
1082
1082
|
handle_secure_channel_message( buffer *message ) {
|
1083
|
-
debug( "An OpenFlow message is received from
|
1083
|
+
debug( "An OpenFlow message is received from remote." );
|
1084
1084
|
|
1085
1085
|
assert( message != NULL );
|
1086
1086
|
assert( message->length >= sizeof( struct ofp_header ) );
|
@@ -1098,7 +1098,7 @@ handle_local_message( uint16_t tag, void *data, size_t length ) {
|
|
1098
1098
|
assert( data != NULL );
|
1099
1099
|
assert( length >= sizeof( openflow_service_header_t ) );
|
1100
1100
|
|
1101
|
-
debug( "A message is received from remote ( tag =
|
1101
|
+
debug( "A message is received from remote ( tag = %#x, data = %p, length = %zu ).", tag, data, length );
|
1102
1102
|
|
1103
1103
|
switch ( tag ) {
|
1104
1104
|
case MESSENGER_OPENFLOW_MESSAGE:
|
@@ -1261,7 +1261,7 @@ send_error_message( uint32_t transaction_id, uint16_t type, uint16_t code ) {
|
|
1261
1261
|
case OFPBAC_BAD_ARGUMENT:
|
1262
1262
|
case OFPBAC_EPERM:
|
1263
1263
|
case OFPBAC_TOO_MANY:
|
1264
|
-
case OFPBAC_BAD_QUEUE:
|
1264
|
+
case OFPBAC_BAD_QUEUE:
|
1265
1265
|
{
|
1266
1266
|
const buffer *original_message = get_openflow_message( transaction_id );
|
1267
1267
|
if ( original_message != NULL ) {
|
data/src/lib/packet_parser.c
CHANGED
@@ -16,11 +16,11 @@
|
|
16
16
|
*/
|
17
17
|
|
18
18
|
|
19
|
-
#include <assert.h>
|
20
|
-
#include <stdint.h>
|
21
19
|
#include <arpa/inet.h>
|
20
|
+
#include <assert.h>
|
22
21
|
#include <net/ethernet.h>
|
23
22
|
#include <netinet/ip.h>
|
23
|
+
#include <stdint.h>
|
24
24
|
#include "packet_info.h"
|
25
25
|
#include "log.h"
|
26
26
|
#include "wrapper.h"
|
@@ -63,7 +63,7 @@ parse_ether( buffer *buf ) {
|
|
63
63
|
|
64
64
|
packet_info->vlan_tci = ntohs( vlantag_header->tci );
|
65
65
|
packet_info->vlan_tpid = packet_info->eth_type;
|
66
|
-
packet_info->vlan_prio =TCI_GET_PRIO( packet_info->vlan_tci );
|
66
|
+
packet_info->vlan_prio = TCI_GET_PRIO( packet_info->vlan_tci );
|
67
67
|
packet_info->vlan_cfi = TCI_GET_CFI( packet_info->vlan_tci );
|
68
68
|
packet_info->vlan_vid = TCI_GET_VID( packet_info->vlan_tci );
|
69
69
|
|
@@ -76,7 +76,7 @@ parse_ether( buffer *buf ) {
|
|
76
76
|
}
|
77
77
|
|
78
78
|
// Skip nested vlan headers.
|
79
|
-
while (
|
79
|
+
while ( packet_info->eth_type == ETH_ETHTYPE_TPID ) {
|
80
80
|
// Check the length of remained buffer
|
81
81
|
length = REMAINED_BUFFER_LENGTH( buf, ptr );
|
82
82
|
if ( length < sizeof( vlantag_header_t ) ) {
|
@@ -115,8 +115,6 @@ parse_ether( buffer *buf ) {
|
|
115
115
|
packet_info->l2_payload = ptr;
|
116
116
|
packet_info->l2_payload_length = payload_length;
|
117
117
|
}
|
118
|
-
|
119
|
-
return;
|
120
118
|
}
|
121
119
|
|
122
120
|
|
@@ -147,9 +145,7 @@ parse_arp( buffer *buf ) {
|
|
147
145
|
packet_info->arp_tpa = ntohl( arp_header->tip );
|
148
146
|
|
149
147
|
packet_info->format |= NW_ARP;
|
150
|
-
|
151
|
-
return;
|
152
|
-
};
|
148
|
+
}
|
153
149
|
|
154
150
|
|
155
151
|
static void
|
@@ -196,8 +192,6 @@ parse_ipv4( buffer *buf ) {
|
|
196
192
|
}
|
197
193
|
|
198
194
|
packet_info->format |= NW_IPV4;
|
199
|
-
|
200
|
-
return;
|
201
195
|
}
|
202
196
|
|
203
197
|
|
@@ -218,8 +212,8 @@ parse_ipv6( buffer *buf ) {
|
|
218
212
|
// Parses IPv6 header
|
219
213
|
ipv6_header_t *ipv6_header = ptr;
|
220
214
|
uint32_t hdrctl = ntohl( ipv6_header->hdrctl );
|
221
|
-
packet_info->ipv6_version = ( uint8_t )( hdrctl >> 28 );
|
222
|
-
packet_info->ipv6_tc = ( uint8_t )( hdrctl >> 20 & 0xFF );
|
215
|
+
packet_info->ipv6_version = ( uint8_t ) ( hdrctl >> 28 );
|
216
|
+
packet_info->ipv6_tc = ( uint8_t ) ( hdrctl >> 20 & 0xFF );
|
223
217
|
packet_info->ipv6_flowlabel = hdrctl & 0xFFFFF;
|
224
218
|
packet_info->ipv6_plen = ntohs( ipv6_header->plen );
|
225
219
|
packet_info->ipv6_nexthdr = ipv6_header->nexthdr;
|
@@ -228,8 +222,6 @@ parse_ipv6( buffer *buf ) {
|
|
228
222
|
memcpy( packet_info->ipv6_daddr, ipv6_header->daddr, IPV6_ADDRLEN );
|
229
223
|
|
230
224
|
packet_info->format |= NW_IPV6;
|
231
|
-
|
232
|
-
return;
|
233
225
|
}
|
234
226
|
|
235
227
|
|
@@ -248,8 +240,6 @@ parse_lldp( buffer *buf ) {
|
|
248
240
|
}
|
249
241
|
|
250
242
|
packet_info->format |= NW_LLDP;
|
251
|
-
|
252
|
-
return;
|
253
243
|
}
|
254
244
|
|
255
245
|
|
@@ -296,9 +286,7 @@ parse_icmp( buffer *buf ) {
|
|
296
286
|
}
|
297
287
|
|
298
288
|
packet_info->format |= NW_ICMPV4;
|
299
|
-
|
300
|
-
return;
|
301
|
-
};
|
289
|
+
}
|
302
290
|
|
303
291
|
|
304
292
|
static void
|
@@ -330,9 +318,7 @@ parse_udp( buffer *buf ) {
|
|
330
318
|
}
|
331
319
|
|
332
320
|
packet_info->format |= TP_UDP;
|
333
|
-
|
334
|
-
return;
|
335
|
-
};
|
321
|
+
}
|
336
322
|
|
337
323
|
|
338
324
|
static void
|
@@ -377,10 +363,7 @@ parse_tcp( buffer *buf ) {
|
|
377
363
|
}
|
378
364
|
|
379
365
|
packet_info->format |= TP_TCP;
|
380
|
-
|
381
|
-
return;
|
382
|
-
};
|
383
|
-
|
366
|
+
}
|
384
367
|
|
385
368
|
|
386
369
|
static void
|
@@ -404,8 +387,6 @@ parse_igmp( buffer *buf ) {
|
|
404
387
|
packet_info->igmp_group = ntohl( igmp->group );
|
405
388
|
|
406
389
|
packet_info->format |= NW_IGMP;
|
407
|
-
|
408
|
-
return;
|
409
390
|
}
|
410
391
|
|
411
392
|
|
@@ -433,12 +414,10 @@ parse_etherip( buffer *buf ) {
|
|
433
414
|
if ( payload_length > 0 ) {
|
434
415
|
packet_info->l4_payload = ptr;
|
435
416
|
packet_info->l4_payload_length = payload_length;
|
436
|
-
packet_info->etherip_offset = ( uint16_t ) ( ( char * ) ptr - ( char *) buf->data );
|
417
|
+
packet_info->etherip_offset = ( uint16_t ) ( ( char * ) ptr - ( char * ) buf->data );
|
437
418
|
}
|
438
419
|
|
439
420
|
packet_info->format |= TP_ETHERIP;
|
440
|
-
|
441
|
-
return;
|
442
421
|
}
|
443
422
|
|
444
423
|
|
@@ -204,7 +204,7 @@ handle_reply( uint16_t tag, void *data, size_t length, void *user_data ) {
|
|
204
204
|
case MESSENGER_ADD_PACKETIN_FILTER_REPLY:
|
205
205
|
{
|
206
206
|
if ( length != sizeof( add_packetin_filter_reply ) ) {
|
207
|
-
error( "Invalid add packetin filter reply ( length = %
|
207
|
+
error( "Invalid add packetin filter reply ( length = %zu ).", length );
|
208
208
|
return;
|
209
209
|
}
|
210
210
|
add_packetin_filter_reply *reply = data;
|
@@ -214,7 +214,7 @@ handle_reply( uint16_t tag, void *data, size_t length, void *user_data ) {
|
|
214
214
|
case MESSENGER_DELETE_PACKETIN_FILTER_REPLY:
|
215
215
|
{
|
216
216
|
if ( length != sizeof( delete_packetin_filter_reply ) ) {
|
217
|
-
error( "Invalid delete packetin filter reply ( length = %
|
217
|
+
error( "Invalid delete packetin filter reply ( length = %zu ).", length );
|
218
218
|
return;
|
219
219
|
}
|
220
220
|
delete_packetin_filter_reply *reply = data;
|
@@ -224,13 +224,13 @@ handle_reply( uint16_t tag, void *data, size_t length, void *user_data ) {
|
|
224
224
|
case MESSENGER_DUMP_PACKETIN_FILTER_REPLY:
|
225
225
|
{
|
226
226
|
if ( length < offsetof( dump_packetin_filter_reply, entries ) ) {
|
227
|
-
error( "Invalid dump packetin filter reply ( length = %
|
227
|
+
error( "Invalid dump packetin filter reply ( length = %zu ).", length );
|
228
228
|
return;
|
229
229
|
}
|
230
230
|
dump_packetin_filter_reply *reply = data;
|
231
231
|
size_t expected_length = offsetof( dump_packetin_filter_reply, entries ) + sizeof( packetin_filter_entry ) * ntohl( reply->n_entries );
|
232
232
|
if ( length != expected_length ) {
|
233
|
-
error( "Invalid dump packetin filter reply ( length = %
|
233
|
+
error( "Invalid dump packetin filter reply ( length = %zu ).", length );
|
234
234
|
return;
|
235
235
|
}
|
236
236
|
packetin_filter_entry *entries = NULL;
|
@@ -249,7 +249,7 @@ handle_reply( uint16_t tag, void *data, size_t length, void *user_data ) {
|
|
249
249
|
break;
|
250
250
|
default:
|
251
251
|
{
|
252
|
-
warn( "Undefined reply tag ( tag = %#x, length = %
|
252
|
+
warn( "Undefined reply tag ( tag = %#x, length = %zu ).", tag, length );
|
253
253
|
}
|
254
254
|
return;
|
255
255
|
}
|
@@ -131,14 +131,14 @@ save_value( void *value, int n_columns, char **columns, char **column_names ) {
|
|
131
131
|
}
|
132
132
|
|
133
133
|
|
134
|
-
static char*
|
134
|
+
static char *
|
135
135
|
get_value_from_backend( const char *key ) {
|
136
136
|
assert( db_handle != NULL );
|
137
137
|
assert( key != NULL );
|
138
138
|
|
139
139
|
char *value = NULL;
|
140
140
|
char *err = NULL;
|
141
|
-
char *statement= sqlite3_mprintf( "SELECT value FROM trema WHERE key = '%q'", key );
|
141
|
+
char *statement = sqlite3_mprintf( "SELECT value FROM trema WHERE key = '%q'", key );
|
142
142
|
int ret = trema_sqlite3_exec( db_handle, statement, save_value, &value, &err );
|
143
143
|
if ( ret != SQLITE_OK ) {
|
144
144
|
error( "Failed to execute a SQL statement ( statement = %s, error = %s ).", statement, err );
|
@@ -336,7 +336,7 @@ valid_key( const char *key ) {
|
|
336
336
|
|
337
337
|
size_t length = strlen( key );
|
338
338
|
if ( length > MAX_KEY_LENGTH ) {
|
339
|
-
error( "Too long key ( length = %
|
339
|
+
error( "Too long key ( length = %zu ) specified. Maximum length is %zu.", length, MAX_KEY_LENGTH );
|
340
340
|
return false;
|
341
341
|
}
|
342
342
|
|
@@ -358,7 +358,7 @@ valid_value( const char *value ) {
|
|
358
358
|
|
359
359
|
size_t length = strlen( value );
|
360
360
|
if ( length > MAX_KEY_LENGTH ) {
|
361
|
-
error( "Too long value ( length = %
|
361
|
+
error( "Too long value ( length = %zu ) specified. Maximum length is %zu.", length, MAX_VALUE_LENGTH );
|
362
362
|
return false;
|
363
363
|
}
|
364
364
|
|
@@ -412,7 +412,7 @@ get_value( const char *key, char *value, const size_t length ) {
|
|
412
412
|
|
413
413
|
size_t required_length = strlen( retrieved ) + 1;
|
414
414
|
if ( required_length > length ) {
|
415
|
-
error( "Insufficient buffer space ( %
|
415
|
+
error( "Insufficient buffer space ( %zu [bytes] > %zu [bytes] ).",
|
416
416
|
required_length, length );
|
417
417
|
return false;
|
418
418
|
}
|
@@ -442,13 +442,13 @@ delete_key_value( const char *key ) {
|
|
442
442
|
}
|
443
443
|
|
444
444
|
|
445
|
-
const char*
|
445
|
+
const char *
|
446
446
|
_get_db_file( void ) {
|
447
447
|
return db_file;
|
448
448
|
}
|
449
449
|
|
450
450
|
|
451
|
-
const sqlite3*
|
451
|
+
const sqlite3 *
|
452
452
|
_get_db_handle( void ) {
|
453
453
|
return db_handle;
|
454
454
|
}
|
data/src/lib/secure_channel.c
CHANGED
@@ -239,7 +239,7 @@ flush_send_queue( int fd, void *user_data ) {
|
|
239
239
|
assert( send_queue != NULL );
|
240
240
|
assert( connection.fd >= 0 );
|
241
241
|
|
242
|
-
debug( "Flushing send queue ( length = %
|
242
|
+
debug( "Flushing send queue ( length = %u ).", send_queue->length );
|
243
243
|
|
244
244
|
set_writable( connection.fd, false );
|
245
245
|
|
@@ -309,7 +309,7 @@ static void
|
|
309
309
|
check_connected( void *user_data ) {
|
310
310
|
UNUSED( user_data );
|
311
311
|
|
312
|
-
debug( "Checking a connection ( fd = %d ip = %#x, port = %u ).", connection.fd, connection.ip, connection.port );
|
312
|
+
debug( "Checking a connection ( fd = %d, ip = %#x, port = %u ).", connection.fd, connection.ip, connection.port );
|
313
313
|
|
314
314
|
assert( secure_channel_initialized );
|
315
315
|
assert( connection.fd >= 0 );
|
@@ -326,7 +326,7 @@ check_connected( void *user_data ) {
|
|
326
326
|
return;
|
327
327
|
}
|
328
328
|
|
329
|
-
switch( err ) {
|
329
|
+
switch ( err ) {
|
330
330
|
case 0:
|
331
331
|
connected();
|
332
332
|
break;
|
@@ -341,7 +341,7 @@ check_connected( void *user_data ) {
|
|
341
341
|
return;
|
342
342
|
|
343
343
|
case EINPROGRESS:
|
344
|
-
set_fd_handler( connection.fd, NULL
|
344
|
+
set_fd_handler( connection.fd, NULL, NULL, ( event_fd_callback ) check_connected, NULL );
|
345
345
|
set_writable( connection.fd, true );
|
346
346
|
break;
|
347
347
|
|
@@ -393,7 +393,7 @@ try_connect() {
|
|
393
393
|
|
394
394
|
ret = connect( connection.fd, ( struct sockaddr * ) &addr, sizeof( struct sockaddr_in ) );
|
395
395
|
if ( ret < 0 ) {
|
396
|
-
switch( errno ) {
|
396
|
+
switch ( errno ) {
|
397
397
|
case EINTR:
|
398
398
|
case EAGAIN:
|
399
399
|
case ECONNREFUSED:
|
@@ -476,7 +476,7 @@ send_message_to_secure_channel( buffer *message ) {
|
|
476
476
|
assert( connection.state == CONNECTED );
|
477
477
|
assert( connection.fd >= 0 );
|
478
478
|
|
479
|
-
debug( "Enqueuing a message to send queue ( queue length = %
|
479
|
+
debug( "Enqueuing a message to send queue ( queue length = %u, message length = %zu ).",
|
480
480
|
send_queue->length, message->length );
|
481
481
|
|
482
482
|
if ( send_queue->length == 0 ) {
|
data/src/lib/secure_channel.h
CHANGED
data/src/lib/stat.c
CHANGED
@@ -64,12 +64,6 @@ static hash_table *stats = NULL;
|
|
64
64
|
static pthread_mutex_t stats_table_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
|
65
65
|
|
66
66
|
|
67
|
-
typedef struct {
|
68
|
-
char key[ STAT_KEY_LENGTH ];
|
69
|
-
uint64_t value;
|
70
|
-
} stat_entry;
|
71
|
-
|
72
|
-
|
73
67
|
static void
|
74
68
|
create_stats_table() {
|
75
69
|
assert( stats == NULL );
|
@@ -88,7 +82,9 @@ delete_stats_table() {
|
|
88
82
|
init_hash_iterator( stats, &iter );
|
89
83
|
while ( ( e = iterate_hash_next( &iter ) ) != NULL ) {
|
90
84
|
void *value = delete_hash_entry( stats, e->key );
|
91
|
-
|
85
|
+
if ( value != NULL ) {
|
86
|
+
xfree( value );
|
87
|
+
}
|
92
88
|
}
|
93
89
|
delete_hash( stats );
|
94
90
|
stats = NULL;
|
@@ -178,29 +174,71 @@ increment_stat( const char *key ) {
|
|
178
174
|
|
179
175
|
|
180
176
|
void
|
181
|
-
|
177
|
+
reset_stats() {
|
182
178
|
assert( stats != NULL );
|
183
179
|
|
184
|
-
|
180
|
+
pthread_mutex_lock( &stats_table_mutex );
|
181
|
+
|
182
|
+
hash_entry *e = NULL;
|
185
183
|
hash_iterator iter;
|
186
|
-
|
184
|
+
init_hash_iterator( stats, &iter );
|
185
|
+
while ( ( e = iterate_hash_next( &iter ) ) != NULL ) {
|
186
|
+
stat_entry *st = e->value;
|
187
|
+
if ( st != NULL ) {
|
188
|
+
void *deleted = delete_hash_entry( stats, st->key );
|
189
|
+
if ( deleted != NULL ) {
|
190
|
+
xfree( deleted );
|
191
|
+
}
|
192
|
+
}
|
193
|
+
}
|
187
194
|
|
188
|
-
|
195
|
+
pthread_mutex_unlock( &stats_table_mutex );
|
196
|
+
}
|
189
197
|
|
190
|
-
info( "Statistics:" );
|
191
198
|
|
199
|
+
void
|
200
|
+
foreach_stat( void function( const char *key, const uint64_t value, void *user_data ), void *user_data ) {
|
201
|
+
assert( stats != NULL );
|
202
|
+
assert( function != NULL );
|
203
|
+
|
204
|
+
pthread_mutex_lock( &stats_table_mutex );
|
205
|
+
|
206
|
+
hash_entry *e = NULL;
|
207
|
+
hash_iterator iter;
|
192
208
|
init_hash_iterator( stats, &iter );
|
193
209
|
while ( ( e = iterate_hash_next( &iter ) ) != NULL ) {
|
194
210
|
stat_entry *st = e->value;
|
195
|
-
|
196
|
-
|
211
|
+
if ( st != NULL ) {
|
212
|
+
function( st->key, st->value, user_data );
|
213
|
+
}
|
197
214
|
}
|
198
215
|
|
216
|
+
pthread_mutex_unlock( &stats_table_mutex );
|
217
|
+
}
|
218
|
+
|
219
|
+
|
220
|
+
static void
|
221
|
+
print_stat( const char *key, const uint64_t value, void *user_data ) {
|
222
|
+
assert( key != NULL );
|
223
|
+
assert( user_data != NULL );
|
224
|
+
|
225
|
+
info( "%s: %" PRIu64, key, value );
|
226
|
+
( *( int * ) user_data )++;
|
227
|
+
}
|
228
|
+
|
229
|
+
|
230
|
+
void
|
231
|
+
dump_stats() {
|
232
|
+
assert( stats != NULL );
|
233
|
+
|
234
|
+
info( "Statistics:" );
|
235
|
+
|
236
|
+
int n_stats = 0;
|
237
|
+
foreach_stat( print_stat, &n_stats );
|
238
|
+
|
199
239
|
if ( n_stats == 0 ) {
|
200
240
|
info( "No statistics found." );
|
201
241
|
}
|
202
|
-
|
203
|
-
pthread_mutex_unlock( &stats_table_mutex );
|
204
242
|
}
|
205
243
|
|
206
244
|
|
@@ -210,4 +248,3 @@ dump_stats() {
|
|
210
248
|
* indent-tabs-mode: nil
|
211
249
|
* End:
|
212
250
|
*/
|
213
|
-
|