sai_status_t get_switch_attribute_fn()

in fboss/agent/hw/sai/fake/FakeSaiSwitch.cpp [285:490]


sai_status_t get_switch_attribute_fn(
    sai_object_id_t switch_id,
    uint32_t attr_count,
    sai_attribute_t* attr) {
  auto fs = FakeSai::getInstance();
  auto& sw = fs->switchManager.get(switch_id);
  for (int i = 0; i < attr_count; ++i) {
    switch (attr[i].id) {
      case SAI_SWITCH_ATTR_DEFAULT_1Q_BRIDGE_ID:
        attr[i].value.oid = kDefault1QBridgeId;
        break;
      case SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID:
        attr[i].value.oid = kDefaultVirtualRouterId;
        break;
      case SAI_SWITCH_ATTR_DEFAULT_VLAN_ID:
        attr[i].value.oid = sw.getDefaultVlanId();
        break;
      case SAI_SWITCH_ATTR_CPU_PORT:
        attr[i].value.oid = fs->getCpuPort();
        break;
      case SAI_SWITCH_ATTR_PORT_NUMBER:
        attr[i].value.u32 = fs->portManager.map().size();
        break;
      case SAI_SWITCH_ATTR_PORT_CONNECTOR_LIST:
      case SAI_SWITCH_ATTR_PORT_LIST: {
        if (fs->portManager.map().size() > attr[i].value.objlist.count) {
          attr[i].value.objlist.count = fs->portManager.map().size();
          return SAI_STATUS_BUFFER_OVERFLOW;
        }
        attr[i].value.objlist.count = fs->portManager.map().size();
        int j = 0;
        for (const auto& p : fs->portManager.map()) {
          attr[i].value.objlist.list[j++] = p.first;
        }
      } break;
      case SAI_SWITCH_ATTR_SRC_MAC_ADDRESS:
        std::copy_n(sw.srcMac().bytes(), 6, std::begin(attr[i].value.mac));
        break;
      case SAI_SWITCH_ATTR_INIT_SWITCH:
        attr[i].value.booldata = sw.isInitialized();
        break;
      case SAI_SWITCH_ATTR_SWITCH_HARDWARE_INFO:
        attr[i].value.s8list.count = sw.hwInfo().size();
        attr[i].value.s8list.list = sw.hwInfoData();
        break;
      case SAI_SWITCH_ATTR_SWITCH_SHELL_ENABLE:
        attr[i].value.booldata = sw.isShellEnabled();
        break;
      case SAI_SWITCH_ATTR_NUMBER_OF_UNICAST_QUEUES:
        attr[i].value.u32 = kMaxPortUnicastQueues;
        break;
      case SAI_SWITCH_ATTR_NUMBER_OF_MULTICAST_QUEUES:
        attr[i].value.u32 = kMaxPortMulticastQueues;
        break;
      case SAI_SWITCH_ATTR_NUMBER_OF_QUEUES:
        attr[i].value.u32 = kMaxPortQueues;
        break;
      case SAI_SWITCH_ATTR_NUMBER_OF_CPU_QUEUES:
        attr[i].value.u32 = kMaxCpuQueues;
        break;
      case SAI_SWITCH_ATTR_ECMP_HASH:
        attr[i].value.oid = kEcmpHashId;
        break;
      case SAI_SWITCH_ATTR_LAG_HASH:
        attr[i].value.oid = kLagHashId;
        break;
      case SAI_SWITCH_ATTR_ECMP_HASH_IPV4:
        attr[i].value.oid = sw.ecmpHashV4Id();
        break;
      case SAI_SWITCH_ATTR_ECMP_HASH_IPV6:
        attr[i].value.oid = sw.ecmpHashV6Id();
        break;
      case SAI_SWITCH_ATTR_LAG_HASH_IPV4:
        attr[i].value.oid = sw.lagHashV4Id();
        break;
      case SAI_SWITCH_ATTR_LAG_HASH_IPV6:
        attr[i].value.oid = sw.lagHashV6Id();
        break;
      case SAI_SWITCH_ATTR_ECMP_DEFAULT_HASH_SEED:
        attr[i].value.u32 = sw.ecmpSeed();
        break;
      case SAI_SWITCH_ATTR_LAG_DEFAULT_HASH_SEED:
        attr[i].value.u32 = sw.lagSeed();
        break;
      case SAI_SWITCH_ATTR_ECMP_DEFAULT_HASH_ALGORITHM:
        attr[i].value.s32 = sw.ecmpAlgorithm();
        break;
      case SAI_SWITCH_ATTR_LAG_DEFAULT_HASH_ALGORITHM:
        attr[i].value.s32 = sw.lagAlgorithm();
        break;
      case SAI_SWITCH_ATTR_RESTART_WARM:
        attr[i].value.booldata = sw.restartWarm();
        break;
      case SAI_SWITCH_ATTR_QOS_DSCP_TO_TC_MAP:
        attr[i].value.oid = sw.dscpToTc();
        break;
      case SAI_SWITCH_ATTR_QOS_TC_TO_QUEUE_MAP:
        attr[i].value.oid = sw.tcToQueue();
        break;
      case SAI_SWITCH_ATTR_QOS_MPLS_EXP_TO_TC_MAP:
        attr[i].value.oid = sw.expToTc();
        break;
      case SAI_SWITCH_ATTR_QOS_TC_AND_COLOR_TO_MPLS_EXP_MAP:
        attr[i].value.oid = sw.tcToExp();
        break;
      case SAI_SWITCH_ATTR_ACL_ENTRY_MINIMUM_PRIORITY:
        attr[i].value.oid = kDefaultAclEntryMinimumPriority;
        break;
      case SAI_SWITCH_ATTR_ACL_ENTRY_MAXIMUM_PRIORITY:
        attr[i].value.oid = kDefaultAclEntryMaximumPriority;
        break;
      case SAI_SWITCH_ATTR_FDB_AGING_TIME:
        attr[i].value.u32 = sw.getMacAgingTime();
        break;
      case SAI_SWITCH_ATTR_FDB_DST_USER_META_DATA_RANGE:
        attr[i].value.u32range.min = kDefaultFdbDstUserMetaDataRangeMin;
        attr[i].value.u32range.max = kDefaultFdbDstUserMetaDataRangeMax;
        break;
      case SAI_SWITCH_ATTR_ROUTE_DST_USER_META_DATA_RANGE:
        attr[i].value.u32range.min = kDefaultRouteDstUserMetaDataRangeMin;
        attr[i].value.u32range.max = kDefaultRouteDstUserMetaDataRangeMax;
        break;
      case SAI_SWITCH_ATTR_NEIGHBOR_DST_USER_META_DATA_RANGE:
        attr[i].value.u32range.min = kDefaultNeighborDstUserMetaDataRangeMin;
        attr[i].value.u32range.max = kDefaultNeighborDstUserMetaDataRangeMax;
        break;
      case SAI_SWITCH_ATTR_ECN_ECT_THRESHOLD_ENABLE:
        attr[i].value.booldata = sw.getUseEcnThresholds();
        break;
      case SAI_SWITCH_ATTR_EXT_FAKE_LED:
      case SAI_SWITCH_ATTR_EXT_FAKE_LED_RESET:
        return sw.getLed(attr);
      case SAI_SWITCH_ATTR_DEFAULT_EGRESS_BUFFER_POOL_SHARED_SIZE:
        attr[i].value.u32 = 1'000'000;
        break;
      case SAI_SWITCH_ATTR_AVAILABLE_IPV4_ROUTE_ENTRY:
      case SAI_SWITCH_ATTR_AVAILABLE_IPV6_ROUTE_ENTRY:
      case SAI_SWITCH_ATTR_AVAILABLE_IPV4_NEXTHOP_ENTRY:
      case SAI_SWITCH_ATTR_AVAILABLE_IPV6_NEXTHOP_ENTRY:
      case SAI_SWITCH_ATTR_AVAILABLE_NEXT_HOP_GROUP_ENTRY:
      case SAI_SWITCH_ATTR_AVAILABLE_NEXT_HOP_GROUP_MEMBER_ENTRY:
      case SAI_SWITCH_ATTR_AVAILABLE_IPV4_NEIGHBOR_ENTRY:
      case SAI_SWITCH_ATTR_AVAILABLE_IPV6_NEIGHBOR_ENTRY:
        // Why not
        attr[i].value.u32 = 1'000'000;
        break;
      case SAI_SWITCH_ATTR_INGRESS_ACL:
        attr[i].value.oid = sw.getIngressAcl();
        break;
      case SAI_SWITCH_ATTR_COUNTER_REFRESH_INTERVAL:
        attr[i].value.u32 = sw.getCounterRefreshInterval();
        break;
      case SAI_SWITCH_ATTR_FIRMWARE_PATH_NAME:
        attr[i].value.s8list.count = sw.firmwarePath().size();
        attr[i].value.s8list.list = sw.firmwarePathData();
        break;
      case SAI_SWITCH_ATTR_FIRMWARE_LOAD_METHOD:
        attr[i].value.s32 = sw.firmwareLoadMethod();
        break;
      case SAI_SWITCH_ATTR_FIRMWARE_LOAD_TYPE:
        attr[i].value.s32 = sw.firmwareLoadType();
        break;
      case SAI_SWITCH_ATTR_HARDWARE_ACCESS_BUS:
        attr[i].value.s32 = sw.hardwareAccessBus();
        break;
      case SAI_SWITCH_ATTR_PLATFROM_CONTEXT:
        attr[i].value.u64 = sw.platformContext();
        break;
      case SAI_SWITCH_ATTR_SWITCH_PROFILE_ID:
        attr[i].value.u32 = sw.profileId();
        break;
      case SAI_SWITCH_ATTR_FIRMWARE_STATUS:
        attr[i].value.booldata = true;
        break;
      case SAI_SWITCH_ATTR_FIRMWARE_MAJOR_VERSION:
      case SAI_SWITCH_ATTR_FIRMWARE_MINOR_VERSION:
        attr[i].value.u32 = 0;
        break;
      case SAI_SWITCH_ATTR_SWITCH_ID:
        attr[i].value.u32 = sw.switchId();
        break;
      case SAI_SWITCH_ATTR_MAX_SYSTEM_CORES:
        attr[i].value.u32 = sw.maxSystemCores();
        break;
      case SAI_SWITCH_ATTR_SYSTEM_PORT_CONFIG_LIST:
        attr[i].value.objlist.count = sw.sysPortConfigList().size();
        attr[i].value.objlist.list = sw.sysPortConfigListData();
        break;
      case SAI_SWITCH_ATTR_TYPE:
        attr[i].value.u32 = sw.switchType();
        break;
      case SAI_SWITCH_ATTR_REGISTER_READ:
        attr[i].value.ptr = sw.readFn();
        break;
      case SAI_SWITCH_ATTR_REGISTER_WRITE:
        attr[i].value.ptr = sw.writeFn();
        break;
      case SAI_SWITCH_ATTR_EXT_FAKE_HW_ECC_ERROR_INITIATE:
        // noop;
        break;
      default:
        return SAI_STATUS_INVALID_PARAMETER;
    }
  }
  return SAI_STATUS_SUCCESS;
}