trema 0.3.19 → 0.3.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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