tnccs-20: Defer handshake retry when sending SRETRY batch

Set a retry_handshake flag on a TNC server when sending a SRETRY
batch and do the retry only after receiving the next CDATA batch
from the TNC client.
This commit is contained in:
Andreas Steffen
2018-08-01 15:44:49 +02:00
parent 731e043c8e
commit 6a59e1fa9e
@@ -91,6 +91,11 @@ struct private_tnccs_20_server_t {
*/
bool request_handshake_retry;
/**
* Flag set after sending SRETRY batch
*/
bool retry_handshake;
/**
* SendMessage() by IMV only allowed if flag is set
*/
@@ -279,8 +284,9 @@ static void build_retry_batch(private_tnccs_20_server_t *this)
change_batch_type(this, PB_BATCH_SRETRY);
this->recs->clear_recommendation(this->recs);
tnc->imvs->notify_connection_change(tnc->imvs, this->connection_id,
TNC_CONNECTION_STATE_HANDSHAKE);
/* Handshake will be retried with next incoming CDATA batch */
this->retry_handshake = TRUE;
}
METHOD(tnccs_20_handler_t, process, status_t,
@@ -301,7 +307,17 @@ METHOD(tnccs_20_handler_t, process, status_t,
pb_tnc_msg_t *msg;
bool empty = TRUE;
if (batch_type == PB_BATCH_CRETRY)
if (batch_type == PB_BATCH_CDATA)
{
/* retry handshake after a previous SRETRY batch */
if (this->retry_handshake)
{
tnc->imvs->notify_connection_change(tnc->imvs,
this->connection_id, TNC_CONNECTION_STATE_HANDSHAKE);
this->retry_handshake = FALSE;
}
}
else if (batch_type == PB_BATCH_CRETRY)
{
/* Send an SRETRY batch in response */
this->mutex->lock(this->mutex);