implemented send_message() callback function

This commit is contained in:
Andreas Steffen
2010-11-09 20:43:50 +01:00
parent b25633314e
commit 2a647d5d50
5 changed files with 110 additions and 50 deletions
+3 -37
View File
@@ -18,7 +18,7 @@
#include <dlfcn.h>
#include <debug.h>
#include <library.h>
#include <daemon.h>
typedef struct private_tnc_imc_t private_tnc_imc_t;
@@ -166,42 +166,8 @@ TNC_Result TNC_TNCC_SendMessage(TNC_IMCID imc_id,
{
DBG2(DBG_TNC,"TNCC_SendMessage %u %u '%s' %u %0x", imc_id, connection_id,
message, message_len, message_type);
/*
-----TNCCS 2.0-----
tnc_tncc_connection* conn;
conn = libtnc_array_index(&connections, connectionID);
TNC_MessageSubtype message_type = messageType & TNC_SUBTYPE_ANY;
TNC_VendorID message_vendor_id = (messageType >> 8) & TNC_VENDORID_ANY;
chunk_t pa_message = tnc_create_pa_message(FALSE, message_vendor_id,
message_type, 0, 0, message, messageLength);
if(conn->current_batch.len)
{
chunk_t batch = conn->current_batch;
htoun32(batch.ptr + 4,batch.len + pa_message.len);
conn->current_batch = chunk_cat("cc", batch, pa_message);
}
else
{
chunk_t header = tnc_create_batch_header(TNCCS_BATCH_TYPE_CDATA, false);
htoun32(header.ptr + 4,header.len + pa_message.len);
conn->current_batch = chunk_cat("cc", header, pa_message);
}
-----TNCCS 1.1-----
libtnc_mutex_lock();
conn = libtnc_array_index(&connections, connectionID);
libtnc_mutex_unlock();
return libtnc_tncc_add_imc_imv_message(conn, message, messageLength, messageType);
*/
return TNC_RESULT_SUCCESS;
return charon->tnccs->send_message(charon->tnccs, connection_id, message,
message_len, message_type);
}
/**
+32 -9
View File
@@ -41,15 +41,32 @@ struct private_tnccs_20_t {
* Connection ID assigned to this TNCCS connection
*/
TNC_ConnectionID connection_id;
/**
* Batch being constructed
*/
chunk_t batch;
};
METHOD(tnccs_t, send_message, void,
private_tnccs_20_t* this, TNC_BufferReference message,
TNC_UInt32 message_len,
TNC_MessageType message_type)
{
chunk_t msg = { message, message_len },
batch = this->batch;
DBG1(DBG_TNC, "TNCCS 2.0 send message");
this->batch = chunk_cat("mc", batch, msg);
}
METHOD(tls_t, process, status_t,
private_tnccs_20_t *this, void *buf, size_t buflen)
{
if (this->is_server && !this->connection_id)
{
this->connection_id = charon->tnccs->create_connection(charon->tnccs,
(tnccs_t*)this);
(tnccs_t*)this, _send_message);
charon->imvs->notify_connection_change(charon->imvs,
this->connection_id, TNC_CONNECTION_STATE_CREATE);
}
@@ -63,12 +80,15 @@ METHOD(tls_t, process, status_t,
METHOD(tls_t, build, status_t,
private_tnccs_20_t *this, void *buf, size_t *buflen, size_t *msglen)
{
char *msg;
char *msg = this->is_server ? "|tncs->tncc 2.0|" : "|tncc->tncs 2.0|";
size_t len;
this->batch = chunk_clone(chunk_create(msg, strlen(msg)));
if (!this->is_server && !this->connection_id)
{
this->connection_id = charon->tnccs->create_connection(charon->tnccs,
(tnccs_t*)this);
(tnccs_t*)this, _send_message);
charon->imcs->notify_connection_change(charon->imcs,
this->connection_id, TNC_CONNECTION_STATE_CREATE);
charon->imcs->notify_connection_change(charon->imcs,
@@ -76,13 +96,15 @@ METHOD(tls_t, build, status_t,
charon->imcs->begin_handshake(charon->imcs, this->connection_id);
}
msg = this->is_server ? "tncs-tncc 2.0" : "tncc-tncs 2.0";
len = this->batch.len;
*msglen = len;
*buflen = len;
memcpy(buf, this->batch.ptr, len);
DBG1(DBG_TNC, "sending TNCCS Batch (%d bytes) for Connection ID %u",
strlen(msg), this->connection_id);
DBG3(DBG_TNC, "%s", msg);
*msglen = strlen(msg);
memcpy(buf, msg, *msglen);
*buflen = *msglen;
len, this->connection_id);
DBG3(DBG_TNC, "%.*s", len, buf);
chunk_free(&this->batch);
return ALREADY_DONE;
}
@@ -115,6 +137,7 @@ METHOD(tls_t, destroy, void,
private_tnccs_20_t *this)
{
charon->tnccs->remove_connection(charon->tnccs, this->connection_id);
free(this->batch.ptr);
free(this);
}