sai_status_t sai_api_uninitialize(void) { MUTEX(); SWSS_LOG_ENTER(); if (!g_api_initialized) { SWSS_LOG_ERROR("api not initialized"); return SAI_STATUS_FAILURE; } clear_local_state(); g_unittestChannelRun = false; //// notify thread that it should end g_unittestChannelThreadEvent.notify(); g_unittestChannelThread->join(); g_fdbAgingThreadRun = false; g_fdbAgingThread->join(); g_api_initialized = false; return SAI_STATUS_SUCCESS; }
sai_status_t sai_api_uninitialize(void) { MUTEX(); SWSS_LOG_ENTER(); if (!g_api_initialized) { SWSS_LOG_ERROR("api not initialized"); return SAI_STATUS_FAILURE; } clear_local_state(); g_api_initialized = false; return SAI_STATUS_SUCCESS; }
sai_status_t sai_api_initialize( _In_ uint64_t flags, _In_ const service_method_table_t *service_method_table) { MUTEX(); SWSS_LOG_ENTER(); if (g_api_initialized) { SWSS_LOG_ERROR("api already initialized"); return SAI_STATUS_FAILURE; } if ((service_method_table == NULL) || (service_method_table->profile_get_next_value == NULL) || (service_method_table->profile_get_value == NULL)) { SWSS_LOG_ERROR("invalid service_method_table handle passed to SAI API initialize"); return SAI_STATUS_INVALID_PARAMETER; } memcpy(&g_service_method_table, service_method_table, sizeof(g_service_method_table)); // TODO maybe this query should be done right before switch create const char *type = service_method_table->profile_get_value(0, SAI_KEY_VS_SWITCH_TYPE); if (type == NULL) { SWSS_LOG_ERROR("failed to obtain service method table value: %s", SAI_KEY_VS_SWITCH_TYPE); return SAI_STATUS_FAILURE; } std::string strType = type; if (strType == SAI_VALUE_VS_SWITCH_TYPE_BCM56850) { g_vs_switch_type = SAI_VS_SWITCH_TYPE_BCM56850; } else if (strType == SAI_VALUE_VS_SWITCH_TYPE_MLNX2700) { g_vs_switch_type = SAI_VS_SWITCH_TYPE_MLNX2700; } else { SWSS_LOG_ERROR("unknown switch type: '%s'", type); return SAI_STATUS_FAILURE; } if (flags != 0) { SWSS_LOG_ERROR("invalid flags passed to SAI API initialize"); return SAI_STATUS_INVALID_PARAMETER; } clear_local_state(); g_api_initialized = true; return SAI_STATUS_SUCCESS; }
sai_status_t sai_api_initialize( _In_ uint64_t flags, _In_ const sai_service_method_table_t *service_method_table) { MUTEX(); SWSS_LOG_ENTER(); if (g_api_initialized) { SWSS_LOG_ERROR("api already initialized"); return SAI_STATUS_FAILURE; } if ((service_method_table == NULL) || (service_method_table->profile_get_next_value == NULL) || (service_method_table->profile_get_value == NULL)) { SWSS_LOG_ERROR("invalid service_method_table handle passed to SAI API initialize"); return SAI_STATUS_INVALID_PARAMETER; } memcpy(&g_service_method_table, service_method_table, sizeof(g_service_method_table)); // TODO maybe this query should be done right before switch create const char *type = service_method_table->profile_get_value(0, SAI_KEY_VS_SWITCH_TYPE); if (type == NULL) { SWSS_LOG_ERROR("failed to obtain service method table value: %s", SAI_KEY_VS_SWITCH_TYPE); return SAI_STATUS_FAILURE; } g_interface_lane_map_file = service_method_table->profile_get_value(0, SAI_KEY_VS_INTERFACE_LANE_MAP_FILE); load_interface_lane_map(); g_boot_type = service_method_table->profile_get_value(0, SAI_KEY_BOOT_TYPE); g_warm_boot_read_file = service_method_table->profile_get_value(0, SAI_KEY_WARM_BOOT_READ_FILE); g_warm_boot_write_file = service_method_table->profile_get_value(0, SAI_KEY_WARM_BOOT_WRITE_FILE); std::string bt = (g_boot_type == NULL) ? "cold" : g_boot_type; if (bt == "cold" || bt == "0") { g_vs_boot_type = SAI_VS_COLD_BOOT; } else if (bt == "warm" || bt == "1") { g_vs_boot_type = SAI_VS_WARM_BOOT; } else if (bt == "fast" || bt == "2") { g_vs_boot_type = SAI_VS_FAST_BOOT; } else { SWSS_LOG_ERROR("unsupported boot type: %s", g_boot_type); return SAI_STATUS_FAILURE; } std::string strType = type; if (strType == SAI_VALUE_VS_SWITCH_TYPE_BCM56850) { g_vs_switch_type = SAI_VS_SWITCH_TYPE_BCM56850; } else if (strType == SAI_VALUE_VS_SWITCH_TYPE_MLNX2700) { g_vs_switch_type = SAI_VS_SWITCH_TYPE_MLNX2700; } else { SWSS_LOG_ERROR("unknown switch type: '%s'", type); return SAI_STATUS_FAILURE; } const char *use_tap_dev = service_method_table->profile_get_value(0, SAI_KEY_VS_HOSTIF_USE_TAP_DEVICE); g_vs_hostif_use_tap_device = use_tap_dev != NULL && strcmp(use_tap_dev, "true") == 0; SWSS_LOG_NOTICE("hostif use TAP device: %s", g_vs_hostif_use_tap_device ? "true" : "false"); if (flags != 0) { SWSS_LOG_ERROR("invalid flags passed to SAI API initialize"); return SAI_STATUS_INVALID_PARAMETER; } clear_local_state(); g_dbNtf = std::make_shared<swss::DBConnector>(ASIC_DB, swss::DBConnector::DEFAULT_UNIXSOCKET, 0); g_unittestChannelNotificationConsumer = std::make_shared<swss::NotificationConsumer>(g_dbNtf.get(), SAI_VS_UNITTEST_CHANNEL); g_unittestChannelRun = true; g_unittestChannelThread = std::make_shared<std::thread>(std::thread(unittestChannelThreadProc)); g_fdb_info_set.clear(); g_fdbAgingThreadRun = true; // TODO should this be moved to create switch and SwitchState? g_fdbAgingThread = std::make_shared<std::thread>(std::thread(fdbAgingThreadProc)); g_api_initialized = true; return SAI_STATUS_SUCCESS; }