auth_diameter: use file specific include guard
[sip-router] / src / modules / auth_diameter / diameter_msg.h
1 /*
2  * Copyright (C) 2002-2003 FhG Fokus
3  *
4  * This file is part of disc, a free diameter server/client.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19  */
20
21
22
23 #ifndef _AUTH_DIAM_MESSAGE_H_
24 #define _AUTH_DIAM_MESSAGE_H_
25
26 #include "../../core/str.h"
27 #include "../../core/mem/mem.h"
28 #include "../../core/endianness.h"
29
30 #define ad_malloc       pkg_malloc
31 #define ad_free         pkg_free
32
33 /*********************************** AAA TYPES *******************************/
34
35 #define AAA_NO_VENDOR_ID           0
36
37 #define VER_SIZE                   1
38 #define MESSAGE_LENGTH_SIZE        3
39 #define FLAGS_SIZE                 1
40 #define COMMAND_CODE_SIZE          3
41 #define APPLICATION_ID_SIZE        4
42 #define HOP_BY_HOP_IDENTIFIER_SIZE 4
43 #define END_TO_END_IDENTIFIER_SIZE 4
44 #define AVP_CODE_SIZE      4
45 #define AVP_FLAGS_SIZE     1
46 #define AVP_LENGTH_SIZE    3
47 #define AVP_VENDOR_ID_SIZE 4
48
49 #define AAA_MSG_HDR_SIZE  \
50         (VER_SIZE + MESSAGE_LENGTH_SIZE + FLAGS_SIZE + COMMAND_CODE_SIZE +\
51         APPLICATION_ID_SIZE+HOP_BY_HOP_IDENTIFIER_SIZE+END_TO_END_IDENTIFIER_SIZE)
52
53 #define AVP_HDR_SIZE(_flags_)  \
54         (AVP_CODE_SIZE+AVP_FLAGS_SIZE+AVP_LENGTH_SIZE+\
55         AVP_VENDOR_ID_SIZE*(((_flags_)&AAA_AVP_FLAG_VENDOR_SPECIFIC)!=0) )
56
57 /* message codes
58  */
59 #ifndef __IS_BIG_ENDIAN
60         #define AS_MSG_CODE      0x12010000
61         #define AC_MSG_CODE      0x0f010000
62         #define CE_MSG_CODE      0x01010000
63         #define DW_MSG_CODE      0x18010000
64         #define DP_MSG_CODE      0x1a010000
65         #define RA_MSG_CODE      0x02010000
66         #define ST_MSG_CODE      0x13010000
67         #define MASK_MSG_CODE    0xffffff00
68 #else
69         #define AS_MSG_CODE      0x00000112
70         #define AC_MSG_CODE      0x0000010f
71         #define CE_MSG_CODE      0x00000101
72         #define DW_MSG_CODE      0x00000118
73         #define DP_MSG_CODE      0x0000011a
74         #define RA_MSG_CODE      0x00000102
75         #define ST_MSG_CODE      0x00000113
76         #define MASK_MSG_CODE    0x00ffffff
77 #endif
78
79
80
81 typedef unsigned int    AAACommandCode;
82 typedef unsigned int    AAAVendorId;
83 typedef unsigned int    AAAExtensionId;
84 typedef unsigned int    AAA_AVPCode;
85 typedef unsigned int    AAAValue;
86 typedef unsigned int    AAAApplicationId;
87 typedef void*           AAAApplicationRef;
88 typedef str             AAASessionId;
89 typedef unsigned int    AAAMsgIdentifier;
90 typedef unsigned char   AAAMsgFlag;
91
92
93
94 /* Status codes returned by functions in the AAA API */
95 typedef enum {
96         AAA_ERR_NOT_FOUND = -2,         /* handle or id not found */
97         AAA_ERR_FAILURE   = -1,         /* unspecified failure during an AAA op. */
98         AAA_ERR_SUCCESS   =  0,         /* AAA operation succeeded */
99         AAA_ERR_NOMEM,                  /* op. caused memory to be exhausted */
100         AAA_ERR_PROTO,                  /*  AAA protocol error */
101         AAA_ERR_SECURITY,
102         AAA_ERR_PARAMETER,
103         AAA_ERR_CONFIG,
104         AAA_ERR_UNKNOWN_CMD,
105         AAA_ERR_MISSING_AVP,
106         AAA_ERR_ALREADY_INIT,
107         AAA_ERR_TIMED_OUT,
108         AAA_ERR_CANNOT_SEND_MSG,
109         AAA_ERR_ALREADY_REGISTERED,
110         AAA_ERR_CANNOT_REGISTER,
111         AAA_ERR_NOT_INITIALIZED,
112         AAA_ERR_NETWORK_ERROR,
113 } AAAReturnCode;
114
115
116 /* The following are AVP data type codes. They correspond directly to
117  * the AVP data types outline in the Diameter specification [1]: */
118 typedef enum {
119         AAA_AVP_DATA_TYPE,
120         AAA_AVP_STRING_TYPE,
121         AAA_AVP_ADDRESS_TYPE,
122         AAA_AVP_INTEGER32_TYPE,
123         AAA_AVP_INTEGER64_TYPE,
124         AAA_AVP_TIME_TYPE,
125 } AAA_AVPDataType;
126
127
128 /* The following are used for AVP header flags and for flags in the AVP
129  *  wrapper struct and AVP dictionary definitions. */
130 typedef enum {
131         AAA_AVP_FLAG_NONE               = 0x00,
132         AAA_AVP_FLAG_MANDATORY          = 0x40,
133         AAA_AVP_FLAG_RESERVED           = 0x1F,
134         AAA_AVP_FLAG_VENDOR_SPECIFIC    = 0x80,
135         AAA_AVP_FLAG_END_TO_END_ENCRYPT = 0x20,
136 } AAA_AVPFlag;
137
138
139 /* List with all known application identifiers */
140 typedef enum {
141         AAA_APP_DIAMETER_COMMON_MSG  = 0,
142         AAA_APP_NASREQ               = 1,
143         AAA_APP_MOBILE_IP            = 2,
144         AAA_APP_DIAMETER_BASE_ACC    = 3,
145         AAA_APP_RELAY                = (int)0xffffffff,
146 }AAA_APP_IDS;
147
148
149 /* The following are the result codes returned from remote servers as
150  * part of messages */
151 typedef enum {
152         AAA_MUTI_ROUND_AUTH           = 1001,
153         AAA_SUCCESS                   = 2001,
154         AAA_COMMAND_UNSUPPORTED       = 3001,
155         AAA_UNABLE_TO_DELIVER         = 3002,
156         AAA_REALM_NOT_SERVED          = 3003,
157         AAA_TOO_BUSY                  = 3004,
158         AAA_LOOP_DETECTED             = 3005,
159         AAA_REDIRECT_INDICATION       = 3006,
160         AAA_APPLICATION_UNSUPPORTED   = 3007,
161         AAA_INVALID_HDR_BITS          = 3008,
162         AAA_INVALID_AVP_BITS          = 3009,
163         AAA_UNKNOWN_PEER              = 3010,
164         AAA_AUTHENTICATION_REJECTED   = 4001,
165         AAA_OUT_OF_SPACE              = 4002,
166         AAA_ELECTION_LOST             = 4003,
167         AAA_AVP_UNSUPPORTED           = 5001,
168         AAA_UNKNOWN_SESSION_ID        = 5002,
169         AAA_AUTHORIZATION_REJECTED    = 5003,
170         AAA_INVALID_AVP_VALUE         = 5004,
171         AAA_MISSING_AVP               = 5005,
172         AAA_RESOURCES_EXCEEDED        = 5006,
173         AAA_CONTRADICTING_AVPS        = 5007,
174         AAA_AVP_NOT_ALLOWED           = 5008,
175         AAA_AVP_OCCURS_TOO_MANY_TIMES = 5009,
176         AAA_NO_COMMON_APPLICATION     = 5010,
177         AAA_UNSUPPORTED_VERSION       = 5011,
178         AAA_UNABLE_TO_COMPLY          = 5012,
179         AAA_INVALID_BIT_IN_HEADER     = 5013,
180         AAA_INVALIS_AVP_LENGTH        = 5014,
181         AAA_INVALID_MESSGE_LENGTH     = 5015,
182         AAA_INVALID_AVP_BIT_COMBO     = 5016,
183         AAA_NO_COMMON_SECURITY        = 5017,
184 } AAAResultCode;
185
186
187 typedef enum {
188         AVP_User_Name                     =    1,
189         AVP_Class                         =   25,
190         AVP_Session_Timeout               =   27,
191         AVP_Proxy_State                   =   33,
192         AVP_Host_IP_Address               =  257,
193         AVP_Auth_Application_Id            =  258,
194         AVP_Vendor_Specific_Application_Id=  260,
195         AVP_Redirect_Max_Cache_Time       =  262,
196         AVP_Session_Id                    =  263,
197         AVP_Origin_Host                   =  264,
198         AVP_Supported_Vendor_Id           =  265,
199         AVP_Vendor_Id                     =  266,
200         AVP_Result_Code                   =  268,
201         AVP_Product_Name                  =  269,
202         AVP_Session_Binding               =  270,
203         AVP_Disconnect_Cause              =  273,
204         AVP_Auth_Request_Type             =  274,
205         AVP_Auth_Grace_Period             =  276,
206         AVP_Auth_Session_State            =  277,
207         AVP_Origin_State_Id               =  278,
208         AVP_Proxy_Host                    =  280,
209         AVP_Error_Message                 =  281,
210         AVP_Record_Route                  =  282,
211         AVP_Destination_Realm             =  283,
212         AVP_Proxy_Info                    =  284,
213         AVP_Re_Auth_Request_Type          =  285,
214         AVP_Authorization_Lifetime        =  291,
215         AVP_Redirect_Host                 =  292,
216         AVP_Destination_Host              =  293,
217         AVP_Termination_Cause             =  295,
218         AVP_Origin_Realm                  =  296,
219 /* begin SIP AAA with DIAMETER*/
220         AVP_Resource                                      =  400,
221         AVP_Response                                      =  401,       
222         AVP_Challenge                                     =  402,
223         AVP_Method                                                =  403,
224         AVP_Service_Type                                  =  404,
225         AVP_User_Group                                    =  405,
226         AVP_SIP_MSGID                                     =  406        
227
228 /* end SIP AAA with DIAMETER */
229 }AAA_AVPCodeNr;
230
231
232 /*   The following type allows the client to specify which direction to
233  *   search for an AVP in the AVP list: */
234 typedef enum {
235         AAA_FORWARD_SEARCH = 0,
236         AAA_BACKWARD_SEARCH
237 } AAASearchType;
238
239
240
241 typedef enum {
242         AAA_ACCT_EVENT = 1,
243         AAA_ACCT_START = 2,
244         AAA_ACCT_INTERIM = 3,
245         AAA_ACCT_STOP = 4
246 } AAAAcctMessageType;
247
248
249 typedef enum {
250         AVP_DUPLICATE_DATA,
251         AVP_DONT_FREE_DATA,
252         AVP_FREE_DATA,
253 } AVPDataStatus;
254
255 /* The following structure contains a message AVP in parsed format */
256 typedef struct avp {
257         struct avp *next;
258         struct avp *prev;
259         enum {
260                 AAA_RADIUS,
261                 AAA_DIAMETER
262         } packetType;
263         AAA_AVPCode code;
264         AAA_AVPFlag flags;
265         AAA_AVPDataType type;
266         AAAVendorId vendorId;
267         str data;
268         unsigned char free_it;
269 } AAA_AVP;
270
271
272 /* The following structure is used for representing lists of AVPs on the
273  * message: */
274 typedef struct _avp_list_t {
275         AAA_AVP *head;
276         AAA_AVP *tail;
277 } AAA_AVP_LIST;
278
279
280 /* The following structure contains the full AAA message: */
281 typedef struct _message_t {
282         AAAMsgFlag          flags;
283         AAACommandCode      commandCode;
284         AAAApplicationId    applicationId;
285         AAAMsgIdentifier    endtoendId;
286         AAAMsgIdentifier    hopbyhopId;
287         AAASessionId        *sId;
288         AAA_AVP             *sessionId;
289         AAA_AVP             *orig_host;
290         AAA_AVP             *orig_realm;
291         AAA_AVP             *dest_host;
292         AAA_AVP             *dest_realm;
293         AAA_AVP             *res_code;
294         AAA_AVP             *auth_ses_state;
295         AAA_AVP_LIST        avpList;
296         str                 buf;
297         void                *in_peer;
298 } AAAMessage;
299
300
301
302
303 /**************************** AAA MESSAGE FUNCTIONS **************************/
304
305 /* MESSAGES
306  */
307
308 #define is_req(_msg_) \
309         (((_msg_)->flags)&0x80)
310
311 AAAMessage *AAAInMessage(
312                 AAACommandCode commandCode,
313                 AAAApplicationId appId);
314
315 AAAReturnCode AAAFreeMessage(
316                 AAAMessage **message);
317
318 AAAReturnCode AAASetMessageResultCode(
319                 AAAMessage *message,
320                 AAAResultCode resultCode);
321
322 void AAAPrintMessage(
323                 AAAMessage *msg);
324
325 AAAReturnCode AAABuildMsgBuffer(
326                 AAAMessage *msg );
327
328 AAAMessage* AAATranslateMessage(
329                 unsigned char* source,
330                 unsigned int sourceLen,
331                 int attach_buf );
332
333
334 /* AVPS
335  */
336
337 #define AAACreateAndAddAVPToMessage(_msg_,_code_,_flags_,_vdr_,_data_,_len_) \
338         ( AAAAddAVPToMessage(_msg_, \
339         AAACreateAVP(_code_,_flags_,_vdr_,_data_,_len_, AVP_DUPLICATE_DATA),\
340         (_msg_)->avpList.tail) )
341
342 AAA_AVP* AAACreateAVP(
343                 AAA_AVPCode code,
344                 AAA_AVPFlag flags,
345                 AAAVendorId vendorId,
346                 char *data,
347                 unsigned int length,
348                 AVPDataStatus data_status);
349
350 AAA_AVP* AAACloneAVP(
351                 AAA_AVP *avp,
352                 unsigned char duplicate_data );
353
354 AAAReturnCode AAAAddAVPToMessage(
355                 AAAMessage *msg,
356                 AAA_AVP *avp,
357                 AAA_AVP *position);
358
359 AAA_AVP *AAAFindMatchingAVP(
360                 AAAMessage *msg,
361                 AAA_AVP *startAvp,
362                 AAA_AVPCode avpCode,
363                 AAAVendorId vendorId,
364                 AAASearchType searchType);
365
366 AAAReturnCode AAARemoveAVPFromMessage(
367                 AAAMessage *msg,
368                 AAA_AVP *avp);
369
370 AAAReturnCode AAAFreeAVP(
371                 AAA_AVP **avp);
372
373 AAA_AVP* AAAGetFirstAVP(
374                 AAA_AVP_LIST *avpList);
375
376 AAA_AVP* AAAGetLastAVP(
377                 AAA_AVP_LIST *avpList);
378
379 AAA_AVP* AAAGetNextAVP(
380                 AAA_AVP *avp);
381
382 AAA_AVP* AAAGetPrevAVP(
383                 AAA_AVP *avp);
384
385 char *AAAConvertAVPToString(
386                 AAA_AVP *avp,
387                 char *dest,
388                 unsigned int destLen);
389
390
391 #endif