in src/analysis/print_analyzer.cpp [55:163]
bool print_procedure(std::ostream& out, const RPCProcedure* proc)
{
using namespace NST::utils;
bool result{false};
out << *(proc->session);
auto& call = proc->call;
const unsigned long nfs_version{call.ru.RM_cmb.cb_vers};
if(out_all())
{
out << " XID: " << call.rm_xid
<< " RPC version: " << call.ru.RM_cmb.cb_rpcvers
<< " RPC program: " << call.ru.RM_cmb.cb_prog
<< " version: " << nfs_version << ' ';
}
switch(nfs_version)
{
case NFS_V3:
out << print_nfs3_procedures(static_cast<ProcEnumNFS3::NFSProcedure>(call.ru.RM_cmb.cb_proc));
break;
case NFS_V4:
out << print_nfs41_procedures(static_cast<ProcEnumNFS41::NFSProcedure>(call.ru.RM_cmb.cb_proc));
break;
}
// check procedure reply
auto& reply = proc->reply;
if(reply.ru.RM_rmb.rp_stat == reply_stat::MSG_ACCEPTED)
{
switch(reply.ru.RM_rmb.ru.RP_ar.ar_stat)
{
case accept_stat::SUCCESS:
result = true; // Ok, reply is correct
break;
case accept_stat::PROG_MISMATCH:
out << " Program mismatch: "
<< " low: " << reply.ru.RM_rmb.ru.RP_ar.ru.AR_versions.low
<< " high: " << reply.ru.RM_rmb.ru.RP_ar.ru.AR_versions.high;
break;
case accept_stat::PROG_UNAVAIL:
out << " Program unavailable";
break;
case accept_stat::PROC_UNAVAIL:
out << " Procedure unavailable";
break;
case accept_stat::GARBAGE_ARGS:
out << " Garbage arguments";
break;
case accept_stat::SYSTEM_ERR:
out << " System error";
break;
}
}
else if(reply.ru.RM_rmb.rp_stat == reply_stat::MSG_DENIED)
{
out << " RPC Call rejected: ";
switch(reply.ru.RM_rmb.ru.RP_dr.rj_stat)
{
case reject_stat::RPC_MISMATCH:
out << "RPC version number mismatch, "
<< " low: "
<< reply.ru.RM_rmb.ru.RP_dr.ru.RJ_versions.low
<< " high: "
<< reply.ru.RM_rmb.ru.RP_dr.ru.RJ_versions.high;
break;
case reject_stat::AUTH_ERROR:
{
out << " Authentication check: ";
switch(reply.ru.RM_rmb.ru.RP_dr.ru.RJ_why)
{
case auth_stat::AUTH_OK:
out << "OK";
break;
case auth_stat::AUTH_BADCRED:
out << " bogus credentials (seal broken)"
<< " (failed at remote end)";
break;
case auth_stat::AUTH_REJECTEDCRED:
out << " rejected credentials (client should begin new session)"
<< " (failed at remote end)";
break;
case auth_stat::AUTH_BADVERF:
out << " bogus verifier (seal broken)"
<< " (failed at remote end)";
break;
case auth_stat::AUTH_REJECTEDVERF:
out << " verifier expired or was replayed"
<< " (failed at remote end)";
break;
case auth_stat::AUTH_TOOWEAK:
out << " too weak (rejected due to security reasons)"
<< " (failed at remote end)";
break;
case auth_stat::AUTH_INVALIDRESP:
out << " bogus response verifier"
<< " (failed locally)";
break;
default:
out << " some unknown reason"
<< " (failed locally)";
break;
}
break;
}
}
}
out << '\n'; // end line of RPC procedure information
return result;
}