4 * @brief Class message_t. Object of this type represents an IKEv2-Message.
9 * Copyright (C) 2005 Jan Hutter, Martin Willi
10 * Hochschule fuer Technik Rapperswil
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the
14 * Free Software Foundation; either version 2 of the License, or (at your
15 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
28 #include "ike_sa_id.h"
29 #include "utils/linked_list.h"
30 #include "utils/allocator.h"
31 #include "payloads/encodings.h"
32 #include "payloads/payload.h"
35 * Entry for a payload in the internal used linked list
38 typedef struct payload_entry_s payload_entry_t
;
40 struct payload_entry_s
{
44 payload_type_t payload_type
;
46 * Data struct holding the data of given payload
53 * Private data of an message_t object
55 typedef struct private_message_s private_message_t
;
57 struct private_message_s
{
60 * Public part of a message_t object
67 * Assigned exchange type
69 exchange_type_t exchange_type
;
72 * TRUE if message is from original initiator, FALSE otherwise.
74 bool original_initiator
;
77 * TRUE if message is request.
78 * FALSE if message is reply.
83 * First Payload type following the header
85 payload_type_t first_payload_type
;
88 * Message ID of this message
93 * ID of assigned IKE_SA
95 ike_sa_id_t
*ike_sa_id
;
98 * Assigned UDP packet.
100 * Stores incoming packet or last generated one.
105 * Linked List where payload data are stored in
107 linked_list_t
*payloads
;
112 * Implements message_t's set_ike_sa_id function.
113 * See #message_s.set_ike_sa_id.
115 static status_t
set_ike_sa_id (private_message_t
*this,ike_sa_id_t
*ike_sa_id
)
118 status
= ike_sa_id
->clone(ike_sa_id
,&(this->ike_sa_id
));
123 * Implements message_t's get_ike_sa_id function.
124 * See #message_s.get_ike_sa_id.
126 static status_t
get_ike_sa_id (private_message_t
*this,ike_sa_id_t
**ike_sa_id
)
129 if (this->ike_sa_id
== NULL
)
133 status
= this->ike_sa_id
->clone(this->ike_sa_id
,ike_sa_id
);
139 * Implements message_t's set_message_id function.
140 * See #message_s.set_message_id.
142 static status_t
set_message_id (private_message_t
*this,u_int32_t message_id
)
144 this->message_id
= message_id
;
150 * Implements message_t's set_message_id function.
151 * See #message_s.set_message_id.
153 static u_int32_t
get_message_id (private_message_t
*this)
155 return this->message_id
;
160 * Implements message_t's set_exchange_type function.
161 * See #message_s.set_exchange_type.
163 static status_t
set_exchange_type (private_message_t
*this,exchange_type_t exchange_type
)
165 this->exchange_type
= exchange_type
;
171 * Implements message_t's get_exchange_type function.
172 * See #message_s.get_exchange_type.
174 static exchange_type_t
get_exchange_type (private_message_t
*this)
176 return this->exchange_type
;
180 * Implements message_t's set_original_initiator function.
181 * See #message_s.set_original_initiator.
183 static status_t
set_original_initiator (private_message_t
*this,bool original_initiator
)
185 this->original_initiator
= original_initiator
;
190 * Implements message_t's get_original_initiator function.
191 * See #message_s.get_original_initiator.
193 static exchange_type_t
get_original_initiator (private_message_t
*this)
195 return this->original_initiator
;
199 * Implements message_t's set_request function.
200 * See #message_s.set_request.
202 static status_t
set_request (private_message_t
*this,bool request
)
204 this->is_request
= request
;
209 * Implements message_t's get_request function.
210 * See #message_s.get_request.
212 static exchange_type_t
get_request (private_message_t
*this)
214 return this->is_request
;
218 * Implements message_t's generate_packet function.
219 * See #message_s.generate_packet.
221 static status_t
generate_packet (private_message_t
*this, packet_t
**packet
)
223 if (this->exchange_type
== NOT_SET
)
225 return EXCHANGE_TYPE_NOT_SET
;
233 * Implements message_t's destroy function.
234 * See #message_s.destroy.
236 static status_t
destroy (private_message_t
*this)
238 if (this->packet
!= NULL
)
240 this->packet
->destroy(this->packet
);
242 if (this->ike_sa_id
!= NULL
)
244 this->ike_sa_id
->destroy(this->ike_sa_id
);
246 this->payloads
->destroy(this->payloads
);
247 allocator_free(this);
252 * Described in Header-File
254 message_t
*message_create_from_packet(packet_t
*packet
)
256 private_message_t
*this = allocator_alloc_thing(private_message_t
);
262 /* public functions */
263 this->public.set_message_id
= (status_t(*)(message_t
*, u_int32_t
))set_message_id
;
264 this->public.get_message_id
= (u_int32_t(*)(message_t
*))get_message_id
;
265 this->public.set_ike_sa_id
= (status_t(*)(message_t
*, ike_sa_id_t
*))set_ike_sa_id
;
266 this->public.get_ike_sa_id
= (status_t(*)(message_t
*, ike_sa_id_t
**))get_ike_sa_id
;
267 this->public.set_exchange_type
= (status_t(*)(message_t
*, exchange_type_t
))set_exchange_type
;
268 this->public.get_exchange_type
= (exchange_type_t(*)(message_t
*))get_exchange_type
;
269 this->public.set_original_initiator
= (status_t(*)(message_t
*, bool))set_original_initiator
;
270 this->public.get_original_initiator
= (bool(*)(message_t
*))get_original_initiator
;
271 this->public.set_request
= (status_t(*)(message_t
*, bool))set_request
;
272 this->public.get_request
= (bool(*)(message_t
*))get_request
;
273 this->public.generate_packet
= (status_t (*) (message_t
*, packet_t
**)) generate_packet
;
274 this->public.destroy
= (status_t(*)(message_t
*))destroy
;
277 this->exchange_type
= NOT_SET
;
278 this->original_initiator
= TRUE
;
279 this->is_request
= TRUE
;
280 this->first_payload_type
= NO_PAYLOAD
;
281 this->ike_sa_id
= NULL
;
282 this->message_id
= 0;
285 this->packet
= packet
;
286 this->payloads
= linked_list_create();
287 if (this->payloads
== NULL
)
289 allocator_free(this);
293 return (&this->public);
297 * Described in Header-File
299 message_t
*message_create()
301 return message_create_from_packet(NULL
);