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);
}
}