2 * Copyright (C) 2006 Mike McCauley
3 * Copyright (C) 2010 Andreas Steffen, HSR Hochschule fuer Technik Rapperswil
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 #include "tnc_imv_manager.h"
18 #include <tnc/imv/imv_manager.h>
19 #include <tnc/tncifimv.h>
23 #include <utils/linked_list.h>
25 typedef struct private_tnc_imv_manager_t private_tnc_imv_manager_t
;
28 * Private data of an imv_manager_t object.
30 struct private_tnc_imv_manager_t
{
33 * Public members of imv_manager_t.
43 * Next IMV ID to be assigned
45 TNC_IMVID next_imv_id
;
48 METHOD(imv_manager_t
, add
, bool,
49 private_tnc_imv_manager_t
*this, imv_t
*imv
)
53 /* Initialize the IMV module */
54 imv
->set_id(imv
, this->next_imv_id
);
55 if (imv
->initialize(imv
->get_id(imv
), TNC_IFIMV_VERSION_1
,
56 TNC_IFIMV_VERSION_1
, &version
) != TNC_RESULT_SUCCESS
)
58 DBG1(DBG_TNC
, "could not initialize IMV '%s'",
62 this->imvs
->insert_last(this->imvs
, imv
);
65 if (imv
->provide_bind_function(imv
->get_id(imv
), TNC_TNCS_BindFunction
)
66 != TNC_RESULT_SUCCESS
)
68 DBG1(DBG_TNC
, "could not provide bind function for IMV '%s'",
70 this->imvs
->remove_last(this->imvs
, (void**)&imv
);
76 METHOD(imv_manager_t
, remove_
, imv_t
*,
77 private_tnc_imv_manager_t
*this, TNC_IMVID id
)
79 enumerator_t
*enumerator
;
82 enumerator
= this->imvs
->create_enumerator(this->imvs
);
83 while (enumerator
->enumerate(enumerator
, &imv
))
85 if (id
== imv
->get_id(imv
))
87 this->imvs
->remove_at(this->imvs
, enumerator
);
91 enumerator
->destroy(enumerator
);
94 METHOD(imv_manager_t
, notify_connection_change
, void,
95 private_tnc_imv_manager_t
*this, TNC_ConnectionID id
,
96 TNC_ConnectionState state
)
98 enumerator_t
*enumerator
;
101 enumerator
= this->imvs
->create_enumerator(this->imvs
);
102 while (enumerator
->enumerate(enumerator
, &imv
))
104 if (imv
->notify_connection_change
)
106 imv
->notify_connection_change(imv
->get_id(imv
), id
, state
);
109 enumerator
->destroy(enumerator
);
112 METHOD(imv_manager_t
, set_message_types
, TNC_Result
,
113 private_tnc_imv_manager_t
*this, TNC_IMVID id
,
114 TNC_MessageTypeList supported_types
,
115 TNC_UInt32 type_count
)
117 enumerator_t
*enumerator
;
119 TNC_Result result
= TNC_RESULT_FATAL
;
121 enumerator
= this->imvs
->create_enumerator(this->imvs
);
122 while (enumerator
->enumerate(enumerator
, &imv
))
124 if (id
== imv
->get_id(imv
))
126 imv
->set_message_types(imv
, supported_types
, type_count
);
127 result
= TNC_RESULT_SUCCESS
;
131 enumerator
->destroy(enumerator
);
135 METHOD(imv_manager_t
, receive_message
, void,
136 private_tnc_imv_manager_t
*this, TNC_ConnectionID connection_id
,
137 TNC_BufferReference message
,
138 TNC_UInt32 message_len
,
139 TNC_MessageType message_type
)
141 enumerator_t
*enumerator
;
144 enumerator
= this->imvs
->create_enumerator(this->imvs
);
145 while (enumerator
->enumerate(enumerator
, &imv
))
147 if (imv
->receive_message
&& imv
->type_supported(imv
, message_type
))
149 imv
->receive_message(imv
->get_id(imv
), connection_id
,
150 message
, message_len
, message_type
);
153 enumerator
->destroy(enumerator
);
156 METHOD(imv_manager_t
, destroy
, void,
157 private_tnc_imv_manager_t
*this)
161 while (this->imvs
->remove_last(this->imvs
, (void**)&imv
) == SUCCESS
)
163 if (imv
->terminate
&&
164 imv
->terminate(imv
->get_id(imv
)) != TNC_RESULT_SUCCESS
)
166 DBG1(DBG_TNC
, "IMV '%s' not terminated successfully",
171 this->imvs
->destroy(this->imvs
);
176 * Described in header.
178 imv_manager_t
* tnc_imv_manager_create(void)
180 private_tnc_imv_manager_t
*this;
185 .remove
= _remove_
, /* avoid name conflict with stdio.h */
186 .notify_connection_change
= _notify_connection_change
,
187 .set_message_types
= _set_message_types
,
188 .receive_message
= _receive_message
,
191 .imvs
= linked_list_create(),
196 return &this->public;