implemented a makeshift non-scalable send buffer

This commit is contained in:
Andreas Steffen 2010-10-08 22:24:30 +02:00
parent 55960a170f
commit db2f66c2df
1 changed files with 82 additions and 25 deletions

View File

@ -20,7 +20,59 @@
#include <debug.h> #include <debug.h>
static chunk_t output; #define TNC_SEND_BUFFER_SIZE 32
static chunk_t tnc_send_buffer[TNC_SEND_BUFFER_SIZE];
/**
* Buffers TNCCS batch to be sent (TODO make the buffer scalable)
*/
static TNC_Result buffer_batch(u_int32_t id, const char *data, size_t len)
{
if (id >= TNC_SEND_BUFFER_SIZE)
{
DBG1(DBG_IKE, "TNCCS Batch with Connection ID %u cannot be stored in "
"send buffer with size %d", id, TNC_SEND_BUFFER_SIZE);
return TNC_RESULT_FATAL;
}
if (tnc_send_buffer[id].ptr)
{
DBG1(DBG_IKE, "send buffer slot for Connection ID %u is already "
"occupied", id);
return TNC_RESULT_FATAL;
}
tnc_send_buffer[id] = chunk_alloc(len);
memcpy(tnc_send_buffer[id].ptr, data, len);
return TNC_RESULT_SUCCESS;
}
/**
* Retrieves TNCCS batch to be sent
*/
static bool retrieve_batch(u_int32_t id, chunk_t *batch)
{
if (id >= TNC_SEND_BUFFER_SIZE)
{
DBG1(DBG_IKE, "TNCCS Batch with Connection ID %u cannot be retrieved from "
"send buffer with size %d", id, TNC_SEND_BUFFER_SIZE);
return FALSE;
}
*batch = tnc_send_buffer[id];
return TRUE;
}
/**
* Frees TNCCS batch that was sent
*/
static void free_batch(u_int32_t id)
{
if (id < TNC_SEND_BUFFER_SIZE)
{
chunk_free(&tnc_send_buffer[id]);
}
}
/** /**
* Define callback functions called by the libtnc library * Define callback functions called by the libtnc library
@ -28,21 +80,13 @@ static chunk_t output;
TNC_Result TNC_TNCC_SendBatch(libtnc_tncc_connection* conn, TNC_Result TNC_TNCC_SendBatch(libtnc_tncc_connection* conn,
const char* messageBuffer, size_t messageLength) const char* messageBuffer, size_t messageLength)
{ {
chunk_free(&output); return buffer_batch(conn->connectionID, messageBuffer, messageLength);
output = chunk_alloc(messageLength);
memcpy(output.ptr, messageBuffer, messageLength);
return TNC_RESULT_SUCCESS;
} }
TNC_Result TNC_TNCS_SendBatch(libtnc_tncs_connection* conn, TNC_Result TNC_TNCS_SendBatch(libtnc_tncs_connection* conn,
const char* messageBuffer, size_t messageLength) const char* messageBuffer, size_t messageLength)
{ {
chunk_free(&output); return buffer_batch(conn->connectionID, messageBuffer, messageLength);
output = chunk_alloc(messageLength);
memcpy(output.ptr, messageBuffer, messageLength);
return TNC_RESULT_SUCCESS;
} }
typedef struct private_tnccs_11_t private_tnccs_11_t; typedef struct private_tnccs_11_t private_tnccs_11_t;
@ -76,6 +120,8 @@ struct private_tnccs_11_t {
METHOD(tls_t, process, status_t, METHOD(tls_t, process, status_t,
private_tnccs_11_t *this, void *buf, size_t buflen) private_tnccs_11_t *this, void *buf, size_t buflen)
{ {
u_int32_t conn_id;
if (this->is_server && !this->tncs_connection) if (this->is_server && !this->tncs_connection)
{ {
this->tncs_connection = libtnc_tncs_CreateConnection(NULL); this->tncs_connection = libtnc_tncs_CreateConnection(NULL);
@ -84,16 +130,19 @@ METHOD(tls_t, process, status_t,
DBG1(DBG_IKE, "TNCS CreateConnection failed"); DBG1(DBG_IKE, "TNCS CreateConnection failed");
return FAILED; return FAILED;
} }
DBG1(DBG_IKE, "assigned TNCS Connection ID: %d", DBG1(DBG_IKE, "assigned TNCS Connection ID %u",
this->tncs_connection->connectionID); this->tncs_connection->connectionID);
if (libtnc_tncs_BeginSession(this->tncs_connection) != TNC_RESULT_SUCCESS) if (libtnc_tncs_BeginSession(this->tncs_connection) != TNC_RESULT_SUCCESS)
{ {
DBG1(DBG_IKE, "TNCS BeginSession failed"); DBG1(DBG_IKE, "TNCS BeginSession failed");
return FAILED; return FAILED;
} }
} }
conn_id = this->is_server ? this->tncs_connection->connectionID
: this->tncc_connection->connectionID;
DBG1(DBG_IKE, "received TNCCS Batch with %u bytes:", buflen); DBG1(DBG_IKE, "received TNCCS Batch of %u bytes for Connection ID %u:",
buflen, conn_id);
DBG1(DBG_IKE, "%.*s", buflen, buf); DBG1(DBG_IKE, "%.*s", buflen, buf);
if (this->is_server) if (this->is_server)
@ -120,6 +169,8 @@ METHOD(tls_t, process, status_t,
METHOD(tls_t, build, status_t, METHOD(tls_t, build, status_t,
private_tnccs_11_t *this, void *buf, size_t *buflen, size_t *msglen) private_tnccs_11_t *this, void *buf, size_t *buflen, size_t *msglen)
{ {
chunk_t batch;
u_int32_t conn_id;
size_t len; size_t len;
if (!this->is_server && !this->tncc_connection) if (!this->is_server && !this->tncc_connection)
@ -130,29 +181,36 @@ METHOD(tls_t, build, status_t,
DBG1(DBG_IKE, "TNCC CreateConnection failed"); DBG1(DBG_IKE, "TNCC CreateConnection failed");
return FAILED; return FAILED;
} }
DBG1(DBG_IKE, "assigned TNCC Connection ID: %d", DBG1(DBG_IKE, "assigned TNCC Connection ID %u",
this->tncc_connection->connectionID); this->tncc_connection->connectionID);
if (libtnc_tncc_BeginSession(this->tncc_connection) != TNC_RESULT_SUCCESS) if (libtnc_tncc_BeginSession(this->tncc_connection) != TNC_RESULT_SUCCESS)
{ {
DBG1(DBG_IKE, "TNCC BeginSession failed"); DBG1(DBG_IKE, "TNCC BeginSession failed");
return FAILED; return FAILED;
} }
} }
conn_id = this->is_server ? this->tncs_connection->connectionID
: this->tncc_connection->connectionID;
if (!retrieve_batch(conn_id, &batch))
{
return FAILED;
}
len = *buflen; len = *buflen;
len = min(len, output.len); len = min(len, batch.len);
*buflen = len; *buflen = len;
if (msglen) if (msglen)
{ {
*msglen = output.len; *msglen = batch.len;
} }
if (output.len) if (batch.len)
{ {
DBG1(DBG_IKE, "sending TNCCS Batch with %d bytes:", output.len); DBG1(DBG_IKE, "sending TNCCS Batch of %d bytes for Connection ID %u:",
DBG1(DBG_IKE, "%.*s", output.len, output.ptr); batch.len, conn_id);
memcpy(buf, output.ptr, len); DBG1(DBG_IKE, "%.*s", batch.len, batch.ptr);
chunk_free(&output); memcpy(buf, batch.ptr, len);
free_batch(conn_id);
return ALREADY_DONE; return ALREADY_DONE;
} }
else else
@ -224,7 +282,6 @@ METHOD(tls_t, destroy, void,
*/ */
tls_t *tnccs_11_create(bool is_server) tls_t *tnccs_11_create(bool is_server)
{ {
char *tnc_config, *pref_lang;
private_tnccs_11_t *this; private_tnccs_11_t *this;
INIT(this, INIT(this,