void printOutput()

in fboss/cli/fboss2/commands/show/interface/counters/mka/CmdShowInterfaceCountersMKA.h [65:297]


  void printOutput(const RetType& model, std::ostream& out = std::cout) {
    Table table;

    auto printPortStats = [&out](const auto& modelIntfMKAStats) {
      const auto& inStats = *modelIntfMKAStats.ingressPortStats();
      const auto& outStats = *modelIntfMKAStats.egressPortStats();

      Table table;
      table.setHeader({"Counter Name", "IN", "OUT"});
      table.addRow(
          {"PreMacsecDropPackets",
           std::to_string(*inStats.preMacsecDropPkts()),
           std::to_string(*outStats.preMacsecDropPkts())});
      table.addRow(
          {"ControlPackets",
           std::to_string(*inStats.controlPkts()),
           std::to_string(*outStats.controlPkts())});
      table.addRow(
          {"DataPackets",
           std::to_string(*inStats.dataPkts()),
           std::to_string(*outStats.dataPkts())});
      table.addRow(
          {"(En/De)cryptedOctets",
           std::to_string(*inStats.octetsEncrypted()),
           std::to_string(*outStats.octetsEncrypted())});
      table.addRow(
          {"MacsecTagPkts",
           std::to_string(*inStats.noMacsecTagPkts()),
           std::to_string(*outStats.noMacsecTagPkts())});
      table.addRow(
          {"BadOrNoMacsecTagDroppedPkts",
           std::to_string(*outStats.inBadOrNoMacsecTagDroppedPkts()),
           "--"});
      table.addRow(
          {"NoSciDroppedPkts",
           std::to_string(*inStats.inNoSciDroppedPkts()),
           "--"});
      table.addRow(
          {"UnknownSciPkts",
           std::to_string(*inStats.inUnknownSciPkts()),
           "--"});
      table.addRow(
          {"OverrunDroppedPkts",
           std::to_string(*inStats.inOverrunDroppedPkts()),
           "--"});
      table.addRow(
          {"DelayedPkts", std::to_string(*inStats.inDelayedPkts()), "--"});
      table.addRow(
          {"LateDroppedPkts",
           std::to_string(*inStats.inLateDroppedPkts()),
           "--"});
      table.addRow(
          {"NotValidDroppedPkts",
           std::to_string(*inStats.inNotValidDroppedPkts()),
           "--"});
      table.addRow(
          {"InvalidPkts", std::to_string(*inStats.inInvalidPkts()), "--"});
      table.addRow(
          {"NoSaDroppedPkts",
           std::to_string(*inStats.inNoSaDroppedPkts()),
           "--"});
      table.addRow(
          {"UnusedSaPkts", std::to_string(*inStats.inUnusedSaPkts()), "--"});
      table.addRow(
          {"TooLongDroppedPkts",
           "--",
           std::to_string(*outStats.outTooLongDroppedPkts())});

      out << table << std::endl;
    };

    auto printFlowStatsMap = [&out](const auto& modelIntfMKAStats) {
      const auto& inStatsList = *modelIntfMKAStats.ingressFlowStats();
      const auto& outStatsList = *modelIntfMKAStats.egressFlowStats();

      auto printFlowStats = [&out](const auto& flowStat, bool ingress) {
        const auto& sci = *flowStat.sci();
        const auto& stats = *flowStat.flowStats();

        out << "SCI INFO: " << std::endl;
        out << "MAC: " << sci.get_macAddress() << std::endl;
        out << "PORT: " << sci.get_port() << std::endl;
        Table table;
        table.setHeader({"Flow Counter Name", "Value"});
        table.addRow(
            {"UnicastUncontrolledPackets",
             std::to_string(*stats.ucastUncontrolledPkts())});
        table.addRow(
            {"UnicastControlledPackets",
             std::to_string(*stats.ucastControlledPkts())});
        table.addRow(
            {"MulticastUncontrolledPackets",
             std::to_string(*stats.mcastUncontrolledPkts())});
        table.addRow(
            {"MulticastControlledPackets",
             std::to_string(*stats.mcastControlledPkts())});
        table.addRow(
            {"BroadcastUncontrolledPackets",
             std::to_string(*stats.bcastUncontrolledPkts())});
        table.addRow(
            {"BroadcastControlledPackets",
             std::to_string(*stats.bcastControlledPkts())});
        table.addRow({"ControlPackets", std::to_string(*stats.controlPkts())});
        table.addRow(
            {"OtherErroredPackets", std::to_string(*stats.otherErrPkts())});
        table.addRow(
            {"OctetsUncontrolled",
             std::to_string(*stats.octetsUncontrolled())});
        table.addRow(
            {"OctetsControlled", std::to_string(*stats.octetsControlled())});

        if (ingress) {
          table.addRow(
              {"UntaggedPackets", std::to_string(*stats.untaggedPkts())});
          table.addRow(
              {"BadTagPackets", std::to_string(*stats.inBadTagPkts())});
          table.addRow({"NoSciPackets", std::to_string(*stats.noSciPkts())});
          table.addRow(
              {"UnknownSciPackets", std::to_string(*stats.unknownSciPkts())});
        } else {
          table.addRow(
              {"CommonOctets", std::to_string(*stats.outCommonOctets())});
          table.addRow(
              {"TooLongPackets", std::to_string(*stats.outTooLongPkts())});
        }
        out << table << std::endl;
      };

      if (!inStatsList.empty()) {
        out << "Ingress Flow Stats" << std::endl;
        out << std::string(20, '-') << std::endl;
        for (const auto& inStat : inStatsList) {
          printFlowStats(inStat, true);
        }
      }

      if (!outStatsList.empty()) {
        out << "Egress Flow Stats" << std::endl;
        out << std::string(20, '-') << std::endl;
        for (const auto& outStat : outStatsList) {
          printFlowStats(outStat, false);
        }
      }
    };

    auto printSaStatsMap = [&out](const auto& modelIntfMKAStats) {
      const auto& inStatsList = *modelIntfMKAStats.rxSecureAssociationStats();
      const auto& outStatsList = *modelIntfMKAStats.txSecureAssociationStats();

      auto printSaStats = [&out](const auto& saStat, bool ingress) {
        const auto& stats = saStat.get_saStats();
        const auto& sa = saStat.get_saId();
        const auto& sci = sa.get_sci();

        out << "SA INFO: " << std::endl;
        out << "MAC: " << sci.get_macAddress() << std::endl;
        out << "PORT: " << sci.get_port() << std::endl;
        out << "Association#: " << sa.get_assocNum() << std::endl;

        Table table;
        table.setHeader({"SA Counter Name", "Value"});
        table.addRow(
            {"OctetsEncrypted", std::to_string(*stats.octetsEncrypted())});
        table.addRow(
            {"OctetsProtected", std::to_string(*stats.octetsProtected())});
        if (ingress) {
          table.addRow(
              {"UncheckedPacktes", std::to_string(*stats.inUncheckedPkts())});
          table.addRow(
              {"DelayedPacktes", std::to_string(*stats.inDelayedPkts())});
          table.addRow({"LatePacktes", std::to_string(*stats.inLatePkts())});
          table.addRow({"LatePacktes", std::to_string(*stats.inLatePkts())});
          table.addRow(
              {"InvalidPacktes", std::to_string(*stats.inInvalidPkts())});
          table.addRow(
              {"NotValidPacktes", std::to_string(*stats.inNotValidPkts())});
          table.addRow({"NoSaPacktes", std::to_string(*stats.inNoSaPkts())});
          table.addRow(
              {"UnusedSaPacktes", std::to_string(*stats.inUnusedSaPkts())});
          table.addRow({"OkPacktes", std::to_string(*stats.inOkPkts())});
        } else {
          table.addRow(
              {"EncryptedPacktes", std::to_string(*stats.outEncryptedPkts())});
          table.addRow(
              {"ProtectedPacktes", std::to_string(*stats.outProtectedPkts())});
        }
        out << table << std::endl;
      };

      if (!inStatsList.empty()) {
        out << "Ingress SA Stats" << std::endl;
        out << std::string(20, '-') << std::endl;
        for (const auto& inStat : inStatsList) {
          printSaStats(inStat, true);
        }
      }

      if (!outStatsList.empty()) {
        out << "Egress SA Stats" << std::endl;
        out << std::string(20, '-') << std::endl;
        for (const auto& outStat : outStatsList) {
          printSaStats(outStat, false);
        }
      }
    };

    auto printAclStats = [&out](const auto& modelIntfMKAStats) {
      const auto& inStats = *modelIntfMKAStats.ingressAclStats();
      const auto& outStats = *modelIntfMKAStats.egressAclStats();

      Table table;
      table.setHeader({"Counter Name", "IN", "OUT"});
      table.addRow(
          {"DefaultAclPackets",
           std::to_string(*inStats.defaultAclStats()),
           std::to_string(*outStats.defaultAclStats())});
      out << table << std::endl;
    };

    for (auto& m : model.get_intfMKAStats()) {
      out << "Port: " << m.first << std::endl;
      out << std::string(20, '=') << std::endl;

      // Print port stats
      printPortStats(m.second);
      // Print flow stats
      printFlowStatsMap(m.second);
      // Print SA stats
      printSaStatsMap(m.second);
      // Print ACL stats
      printAclStats(m.second);
    }
  }