diff options
Diffstat (limited to 'src/libcharon/plugins')
-rw-r--r-- | src/libcharon/plugins/tnc_imc/tnc_imc.c | 40 | ||||
-rw-r--r-- | src/libcharon/plugins/tnccs_20/tnccs_20.c | 41 |
2 files changed, 35 insertions, 46 deletions
diff --git a/src/libcharon/plugins/tnc_imc/tnc_imc.c b/src/libcharon/plugins/tnc_imc/tnc_imc.c index 6e0b4a53a..b3f5717a9 100644 --- a/src/libcharon/plugins/tnc_imc/tnc_imc.c +++ b/src/libcharon/plugins/tnc_imc/tnc_imc.c @@ -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); } /** diff --git a/src/libcharon/plugins/tnccs_20/tnccs_20.c b/src/libcharon/plugins/tnccs_20/tnccs_20.c index 2d6bdf5e8..5afc6e196 100644 --- a/src/libcharon/plugins/tnccs_20/tnccs_20.c +++ b/src/libcharon/plugins/tnccs_20/tnccs_20.c @@ -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); } |