trema 0.3.19 → 0.3.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +7 -7
  3. data/README.md +3 -3
  4. data/Rakefile +13 -4
  5. data/cruise.rb +1 -1
  6. data/features/examples/switch_monitor.feature +2 -0
  7. data/features/switch_event/C-add_forward_entry.feature +4 -24
  8. data/features/switch_event/C-delete_forward_entry.feature +3 -18
  9. data/features/switch_event/C-dump_forward_entries.feature +2 -12
  10. data/features/switch_event/C-set_forward_entries.feature +2 -12
  11. data/features/switch_event/add_forward_entry.feature +44 -29
  12. data/features/switch_event/delete_forward_entry.feature +31 -16
  13. data/features/switch_event/dump_forward_entries.feature +23 -13
  14. data/features/switch_event/set_forward_entries.feature +17 -7
  15. data/features/trema_commands/dump_flows.feature +1 -0
  16. data/features/trema_commands/reset_stats.feature +1 -0
  17. data/features/trema_commands/show_stats.feature +1 -0
  18. data/ruby/trema/features-reply.c +9 -6
  19. data/ruby/trema/monkey-patch/integer/validators.rb +36 -0
  20. data/ruby/trema/monkey-patch/integer.rb +2 -0
  21. data/ruby/trema/packet-in.c +140 -0
  22. data/ruby/trema/packet-queue.rb +130 -126
  23. data/ruby/trema/port.c +11 -0
  24. data/ruby/trema/queue-get-config-reply.c +8 -5
  25. data/ruby/trema/set-ip-tos.rb +3 -3
  26. data/ruby/trema/vendor-action.rb +5 -1
  27. data/ruby/trema/version.rb +1 -1
  28. data/spec/trema/echo-reply_spec.rb +8 -8
  29. data/spec/trema/echo-request_spec.rb +1 -1
  30. data/spec/trema/hello_spec.rb +6 -6
  31. data/spec/trema/packet-in_spec.rb +131 -0
  32. data/spec/trema/queue-get-config-reply_spec.rb +1 -1
  33. data/spec/trema/set-ip-tos_spec.rb +5 -0
  34. data/spec/trema/vendor-action_spec.rb +5 -0
  35. data/src/examples/switch_event_config/.gitignore +0 -1
  36. data/src/examples/switch_event_config/network.conf +2 -0
  37. data/src/lib/arp.h +3 -1
  38. data/src/lib/ether.h +1 -0
  39. data/src/lib/event_forward_interface.c +9 -4
  40. data/src/lib/openflow_message.c +6 -0
  41. data/src/lib/openflow_message.h +1 -0
  42. data/src/lib/packet_info.c +23 -0
  43. data/src/lib/packet_info.h +5 -0
  44. data/src/lib/packet_parser.c +8 -3
  45. data/src/lib/utility.c +13 -13
  46. data/src/lib/utility.h +15 -0
  47. data/src/switch_manager/event_forward_entry_manipulation.c +1 -1
  48. data/src/switch_manager/secure_channel_listener.c +3 -6
  49. data/src/switch_manager/switch.c +68 -9
  50. data/trema.gemspec +4 -4
  51. data/unittests/lib/event_forward_interface_test.c +30 -0
  52. data/unittests/lib/openflow_message_test.c +19 -0
  53. data/unittests/lib/packet_info_test.c +16 -0
  54. data/unittests/lib/packet_parser_test.c +37 -0
  55. data/unittests/lib/test_packets/rarp_req.cap +0 -0
  56. metadata +9 -6
data/src/lib/utility.c CHANGED
@@ -310,7 +310,7 @@ phy_port_to_string( const struct ofp_phy_port *phy_port, char *str, size_t size
310
310
  }
311
311
 
312
312
 
