src/switch_manager/switch.c in trema-0.4.4 vs src/switch_manager/switch.c in trema-0.4.5
- old
+ new
@@ -384,11 +384,11 @@
switch_event_disconnected( sw_info );
}
static void
-confirm_self_dpid_is_registered( uint64_t* dpids, size_t n_dpids, void *user_data );
+confirm_self_dpid_is_registered( const list_element *switches, void *user_data );
int
switch_event_recv_featuresreply( struct switch_info *sw_info, uint64_t *dpid ) {
int ret;
@@ -457,11 +457,12 @@
init_event_forward_interface();
// Check switch_manager registration
debug( "Checking switch manager's switch list." );
sw_info->retry_count = REGISTRATION_RETRY_COUNT;
- if ( send_efi_switch_list_request( confirm_self_dpid_is_registered, sw_info ) ) {
+ set_list_switches_reply_handler( confirm_self_dpid_is_registered );
+ if ( send_list_switches_request( sw_info ) ) {
switch_set_timeout( REGISTRATION_TIMEOUT, registration_timeout, sw_info );
}
else {
error( "Failed to send switch list request to switch manager." );
return -1;
@@ -493,30 +494,31 @@
return;
}
sw_info->retry_count--;
sw_info->running_timer = false;
debug( "Checking switch manager's switch list." );
- if ( send_efi_switch_list_request( confirm_self_dpid_is_registered, sw_info ) ) {
+ set_list_switches_reply_handler( confirm_self_dpid_is_registered );
+ if ( send_list_switches_request( sw_info ) ) {
switch_set_timeout( REGISTRATION_TIMEOUT, registration_timeout, sw_info );
}
else {
error( "Failed to send switch list request to switch manager." );
switch_event_disconnected( sw_info );
}
}
static void
-confirm_self_dpid_is_registered( uint64_t* dpids, size_t n_dpids, void *user_data ) {
+confirm_self_dpid_is_registered( const list_element *switches, void *user_data ) {
struct switch_info *sw_info = user_data;
switch_unset_timeout( registration_timeout, sw_info );
debug( "Received switch manager's switch list." );
bool found = false;
- for ( size_t i = 0 ; i < n_dpids ; ++i ) {
- if ( sw_info->datapath_id == dpids[ i ] ) {
+ for ( const list_element *e = switches; e != NULL; e = e->next ) {
+ if ( sw_info->datapath_id == *( uint64_t * ) e->data ) {
// self dpid registered
debug( "Self dpid found" );
found = true;
break;
}
@@ -579,17 +581,23 @@
stop_switch( sw_info );
}
static void
-confirm_self_dpid_is_unregistered( uint64_t* dpids, size_t n_dpids, void *user_data );
+confirm_self_dpid_is_unregistered( const list_element *switches, void *user_data );
int
switch_event_disconnected( struct switch_info *sw_info ) {
int old_state = sw_info->state;
+ if ( sw_info->state == SWITCH_STATE_DISCONNECTED ||
+ sw_info->state == SWITCH_STATE_CONNECTION_FAILED ) {
+ debug( "already disconnected" );
+ return -1;
+ }
+
if ( sw_info->state == SWITCH_STATE_COMPLETED ) {
sw_info->state = SWITCH_STATE_DISCONNECTED;
}
else {
sw_info->state = SWITCH_STATE_CONNECTION_FAILED;
@@ -633,11 +641,12 @@
service_send_to_application( &switch_manager_only_list, state, &sw_info->datapath_id, NULL );
// Check switch_manager registration
debug( "Checking switch manager's switch list." );
sw_info->retry_count = UNREGISTRATION_RETRY_COUNT;
- if ( send_efi_switch_list_request( confirm_self_dpid_is_unregistered, sw_info ) ) {
+ set_list_switches_reply_handler( confirm_self_dpid_is_unregistered );
+ if ( send_list_switches_request( sw_info ) ) {
switch_set_timeout( UNREGISTRATION_TIMEOUT, unregistration_timeout, sw_info );
}
else {
error( "Failed to send switch list request to switch manager." );
stop_switch( sw_info );
@@ -656,29 +665,30 @@
return;
}
sw_info->retry_count--;
sw_info->running_timer = false;
debug( "Checking switch manager's switch list." );
- if ( send_efi_switch_list_request( confirm_self_dpid_is_unregistered, sw_info ) ) {
+ set_list_switches_reply_handler( confirm_self_dpid_is_unregistered );
+ if ( send_list_switches_request( sw_info ) ) {
switch_set_timeout( UNREGISTRATION_TIMEOUT, unregistration_timeout, sw_info );
}
else {
error( "Failed to send switch list request to switch manager." );
stop_switch( sw_info );
}
}
static void
-confirm_self_dpid_is_unregistered( uint64_t* dpids, size_t n_dpids, void *user_data ) {
+confirm_self_dpid_is_unregistered( const list_element *switches, void *user_data ) {
struct switch_info *sw_info = user_data;
switch_unset_timeout( unregistration_timeout, sw_info );
debug( "Received switch manager's switch list." );
bool found = false;
- for ( size_t i = 0 ; i < n_dpids ; ++i ) {
- if ( sw_info->datapath_id == dpids[ i ] ) {
+ for ( const list_element *e = switches; e != NULL; e = e->next ) {
+ if ( sw_info->datapath_id == *( uint64_t * ) e->data ) {
// self dpid registered
debug( "Self dpid found" );
found = true;
break;
}