summaryrefslogtreecommitdiffstats
path: root/src/usr/secureboot/node_comm
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/secureboot/node_comm')
-rw-r--r--src/usr/secureboot/node_comm/node_comm.C6
-rw-r--r--src/usr/secureboot/node_comm/node_comm_dd.C2
-rw-r--r--src/usr/secureboot/node_comm/node_comm_exchange.C261
3 files changed, 215 insertions, 54 deletions
diff --git a/src/usr/secureboot/node_comm/node_comm.C b/src/usr/secureboot/node_comm/node_comm.C
index b05c56505..86631dd35 100644
--- a/src/usr/secureboot/node_comm/node_comm.C
+++ b/src/usr/secureboot/node_comm/node_comm.C
@@ -118,7 +118,7 @@ errlHndl_t nodeCommAbusRecvMessage(TARGETING::Target* i_pProc,
if (time_polled_ns >= NODE_COMM_POLL_DELAY_TOTAL_NS)
{
- TRACFCOMP(g_trac_nc,EXIT_MRK"nodeCommAbusRecvMessage: "
+ TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommAbusRecvMessage: "
"timeout: time_polled_ns-0x%.16llX, MAX=0x%.16llX, "
"interval=0x%.16llX",
time_polled_ns, NODE_COMM_POLL_DELAY_TOTAL_NS, interval_ns);
@@ -257,7 +257,7 @@ errlHndl_t nodeCommAbusRecvMessage(TARGETING::Target* i_pProc,
} while( 0 );
- TRACFCOMP(g_trac_nc,EXIT_MRK"nodeCommAbusRecvMessage: "
+ TRACUCOMP(g_trac_nc,EXIT_MRK"nodeCommAbusRecvMessage: "
"Tgt=0x%.08X, link=%d, mbox=%d attn_found=%d: "
"data=0x%.16llX. "
TRACE_ERR_FMT,
@@ -312,7 +312,7 @@ errlHndl_t nodeCommAbusSendMessage(TARGETING::Target* i_pProc,
} while( 0 );
- TRACFCOMP(g_trac_nc,EXIT_MRK"nodeCommAbusSendMessage: iProc=0x%.08X "
+ TRACUCOMP(g_trac_nc,EXIT_MRK"nodeCommAbusSendMessage: iProc=0x%.08X "
"send data=0x%.16llX through linkId=%d mboxId=%d: "
TRACE_ERR_FMT,
get_huid(i_pProc), i_data, i_linkId, i_mboxId,
diff --git a/src/usr/secureboot/node_comm/node_comm_dd.C b/src/usr/secureboot/node_comm/node_comm_dd.C
index 9e9caf200..aa4d2fc1d 100644
--- a/src/usr/secureboot/node_comm/node_comm_dd.C
+++ b/src/usr/secureboot/node_comm/node_comm_dd.C
@@ -229,7 +229,7 @@ errlHndl_t nodeCommPerformOp( DeviceFW::OperationType i_opType,
}
- TRACFCOMP (g_trac_nc, EXIT_MRK"nodeCommPerformOp: %s: %s: "
+ TRACUCOMP (g_trac_nc, EXIT_MRK"nodeCommPerformOp: %s: %s: "
"tgt=0x%X, LinkId=%d, MboxId=%d, data=0x%.16llX. "
TRACE_ERR_FMT,
(node_comm_args.mode == NCDD_MODE_ABUS)
diff --git a/src/usr/secureboot/node_comm/node_comm_exchange.C b/src/usr/secureboot/node_comm/node_comm_exchange.C
index eb492a3f4..d10a4546d 100644
--- a/src/usr/secureboot/node_comm/node_comm_exchange.C
+++ b/src/usr/secureboot/node_comm/node_comm_exchange.C
@@ -273,7 +273,7 @@ errlHndl_t nodeCommAbusLogNonce(uint64_t & i_nonce)
} // end of nodeCommAbusLogNonce
/**
- * @brief A function to create the slave node response quote that consists of
+ * @brief A function to create the slave node quote response that consists of
* eye catcher, slave node ID, quote and signature data (represented by
* the QuoteDataOut structure), the contents of PCRs 0-7, the
* Attestation Key Certificate returned from TPM, the size
@@ -288,13 +288,13 @@ errlHndl_t nodeCommAbusLogNonce(uint64_t & i_nonce)
* indicating that the slave quote is bad.
* @return nullptr on success; non-nullptr on error
*/
-errlHndl_t nodeCommGenSlaveResponseQuote(const MasterQuoteRequestBlob* const i_request,
+errlHndl_t nodeCommGenSlaveQuoteResponse(const MasterQuoteRequestBlob* const i_request,
size_t& o_size,
uint8_t*& o_resp)
{
errlHndl_t l_errl = nullptr;
#ifdef CONFIG_TPMDD
- TRACFCOMP(g_trac_nc, ENTER_MRK"nodeCommGenSlaveResponseQuote");
+ TRACFCOMP(g_trac_nc, ENTER_MRK"nodeCommGenSlaveQuoteResponse");
bool l_tpmRequired = TRUSTEDBOOT::isTpmRequired();
bool l_errorOccurred = false;
@@ -310,7 +310,7 @@ errlHndl_t nodeCommGenSlaveResponseQuote(const MasterQuoteRequestBlob* const i_r
!l_primaryTpm->getAttr<TARGETING::ATTR_HWAS_STATE>().functional ||
!l_primaryTpm->getAttr<TARGETING::ATTR_HWAS_STATE>().present)
{
- TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenSlaveResponseQuote: primary TPM not found or not functional");
+ TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenSlaveQuoteResponse: primary TPM not found or not functional");
l_errorOccurred = true;
break;
}
@@ -324,7 +324,7 @@ errlHndl_t nodeCommGenSlaveResponseQuote(const MasterQuoteRequestBlob* const i_r
if(i_request->EyeCatcher == MSTNOTPM)
{
l_errorOccurred = true;
- TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenSlaveResponseQuote: Master indicated an issue with secure nodecomm (master eye catcher is MSTNOTPM)");
+ TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenSlaveQuoteResponse: Master indicated an issue with secure nodecomm (master eye catcher is MSTNOTPM)");
// Case 1
if(l_tpmRequired)
{
@@ -359,7 +359,7 @@ errlHndl_t nodeCommGenSlaveResponseQuote(const MasterQuoteRequestBlob* const i_r
else if(i_request->EyeCatcher != MASTERQ_)
{
l_errorOccurred = true;
- TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenSlaveResponseQuote: Invalid master eye catcher received: 0x%x", i_request->EyeCatcher);
+ TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenSlaveQuoteResponse: Invalid master eye catcher received: 0x%x", i_request->EyeCatcher);
if(l_tpmRequired)
{
/* @
@@ -387,7 +387,7 @@ errlHndl_t nodeCommGenSlaveResponseQuote(const MasterQuoteRequestBlob* const i_r
l_errl = TRUSTEDBOOT::createAttestationKeys(l_primaryTpm);
if(l_errl)
{
- TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenSlaveResponseQuote: could not create attestation keys");
+ TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenSlaveQuoteResponse: could not create attestation keys");
break;
}
@@ -396,7 +396,7 @@ errlHndl_t nodeCommGenSlaveResponseQuote(const MasterQuoteRequestBlob* const i_r
l_errl = TRUSTEDBOOT::readAKCertificate(l_primaryTpm, &l_AKCert);
if(l_errl)
{
- TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenSlaveResponseQuote: could not read AK certificate");
+ TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenSlaveQuoteResponse: could not read AK certificate");
break;
}
@@ -414,7 +414,7 @@ errlHndl_t nodeCommGenSlaveResponseQuote(const MasterQuoteRequestBlob* const i_r
sizeof(l_AKCert.buffer));
if(l_errl)
{
- TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenSlaveResponseQuote: could not extend AK Certificate hash to TPM");
+ TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenSlaveQuoteResponse: could not extend AK Certificate hash to TPM");
break;
}
@@ -427,7 +427,7 @@ errlHndl_t nodeCommGenSlaveResponseQuote(const MasterQuoteRequestBlob* const i_r
&l_quoteData);
if(l_errl)
{
- TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenSlaveResponseQuote: could not generate TPM quote");
+ TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenSlaveQuoteResponse: could not generate TPM quote");
break;
}
@@ -435,13 +435,13 @@ errlHndl_t nodeCommGenSlaveResponseQuote(const MasterQuoteRequestBlob* const i_r
l_errl = TRUSTEDBOOT::flushContext(l_primaryTpm);
if(l_errl)
{
- TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenSlaveResponseQuote: could not flush TPM context");
+ TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenSlaveQuoteResponse: could not flush TPM context");
break;
}
// Step 5: Read the selected PCRs
// Make sure there is only 1 algo selection
- assert(i_request->PcrSelect.count == 1, "nodeCommGenSlaveResponseQuote: only 1 hash algo is supported for PCR read");
+ assert(i_request->PcrSelect.count == 1, "nodeCommGenSlaveQuoteResponse: only 1 hash algo is supported for PCR read");
uint32_t l_pcrCount = 0;
TRUSTEDBOOT::TPM_Pcr l_pcrRegs[TRUSTEDBOOT::FW_USED_PCR_COUNT] = {
TRUSTEDBOOT::PCR_0,
@@ -478,7 +478,7 @@ errlHndl_t nodeCommGenSlaveResponseQuote(const MasterQuoteRequestBlob* const i_r
l_pcrDigests[l_pcr].buffer);
if(l_errl)
{
- TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenSlaveResponseQuote: could not read PCR%d", l_pcr);
+ TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenSlaveQuoteResponse: could not read PCR%d", l_pcr);
break;
}
}
@@ -493,7 +493,7 @@ errlHndl_t nodeCommGenSlaveResponseQuote(const MasterQuoteRequestBlob* const i_r
TRUSTEDBOOT::getTpmLogMgr(l_primaryTpm);
if(!l_primaryLogMgr)
{
- TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenSlaveResponseQuote: could not fetch primary TPM's log");
+ TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenSlaveQuoteResponse: could not fetch primary TPM's log");
/*@
* @errortype
* @reasoncode RC_NC_NO_PRIMARY_TPM_LOG
@@ -614,10 +614,10 @@ errlHndl_t nodeCommGenSlaveResponseQuote(const MasterQuoteRequestBlob* const i_r
}
}
- TRACFCOMP(g_trac_nc, EXIT_MRK"nodeCommGenSlaveResponseQuote: " TRACE_ERR_FMT, TRACE_ERR_ARGS(l_errl));
+ TRACFCOMP(g_trac_nc, EXIT_MRK"nodeCommGenSlaveQuoteResponse: " TRACE_ERR_FMT, TRACE_ERR_ARGS(l_errl));
#endif
return l_errl;
-} //nodeCommGenSlaveResponseQuote
+} //nodeCommGenSlaveQuoteResponse
/**
* @brief A function to generate a master quote request blob that will be sent
@@ -627,11 +627,11 @@ errlHndl_t nodeCommGenSlaveResponseQuote(const MasterQuoteRequestBlob* const i_r
* @param[out] o_request the output master quote request data structure
* @return nullptr on success; non-nullptr on error
*/
-errlHndl_t nodeCommGenMasterRequestQuote(MasterQuoteRequestBlob* const o_request)
+errlHndl_t nodeCommGenMasterQuoteRequest(MasterQuoteRequestBlob* const o_request)
{
errlHndl_t l_errl = nullptr;
#ifdef CONFIG_TPMDD
- TRACFCOMP(g_trac_nc, ENTER_MRK"nodeCommGenMasterRequestQuote");
+ TRACFCOMP(g_trac_nc, ENTER_MRK"nodeCommGenMasterQuoteRequest");
bool l_tpmRequired = TRUSTEDBOOT::isTpmRequired();
do {
TARGETING::Target* l_primaryTpm = nullptr;
@@ -640,7 +640,7 @@ errlHndl_t nodeCommGenMasterRequestQuote(MasterQuoteRequestBlob* const o_request
!l_primaryTpm->getAttr<TARGETING::ATTR_HWAS_STATE>().functional ||
!l_primaryTpm->getAttr<TARGETING::ATTR_HWAS_STATE>().present)
{
- TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenMasterRequestQuote: primary TPM not found or is not functional");
+ TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenMasterQuoteRequest: primary TPM not found or is not functional");
l_errl = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE,
MOD_NC_GEN_MASTER_REQUEST,
@@ -659,11 +659,11 @@ errlHndl_t nodeCommGenMasterRequestQuote(MasterQuoteRequestBlob* const o_request
o_request->MasterNonce);
if(l_errl)
{
- TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenMasterRequestQuote: GetRandom failed");
+ TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommGenMasterQuoteRequest: GetRandom failed");
break;
}
- // Select PCRs (PCR0-7) to include in slave response quote
+ // Select PCRs (PCR0-7) to include in slave quote response
o_request->PcrSelect.count = 1; // One algorithm
o_request->PcrSelect.pcrSelections[0].algorithmId =
TRUSTEDBOOT::TPM_ALG_SHA256;
@@ -714,10 +714,10 @@ errlHndl_t nodeCommGenMasterRequestQuote(MasterQuoteRequestBlob* const o_request
}
}
- TRACFCOMP(g_trac_nc, EXIT_MRK"nodeCommGenMasterRequestQuote: " TRACE_ERR_FMT, TRACE_ERR_ARGS(l_errl));
+ TRACFCOMP(g_trac_nc, EXIT_MRK"nodeCommGenMasterQuoteRequest: " TRACE_ERR_FMT, TRACE_ERR_ARGS(l_errl));
#endif
return l_errl;
-} // nodeCommGenMasterRequestQuote
+} // nodeCommGenMasterQuoteRequest
/**
* @brief A function to process the response of one of the slave nodes
@@ -869,7 +869,7 @@ errlHndl_t nodeCommAbusExchangeMaster(const master_proc_info_t & i_mProcInfo,
break;
}
-
+ // Loop 1: Exchange SBID/nonces between Master and each of the Slave Nodes
for ( auto const l_obus : i_obus_instances)
{
uint8_t my_linkId = 0;
@@ -887,7 +887,7 @@ errlHndl_t nodeCommAbusExchangeMaster(const master_proc_info_t & i_mProcInfo,
expected_peer_linkId,
expected_peer_mboxId);
- TRACFCOMP(g_trac_nc,INFO_MRK"nodeCommAbusExchangeMaster: "
+ TRACFCOMP(g_trac_nc,INFO_MRK"nodeCommAbusExchangeMaster: Loop 1: "
"my: linkId=%d, mboxId=%d, ObusInstance=%d. "
"expected peer: linkId=%d, mboxId=%d, ObusInstance=%d.",
my_linkId, my_mboxId, l_obus.myObusInstance,
@@ -901,8 +901,8 @@ errlHndl_t nodeCommAbusExchangeMaster(const master_proc_info_t & i_mProcInfo,
err = nodeCommAbusGetRandom(msg_data.value);
if (err)
{
- TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommAbusExchangeMaster: Error Back "
- "From nodeCommAbusGetRandom: "
+ TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommAbusExchangeMaster: Loop 1: "
+ "Error Back From nodeCommAbusGetRandom: "
TRACE_ERR_FMT,
TRACE_ERR_ARGS(err));
break;
@@ -924,7 +924,7 @@ errlHndl_t nodeCommAbusExchangeMaster(const master_proc_info_t & i_mProcInfo,
if (err)
{
- TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommAbusExchangeMaster: "
+ TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommAbusExchangeMaster: Loop 1: "
"nodeCommAbusTransferSend returned an error");
break;
}
@@ -933,8 +933,8 @@ errlHndl_t nodeCommAbusExchangeMaster(const master_proc_info_t & i_mProcInfo,
err = nodeCommAbusLogNonce(msg_data.value);
if (err)
{
- TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommAbusExchangeMaster: Error Back From "
- "nodeCommAbusLogNonce: "
+ TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommAbusExchangeMaster: Loop 1: "
+ "Error Back From nodeCommAbusLogNonce: "
TRACE_ERR_FMT,
TRACE_ERR_ARGS(err));
break;
@@ -955,13 +955,13 @@ errlHndl_t nodeCommAbusExchangeMaster(const master_proc_info_t & i_mProcInfo,
data_rcv_size);
if (err)
{
- TRACFCOMP(g_trac_nc,INFO_MRK"nodeCommAbusExchangeMaster: "
+ TRACFCOMP(g_trac_nc,INFO_MRK"nodeCommAbusExchangeMaster: Loop 1: "
"nodeCommTransferRecv returned an error");
break;
}
// If no err is returned, data_rcv_buffer should be valid, but do a
// sanity check here to be certain
- assert(data_rcv_buffer!=nullptr,"nodeCommAbusExchangeMaster: data_rcv_buffer returned as nullptr");
+ assert(data_rcv_buffer!=nullptr,"nodeCommAbusExchangeMaster: Loop 1: data_rcv_buffer returned as nullptr");
// Add receiver Link Id to the message data
// @TODO RTC 203642 Check that data_rcv_size == sizeof(uint64_t)
@@ -977,21 +977,115 @@ errlHndl_t nodeCommAbusExchangeMaster(const master_proc_info_t & i_mProcInfo,
err = nodeCommAbusLogNonce(msg_data.value);
if (err)
{
- TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommAbusExchangeMaster: Error Back "
- "From nodeCommAbusLogNonce: "
+ TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommAbusExchangeMaster: Loop 1: "
+ "Error Back From nodeCommAbusLogNonce: "
TRACE_ERR_FMT,
TRACE_ERR_ARGS(err));
break;
}
- } // end of loop on i_obus_instances
+ } // end of Loop 1 (SBID/nonces) on i_obus_instances
if(err)
{
break;
}
- // @TODO RTC 203642 Do Another Loop for Quotes
+ // Loop 2: Master Node will request quotes from each Slave Node by first
+ // sending a Quote Request and then waiting to receive a Quote Response
+ for ( auto const l_obus : i_obus_instances)
+ {
+ uint8_t my_linkId = 0;
+ uint8_t my_mboxId = 0;
+ getLinkMboxFromObusInstance(l_obus.myObusInstance,
+ l_obus.myObusRelLink,
+ my_linkId,
+ my_mboxId);
+
+ uint8_t expected_peer_linkId = 0;
+ uint8_t expected_peer_mboxId = 0;
+ getLinkMboxFromObusInstance(l_obus.peerObusInstance,
+ // same relative link for peer path:
+ l_obus.myObusRelLink,
+ expected_peer_linkId,
+ expected_peer_mboxId);
+
+ TRACFCOMP(g_trac_nc,INFO_MRK"nodeCommAbusExchangeMaster: Loop 2: "
+ "my: linkId=%d, mboxId=%d, ObusInstance=%d. "
+ "expected peer: linkId=%d, mboxId=%d, ObusInstance=%d.",
+ my_linkId, my_mboxId, l_obus.myObusInstance,
+ expected_peer_linkId, expected_peer_mboxId,
+ l_obus.peerObusInstance);
+
+ // Generate Master Quote Request
+ MasterQuoteRequestBlob quote_request{};
+ err = nodeCommGenMasterQuoteRequest(&quote_request);
+ if (err)
+ {
+ TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommAbusExchangeMaster: Loop 2: "
+ "Error Back From nodeCommGenMasterQuoteRequest: "
+ TRACE_ERR_FMT,
+ TRACE_ERR_ARGS(err));
+ break;
+ }
+
+ // Send Quote Request to a slave
+ size_t tmp_size = sizeof(quote_request);
+ err = nodeCommTransferSend(i_mProcInfo.tgt,
+ my_linkId,
+ my_mboxId,
+ NCT_TRANSFER_QUOTE_REQUEST,
+ reinterpret_cast<uint8_t*>
+ (&quote_request),
+ tmp_size);
+
+ if (err)
+ {
+ TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommAbusExchangeMaster: Loop 2: "
+ "nodeCommAbusTransferSend returned an error");
+ break;
+ }
+
+ // Look for Quote Response from the slave node
+ size_t data_rcv_size = 0;
+ if (data_rcv_buffer != nullptr)
+ {
+ free(data_rcv_buffer);
+ data_rcv_buffer = nullptr;
+ }
+ err = nodeCommTransferRecv(i_mProcInfo.tgt,
+ my_linkId,
+ my_mboxId,
+ NCT_TRANSFER_QUOTE_RESPONSE,
+ data_rcv_buffer,
+ data_rcv_size);
+ if (err)
+ {
+ TRACFCOMP(g_trac_nc,INFO_MRK"nodeCommAbusExchangeMaster: Loop 2: "
+ "nodeCommTransferRecv returned an error");
+ break;
+ }
+ // If no err is returned, data_rcv_buffer should be valid, but do a
+ // sanity check here to be certain
+ assert(data_rcv_buffer!=nullptr,"nodeCommAbusExchangeMaster: Loop 2: data_rcv_buffer returned as nullptr");
+
+ // Process the Quote Response that was returned from the slave node
+ err = nodeCommProcessSlaveQuote(data_rcv_buffer, data_rcv_size);
+ if (err)
+ {
+ TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommAbusExchangeMaster: Loop 2: "
+ "Error Back nodeCommProcessSlaveQuote: "
+ TRACE_ERR_FMT,
+ TRACE_ERR_ARGS(err));
+ break;
+ }
+
+ } // end of Loop-2 (Quotes) on i_obus_instances
+
+ if (err)
+ {
+ break;
+ }
} while( 0 );
@@ -1037,8 +1131,9 @@ errlHndl_t nodeCommAbusExchangeSlave(const master_proc_info_t & i_mProcInfo,
i_obus_instance.peerProcInstance,
i_obus_instance.peerObusInstance);
- // Pointer to buffer used for receiving data from nodeCommTransferRecv()
- uint8_t * data_rcv_buffer = nullptr;
+ // Pointer to buffer used for transferring and receiving data
+ // from nodeCommTransferSend() and nodeCommTransferRecv()
+ uint8_t * data_buffer = nullptr;
do
{
@@ -1052,32 +1147,32 @@ errlHndl_t nodeCommAbusExchangeSlave(const master_proc_info_t & i_mProcInfo,
// First Wait for Message From Master
- if (data_rcv_buffer != nullptr)
+ if (data_buffer != nullptr)
{
- free(data_rcv_buffer);
- data_rcv_buffer = nullptr;
+ free(data_buffer);
+ data_buffer = nullptr;
}
- size_t data_rcv_size = 0;
+ size_t data_size = 0;
err = nodeCommTransferRecv(i_mProcInfo.tgt,
my_linkId,
my_mboxId,
NCT_TRANSFER_SBID,
- data_rcv_buffer,
- data_rcv_size);
+ data_buffer,
+ data_size);
if (err)
{
TRACFCOMP(g_trac_nc,INFO_MRK"nodeCommAbusExchangeSlave: "
"nodeCommTransferRecv returned an error");
break;
}
- // If no err is returned, data_rcv_buffer should be valid, but do a
+ // If no err is returned, data_buffer should be valid, but do a
// sanity check here to be certain
- assert(data_rcv_buffer!=nullptr,"nodeCommAbusExchangeSlave: data_rcv_buffer returned as nullptr");
+ assert(data_buffer!=nullptr,"nodeCommAbusExchangeSlave: data_buffer returned as nullptr");
// Add receiver Link Id to the message data
msg_format_t msg_data;
- memcpy(&(msg_data.value), data_rcv_buffer, data_rcv_size);
+ memcpy(&(msg_data.value), data_buffer, data_size);
msg_data.receiver_linkId = my_linkId;
TRACFCOMP(g_trac_nc,INFO_MRK"nodeCommAbusExchangeSlave: Msg received, "
@@ -1150,12 +1245,78 @@ errlHndl_t nodeCommAbusExchangeSlave(const master_proc_info_t & i_mProcInfo,
break;
}
+ // Wait for Quote Request from Master Node
+ if (data_buffer != nullptr)
+ {
+ free(data_buffer);
+ data_buffer = nullptr;
+ }
+ data_size = 0;
+ err = nodeCommTransferRecv(i_mProcInfo.tgt,
+ my_linkId,
+ my_mboxId,
+ NCT_TRANSFER_QUOTE_REQUEST,
+ data_buffer,
+ data_size);
+ if (err)
+ {
+ TRACFCOMP(g_trac_nc,INFO_MRK"nodeCommAbusExchangeSlave: "
+ "nodeCommTransferRecv returned an error");
+ break;
+ }
+ // If no err is returned, data_buffer should be valid, but do a
+ // sanity check here to be certain
+ assert(data_buffer!=nullptr,"nodeCommAbusExchangeSlave: data_buffer returned as nullptr");
+
+ // @TODO 203642 check that size back is size of MasterQuoteRequestBlob
+
+ // Cast the data received into a MasterQuoteRequestBlob
+ MasterQuoteRequestBlob quote_request{};
+ memcpy(&quote_request, data_buffer, data_size);
+
+ // re-use data_buffer and data_size for the Quote Response
+ if (data_buffer != nullptr)
+ {
+ free(data_buffer);
+ data_buffer = nullptr;
+ }
+ data_size = 0;
+
+ // Generate the Quote Response
+ err = nodeCommGenSlaveQuoteResponse(&quote_request,
+ data_size,
+ data_buffer);
+
+ if (err)
+ {
+ TRACFCOMP(g_trac_nc,INFO_MRK"nodeCommAbusExchangeSlave: "
+ "nodeCommGenSlaveQuoteResponse returned an error");
+ break;
+ }
+
+ // Send the Quote Response
+ err = nodeCommTransferSend(i_mProcInfo.tgt,
+ my_linkId,
+ my_mboxId,
+ NCT_TRANSFER_QUOTE_RESPONSE,
+ data_buffer,
+ data_size);
+
+ if (err)
+ {
+ TRACFCOMP(g_trac_nc,ERR_MRK"nodeCommAbusExchangeSlave: "
+ "nodeCommAbusTransferSend returned an error");
+ break;
+ }
+
+ // Nothing left for slave node to do
+
} while( 0 );
- if (data_rcv_buffer != nullptr)
+ if (data_buffer != nullptr)
{
- free(data_rcv_buffer);
- data_rcv_buffer = nullptr;
+ free(data_buffer);
+ data_buffer = nullptr;
}
OpenPOWER on IntegriCloud