313
- static bool
313
+ bool
314
314
  action_output_to_string( const struct ofp_action_output *action, char *str, size_t size ) {
315
315
  assert( action != NULL );
316
316
  assert( str != NULL );
@@ -324,7 +324,7 @@ action_output_to_string( const struct ofp_action_output *action, char *str, size
324
324
  }
325
325
 
326
326
 
327
- static bool
327
+ bool
328
328
  action_set_vlan_vid_to_string( const struct ofp_action_vlan_vid *action, char *str, size_t size ) {
329
329
  assert( action != NULL );
330
330
  assert( str != NULL );
@@ -338,7 +338,7 @@ action_set_vlan_vid_to_string( const struct ofp_action_vlan_vid *action, char *s
338
338
  }
339
339
 
340
340
 
341
- static bool
341
+ bool
342
342
  action_set_vlan_pcp_to_string( const struct ofp_action_vlan_pcp *action, char *str, size_t size ) {
343
343
  assert( action != NULL );
344
344
  assert( str != NULL );
@@ -352,7 +352,7 @@ action_set_vlan_pcp_to_string( const struct ofp_action_vlan_pcp *action, char *s
352
352
  }
353
353
 
354
354
 
355
- static bool
355
+ bool
356
356
  action_strip_vlan_to_string( const struct ofp_action_header *action, char *str, size_t size ) {
357
357
  UNUSED( action );
358
358
  assert( action != NULL );
@@ -384,13 +384,13 @@ action_dl_addr_to_string( const struct ofp_action_dl_addr *action, char *str, si
384
384
  }
385
385
 
386
386
 
387
- static bool
387
+ bool
388
388
  action_set_dl_src_to_string( const struct ofp_action_dl_addr *action, char *str, size_t size ) {
389
389
  return action_dl_addr_to_string( action, str, size, OFPAT_SET_DL_SRC );
390
390
  }
391
391
 
392
392
 
393
- static bool
393
+ bool
394
394
  action_set_dl_dst_to_string( const struct ofp_action_dl_addr *action, char *str, size_t size ) {
395
395
  return action_dl_addr_to_string( action, str, size, OFPAT_SET_DL_DST );
396
396
  }
@@ -416,19 +416,19 @@ action_nw_addr_to_string( const struct ofp_action_nw_addr *action, char *str, si
416
416
  }
417
417
 
418
418
 
419
- static bool
419
+ bool
420
420
  action_set_nw_src_to_string( const struct ofp_action_nw_addr *action, char *str, size_t size ) {
421
421
  return action_nw_addr_to_string( action, str, size, OFPAT_SET_NW_SRC );
422
422
  }
423
423
 
424
424
 
425
- static bool
425
+ bool
426
426
  action_set_nw_dst_to_string( const struct ofp_action_nw_addr *action, char *str, size_t size ) {
427
427
  return action_nw_addr_to_string( action, str, size, OFPAT_SET_NW_DST );
428
428
  }
429
429
 
430
430
 
431
- static bool
431
+ bool
432
432
  action_set_nw_tos_to_string( const struct ofp_action_nw_tos *action, char *str, size_t size ) {
433
433
  assert( action != NULL );
434
434
  assert( str != NULL );
@@ -457,19 +457,19 @@ action_tp_port_to_string( const struct ofp_action_tp_port *action, char *str, si
457
457
  }
458
458
 
459
459
 
460
- static bool
460
+ bool
461
461
  action_set_tp_src_to_string( const struct ofp_action_tp_port *action, char *str, size_t size ) {
462
462
  return action_tp_port_to_string( action, str, size, OFPAT_SET_TP_SRC );
463
463
  }
464
464
 
465
465
 
466
- static bool
466
+ bool
467
467
  action_set_tp_dst_to_string( const struct ofp_action_tp_port *action, char *str, size_t size ) {
468
468
  return action_tp_port_to_string( action, str, size, OFPAT_SET_TP_DST );
469
469
  }
470
470
 
471
471
 
472
- static bool
472
+ bool
473
473
  action_enqueue_to_string( const struct ofp_action_enqueue *action, char *str, size_t size ) {
474
474
  assert( action != NULL );
475
475
  assert( str != NULL );
@@ -483,7 +483,7 @@ action_enqueue_to_string( const struct ofp_action_enqueue *action, char *str, si
483
483
  }
484
484
 
485
485
 
486
- static bool
486
+ bool
487
487
  action_vendor_to_string( const struct ofp_action_vendor_header *action, char *str, size_t size ) {
488
488
  assert( action != NULL );
489
489
  assert( str != NULL );
data/src/lib/utility.h CHANGED
@@ -50,6 +50,20 @@ bool string_to_datapath_id( const char *str, uint64_t *datapath_id );
50
50
  bool match_to_string( const struct ofp_match *match, char *str, size_t size );
51
51
  bool wildcards_to_string( uint32_t wildcards, char *str, size_t size );
52
52
  bool phy_port_to_string( const struct ofp_phy_port *phy_port, char *str, size_t size );
53
+
54
+ bool action_output_to_string( const struct ofp_action_output *action, char *str, size_t size );
55
+ bool action_set_vlan_vid_to_string( const struct ofp_action_vlan_vid *action, char *str, size_t size );
56
+ bool action_set_vlan_pcp_to_string( const struct ofp_action_vlan_pcp *action, char *str, size_t size );
57
+ bool action_strip_vlan_to_string( const struct ofp_action_header *action, char *str, size_t size );
58
+ bool action_set_dl_src_to_string( const struct ofp_action_dl_addr *action, char *str, size_t size );
59
+ bool action_set_dl_dst_to_string( const struct ofp_action_dl_addr *action, char *str, size_t size );
60
+ bool action_set_nw_src_to_string( const struct ofp_action_nw_addr *action, char *str, size_t size );
61
+ bool action_set_nw_dst_to_string( const struct ofp_action_nw_addr *action, char *str, size_t size );
62
+ bool action_set_nw_tos_to_string( const struct ofp_action_nw_tos *action, char *str, size_t size );
63
+ bool action_set_tp_src_to_string( const struct ofp_action_tp_port *action, char *str, size_t size );
64
+ bool action_set_tp_dst_to_string( const struct ofp_action_tp_port *action, char *str, size_t size );
65
+ bool action_enqueue_to_string( const struct ofp_action_enqueue *action, char *str, size_t size );
66
+ bool action_vendor_to_string( const struct ofp_action_vendor_header *action, char *str, size_t size );
53
67
  bool actions_to_string( const struct ofp_action_header *actions, uint16_t actions_length, char *str, size_t str_length );
54
68
 
55
69
  uint16_t get_checksum( uint16_t *pos, uint32_t size );
@@ -58,6 +72,7 @@ void xfree_data( void *data, void *user_data );
58
72
 
59
73
  bool string_equal( void *data, void *user_data );
60
74
 
75
+
61
76
  #endif // UTILITY_H
62
77
 
63
78
 
@@ -36,7 +36,7 @@ management_event_forward_entry_add( list_element **service_list,
36
36
  const char *match = find_list_custom( *service_list, string_equal, service_name );
37
37
  if ( match == NULL ) {
38
38
  info( "Adding '%s' to event filter.", service_name );
39
- insert_in_front( service_list, service_name );
39
+ append_to_tail( service_list, service_name );
40
40
  }
41
41
  else {
42
42
  // already there
@@ -34,7 +34,6 @@
34
34
 
35
35
 
36
36
  const int LISTEN_SOCK_MAX = 128;
37
- const int SWITCH_MANAGER_DEFAULT_ARGC = 10;
38
37
 
39
38
  #ifdef UNIT_TESTING
40
39
  #define static
@@ -166,7 +165,8 @@ secure_channel_listen_start( struct listener_info *listener_info ) {
166
165
 
167
166
  static char **
168
167
  make_switch_daemon_args( struct listener_info *listener_info, struct sockaddr_in *addr, int accept_fd ) {
169
- const int argc = SWITCH_MANAGER_DEFAULT_ARGC
168
+ const int SWITCH_DAEMON_DEFAULT_ARGC = 4;
169
+ const int argc = SWITCH_DAEMON_DEFAULT_ARGC
170
170
  + listener_info->switch_daemon_argc
171
171
  + ( int ) list_length_of( listener_info->vendor_service_name_list )
172
172
  + ( int ) list_length_of( listener_info->packetin_service_name_list )
@@ -176,7 +176,7 @@ make_switch_daemon_args( struct listener_info *listener_info, struct sockaddr_in
176
176
  char **argv = xcalloc( ( size_t ) argc, sizeof( char * ) );
177
177
  char *command_name = xasprintf( "%s%s:%u", SWITCH_MANAGER_COMMAND_PREFIX,
178
178
  inet_ntoa( addr->sin_addr ),
179
- ntohs( addr->sin_port ) );
179
+ ntohs( addr->sin_port ) );
180
180
  char *service_name = xasprintf( "%s%s%s:%u", SWITCH_MANAGER_NAME_OPTION,
181
181
  SWITCH_MANAGER_PREFIX,
182
182
  inet_ntoa( addr->sin_addr ),
@@ -184,15 +184,12 @@ make_switch_daemon_args( struct listener_info *listener_info, struct sockaddr_in
184
184
  char *socket_opt = xasprintf( "%s%d", SWITCH_MANAGER_SOCKET_OPTION,
185
185
  accept_fd );
186
186
  char *daemonize_opt = xstrdup( SWITCH_MANAGER_DAEMONIZE_OPTION );
187
- char *notify_opt = xasprintf( "%s%s", SWITCH_MANAGER_STATE_PREFIX,
188
- get_trema_name() );
189
187
 
190
188
  int i = 0;
191
189
  argv[ i++ ] = command_name;
192
190
  argv[ i++ ] = service_name;
193
191
  argv[ i++ ] = socket_opt;
194
192
  argv[ i++ ] = daemonize_opt;
195
- argv[ i++ ] = notify_opt;
196
193
  int j;
197
194
  for ( j = 0; j < listener_info->switch_daemon_argc; i++, j++ ) {
198
195
  argv[ i ] = xstrdup( listener_info->switch_daemon_argv[ j ] );
@@ -63,6 +63,9 @@ static const time_t WARNING_ECHO_RTT = 500; // msec. The value must is less than
63
63
 
64
64
  static bool age_cookie_table_enabled = false;
65
65
 
66
+ #define SWITCH_MANAGER "switch_manager"
67
+
68
+
66
69
  typedef struct {
67
70
  uint64_t datapath_id;
68
71
  uint32_t sec;
@@ -364,6 +367,10 @@ echo_request_interval( void *user_data ) {
364
367
  }
365
368
 
366
369
 
370
+ static void
371
+ confirm_self_dpid_is_registerd( uint64_t* dpids, size_t n_dpids, void *user_data );
372
+
373
+
367
374
  int
368
375
  switch_event_recv_featuresreply( struct switch_info *sw_info, uint64_t *dpid ) {
369
376
  int ret;
@@ -407,21 +414,36 @@ switch_event_recv_featuresreply( struct switch_info *sw_info, uint64_t *dpid ) {
407
414
  }
408
415
  set_trema_name( new_service_name );
409
416
 
410
- // notify state and datapath_id
411
- service_send_state( sw_info, &sw_info->datapath_id, MESSENGER_OPENFLOW_READY );
412
- debug( "send ready state" );
413
-
417
+ // reset to default config
414
418
  ret = ofpmsg_send_setconfig( sw_info );
415
419
  if ( ret < 0 ) {
420
+ error( "Failed to send setconfig." );
416
421
  return ret;
417
422
  }
418
423
  if ( switch_info.flow_cleanup ) {
424
+ debug( "Deleting all flows." );
419
425
  ret = ofpmsg_send_delete_all_flows( sw_info );
420
426
  if ( ret < 0 ) {
427
+ error( "Failed to send delete all flows." );
421
428
  return ret;
422
429
  }
423
430
  }
424
- add_periodic_event_callback( ECHO_REQUEST_INTERVAL, echo_request_interval, sw_info );
431
+
432
+ // switch_ready to switch_manager
433
+ debug( "Notify switch_ready to switch manager." );
434
+ char switch_manager[] = SWITCH_MANAGER;
435
+ list_element switch_manager_only_list;
436
+ switch_manager_only_list.next = NULL;
437
+ switch_manager_only_list.data = switch_manager;
438
+ service_send_to_application( &switch_manager_only_list, MESSENGER_OPENFLOW_READY, &sw_info->datapath_id, NULL );
439
+
440
+ init_event_forward_interface();
441
+ // Check switch_manager registration
442
+ debug( "Checking switch manager's switch list." );
443
+ if ( !send_efi_switch_list_request( confirm_self_dpid_is_registerd, sw_info ) ) {
444
+ error( "Failed to send switch list request to switch manager." );
445
+ return -1;
446
+ }
425
447
  break;
426
448
 
427
449
  case SWITCH_STATE_COMPLETED:
@@ -439,6 +461,40 @@ switch_event_recv_featuresreply( struct switch_info *sw_info, uint64_t *dpid ) {
439
461
  }
440
462
 
441
463
 
464
+ static void
465
+ notify_state_to_controllers( struct switch_info *sw_info );
466
+
467
+
468
+ static void
469
+ confirm_self_dpid_is_registerd( uint64_t* dpids, size_t n_dpids, void *user_data ) {
470
+ struct switch_info *sw_info = user_data;
471
+
472
+ debug( "Received switch manager's switch list." );
473
+ for ( size_t i = 0 ; i < n_dpids ; ++i ) {
474
+ if ( sw_info->datapath_id == dpids[ i ] ) {
475
+ // self dpid registered
476
+ debug( "Self dpid found" );
477
+ return notify_state_to_controllers( sw_info );
478
+ }
479
+ }
480
+
481
+ debug( "Self dpid not found. Retrying..." );
482
+ if ( !send_efi_switch_list_request( confirm_self_dpid_is_registerd, sw_info ) ){
483
+ error( "Failed to send switch list request to switch manager on retry." );
484
+ }
485
+ }
486
+
487
+
488
+ static void
489
+ notify_state_to_controllers( struct switch_info *sw_info ) {
490
+ // notify state and datapath_id to controllers
491
+ service_send_state( sw_info, &sw_info->datapath_id, MESSENGER_OPENFLOW_READY );
492
+ debug( "send ready state" );
493
+
494
+ add_periodic_event_callback( ECHO_REQUEST_INTERVAL, echo_request_interval, sw_info );
495
+ }
496
+
497
+
442
498
  int
443
499
  switch_event_disconnected( struct switch_info *sw_info ) {
444
500
  int old_state = sw_info->state;
@@ -701,19 +757,19 @@ main( int argc, char *argv[] ) {
701
757
  for ( i = optind; i < argc; i++ ) {
702
758
  if ( strncmp( argv[ i ], VENDOR_PREFIX, strlen( VENDOR_PREFIX ) ) == 0 ) {
703
759
  service_name = xstrdup( argv[ i ] + strlen( VENDOR_PREFIX ) );
704
- insert_in_front( &switch_info.vendor_service_name_list, service_name );
760
+ append_to_tail( &switch_info.vendor_service_name_list, service_name );
705
761
  }
706
762
  else if ( strncmp( argv[ i ], PACKET_IN_PREFIX, strlen( PACKET_IN_PREFIX ) ) == 0 ) {
707
763
  service_name = xstrdup( argv[ i ] + strlen( PACKET_IN_PREFIX ) );
708
- insert_in_front( &switch_info.packetin_service_name_list, service_name );
764
+ append_to_tail( &switch_info.packetin_service_name_list, service_name );
709
765
  }
710
766
  else if ( strncmp( argv[ i ], PORTSTATUS_PREFIX, strlen( PORTSTATUS_PREFIX ) ) == 0 ) {
711
767
  service_name = xstrdup( argv[ i ] + strlen( PORTSTATUS_PREFIX ) );
712
- insert_in_front( &switch_info.portstatus_service_name_list, service_name );
768
+ append_to_tail( &switch_info.portstatus_service_name_list, service_name );
713
769
  }
714
770
  else if ( strncmp( argv[ i ], STATE_PREFIX, strlen( STATE_PREFIX ) ) == 0 ) {
715
771
  service_name = xstrdup( argv[ i ] + strlen( STATE_PREFIX ) );
716
- insert_in_front( &switch_info.state_service_name_list, service_name );
772
+ append_to_tail( &switch_info.state_service_name_list, service_name );
717
773
  }
718
774
  }
719
775
 
@@ -760,6 +816,9 @@ main( int argc, char *argv[] ) {
760
816
 
761
817
  start_trema();
762
818
 
819
+ // Note: init_event_forward_interface will be called on feature_reply.
820
+ finalize_event_forward_interface();
821
+
763
822
  finalize_xid_table();
764
823
  if ( switch_info.cookie_translation ) {
765
824
  finalize_cookie_table();
data/trema.gemspec CHANGED
@@ -27,10 +27,10 @@ Gem::Specification.new do | gem |
27
27
  gem.test_files = `git ls-files -- {spec,features}/*`.split( "\n" )
28
28
 
29
29
  gem.add_dependency "bundler"
30
- gem.add_dependency "gli", "~> 2.5.5"
31
- gem.add_dependency "paper-house", "~> 0.1.13"
32
- gem.add_dependency "rake", "~> 10.0.3"
33
- gem.add_dependency "rdoc", "~> 4.0.0"
30
+ gem.add_dependency "gli", "~> 2.6.1"
31
+ gem.add_dependency "paper-house", "~> 0.1.14"
32
+ gem.add_dependency "rake", "~> 10.1.0"
33
+ gem.add_dependency "rdoc", "~> 4.0.1"
34
34
  end
35
35
 
36
36
 
@@ -1483,6 +1483,34 @@ test__dispatch_to_all_switch_succeeds() {
1483
1483
  }
1484
1484
 
1485
1485
 
1486
+ static void
1487
+ test__dispatch_to_all_switch_with_no_switch_succeeds() {
1488
+ init_timer();
1489
+ uint64_t dpids[] = { 0x12345678 };
1490
+ const size_t n_dpids = 0;
1491
+
1492
+ void *user_data = ( void * ) 0xABCDEF;
1493
+
1494
+ struct event_forward_operation_to_all_request_param *param = xcalloc( 1, sizeof( struct event_forward_operation_to_all_request_param ) );
1495
+ param->add = true;
1496
+ param->type = EVENT_FORWARD_TYPE_PACKET_IN;
1497
+ param->service_name = xstrdup( "alpha" );
1498
+ param->callback = mock_event_forward_entry_to_all_callback;
1499
+ param->user_data = user_data;
1500
+
1501
+ expect_value( mock_event_forward_entry_to_all_callback, result, EFI_OPERATION_SUCCEEDED );
1502
+ expect_value( mock_event_forward_entry_to_all_callback, user_data, user_data );
1503
+
1504
+ _dispatch_to_all_switch( dpids, n_dpids, param );
1505
+
1506
+ // free all_sw_tx, param
1507
+ _cleanup_tx_table();
1508
+
1509
+ finalize_timer();
1510
+ }
1511
+
1512
+
1513
+
1486
1514
  static void
1487
1515
  test__switch_response_handler_succeeds_when_last_one_standing() {
1488
1516
 
@@ -1628,6 +1656,8 @@ main() {
1628
1656
  setup_init_efi, teardown_finl_efi ),
1629
1657
  unit_test_setup_teardown( test__dispatch_to_all_switch_succeeds,
1630
1658
  setup_init_efi, teardown_finl_efi ),
1659
+ unit_test_setup_teardown( test__dispatch_to_all_switch_with_no_switch_succeeds,
1660
+ setup_init_efi, teardown_finl_efi ),
1631
1661
  unit_test_setup_teardown( test__switch_response_handler_succeeds_when_last_one_standing,
1632
1662
  setup_init_efi, teardown_finl_efi ),
1633
1663
  unit_test_setup_teardown( test__switch_response_timeout_then_fails,
@@ -4554,6 +4554,24 @@ test_validate_action_vendor_fails_with_too_short_ofp_action_vendor_header() {
4554
4554
  }
4555
4555
 
4556
4556
 
4557
+ static void
4558
+ test_validate_action_vendor_fails_with_invalid_length_ofp_action_vendor_header() {
4559
+ buffer *body = create_dummy_data( LONG_DATA_LENGTH );
4560
+ openflow_actions *actions = create_actions();
4561
+ append_action_vendor( actions, VENDOR_ID, body );
4562
+ struct ofp_action_vendor_header *invalid_length_action_vendor_header = xmalloc( sizeof( struct ofp_action_vendor_header ) + body->length );
4563
+ hton_action_vendor( invalid_length_action_vendor_header, ( struct ofp_action_vendor_header * ) ( actions->list->data ) );
4564
+ uint16_t invalid_length_action_vendor = ( uint16_t ) ( LONG_DATA_LENGTH - 1 );
4565
+ invalid_length_action_vendor_header->len = htons( invalid_length_action_vendor );
4566
+
4567
+ assert_int_equal( validate_action_vendor( invalid_length_action_vendor_header ), ERROR_INVALID_LENGTH_ACTION_VENDOR );
4568
+
4569
+ free_buffer( body );
4570
+ delete_actions( actions );
4571
+ xfree( invalid_length_action_vendor_header );
4572
+ }
4573
+
4574
+
4557
4575
  /********************************************************************************
4558
4576
  * validate_openflow_message() tests.
4559
4577
  ********************************************************************************/
@@ -7890,6 +7908,7 @@ main() {
7890
7908
  unit_test_setup_teardown( test_validate_action_vendor, init, teardown ),
7891
7909
  unit_test_setup_teardown( test_validate_action_vendor_fails_with_invalid_action_type, init, teardown ),
7892
7910
  unit_test_setup_teardown( test_validate_action_vendor_fails_with_too_short_ofp_action_vendor_header, init, teardown ),
7911
+ unit_test_setup_teardown( test_validate_action_vendor_fails_with_invalid_length_ofp_action_vendor_header, init, teardown ),
7893
7912
 
7894
7913
  unit_test_setup_teardown( test_validate_openflow_message_succeeds_with_valid_OFPT_HELLO_message, init, teardown ),
7895
7914
  unit_test_setup_teardown( test_validate_openflow_message_succeeds_with_valid_OFPT_ERROR_message, init, teardown ),
@@ -261,6 +261,21 @@ test_packet_type_arp() {
261
261
  }
262
262
 
263
263
 
264
+ static void
265
+ test_packet_type_rarp() {
266
+ buffer *buf = alloc_buffer_with_length( sizeof( struct iphdr ) );
267
+ calloc_packet_info( buf );
268
+
269
+ assert_false( packet_type_rarp( buf ) );
270
+
271
+ packet_info *packet_info = buf->user_data;
272
+ packet_info->format |= NW_RARP;
273
+ assert_true( packet_type_rarp( buf ) );
274
+
275
+ free_buffer( buf );
276
+ }
277
+
278
+
264
279
  static void
265
280
  test_packet_type_ipv4() {
266
281
  buffer *buf = alloc_buffer_with_length( sizeof( struct iphdr ) );
@@ -513,6 +528,7 @@ main() {
513
528
  unit_test( test_packet_type_ether ),
514
529
 
515
530
  unit_test( test_packet_type_arp ),
531
+ unit_test( test_packet_type_rarp ),
516
532
  unit_test( test_packet_type_ipv4 ),
517
533
  unit_test( test_packet_type_icmpv4 ),
518
534
 
@@ -147,6 +147,42 @@ test_parse_packet_arp_request_succeeds() {
147
147
  }
148
148
 
149
149
 
150
+ static void
151
+ test_parse_packet_rarp_request_succeeds() {
152
+ const char filename[] = "./unittests/lib/test_packets/rarp_req.cap";
153
+ buffer *buffer = store_packet_to_buffer( filename );
154
+
155
+ assert_true( parse_packet( buffer ) );
156
+ packet_info *packet_info = buffer->user_data;
157
+
158
+ assert_int_equal( packet_info->format, ETH_RARP );
159
+
160
+ u_char macda[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
161
+ u_char macsa[] = { 0x0a, 0x1d, 0x79, 0x67, 0x55, 0xad };
162
+ assert_memory_equal( packet_info->eth_macda, macda, ETH_ADDRLEN );
163
+ assert_memory_equal( packet_info->eth_macsa, macsa, ETH_ADDRLEN );
164
+ assert_int_equal( packet_info->eth_type, ETH_ETHTYPE_RARP );
165
+
166
+ assert_int_equal( packet_info->l2_payload_length, 28 );
167
+
168
+ assert_int_equal( packet_info->arp_ar_hrd, 0x0001 );
169
+ assert_int_equal( packet_info->arp_ar_pro, 0x0800 );
170
+ assert_int_equal( packet_info->arp_ar_hln, 6 );
171
+ assert_int_equal( packet_info->arp_ar_pln, 4 );
172
+ assert_int_equal( packet_info->arp_ar_op, 3 );
173
+ assert_int_equal( packet_info->arp_spa, 0xc0a80003 );
174
+ assert_memory_equal( packet_info->arp_sha, macsa, ETH_ADDRLEN );
175
+ assert_int_equal( packet_info->arp_tpa, 0 );
176
+ u_char whois[] = { 0x22, 0x4f, 0x0d, 0x93, 0xae, 0xf0 };
177
+ assert_memory_equal( packet_info->arp_tha, whois, ETH_ADDRLEN );
178
+
179
+ assert_true( packet_type_rarp_request( buffer ) );
180
+ assert_false( packet_type_rarp_reply( buffer ) );
181
+
182
+ free_buffer( buffer );
183
+ }
184
+
185
+
150
186
  static void
151
187
  test_parse_packet_ipv6_succeeds() {
152
188
  const char filename[] = "./unittests/lib/test_packets/icmp6_echo_req.cap";
@@ -713,6 +749,7 @@ main() {
713
749
  unit_test( test_parse_packet_snap_succeeds ),
714
750
 
715
751
  unit_test( test_parse_packet_arp_request_succeeds ),
752
+ unit_test( test_parse_packet_rarp_request_succeeds ),
716
753
 
717
754
  unit_test( test_parse_packet_ipv6_succeeds ),
718
755
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trema
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.19
4
+ version: 0.3.20
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yasuhito Takamiya
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: .
10
10
  cert_chain: []
11
11
 
12
- date: 2013-03-29 00:00:00 Z
12
+ date: 2013-06-27 00:00:00 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -29,7 +29,7 @@ dependencies:
29
29
  requirements:
30
30
  - - ~>
31
31
  - !ruby/object:Gem::Version
32
- version: 2.5.5
32
+ version: 2.6.1
33
33
  prerelease: false
34
34
  version_requirements: *id002
35
35
  - !ruby/object:Gem::Dependency
@@ -39,7 +39,7 @@ dependencies:
39
39
  requirements:
40
40
  - - ~>
41
41
  - !ruby/object:Gem::Version
42
- version: 0.1.13
42
+ version: 0.1.14
43
43
  prerelease: false
44
44
  version_requirements: *id003
45
45
  - !ruby/object:Gem::Dependency
@@ -49,7 +49,7 @@ dependencies:
49
49
  requirements:
50
50
  - - ~>
51
51
  - !ruby/object:Gem::Version
52
- version: 10.0.3
52
+ version: 10.1.0
53
53
  prerelease: false
54
54
  version_requirements: *id004
55
55
  - !ruby/object:Gem::Dependency
@@ -59,7 +59,7 @@ dependencies:
59
59
  requirements:
60
60
  - - ~>
61
61
  - !ruby/object:Gem::Version
62
- version: 4.0.0
62
+ version: 4.0.1
63
63
  prerelease: false
64
64
  version_requirements: *id005
65
65
  description: Trema is a full-stack, easy-to-use framework for developing OpenFlow controllers in Ruby and C.
@@ -234,6 +234,7 @@ files:
234
234
  - ruby/trema/monkey-patch/integer.rb
235
235
  - ruby/trema/monkey-patch/integer/base-conversions.rb
236
236
  - ruby/trema/monkey-patch/integer/ranges.rb
237
+ - ruby/trema/monkey-patch/integer/validators.rb
237
238
  - ruby/trema/monkey-patch/module.rb
238
239
  - ruby/trema/monkey-patch/module/class-method.rb
239
240
  - ruby/trema/monkey-patch/module/deprecation.rb
@@ -472,6 +473,7 @@ files:
472
473
  - src/examples/switch_event_config/add_forward_entry.c
473
474
  - src/examples/switch_event_config/delete_forward_entry.c
474
475
  - src/examples/switch_event_config/dump_forward_entries.c
476
+ - src/examples/switch_event_config/network.conf
475
477
  - src/examples/switch_event_config/set_forward_entries.c
476
478
  - src/examples/switch_info/README
477
479
  - src/examples/switch_info/switch-info.rb
@@ -656,6 +658,7 @@ files:
656
658
  - unittests/lib/test_packets/ipx.cap
657
659
  - unittests/lib/test_packets/lldp.cap
658
660
  - unittests/lib/test_packets/lldp_over_ip.cap
661
+ - unittests/lib/test_packets/rarp_req.cap
659
662
  - unittests/lib/test_packets/tcp.cap
660
663
  - unittests/lib/test_packets/tcp_syn.cap
661
664
  - unittests/lib/test_packets/udp.cap