added TNC_TNCC_ReportMessageTypesLong() and TNC_TNCS_ReportMessageTypesLong() messages
This commit is contained in:
@@ -17,6 +17,8 @@
|
|||||||
|
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
|
||||||
|
#include <tncif_pa_subtypes.h>
|
||||||
|
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <library.h>
|
#include <library.h>
|
||||||
#include <threading/mutex.h>
|
#include <threading/mutex.h>
|
||||||
@@ -54,9 +56,14 @@ struct private_tnc_imc_t {
|
|||||||
TNC_IMCID id;
|
TNC_IMCID id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of message types supported by IMC
|
* List of message types supported by IMC - Vendor ID part
|
||||||
*/
|
*/
|
||||||
TNC_MessageTypeList supported_types;
|
TNC_VendorIDList supported_vids;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of message types supported by IMC - Subtype part
|
||||||
|
*/
|
||||||
|
TNC_MessageSubtypeList supported_subtypes;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Number of supported message types
|
* Number of supported message types
|
||||||
@@ -91,28 +98,119 @@ METHOD(imc_t, set_message_types, void,
|
|||||||
private_tnc_imc_t *this, TNC_MessageTypeList supported_types,
|
private_tnc_imc_t *this, TNC_MessageTypeList supported_types,
|
||||||
TNC_UInt32 type_count)
|
TNC_UInt32 type_count)
|
||||||
{
|
{
|
||||||
char buf[512];
|
char buf[BUF_LEN];
|
||||||
char *pos = buf;
|
char *pos = buf;
|
||||||
int len = sizeof(buf);
|
int len = sizeof(buf);
|
||||||
int written;
|
int i, written;
|
||||||
|
size_t size;
|
||||||
|
TNC_VendorID vid;
|
||||||
|
TNC_MessageSubtype subtype;
|
||||||
|
enum_name_t *pa_subtype_names;
|
||||||
|
|
||||||
/* lock the imc_t instance */
|
/* lock the imc_t instance */
|
||||||
this->mutex->lock(this->mutex);
|
this->mutex->lock(this->mutex);
|
||||||
|
|
||||||
/* Free an existing MessageType list */
|
/* Free existing VendorID and MessageSubtype lists */
|
||||||
free(this->supported_types);
|
free(this->supported_vids);
|
||||||
this->supported_types = NULL;
|
this->supported_vids = NULL;
|
||||||
|
free(this->supported_subtypes);
|
||||||
|
this->supported_subtypes = NULL;
|
||||||
|
|
||||||
/* Store the new MessageType list */
|
/* Store the new MessageType list */
|
||||||
this->type_count = type_count;
|
this->type_count = type_count;
|
||||||
if (type_count && supported_types)
|
if (type_count && supported_types)
|
||||||
{
|
{
|
||||||
size_t size = type_count * sizeof(TNC_MessageType);
|
size = type_count * sizeof(TNC_VendorID);
|
||||||
int i;
|
this->supported_vids = malloc(size);
|
||||||
|
size = type_count * sizeof(TNC_MessageSubtype);
|
||||||
|
this->supported_subtypes = malloc(size);
|
||||||
|
|
||||||
for (i = 0; i < type_count; i++)
|
for (i = 0; i < type_count; i++)
|
||||||
{
|
{
|
||||||
written = snprintf(pos, len, " 0x%08x", supported_types[i]);
|
vid = (supported_types[i] >> 8) & TNC_VENDORID_ANY;
|
||||||
|
subtype = supported_types[i] & TNC_SUBTYPE_ANY;
|
||||||
|
|
||||||
|
pa_subtype_names = get_pa_subtype_names(vid);
|
||||||
|
if (pa_subtype_names)
|
||||||
|
{
|
||||||
|
written = snprintf(pos, len," '%N/%N' 0x%06x/0x%02x",
|
||||||
|
pen_names, vid, pa_subtype_names, subtype,
|
||||||
|
vid, subtype);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
written = snprintf(pos, len," '%N' 0x%06x/0x%02x",
|
||||||
|
pen_names, vid, vid, subtype);
|
||||||
|
}
|
||||||
|
if (written >= len)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pos += written;
|
||||||
|
len -= written;
|
||||||
|
|
||||||
|
this->supported_vids[i] = vid;
|
||||||
|
this->supported_subtypes[i] = subtype;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*pos = '\0';
|
||||||
|
DBG2(DBG_TNC, "IMC %u supports %u message type%s:%s",
|
||||||
|
this->id, type_count, (type_count == 1) ? "":"s", buf);
|
||||||
|
|
||||||
|
/* unlock the imc_t instance */
|
||||||
|
this->mutex->unlock(this->mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
METHOD(imc_t, set_message_types_long, void,
|
||||||
|
private_tnc_imc_t *this, TNC_VendorIDList supported_vids,
|
||||||
|
TNC_MessageSubtypeList supported_subtypes, TNC_UInt32 type_count)
|
||||||
|
{
|
||||||
|
char buf[BUF_LEN];
|
||||||
|
char *pos = buf;
|
||||||
|
int len = sizeof(buf);
|
||||||
|
int i, written;
|
||||||
|
size_t size;
|
||||||
|
TNC_VendorID vid;
|
||||||
|
TNC_MessageSubtype subtype;
|
||||||
|
enum_name_t *pa_subtype_names;
|
||||||
|
|
||||||
|
/* lock the imc_t instance */
|
||||||
|
this->mutex->lock(this->mutex);
|
||||||
|
|
||||||
|
/* Free existing VendorID and MessageSubtype lists */
|
||||||
|
free(this->supported_vids);
|
||||||
|
this->supported_vids = NULL;
|
||||||
|
free(this->supported_subtypes);
|
||||||
|
this->supported_subtypes = NULL;
|
||||||
|
|
||||||
|
/* Store the new MessageType list */
|
||||||
|
this->type_count = type_count;
|
||||||
|
if (type_count && supported_vids && supported_subtypes)
|
||||||
|
{
|
||||||
|
size = type_count * sizeof(TNC_VendorID);
|
||||||
|
this->supported_vids = malloc(size);
|
||||||
|
memcpy(this->supported_vids, supported_vids, size);
|
||||||
|
size = type_count * sizeof(TNC_MessageSubtype);
|
||||||
|
this->supported_subtypes = malloc(size);
|
||||||
|
memcpy(this->supported_subtypes, supported_subtypes, size);
|
||||||
|
|
||||||
|
for (i = 0; i < type_count; i++)
|
||||||
|
{
|
||||||
|
vid = supported_vids[i];
|
||||||
|
subtype = supported_subtypes[i];
|
||||||
|
|
||||||
|
pa_subtype_names = get_pa_subtype_names(vid);
|
||||||
|
if (pa_subtype_names)
|
||||||
|
{
|
||||||
|
written = snprintf(pos, len," '%N/%N' 0x%06x/0x%08x",
|
||||||
|
pen_names, vid, pa_subtype_names, subtype,
|
||||||
|
vid, subtype);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
written = snprintf(pos, len," '%N' 0x%06x/0x%08x",
|
||||||
|
pen_names, vid, vid, subtype);
|
||||||
|
}
|
||||||
if (written >= len)
|
if (written >= len)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
@@ -120,14 +218,12 @@ METHOD(imc_t, set_message_types, void,
|
|||||||
pos += written;
|
pos += written;
|
||||||
len -= written;
|
len -= written;
|
||||||
}
|
}
|
||||||
this->supported_types = malloc(size);
|
|
||||||
memcpy(this->supported_types, supported_types, size);
|
|
||||||
}
|
}
|
||||||
*pos = '\0';
|
*pos = '\0';
|
||||||
DBG2(DBG_TNC, "IMC %u supports %u message type%s:%s",
|
DBG2(DBG_TNC, "IMC %u supports %u message type%s:%s",
|
||||||
this->id, type_count, (type_count == 1) ? "":"s", buf);
|
this->id, type_count, (type_count == 1) ? "":"s", buf);
|
||||||
|
|
||||||
/* lock the imc_t instance */
|
/* unlock the imc_t instance */
|
||||||
this->mutex->unlock(this->mutex);
|
this->mutex->unlock(this->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -143,14 +239,12 @@ METHOD(imc_t, type_supported, bool,
|
|||||||
|
|
||||||
for (i = 0; i < this->type_count; i++)
|
for (i = 0; i < this->type_count; i++)
|
||||||
{
|
{
|
||||||
vid = (this->supported_types[i] >> 8) & TNC_VENDORID_ANY;
|
vid = this->supported_vids[i];
|
||||||
subtype = this->supported_types[i] & TNC_SUBTYPE_ANY;
|
subtype = this->supported_subtypes[i];
|
||||||
|
|
||||||
if (this->supported_types[i] == message_type
|
if ((vid == TNC_VENDORID_ANY && subtype == TNC_SUBTYPE_ANY) ||
|
||||||
|| (subtype == TNC_SUBTYPE_ANY
|
(vid == msg_vid && (subtype == TNC_SUBTYPE_ANY ||
|
||||||
&& (msg_vid == vid || vid == TNC_VENDORID_ANY))
|
subtype == msg_subtype)))
|
||||||
|| (vid == TNC_VENDORID_ANY
|
|
||||||
&& (msg_subtype == subtype || subtype == TNC_SUBTYPE_ANY)))
|
|
||||||
{
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -163,7 +257,8 @@ METHOD(imc_t, destroy, void,
|
|||||||
{
|
{
|
||||||
dlclose(this->handle);
|
dlclose(this->handle);
|
||||||
this->mutex->destroy(this->mutex);
|
this->mutex->destroy(this->mutex);
|
||||||
free(this->supported_types);
|
free(this->supported_vids);
|
||||||
|
free(this->supported_subtypes);
|
||||||
free(this->name);
|
free(this->name);
|
||||||
free(this->path);
|
free(this->path);
|
||||||
free(this);
|
free(this);
|
||||||
@@ -182,6 +277,7 @@ imc_t* tnc_imc_create(char *name, char *path)
|
|||||||
.get_id = _get_id,
|
.get_id = _get_id,
|
||||||
.get_name = _get_name,
|
.get_name = _get_name,
|
||||||
.set_message_types = _set_message_types,
|
.set_message_types = _set_message_types,
|
||||||
|
.set_message_types_long = _set_message_types_long,
|
||||||
.type_supported = _type_supported,
|
.type_supported = _type_supported,
|
||||||
.destroy = _destroy,
|
.destroy = _destroy,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -37,6 +37,25 @@ TNC_Result TNC_TNCC_ReportMessageTypes(TNC_IMCID imc_id,
|
|||||||
type_count);
|
type_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called by the IMC to inform a TNCC about the set of message types the IMC
|
||||||
|
* is able to receive. This function supports long message types.
|
||||||
|
*/
|
||||||
|
TNC_Result TNC_TNCC_ReportMessageTypesLong(TNC_IMCID imc_id,
|
||||||
|
TNC_VendorIDList supported_vids,
|
||||||
|
TNC_MessageSubtypeList supported_subtypes,
|
||||||
|
TNC_UInt32 type_count)
|
||||||
|
{
|
||||||
|
if (!tnc->imcs->is_registered(tnc->imcs, imc_id))
|
||||||
|
{
|
||||||
|
DBG1(DBG_TNC, "ignoring ReportMessageTypes() from unregistered IMC %u",
|
||||||
|
imc_id);
|
||||||
|
return TNC_RESULT_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
return tnc->imcs->set_message_types_long(tnc->imcs, imc_id, supported_vids,
|
||||||
|
supported_subtypes, type_count);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called by the IMC to ask a TNCC to retry an Integrity Check Handshake
|
* Called by the IMC to ask a TNCC to retry an Integrity Check Handshake
|
||||||
*/
|
*/
|
||||||
@@ -84,6 +103,10 @@ TNC_Result TNC_TNCC_BindFunction(TNC_IMCID id,
|
|||||||
{
|
{
|
||||||
*function_pointer = (void*)TNC_TNCC_ReportMessageTypes;
|
*function_pointer = (void*)TNC_TNCC_ReportMessageTypes;
|
||||||
}
|
}
|
||||||
|
else if (streq(function_name, "TNC_TNCC_ReportMessageTypesLong"))
|
||||||
|
{
|
||||||
|
*function_pointer = (void*)TNC_TNCC_ReportMessageTypesLong;
|
||||||
|
}
|
||||||
else if (streq(function_name, "TNC_TNCC_RequestHandshakeRetry"))
|
else if (streq(function_name, "TNC_TNCC_RequestHandshakeRetry"))
|
||||||
{
|
{
|
||||||
*function_pointer = (void*)TNC_TNCC_RequestHandshakeRetry;
|
*function_pointer = (void*)TNC_TNCC_RequestHandshakeRetry;
|
||||||
|
|||||||
@@ -203,6 +203,31 @@ METHOD(imc_manager_t, set_message_types, TNC_Result,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
METHOD(imc_manager_t, set_message_types_long, TNC_Result,
|
||||||
|
private_tnc_imc_manager_t *this, TNC_IMCID id,
|
||||||
|
TNC_VendorIDList supported_vids,
|
||||||
|
TNC_MessageSubtypeList supported_subtypes,
|
||||||
|
TNC_UInt32 type_count)
|
||||||
|
{
|
||||||
|
enumerator_t *enumerator;
|
||||||
|
imc_t *imc;
|
||||||
|
TNC_Result result = TNC_RESULT_FATAL;
|
||||||
|
|
||||||
|
enumerator = this->imcs->create_enumerator(this->imcs);
|
||||||
|
while (enumerator->enumerate(enumerator, &imc))
|
||||||
|
{
|
||||||
|
if (id == imc->get_id(imc))
|
||||||
|
{
|
||||||
|
imc->set_message_types_long(imc, supported_vids, supported_subtypes,
|
||||||
|
type_count);
|
||||||
|
result = TNC_RESULT_SUCCESS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
enumerator->destroy(enumerator);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
METHOD(imc_manager_t, receive_message, void,
|
METHOD(imc_manager_t, receive_message, void,
|
||||||
private_tnc_imc_manager_t *this, TNC_ConnectionID connection_id,
|
private_tnc_imc_manager_t *this, TNC_ConnectionID connection_id,
|
||||||
TNC_BufferReference message,
|
TNC_BufferReference message,
|
||||||
@@ -283,6 +308,7 @@ imc_manager_t* tnc_imc_manager_create(void)
|
|||||||
.notify_connection_change = _notify_connection_change,
|
.notify_connection_change = _notify_connection_change,
|
||||||
.begin_handshake = _begin_handshake,
|
.begin_handshake = _begin_handshake,
|
||||||
.set_message_types = _set_message_types,
|
.set_message_types = _set_message_types,
|
||||||
|
.set_message_types_long = _set_message_types_long,
|
||||||
.receive_message = _receive_message,
|
.receive_message = _receive_message,
|
||||||
.batch_ending = _batch_ending,
|
.batch_ending = _batch_ending,
|
||||||
.destroy = _destroy,
|
.destroy = _destroy,
|
||||||
|
|||||||
@@ -17,6 +17,8 @@
|
|||||||
|
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
|
||||||
|
#include <tncif_pa_subtypes.h>
|
||||||
|
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <library.h>
|
#include <library.h>
|
||||||
#include <threading/mutex.h>
|
#include <threading/mutex.h>
|
||||||
@@ -54,9 +56,14 @@ struct private_tnc_imv_t {
|
|||||||
TNC_IMVID id;
|
TNC_IMVID id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of message types supported by IMC
|
* List of message types supported by IMV - Vendor ID part
|
||||||
*/
|
*/
|
||||||
TNC_MessageTypeList supported_types;
|
TNC_VendorIDList supported_vids;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of message types supported by IMV - Subtype part
|
||||||
|
*/
|
||||||
|
TNC_MessageSubtypeList supported_subtypes;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Number of supported message types
|
* Number of supported message types
|
||||||
@@ -91,29 +98,119 @@ METHOD(imv_t, set_message_types, void,
|
|||||||
private_tnc_imv_t *this, TNC_MessageTypeList supported_types,
|
private_tnc_imv_t *this, TNC_MessageTypeList supported_types,
|
||||||
TNC_UInt32 type_count)
|
TNC_UInt32 type_count)
|
||||||
{
|
{
|
||||||
char buf[512];
|
char buf[BUF_LEN];
|
||||||
char *pos = buf;
|
char *pos = buf;
|
||||||
int len = sizeof(buf);
|
int len = sizeof(buf);
|
||||||
int written;
|
int i, written;
|
||||||
|
size_t size;
|
||||||
|
TNC_VendorID vid;
|
||||||
|
TNC_MessageSubtype subtype;
|
||||||
|
enum_name_t *pa_subtype_names;
|
||||||
|
|
||||||
/* lock the imv_t instance */
|
/* lock the imv_t instance */
|
||||||
this->mutex->lock(this->mutex);
|
this->mutex->lock(this->mutex);
|
||||||
|
|
||||||
/* Free an existing MessageType list */
|
/* Free existing VendorID and MessageSubtype lists */
|
||||||
free(this->supported_types);
|
free(this->supported_vids);
|
||||||
this->supported_types = NULL;
|
this->supported_vids = NULL;
|
||||||
|
free(this->supported_subtypes);
|
||||||
|
this->supported_subtypes = NULL;
|
||||||
|
|
||||||
/* Store the new MessageType list */
|
/* Store the new MessageType list */
|
||||||
this->type_count = type_count;
|
this->type_count = type_count;
|
||||||
if (type_count && supported_types)
|
if (type_count && supported_types)
|
||||||
{
|
{
|
||||||
size_t size = type_count * sizeof(TNC_MessageType);
|
size = type_count * sizeof(TNC_VendorID);
|
||||||
|
this->supported_vids = malloc(size);
|
||||||
int i;
|
size = type_count * sizeof(TNC_MessageSubtype);
|
||||||
|
this->supported_subtypes = malloc(size);
|
||||||
|
|
||||||
for (i = 0; i < type_count; i++)
|
for (i = 0; i < type_count; i++)
|
||||||
{
|
{
|
||||||
written = snprintf(pos, len, " 0x%08x", supported_types[i]);
|
vid = (supported_types[i] >> 8) & TNC_VENDORID_ANY;
|
||||||
|
subtype = supported_types[i] & TNC_SUBTYPE_ANY;
|
||||||
|
|
||||||
|
pa_subtype_names = get_pa_subtype_names(vid);
|
||||||
|
if (pa_subtype_names)
|
||||||
|
{
|
||||||
|
written = snprintf(pos, len," '%N/%N' 0x%06x/0x%02x",
|
||||||
|
pen_names, vid, pa_subtype_names, subtype,
|
||||||
|
vid, subtype);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
written = snprintf(pos, len," '%N' 0x%06x/0x%02x",
|
||||||
|
pen_names, vid, vid, subtype);
|
||||||
|
}
|
||||||
|
if (written >= len)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pos += written;
|
||||||
|
len -= written;
|
||||||
|
|
||||||
|
this->supported_vids[i] = vid;
|
||||||
|
this->supported_subtypes[i] = subtype;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*pos = '\0';
|
||||||
|
DBG2(DBG_TNC, "IMV %u supports %u message type%s:%s",
|
||||||
|
this->id, type_count, (type_count == 1) ? "":"s", buf);
|
||||||
|
|
||||||
|
/* unlock the imv_t instance */
|
||||||
|
this->mutex->unlock(this->mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
METHOD(imv_t, set_message_types_long, void,
|
||||||
|
private_tnc_imv_t *this, TNC_VendorIDList supported_vids,
|
||||||
|
TNC_MessageSubtypeList supported_subtypes, TNC_UInt32 type_count)
|
||||||
|
{
|
||||||
|
char buf[BUF_LEN];
|
||||||
|
char *pos = buf;
|
||||||
|
int len = sizeof(buf);
|
||||||
|
int i, written;
|
||||||
|
size_t size;
|
||||||
|
TNC_VendorID vid;
|
||||||
|
TNC_MessageSubtype subtype;
|
||||||
|
enum_name_t *pa_subtype_names;
|
||||||
|
|
||||||
|
/* lock the imv_t instance */
|
||||||
|
this->mutex->lock(this->mutex);
|
||||||
|
|
||||||
|
/* Free existing VendorID and MessageSubtype lists */
|
||||||
|
free(this->supported_vids);
|
||||||
|
this->supported_vids = NULL;
|
||||||
|
free(this->supported_subtypes);
|
||||||
|
this->supported_subtypes = NULL;
|
||||||
|
|
||||||
|
/* Store the new MessageType list */
|
||||||
|
this->type_count = type_count;
|
||||||
|
if (type_count && supported_vids && supported_subtypes)
|
||||||
|
{
|
||||||
|
size = type_count * sizeof(TNC_VendorID);
|
||||||
|
this->supported_vids = malloc(size);
|
||||||
|
memcpy(this->supported_vids, supported_vids, size);
|
||||||
|
size = type_count * sizeof(TNC_MessageSubtype);
|
||||||
|
this->supported_subtypes = malloc(size);
|
||||||
|
memcpy(this->supported_subtypes, supported_subtypes, size);
|
||||||
|
|
||||||
|
for (i = 0; i < type_count; i++)
|
||||||
|
{
|
||||||
|
vid = supported_vids[i];
|
||||||
|
subtype = supported_subtypes[i];
|
||||||
|
|
||||||
|
pa_subtype_names = get_pa_subtype_names(vid);
|
||||||
|
if (pa_subtype_names)
|
||||||
|
{
|
||||||
|
written = snprintf(pos, len," '%N/%N' 0x%06x/0x%08x",
|
||||||
|
pen_names, vid, pa_subtype_names, subtype,
|
||||||
|
vid, subtype);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
written = snprintf(pos, len," '%N' 0x%06x/0x%08x",
|
||||||
|
pen_names, vid, vid, subtype);
|
||||||
|
}
|
||||||
if (written >= len)
|
if (written >= len)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
@@ -121,14 +218,12 @@ METHOD(imv_t, set_message_types, void,
|
|||||||
pos += written;
|
pos += written;
|
||||||
len -= written;
|
len -= written;
|
||||||
}
|
}
|
||||||
this->supported_types = malloc(size);
|
|
||||||
memcpy(this->supported_types, supported_types, size);
|
|
||||||
}
|
}
|
||||||
*pos = '\0';
|
*pos = '\0';
|
||||||
DBG2(DBG_TNC, "IMV %u supports %u message type%s:%s",
|
DBG2(DBG_TNC, "IMV %u supports %u message type%s:%s",
|
||||||
this->id, type_count, (type_count == 1) ? "":"s", buf);
|
this->id, type_count, (type_count == 1) ? "":"s", buf);
|
||||||
|
|
||||||
/* lock the imv_t instance */
|
/* unlock the imv_t instance */
|
||||||
this->mutex->unlock(this->mutex);
|
this->mutex->unlock(this->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,14 +239,12 @@ METHOD(imv_t, type_supported, bool,
|
|||||||
|
|
||||||
for (i = 0; i < this->type_count; i++)
|
for (i = 0; i < this->type_count; i++)
|
||||||
{
|
{
|
||||||
vid = (this->supported_types[i] >> 8) & TNC_VENDORID_ANY;
|
vid = this->supported_vids[i];
|
||||||
subtype = this->supported_types[i] & TNC_SUBTYPE_ANY;
|
subtype = this->supported_subtypes[i];
|
||||||
|
|
||||||
if (this->supported_types[i] == message_type
|
if ((vid == TNC_VENDORID_ANY && subtype == TNC_SUBTYPE_ANY) ||
|
||||||
|| (subtype == TNC_SUBTYPE_ANY
|
(vid == msg_vid && (subtype == TNC_SUBTYPE_ANY ||
|
||||||
&& (msg_vid == vid || vid == TNC_VENDORID_ANY))
|
subtype == msg_subtype)))
|
||||||
|| (vid == TNC_VENDORID_ANY
|
|
||||||
&& (msg_subtype == subtype || subtype == TNC_SUBTYPE_ANY)))
|
|
||||||
{
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -164,7 +257,8 @@ METHOD(imv_t, destroy, void,
|
|||||||
{
|
{
|
||||||
dlclose(this->handle);
|
dlclose(this->handle);
|
||||||
this->mutex->destroy(this->mutex);
|
this->mutex->destroy(this->mutex);
|
||||||
free(this->supported_types);
|
free(this->supported_vids);
|
||||||
|
free(this->supported_subtypes);
|
||||||
free(this->name);
|
free(this->name);
|
||||||
free(this->path);
|
free(this->path);
|
||||||
free(this);
|
free(this);
|
||||||
@@ -183,6 +277,7 @@ imv_t* tnc_imv_create(char *name, char *path)
|
|||||||
.get_id = _get_id,
|
.get_id = _get_id,
|
||||||
.get_name = _get_name,
|
.get_name = _get_name,
|
||||||
.set_message_types = _set_message_types,
|
.set_message_types = _set_message_types,
|
||||||
|
.set_message_types_long = _set_message_types_long,
|
||||||
.type_supported = _type_supported,
|
.type_supported = _type_supported,
|
||||||
.destroy = _destroy,
|
.destroy = _destroy,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -37,6 +37,25 @@ TNC_Result TNC_TNCS_ReportMessageTypes(TNC_IMVID imv_id,
|
|||||||
type_count);
|
type_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called by the IMV to inform a TNCS about the set of message types the IMV
|
||||||
|
* is able to receive. This function supports long message types.
|
||||||
|
*/
|
||||||
|
TNC_Result TNC_TNCS_ReportMessageTypesLong(TNC_IMVID imv_id,
|
||||||
|
TNC_VendorIDList supported_vids,
|
||||||
|
TNC_MessageSubtypeList supported_subtypes,
|
||||||
|
TNC_UInt32 type_count)
|
||||||
|
{
|
||||||
|
if (!tnc->imvs->is_registered(tnc->imvs, imv_id))
|
||||||
|
{
|
||||||
|
DBG1(DBG_TNC, "ignoring ReportMessageTypes() from unregistered IMV %u",
|
||||||
|
imv_id);
|
||||||
|
return TNC_RESULT_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
return tnc->imvs->set_message_types_long(tnc->imvs, imv_id, supported_vids,
|
||||||
|
supported_subtypes, type_count);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called by the IMV to ask a TNCS to retry an Integrity Check Handshake
|
* Called by the IMV to ask a TNCS to retry an Integrity Check Handshake
|
||||||
*/
|
*/
|
||||||
@@ -144,6 +163,10 @@ TNC_Result TNC_TNCS_BindFunction(TNC_IMVID id,
|
|||||||
{
|
{
|
||||||
*function_pointer = (void*)TNC_TNCS_ReportMessageTypes;
|
*function_pointer = (void*)TNC_TNCS_ReportMessageTypes;
|
||||||
}
|
}
|
||||||
|
else if (streq(function_name, "TNC_TNCS_ReportMessageTypesLong"))
|
||||||
|
{
|
||||||
|
*function_pointer = (void*)TNC_TNCS_ReportMessageTypesLong;
|
||||||
|
}
|
||||||
else if (streq(function_name, "TNC_TNCS_RequestHandshakeRetry"))
|
else if (streq(function_name, "TNC_TNCS_RequestHandshakeRetry"))
|
||||||
{
|
{
|
||||||
*function_pointer = (void*)TNC_TNCS_RequestHandshakeRetry;
|
*function_pointer = (void*)TNC_TNCS_RequestHandshakeRetry;
|
||||||
|
|||||||
@@ -267,6 +267,31 @@ METHOD(imv_manager_t, set_message_types, TNC_Result,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
METHOD(imv_manager_t, set_message_types_long, TNC_Result,
|
||||||
|
private_tnc_imv_manager_t *this, TNC_IMVID id,
|
||||||
|
TNC_VendorIDList supported_vids,
|
||||||
|
TNC_MessageSubtypeList supported_subtypes,
|
||||||
|
TNC_UInt32 type_count)
|
||||||
|
{
|
||||||
|
enumerator_t *enumerator;
|
||||||
|
imv_t *imv;
|
||||||
|
TNC_Result result = TNC_RESULT_FATAL;
|
||||||
|
|
||||||
|
enumerator = this->imvs->create_enumerator(this->imvs);
|
||||||
|
while (enumerator->enumerate(enumerator, &imv))
|
||||||
|
{
|
||||||
|
if (id == imv->get_id(imv))
|
||||||
|
{
|
||||||
|
imv->set_message_types_long(imv, supported_vids, supported_subtypes,
|
||||||
|
type_count);
|
||||||
|
result = TNC_RESULT_SUCCESS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
enumerator->destroy(enumerator);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
METHOD(imv_manager_t, solicit_recommendation, void,
|
METHOD(imv_manager_t, solicit_recommendation, void,
|
||||||
private_tnc_imv_manager_t *this, TNC_ConnectionID id)
|
private_tnc_imv_manager_t *this, TNC_ConnectionID id)
|
||||||
{
|
{
|
||||||
@@ -364,6 +389,7 @@ imv_manager_t* tnc_imv_manager_create(void)
|
|||||||
.enforce_recommendation = _enforce_recommendation,
|
.enforce_recommendation = _enforce_recommendation,
|
||||||
.notify_connection_change = _notify_connection_change,
|
.notify_connection_change = _notify_connection_change,
|
||||||
.set_message_types = _set_message_types,
|
.set_message_types = _set_message_types,
|
||||||
|
.set_message_types_long = _set_message_types_long,
|
||||||
.solicit_recommendation = _solicit_recommendation,
|
.solicit_recommendation = _solicit_recommendation,
|
||||||
.receive_message = _receive_message,
|
.receive_message = _receive_message,
|
||||||
.batch_ending = _batch_ending,
|
.batch_ending = _batch_ending,
|
||||||
|
|||||||
@@ -126,13 +126,13 @@ METHOD(tnccs_t, send_msg, TNC_Result,
|
|||||||
pa_subtype_names = get_pa_subtype_names(msg_vendor_id);
|
pa_subtype_names = get_pa_subtype_names(msg_vendor_id);
|
||||||
if (pa_subtype_names)
|
if (pa_subtype_names)
|
||||||
{
|
{
|
||||||
DBG2(DBG_TNC, "creating PB-PA message type '%N/%N' 0x%06x/0x%02x",
|
DBG2(DBG_TNC, "creating PB-PA message type '%N/%N' 0x%06x/0x%08x",
|
||||||
pen_names, msg_vendor_id, pa_subtype_names, msg_sub_type,
|
pen_names, msg_vendor_id, pa_subtype_names, msg_sub_type,
|
||||||
msg_vendor_id, msg_sub_type);
|
msg_vendor_id, msg_sub_type);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DBG2(DBG_TNC, "creating PB-PA message type '%N' 0x%06x/0x%02x",
|
DBG2(DBG_TNC, "creating PB-PA message type '%N' 0x%06x/0x%08x",
|
||||||
pen_names, msg_vendor_id, msg_vendor_id, msg_sub_type);
|
pen_names, msg_vendor_id, msg_vendor_id, msg_sub_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,13 +181,13 @@ static void handle_message(private_tnccs_20_t *this, pb_tnc_msg_t *msg)
|
|||||||
pa_subtype_names = get_pa_subtype_names(vendor_id);
|
pa_subtype_names = get_pa_subtype_names(vendor_id);
|
||||||
if (pa_subtype_names)
|
if (pa_subtype_names)
|
||||||
{
|
{
|
||||||
DBG2(DBG_TNC, "handling PB-PA message type '%N/%N' 0x%06x/0x%02x",
|
DBG2(DBG_TNC, "handling PB-PA message type '%N/%N' 0x%06x/0x%08x",
|
||||||
pen_names, vendor_id, pa_subtype_names, subtype,
|
pen_names, vendor_id, pa_subtype_names, subtype,
|
||||||
vendor_id, subtype);
|
vendor_id, subtype);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DBG2(DBG_TNC, "handling PB-PA message type '%N' 0x%06x/0x%02x",
|
DBG2(DBG_TNC, "handling PB-PA message type '%N' 0x%06x/0x%08x",
|
||||||
pen_names, vendor_id, vendor_id, subtype);
|
pen_names, vendor_id, vendor_id, subtype);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -159,6 +159,17 @@ struct imc_t {
|
|||||||
void (*set_message_types)(imc_t *this, TNC_MessageTypeList supported_types,
|
void (*set_message_types)(imc_t *this, TNC_MessageTypeList supported_types,
|
||||||
TNC_UInt32 type_count);
|
TNC_UInt32 type_count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the supported long message types of an imc_t object.
|
||||||
|
*
|
||||||
|
* @param supported_vids list of vendor IDs supported by IMC
|
||||||
|
* @param supported_subtypes list of messages type supported by IMC
|
||||||
|
* @param type_count number of supported message types
|
||||||
|
*/
|
||||||
|
void (*set_message_types_long)(imc_t *this, TNC_VendorIDList supported_vids,
|
||||||
|
TNC_MessageSubtypeList supported_subtypes,
|
||||||
|
TNC_UInt32 type_count);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if the IMC supports a given message type.
|
* Check if the IMC supports a given message type.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -101,6 +101,21 @@ struct imc_manager_t {
|
|||||||
TNC_MessageTypeList supported_types,
|
TNC_MessageTypeList supported_types,
|
||||||
TNC_UInt32 type_count);
|
TNC_UInt32 type_count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the supported long message types reported by a given IMC
|
||||||
|
*
|
||||||
|
* @param id ID of reporting IMC
|
||||||
|
* @param supported_vids list of vendor IDs supported by IMC
|
||||||
|
* @param supported_subtypes list of messages type supported by IMC
|
||||||
|
* @param type_count number of supported message types
|
||||||
|
* @return TNC result code
|
||||||
|
*/
|
||||||
|
TNC_Result (*set_message_types_long)(imc_manager_t *this,
|
||||||
|
TNC_IMCID id,
|
||||||
|
TNC_VendorIDList supported_vids,
|
||||||
|
TNC_MessageSubtypeList supported_subtypes,
|
||||||
|
TNC_UInt32 type_count);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delivers a message to interested IMCs.
|
* Delivers a message to interested IMCs.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -159,6 +159,17 @@ struct imv_t {
|
|||||||
void (*set_message_types)(imv_t *this, TNC_MessageTypeList supported_types,
|
void (*set_message_types)(imv_t *this, TNC_MessageTypeList supported_types,
|
||||||
TNC_UInt32 type_count);
|
TNC_UInt32 type_count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the supported long message types of an imv_t object.
|
||||||
|
*
|
||||||
|
* @param supported_vids list of vendor IDs supported by IMC
|
||||||
|
* @param supported_subtypes list of messages type supported by IMC
|
||||||
|
* @param type_count number of supported message types
|
||||||
|
*/
|
||||||
|
void (*set_message_types_long)(imv_t *this, TNC_VendorIDList supported_vids,
|
||||||
|
TNC_MessageSubtypeList supported_subtypes,
|
||||||
|
TNC_UInt32 type_count);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if the IMV supports a given message type.
|
* Check if the IMV supports a given message type.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -116,6 +116,21 @@ struct imv_manager_t {
|
|||||||
TNC_MessageTypeList supported_types,
|
TNC_MessageTypeList supported_types,
|
||||||
TNC_UInt32 type_count);
|
TNC_UInt32 type_count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the supported long message types reported by a given IMV
|
||||||
|
*
|
||||||
|
* @param id ID of reporting IMV
|
||||||
|
* @param supported_vids list of vendor IDs supported by IMV
|
||||||
|
* @param supported_subtypes list of messages type supported by IMV
|
||||||
|
* @param type_count number of supported message types
|
||||||
|
* @return TNC result code
|
||||||
|
*/
|
||||||
|
TNC_Result (*set_message_types_long)(imv_manager_t *this,
|
||||||
|
TNC_IMVID id,
|
||||||
|
TNC_VendorIDList supported_vids,
|
||||||
|
TNC_MessageSubtypeList supported_subtypes,
|
||||||
|
TNC_UInt32 type_count);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Solicit recommendations from IMVs that have not yet provided one
|
* Solicit recommendations from IMVs that have not yet provided one
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user