fboss/agent/hw/sai/fake/FakeSai.cpp (222 lines of code) (raw):

/* * Copyright (c) 2004-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * */ #include "fboss/agent/hw/sai/fake/FakeSai.h" #include <folly/FileUtil.h> #include <folly/Singleton.h> #include <folly/logging/xlog.h> namespace { struct singleton_tag_type {}; } // namespace using facebook::fboss::FakeSai; static folly::Singleton<FakeSai, singleton_tag_type> fakeSaiSingleton{}; std::shared_ptr<FakeSai> FakeSai::getInstance() { return fakeSaiSingleton.try_get(); } void FakeSai::clear() { auto fs = FakeSai::getInstance(); fs->aclTableGroupManager.clearWithMembers(); fs->aclEntryManager.clear(); fs->aclCounterManager.clear(); fs->aclTableManager.clear(); fs->bridgeManager.clearWithMembers(); fs->debugCounterManager.clear(); fs->fdbManager.clear(); fs->hashManager.clear(); fs->hostIfTrapManager.clear(); fs->hostifTrapGroupManager.clear(); fs->inSegEntryManager.clear(); fs->neighborManager.clear(); fs->mirrorManager.clear(); fs->nextHopManager.clear(); fs->nextHopGroupManager.clearWithMembers(); fs->portManager.clear(); fs->qosMapManager.clear(); fs->queueManager.clear(); fs->routeManager.clear(); fs->routeInterfaceManager.clear(); fs->samplePacketManager.clear(); fs->scheduleManager.clear(); fs->switchManager.clear(); fs->virtualRouteManager.clear(); fs->vlanManager.clearWithMembers(); fs->wredManager.clear(); fs->tamManager.clear(); fs->tamEventManager.clear(); fs->tamEventActionManager.clear(); fs->tamReportManager.clear(); } sai_object_id_t FakeSai::getCpuPort() { return cpuPortId; } void sai_create_cpu_port() { // Create the CPU port auto fs = FakeSai::getInstance(); std::vector<uint32_t> cpuPortLanes{}; uint32_t cpuPortSpeed = 0; sai_object_id_t portId = fs->portManager.create(cpuPortLanes, cpuPortSpeed); auto& port = fs->portManager.get(portId); for (uint8_t queueId = 0; queueId < 8; queueId++) { auto saiQueueId = fs->queueManager.create(SAI_QUEUE_TYPE_ALL, portId, queueId, portId); port.queueIdList.push_back(saiQueueId); } fs->cpuPortId = portId; } sai_status_t sai_api_initialize( uint64_t /* flags */, const sai_service_method_table_t* /* services */) { auto fs = FakeSai::getInstance(); if (fs->initialized) { return SAI_STATUS_FAILURE; } // Create the default switch per the SAI spec fs->switchManager.create(); // Create the default 1Q bridge per the SAI spec fs->bridgeManager.create(); // Create the default virtual router per the SAI spec fs->virtualRouteManager.create(); // Create the CPU port sai_create_cpu_port(); fs->initialized = true; return SAI_STATUS_SUCCESS; } sai_status_t sai_api_uninitialize(void) { return SAI_STATUS_SUCCESS; } sai_status_t sai_api_query(sai_api_t sai_api_id, void** api_method_table) { auto fs = FakeSai::getInstance(); if (!fs->initialized) { return SAI_STATUS_FAILURE; } sai_status_t res; switch (sai_api_id) { case SAI_API_ACL: facebook::fboss::populate_acl_api((sai_acl_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_BRIDGE: facebook::fboss::populate_bridge_api( (sai_bridge_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_BUFFER: facebook::fboss::populate_buffer_api( (sai_buffer_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_DEBUG_COUNTER: facebook::fboss::populate_debug_counter_api( (sai_debug_counter_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_FDB: facebook::fboss::populate_fdb_api((sai_fdb_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_HASH: facebook::fboss::populate_hash_api((sai_hash_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_HOSTIF: facebook::fboss::populate_hostif_api( (sai_hostif_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_LAG: facebook::fboss::populate_lag_api((sai_lag_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_MIRROR: facebook::fboss::populate_mirror_api( (sai_mirror_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_MPLS: facebook::fboss::populate_mpls_api((sai_mpls_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_NEIGHBOR: facebook::fboss::populate_neighbor_api( (sai_neighbor_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_NEXT_HOP: facebook::fboss::populate_next_hop_api( (sai_next_hop_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_NEXT_HOP_GROUP: facebook::fboss::populate_next_hop_group_api( (sai_next_hop_group_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_PORT: facebook::fboss::populate_port_api((sai_port_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_QOS_MAP: facebook::fboss::populate_qos_map_api( (sai_qos_map_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_QUEUE: facebook::fboss::populate_queue_api((sai_queue_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_ROUTE: facebook::fboss::populate_route_api((sai_route_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_ROUTER_INTERFACE: facebook::fboss::populate_router_interface_api( (sai_router_interface_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_SAMPLEPACKET: facebook::fboss::populate_samplepacket_api( (sai_samplepacket_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_SCHEDULER: facebook::fboss::populate_scheduler_api( (sai_scheduler_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_SWITCH: facebook::fboss::populate_switch_api( (sai_switch_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_VIRTUAL_ROUTER: facebook::fboss::populate_virtual_router_api( (sai_virtual_router_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_VLAN: facebook::fboss::populate_vlan_api((sai_vlan_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_WRED: facebook::fboss::populate_wred_api((sai_wred_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_TAM: facebook::fboss::populate_tam_api((sai_tam_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; case SAI_API_MACSEC: facebook::fboss::populate_macsec_api( (sai_macsec_api_t**)api_method_table); res = SAI_STATUS_SUCCESS; break; default: res = SAI_STATUS_INVALID_PARAMETER; break; } return res; } sai_status_t sai_log_set(sai_api_t /*api*/, sai_log_level_t /*log_level*/) { return SAI_STATUS_SUCCESS; } sai_status_t sai_dbg_generate_dump(const char* dump_file_name) { folly::writeFile( std::string("Hello from land of FakeSai. All hunky dory here"), dump_file_name); return SAI_STATUS_SUCCESS; } sai_object_type_t sai_object_type_query(sai_object_id_t /*object_id*/) { // FIXME: implement this return SAI_OBJECT_TYPE_NEXT_HOP; }