adapted state_machine for retry batches
This commit is contained in:
@@ -107,7 +107,8 @@ METHOD(pb_tnc_state_machine_t, receive_batch, bool,
|
|||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
case PB_STATE_SERVER_WORKING:
|
case PB_STATE_SERVER_WORKING:
|
||||||
if (!this->is_server && type == PB_BATCH_SDATA)
|
if (!this->is_server && (type == PB_BATCH_SDATA ||
|
||||||
|
type == PB_BATCH_SRETRY))
|
||||||
{
|
{
|
||||||
this->state = PB_STATE_CLIENT_WORKING;
|
this->state = PB_STATE_CLIENT_WORKING;
|
||||||
break;
|
break;
|
||||||
@@ -117,8 +118,7 @@ METHOD(pb_tnc_state_machine_t, receive_batch, bool,
|
|||||||
this->state = PB_STATE_DECIDED;
|
this->state = PB_STATE_DECIDED;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((this->is_server && type == PB_BATCH_CRETRY) ||
|
if (this->is_server && type == PB_BATCH_CRETRY)
|
||||||
(!this->is_server && type == PB_BATCH_SRETRY))
|
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -198,7 +198,8 @@ METHOD(pb_tnc_state_machine_t, send_batch, bool,
|
|||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
case PB_STATE_SERVER_WORKING:
|
case PB_STATE_SERVER_WORKING:
|
||||||
if (this->is_server && type == PB_BATCH_SDATA)
|
if (this->is_server && (type == PB_BATCH_SDATA ||
|
||||||
|
type == PB_BATCH_SRETRY))
|
||||||
{
|
{
|
||||||
this->state = PB_STATE_CLIENT_WORKING;
|
this->state = PB_STATE_CLIENT_WORKING;
|
||||||
break;
|
break;
|
||||||
@@ -208,7 +209,7 @@ METHOD(pb_tnc_state_machine_t, send_batch, bool,
|
|||||||
this->state = PB_STATE_DECIDED;
|
this->state = PB_STATE_DECIDED;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (this->is_server && type == PB_BATCH_SRETRY)
|
if (!this->is_server && type == PB_BATCH_CRETRY)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -219,11 +220,16 @@ METHOD(pb_tnc_state_machine_t, send_batch, bool,
|
|||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
case PB_STATE_CLIENT_WORKING:
|
case PB_STATE_CLIENT_WORKING:
|
||||||
if (!this->is_server && type == PB_BATCH_CDATA)
|
if (!this->is_server && (type == PB_BATCH_CDATA ||
|
||||||
|
type == PB_BATCH_CRETRY))
|
||||||
{
|
{
|
||||||
this->state = PB_STATE_SERVER_WORKING;
|
this->state = PB_STATE_SERVER_WORKING;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (this->is_server && type == PB_BATCH_SRETRY)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (type == PB_BATCH_CLOSE)
|
if (type == PB_BATCH_CLOSE)
|
||||||
{
|
{
|
||||||
this->state = PB_STATE_END;
|
this->state = PB_STATE_END;
|
||||||
|
|||||||
@@ -289,14 +289,21 @@ static void handle_message(private_tnccs_20_t *this, pb_tnc_msg_t *msg)
|
|||||||
*/
|
*/
|
||||||
static void build_retry_batch(private_tnccs_20_t *this)
|
static void build_retry_batch(private_tnccs_20_t *this)
|
||||||
{
|
{
|
||||||
|
pb_tnc_batch_type_t batch_retry_type;
|
||||||
|
|
||||||
|
batch_retry_type = this->is_server ? PB_BATCH_SRETRY : PB_BATCH_CRETRY;
|
||||||
if (this->batch)
|
if (this->batch)
|
||||||
{
|
{
|
||||||
|
if (this->batch->get_type(this->batch) == batch_retry_type)
|
||||||
|
{
|
||||||
|
/* retry batch has already been created */
|
||||||
|
return;
|
||||||
|
}
|
||||||
DBG1(DBG_TNC, "cancelling PB-TNC %N batch",
|
DBG1(DBG_TNC, "cancelling PB-TNC %N batch",
|
||||||
pb_tnc_batch_type_names, this->batch->get_type(this->batch));
|
pb_tnc_batch_type_names, this->batch->get_type(this->batch));
|
||||||
this->batch->destroy(this->batch);
|
this->batch->destroy(this->batch);
|
||||||
}
|
}
|
||||||
this->batch = pb_tnc_batch_create(this->is_server,
|
this->batch = pb_tnc_batch_create(this->is_server, batch_retry_type);
|
||||||
this->is_server ? PB_BATCH_SRETRY : PB_BATCH_CRETRY);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(tls_t, process, status_t,
|
METHOD(tls_t, process, status_t,
|
||||||
@@ -465,6 +472,7 @@ METHOD(tls_t, build, status_t,
|
|||||||
private_tnccs_20_t *this, void *buf, size_t *buflen, size_t *msglen)
|
private_tnccs_20_t *this, void *buf, size_t *buflen, size_t *msglen)
|
||||||
{
|
{
|
||||||
status_t status;
|
status_t status;
|
||||||
|
pb_tnc_state_t state;
|
||||||
|
|
||||||
/* Initialize the connection */
|
/* Initialize the connection */
|
||||||
if (!this->is_server && !this->connection_id)
|
if (!this->is_server && !this->connection_id)
|
||||||
@@ -496,8 +504,9 @@ METHOD(tls_t, build, status_t,
|
|||||||
charon->imcs->begin_handshake(charon->imcs, this->connection_id);
|
charon->imcs->begin_handshake(charon->imcs, this->connection_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->is_server && this->fatal_error &&
|
state = this->state_machine->get_state(this->state_machine);
|
||||||
this->state_machine->get_state(this->state_machine) == PB_STATE_END)
|
|
||||||
|
if (this->is_server && this->fatal_error && state == PB_STATE_END)
|
||||||
{
|
{
|
||||||
DBG1(DBG_TNC, "a fatal PB-TNC error occurred, terminating connection");
|
DBG1(DBG_TNC, "a fatal PB-TNC error occurred, terminating connection");
|
||||||
return FAILED;
|
return FAILED;
|
||||||
@@ -508,7 +517,10 @@ METHOD(tls_t, build, status_t,
|
|||||||
|
|
||||||
if (this->request_handshake_retry)
|
if (this->request_handshake_retry)
|
||||||
{
|
{
|
||||||
build_retry_batch(this);
|
if (state != PB_STATE_INIT)
|
||||||
|
{
|
||||||
|
build_retry_batch(this);
|
||||||
|
}
|
||||||
|
|
||||||
/* Reset the flag for the next handshake retry request */
|
/* Reset the flag for the next handshake retry request */
|
||||||
this->request_handshake_retry = FALSE;
|
this->request_handshake_retry = FALSE;
|
||||||
@@ -516,9 +528,6 @@ METHOD(tls_t, build, status_t,
|
|||||||
|
|
||||||
if (!this->batch)
|
if (!this->batch)
|
||||||
{
|
{
|
||||||
pb_tnc_state_t state;
|
|
||||||
|
|
||||||
state = this->state_machine->get_state(this->state_machine);
|
|
||||||
if (this->is_server)
|
if (this->is_server)
|
||||||
{
|
{
|
||||||
if (state == PB_STATE_SERVER_WORKING)
|
if (state == PB_STATE_SERVER_WORKING)
|
||||||
|
|||||||
Reference in New Issue
Block a user