aboutsummaryrefslogtreecommitdiffstats
path: root/src/libcharon/tnc/tnccs/tnccs_manager.h
blob: 5051d4bb3336d6df4ec961c9dfb9860f3e4ce901 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/*
 * Copyright (C) 2010 Andreas Steffen
 * HSR Hochschule fuer Technik Rapperswil
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

/**
 * @defgroup tnccs_manager tnccs_manager
 * @{ @ingroup tnccs
 */

#ifndef TNCCS_MANAGER_H_
#define TNCCS_MANAGER_H_

typedef struct tnccs_manager_t tnccs_manager_t;

#ifdef USE_TNC

#include "tnccs.h"

#include <tnc/imv/imv_recommendations.h>

/**
 * The TNCCS manager manages all TNCCS implementations and creates instances.
 *
 * A plugin registers its implemented TNCCS protocol with the manager by
 * providing type and a constructor function. The manager then creates
 * TNCCS protocol instances via the provided constructor.
 */
struct tnccs_manager_t {

	/**
	 * Register a TNCCS protocol implementation.
	 *
	 * @param type			TNCCS protocol type
	 * @param constructor	constructor, returns a TNCCS protocol implementation
	 */
	void (*add_method)(tnccs_manager_t *this, tnccs_type_t type,
					   tnccs_constructor_t constructor);

	/**
	 * Unregister a TNCCS protocol implementation using it's constructor.
	 *
	 * @param constructor	constructor function to remove, as added in add_method
	 */
	void (*remove_method)(tnccs_manager_t *this, tnccs_constructor_t constructor);

	/**
	 * Create a new TNCCS protocol instance.
	 *
	 * @param type		  type of the TNCCS protocol
	 * @param is_server	  TRUE if TNC Server, FALSE if TNC Client
	 * @return			  TNCCS protocol instance, NULL if no constructor found
	 */
	tnccs_t* (*create_instance)(tnccs_manager_t *this, tnccs_type_t type,
								bool is_server);

	/**
	 * Create a TNCCS connection and assign a unique connection ID as well a
	 * 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 request_handshake_retry	pointer to boolean variable
	 * @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,
										  bool *request_handshake_retry,
										  recommendations_t **recs);

	/**
	 * Remove a TNCCS connection using its connection ID.
	 *
	 * @param id				ID of the connection to be removed
	 * @param is_server			TNC Server if TRUE, TNC Client if FALSE
	 */
	void (*remove_connection)(tnccs_manager_t *this, TNC_ConnectionID id,
							  bool is_server);

	/**
	 * Request a handshake retry
	 *
	 * @param is_imc			TRUE if IMC, FALSE if IMV
	 * @param imcv_id			ID of IMC or IMV requesting the retry
	 * @param id				ID of a specific connection or any connection
	 * @param reason			reason for the handshake retry
	 * @return					return code
	 */
	TNC_Result (*request_handshake_retry)(tnccs_manager_t *this, bool is_imc,
										  TNC_UInt32 imcv_id,
										  TNC_ConnectionID id,
										  TNC_RetryReason reason);

	/**
	 * Add an IMC/IMV message to the batch of a given connection ID.
	 *
	 * @param imc_id			ID of IMC or TNC_IMCID_ANY
	 * @param imv_id			ID of IMV or TNC_IMVID_ANY
	 * @param id				ID of target connection
	 * @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_IMCID imc_id,
													  TNC_IMVID imv_id,
													  TNC_ConnectionID id,
													  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 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 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 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 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 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 id,
								TNC_AttributeID attribute_id,
								TNC_UInt32 buffer_len,
								TNC_BufferReference buffer);

	/**
	 * Destroy a tnccs_manager instance.
	 */
	void (*destroy)(tnccs_manager_t *this);
};

/**
 * Create a tnccs_manager instance.
 */
tnccs_manager_t *tnccs_manager_create();

#endif /* USE_TNC */

#endif /** TNCCS_MANAGER_H_ @}*/