sai_status_t __wrap_sai_api_query()

in fboss/agent/hw/sai/tracer/SaiTracer.cpp [153:334]


sai_status_t __wrap_sai_api_query(
    sai_api_t sai_api_id,
    void** api_method_table) {
  // Functions defined in sai.h can be properly wrapped using the linker trick
  // e.g. sai_api_query(), sai_api_initialize() ...
  // However, for other functions such as create_*, set_*, and get_*,
  // their function pointers are returned to the api_method_table in this call.
  // To 'wrap' those function pointers as well, we store the real
  // function pointers and return the 'wrapped' function pointers defined in
  // this tracer directory, adding an redirection layer for logging purpose.
  // (See 'AclApiTracer.h' for example).

  sai_status_t rv = __real_sai_api_query(sai_api_id, api_method_table);

  if (!FLAGS_enable_replayer) {
    return rv;
  }

  switch (sai_api_id) {
    case SAI_API_ACL:
      SaiTracer::getInstance()->aclApi_ =
          static_cast<sai_acl_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedAclApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "acl_api");
      break;
    case SAI_API_BRIDGE:
      SaiTracer::getInstance()->bridgeApi_ =
          static_cast<sai_bridge_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedBridgeApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "bridge_api");
      break;
    case SAI_API_BUFFER:
      SaiTracer::getInstance()->bufferApi_ =
          static_cast<sai_buffer_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedBufferApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "buffer_api");
      break;
    case SAI_API_DEBUG_COUNTER:
      SaiTracer::getInstance()->debugCounterApi_ =
          static_cast<sai_debug_counter_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedDebugCounterApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "debug_counter_api");
      break;
    case SAI_API_FDB:
      SaiTracer::getInstance()->fdbApi_ =
          static_cast<sai_fdb_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedFdbApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "fdb_api");
      break;
    case SAI_API_HASH:
      SaiTracer::getInstance()->hashApi_ =
          static_cast<sai_hash_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedHashApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "hash_api");
      break;
    case SAI_API_HOSTIF:
      SaiTracer::getInstance()->hostifApi_ =
          static_cast<sai_hostif_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedHostifApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "hostif_api");
      break;
    case SAI_API_LAG:
      SaiTracer::getInstance()->lagApi_ =
          static_cast<sai_lag_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedLagApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "lag_api");
      break;
    case SAI_API_MACSEC:
      SaiTracer::getInstance()->macsecApi_ =
          static_cast<sai_macsec_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedMacsecApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "macsec_api");
      break;
    case SAI_API_MIRROR:
      SaiTracer::getInstance()->mirrorApi_ =
          static_cast<sai_mirror_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedMirrorApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "mirror_api");
      break;
    case SAI_API_MPLS:
      SaiTracer::getInstance()->mplsApi_ =
          static_cast<sai_mpls_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedMplsApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "mpls_api");
      break;
    case SAI_API_NEIGHBOR:
      SaiTracer::getInstance()->neighborApi_ =
          static_cast<sai_neighbor_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedNeighborApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "neighbor_api");
      break;
    case SAI_API_NEXT_HOP:
      SaiTracer::getInstance()->nextHopApi_ =
          static_cast<sai_next_hop_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedNextHopApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "next_hop_api");
      break;
    case SAI_API_NEXT_HOP_GROUP:
      SaiTracer::getInstance()->nextHopGroupApi_ =
          static_cast<sai_next_hop_group_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedNextHopGroupApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "next_hop_group_api");
      break;
    case SAI_API_PORT:
      SaiTracer::getInstance()->portApi_ =
          static_cast<sai_port_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedPortApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "port_api");
      break;
    case SAI_API_QOS_MAP:
      SaiTracer::getInstance()->qosMapApi_ =
          static_cast<sai_qos_map_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedQosMapApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "qos_map_api");
      break;
    case SAI_API_QUEUE:
      SaiTracer::getInstance()->queueApi_ =
          static_cast<sai_queue_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedQueueApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "queue_api");
      break;
    case SAI_API_ROUTE:
      SaiTracer::getInstance()->routeApi_ =
          static_cast<sai_route_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedRouteApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "route_api");
      break;
    case SAI_API_ROUTER_INTERFACE:
      SaiTracer::getInstance()->routerInterfaceApi_ =
          static_cast<sai_router_interface_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedRouterInterfaceApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "router_interface_api");
      break;
    case SAI_API_SAMPLEPACKET:
      SaiTracer::getInstance()->samplepacketApi_ =
          static_cast<sai_samplepacket_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedSamplePacketApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "samplepacket_api");
      break;
    case SAI_API_SCHEDULER:
      SaiTracer::getInstance()->schedulerApi_ =
          static_cast<sai_scheduler_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedSchedulerApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "scheduler_api");
      break;
    case SAI_API_SWITCH:
      SaiTracer::getInstance()->switchApi_ =
          static_cast<sai_switch_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedSwitchApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "switch_api");
      break;
    case SAI_API_TAM:
      SaiTracer::getInstance()->tamApi_ =
          static_cast<sai_tam_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedTamApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "tam_api");
      break;
    case SAI_API_VIRTUAL_ROUTER:
      SaiTracer::getInstance()->virtualRouterApi_ =
          static_cast<sai_virtual_router_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedVirtualRouterApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "virtual_router_api");
      break;
    case SAI_API_VLAN:
      SaiTracer::getInstance()->vlanApi_ =
          static_cast<sai_vlan_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedVlanApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "vlan_api");
      break;
    case SAI_API_WRED:
      SaiTracer::getInstance()->wredApi_ =
          static_cast<sai_wred_api_t*>(*api_method_table);
      *api_method_table = facebook::fboss::wrappedWredApi();
      SaiTracer::getInstance()->logApiQuery(sai_api_id, "wred_api");
      break;
    default:
      // TODO: For other APIs, create new API wrappers and invoke wrappedApi()
      // funtion here
      break;
  }
  return rv;
}