trema 0.2.5 → 0.2.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -265,7 +265,7 @@ test_peek_message_if_queue_is_not_created() {
|
|
265
265
|
|
266
266
|
static int count = 0;
|
267
267
|
|
268
|
-
static
|
268
|
+
static bool
|
269
269
|
test_foreach_message_queue_helper( buffer *message, void *user_data ) {
|
270
270
|
const char *str = message->data;
|
271
271
|
assert_string_equal( ( char * ) user_data, "user_data" );
|
@@ -280,6 +280,8 @@ test_foreach_message_queue_helper( buffer *message, void *user_data ) {
|
|
280
280
|
assert_true( false );
|
281
281
|
break;
|
282
282
|
}
|
283
|
+
|
284
|
+
return true;
|
283
285
|
}
|
284
286
|
|
285
287
|
|
@@ -323,11 +325,13 @@ test_foreach_message_queue() {
|
|
323
325
|
}
|
324
326
|
|
325
327
|
|
326
|
-
static
|
328
|
+
static bool
|
327
329
|
test_foreach_message_queue_if_queue_is_empty_helper( buffer *message, void *user_data ) {
|
328
330
|
UNUSED( message );
|
329
331
|
UNUSED( user_data );
|
330
332
|
assert_true( false );
|
333
|
+
|
334
|
+
return true;
|
331
335
|
}
|
332
336
|
|
333
337
|
|
@@ -124,8 +124,8 @@ static size_t message_buffer_remain_bytes( message_buffer *buf );
|
|
124
124
|
|
125
125
|
static void delete_timer_callbacks( void );
|
126
126
|
|
127
|
-
static messenger_context*
|
128
|
-
static messenger_context*
|
127
|
+
static messenger_context *insert_context( void *user_data );
|
128
|
+
static messenger_context *get_context( uint32_t transaction_id );
|
129
129
|
static void delete_context( messenger_context *context );
|
130
130
|
static void delete_context_db( void );
|
131
131
|
static void age_context_db( void * );
|
@@ -282,9 +282,25 @@ mock_debug( char *format, ... ) {
|
|
282
282
|
}
|
283
283
|
|
284
284
|
|
285
|
+
static bool check_warn = false;
|
286
|
+
static void
|
287
|
+
mock_warn_check( char *format, va_list args ) {
|
288
|
+
char message[ 1000 ];
|
289
|
+
vsnprintf( message, 1000, format, args );
|
290
|
+
|
291
|
+
check_expected( message );
|
292
|
+
}
|
293
|
+
|
294
|
+
|
285
295
|
void
|
286
296
|
mock_warn( char *format, ... ) {
|
287
297
|
UNUSED( format );
|
298
|
+
if ( check_warn ) {
|
299
|
+
va_list arg;
|
300
|
+
va_start( arg, format );
|
301
|
+
mock_warn_check( format, arg );
|
302
|
+
va_end( arg );
|
303
|
+
}
|
288
304
|
}
|
289
305
|
|
290
306
|
|
@@ -325,6 +341,8 @@ reset_messenger() {
|
|
325
341
|
finalized = false;
|
326
342
|
|
327
343
|
execute_timer_events = mock_execute_timer_events;
|
344
|
+
|
345
|
+
check_warn = false;
|
328
346
|
}
|
329
347
|
|
330
348
|
|
@@ -400,6 +418,138 @@ test_send_then_message_received_callback_is_called() {
|
|
400
418
|
}
|
401
419
|
|
402
420
|
|
421
|
+
static void callback_req_hello( const messenger_context_handle *handle, uint16_t tag, void *data, size_t len ) {
|
422
|
+
UNUSED( handle );
|
423
|
+
check_expected( tag );
|
424
|
+
check_expected( data );
|
425
|
+
check_expected( len );
|
426
|
+
|
427
|
+
send_reply_message( handle, 65534, "OLLEH", strlen("OLLEH")+1 );
|
428
|
+
}
|
429
|
+
|
430
|
+
|
431
|
+
static void callback_req_hello2( const messenger_context_handle *handle, uint16_t tag, void *data, size_t len ) {
|
432
|
+
UNUSED( handle );
|
433
|
+
UNUSED( tag );
|
434
|
+
UNUSED( data );
|
435
|
+
UNUSED( len );
|
436
|
+
}
|
437
|
+
|
438
|
+
|
439
|
+
static void callback_rep_hello_end( uint16_t tag, void *data, size_t len, void *user_data ) {
|
440
|
+
check_expected( tag );
|
441
|
+
check_expected( data );
|
442
|
+
check_expected( len );
|
443
|
+
check_expected( user_data );
|
444
|
+
|
445
|
+
stop_event_handler();
|
446
|
+
stop_messenger();
|
447
|
+
}
|
448
|
+
|
449
|
+
|
450
|
+
static void callback_rep_hello2( uint16_t tag, void *data, size_t len, void *user_data ) {
|
451
|
+
UNUSED( tag );
|
452
|
+
UNUSED( data );
|
453
|
+
UNUSED( len );
|
454
|
+
UNUSED( user_data );
|
455
|
+
}
|
456
|
+
|
457
|
+
|
458
|
+
static void
|
459
|
+
test_send_then_message_requested_and_replied_callback_is_called() {
|
460
|
+
init_messenger( "/tmp" );
|
461
|
+
|
462
|
+
const char service_name[] = "Say HELLO";
|
463
|
+
|
464
|
+
expect_value( callback_req_hello, tag, 43556 );
|
465
|
+
expect_string( callback_req_hello, data, "HELLO" );
|
466
|
+
expect_value( callback_req_hello, len, 6 );
|
467
|
+
add_message_requested_callback( service_name, callback_req_hello );
|
468
|
+
|
469
|
+
expect_value( callback_rep_hello_end, tag, 65534 );
|
470
|
+
expect_string( callback_rep_hello_end, data, "OLLEH" );
|
471
|
+
expect_value( callback_rep_hello_end, len, 6 );
|
472
|
+
expect_value( callback_rep_hello_end, user_data, NULL );
|
473
|
+
add_message_replied_callback( service_name, callback_rep_hello_end );
|
474
|
+
|
475
|
+
send_request_message( service_name, service_name, 43556, "HELLO", strlen( "HELLO" ) + 1, NULL );
|
476
|
+
|
477
|
+
start_messenger();
|
478
|
+
start_event_handler();
|
479
|
+
|
480
|
+
delete_message_replied_callback( service_name, callback_rep_hello_end );
|
481
|
+
delete_message_requested_callback( service_name, callback_req_hello );
|
482
|
+
delete_send_queue( lookup_hash_entry( send_queues, service_name ) );
|
483
|
+
|
484
|
+
finalize_messenger();
|
485
|
+
}
|
486
|
+
|
487
|
+
|
488
|
+
static void
|
489
|
+
test_double_add_message_requested_callback_prints_error_message() {
|
490
|
+
init_messenger( "/tmp" );
|
491
|
+
|
492
|
+
|
493
|
+
const char service_name[] = "Some Service";
|
494
|
+
char expected_mes[ 1024+1 ] = {};
|
495
|
+
snprintf( expected_mes, 1024, "Multiple message_requested/replied handler is not supported. ( service_name = %s, message_type = %#x, callback = %p )",
|
496
|
+
service_name, MESSAGE_TYPE_REQUEST, callback_req_hello2 );
|
497
|
+
|
498
|
+
|
499
|
+
check_warn = true;
|
500
|
+
|
501
|
+
assert_true( add_message_requested_callback( service_name, callback_req_hello ) );
|
502
|
+
|
503
|
+
expect_string( mock_warn_check, message, expected_mes );
|
504
|
+
assert_true( add_message_requested_callback( service_name, callback_req_hello2 ) );
|
505
|
+
|
506
|
+
check_warn = false;
|
507
|
+
|
508
|
+
finalize_messenger();
|
509
|
+
}
|
510
|
+
|
511
|
+
static void
|
512
|
+
test_double_add_message_replied_callback_prints_error_message() {
|
513
|
+
init_messenger( "/tmp" );
|
514
|
+
|
515
|
+
|
516
|
+
const char service_name[] = "Some Service";
|
517
|
+
char expected_mes[ 1024+1 ] = {};
|
518
|
+
snprintf( expected_mes, 1024, "Multiple message_requested/replied handler is not supported. ( service_name = %s, message_type = %#x, callback = %p )",
|
519
|
+
service_name, MESSAGE_TYPE_REPLY, callback_rep_hello2 );
|
520
|
+
|
521
|
+
|
522
|
+
check_warn = true;
|
523
|
+
|
524
|
+
assert_true( add_message_replied_callback( service_name, callback_rep_hello_end ) );
|
525
|
+
|
526
|
+
expect_string( mock_warn_check, message, expected_mes );
|
527
|
+
assert_true( add_message_replied_callback( service_name, callback_rep_hello2 ) );
|
528
|
+
|
529
|
+
check_warn = false;
|
530
|
+
|
531
|
+
finalize_messenger();
|
532
|
+
}
|
533
|
+
|
534
|
+
|
535
|
+
static void
|
536
|
+
test_add_1_message_requested_and_replied_callback_each_prints_no_error_message() {
|
537
|
+
init_messenger( "/tmp" );
|
538
|
+
|
539
|
+
const char service_name[] = "Some Service";
|
540
|
+
|
541
|
+
check_warn = true;
|
542
|
+
|
543
|
+
assert_true( add_message_requested_callback( service_name, callback_req_hello ) );
|
544
|
+
|
545
|
+
assert_true( add_message_replied_callback( service_name, callback_rep_hello_end ) );
|
546
|
+
|
547
|
+
check_warn = false;
|
548
|
+
|
549
|
+
finalize_messenger();
|
550
|
+
}
|
551
|
+
|
552
|
+
|
403
553
|
/********************************************************************************
|
404
554
|
* Run tests.
|
405
555
|
********************************************************************************/
|
@@ -425,6 +575,21 @@ main() {
|
|
425
575
|
unit_test_setup_teardown( test_send_then_message_received_callback_is_called,
|
426
576
|
reset_messenger,
|
427
577
|
reset_messenger ),
|
578
|
+
// Message request callback tests.
|
579
|
+
unit_test_setup_teardown( test_send_then_message_requested_and_replied_callback_is_called,
|
580
|
+
reset_messenger,
|
581
|
+
reset_messenger ),
|
582
|
+
// Message request duplicate registrationcallback tests.
|
583
|
+
unit_test_setup_teardown( test_double_add_message_requested_callback_prints_error_message,
|
584
|
+
reset_messenger,
|
585
|
+
reset_messenger ),
|
586
|
+
unit_test_setup_teardown( test_double_add_message_replied_callback_prints_error_message,
|
587
|
+
reset_messenger,
|
588
|
+
reset_messenger ),
|
589
|
+
unit_test_setup_teardown( test_add_1_message_requested_and_replied_callback_each_prints_no_error_message,
|
590
|
+
reset_messenger,
|
591
|
+
reset_messenger ),
|
592
|
+
|
428
593
|
};
|
429
594
|
return run_tests( tests );
|
430
595
|
}
|
@@ -41,12 +41,6 @@
|
|
41
41
|
* Helpers.
|
42
42
|
********************************************************************************/
|
43
43
|
|
44
|
-
typedef struct {
|
45
|
-
char key[ STAT_KEY_LENGTH ];
|
46
|
-
uint64_t value;
|
47
|
-
} stat_entry;
|
48
|
-
|
49
|
-
|
50
44
|
extern bool openflow_application_interface_initialized;
|
51
45
|
extern openflow_event_handlers_t event_handlers;
|
52
46
|
extern char service_name[ MESSENGER_SERVICE_NAME_LENGTH ];
|
@@ -159,7 +153,7 @@ static bool packet_in_handler_called = false;
|
|
159
153
|
* Mocks.
|
160
154
|
********************************************************************************/
|
161
155
|
|
162
|
-
const char*
|
156
|
+
const char *
|
163
157
|
mock_get_trema_name() {
|
164
158
|
return "TEST_SERVICE_NAME";
|
165
159
|
}
|
@@ -286,12 +280,12 @@ mock_error_handler( uint64_t datapath_id, uint32_t transaction_id, uint16_t type
|
|
286
280
|
|
287
281
|
static void
|
288
282
|
mock_echo_reply_handler( uint64_t datapath_id, uint32_t transaction_id, const buffer *data,
|
289
|
-
void *user_data ){
|
283
|
+
void *user_data ) {
|
290
284
|
void *data_uc;
|
291
285
|
|
292
286
|
check_expected( &datapath_id );
|
293
287
|
check_expected( transaction_id );
|
294
|
-
if( data != NULL ) {
|
288
|
+
if ( data != NULL ) {
|
295
289
|
check_expected( data->length );
|
296
290
|
check_expected( data->data );
|
297
291
|
}
|
@@ -305,13 +299,13 @@ mock_echo_reply_handler( uint64_t datapath_id, uint32_t transaction_id, const bu
|
|
305
299
|
|
306
300
|
static void
|
307
301
|
mock_vendor_handler( uint64_t datapath_id, uint32_t transaction_id, uint32_t vendor,
|
308
|
-
const buffer *data, void *user_data ){
|
302
|
+
const buffer *data, void *user_data ) {
|
309
303
|
void *data_uc;
|
310
304
|
|
311
305
|
check_expected( &datapath_id );
|
312
306
|
check_expected( transaction_id );
|
313
307
|
check_expected( vendor );
|
314
|
-
if( data != NULL ) {
|
308
|
+
if ( data != NULL ) {
|
315
309
|
check_expected( data->length );
|
316
310
|
check_expected( data->data );
|
317
311
|
}
|
@@ -1319,7 +1313,7 @@ test_send_openflow_message() {
|
|
1319
1313
|
will_return( mock_send_message, true );
|
1320
1314
|
|
1321
1315
|
ret = send_openflow_message( DATAPATH_ID, buffer );
|
1322
|
-
|
1316
|
+
|
1323
1317
|
assert_true( ret );
|
1324
1318
|
stat_entry *stat = lookup_hash_entry( stats, "openflow_application_interface.hello_send_succeeded" );
|
1325
1319
|
assert_int_equal( ( int ) stat->value, 1 );
|
@@ -1649,8 +1643,8 @@ test_handle_features_reply() {
|
|
1649
1643
|
set_features_reply_handler( mock_features_reply_handler, USER_DATA );
|
1650
1644
|
handle_features_reply( DATAPATH_ID, buffer );
|
1651
1645
|
|
1652
|
-
xfree( phy_port[0] );
|
1653
|
-
xfree( phy_port[1] );
|
1646
|
+
xfree( phy_port[ 0 ] );
|
1647
|
+
xfree( phy_port[ 1 ] );
|
1654
1648
|
delete_list( ports );
|
1655
1649
|
free_buffer( buffer );
|
1656
1650
|
}
|
@@ -1733,8 +1727,8 @@ test_handle_features_reply_if_handler_is_not_registered() {
|
|
1733
1727
|
|
1734
1728
|
handle_features_reply( DATAPATH_ID, buffer );
|
1735
1729
|
|
1736
|
-
xfree( phy_port[0] );
|
1737
|
-
xfree( phy_port[1] );
|
1730
|
+
xfree( phy_port[ 0 ] );
|
1731
|
+
xfree( phy_port[ 1 ] );
|
1738
1732
|
delete_list( ports );
|
1739
1733
|
free_buffer( buffer );
|
1740
1734
|
}
|
@@ -2884,7 +2878,7 @@ test_handle_openflow_message() {
|
|
2884
2878
|
data = alloc_buffer_with_length( 16 );
|
2885
2879
|
append_back_buffer( data, 16 );
|
2886
2880
|
memset( data->data, 'a', 16 );
|
2887
|
-
|
2881
|
+
|
2888
2882
|
buffer = create_error( TRANSACTION_ID, OFPET_HELLO_FAILED, OFPHFC_INCOMPATIBLE, data );
|
2889
2883
|
append_front_buffer( buffer, sizeof( openflow_service_header_t ) );
|
2890
2884
|
memcpy( buffer->data, &messenger_header, sizeof( openflow_service_header_t ) );
|
@@ -2895,7 +2889,7 @@ test_handle_openflow_message() {
|
|
2895
2889
|
expect_value( mock_error_handler, data->length, data->length );
|
2896
2890
|
expect_memory( mock_error_handler, data->data, data->data, data->length );
|
2897
2891
|
expect_memory( mock_error_handler, user_data, USER_DATA, USER_DATA_LEN );
|
2898
|
-
|
2892
|
+
|
2899
2893
|
set_error_handler( mock_error_handler, USER_DATA );
|
2900
2894
|
handle_openflow_message( buffer->data, buffer->length );
|
2901
2895
|
|
@@ -2925,7 +2919,7 @@ test_handle_openflow_message() {
|
|
2925
2919
|
expect_value( mock_vendor_handler, data->length, data->length );
|
2926
2920
|
expect_memory( mock_vendor_handler, data->data, data->data, data->length );
|
2927
2921
|
expect_memory( mock_vendor_handler, user_data, USER_DATA, USER_DATA_LEN );
|
2928
|
-
|
2922
|
+
|
2929
2923
|
set_vendor_handler( mock_vendor_handler, USER_DATA );
|
2930
2924
|
handle_openflow_message( buffer->data, buffer->length );
|
2931
2925
|
|
@@ -2996,8 +2990,8 @@ test_handle_openflow_message() {
|
|
2996
2990
|
stat = lookup_hash_entry( stats, "openflow_application_interface.features_reply_receive_succeeded" );
|
2997
2991
|
assert_int_equal( ( int ) stat->value, 1 );
|
2998
2992
|
|
2999
|
-
xfree( phy_port[0] );
|
3000
|
-
xfree( phy_port[1] );
|
2993
|
+
xfree( phy_port[ 0 ] );
|
2994
|
+
xfree( phy_port[ 1 ] );
|
3001
2995
|
delete_list( ports );
|
3002
2996
|
free_buffer( buffer );
|
3003
2997
|
xfree( delete_hash_entry( stats, "openflow_application_interface.features_reply_receive_succeeded" ) );
|
@@ -3312,7 +3306,7 @@ test_handle_openflow_message_with_malformed_message() {
|
|
3312
3306
|
memcpy( buffer->data, &messenger_header, sizeof( openflow_service_header_t ) );
|
3313
3307
|
|
3314
3308
|
handle_openflow_message( buffer->data, buffer->length );
|
3315
|
-
|
3309
|
+
|
3316
3310
|
free_buffer( buffer );
|
3317
3311
|
}
|
3318
3312
|
|
@@ -21,14 +21,14 @@
|
|
21
21
|
|
22
22
|
|
23
23
|
#include <arpa/inet.h>
|
24
|
+
#include <net/if_arp.h>
|
25
|
+
#include <netinet/ip.h>
|
24
26
|
#include <openflow.h>
|
25
27
|
#include <stdio.h>
|
26
28
|
#include <stdlib.h>
|
27
29
|
#include <string.h>
|
28
30
|
#include <sys/types.h>
|
29
31
|
#include <unistd.h>
|
30
|
-
#include <netinet/ip.h>
|
31
|
-
#include <net/if_arp.h>
|
32
32
|
#include "byteorder.h"
|
33
33
|
#include "checks.h"
|
34
34
|
#include "cmockery_trema.h"
|
@@ -1213,7 +1213,7 @@ static void
|
|
1213
1213
|
test_append_action_vendor() {
|
1214
1214
|
openflow_actions *actions = NULL;
|
1215
1215
|
uint32_t vendor = 1;
|
1216
|
-
buffer *body;
|
1216
|
+
buffer *body = NULL;
|
1217
1217
|
struct ofp_action_vendor_header *action_vendor;
|
1218
1218
|
uint16_t length;
|
1219
1219
|
bool ret;
|
@@ -1234,6 +1234,7 @@ test_append_action_vendor() {
|
|
1234
1234
|
assert_int_equal( action_vendor->type, OFPAT_VENDOR );
|
1235
1235
|
assert_int_equal( action_vendor->len, length );
|
1236
1236
|
assert_int_equal( ( int ) action_vendor->vendor, ( int ) vendor );
|
1237
|
+
assert_memory_equal( ( char * ) action_vendor + sizeof( struct ofp_action_vendor_header ), body->data, body->length );
|
1237
1238
|
|
1238
1239
|
assert_int_equal( actions->n_actions, 1 );
|
1239
1240
|
|
@@ -2327,7 +2328,7 @@ test_create_vendor_stats_request() {
|
|
2327
2328
|
assert_int_equal( ( int ) ntohs( stats->flags ), ( int ) VENDOR_STATS_FLAG );
|
2328
2329
|
uint32_t vendor_id = *( ( uint32_t * ) ( ( char * ) stats + offsetof( struct ofp_stats_request, body ) ) );
|
2329
2330
|
assert_int_equal( ( int ) ntohl( vendor_id ), ( int ) VENDOR_ID );
|
2330
|
-
assert_memory_equal( ( char * ) stats + offsetof( struct ofp_stats_request, body ) + sizeof
|
2331
|
+
assert_memory_equal( ( char * ) stats + offsetof( struct ofp_stats_request, body ) + sizeof( uint32_t ),
|
2331
2332
|
body->data, body_length );
|
2332
2333
|
|
2333
2334
|
free_buffer( body );
|
@@ -4454,13 +4455,14 @@ test_validate_action_enqueue_fails_with_invalid_action_type() {
|
|
4454
4455
|
buffer *body = create_dummy_data( SHORT_DATA_LENGTH );
|
4455
4456
|
openflow_actions *actions = create_actions();
|
4456
4457
|
append_action_vendor( actions, VENDOR_ID, body );
|
4457
|
-
struct ofp_action_vendor_header action_vendor;
|
4458
|
-
hton_action_vendor(
|
4458
|
+
struct ofp_action_vendor_header *action_vendor = xmalloc( sizeof( struct ofp_action_vendor_header ) + body->length );
|
4459
|
+
hton_action_vendor( action_vendor, ( struct ofp_action_vendor_header * ) ( actions->list->data ) );
|
4459
4460
|
|
4460
|
-
assert_int_equal( validate_action_enqueue( ( struct ofp_action_enqueue * )
|
4461
|
+
assert_int_equal( validate_action_enqueue( ( struct ofp_action_enqueue * ) action_vendor ), ERROR_INVALID_ACTION_TYPE );
|
4461
4462
|
|
4462
4463
|
free_buffer( body );
|
4463
4464
|
delete_actions( actions );
|
4465
|
+
xfree( action_vendor );
|
4464
4466
|
}
|
4465
4467
|
|
4466
4468
|
|
@@ -4509,13 +4511,14 @@ test_validate_action_vendor() {
|
|
4509
4511
|
buffer *body = create_dummy_data( SHORT_DATA_LENGTH );
|
4510
4512
|
openflow_actions *actions = create_actions();
|
4511
4513
|
append_action_vendor( actions, VENDOR_ID, body );
|
4512
|
-
struct ofp_action_vendor_header action_vendor_header;
|
4513
|
-
hton_action_vendor(
|
4514
|
+
struct ofp_action_vendor_header *action_vendor_header = xmalloc( sizeof( struct ofp_action_vendor_header ) + body->length );
|
4515
|
+
hton_action_vendor( action_vendor_header, ( struct ofp_action_vendor_header * ) ( actions->list->data ) );
|
4514
4516
|
|
4515
|
-
assert_int_equal( validate_action_vendor(
|
4517
|
+
assert_int_equal( validate_action_vendor( action_vendor_header ), 0 );
|
4516
4518
|
|
4517
4519
|
free_buffer( body );
|
4518
4520
|
delete_actions( actions );
|
4521
|
+
xfree( action_vendor_header );
|
4519
4522
|
}
|
4520
4523
|
|
4521
4524
|
|
@@ -4540,15 +4543,16 @@ test_validate_action_vendor_fails_with_too_short_ofp_action_vendor_header() {
|
|
4540
4543
|
buffer *body = create_dummy_data( SHORT_DATA_LENGTH );
|
4541
4544
|
openflow_actions *actions = create_actions();
|
4542
4545
|
append_action_vendor( actions, VENDOR_ID, body );
|
4546
|
+
struct ofp_action_vendor_header *too_short_action_vendor_header = xmalloc( sizeof( struct ofp_action_vendor_header ) + body->length );
|
4547
|
+
hton_action_vendor( too_short_action_vendor_header, ( struct ofp_action_vendor_header * ) ( actions->list->data ) );
|
4543
4548
|
uint16_t too_short_action_length = sizeof( struct ofp_action_vendor_header ) - 1;
|
4544
|
-
|
4545
|
-
struct ofp_action_vendor_header too_short_action_vendor_header;
|
4546
|
-
hton_action_vendor( &too_short_action_vendor_header, ( struct ofp_action_vendor_header * ) ( actions->list->data ) );
|
4549
|
+
too_short_action_vendor_header->len = htons( too_short_action_length );
|
4547
4550
|
|
4548
|
-
assert_int_equal( validate_action_vendor(
|
4551
|
+
assert_int_equal( validate_action_vendor( too_short_action_vendor_header ), ERROR_TOO_SHORT_ACTION_VENDOR );
|
4549
4552
|
|
4550
4553
|
free_buffer( body );
|
4551
|
-
delete_actions(
|
4554
|
+
delete_actions( actions );
|
4555
|
+
xfree( too_short_action_vendor_header );
|
4552
4556
|
}
|
4553
4557
|
|
4554
4558
|
|
@@ -5047,8 +5051,8 @@ setup_ether_packet( size_t length, uint16_t type ) {
|
|
5047
5051
|
if ( type == ETH_ETHTYPE_TPID ) {
|
5048
5052
|
packet_info0->l3_header = ( void * ) ( vtag + 1 );
|
5049
5053
|
packet_info0->format |= ETH_8021Q;
|
5050
|
-
}
|
5051
|
-
else {
|
5054
|
+
}
|
5055
|
+
else {
|
5052
5056
|
packet_info0->l3_header = ( void * ) ( ether + 1 );
|
5053
5057
|
}
|
5054
5058
|
|
@@ -5082,7 +5086,7 @@ setup_ipv4_packet( size_t length, uint16_t type ) {
|
|
5082
5086
|
|
5083
5087
|
switch ( type ) {
|
5084
5088
|
case IPPROTO_ICMP:
|
5085
|
-
ipv4->protocol = ( uint8_t ) IPPROTO_ICMP;
|
5089
|
+
ipv4->protocol = ( uint8_t ) IPPROTO_ICMP;
|
5086
5090
|
icmp_header_t *icmpv4 = packet_info0->l4_header;
|
5087
5091
|
icmpv4->type = ICMP_TYPE_UNREACH;
|
5088
5092
|
icmpv4->code = ICMP_CODE_PORTUNREACH;
|
@@ -5094,7 +5098,7 @@ setup_ipv4_packet( size_t length, uint16_t type ) {
|
|
5094
5098
|
udp->src_port = ntohs( src_port );
|
5095
5099
|
udp->dst_port = ntohs( dst_port );
|
5096
5100
|
break;
|
5097
|
-
|
5101
|
+
|
5098
5102
|
case IPPROTO_TCP:
|
5099
5103
|
ipv4->protocol = ( uint8_t ) IPPROTO_TCP;
|
5100
5104
|
tcp_header_t *tcp = packet_info0->l4_header;
|
@@ -5142,7 +5146,7 @@ setup_ipv4_packet( size_t length, uint16_t type ) {
|
|
5142
5146
|
default:
|
5143
5147
|
break;
|
5144
5148
|
}
|
5145
|
-
|
5149
|
+
|
5146
5150
|
return buf;
|
5147
5151
|
}
|
5148
5152
|
|
@@ -5151,7 +5155,7 @@ static buffer *
|
|
5151
5155
|
setup_arp_packet( uint16_t type ) {
|
5152
5156
|
buffer *buf = setup_ether_packet( sizeof( ether_header_t ) + sizeof( arp_header_t ), type );
|
5153
5157
|
packet_info *packet_info0 = buf->user_data;
|
5154
|
-
|
5158
|
+
|
5155
5159
|
/* Fill arp values into the test packet. */
|
5156
5160
|
if ( type == ETH_ETHTYPE_TPID ) {
|
5157
5161
|
ether_header_t *ether = packet_info0->l2_header;
|
@@ -5217,7 +5221,7 @@ setup_snap_packet( uint16_t type ) {
|
|
5217
5221
|
length += sizeof( vlantag_header_t );
|
5218
5222
|
vlantag_header_t *vtag = ( void * ) ( ether + 1 );
|
5219
5223
|
vtag->type = htons( ( uint16_t ) length );
|
5220
|
-
}
|
5224
|
+
}
|
5221
5225
|
else {
|
5222
5226
|
ether->type = htons( ( uint16_t ) length );
|
5223
5227
|
}
|
@@ -6015,7 +6019,7 @@ test_set_match_from_packet_succeeds_if_datatype_is_ipv4_tcp_tag_and_wildcards_is
|
|
6015
6019
|
packet_info0->tcp_src_port = src_port;
|
6016
6020
|
packet_info0->tcp_dst_port = dst_port;
|
6017
6021
|
packet_info0->format |= TP_TCP;
|
6018
|
-
|
6022
|
+
|
6019
6023
|
uint16_t expected_in_port = 1;
|
6020
6024
|
struct ofp_match match;
|
6021
6025
|
set_match_from_packet( &match, expected_in_port, 0, buf );
|
@@ -6424,7 +6428,7 @@ test_set_match_from_packet_succeeds_if_datatype_is_ipv4_icmp_tag_and_wildcards_i
|
|
6424
6428
|
/* Add a icmp data into the test packet. */
|
6425
6429
|
ipv4_header_t *ipv4 = packet_info0->l3_header;
|
6426
6430
|
ipv4->protocol = IPPROTO_ICMP;
|
6427
|
-
icmp_header_t *icmpv4 = packet_info0->l4_header;
|
6431
|
+
icmp_header_t *icmpv4 = packet_info0->l4_header;
|
6428
6432
|
icmpv4->type = ICMP_TYPE_UNREACH;
|
6429
6433
|
icmpv4->code = ICMP_CODE_PORTUNREACH;
|
6430
6434
|
/* Add the icmp data into the packet_info data for verification. */
|
@@ -6980,6 +6984,16 @@ test_set_match_from_packet_succeeds_if_datatype_is_ieee8023_not_llc_and_wildcard
|
|
6980
6984
|
}
|
6981
6985
|
|
6982
6986
|
|
6987
|
+
static void
|
6988
|
+
test_set_match_from_packet_fails_if_match_is_NULL() {
|
6989
|
+
buffer *buf = setup_arp_packet( ETH_ETHTYPE_TPID );
|
6990
|
+
|
6991
|
+
expect_assert_failure( set_match_from_packet( NULL, 1, 0, buf ) );
|
6992
|
+
|
6993
|
+
free_buffer( buf );
|
6994
|
+
}
|
6995
|
+
|
6996
|
+
|
6983
6997
|
static void
|
6984
6998
|
test_set_match_from_packet_fails_if_packet_data_is_NULL() {
|
6985
6999
|
struct ofp_match match;
|
@@ -6998,6 +7012,666 @@ test_set_match_from_packet_fails_if_packet_is_not_parsed_yet() {
|
|
6998
7012
|
}
|
6999
7013
|
|
7000
7014
|
|
7015
|
+
/********************************************************************************
|
7016
|
+
* normalize_match() tests.
|
7017
|
+
********************************************************************************/
|
7018
|
+
|
7019
|
+
#define NORMALIZED_OFPFW_ALL \
|
7020
|
+
( OFPFW_IN_PORT | OFPFW_DL_VLAN | OFPFW_DL_SRC | OFPFW_DL_DST | OFPFW_DL_TYPE | \
|
7021
|
+
OFPFW_NW_PROTO | OFPFW_TP_SRC | OFPFW_TP_DST | OFPFW_NW_SRC_ALL | OFPFW_NW_DST_ALL | \
|
7022
|
+
OFPFW_DL_VLAN_PCP | OFPFW_NW_TOS )
|
7023
|
+
|
7024
|
+
|
7025
|
+
const char all_zero_mac_addr[] = { 0, 0, 0, 0, 0, 0 };
|
7026
|
+
const char all_one_mac_addr[] = { ( char ) 0xff, ( char ) 0xff, ( char ) 0xff,
|
7027
|
+
( char ) 0xff, ( char ) 0xff, ( char ) 0xff };
|
7028
|
+
const char all_zero_pad1[] = { 0 };
|
7029
|
+
const char all_zero_pad2[] = { 0, 0 };
|
7030
|
+
|
7031
|
+
|
7032
|
+
static void
|
7033
|
+
setup_arp_match( struct ofp_match *match ) {
|
7034
|
+
memset( match, 0xa8, sizeof( match ) );
|
7035
|
+
match->wildcards = 0;
|
7036
|
+
match->in_port = 1;
|
7037
|
+
memcpy( match->dl_src, macsa, ETH_ADDRLEN );
|
7038
|
+
memcpy( match->dl_dst, macda, ETH_ADDRLEN );
|
7039
|
+
match->dl_vlan = UINT16_MAX;
|
7040
|
+
match->dl_type = ETH_ETHTYPE_ARP;
|
7041
|
+
match->nw_proto = ARP_OP_REQUEST;
|
7042
|
+
match->nw_src = 0x01020304;
|
7043
|
+
match->nw_dst = 0x05060708;
|
7044
|
+
}
|
7045
|
+
|
7046
|
+
|
7047
|
+
static void
|
7048
|
+
setup_icmp_match( struct ofp_match *match ) {
|
7049
|
+
memset( match, 0xa8, sizeof( match ) );
|
7050
|
+
match->wildcards = 0;
|
7051
|
+
match->in_port = 1;
|
7052
|
+
memcpy( match->dl_src, macsa, ETH_ADDRLEN );
|
7053
|
+
memcpy( match->dl_dst, macda, ETH_ADDRLEN );
|
7054
|
+
match->dl_vlan = UINT16_MAX;
|
7055
|
+
match->dl_type = ETH_ETHTYPE_IPV4;
|
7056
|
+
match->nw_tos = 0;
|
7057
|
+
match->nw_proto = IPPROTO_ICMP;
|
7058
|
+
match->nw_src = 0x01020304;
|
7059
|
+
match->nw_dst = 0x05060708;
|
7060
|
+
match->tp_src = ICMP_TYPE_UNREACH;
|
7061
|
+
match->tp_dst = ICMP_CODE_PORTUNREACH;
|
7062
|
+
}
|
7063
|
+
|
7064
|
+
|
7065
|
+
static void
|
7066
|
+
setup_tcp_match( struct ofp_match *match ) {
|
7067
|
+
memset( match, 0xa8, sizeof( match ) );
|
7068
|
+
match->wildcards = 0;
|
7069
|
+
match->in_port = 1;
|
7070
|
+
memcpy( match->dl_src, macsa, ETH_ADDRLEN );
|
7071
|
+
memcpy( match->dl_dst, macda, ETH_ADDRLEN );
|
7072
|
+
match->dl_vlan = 1;
|
7073
|
+
match->dl_vlan_pcp = 0xff;
|
7074
|
+
match->dl_type = ETH_ETHTYPE_IPV4;
|
7075
|
+
match->nw_tos = 0xff;
|
7076
|
+
match->nw_proto = IPPROTO_TCP;
|
7077
|
+
match->nw_src = 0x01020304;
|
7078
|
+
match->nw_dst = 0x05060708;
|
7079
|
+
match->tp_src = 0xa;
|
7080
|
+
match->tp_dst = 0xb;
|
7081
|
+
}
|
7082
|
+
|
7083
|
+
|
7084
|
+
static void
|
7085
|
+
setup_udp_match( struct ofp_match *match ) {
|
7086
|
+
memset( match, 0xa8, sizeof( match ) );
|
7087
|
+
match->wildcards = 0;
|
7088
|
+
match->in_port = 1;
|
7089
|
+
memcpy( match->dl_src, macsa, ETH_ADDRLEN );
|
7090
|
+
memcpy( match->dl_dst, macda, ETH_ADDRLEN );
|
7091
|
+
match->dl_vlan = UINT16_MAX;
|
7092
|
+
match->dl_vlan_pcp = 0xff;
|
7093
|
+
match->dl_type = ETH_ETHTYPE_IPV4;
|
7094
|
+
match->nw_tos = 0xff;
|
7095
|
+
match->nw_proto = IPPROTO_UDP;
|
7096
|
+
match->nw_src = 0x01020304;
|
7097
|
+
match->nw_dst = 0x05060708;
|
7098
|
+
match->tp_src = 0xa;
|
7099
|
+
match->tp_dst = 0xb;
|
7100
|
+
}
|
7101
|
+
|
7102
|
+
|
7103
|
+
static void
|
7104
|
+
setup_invalid_match( struct ofp_match *match ) {
|
7105
|
+
memset( match, 0xa8, sizeof( match ) );
|
7106
|
+
match->wildcards = 0;
|
7107
|
+
match->in_port = 1;
|
7108
|
+
memcpy( match->dl_src, macsa, ETH_ADDRLEN );
|
7109
|
+
memcpy( match->dl_dst, macda, ETH_ADDRLEN );
|
7110
|
+
match->dl_vlan = UINT16_MAX;
|
7111
|
+
match->dl_vlan_pcp = 0xff;
|
7112
|
+
match->dl_type = UINT16_MAX;
|
7113
|
+
}
|
7114
|
+
|
7115
|
+
|
7116
|
+
static void
|
7117
|
+
test_normalize_match_succeeds_if_datatype_is_arp_and_wildcards_is_zero() {
|
7118
|
+
struct ofp_match match;
|
7119
|
+
setup_arp_match( &match );
|
7120
|
+
|
7121
|
+
normalize_match( &match );
|
7122
|
+
|
7123
|
+
uint32_t wildcards = OFPFW_DL_VLAN_PCP | OFPFW_NW_TOS | OFPFW_TP_SRC | OFPFW_TP_DST;
|
7124
|
+
|
7125
|
+
assert_int_equal( ( int ) match.wildcards, wildcards );
|
7126
|
+
assert_int_equal( match.in_port, 1 );
|
7127
|
+
assert_memory_equal( match.dl_src, macsa, ETH_ADDRLEN );
|
7128
|
+
assert_memory_equal( match.dl_dst, macda, ETH_ADDRLEN );
|
7129
|
+
assert_int_equal( match.dl_vlan, UINT16_MAX );
|
7130
|
+
assert_int_equal( match.dl_vlan_pcp, 0 );
|
7131
|
+
assert_memory_equal( match.pad1, all_zero_pad1, sizeof( match.pad1 ) );
|
7132
|
+
assert_int_equal( match.dl_type, ETH_ETHTYPE_ARP );
|
7133
|
+
assert_int_equal( match.nw_tos, 0 );
|
7134
|
+
assert_int_equal( match.nw_proto, ARP_OP_REQUEST );
|
7135
|
+
assert_memory_equal( match.pad2, all_zero_pad2, sizeof( match.pad2 ) );
|
7136
|
+
assert_int_equal( ( int ) match.nw_src, 0x01020304 );
|
7137
|
+
assert_int_equal( ( int ) match.nw_dst, 0x05060708 );
|
7138
|
+
assert_int_equal( ( int ) match.tp_src, 0 );
|
7139
|
+
assert_int_equal( ( int ) match.tp_dst, 0 );
|
7140
|
+
}
|
7141
|
+
|
7142
|
+
|
7143
|
+
static void
|
7144
|
+
test_normalize_match_succeeds_if_protocol_is_icmp_and_wildcards_is_zero() {
|
7145
|
+
struct ofp_match match;
|
7146
|
+
setup_icmp_match( &match );
|
7147
|
+
|
7148
|
+
normalize_match( &match );
|
7149
|
+
|
7150
|
+
uint32_t wildcards = OFPFW_DL_VLAN_PCP;
|
7151
|
+
|
7152
|
+
assert_int_equal( ( int ) match.wildcards, wildcards );
|
7153
|
+
assert_int_equal( match.in_port, 1 );
|
7154
|
+
assert_memory_equal( match.dl_src, macsa, ETH_ADDRLEN );
|
7155
|
+
assert_memory_equal( match.dl_dst, macda, ETH_ADDRLEN );
|
7156
|
+
assert_int_equal( match.dl_vlan, UINT16_MAX );
|
7157
|
+
assert_int_equal( match.dl_vlan_pcp, 0 );
|
7158
|
+
assert_memory_equal( match.pad1, all_zero_pad1, sizeof( match.pad1 ) );
|
7159
|
+
assert_int_equal( match.dl_type, ETH_ETHTYPE_IPV4 );
|
7160
|
+
assert_int_equal( match.nw_tos, 0 );
|
7161
|
+
assert_int_equal( match.nw_proto, IPPROTO_ICMP );
|
7162
|
+
assert_memory_equal( match.pad2, all_zero_pad2, sizeof( match.pad2 ) );
|
7163
|
+
assert_int_equal( ( int ) match.nw_src, 0x01020304 );
|
7164
|
+
assert_int_equal( ( int ) match.nw_dst, 0x05060708 );
|
7165
|
+
assert_int_equal( ( int ) match.tp_src, ICMP_TYPE_UNREACH );
|
7166
|
+
assert_int_equal( ( int ) match.tp_dst, ICMP_CODE_PORTUNREACH );
|
7167
|
+
}
|
7168
|
+
|
7169
|
+
|
7170
|
+
static void
|
7171
|
+
test_normalize_match_succeeds_if_protocol_is_tcp_and_wildcards_is_zero() {
|
7172
|
+
struct ofp_match match;
|
7173
|
+
setup_tcp_match( &match );
|
7174
|
+
|
7175
|
+
normalize_match( &match );
|
7176
|
+
|
7177
|
+
uint32_t wildcards = 0;
|
7178
|
+
|
7179
|
+
assert_int_equal( ( int ) match.wildcards, wildcards );
|
7180
|
+
assert_int_equal( match.in_port, 1 );
|
7181
|
+
assert_memory_equal( match.dl_src, macsa, ETH_ADDRLEN );
|
7182
|
+
assert_memory_equal( match.dl_dst, macda, ETH_ADDRLEN );
|
7183
|
+
assert_int_equal( match.dl_vlan, 1 );
|
7184
|
+
assert_int_equal( match.dl_vlan_pcp, 0x7 );
|
7185
|
+
assert_memory_equal( match.pad1, all_zero_pad1, sizeof( match.pad1 ) );
|
7186
|
+
assert_int_equal( match.dl_type, ETH_ETHTYPE_IPV4 );
|
7187
|
+
assert_int_equal( match.nw_tos, 0xfc );
|
7188
|
+
assert_int_equal( match.nw_proto, IPPROTO_TCP );
|
7189
|
+
assert_memory_equal( match.pad2, all_zero_pad2, sizeof( match.pad2 ) );
|
7190
|
+
assert_int_equal( ( int ) match.nw_src, 0x01020304 );
|
7191
|
+
assert_int_equal( ( int ) match.nw_dst, 0x05060708 );
|
7192
|
+
assert_int_equal( ( int ) match.tp_src, 0xa );
|
7193
|
+
assert_int_equal( ( int ) match.tp_dst, 0xb );
|
7194
|
+
}
|
7195
|
+
|
7196
|
+
|
7197
|
+
static void
|
7198
|
+
test_normalize_match_succeeds_if_protocol_is_udp_and_wildcards_is_zero() {
|
7199
|
+
struct ofp_match match;
|
7200
|
+
setup_udp_match( &match );
|
7201
|
+
|
7202
|
+
normalize_match( &match );
|
7203
|
+
|
7204
|
+
uint32_t wildcards = OFPFW_DL_VLAN_PCP;
|
7205
|
+
|
7206
|
+
assert_int_equal( ( int ) match.wildcards, wildcards );
|
7207
|
+
assert_int_equal( match.in_port, 1 );
|
7208
|
+
assert_memory_equal( match.dl_src, macsa, ETH_ADDRLEN );
|
7209
|
+
assert_memory_equal( match.dl_dst, macda, ETH_ADDRLEN );
|
7210
|
+
assert_int_equal( match.dl_vlan, UINT16_MAX );
|
7211
|
+
assert_int_equal( match.dl_vlan_pcp, 0 );
|
7212
|
+
assert_memory_equal( match.pad1, all_zero_pad1, sizeof( match.pad1 ) );
|
7213
|
+
assert_int_equal( match.dl_type, ETH_ETHTYPE_IPV4 );
|
7214
|
+
assert_int_equal( match.nw_tos, 0xfc );
|
7215
|
+
assert_int_equal( match.nw_proto, IPPROTO_UDP );
|
7216
|
+
assert_memory_equal( match.pad2, all_zero_pad2, sizeof( match.pad2 ) );
|
7217
|
+
assert_int_equal( ( int ) match.nw_src, 0x01020304 );
|
7218
|
+
assert_int_equal( ( int ) match.nw_dst, 0x05060708 );
|
7219
|
+
assert_int_equal( ( int ) match.tp_src, 0xa );
|
7220
|
+
assert_int_equal( ( int ) match.tp_dst, 0xb );
|
7221
|
+
}
|
7222
|
+
|
7223
|
+
|
7224
|
+
static void
|
7225
|
+
test_normalize_match_succeeds_if_packet_is_invalid_and_wildcards_is_zero() {
|
7226
|
+
struct ofp_match match;
|
7227
|
+
setup_invalid_match( &match );
|
7228
|
+
|
7229
|
+
normalize_match( &match );
|
7230
|
+
|
7231
|
+
uint32_t wildcards = OFPFW_DL_VLAN_PCP | OFPFW_NW_PROTO | OFPFW_NW_TOS | OFPFW_NW_SRC_ALL | OFPFW_NW_DST_ALL | OFPFW_TP_SRC | OFPFW_TP_DST;
|
7232
|
+
|
7233
|
+
assert_int_equal( ( int ) match.wildcards, wildcards );
|
7234
|
+
assert_int_equal( match.in_port, 1 );
|
7235
|
+
assert_memory_equal( match.dl_src, macsa, ETH_ADDRLEN );
|
7236
|
+
assert_memory_equal( match.dl_dst, macda, ETH_ADDRLEN );
|
7237
|
+
assert_int_equal( match.dl_vlan, UINT16_MAX );
|
7238
|
+
assert_int_equal( match.dl_vlan_pcp, 0 );
|
7239
|
+
assert_memory_equal( match.pad1, all_zero_pad1, sizeof( match.pad1 ) );
|
7240
|
+
assert_int_equal( match.dl_type, UINT16_MAX );
|
7241
|
+
assert_int_equal( match.nw_tos, 0 );
|
7242
|
+
assert_int_equal( match.nw_proto, 0 );
|
7243
|
+
assert_memory_equal( match.pad2, all_zero_pad2, sizeof( match.pad2 ) );
|
7244
|
+
assert_int_equal( ( int ) match.nw_src, 0 );
|
7245
|
+
assert_int_equal( ( int ) match.nw_dst, 0 );
|
7246
|
+
assert_int_equal( ( int ) match.tp_src, 0 );
|
7247
|
+
assert_int_equal( ( int ) match.tp_dst, 0 );
|
7248
|
+
}
|
7249
|
+
|
7250
|
+
|
7251
|
+
static void
|
7252
|
+
test_normalize_match_succeeds_if_wildcards_is_OFPFW_ALL() {
|
7253
|
+
struct ofp_match match;
|
7254
|
+
setup_tcp_match( &match );
|
7255
|
+
match.wildcards = OFPFW_ALL;
|
7256
|
+
|
7257
|
+
normalize_match( &match );
|
7258
|
+
|
7259
|
+
assert_int_equal( ( int ) match.wildcards, NORMALIZED_OFPFW_ALL );
|
7260
|
+
assert_int_equal( match.in_port, 0 );
|
7261
|
+
assert_memory_equal( match.dl_src, all_zero_mac_addr, ETH_ADDRLEN );
|
7262
|
+
assert_memory_equal( match.dl_dst, all_zero_mac_addr, ETH_ADDRLEN );
|
7263
|
+
assert_int_equal( match.dl_vlan, 0 );
|
7264
|
+
assert_int_equal( match.dl_vlan_pcp, 0 );
|
7265
|
+
assert_memory_equal( match.pad1, all_zero_pad1, sizeof( match.pad1 ) );
|
7266
|
+
assert_int_equal( match.dl_type, 0 );
|
7267
|
+
assert_int_equal( match.nw_tos, 0 );
|
7268
|
+
assert_int_equal( match.nw_proto, 0 );
|
7269
|
+
assert_memory_equal( match.pad2, all_zero_pad2, sizeof( match.pad2 ) );
|
7270
|
+
assert_int_equal( ( int ) match.nw_src, 0 );
|
7271
|
+
assert_int_equal( ( int ) match.nw_dst, 0 );
|
7272
|
+
assert_int_equal( ( int ) match.tp_src, 0 );
|
7273
|
+
assert_int_equal( ( int ) match.tp_dst, 0 );
|
7274
|
+
}
|
7275
|
+
|
7276
|
+
|
7277
|
+
static void
|
7278
|
+
test_normalize_match_succeeds_if_wildcards_is_OFPFW_IN_PORT() {
|
7279
|
+
struct ofp_match match;
|
7280
|
+
setup_tcp_match( &match );
|
7281
|
+
match.wildcards = OFPFW_IN_PORT;
|
7282
|
+
|
7283
|
+
normalize_match( &match );
|
7284
|
+
|
7285
|
+
uint32_t wildcards = OFPFW_IN_PORT;
|
7286
|
+
|
7287
|
+
assert_int_equal( ( int ) match.wildcards, wildcards );
|
7288
|
+
assert_int_equal( match.in_port, 0 );
|
7289
|
+
assert_memory_equal( match.dl_src, macsa, ETH_ADDRLEN );
|
7290
|
+
assert_memory_equal( match.dl_dst, macda, ETH_ADDRLEN );
|
7291
|
+
assert_int_equal( match.dl_vlan, 1 );
|
7292
|
+
assert_int_equal( match.dl_vlan_pcp, 0x7 );
|
7293
|
+
assert_memory_equal( match.pad1, all_zero_pad1, sizeof( match.pad1 ) );
|
7294
|
+
assert_int_equal( match.dl_type, ETH_ETHTYPE_IPV4 );
|
7295
|
+
assert_int_equal( match.nw_tos, 0xfc );
|
7296
|
+
assert_int_equal( match.nw_proto, IPPROTO_TCP );
|
7297
|
+
assert_memory_equal( match.pad2, all_zero_pad2, sizeof( match.pad2 ) );
|
7298
|
+
assert_int_equal( ( int ) match.nw_src, 0x01020304 );
|
7299
|
+
assert_int_equal( ( int ) match.nw_dst, 0x05060708 );
|
7300
|
+
assert_int_equal( ( int ) match.tp_src, 0xa );
|
7301
|
+
assert_int_equal( ( int ) match.tp_dst, 0xb );
|
7302
|
+
}
|
7303
|
+
|
7304
|
+
|
7305
|
+
static void
|
7306
|
+
test_normalize_match_succeeds_if_wildcards_is_OFPFW_DL_VLAN() {
|
7307
|
+
struct ofp_match match;
|
7308
|
+
setup_tcp_match( &match );
|
7309
|
+
match.wildcards = OFPFW_DL_VLAN;
|
7310
|
+
|
7311
|
+
normalize_match( &match );
|
7312
|
+
|
7313
|
+
uint32_t wildcards = OFPFW_DL_VLAN;
|
7314
|
+
|
7315
|
+
assert_int_equal( ( int ) match.wildcards, wildcards );
|
7316
|
+
assert_int_equal( match.in_port, 1 );
|
7317
|
+
assert_memory_equal( match.dl_src, macsa, ETH_ADDRLEN );
|
7318
|
+
assert_memory_equal( match.dl_dst, macda, ETH_ADDRLEN );
|
7319
|
+
assert_int_equal( match.dl_vlan, 0 );
|
7320
|
+
assert_int_equal( match.dl_vlan_pcp, 0x7 );
|
7321
|
+
assert_memory_equal( match.pad1, all_zero_pad1, sizeof( match.pad1 ) );
|
7322
|
+
assert_int_equal( match.dl_type, ETH_ETHTYPE_IPV4 );
|
7323
|
+
assert_int_equal( match.nw_tos, 0xfc );
|
7324
|
+
assert_int_equal( match.nw_proto, IPPROTO_TCP );
|
7325
|
+
assert_memory_equal( match.pad2, all_zero_pad2, sizeof( match.pad2 ) );
|
7326
|
+
assert_int_equal( ( int ) match.nw_src, 0x01020304 );
|
7327
|
+
assert_int_equal( ( int ) match.nw_dst, 0x05060708 );
|
7328
|
+
assert_int_equal( ( int ) match.tp_src, 0xa );
|
7329
|
+
assert_int_equal( ( int ) match.tp_dst, 0xb );
|
7330
|
+
}
|
7331
|
+
|
7332
|
+
|
7333
|
+
static void
|
7334
|
+
test_normalize_match_succeeds_if_wildcards_is_OFPFW_DL_SRC() {
|
7335
|
+
struct ofp_match match;
|
7336
|
+
setup_tcp_match( &match );
|
7337
|
+
match.wildcards = OFPFW_DL_SRC;
|
7338
|
+
|
7339
|
+
normalize_match( &match );
|
7340
|
+
|
7341
|
+
uint32_t wildcards = OFPFW_DL_SRC;
|
7342
|
+
|
7343
|
+
assert_int_equal( ( int ) match.wildcards, wildcards );
|
7344
|
+
assert_int_equal( match.in_port, 1 );
|
7345
|
+
assert_memory_equal( match.dl_src, all_zero_mac_addr, ETH_ADDRLEN );
|
7346
|
+
assert_memory_equal( match.dl_dst, macda, ETH_ADDRLEN );
|
7347
|
+
assert_int_equal( match.dl_vlan, 1 );
|
7348
|
+
assert_int_equal( match.dl_vlan_pcp, 0x7 );
|
7349
|
+
assert_memory_equal( match.pad1, all_zero_pad1, sizeof( match.pad1 ) );
|
7350
|
+
assert_int_equal( match.dl_type, ETH_ETHTYPE_IPV4 );
|
7351
|
+
assert_int_equal( match.nw_tos, 0xfc );
|
7352
|
+
assert_int_equal( match.nw_proto, IPPROTO_TCP );
|
7353
|
+
assert_memory_equal( match.pad2, all_zero_pad2, sizeof( match.pad2 ) );
|
7354
|
+
assert_int_equal( ( int ) match.nw_src, 0x01020304 );
|
7355
|
+
assert_int_equal( ( int ) match.nw_dst, 0x05060708 );
|
7356
|
+
assert_int_equal( ( int ) match.tp_src, 0xa );
|
7357
|
+
assert_int_equal( ( int ) match.tp_dst, 0xb );
|
7358
|
+
}
|
7359
|
+
|
7360
|
+
|
7361
|
+
static void
|
7362
|
+
test_normalize_match_succeeds_if_wildcards_is_OFPFW_DL_DST() {
|
7363
|
+
struct ofp_match match;
|
7364
|
+
setup_tcp_match( &match );
|
7365
|
+
match.wildcards = OFPFW_DL_DST;
|
7366
|
+
|
7367
|
+
normalize_match( &match );
|
7368
|
+
|
7369
|
+
uint32_t wildcards = OFPFW_DL_DST;
|
7370
|
+
|
7371
|
+
assert_int_equal( ( int ) match.wildcards, wildcards );
|
7372
|
+
assert_int_equal( match.in_port, 1 );
|
7373
|
+
assert_memory_equal( match.dl_src, macsa, ETH_ADDRLEN );
|
7374
|
+
assert_memory_equal( match.dl_dst, all_zero_mac_addr, ETH_ADDRLEN );
|
7375
|
+
assert_int_equal( match.dl_vlan, 1 );
|
7376
|
+
assert_int_equal( match.dl_vlan_pcp, 0x7 );
|
7377
|
+
assert_memory_equal( match.pad1, all_zero_pad1, sizeof( match.pad1 ) );
|
7378
|
+
assert_int_equal( match.dl_type, ETH_ETHTYPE_IPV4 );
|
7379
|
+
assert_int_equal( match.nw_tos, 0xfc );
|
7380
|
+
assert_int_equal( match.nw_proto, IPPROTO_TCP );
|
7381
|
+
assert_memory_equal( match.pad2, all_zero_pad2, sizeof( match.pad2 ) );
|
7382
|
+
assert_int_equal( ( int ) match.nw_src, 0x01020304 );
|
7383
|
+
assert_int_equal( ( int ) match.nw_dst, 0x05060708 );
|
7384
|
+
assert_int_equal( ( int ) match.tp_src, 0xa );
|
7385
|
+
assert_int_equal( ( int ) match.tp_dst, 0xb );
|
7386
|
+
}
|
7387
|
+
|
7388
|
+
|
7389
|
+
static void
|
7390
|
+
test_normalize_match_succeeds_if_wildcards_is_OFPFW_DL_TYPE() {
|
7391
|
+
struct ofp_match match;
|
7392
|
+
setup_tcp_match( &match );
|
7393
|
+
match.wildcards = OFPFW_DL_TYPE;
|
7394
|
+
|
7395
|
+
normalize_match( &match );
|
7396
|
+
|
7397
|
+
uint32_t wildcards = OFPFW_DL_TYPE | OFPFW_NW_PROTO | OFPFW_NW_TOS | OFPFW_NW_SRC_ALL | OFPFW_NW_DST_ALL | OFPFW_TP_SRC | OFPFW_TP_DST;
|
7398
|
+
|
7399
|
+
assert_int_equal( ( int ) match.wildcards, wildcards );
|
7400
|
+
assert_int_equal( match.in_port, 1 );
|
7401
|
+
assert_memory_equal( match.dl_src, macsa, ETH_ADDRLEN );
|
7402
|
+
assert_memory_equal( match.dl_dst, macda, ETH_ADDRLEN );
|
7403
|
+
assert_int_equal( match.dl_vlan, 1 );
|
7404
|
+
assert_int_equal( match.dl_vlan_pcp, 0x7 );
|
7405
|
+
assert_memory_equal( match.pad1, all_zero_pad1, sizeof( match.pad1 ) );
|
7406
|
+
assert_int_equal( match.dl_type, 0 );
|
7407
|
+
assert_int_equal( match.nw_tos, 0 );
|
7408
|
+
assert_int_equal( match.nw_proto, 0 );
|
7409
|
+
assert_memory_equal( match.pad2, all_zero_pad2, sizeof( match.pad2 ) );
|
7410
|
+
assert_int_equal( ( int ) match.nw_src, 0 );
|
7411
|
+
assert_int_equal( ( int ) match.nw_dst, 0 );
|
7412
|
+
assert_int_equal( ( int ) match.tp_src, 0 );
|
7413
|
+
assert_int_equal( ( int ) match.tp_dst, 0 );
|
7414
|
+
}
|
7415
|
+
|
7416
|
+
|
7417
|
+
static void
|
7418
|
+
test_normalize_match_succeeds_if_wildcards_is_OFPFW_NW_PROTO() {
|
7419
|
+
struct ofp_match match;
|
7420
|
+
setup_tcp_match( &match );
|
7421
|
+
match.wildcards = OFPFW_NW_PROTO;
|
7422
|
+
|
7423
|
+
normalize_match( &match );
|
7424
|
+
|
7425
|
+
uint32_t wildcards = OFPFW_NW_PROTO;
|
7426
|
+
|
7427
|
+
assert_int_equal( ( int ) match.wildcards, wildcards );
|
7428
|
+
assert_int_equal( match.in_port, 1 );
|
7429
|
+
assert_memory_equal( match.dl_src, macsa, ETH_ADDRLEN );
|
7430
|
+
assert_memory_equal( match.dl_dst, macda, ETH_ADDRLEN );
|
7431
|
+
assert_int_equal( match.dl_vlan, 1 );
|
7432
|
+
assert_int_equal( match.dl_vlan_pcp, 0x7 );
|
7433
|
+
assert_memory_equal( match.pad1, all_zero_pad1, sizeof( match.pad1 ) );
|
7434
|
+
assert_int_equal( match.dl_type, ETH_ETHTYPE_IPV4 );
|
7435
|
+
assert_int_equal( match.nw_tos, 0xfc );
|
7436
|
+
assert_int_equal( match.nw_proto, 0 );
|
7437
|
+
assert_memory_equal( match.pad2, all_zero_pad2, sizeof( match.pad2 ) );
|
7438
|
+
assert_int_equal( ( int ) match.nw_src, 0x01020304 );
|
7439
|
+
assert_int_equal( ( int ) match.nw_dst, 0x05060708 );
|
7440
|
+
assert_int_equal( ( int ) match.tp_src, 0xa );
|
7441
|
+
assert_int_equal( ( int ) match.tp_dst, 0xb );
|
7442
|
+
}
|
7443
|
+
|
7444
|
+
|
7445
|
+
static void
|
7446
|
+
test_normalize_match_succeeds_if_wildcards_is_OFPFW_TP_SRC() {
|
7447
|
+
struct ofp_match match;
|
7448
|
+
setup_tcp_match( &match );
|
7449
|
+
match.wildcards = OFPFW_TP_SRC;
|
7450
|
+
|
7451
|
+
normalize_match( &match );
|
7452
|
+
|
7453
|
+
uint32_t wildcards = OFPFW_TP_SRC;
|
7454
|
+
|
7455
|
+
assert_int_equal( ( int ) match.wildcards, wildcards );
|
7456
|
+
assert_int_equal( match.in_port, 1 );
|
7457
|
+
assert_memory_equal( match.dl_src, macsa, ETH_ADDRLEN );
|
7458
|
+
assert_memory_equal( match.dl_dst, macda, ETH_ADDRLEN );
|
7459
|
+
assert_int_equal( match.dl_vlan, 1 );
|
7460
|
+
assert_int_equal( match.dl_vlan_pcp, 0x7 );
|
7461
|
+
assert_memory_equal( match.pad1, all_zero_pad1, sizeof( match.pad1 ) );
|
7462
|
+
assert_int_equal( match.dl_type, ETH_ETHTYPE_IPV4 );
|
7463
|
+
assert_int_equal( match.nw_tos, 0xfc );
|
7464
|
+
assert_int_equal( match.nw_proto, IPPROTO_TCP );
|
7465
|
+
assert_memory_equal( match.pad2, all_zero_pad2, sizeof( match.pad2 ) );
|
7466
|
+
assert_int_equal( ( int ) match.nw_src, 0x01020304 );
|
7467
|
+
assert_int_equal( ( int ) match.nw_dst, 0x05060708 );
|
7468
|
+
assert_int_equal( ( int ) match.tp_src, 0 );
|
7469
|
+
assert_int_equal( ( int ) match.tp_dst, 0xb );
|
7470
|
+
}
|
7471
|
+
|
7472
|
+
|
7473
|
+
static void
|
7474
|
+
test_normalize_match_succeeds_if_wildcards_is_OFPFW_TP_DST() {
|
7475
|
+
struct ofp_match match;
|
7476
|
+
setup_tcp_match( &match );
|
7477
|
+
match.wildcards = OFPFW_TP_DST;
|
7478
|
+
|
7479
|
+
normalize_match( &match );
|
7480
|
+
|
7481
|
+
uint32_t wildcards = OFPFW_TP_DST;
|
7482
|
+
|
7483
|
+
assert_int_equal( ( int ) match.wildcards, wildcards );
|
7484
|
+
assert_int_equal( match.in_port, 1 );
|
7485
|
+
assert_memory_equal( match.dl_src, macsa, ETH_ADDRLEN );
|
7486
|
+
assert_memory_equal( match.dl_dst, macda, ETH_ADDRLEN );
|
7487
|
+
assert_int_equal( match.dl_vlan, 1 );
|
7488
|
+
assert_int_equal( match.dl_vlan_pcp, 0x7 );
|
7489
|
+
assert_memory_equal( match.pad1, all_zero_pad1, sizeof( match.pad1 ) );
|
7490
|
+
assert_int_equal( match.dl_type, ETH_ETHTYPE_IPV4 );
|
7491
|
+
assert_int_equal( match.nw_tos, 0xfc );
|
7492
|
+
assert_int_equal( match.nw_proto, IPPROTO_TCP );
|
7493
|
+
assert_memory_equal( match.pad2, all_zero_pad2, sizeof( match.pad2 ) );
|
7494
|
+
assert_int_equal( ( int ) match.nw_src, 0x01020304 );
|
7495
|
+
assert_int_equal( ( int ) match.nw_dst, 0x05060708 );
|
7496
|
+
assert_int_equal( ( int ) match.tp_src, 0xa );
|
7497
|
+
assert_int_equal( ( int ) match.tp_dst, 0 );
|
7498
|
+
}
|
7499
|
+
|
7500
|
+
|
7501
|
+
static void
|
7502
|
+
test_normalize_match_succeeds_if_wildcards_is_OFPFW_NW_SRC_ALL() {
|
7503
|
+
struct ofp_match match;
|
7504
|
+
setup_tcp_match( &match );
|
7505
|
+
match.wildcards = OFPFW_NW_SRC_ALL;
|
7506
|
+
|
7507
|
+
normalize_match( &match );
|
7508
|
+
|
7509
|
+
uint32_t wildcards = OFPFW_NW_SRC_ALL;
|
7510
|
+
|
7511
|
+
assert_int_equal( ( int ) match.wildcards, wildcards );
|
7512
|
+
assert_int_equal( match.in_port, 1 );
|
7513
|
+
assert_memory_equal( match.dl_src, macsa, ETH_ADDRLEN );
|
7514
|
+
assert_memory_equal( match.dl_dst, macda, ETH_ADDRLEN );
|
7515
|
+
assert_int_equal( match.dl_vlan, 1 );
|
7516
|
+
assert_int_equal( match.dl_vlan_pcp, 0x7 );
|
7517
|
+
assert_memory_equal( match.pad1, all_zero_pad1, sizeof( match.pad1 ) );
|
7518
|
+
assert_int_equal( match.dl_type, ETH_ETHTYPE_IPV4 );
|
7519
|
+
assert_int_equal( match.nw_tos, 0xfc );
|
7520
|
+
assert_int_equal( match.nw_proto, IPPROTO_TCP );
|
7521
|
+
assert_memory_equal( match.pad2, all_zero_pad2, sizeof( match.pad2 ) );
|
7522
|
+
assert_int_equal( ( int ) match.nw_src, 0 );
|
7523
|
+
assert_int_equal( ( int ) match.nw_dst, 0x05060708 );
|
7524
|
+
assert_int_equal( ( int ) match.tp_src, 0xa );
|
7525
|
+
assert_int_equal( ( int ) match.tp_dst, 0xb );
|
7526
|
+
}
|
7527
|
+
|
7528
|
+
|
7529
|
+
static void
|
7530
|
+
test_normalize_match_succeeds_if_wildcards_is_OFPFW_NW_DST_ALL() {
|
7531
|
+
struct ofp_match match;
|
7532
|
+
setup_tcp_match( &match );
|
7533
|
+
match.wildcards = OFPFW_NW_DST_ALL;
|
7534
|
+
|
7535
|
+
normalize_match( &match );
|
7536
|
+
|
7537
|
+
uint32_t wildcards = OFPFW_NW_DST_ALL;
|
7538
|
+
|
7539
|
+
assert_int_equal( ( int ) match.wildcards, wildcards );
|
7540
|
+
assert_int_equal( match.in_port, 1 );
|
7541
|
+
assert_memory_equal( match.dl_src, macsa, ETH_ADDRLEN );
|
7542
|
+
assert_memory_equal( match.dl_dst, macda, ETH_ADDRLEN );
|
7543
|
+
assert_int_equal( match.dl_vlan, 1 );
|
7544
|
+
assert_int_equal( match.dl_vlan_pcp, 0x7 );
|
7545
|
+
assert_memory_equal( match.pad1, all_zero_pad1, sizeof( match.pad1 ) );
|
7546
|
+
assert_int_equal( match.dl_type, ETH_ETHTYPE_IPV4 );
|
7547
|
+
assert_int_equal( match.nw_tos, 0xfc );
|
7548
|
+
assert_int_equal( match.nw_proto, IPPROTO_TCP );
|
7549
|
+
assert_memory_equal( match.pad2, all_zero_pad2, sizeof( match.pad2 ) );
|
7550
|
+
assert_int_equal( ( int ) match.nw_src, 0x01020304 );
|
7551
|
+
assert_int_equal( ( int ) match.nw_dst, 0 );
|
7552
|
+
assert_int_equal( ( int ) match.tp_src, 0xa );
|
7553
|
+
assert_int_equal( ( int ) match.tp_dst, 0xb );
|
7554
|
+
}
|
7555
|
+
|
7556
|
+
|
7557
|
+
static void
|
7558
|
+
test_normalize_match_succeeds_if_src_mask_len_is_24() {
|
7559
|
+
struct ofp_match match;
|
7560
|
+
setup_tcp_match( &match );
|
7561
|
+
match.wildcards = 24 << OFPFW_NW_SRC_SHIFT;
|
7562
|
+
|
7563
|
+
normalize_match( &match );
|
7564
|
+
|
7565
|
+
uint32_t wildcards = 24 << OFPFW_NW_SRC_SHIFT;
|
7566
|
+
|
7567
|
+
assert_int_equal( ( int ) match.wildcards, wildcards );
|
7568
|
+
assert_int_equal( match.in_port, 1 );
|
7569
|
+
assert_memory_equal( match.dl_src, macsa, ETH_ADDRLEN );
|
7570
|
+
assert_memory_equal( match.dl_dst, macda, ETH_ADDRLEN );
|
7571
|
+
assert_int_equal( match.dl_vlan, 1 );
|
7572
|
+
assert_int_equal( match.dl_vlan_pcp, 0x7 );
|
7573
|
+
assert_memory_equal( match.pad1, all_zero_pad1, sizeof( match.pad1 ) );
|
7574
|
+
assert_int_equal( match.dl_type, ETH_ETHTYPE_IPV4 );
|
7575
|
+
assert_int_equal( match.nw_tos, 0xfc );
|
7576
|
+
assert_int_equal( match.nw_proto, IPPROTO_TCP );
|
7577
|
+
assert_memory_equal( match.pad2, all_zero_pad2, sizeof( match.pad2 ) );
|
7578
|
+
assert_int_equal( ( int ) match.nw_src, 0x01000000 );
|
7579
|
+
assert_int_equal( ( int ) match.nw_dst, 0x05060708 );
|
7580
|
+
assert_int_equal( ( int ) match.tp_src, 0xa );
|
7581
|
+
assert_int_equal( ( int ) match.tp_dst, 0xb );
|
7582
|
+
}
|
7583
|
+
|
7584
|
+
|
7585
|
+
static void
|
7586
|
+
test_normalize_match_succeeds_if_dst_mask_len_is_24() {
|
7587
|
+
struct ofp_match match;
|
7588
|
+
setup_tcp_match( &match );
|
7589
|
+
match.wildcards = 24 << OFPFW_NW_DST_SHIFT;
|
7590
|
+
|
7591
|
+
normalize_match( &match );
|
7592
|
+
|
7593
|
+
uint32_t wildcards = 24 << OFPFW_NW_DST_SHIFT;
|
7594
|
+
|
7595
|
+
assert_int_equal( ( int ) match.wildcards, wildcards );
|
7596
|
+
assert_int_equal( match.in_port, 1 );
|
7597
|
+
assert_memory_equal( match.dl_src, macsa, ETH_ADDRLEN );
|
7598
|
+
assert_memory_equal( match.dl_dst, macda, ETH_ADDRLEN );
|
7599
|
+
assert_int_equal( match.dl_vlan, 1 );
|
7600
|
+
assert_int_equal( match.dl_vlan_pcp, 0x7 );
|
7601
|
+
assert_memory_equal( match.pad1, all_zero_pad1, sizeof( match.pad1 ) );
|
7602
|
+
assert_int_equal( match.dl_type, ETH_ETHTYPE_IPV4 );
|
7603
|
+
assert_int_equal( match.nw_tos, 0xfc );
|
7604
|
+
assert_int_equal( match.nw_proto, IPPROTO_TCP );
|
7605
|
+
assert_memory_equal( match.pad2, all_zero_pad2, sizeof( match.pad2 ) );
|
7606
|
+
assert_int_equal( ( int ) match.nw_src, 0x01020304 );
|
7607
|
+
assert_int_equal( ( int ) match.nw_dst, 0x05000000 );
|
7608
|
+
assert_int_equal( ( int ) match.tp_src, 0xa );
|
7609
|
+
assert_int_equal( ( int ) match.tp_dst, 0xb );
|
7610
|
+
}
|
7611
|
+
|
7612
|
+
|
7613
|
+
static void
|
7614
|
+
test_normalize_match_succeeds_if_wildcards_is_OFPFW_DL_VLAN_PCP() {
|
7615
|
+
struct ofp_match match;
|
7616
|
+
setup_tcp_match( &match );
|
7617
|
+
match.wildcards = OFPFW_DL_VLAN_PCP;
|
7618
|
+
|
7619
|
+
normalize_match( &match );
|
7620
|
+
|
7621
|
+
uint32_t wildcards = OFPFW_DL_VLAN_PCP;
|
7622
|
+
|
7623
|
+
assert_int_equal( ( int ) match.wildcards, wildcards );
|
7624
|
+
assert_int_equal( match.in_port, 1 );
|
7625
|
+
assert_memory_equal( match.dl_src, macsa, ETH_ADDRLEN );
|
7626
|
+
assert_memory_equal( match.dl_dst, macda, ETH_ADDRLEN );
|
7627
|
+
assert_int_equal( match.dl_vlan, 1 );
|
7628
|
+
assert_int_equal( match.dl_vlan_pcp, 0 );
|
7629
|
+
assert_memory_equal( match.pad1, all_zero_pad1, sizeof( match.pad1 ) );
|
7630
|
+
assert_int_equal( match.dl_type, ETH_ETHTYPE_IPV4 );
|
7631
|
+
assert_int_equal( match.nw_tos, 0xfc );
|
7632
|
+
assert_int_equal( match.nw_proto, IPPROTO_TCP );
|
7633
|
+
assert_memory_equal( match.pad2, all_zero_pad2, sizeof( match.pad2 ) );
|
7634
|
+
assert_int_equal( ( int ) match.nw_src, 0x01020304 );
|
7635
|
+
assert_int_equal( ( int ) match.nw_dst, 0x05060708 );
|
7636
|
+
assert_int_equal( ( int ) match.tp_src, 0xa );
|
7637
|
+
assert_int_equal( ( int ) match.tp_dst, 0xb );
|
7638
|
+
}
|
7639
|
+
|
7640
|
+
|
7641
|
+
static void
|
7642
|
+
test_normalize_match_succeeds_if_wildcards_is_OFPFW_NW_TOS() {
|
7643
|
+
struct ofp_match match;
|
7644
|
+
setup_tcp_match( &match );
|
7645
|
+
match.wildcards = OFPFW_NW_TOS;
|
7646
|
+
|
7647
|
+
normalize_match( &match );
|
7648
|
+
|
7649
|
+
uint32_t wildcards = OFPFW_NW_TOS;
|
7650
|
+
|
7651
|
+
assert_int_equal( ( int ) match.wildcards, wildcards );
|
7652
|
+
assert_int_equal( match.in_port, 1 );
|
7653
|
+
assert_memory_equal( match.dl_src, macsa, ETH_ADDRLEN );
|
7654
|
+
assert_memory_equal( match.dl_dst, macda, ETH_ADDRLEN );
|
7655
|
+
assert_int_equal( match.dl_vlan, 1 );
|
7656
|
+
assert_int_equal( match.dl_vlan_pcp, 0x7 );
|
7657
|
+
assert_memory_equal( match.pad1, all_zero_pad1, sizeof( match.pad1 ) );
|
7658
|
+
assert_int_equal( match.dl_type, ETH_ETHTYPE_IPV4 );
|
7659
|
+
assert_int_equal( match.nw_tos, 0 );
|
7660
|
+
assert_int_equal( match.nw_proto, IPPROTO_TCP );
|
7661
|
+
assert_memory_equal( match.pad2, all_zero_pad2, sizeof( match.pad2 ) );
|
7662
|
+
assert_int_equal( ( int ) match.nw_src, 0x01020304 );
|
7663
|
+
assert_int_equal( ( int ) match.nw_dst, 0x05060708 );
|
7664
|
+
assert_int_equal( ( int ) match.tp_src, 0xa );
|
7665
|
+
assert_int_equal( ( int ) match.tp_dst, 0xb );
|
7666
|
+
}
|
7667
|
+
|
7668
|
+
|
7669
|
+
static void
|
7670
|
+
test_normalize_match_fails_if_match_is_NULL() {
|
7671
|
+
expect_assert_failure( normalize_match( NULL ) );
|
7672
|
+
}
|
7673
|
+
|
7674
|
+
|
7001
7675
|
/********************************************************************************
|
7002
7676
|
* Run tests.
|
7003
7677
|
********************************************************************************/
|
@@ -7318,8 +7992,31 @@ main() {
|
|
7318
7992
|
unit_test_setup_teardown( test_set_match_from_packet_succeeds_if_datatype_is_ieee8023_netbios_and_wildcards_is_zero, init, teardown ),
|
7319
7993
|
unit_test_setup_teardown( test_set_match_from_packet_succeeds_if_datatype_is_ieee8023_not_llc_tag_and_wildcards_is_zero, init, teardown ),
|
7320
7994
|
unit_test_setup_teardown( test_set_match_from_packet_succeeds_if_datatype_is_ieee8023_not_llc_and_wildcards_is_zero, init, teardown ),
|
7995
|
+
unit_test_setup_teardown( test_set_match_from_packet_fails_if_match_is_NULL, init, teardown ),
|
7321
7996
|
unit_test_setup_teardown( test_set_match_from_packet_fails_if_packet_data_is_NULL, init, teardown ),
|
7322
7997
|
unit_test_setup_teardown( test_set_match_from_packet_fails_if_packet_is_not_parsed_yet, init, teardown ),
|
7998
|
+
|
7999
|
+
unit_test_setup_teardown( test_normalize_match_succeeds_if_datatype_is_arp_and_wildcards_is_zero, init, teardown ),
|
8000
|
+
unit_test_setup_teardown( test_normalize_match_succeeds_if_protocol_is_icmp_and_wildcards_is_zero, init, teardown ),
|
8001
|
+
unit_test_setup_teardown( test_normalize_match_succeeds_if_protocol_is_tcp_and_wildcards_is_zero, init, teardown ),
|
8002
|
+
unit_test_setup_teardown( test_normalize_match_succeeds_if_protocol_is_udp_and_wildcards_is_zero, init, teardown ),
|
8003
|
+
unit_test_setup_teardown( test_normalize_match_succeeds_if_packet_is_invalid_and_wildcards_is_zero, init, teardown ),
|
8004
|
+
unit_test_setup_teardown( test_normalize_match_succeeds_if_wildcards_is_OFPFW_ALL, init, teardown ),
|
8005
|
+
unit_test_setup_teardown( test_normalize_match_succeeds_if_wildcards_is_OFPFW_IN_PORT, init, teardown ),
|
8006
|
+
unit_test_setup_teardown( test_normalize_match_succeeds_if_wildcards_is_OFPFW_DL_VLAN, init, teardown ),
|
8007
|
+
unit_test_setup_teardown( test_normalize_match_succeeds_if_wildcards_is_OFPFW_DL_SRC, init, teardown ),
|
8008
|
+
unit_test_setup_teardown( test_normalize_match_succeeds_if_wildcards_is_OFPFW_DL_DST, init, teardown ),
|
8009
|
+
unit_test_setup_teardown( test_normalize_match_succeeds_if_wildcards_is_OFPFW_DL_TYPE, init, teardown ),
|
8010
|
+
unit_test_setup_teardown( test_normalize_match_succeeds_if_wildcards_is_OFPFW_NW_PROTO, init, teardown ),
|
8011
|
+
unit_test_setup_teardown( test_normalize_match_succeeds_if_wildcards_is_OFPFW_TP_SRC, init, teardown ),
|
8012
|
+
unit_test_setup_teardown( test_normalize_match_succeeds_if_wildcards_is_OFPFW_TP_DST, init, teardown ),
|
8013
|
+
unit_test_setup_teardown( test_normalize_match_succeeds_if_wildcards_is_OFPFW_NW_SRC_ALL, init, teardown ),
|
8014
|
+
unit_test_setup_teardown( test_normalize_match_succeeds_if_wildcards_is_OFPFW_NW_DST_ALL, init, teardown ),
|
8015
|
+
unit_test_setup_teardown( test_normalize_match_succeeds_if_src_mask_len_is_24, init, teardown ),
|
8016
|
+
unit_test_setup_teardown( test_normalize_match_succeeds_if_dst_mask_len_is_24, init, teardown ),
|
8017
|
+
unit_test_setup_teardown( test_normalize_match_succeeds_if_wildcards_is_OFPFW_DL_VLAN_PCP, init, teardown ),
|
8018
|
+
unit_test_setup_teardown( test_normalize_match_succeeds_if_wildcards_is_OFPFW_NW_TOS, init, teardown ),
|
8019
|
+
unit_test_setup_teardown( test_normalize_match_fails_if_match_is_NULL, init, teardown ),
|
7323
8020
|
};
|
7324
8021
|
return run_tests( tests );
|
7325
8022
|
}
|