connection_id, recommendation, evaluation);
}
+/**
+ * Called by the IMV to get the value of an attribute associated with a
+ * connection or with the TNCS as a whole.
+ */
+TNC_Result TNC_TNCS_GetAttribute(TNC_IMVID imv_id,
+ TNC_ConnectionID connection_id,
+ TNC_AttributeID attribute_id,
+ TNC_UInt32 buffer_len,
+ TNC_BufferReference buffer,
+ TNC_UInt32 *out_value_len)
+{
+ return charon->tnccs->get_attribute(charon->tnccs, imv_id, connection_id,
+ attribute_id, buffer_len, buffer, out_value_len);
+}
+
+/**
+ * Called by the IMV to set the value of an attribute associated with a
+ * connection or with the TNCS as a whole.
+ */
+TNC_Result TNC_TNCS_SetAttribute(TNC_IMVID imv_id,
+ TNC_ConnectionID connection_id,
+ TNC_AttributeID attribute_id,
+ TNC_UInt32 buffer_len,
+ TNC_BufferReference buffer)
+{
+ return charon->tnccs->set_attribute(charon->tnccs, imv_id, connection_id,
+ attribute_id, buffer_len, buffer);
+}
+
/**
* Called by the IMV when it needs a function pointer
*/
{
*function_pointer = (void*)TNC_TNCS_ProvideRecommendation;
}
+ else if (streq(function_name, "TNC_TNCS_GetAttribute"))
+ {
+ *function_pointer = (void*)TNC_TNCS_GetAttribute;
+ }
+ else if (streq(function_name, "TNC_TNCS_SetAttribute"))
+ {
+ *function_pointer = (void*)TNC_TNCS_SetAttribute;
+ }
else
{
return TNC_RESULT_INVALID_PARAMETER;
* list of recommendations and evaluations provided by IMVs
*/
linked_list_t *recs;
+
+ /**
+ * Preferred language for remediation messages
+ */
+ chunk_t preferred_language;
};
METHOD(recommendations_t, provide_recommendation, TNC_Result,
return TRUE;
}
+METHOD(recommendations_t, get_preferred_language, chunk_t,
+ private_tnc_imv_recommendations_t *this)
+{
+ return this->preferred_language;
+}
+
+METHOD(recommendations_t, set_preferred_language, void,
+ private_tnc_imv_recommendations_t *this, chunk_t pref_lang)
+{
+ chunk_free(&this->preferred_language);
+ this->preferred_language = chunk_clone(pref_lang);
+}
METHOD(recommendations_t, destroy, void,
private_tnc_imv_recommendations_t *this)
{
this->recs->destroy_function(this->recs, free);
+ free(this->preferred_language.ptr);
free(this);
}
.public = {
.provide_recommendation = _provide_recommendation,
.have_recommendation = _have_recommendation,
+ .get_preferred_language = _get_preferred_language,
+ .set_preferred_language = _set_preferred_language,
.destroy = _destroy,
},
.recs = linked_list_create(),
/**
* Deliver an IMV action recommendation and IMV evaluation result to the TNCS
*
- * @param imv_id ID of the IMV providing the recommendation
- * @param recommendation action recommendation
- * @param evaluation evaluation result
+ * @param imv_id ID of the IMV providing the recommendation
+ * @param rec action recommendation
+ * @param eval evaluation result
+ * @return return code
*/
TNC_Result (*provide_recommendation)(recommendations_t *this,
TNC_IMVID imv_id,
TNC_IMV_Action_Recommendation rec,
TNC_IMV_Evaluation_Result eval);
+ /**
+ * If all IMVs provided a recommendation, derive a consolidated action
+ * recommendation and evaluation result based on a configured policy
+ *
+ * @param rec action recommendation
+ * @param eval evaluation result
+ * @return TRUE if all IMVs provided a recommendation
+ */
bool (*have_recommendation)(recommendations_t *this,
TNC_IMV_Action_Recommendation *rec,
TNC_IMV_Evaluation_Result *eval);
+ /**
+ * Get the preferred language for remediation messages
+ *
+ * @return preferred language
+ */
+ chunk_t (*get_preferred_language)(recommendations_t *this);
+
+ /**
+ * Set the preferred language for remediation messages
+ *
+ * @param pref_lang preferred language
+ */
+ void (*set_preferred_language)(recommendations_t *this, chunk_t pref_lang);
+
/**
* Destroys an imv_t object.
*/
*/
tnccs_t *tnccs;
- /** TNCCS send message function
- *
+ /**
+ * TNCCS send message function
*/
tnccs_send_message_t send_message;
- /** collection of IMV recommendations
- *
+ /**
+ * collection of IMV recommendations
*/
recommendations_t *recs;
};
return TNC_RESULT_FATAL;
}
+METHOD(tnccs_manager_t, get_attribute, TNC_Result,
+ private_tnccs_manager_t *this, TNC_IMVID imv_id,
+ TNC_ConnectionID id,
+ TNC_AttributeID attribute_id,
+ TNC_UInt32 buffer_len,
+ TNC_BufferReference buffer,
+ TNC_UInt32 *out_value_len)
+{
+ enumerator_t *enumerator;
+ tnccs_connection_entry_t *entry;
+ recommendations_t *recs = NULL;
+
+ if (attribute_id != TNC_ATTRIBUTEID_PREFERRED_LANGUAGE)
+ {
+ return TNC_RESULT_INVALID_PARAMETER;
+ }
+
+ this->connection_lock->read_lock(this->connection_lock);
+ enumerator = this->connections->create_enumerator(this->connections);
+ while (enumerator->enumerate(enumerator, &entry))
+ {
+ if (id == entry->id)
+ {
+ recs = entry->recs;
+ break;
+ }
+ }
+ enumerator->destroy(enumerator);
+ this->connection_lock->unlock(this->connection_lock);
+
+ if (recs)
+ {
+ chunk_t pref_lang;
+
+ pref_lang = recs->get_preferred_language(recs);
+ if (pref_lang.len == 0)
+ {
+ return TNC_RESULT_INVALID_PARAMETER;
+ }
+ *out_value_len = pref_lang.len;
+ if (buffer && buffer_len <= pref_lang.len)
+ {
+ memcpy(buffer, pref_lang.ptr, pref_lang.len);
+ }
+ return TNC_RESULT_SUCCESS;
+ }
+ return TNC_RESULT_INVALID_PARAMETER;
+}
+
+METHOD(tnccs_manager_t, set_attribute, TNC_Result,
+ private_tnccs_manager_t *this, TNC_IMVID imv_id,
+ TNC_ConnectionID id,
+ TNC_AttributeID attribute_id,
+ TNC_UInt32 buffer_len,
+ TNC_BufferReference buffer)
+{
+ return TNC_RESULT_INVALID_PARAMETER;
+}
+
METHOD(tnccs_manager_t, destroy, void,
private_tnccs_manager_t *this)
{
.remove_connection = _remove_connection,
.send_message = _send_message,
.provide_recommendation = _provide_recommendation,
+ .get_attribute = _get_attribute,
+ .set_attribute = _set_attribute,
.destroy = _destroy,
},
.protocols = linked_list_create(),
* callback function for adding a message to a TNCCS batch and create
* an empty set for collecting IMV recommendations
*
- * @param tnccs TNCCS connection instance
- * @param send_message TNCCS callback function
- * @param recs pointer to IMV recommendation set
- * @return assigned connection ID
+ * @param tnccs TNCCS connection instance
+ * @param send_message TNCCS callback function
+ * @param recs pointer to IMV recommendation set
+ * @return assigned connection ID
*/
TNC_ConnectionID (*create_connection)(tnccs_manager_t *this, tnccs_t *tnccs,
tnccs_send_message_t send_message,
/**
* Remove a TNCCS connection using its connection ID.
*
- * @param id connection ID of the connection to be removed
+ * @param id connection ID of the connection to be removed
*/
void (*remove_connection)(tnccs_manager_t *this, TNC_ConnectionID id);
/**
* Add an IMC/IMV message to the batch of a given connection ID.
*
- * @param id target connection ID
- * @param message message to be added
- * @param message_len message length
- * @param message_type message type
- * @return return code
+ * @param id target connection ID
+ * @param msg message to be added
+ * @param msg_len message length
+ * @param msg_type message type
+ * @return return code
*/
TNC_Result (*send_message)(tnccs_manager_t *this,
TNC_ConnectionID id,
- TNC_BufferReference message,
- TNC_UInt32 message_len,
- TNC_MessageType message_type);
+ TNC_BufferReference msg,
+ TNC_UInt32 msg_len,
+ TNC_MessageType msg_type);
/**
* Deliver an IMV Action Recommendation and IMV Evaluation Result to the TNCS
*
* @param imv_id ID of the IMV providing the recommendation
- * @param connection_id target connection ID
- * @param recommendation action recommendation
- * @param evaluation evaluation result
+ * @param connection_id ID of target connection
+ * @param rec action recommendation
+ * @param eval evaluation result
+ * @return return code
*/
TNC_Result (*provide_recommendation)(tnccs_manager_t *this,
+ TNC_IMVID imv_id,
+ TNC_ConnectionID connection_id,
+ TNC_IMV_Action_Recommendation rec,
+ TNC_IMV_Evaluation_Result eval);
+
+ /**
+ * Get the value of an attribute associated with a connection or with the
+ * TNCS as a whole.
+ *
+ * @param imv_id ID of the IMV requesting the attribute
+ * @param connection_id ID of target connection
+ * @param attribute_id ID of the requested attribute
+ * @param buffer_len length of the buffer in bytes
+ * @param buffer pointer to the buffer
+ * @param out_value_len actual length of the returned attribute
+ * @return return code
+ */
+ TNC_Result (*get_attribute)(tnccs_manager_t *this,
+ TNC_IMVID imv_id,
+ TNC_ConnectionID connection_id,
+ TNC_AttributeID attribute_id,
+ TNC_UInt32 buffer_len,
+ TNC_BufferReference buffer,
+ TNC_UInt32 *out_value_len);
+
+ /**
+ * Set the value of an attribute associated with a connection or with the
+ * TNCS as a whole.
+ *
+ * @param imv_id ID of the IMV setting the attribute
+ * @param connection_id ID of target connection
+ * @param attribute_id ID of the attribute to be set
+ * @param buffer_len length of the buffer in bytes
+ * @param buffer pointer to the buffer
+ * @return return code
+ */
+ TNC_Result (*set_attribute)(tnccs_manager_t *this,
TNC_IMVID imv_id,
TNC_ConnectionID connection_id,
- TNC_IMV_Action_Recommendation recommendation,
- TNC_IMV_Evaluation_Result evaluation);
+ TNC_AttributeID attribute_id,
+ TNC_UInt32 buffer_len,
+ TNC_BufferReference buffer);
/**
* Destroy a tnccs_manager instance.