aboutsummaryrefslogtreecommitdiffstats
path: root/src/libcharon/tnc/tnccs/tnccs_manager.c
diff options
context:
space:
mode:
authorAndreas Steffen <andreas.steffen@strongswan.org>2010-11-16 20:14:48 +0100
committerAndreas Steffen <andreas.steffen@strongswan.org>2010-11-16 20:14:48 +0100
commit92477a0625c5fba739d416cddd81edd9ae3caefe (patch)
tree592c8605d6f6c858d61a2d358f29ae9e3ee96f59 /src/libcharon/tnc/tnccs/tnccs_manager.c
parent4d178affbb2e042b72b361242d833687ea332c9a (diff)
downloadstrongswan-92477a0625c5fba739d416cddd81edd9ae3caefe.tar.bz2
strongswan-92477a0625c5fba739d416cddd81edd9ae3caefe.tar.xz
implement GetAttribute() callback function
Diffstat (limited to 'src/libcharon/tnc/tnccs/tnccs_manager.c')
-rw-r--r--src/libcharon/tnc/tnccs/tnccs_manager.c69
1 files changed, 65 insertions, 4 deletions
diff --git a/src/libcharon/tnc/tnccs/tnccs_manager.c b/src/libcharon/tnc/tnccs/tnccs_manager.c
index 0c59e0c26..d99ed85e7 100644
--- a/src/libcharon/tnc/tnccs/tnccs_manager.c
+++ b/src/libcharon/tnc/tnccs/tnccs_manager.c
@@ -57,13 +57,13 @@ struct tnccs_connection_entry_t {
*/
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;
};
@@ -296,6 +296,65 @@ METHOD(tnccs_manager_t, provide_recommendation, TNC_Result,
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)
{
@@ -322,6 +381,8 @@ tnccs_manager_t *tnccs_manager_create()
.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(),