send empty SDATA batch if no recommendation is available yet, but in order to avoid loops only if no empty CDATA batch was received

This commit is contained in:
Andreas Steffen
2012-07-11 17:09:05 +02:00
parent a5c79d0175
commit b8b678a567
4 changed files with 58 additions and 3 deletions
@@ -272,6 +272,8 @@ static status_t process_batch_header(private_pb_tnc_batch_t *this,
PB_ERROR_UNEXPECTED_BATCH_TYPE); PB_ERROR_UNEXPECTED_BATCH_TYPE);
goto fatal; goto fatal;
} }
DBG1(DBG_TNC, "processing PB-TNC %N batch", pb_tnc_batch_type_names,
this->type);
/* Batch Length */ /* Batch Length */
if (this->encoding.len != batch_len) if (this->encoding.len != batch_len)
@@ -284,6 +286,13 @@ static status_t process_batch_header(private_pb_tnc_batch_t *this,
} }
this->offset = PB_TNC_BATCH_HEADER_SIZE; this->offset = PB_TNC_BATCH_HEADER_SIZE;
/* Register an empty CDATA batch with the state machine */
if (this->type == PB_BATCH_CDATA)
{
state_machine->set_empty_cdata(state_machine,
this->offset == this->encoding.len);
}
return SUCCESS; return SUCCESS;
fatal: fatal:
@@ -459,8 +468,7 @@ METHOD(pb_tnc_batch_t, process, status_t,
{ {
return FAILED; return FAILED;
} }
DBG1(DBG_TNC, "processing PB-TNC %N batch", pb_tnc_batch_type_names,
this->type);
while (this->offset < this->encoding.len) while (this->offset < this->encoding.len)
{ {
switch (process_tnc_msg(this)) switch (process_tnc_msg(this))
@@ -70,6 +70,11 @@ struct private_pb_tnc_state_machine_t {
*/ */
bool is_server; bool is_server;
/**
* Informs whether last received PB-TNC CDATA Batch was empty
*/
bool empty_cdata;
/** /**
* Current PB-TNC state * Current PB-TNC state
*/ */
@@ -265,6 +270,22 @@ METHOD(pb_tnc_state_machine_t, send_batch, bool,
return TRUE; return TRUE;
} }
METHOD(pb_tnc_state_machine_t, get_empty_cdata, bool,
private_pb_tnc_state_machine_t *this)
{
return this->empty_cdata;
}
METHOD(pb_tnc_state_machine_t, set_empty_cdata, void,
private_pb_tnc_state_machine_t *this, bool empty)
{
if (empty)
{
DBG2(DBG_TNC, "received empty PB-TNC CDATA batch");
}
this->empty_cdata = empty;
}
METHOD(pb_tnc_state_machine_t, destroy, void, METHOD(pb_tnc_state_machine_t, destroy, void,
private_pb_tnc_state_machine_t *this) private_pb_tnc_state_machine_t *this)
{ {
@@ -283,6 +304,8 @@ pb_tnc_state_machine_t* pb_tnc_state_machine_create(bool is_server)
.get_state = _get_state, .get_state = _get_state,
.receive_batch = _receive_batch, .receive_batch = _receive_batch,
.send_batch = _send_batch, .send_batch = _send_batch,
.get_empty_cdata = _get_empty_cdata,
.set_empty_cdata = _set_empty_cdata,
.destroy = _destroy, .destroy = _destroy,
}, },
.is_server = is_server, .is_server = is_server,
@@ -72,6 +72,20 @@ struct pb_tnc_state_machine_t {
*/ */
bool (*send_batch)(pb_tnc_state_machine_t *this, pb_tnc_batch_type_t type); bool (*send_batch)(pb_tnc_state_machine_t *this, pb_tnc_batch_type_t type);
/**
* Informs whether the last received PB-TNC CDATA Batch was empty
*
* @result TRUE if last received PB-TNC CDATA Batch was empty
*/
bool (*get_empty_cdata)(pb_tnc_state_machine_t *this);
/**
* Store information whether the received PB-TNC CDATA Batch was empty
*
* @bool empty set to TRUE if received PB-TNC CDATA Batch was empty
*/
void (*set_empty_cdata)(pb_tnc_state_machine_t *this, bool empty);
/** /**
* Destroys a pb_tnc_state_machine_t object. * Destroys a pb_tnc_state_machine_t object.
*/ */
+11 -1
View File
@@ -632,7 +632,17 @@ METHOD(tls_t, build, status_t,
if (this->batch_type == PB_BATCH_NONE && this->is_server && if (this->batch_type == PB_BATCH_NONE && this->is_server &&
state == PB_STATE_SERVER_WORKING) state == PB_STATE_SERVER_WORKING)
{ {
check_and_build_recommendation(this); if (this->state_machine->get_empty_cdata(this->state_machine) ||
this->recs->have_recommendation(this->recs, NULL, NULL))
{
check_and_build_recommendation(this);
}
else
{
DBG2(DBG_TNC, "no recommendation available yet, "
"sending empty PB-TNC SDATA batch");
this->batch_type = PB_BATCH_SDATA;
}
} }
if (this->batch_type != PB_BATCH_NONE) if (this->batch_type != PB_BATCH_NONE)