2 * Copyright (C) 2005-2006 Martin Willi
3 * Copyright (C) 2005 Jan Hutter
4 * Hochschule fuer Technik Rapperswil
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2 of the License, or (at your
9 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 #include "unknown_payload.h"
21 typedef struct private_unknown_payload_t private_unknown_payload_t
;
24 * Private data of an unknown_payload_t object.
26 struct private_unknown_payload_t
{
29 * Public unknown_payload_t interface.
31 unknown_payload_t
public;
34 * Type of this payload
41 u_int8_t next_payload
;
54 * Length of this payload.
56 u_int16_t payload_length
;
65 * Encoding rules to parse an payload which is not further specified.
67 * The defined offsets are the positions in a object of type
68 * private_unknown_payload_t.
71 static encoding_rule_t encodings
[] = {
72 /* 1 Byte next payload type, stored in the field next_payload */
73 { U_INT_8
, offsetof(private_unknown_payload_t
, next_payload
) },
74 /* the critical bit */
75 { FLAG
, offsetof(private_unknown_payload_t
, critical
) },
76 /* 7 Bit reserved bits */
77 { RESERVED_BIT
, offsetof(private_unknown_payload_t
, reserved
[0]) },
78 { RESERVED_BIT
, offsetof(private_unknown_payload_t
, reserved
[1]) },
79 { RESERVED_BIT
, offsetof(private_unknown_payload_t
, reserved
[2]) },
80 { RESERVED_BIT
, offsetof(private_unknown_payload_t
, reserved
[3]) },
81 { RESERVED_BIT
, offsetof(private_unknown_payload_t
, reserved
[4]) },
82 { RESERVED_BIT
, offsetof(private_unknown_payload_t
, reserved
[5]) },
83 { RESERVED_BIT
, offsetof(private_unknown_payload_t
, reserved
[6]) },
84 /* Length of the whole payload*/
85 { PAYLOAD_LENGTH
, offsetof(private_unknown_payload_t
, payload_length
) },
86 /* some unknown data bytes, length is defined in PAYLOAD_LENGTH */
87 { UNKNOWN_DATA
, offsetof(private_unknown_payload_t
, data
) },
92 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
93 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
94 ! Next Payload !C! RESERVED ! Payload Length !
95 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
99 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
102 METHOD(payload_t
, verify
, status_t
,
103 private_unknown_payload_t
*this)
105 if (this->payload_length
!= UNKNOWN_PAYLOAD_HEADER_LENGTH
+ this->data
.len
)
112 METHOD(payload_t
, get_encoding_rules
, int,
113 private_unknown_payload_t
*this, encoding_rule_t
**rules
)
116 return countof(encodings
);
119 METHOD(payload_t
, get_payload_type
, payload_type_t
,
120 private_unknown_payload_t
*this)
125 METHOD(payload_t
, get_next_type
, payload_type_t
,
126 private_unknown_payload_t
*this)
128 return this->next_payload
;
131 METHOD(payload_t
, set_next_type
, void,
132 private_unknown_payload_t
*this,payload_type_t type
)
134 this->next_payload
= type
;
137 METHOD(payload_t
, get_length
, size_t,
138 private_unknown_payload_t
*this)
140 return this->payload_length
;
143 METHOD(unknown_payload_t
, is_critical
, bool,
144 private_unknown_payload_t
*this)
146 return this->critical
;
149 METHOD(unknown_payload_t
, get_data
, chunk_t
,
150 private_unknown_payload_t
*this)
155 METHOD2(payload_t
, unknown_payload_t
, destroy
, void,
156 private_unknown_payload_t
*this)
158 free(this->data
.ptr
);
163 * Described in header
165 unknown_payload_t
*unknown_payload_create(payload_type_t type
)
167 private_unknown_payload_t
*this;
171 .payload_interface
= {
173 .get_encoding_rules
= _get_encoding_rules
,
174 .get_length
= _get_length
,
175 .get_next_type
= _get_next_type
,
176 .set_next_type
= _set_next_type
,
177 .get_type
= _get_payload_type
,
180 .is_critical
= _is_critical
,
181 .get_data
= _get_data
,
184 .next_payload
= NO_PAYLOAD
,
185 .payload_length
= UNKNOWN_PAYLOAD_HEADER_LENGTH
,
189 return &this->public;
194 * Described in header
196 unknown_payload_t
*unknown_payload_create_data(payload_type_t type
,
197 bool critical
, chunk_t data
)
199 private_unknown_payload_t
*this;
201 this = (private_unknown_payload_t
*)unknown_payload_create(type
);
203 this->critical
= critical
;
204 this->payload_length
= UNKNOWN_PAYLOAD_HEADER_LENGTH
+ data
.len
;
206 return &this->public;