aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libimcv/imc/imc_agent.c55
-rw-r--r--src/libimcv/imv/imv_agent.c53
2 files changed, 91 insertions, 17 deletions
diff --git a/src/libimcv/imc/imc_agent.c b/src/libimcv/imc/imc_agent.c
index 82778a5b6..a59c02857 100644
--- a/src/libimcv/imc/imc_agent.c
+++ b/src/libimcv/imc/imc_agent.c
@@ -39,9 +39,14 @@ struct private_imc_agent_t {
const char *name;
/**
- * message type of IMC
+ * message vendor ID of IMC
*/
- TNC_MessageType type;
+ TNC_VendorID vendor_id;
+
+ /**
+ * message subtype of IMC
+ */
+ TNC_MessageSubtype subtype;
/**
* ID of IMC as assigned by TNCC
@@ -54,12 +59,12 @@ struct private_imc_agent_t {
linked_list_t *connections;
/**
- * rwlock to lock TNCS connection entries
+ * rwlock to lock TNCC connection entries
*/
rwlock_t *connection_lock;
/**
- * Inform a TNCS about the set of message types the IMC is able to receive
+ * Inform a TNCC about the set of message types the IMC is able to receive
*
* @param imc_id IMC ID assigned by TNCC
* @param supported_types list of supported message types
@@ -71,6 +76,20 @@ struct private_imc_agent_t {
TNC_UInt32 type_count);
/**
+ * Inform a TNCC about the set of message types the IMC is able to receive
+ *
+ * @param imc_id IMC ID assigned by TNCC
+ * @param supported_vids list of supported message vendor IDs
+ * @param supported_subtypes list of supported message subtypes
+ * @param type_count number of list elements
+ * @return TNC result code
+ */
+ TNC_Result (*report_message_types_long)(TNC_IMCID imc_id,
+ TNC_VendorIDList supported_vids,
+ TNC_MessageSubtypeList supported_subtypes,
+ TNC_UInt32 type_count);
+
+ /**
* Call when an IMC-IMC message is to be sent
*
* @param imc_id IMC ID assigned by TNCC
@@ -100,6 +119,11 @@ METHOD(imc_agent_t, bind_functions, TNC_Result,
{
this->report_message_types = NULL;
}
+ if (bind_function(this->id, "TNC_TNCC_ReportMessageTypesLong",
+ (void**)&this->report_message_types_long) != TNC_RESULT_SUCCESS)
+ {
+ this->report_message_types_long = NULL;
+ }
if (bind_function(this->id, "TNC_TNCC_RequestHandshakeRetry",
(void**)&this->public.request_handshake_retry) != TNC_RESULT_SUCCESS)
{
@@ -113,9 +137,19 @@ METHOD(imc_agent_t, bind_functions, TNC_Result,
DBG2(DBG_IMC, "IMC %u \"%s\" provided with bind function",
this->id, this->name);
- if (this->report_message_types)
+ if (this->report_message_types_long)
{
- this->report_message_types(this->id, &this->type, 1);
+ this->report_message_types_long(this->id, &this->vendor_id,
+ &this->subtype, 1);
+ }
+ else if (this->report_message_types &&
+ this->vendor_id <= TNC_VENDORID_ANY &&
+ this->subtype <= TNC_SUBTYPE_ANY)
+ {
+ TNC_MessageType type;
+
+ type = (this->vendor_id << 8) | this->subtype;
+ this->report_message_types(this->id, &type, 1);
}
return TNC_RESULT_SUCCESS;
}
@@ -271,12 +305,14 @@ METHOD(imc_agent_t, get_state, bool,
METHOD(imc_agent_t, send_message, TNC_Result,
private_imc_agent_t *this, TNC_ConnectionID connection_id, chunk_t msg)
{
+ TNC_MessageType type;
+
if (!this->send_message)
{
return TNC_RESULT_FATAL;
}
- return this->send_message(this->id, connection_id, msg.ptr, msg.len,
- this->type);
+ type = (this->vendor_id << 8) | this->subtype;
+ return this->send_message(this->id, connection_id, msg.ptr, msg.len, type);
}
METHOD(imc_agent_t, receive_message, TNC_Result,
@@ -373,7 +409,8 @@ imc_agent_t *imc_agent_create(const char *name,
.destroy = _destroy,
},
.name = name,
- .type = (vendor_id << 8) | (subtype & 0xff),
+ .vendor_id = vendor_id,
+ .subtype = subtype,
.id = id,
.connections = linked_list_create(),
.connection_lock = rwlock_create(RWLOCK_TYPE_DEFAULT),
diff --git a/src/libimcv/imv/imv_agent.c b/src/libimcv/imv/imv_agent.c
index 290bb1147..1b9c0454d 100644
--- a/src/libimcv/imv/imv_agent.c
+++ b/src/libimcv/imv/imv_agent.c
@@ -39,9 +39,14 @@ struct private_imv_agent_t {
const char *name;
/**
- * message type of IMV
+ * message vendor ID of IMV
*/
- TNC_MessageType type;
+ TNC_VendorID vendor_id;
+
+ /**
+ * message subtype of IMV
+ */
+ TNC_MessageSubtype subtype;
/**
* ID of IMV as assigned by TNCS
@@ -59,7 +64,7 @@ struct private_imv_agent_t {
rwlock_t *connection_lock;
/**
- * Inform a TNCS about the set of message types the IMV is able to receive
+ * Inform a TNCS about the set of message types the IMV is able to receive
*
* @param imv_id IMV ID assigned by TNCS
* @param supported_types list of supported message types
@@ -71,6 +76,20 @@ struct private_imv_agent_t {
TNC_UInt32 type_count);
/**
+ * Inform a TNCS about the set of message types the IMV is able to receive
+ *
+ * @param imv_id IMV ID assigned by TNCS
+ * @param supported_vids list of supported message vendor IDs
+ * @param supported_subtypes list of supported message subtypes
+ * @param type_count number of list elements
+ * @return TNC result code
+ */
+ TNC_Result (*report_message_types_long)(TNC_IMVID imv_id,
+ TNC_VendorIDList supported_vids,
+ TNC_MessageSubtypeList supported_subtypes,
+ TNC_UInt32 type_count);
+
+ /**
* Call when an IMV-IMC message is to be sent
*
* @param imv_id IMV ID assigned by TNCS
@@ -150,6 +169,11 @@ METHOD(imv_agent_t, bind_functions, TNC_Result,
{
this->report_message_types = NULL;
}
+ if (bind_function(this->id, "TNC_TNCS_ReportMessageTypesLong",
+ (void**)&this->report_message_types_long) != TNC_RESULT_SUCCESS)
+ {
+ this->report_message_types_long = NULL;
+ }
if (bind_function(this->id, "TNC_TNCS_RequestHandshakeRetry",
(void**)&this->public.request_handshake_retry) != TNC_RESULT_SUCCESS)
{
@@ -178,9 +202,19 @@ METHOD(imv_agent_t, bind_functions, TNC_Result,
DBG2(DBG_IMV, "IMV %u \"%s\" provided with bind function",
this->id, this->name);
- if (this->report_message_types)
+ if (this->report_message_types_long)
{
- this->report_message_types(this->id, &this->type, 1);
+ this->report_message_types_long(this->id, &this->vendor_id,
+ &this->subtype, 1);
+ }
+ else if (this->report_message_types &&
+ this->vendor_id <= TNC_VENDORID_ANY &&
+ this->subtype <= TNC_SUBTYPE_ANY)
+ {
+ TNC_MessageType type;
+
+ type = (this->vendor_id << 8) | this->subtype;
+ this->report_message_types(this->id, &type, 1);
}
return TNC_RESULT_SUCCESS;
}
@@ -335,12 +369,14 @@ METHOD(imv_agent_t, get_state, bool,
METHOD(imv_agent_t, send_message, TNC_Result,
private_imv_agent_t *this, TNC_ConnectionID connection_id, chunk_t msg)
{
+ TNC_MessageType type;
+
if (!this->send_message)
{
return TNC_RESULT_FATAL;
}
- return this->send_message(this->id, connection_id, msg.ptr, msg.len,
- this->type);
+ type = (this->vendor_id << 8) | this->subtype;
+ return this->send_message(this->id, connection_id, msg.ptr, msg.len, type);
}
METHOD(imv_agent_t, set_recommendation, TNC_Result,
@@ -513,7 +549,8 @@ imv_agent_t *imv_agent_create(const char *name,
.destroy = _destroy,
},
.name = name,
- .type = (vendor_id << 8) | (subtype & 0xff),
+ .vendor_id = vendor_id,
+ .subtype = subtype,
.id = id,
.connections = linked_list_create(),
.connection_lock = rwlock_create(RWLOCK_TYPE_DEFAULT),