aboutsummaryrefslogtreecommitdiffstats
path: root/src/libcharon/plugins/tnccs_20/tnccs_20.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libcharon/plugins/tnccs_20/tnccs_20.c')
-rw-r--r--src/libcharon/plugins/tnccs_20/tnccs_20.c41
1 files changed, 32 insertions, 9 deletions
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);
}