|
1 /* |
|
2 * Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of "Eclipse Public License v1.0" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - initial contribution. |
|
11 * |
|
12 * Contributors: |
|
13 * |
|
14 * Description: Payload classes. |
|
15 * |
|
16 */ |
|
17 #ifndef _IKEV2PAYLOADS_H_ |
|
18 #define _IKEV2PAYLOADS_H_ |
|
19 #include "ikev2const.h" |
|
20 #include "ikemsgheader.h" |
|
21 |
|
22 // |
|
23 // GENERIC PAYLOAD HEADER |
|
24 // |
|
25 // 1 2 3 |
|
26 // 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 |
|
27 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
28 // ! Next Payload !C! RESERVED ! Payload Length ! |
|
29 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
30 // |
|
31 class TPayloadIkev2 |
|
32 { |
|
33 public: |
|
34 static inline TInt Size() { return sizeof(TPayloadIkev2); } |
|
35 static inline TPayloadIkev2* Cast(const TAny* aPayload) { return (TPayloadIkev2*)aPayload; } |
|
36 inline void Init() { PUT32(&u.iData8[0], 0);} |
|
37 inline TUint8 GetNextPayload() { return u.iData8[0]; } |
|
38 inline void SetNextPayload(TUint8 aPayload) { u.iData8[0] = aPayload; } |
|
39 inline TUint16 GetLength() const { return (TUint16)GET16(&u.iData8[2]); } |
|
40 inline void SetLength(TUint16 aLength) { PUT16(&u.iData8[2], aLength); } |
|
41 inline TBool GetCritical() const { return ((u.iData8[1] & IKEV2_PL_CRITICAL) == IKEV2_PL_CRITICAL); } |
|
42 inline void SetReserved() { u.iData8[1] &= IKEV2_PL_CRITICAL; } |
|
43 inline void SetCritical() { u.iData8[1] |= IKEV2_PL_CRITICAL; } |
|
44 inline TUint8* PayloadPtr() { return (TUint8 *)((char *)this); } |
|
45 inline TUint8* PayloadData() const |
|
46 { return (TUint8 *)((char *)this + sizeof(*this)); } //returns a * to the specific data of this payload |
|
47 inline const TUint PlDataLen() const |
|
48 { if ( GetLength() > sizeof(*this) ) |
|
49 return (GetLength() - sizeof(*this)); |
|
50 else return 0; |
|
51 } //returns a * to the specific data of this payload |
|
52 inline TPayloadIkev2 *Next() const |
|
53 { return (TPayloadIkev2 *)((char *)this + GetLength()); } |
|
54 // |
|
55 // The following methods are used to manage "ENCRYPTED" bit (0) |
|
56 // in payload reserved field. This bit is set to 1 when a |
|
57 // payload has been received within a encrypted payload. |
|
58 // Encrypted bit is NEVER set into transmitted payload. |
|
59 // |
|
60 inline TBool Encrypted() const { return ((u.iData8[1] & IKEV2_PL_ENCRYPTED) == IKEV2_PL_ENCRYPTED); } |
|
61 inline void SetEncrypted() { u.iData8[1] |= IKEV2_PL_ENCRYPTED; } |
|
62 inline void ResetEncrypted() { u.iData8[1] &= ~IKEV2_PL_ENCRYPTED; } |
|
63 |
|
64 private: |
|
65 union |
|
66 { |
|
67 TUint32 iData32[1]; |
|
68 TUint16 iData16[2]; |
|
69 TUint8 iData8[4]; |
|
70 } u; |
|
71 }; |
|
72 |
|
73 #define TSAPayload TPayloadIkev2 |
|
74 #define TNoncePayload TPayloadIkev2 |
|
75 #define TVendorPlIkev2 TPayloadIkev2 |
|
76 #define TEAPPayloadIkev2 TPayloadIkev2 |
|
77 // |
|
78 // Transform Attributes |
|
79 // |
|
80 // In this phase there is only one attribute defined for IKEv2 which is |
|
81 // encryption key length for transform type Encryption Algorithm |
|
82 // |
|
83 // 1 2 3 |
|
84 // 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 |
|
85 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
86 // !A! Attribute Type ! AF=0 Attribute Length ! |
|
87 // !F! ! AF=1 Attribute Value ! |
|
88 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
89 // ! AF=0 Attribute Value ! |
|
90 // ! AF=1 Not Transmitted ! |
|
91 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
92 // |
|
93 class TDataAttributes |
|
94 { |
|
95 public: |
|
96 inline TInt Size() const { return sizeof(*this); } |
|
97 inline TBool IsBasic() const {return ((u.iData8[0] & 0x80) != 0);} //return if basic attrib or variable |
|
98 inline void SetBasic() { u.iData8[0] |= 0x80;} |
|
99 inline void SetVariable() { u.iData8[0] &= 0x7f;} |
|
100 inline TUint16 GetType() { return TUint16(GET16(&u.iData16[0]) & 0x7fff);} |
|
101 inline void SetType(TUint16 aType) { PUT16(&u.iData16[0], aType);} |
|
102 inline TUint16 GetValue() { return TUint16(GET16(&u.iData16[1]));} |
|
103 inline void SetValue(TUint16 aValue) { PUT16(&u.iData16[1], aValue); } |
|
104 inline TUint8* Data() {return (TUint8*)((TUint8*)this + Size());} |
|
105 inline TDataAttributes* Next() |
|
106 { |
|
107 if ( IsBasic() ) |
|
108 return (TDataAttributes*)((TUint8*)this + Size()); |
|
109 else return (TDataAttributes*)((TUint8*)this + (Size() + (TInt)GetValue())); |
|
110 } |
|
111 |
|
112 private: |
|
113 union |
|
114 { |
|
115 TUint32 iData32[1]; |
|
116 TUint16 iData16[2]; |
|
117 TUint8 iData8[4]; |
|
118 } u; |
|
119 }; |
|
120 |
|
121 // |
|
122 // Transform Payload |
|
123 // 1 2 3 |
|
124 // 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 |
|
125 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
126 // ! 0 (last) or 3 ! RESERVED ! Transform Length ! |
|
127 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
128 // !Transform Type ! RESERVED ! Transform ID ! |
|
129 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
130 // ! ! |
|
131 // ~ Transform Attributes ~ |
|
132 // ! ! |
|
133 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
134 // |
|
135 class TTransformIkev2 |
|
136 { |
|
137 public: |
|
138 static inline TTransformIkev2* Cast(const TAny* aPayload) { return (TTransformIkev2*)aPayload; } |
|
139 inline void Init() { PUT32(&u.iData8[0], 0);} |
|
140 inline TInt Size() const { return sizeof(*this); } |
|
141 inline TUint8 GetType() const { return u.iData8[4]; }; |
|
142 inline void SetType(TUint8 aPayload) { u.iData8[4] = aPayload; }; |
|
143 inline TUint16 GetID() const { return (TUint16)GET16(&u.iData16[3]); }; |
|
144 inline void SetID(TUint16 aId) { PUT16(&u.iData16[3], aId); }; |
|
145 inline void SetReserved() { u.iData8[5] = 0; }; |
|
146 inline TDataAttributes* Attributes() const {return (TDataAttributes*)((TUint8*)this + Size()); } |
|
147 // |
|
148 // The following methods are used to manage "SELECTED" bit (0) |
|
149 // in teh Transform payload reserved field. This bit is set to 1 when |
|
150 // the transform payload has been selected into acceptable |
|
151 // proposal. |
|
152 // "SELECTED" is NEVER set into transmitted payload. |
|
153 // |
|
154 inline TBool IsSelected() { return ((u.iData8[5] & IKEV2_PL_SELECTED) == IKEV2_PL_SELECTED);} |
|
155 inline void Selected() { u.iData8[5] |= IKEV2_PL_SELECTED; } |
|
156 inline void NotSelected() { u.iData8[5] &= ~IKEV2_PL_SELECTED; } |
|
157 |
|
158 private: |
|
159 union |
|
160 { |
|
161 TUint32 iData32[2]; |
|
162 TUint16 iData16[4]; |
|
163 TUint8 iData8[8]; |
|
164 } u; |
|
165 |
|
166 }; |
|
167 |
|
168 // |
|
169 // Proposal Payload |
|
170 // 1 2 3 |
|
171 // 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 |
|
172 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
173 // ! 0 (last) or 2 ! RESERVED ! Proposal Length ! |
|
174 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
175 // ! Proposal # ! Protocol ID ! SPI Size !# of Transforms! |
|
176 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
177 // ~ SPI (variable) ~ |
|
178 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
179 // ! ! |
|
180 // ~ <Transforms> ~ |
|
181 // ! ! |
|
182 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
183 // |
|
184 class TProposalIkev2 |
|
185 { |
|
186 public: |
|
187 static inline TProposalIkev2 *Cast(const TAny* aPayload) { return (TProposalIkev2 *)aPayload;} |
|
188 inline TInt Size() const { return sizeof(*this); } |
|
189 inline TUint8 GetNum() const { return u.iData8[4]; } |
|
190 inline void SetNum(TUint8 aNumber) { u.iData8[4] = aNumber; } |
|
191 inline TUint8 GetProtocol() const { return u.iData8[5]; } |
|
192 inline void SetProtocol(TUint8 aProtocol) { u.iData8[5] = aProtocol; } |
|
193 inline TUint8 GetSPISize() const { return u.iData8[6]; } |
|
194 inline void SetSPISize(TUint8 aSpiSize) { u.iData8[6] = aSpiSize; } |
|
195 inline TUint8 GetNumTrans() const { return u.iData8[7]; }; |
|
196 inline void SetNumTrans(TUint8 aNumber) { u.iData8[7] = aNumber; } |
|
197 inline TTransformIkev2* TransformPl() const //next payload (transform) |
|
198 { return (TTransformIkev2*)((TUint8*)this + sizeof(*this) + GetSPISize()); } |
|
199 inline TUint8 *SPI() {return (TUint8 *)((TUint8*)this + sizeof(*this));} //*to the SPI |
|
200 inline void GetIpsecSPI(TUint32* aSPI) const {Mem::Copy( (TUint8*)aSPI, ((TUint8*)this + sizeof(*this)), 4); } |
|
201 inline void SetIpsecSPI(TUint32 aSPI) { Mem::Copy(((TUint8*)this + sizeof(*this)), (TUint8*)&aSPI, 4); } |
|
202 inline TInt PropHdrLth() const { return (Size() + (TInt)GetSPISize()); } |
|
203 inline TBool Last() const { return u.iData8[0] == 0;} |
|
204 |
|
205 private: |
|
206 union |
|
207 { |
|
208 TUint32 iData32[2]; |
|
209 TUint16 iData16[4]; |
|
210 TUint8 iData8[8]; |
|
211 } u; |
|
212 |
|
213 }; |
|
214 |
|
215 // |
|
216 // Key Exchange Payload |
|
217 // 1 2 3 |
|
218 // 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 |
|
219 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
220 // ! Next Payload !C! RESERVED ! Payload Length ! |
|
221 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
222 // ! DH Group # ! RESERVED ! |
|
223 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
224 // ! ! |
|
225 // ~ Key Exchange Data ~ |
|
226 // ! ! |
|
227 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
228 // |
|
229 class TKEPayloadIkev2 |
|
230 { |
|
231 public: |
|
232 static inline TKEPayloadIkev2 *Cast(const TAny* aPayload) { return (TKEPayloadIkev2 *)aPayload;} |
|
233 static inline TInt Size() { return sizeof(TKEPayloadIkev2); } |
|
234 inline TUint16 GetDHGroup() const { return (TUint16)GET16(&u.iData16[2]); }; |
|
235 inline void SetDHGroup(TUint16 aGroup) { PUT16(&u.iData16[2], aGroup); }; |
|
236 inline void SetReserved() { PUT16(&u.iData16[3], 0); }; |
|
237 inline TUint8 *DHPublic() {return (TUint8 *)((TUint8*)this + sizeof(*this));} |
|
238 inline TUint8 GetNextPayload() { return u.iData8[0]; } |
|
239 |
|
240 private: |
|
241 union |
|
242 { |
|
243 TUint32 iData32[2]; |
|
244 TUint16 iData16[4]; |
|
245 TUint8 iData8[8]; |
|
246 } u; |
|
247 |
|
248 }; |
|
249 |
|
250 // |
|
251 // Identification Payload |
|
252 // 1 2 3 |
|
253 // 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 |
|
254 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
255 // ! Next Payload !C! RESERVED ! Payload Length ! |
|
256 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
257 // ! ID Type ! RESERVED | |
|
258 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
259 // ! ! |
|
260 // ~ Identification Data ~ |
|
261 // ! ! |
|
262 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
263 // |
|
264 class TIDPayloadIkev2 |
|
265 { |
|
266 public: |
|
267 static inline TIDPayloadIkev2 *Cast(const TAny* aPayload) { return (TIDPayloadIkev2 *)aPayload;} |
|
268 static inline TInt Size() { return sizeof(TIDPayloadIkev2); } |
|
269 inline TUint8 GetIdType() { return u.iData8[4]; }; |
|
270 inline void SetIdType(TUint8 aIdType) { u.iData8[4] = aIdType; }; |
|
271 inline void SetReserved() { PUT16(&u.iData16[3], 0); u.iData8[5] = 0; }; |
|
272 inline TUint8 *IdData() {return (TUint8*)((TUint8*)this + sizeof(*this));} |
|
273 inline TUint8 GetNextPayload() { return u.iData8[0]; } |
|
274 |
|
275 private: |
|
276 union |
|
277 { |
|
278 TUint32 iData32[2]; |
|
279 TUint16 iData16[4]; |
|
280 TUint8 iData8[8]; |
|
281 } u; |
|
282 |
|
283 }; |
|
284 |
|
285 // |
|
286 // Authentication Payload |
|
287 // 1 2 3 |
|
288 // 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 |
|
289 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
290 // ! Next Payload !C! RESERVED ! Payload Length ! |
|
291 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
292 // ! Auth Method ! RESERVED ! |
|
293 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
294 // ! ! |
|
295 // ~ Authentication Data ~ |
|
296 // ! ! |
|
297 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
298 // |
|
299 class TAuthPayloadIkev2 |
|
300 { |
|
301 public: |
|
302 static inline TAuthPayloadIkev2 *Cast(const TAny* aPayload) { return (TAuthPayloadIkev2 *)aPayload;} |
|
303 static inline TInt Size() { return sizeof(TAuthPayloadIkev2); } |
|
304 inline TUint8 GetAuthMethod() { return u.iData8[4]; }; |
|
305 inline void SetAuthMethod(TUint8 aMethod) { u.iData8[4] = aMethod; }; |
|
306 inline void SetReserved() { PUT16(&u.iData16[3], 0); u.iData8[5] = 0; }; |
|
307 inline TUint8 *AuthData() {return (TUint8*)((TUint8*)this + sizeof(*this));} |
|
308 |
|
309 private: |
|
310 union |
|
311 { |
|
312 TUint32 iData32[2]; |
|
313 TUint16 iData16[4]; |
|
314 TUint8 iData8[8]; |
|
315 } u; |
|
316 |
|
317 }; |
|
318 |
|
319 // |
|
320 // Traffic Selector Payload |
|
321 // 1 2 3 |
|
322 // 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 |
|
323 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
324 // ! Next Payload !C! RESERVED ! Payload Length ! |
|
325 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
326 // ! Number of TSs ! RESERVED ! |
|
327 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
328 // ! ! |
|
329 // ~ <Traffic Selectors> ~ |
|
330 // ! ! |
|
331 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
332 // |
|
333 class TTSPayloadIkev2 |
|
334 { |
|
335 public: |
|
336 static inline TTSPayloadIkev2 *Cast(const TAny* aPayload) { return (TTSPayloadIkev2 *)aPayload;} |
|
337 static inline TInt Size() { return sizeof(TTSPayloadIkev2); } |
|
338 inline TUint8 GetNumberOfTs() { return u.iData8[4]; }; |
|
339 inline void SetNumberOfTs(TUint8 aNumber) { u.iData8[4] = aNumber; }; |
|
340 inline void SetReserved() { PUT16(&u.iData16[3], 0); u.iData8[5] = 0; }; |
|
341 inline TUint8* TrafficSelectors() {return (TUint8*)((TUint8*)this + sizeof(*this));} |
|
342 inline TUint8 GetNextPayload() { return u.iData8[0]; } |
|
343 |
|
344 private: |
|
345 union |
|
346 { |
|
347 TUint32 iData32[2]; |
|
348 TUint16 iData16[4]; |
|
349 TUint8 iData8[8]; |
|
350 } u; |
|
351 |
|
352 }; |
|
353 |
|
354 // |
|
355 // Traffic Selector |
|
356 // 1 2 3 |
|
357 // 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 |
|
358 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
359 // ! TS Type !IP Protocol ID*| Selector Length | |
|
360 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
361 // | Start Port* | End Port* | |
|
362 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
363 // ! ! |
|
364 // ~ Starting Address* ~ |
|
365 // ! ! |
|
366 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
367 // ! ! |
|
368 // ~ Ending Address* ~ |
|
369 // ! ! |
|
370 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
371 // |
|
372 class TTrafficSelector |
|
373 { |
|
374 public: |
|
375 static inline TTrafficSelector* Cast(const TAny* aPayload) { return (TTrafficSelector *)aPayload;} |
|
376 static inline TInt Size() { return sizeof(TTrafficSelector); } |
|
377 inline void Init() { PUT32(&u.iData8[0], 0); PUT32(&u.iData8[4], 0); }; |
|
378 inline void SetLength(TUint16 aLth) { PUT16(&u.iData8[2], aLth); }; |
|
379 inline void SetType(TUint8 aType) { u.iData8[0] = aType; }; |
|
380 inline void SetProtocol(TUint8 aProt) { u.iData8[1] = aProt; }; |
|
381 inline void SetStartPort(TUint16 aPort) { PUT16(&u.iData8[4], aPort); }; |
|
382 inline void SetEndPort(TUint16 aPort) { PUT16(&u.iData8[6], aPort); }; |
|
383 inline TUint16 Length() const { return (TUint16)GET16(&u.iData8[2]); }; |
|
384 inline TUint16 StartPort() const { return (TUint16)GET16(&u.iData8[4]); }; |
|
385 inline TUint16 EndPort() const { return (TUint16)GET16(&u.iData8[6]); }; |
|
386 inline TUint8 Protocol() const { return u.iData8[1]; }; |
|
387 inline TUint8 Type() const { return u.iData8[0]; }; |
|
388 inline const TUint8 *Addresses() const {return (TUint8*)((TUint8*)this + sizeof(*this));} |
|
389 private: |
|
390 union |
|
391 { |
|
392 TUint32 iData32[2]; |
|
393 TUint16 iData16[4]; |
|
394 TUint8 iData8[8]; |
|
395 } u; |
|
396 |
|
397 }; |
|
398 |
|
399 |
|
400 // |
|
401 // Certificate Payload |
|
402 // 1 2 3 |
|
403 // 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 |
|
404 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
405 // ! Next Payload !C! RESERVED ! Payload Length ! |
|
406 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
407 // ! Cert Encoding ! ! |
|
408 // +-+-+-+-+-+-+-+-+ ! |
|
409 // ~ Certificate Data ~ |
|
410 // ! ! |
|
411 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
412 // |
|
413 class TCertPayloadIkev2 |
|
414 { |
|
415 public: |
|
416 static inline TCertPayloadIkev2 *Cast(const TAny* aPayload) { return (TCertPayloadIkev2 *)aPayload;} |
|
417 static inline TInt Size() { return sizeof(TPayloadIkev2) + sizeof(char); } |
|
418 inline TUint8 GetEncoding() const { return u.iData8[4]; }; |
|
419 inline void SetEncoding(TUint8 aEncoding) { u.iData8[4] = aEncoding; }; |
|
420 inline TUint8 *Certificate() const {return (TUint8*)((TUint8*)this + Size());} |
|
421 inline TUint8 GetNextPayload() const { return u.iData8[0]; } |
|
422 |
|
423 private: |
|
424 union |
|
425 { |
|
426 TUint8 iData8[5]; |
|
427 } u; |
|
428 }; |
|
429 // |
|
430 // Certificate Request Payload |
|
431 // 1 2 3 |
|
432 // 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 |
|
433 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
434 // ! Next Payload !C! RESERVED ! Payload Length ! |
|
435 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
436 // ! Cert Encoding ! ! |
|
437 // +-+-+-+-+-+-+-+-+ ! |
|
438 // ~ Certification Authority ~ |
|
439 // ! ! |
|
440 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
441 // |
|
442 class TCReqPayloadIkev2 |
|
443 { |
|
444 public: |
|
445 static inline TCReqPayloadIkev2 *Cast(const TAny* aPayload) { return (TCReqPayloadIkev2 *)aPayload;} |
|
446 static inline TInt Size() { return sizeof(TPayloadIkev2) + sizeof(char); } |
|
447 inline TUint8 GetEncoding() const { return u.iData8[4]; }; |
|
448 inline void SetEncoding(TUint8 aEncoding) { u.iData8[4] = aEncoding; }; |
|
449 inline TUint8* Authority() const {return (TUint8*)((TUint8*)this + Size());} |
|
450 inline TUint8 GetNextPayload() { return u.iData8[0]; } |
|
451 |
|
452 private: |
|
453 union |
|
454 { |
|
455 TUint8 iData8[5]; |
|
456 } u; |
|
457 }; |
|
458 |
|
459 // |
|
460 // Notify Payload |
|
461 // 1 2 3 |
|
462 // 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 |
|
463 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
464 // ! Next Payload !C! RESERVED ! Payload Length ! |
|
465 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
466 // ! Protocol ID ! SPI Size ! Notify Message Type ! |
|
467 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
468 // ! ! |
|
469 // ~ Security Parameter Index (SPI) ~ |
|
470 // ! ! |
|
471 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
472 // ! ! |
|
473 // ~ Notification Data ~ |
|
474 // ! ! |
|
475 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
476 // |
|
477 class TNotifPayloadIkev2 |
|
478 { |
|
479 public: |
|
480 static inline TNotifPayloadIkev2 *Cast(const TAny* aPayload) { return (TNotifPayloadIkev2 *)aPayload;} |
|
481 static inline TInt Size() { return sizeof(TNotifPayloadIkev2); } |
|
482 inline TUint8 GetProtocolId() { return u.iData8[4]; }; |
|
483 inline void SetProtocolId(TUint8 aProtId) { u.iData8[4] = aProtId; }; |
|
484 inline TUint8 GetSPISize() const { return u.iData8[5]; } |
|
485 inline void SetSPISize(TUint8 aSpiSize) { u.iData8[5] = aSpiSize; } |
|
486 inline TUint16 GetMsgType() const { return (TUint16)GET16(&u.iData16[3]); }; |
|
487 inline void SetMsgType(TUint16 aType) { PUT16(&u.iData16[3], aType); }; |
|
488 inline TUint8* SPI() {return (TUint8*)((TUint8*)this + sizeof(*this));} |
|
489 inline TUint8* NotifData() const {return (TUint8*)((TUint8*)this + Size() + GetSPISize());} |
|
490 inline TUint NotifDataLength() const { return TPayloadIkev2::Cast(this)->GetLength() - Size() - GetSPISize(); } |
|
491 private: |
|
492 union |
|
493 { |
|
494 TUint32 iData32[2]; |
|
495 TUint16 iData16[4]; |
|
496 TUint8 iData8[8]; |
|
497 } u; |
|
498 |
|
499 }; |
|
500 |
|
501 // |
|
502 // Delete Payload |
|
503 // 1 2 3 |
|
504 // 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 |
|
505 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
506 // ! Next Payload !C! RESERVED ! Payload Length ! |
|
507 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
508 // ! Protocol ID ! SPI Size ! # of SPIs ! |
|
509 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
510 // ! ! |
|
511 // ~ Security Parameter Index(es) (SPI) ~ |
|
512 // ! ! |
|
513 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
514 // |
|
515 class TDeletePlIkev2 |
|
516 { |
|
517 public: |
|
518 static inline TDeletePlIkev2 *Cast(const TAny* aPayload) { return (TDeletePlIkev2 *)aPayload;} |
|
519 static inline TInt Size() { return sizeof(TDeletePlIkev2); } |
|
520 inline TUint8 GetProtocolId() const { return u.iData8[4]; }; |
|
521 inline void SetProtocolId(TUint8 aProtId) { u.iData8[4] = aProtId; }; |
|
522 inline TUint8 GetSPISize() const { return u.iData8[5]; } |
|
523 inline void SetSPISize(TUint8 aSpiSize) { u.iData8[5] = aSpiSize; } |
|
524 inline TUint16 GetNbrOfSpis() const { return (TUint16)GET16(&u.iData16[3]); }; |
|
525 inline void SetNbrOfSpis(TUint16 aType) { PUT16(&u.iData16[3], aType); }; |
|
526 inline const TUint8* SPIs() const {return (TUint8*)((TUint8*)this + sizeof(*this));} |
|
527 private: |
|
528 union |
|
529 { |
|
530 TUint32 iData32[2]; |
|
531 TUint16 iData16[4]; |
|
532 TUint8 iData8[8]; |
|
533 } u; |
|
534 |
|
535 }; |
|
536 |
|
537 // |
|
538 // Configuration Payload |
|
539 // 1 2 3 |
|
540 // 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 |
|
541 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
542 // ! Next Payload !C! RESERVED ! Payload Length ! |
|
543 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
544 // ! CFG Type ! RESERVED ! |
|
545 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
546 // ! ! |
|
547 // ~ Configuration Attributes ~ |
|
548 // ! ! |
|
549 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|
550 // |
|
551 class TCPPayloadIkev2 |
|
552 { |
|
553 public: |
|
554 static inline TCPPayloadIkev2 *Cast(const TAny* aPayload) { return (TCPPayloadIkev2 *)aPayload;} |
|
555 static inline TInt Size() { return sizeof(TCPPayloadIkev2); } |
|
556 inline TUint8 GetCFGType() { return u.iData8[4]; }; |
|
557 inline void SetCFGType(TUint8 aCFGType) { u.iData8[4] = aCFGType; }; |
|
558 inline void SetReserved() { PUT16(&u.iData16[3], 0); u.iData8[5] = 0; }; |
|
559 inline TDataAttributes* Attributes() {return (TDataAttributes*)((TUint8*)this + sizeof(*this));} |
|
560 |
|
561 private: |
|
562 union |
|
563 { |
|
564 TUint32 iData32[2]; |
|
565 TUint16 iData16[4]; |
|
566 TUint8 iData8[8]; |
|
567 } u; |
|
568 |
|
569 }; |
|
570 |
|
571 #endif |