2 * Example IMV for TNC testing
3 * Copyright (c) 2014, Jouni Malinen <j@w1.fi>
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
12 #include "common/tnc.h"
14 static int initialized = 0;
15 static TNC_IMVID my_id = -1;
16 static TNC_TNCS_ReportMessageTypesPointer report_message_types = NULL;
17 static TNC_TNCS_SendMessagePointer send_message = NULL;
18 static TNC_TNCS_RequestHandshakeRetryPointer request_retry = NULL;
19 TNC_TNCS_ProvideRecommendationPointer provide_recomm = NULL;
21 static TNC_MessageType message_types[] =
23 (TNC_VENDORID_ANY << 8) | TNC_SUBTYPE_ANY
27 TNC_Result TNC_IMV_Initialize(
28 /*in*/ TNC_IMVID imvID,
29 /*in*/ TNC_Version minVersion,
30 /*in*/ TNC_Version maxVersion,
31 /*out*/ TNC_Version *pOutActualVersion)
34 "IMV(hostap2) %s(imvID=%u, minVersion=%u, maxVersion=%u)",
35 __func__, (unsigned) imvID, (unsigned) minVersion,
36 (unsigned) maxVersion);
39 return TNC_RESULT_ALREADY_INITIALIZED;
41 if (minVersion < TNC_IFIMV_VERSION_1 ||
42 maxVersion > TNC_IFIMV_VERSION_1)
43 return TNC_RESULT_NO_COMMON_VERSION;
45 if (!pOutActualVersion)
46 return TNC_RESULT_INVALID_PARAMETER;
47 *pOutActualVersion = TNC_IFIMV_VERSION_1;
52 return TNC_RESULT_SUCCESS;
56 TNC_Result TNC_IMV_NotifyConnectionChange(
57 /*in*/ TNC_IMVID imvID,
58 /*in*/ TNC_ConnectionID connectionID,
59 /*in*/ TNC_ConnectionState newState)
62 "IMV(hostap2) %s(imvID=%u, connectionID=%u, newState=%u)",
63 __func__, (unsigned) imvID, (unsigned) connectionID,
67 return TNC_RESULT_NOT_INITIALIZED;
70 return TNC_RESULT_INVALID_PARAMETER;
72 /* TODO: call TNC_TNCS_ProvideRecommendation */
74 return TNC_RESULT_SUCCESS;
78 TNC_Result TNC_IMV_ReceiveMessage(
79 /*in*/ TNC_IMVID imvID,
80 /*in*/ TNC_ConnectionID connectionID,
81 /*in*/ TNC_BufferReference message,
82 /*in*/ TNC_UInt32 messageLength,
83 /*in*/ TNC_MessageType messageType)
88 "IMV(hostap2) %s(imvID=%u, connectionID=%u, messageType=%u)",
89 __func__, (unsigned) imvID, (unsigned) connectionID,
90 (unsigned) messageType);
91 wpa_hexdump_ascii(MSG_INFO, "IMV(hostap2) message",
92 message, messageLength);
95 return TNC_RESULT_FATAL;
97 if (messageType == 1 && messageLength == 5 &&
98 os_memcmp(message, "hello", 5) == 0) {
101 res = send_message(imvID, connectionID, msg, os_strlen(msg), 1);
102 if (res != TNC_RESULT_SUCCESS)
106 if (messageType == 1 && messageLength == 8 &&
107 os_memcmp(message, "i'm fine", 8) == 0) {
109 return TNC_RESULT_FATAL;
110 res = provide_recomm(imvID, connectionID,
111 TNC_IMV_ACTION_RECOMMENDATION_ALLOW,
112 TNC_IMV_EVALUATION_RESULT_COMPLIANT);
113 if (res != TNC_RESULT_SUCCESS)
117 return TNC_RESULT_SUCCESS;
121 TNC_Result TNC_IMV_SolicitRecommendation(
122 /*in*/ TNC_IMVID imvID,
123 /*in*/ TNC_ConnectionID connectionID)
125 wpa_printf(MSG_INFO, "IMV(hostap2) %s(imvID=%u, connectionID=%u)",
126 __func__, (unsigned) imvID, (unsigned) connectionID);
129 return TNC_RESULT_NOT_INITIALIZED;
132 return TNC_RESULT_INVALID_PARAMETER;
134 /* TODO: call TNC_TNCS_ProvideRecommendation */
136 return TNC_RESULT_SUCCESS;
140 TNC_Result TNC_IMV_BatchEnding(
141 /*in*/ TNC_IMVID imvID,
142 /*in*/ TNC_ConnectionID connectionID)
144 wpa_printf(MSG_INFO, "IMV(hostap2) %s(imvID=%u, connectionID=%u)",
145 __func__, (unsigned) imvID, (unsigned) connectionID);
147 return TNC_RESULT_SUCCESS;
151 TNC_Result TNC_IMV_Terminate(
152 /*in*/ TNC_IMVID imvID)
154 wpa_printf(MSG_INFO, "IMV(hostap2) %s(imvID=%u)",
155 __func__, (unsigned) imvID);
157 return TNC_RESULT_SUCCESS;
161 TNC_Result TNC_IMV_ProvideBindFunction(
162 /*in*/ TNC_IMVID imvID,
163 /*in*/ TNC_TNCS_BindFunctionPointer bindFunction)
167 wpa_printf(MSG_INFO, "IMV(hostap2) %s(imvID=%u)",
168 __func__, (unsigned) imvID);
171 return TNC_RESULT_NOT_INITIALIZED;
173 if (imvID != my_id || !bindFunction)
174 return TNC_RESULT_INVALID_PARAMETER;
176 if (bindFunction(imvID, "TNC_TNCS_ReportMessageTypes",
177 (void **) &report_message_types) !=
178 TNC_RESULT_SUCCESS ||
179 !report_message_types)
180 return TNC_RESULT_FATAL;
182 if (bindFunction(imvID, "TNC_TNCS_SendMessage",
183 (void **) &send_message) != TNC_RESULT_SUCCESS ||
185 return TNC_RESULT_FATAL;
187 if (bindFunction(imvID, "TNC_TNCS_RequestHandshakeRetry",
188 (void **) &request_retry) != TNC_RESULT_SUCCESS ||
190 return TNC_RESULT_FATAL;
192 if (bindFunction(imvID, "TNC_TNCS_ProvideRecommendation",
193 (void **) &provide_recomm) != TNC_RESULT_SUCCESS ||
195 return TNC_RESULT_FATAL;
197 res = report_message_types(imvID, message_types,
198 ARRAY_SIZE(message_types));
199 if (res != TNC_RESULT_SUCCESS)
202 return TNC_RESULT_SUCCESS;