sai_status_t handle_route( _In_ const std::string &str_object_id, _In_ sai_common_api_t api, _In_ uint32_t attr_count, _In_ sai_attribute_t *attr_list) { SWSS_LOG_ENTER(); sai_route_entry_t route_entry; sai_deserialize_route_entry(str_object_id, route_entry); route_entry.switch_id = translate_local_to_redis(route_entry.switch_id); route_entry.vr_id = translate_local_to_redis(route_entry.vr_id); switch(api) { case SAI_COMMON_API_CREATE: return sai_metadata_sai_route_api->create_route_entry(&route_entry, attr_count, attr_list); case SAI_COMMON_API_REMOVE: return sai_metadata_sai_route_api->remove_route_entry(&route_entry); case SAI_COMMON_API_SET: return sai_metadata_sai_route_api->set_route_entry_attribute(&route_entry, attr_list); case SAI_COMMON_API_GET: return sai_metadata_sai_route_api->get_route_entry_attribute(&route_entry, attr_count, attr_list); default: SWSS_LOG_THROW("route other apis not implemented"); } }
sai_status_t handle_route( _In_ std::string &str_object_id, _In_ sai_common_api_t api, _In_ uint32_t attr_count, _In_ sai_attribute_t *attr_list) { SWSS_LOG_ENTER(); int index = 0; sai_unicast_route_entry_t route_entry; sai_deserialize_route_entry(str_object_id, index, route_entry); route_entry.vr_id = translate_vid_to_rid(route_entry.vr_id); SWSS_LOG_DEBUG("route: %s", str_object_id.c_str()); switch(api) { case SAI_COMMON_API_CREATE: return sai_route_api->create_route(&route_entry, attr_count, attr_list); case SAI_COMMON_API_REMOVE: return sai_route_api->remove_route(&route_entry); case SAI_COMMON_API_SET: return sai_route_api->set_route_attribute(&route_entry, attr_list); case SAI_COMMON_API_GET: return sai_route_api->get_route_attribute(&route_entry, attr_count, attr_list); default: SWSS_LOG_ERROR("route other apis not implemented"); exit(EXIT_FAILURE); } }
sai_status_t handle_bulk_route( _In_ const std::vector<std::string> &object_ids, _In_ sai_common_api_t api, _In_ const std::vector<std::shared_ptr<SaiAttributeList>> &attributes, _In_ const std::vector<sai_status_t> &recorded_statuses) { SWSS_LOG_ENTER(); std::vector<sai_route_entry_t> routes; for (size_t i = 0; i < object_ids.size(); ++i) { sai_route_entry_t route_entry; sai_deserialize_route_entry(object_ids[i], route_entry); route_entry.vr_id = translate_local_to_redis(route_entry.vr_id); routes.push_back(route_entry); SWSS_LOG_DEBUG("route: %s", object_ids[i].c_str()); } std::vector<sai_status_t> statuses; statuses.resize(recorded_statuses.size()); if (api == (sai_common_api_t)SAI_COMMON_API_BULK_SET) { /* * TODO: since SDK don't support bulk route api yet, we just use our * implementation, and later on we can switch to SDK api. * * TODO: we need to get operation type from recording, currently is not * serialized and it is hard coded here. */ std::vector<sai_attribute_t> attrs; for (const auto &a: attributes) { /* * Set has only 1 attribute, so we can just join them nicely here. */ attrs.push_back(a->get_attr_list()[0]); } sai_status_t status = sai_bulk_set_route_entry_attribute( (uint32_t)routes.size(), routes.data(), attrs.data(), SAI_BULK_OP_TYPE_INGORE_ERROR, // TODO we need to get that from recording statuses.data()); if (status != SAI_STATUS_SUCCESS) { /* * Entire API failes, so no need to compare statuses. */ return status; } for (size_t i = 0; i < statuses.size(); ++i) { if (statuses[i] != recorded_statuses[i]) { /* * If recorded statuses are different than received, throw * excetion since data don't match. */ SWSS_LOG_THROW("recorded status is %s but returned is %s on %s", sai_serialize_status(recorded_statuses[i]).c_str(), sai_serialize_status(statuses[i]).c_str(), object_ids[i].c_str()); } } return status; } else { SWSS_LOG_THROW("api %d is not supported in bulk route", api); } }