00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00034 #ifdef DIAM_ACC
00035
00036 #ifndef _AAA_DIAMETER_MSG_H
00037 #define _AAA_DIAMETER_MSG_H
00038
00039 #include "../../str.h"
00040 #include "../../mem/mem.h"
00041
00042 #define ad_malloc pkg_malloc
00043 #define ad_free pkg_free
00044
00045
00046
00047 #define AAA_NO_VENDOR_ID 0
00048
00049 #define VER_SIZE 1
00050 #define MESSAGE_LENGTH_SIZE 3
00051 #define FLAGS_SIZE 1
00052 #define COMMAND_CODE_SIZE 3
00053 #define APPLICATION_ID_SIZE 4
00054 #define HOP_BY_HOP_IDENTIFIER_SIZE 4
00055 #define END_TO_END_IDENTIFIER_SIZE 4
00056 #define AVP_CODE_SIZE 4
00057 #define AVP_FLAGS_SIZE 1
00058 #define AVP_LENGTH_SIZE 3
00059 #define AVP_VENDOR_ID_SIZE 4
00060
00061 #define AAA_MSG_HDR_SIZE \
00062 (VER_SIZE + MESSAGE_LENGTH_SIZE + FLAGS_SIZE + COMMAND_CODE_SIZE +\
00063 APPLICATION_ID_SIZE+HOP_BY_HOP_IDENTIFIER_SIZE+END_TO_END_IDENTIFIER_SIZE)
00064
00065 #define AVP_HDR_SIZE(_flags_) \
00066 (AVP_CODE_SIZE+AVP_FLAGS_SIZE+AVP_LENGTH_SIZE+\
00067 AVP_VENDOR_ID_SIZE*(((_flags_)&AAA_AVP_FLAG_VENDOR_SPECIFIC)!=0) )
00068
00069
00070
00071 #ifndef WORDS_BIGENDIAN
00072 #define AS_MSG_CODE 0x12010000
00073 #define AC_MSG_CODE 0x0f010000
00074 #define CE_MSG_CODE 0x01010000
00075 #define DW_MSG_CODE 0x18010000
00076 #define DP_MSG_CODE 0x1a010000
00077 #define RA_MSG_CODE 0x02010000
00078 #define ST_MSG_CODE 0x13010000
00079 #define MASK_MSG_CODE 0xffffff00
00080 #else
00081 #error BIG endian detected!!
00082 #define AS_MSG_CODE 0x00000112
00083 #define AC_MSG_CODE 0x0000010f
00084 #define CE_MSG_CODE 0x00000101
00085 #define DW_MSG_CODE 0x00000118
00086 #define DP_MSG_CODE 0x0000011a
00087 #define RA_MSG_CODE 0x00000102
00088 #define ST_MSG_CODE 0x00000113
00089 #define MASK_MSG_CODE 0x00ffffff
00090 #endif
00091
00092 typedef unsigned int AAACommandCode;
00093 typedef unsigned int AAAVendorId;
00094 typedef unsigned int AAAExtensionId;
00095 typedef unsigned int AAA_AVPCode;
00096 typedef unsigned int AAAValue;
00097 typedef unsigned int AAAApplicationId;
00098 typedef void* AAAApplicationRef;
00099 typedef str AAASessionId;
00100 typedef unsigned int AAAMsgIdentifier;
00101 typedef unsigned char AAAMsgFlag;
00102
00103
00104
00105 typedef enum {
00106 AAA_ERR_NOT_FOUND = -2,
00107 AAA_ERR_FAILURE = -1,
00108 AAA_ERR_SUCCESS = 0,
00109 AAA_ERR_NOMEM,
00110 AAA_ERR_PROTO,
00111 AAA_ERR_SECURITY,
00112 AAA_ERR_PARAMETER,
00113 AAA_ERR_CONFIG,
00114 AAA_ERR_UNKNOWN_CMD,
00115 AAA_ERR_MISSING_AVP,
00116 AAA_ERR_ALREADY_INIT,
00117 AAA_ERR_TIMED_OUT,
00118 AAA_ERR_CANNOT_SEND_MSG,
00119 AAA_ERR_ALREADY_REGISTERED,
00120 AAA_ERR_CANNOT_REGISTER,
00121 AAA_ERR_NOT_INITIALIZED,
00122 AAA_ERR_NETWORK_ERROR,
00123 } AAAReturnCode;
00124
00125
00126
00127
00128 typedef enum {
00129 AAA_AVP_DATA_TYPE,
00130 AAA_AVP_STRING_TYPE,
00131 AAA_AVP_ADDRESS_TYPE,
00132 AAA_AVP_INTEGER32_TYPE,
00133 AAA_AVP_INTEGER64_TYPE,
00134 AAA_AVP_TIME_TYPE,
00135 } AAA_AVPDataType;
00136
00137
00138
00139
00140 typedef enum {
00141 AAA_AVP_FLAG_NONE = 0x00,
00142 AAA_AVP_FLAG_MANDATORY = 0x40,
00143 AAA_AVP_FLAG_RESERVED = 0x1F,
00144 AAA_AVP_FLAG_VENDOR_SPECIFIC = 0x80,
00145 AAA_AVP_FLAG_END_TO_END_ENCRYPT = 0x20,
00146 } AAA_AVPFlag;
00147
00148
00149
00150 typedef enum {
00151 AAA_APP_DIAMETER_COMMON_MSG = 0,
00152 AAA_APP_NASREQ = 1,
00153 AAA_APP_MOBILE_IP = 2,
00154 AAA_APP_DIAMETER_BASE_ACC = 3,
00155 AAA_APP_RELAY = 0xffffffff,
00156 }AAA_APP_IDS;
00157
00158
00159
00160
00161 typedef enum {
00162 AAA_MUTI_ROUND_AUTH = 1001,
00163 AAA_SUCCESS = 2001,
00164 AAA_COMMAND_UNSUPPORTED = 3001,
00165 AAA_UNABLE_TO_DELIVER = 3002,
00166 AAA_REALM_NOT_SERVED = 3003,
00167 AAA_TOO_BUSY = 3004,
00168 AAA_LOOP_DETECTED = 3005,
00169 AAA_REDIRECT_INDICATION = 3006,
00170 AAA_APPLICATION_UNSUPPORTED = 3007,
00171 AAA_INVALID_HDR_BITS = 3008,
00172 AAA_INVALID_AVP_BITS = 3009,
00173 AAA_UNKNOWN_PEER = 3010,
00174 AAA_AUTHENTICATION_REJECTED = 4001,
00175 AAA_OUT_OF_SPACE = 4002,
00176 AAA_ELECTION_LOST = 4003,
00177 AAA_AVP_UNSUPPORTED = 5001,
00178 AAA_UNKNOWN_SESSION_ID = 5002,
00179 AAA_AUTHORIZATION_REJECTED = 5003,
00180 AAA_INVALID_AVP_VALUE = 5004,
00181 AAA_MISSING_AVP = 5005,
00182 AAA_RESOURCES_EXCEEDED = 5006,
00183 AAA_CONTRADICTING_AVPS = 5007,
00184 AAA_AVP_NOT_ALLOWED = 5008,
00185 AAA_AVP_OCCURS_TOO_MANY_TIMES = 5009,
00186 AAA_NO_COMMON_APPLICATION = 5010,
00187 AAA_UNSUPPORTED_VERSION = 5011,
00188 AAA_UNABLE_TO_COMPLY = 5012,
00189 AAA_INVALID_BIT_IN_HEADER = 5013,
00190 AAA_INVALIS_AVP_LENGTH = 5014,
00191 AAA_INVALID_MESSGE_LENGTH = 5015,
00192 AAA_INVALID_AVP_BIT_COMBO = 5016,
00193 AAA_NO_COMMON_SECURITY = 5017,
00194 } AAAResultCode;
00195
00196
00197 typedef enum {
00198 AVP_User_Name = 1,
00199 AVP_Class = 25,
00200 AVP_Session_Timeout = 27,
00201 AVP_Proxy_State = 33,
00202 AVP_Host_IP_Address = 257,
00203 AVP_Auth_Application_Id = 258,
00204 AVP_Vendor_Specific_Application_Id= 260,
00205 AVP_Redirect_Max_Cache_Time = 262,
00206 AVP_Session_Id = 263,
00207 AVP_Origin_Host = 264,
00208 AVP_Supported_Vendor_Id = 265,
00209 AVP_Vendor_Id = 266,
00210 AVP_Result_Code = 268,
00211 AVP_Product_Name = 269,
00212 AVP_Session_Binding = 270,
00213 AVP_Disconnect_Cause = 273,
00214 AVP_Auth_Request_Type = 274,
00215 AVP_Auth_Grace_Period = 276,
00216 AVP_Auth_Session_State = 277,
00217 AVP_Origin_State_Id = 278,
00218 AVP_Accounting_Record_Type = 279,
00219 AVP_Proxy_Host = 280,
00220 AVP_Error_Message = 281,
00221 AVP_Record_Route = 282,
00222 AVP_Destination_Realm = 283,
00223 AVP_Proxy_Info = 284,
00224 AVP_Re_Auth_Request_Type = 285,
00225 AVP_Authorization_Lifetime = 291,
00226 AVP_Redirect_Host = 292,
00227 AVP_Destination_Host = 293,
00228 AVP_Termination_Cause = 295,
00229 AVP_Origin_Realm = 296,
00230 AVP_Resource = 400,
00231 AVP_Response = 401,
00232 AVP_Challenge = 402,
00233 AVP_Method = 403,
00234 AVP_Service_Type = 404,
00235 AVP_User_Group = 405,
00236 AVP_SIP_MSGID = 406
00237
00238 }AAA_AVPCodeNr;
00239
00240
00241
00242
00243 typedef enum {
00244 AAA_FORWARD_SEARCH = 0,
00245 AAA_BACKWARD_SEARCH
00246 } AAASearchType;
00247
00248
00249
00250 typedef enum {
00251 AAA_ACCT_EVENT = 1,
00252 AAA_ACCT_START = 2,
00253 AAA_ACCT_INTERIM = 3,
00254 AAA_ACCT_STOP = 4
00255 } AAAAcctMessageType;
00256
00257
00258 typedef enum {
00259 AVP_DUPLICATE_DATA,
00260 AVP_DONT_FREE_DATA,
00261 AVP_FREE_DATA,
00262 } AVPDataStatus;
00263
00264
00265 typedef struct avp {
00266 struct avp *next;
00267 struct avp *prev;
00268 enum {
00269 AAA_RADIUS,
00270 AAA_DIAMETER
00271 } packetType;
00272 AAA_AVPCode code;
00273 AAA_AVPFlag flags;
00274 AAA_AVPDataType type;
00275 AAAVendorId vendorId;
00276 str data;
00277 unsigned char free_it;
00278 } AAA_AVP;
00279
00280
00281
00282
00283 typedef struct _avp_list_t {
00284 AAA_AVP *head;
00285 AAA_AVP *tail;
00286 } AAA_AVP_LIST;
00287
00288
00289
00290 typedef struct _message_t {
00291 AAAMsgFlag flags;
00292 AAACommandCode commandCode;
00293 AAAApplicationId applicationId;
00294 AAAMsgIdentifier endtoendId;
00295 AAAMsgIdentifier hopbyhopId;
00296 AAASessionId *sId;
00297 AAA_AVP *sessionId;
00298 AAA_AVP *orig_host;
00299 AAA_AVP *orig_realm;
00300 AAA_AVP *dest_host;
00301 AAA_AVP *dest_realm;
00302 AAA_AVP *res_code;
00303 AAA_AVP *auth_ses_state;
00304 AAA_AVP_LIST avpList;
00305 str buf;
00306 void *in_peer;
00307 } AAAMessage;
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317 #define is_req(_msg_) \
00318 (((_msg_)->flags)&0x80)
00319
00320 AAAMessage* AAAInMessage(AAACommandCode commandCode,
00321 AAAApplicationId applicationId);
00322
00323 AAAReturnCode AAAFreeMessage(
00324 AAAMessage **message);
00325
00326 AAAResultCode AAASetMessageResultCode(
00327 AAAMessage *message,
00328 AAAResultCode resultCode);
00329
00330 void AAAPrintMessage(
00331 AAAMessage *msg);
00332
00333 AAAReturnCode AAABuildMsgBuffer(
00334 AAAMessage *msg );
00335
00336 AAAMessage* AAATranslateMessage(
00337 unsigned char* source,
00338 unsigned int sourceLen,
00339 int attach_buf );
00340
00341
00342
00343
00344
00345 #define AAACreateAndAddAVPToMessage(_msg_,_code_,_flags_,_vdr_,_data_,_len_) \
00346 ( AAAAddAVPToMessage(_msg_, \
00347 AAACreateAVP(_code_,_flags_,_vdr_,_data_,_len_, AVP_DUPLICATE_DATA),\
00348 (_msg_)->avpList.tail) )
00349
00350 AAA_AVP* AAACreateAVP(
00351 AAA_AVPCode code,
00352 AAA_AVPFlag flags,
00353 AAAVendorId vendorId,
00354 char *data,
00355 size_t length,
00356 AVPDataStatus data_status);
00357
00358 AAA_AVP* AAACloneAVP(
00359 AAA_AVP *avp,
00360 unsigned char duplicate_data );
00361
00362 AAAReturnCode AAAAddAVPToMessage(
00363 AAAMessage *msg,
00364 AAA_AVP *avp,
00365 AAA_AVP *position);
00366
00367 AAA_AVP *AAAFindMatchingAVP(
00368 AAAMessage *msg,
00369 AAA_AVP *startAvp,
00370 AAA_AVPCode avpCode,
00371 AAAVendorId vendorId,
00372 AAASearchType searchType);
00373
00374 AAAReturnCode AAARemoveAVPFromMessage(
00375 AAAMessage *msg,
00376 AAA_AVP *avp);
00377
00378 AAAReturnCode AAAFreeAVP(
00379 AAA_AVP **avp);
00380
00381 AAA_AVP* AAAGetFirstAVP(
00382 AAA_AVP_LIST *avpList);
00383
00384 AAA_AVP* AAAGetLastAVP(
00385 AAA_AVP_LIST *avpList);
00386
00387 AAA_AVP* AAAGetNextAVP(
00388 AAA_AVP *avp);
00389
00390 AAA_AVP* AAAGetPrevAVP(
00391 AAA_AVP *avp);
00392
00393 char *AAAConvertAVPToString(
00394 AAA_AVP *avp,
00395 char *dest,
00396 unsigned int destLen);
00397
00398
00399 #endif
00400
00401
00402 #endif