diameter_msg.h

Go to the documentation of this file.
00001 /*
00002  * $Id: diameter_msg.h 1392 2006-12-13 18:07:59Z bogdan_iancu $
00003  *
00004  * 2003-04-07 created by bogdan
00005  *
00006  * Copyright (C) 2002-2003 FhG Fokus
00007  *
00008  * This file is part of disc, a free diameter server/client.
00009  *
00010  * This program is free software; you can redistribute it and/or modify
00011  * it under the terms of the GNU General Public License as published by
00012  * the Free Software Foundation; either version 2 of the License, or
00013  * (at your option) any later version
00014  *
00015  * This program is distributed in the hope that it will be useful,
00016  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018  * GNU General Public License for more details.
00019  *
00020  * You should have received a copy of the GNU General Public License 
00021  * along with this program; if not, write to the Free Software 
00022  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00023  */
00024 
00025 
00026 
00027 #ifndef _AAA_DIAMETER_MSG_H
00028 #define _AAA_DIAMETER_MSG_H
00029 
00030 #include "../../str.h"
00031 #include "../../mem/mem.h"
00032 
00033 #define ad_malloc pkg_malloc
00034 #define ad_free      pkg_free
00035 
00036 /*********************************** AAA TYPES *******************************/
00037 
00038 #define AAA_NO_VENDOR_ID           0
00039 
00040 #define VER_SIZE                   1
00041 #define MESSAGE_LENGTH_SIZE        3
00042 #define FLAGS_SIZE                 1
00043 #define COMMAND_CODE_SIZE          3
00044 #define APPLICATION_ID_SIZE        4
00045 #define HOP_BY_HOP_IDENTIFIER_SIZE 4
00046 #define END_TO_END_IDENTIFIER_SIZE 4
00047 #define AVP_CODE_SIZE      4
00048 #define AVP_FLAGS_SIZE     1
00049 #define AVP_LENGTH_SIZE    3
00050 #define AVP_VENDOR_ID_SIZE 4
00051 
00052 #define AAA_MSG_HDR_SIZE  \
00053    (VER_SIZE + MESSAGE_LENGTH_SIZE + FLAGS_SIZE + COMMAND_CODE_SIZE +\
00054    APPLICATION_ID_SIZE+HOP_BY_HOP_IDENTIFIER_SIZE+END_TO_END_IDENTIFIER_SIZE)
00055 
00056 #define AVP_HDR_SIZE(_flags_)  \
00057    (AVP_CODE_SIZE+AVP_FLAGS_SIZE+AVP_LENGTH_SIZE+\
00058    AVP_VENDOR_ID_SIZE*(((_flags_)&AAA_AVP_FLAG_VENDOR_SPECIFIC)!=0) )
00059 
00060 /* message codes
00061  */
00062 #ifndef WORDS_BIGENDIAN
00063    #define AS_MSG_CODE      0x12010000
00064    #define AC_MSG_CODE      0x0f010000
00065    #define CE_MSG_CODE      0x01010000
00066    #define DW_MSG_CODE      0x18010000
00067    #define DP_MSG_CODE      0x1a010000
00068    #define RA_MSG_CODE      0x02010000
00069    #define ST_MSG_CODE      0x13010000
00070    #define MASK_MSG_CODE    0xffffff00
00071 #else
00072    #error BIG endian detected!!
00073    #define AS_MSG_CODE      0x00000112
00074    #define AC_MSG_CODE      0x0000010f
00075    #define CE_MSG_CODE      0x00000101
00076    #define DW_MSG_CODE      0x00000118
00077    #define DP_MSG_CODE      0x0000011a
00078    #define RA_MSG_CODE      0x00000102
00079    #define ST_MSG_CODE      0x00000113
00080    #define MASK_MSG_CODE    0x00ffffff
00081 #endif
00082 
00083 
00084 
00085 typedef unsigned int    AAACommandCode;
00086 typedef unsigned int    AAAVendorId;
00087 typedef unsigned int    AAAExtensionId;
00088 typedef unsigned int    AAA_AVPCode;
00089 typedef unsigned int    AAAValue;
00090 typedef unsigned int    AAAApplicationId;
00091 typedef void*           AAAApplicationRef;
00092 typedef str             AAASessionId;
00093 typedef unsigned int    AAAMsgIdentifier;
00094 typedef unsigned char   AAAMsgFlag;
00095 
00096 
00097 
00098 /* Status codes returned by functions in the AAA API */
00099 typedef enum {
00100    AAA_ERR_NOT_FOUND = -2,         /* handle or id not found */
00101    AAA_ERR_FAILURE   = -1,         /* unspecified failure during an AAA op. */
00102    AAA_ERR_SUCCESS   =  0,         /* AAA operation succeeded */
00103    AAA_ERR_NOMEM,                  /* op. caused memory to be exhausted */
00104    AAA_ERR_PROTO,                  /*  AAA protocol error */
00105    AAA_ERR_SECURITY,
00106    AAA_ERR_PARAMETER,
00107    AAA_ERR_CONFIG,
00108    AAA_ERR_UNKNOWN_CMD,
00109    AAA_ERR_MISSING_AVP,
00110    AAA_ERR_ALREADY_INIT,
00111    AAA_ERR_TIMED_OUT,
00112    AAA_ERR_CANNOT_SEND_MSG,
00113    AAA_ERR_ALREADY_REGISTERED,
00114    AAA_ERR_CANNOT_REGISTER,
00115    AAA_ERR_NOT_INITIALIZED,
00116    AAA_ERR_NETWORK_ERROR,
00117 } AAAReturnCode;
00118 
00119 
00120 /* The following are AVP data type codes. They correspond directly to
00121  * the AVP data types outline in the Diameter specification [1]: */
00122 typedef enum {
00123    AAA_AVP_DATA_TYPE,
00124    AAA_AVP_STRING_TYPE,
00125    AAA_AVP_ADDRESS_TYPE,
00126    AAA_AVP_INTEGER32_TYPE,
00127    AAA_AVP_INTEGER64_TYPE,
00128    AAA_AVP_TIME_TYPE,
00129 } AAA_AVPDataType;
00130 
00131 
00132 /* The following are used for AVP header flags and for flags in the AVP
00133  *  wrapper struct and AVP dictionary definitions. */
00134 typedef enum {
00135    AAA_AVP_FLAG_NONE               = 0x00,
00136    AAA_AVP_FLAG_MANDATORY          = 0x40,
00137    AAA_AVP_FLAG_RESERVED           = 0x1F,
00138    AAA_AVP_FLAG_VENDOR_SPECIFIC    = 0x80,
00139    AAA_AVP_FLAG_END_TO_END_ENCRYPT = 0x20,
00140 } AAA_AVPFlag;
00141 
00142 
00143 /* List with all known application identifiers */
00144 typedef enum {
00145    AAA_APP_DIAMETER_COMMON_MSG  = 0,
00146    AAA_APP_NASREQ               = 1,
00147    AAA_APP_MOBILE_IP            = 2,
00148    AAA_APP_DIAMETER_BASE_ACC    = 3,
00149    AAA_APP_RELAY                = (int)0xffffffff,
00150 }AAA_APP_IDS;
00151 
00152 
00153 /* The following are the result codes returned from remote servers as
00154  * part of messages */
00155 typedef enum {
00156    AAA_MUTI_ROUND_AUTH           = 1001,
00157    AAA_SUCCESS                   = 2001,
00158    AAA_COMMAND_UNSUPPORTED       = 3001,
00159    AAA_UNABLE_TO_DELIVER         = 3002,
00160    AAA_REALM_NOT_SERVED          = 3003,
00161    AAA_TOO_BUSY                  = 3004,
00162    AAA_LOOP_DETECTED             = 3005,
00163    AAA_REDIRECT_INDICATION       = 3006,
00164    AAA_APPLICATION_UNSUPPORTED   = 3007,
00165    AAA_INVALID_HDR_BITS          = 3008,
00166    AAA_INVALID_AVP_BITS          = 3009,
00167    AAA_UNKNOWN_PEER              = 3010,
00168    AAA_AUTHENTICATION_REJECTED   = 4001,
00169    AAA_OUT_OF_SPACE              = 4002,
00170    AAA_ELECTION_LOST             = 4003,
00171    AAA_AVP_UNSUPPORTED           = 5001,
00172    AAA_UNKNOWN_SESSION_ID        = 5002,
00173    AAA_AUTHORIZATION_REJECTED    = 5003,
00174    AAA_INVALID_AVP_VALUE         = 5004,
00175    AAA_MISSING_AVP               = 5005,
00176    AAA_RESOURCES_EXCEEDED        = 5006,
00177    AAA_CONTRADICTING_AVPS        = 5007,
00178    AAA_AVP_NOT_ALLOWED           = 5008,
00179    AAA_AVP_OCCURS_TOO_MANY_TIMES = 5009,
00180    AAA_NO_COMMON_APPLICATION     = 5010,
00181    AAA_UNSUPPORTED_VERSION       = 5011,
00182    AAA_UNABLE_TO_COMPLY          = 5012,
00183    AAA_INVALID_BIT_IN_HEADER     = 5013,
00184    AAA_INVALIS_AVP_LENGTH        = 5014,
00185    AAA_INVALID_MESSGE_LENGTH     = 5015,
00186    AAA_INVALID_AVP_BIT_COMBO     = 5016,
00187    AAA_NO_COMMON_SECURITY        = 5017,
00188 } AAAResultCode;
00189 
00190 
00191 typedef enum {
00192    AVP_User_Name                     =    1,
00193    AVP_Class                         =   25,
00194    AVP_Session_Timeout               =   27,
00195    AVP_Proxy_State                   =   33,
00196    AVP_Host_IP_Address               =  257,
00197    AVP_Auth_Application_Id            =  258,
00198    AVP_Vendor_Specific_Application_Id=  260,
00199    AVP_Redirect_Max_Cache_Time       =  262,
00200    AVP_Session_Id                    =  263,
00201    AVP_Origin_Host                   =  264,
00202    AVP_Supported_Vendor_Id           =  265,
00203    AVP_Vendor_Id                     =  266,
00204    AVP_Result_Code                   =  268,
00205    AVP_Product_Name                  =  269,
00206    AVP_Session_Binding               =  270,
00207    AVP_Disconnect_Cause              =  273,
00208    AVP_Auth_Request_Type             =  274,
00209    AVP_Auth_Grace_Period             =  276,
00210    AVP_Auth_Session_State            =  277,
00211    AVP_Origin_State_Id               =  278,
00212    AVP_Proxy_Host                    =  280,
00213    AVP_Error_Message                 =  281,
00214    AVP_Record_Route                  =  282,
00215    AVP_Destination_Realm             =  283,
00216    AVP_Proxy_Info                    =  284,
00217    AVP_Re_Auth_Request_Type          =  285,
00218    AVP_Authorization_Lifetime        =  291,
00219    AVP_Redirect_Host                 =  292,
00220    AVP_Destination_Host              =  293,
00221    AVP_Termination_Cause             =  295,
00222    AVP_Origin_Realm                  =  296,
00223 /* begin SIP AAA with DIAMETER*/
00224    AVP_Resource                 =  400,
00225    AVP_Response                 =  401,   
00226    AVP_Challenge                =  402,
00227    AVP_Method                   =  403,
00228    AVP_Service_Type             =  404,
00229    AVP_User_Group               =  405,
00230    AVP_SIP_MSGID                =  406 
00231 
00232 /* end SIP AAA with DIAMETER */
00233 }AAA_AVPCodeNr;
00234 
00235 
00236 /*   The following type allows the client to specify which direction to
00237  *   search for an AVP in the AVP list: */
00238 typedef enum {
00239    AAA_FORWARD_SEARCH = 0,
00240    AAA_BACKWARD_SEARCH
00241 } AAASearchType;
00242 
00243 
00244 
00245 typedef enum {
00246    AAA_ACCT_EVENT = 1,
00247    AAA_ACCT_START = 2,
00248    AAA_ACCT_INTERIM = 3,
00249    AAA_ACCT_STOP = 4
00250 } AAAAcctMessageType;
00251 
00252 
00253 typedef enum {
00254    AVP_DUPLICATE_DATA,
00255    AVP_DONT_FREE_DATA,
00256    AVP_FREE_DATA,
00257 } AVPDataStatus;
00258 
00259 /* The following structure contains a message AVP in parsed format */
00260 typedef struct avp {
00261    struct avp *next;
00262    struct avp *prev;
00263    enum {
00264       AAA_RADIUS,
00265       AAA_DIAMETER
00266    } packetType;
00267    AAA_AVPCode code;
00268    AAA_AVPFlag flags;
00269    AAA_AVPDataType type;
00270    AAAVendorId vendorId;
00271    str data;
00272    unsigned char free_it;
00273 } AAA_AVP;
00274 
00275 
00276 /* The following structure is used for representing lists of AVPs on the
00277  * message: */
00278 typedef struct _avp_list_t {
00279    AAA_AVP *head;
00280    AAA_AVP *tail;
00281 } AAA_AVP_LIST;
00282 
00283 
00284 /* The following structure contains the full AAA message: */
00285 typedef struct _message_t {
00286    AAAMsgFlag          flags;
00287    AAACommandCode      commandCode;
00288    AAAApplicationId    applicationId;
00289    AAAMsgIdentifier    endtoendId;
00290    AAAMsgIdentifier    hopbyhopId;
00291    AAASessionId        *sId;
00292    AAA_AVP             *sessionId;
00293    AAA_AVP             *orig_host;
00294    AAA_AVP             *orig_realm;
00295    AAA_AVP             *dest_host;
00296    AAA_AVP             *dest_realm;
00297    AAA_AVP             *res_code;
00298    AAA_AVP             *auth_ses_state;
00299    AAA_AVP_LIST        avpList;
00300    str                 buf;
00301    void                *in_peer;
00302 } AAAMessage;
00303 
00304 
00305 
00306 
00307 /**************************** AAA MESSAGE FUNCTIONS **************************/
00308 
00309 /* MESSAGES
00310  */
00311 
00312 #define is_req(_msg_) \
00313    (((_msg_)->flags)&0x80)
00314 
00315 AAAMessage *AAAInMessage(
00316       AAACommandCode commandCode,
00317       AAAApplicationId appId);
00318 
00319 AAAReturnCode AAAFreeMessage(
00320       AAAMessage **message);
00321 
00322 AAAReturnCode AAASetMessageResultCode(
00323       AAAMessage *message,
00324       AAAResultCode resultCode);
00325 
00326 void AAAPrintMessage(
00327       AAAMessage *msg);
00328 
00329 AAAReturnCode AAABuildMsgBuffer(
00330       AAAMessage *msg );
00331 
00332 AAAMessage* AAATranslateMessage(
00333       unsigned char* source,
00334       unsigned int sourceLen,
00335       int attach_buf );
00336 
00337 
00338 /* AVPS
00339  */
00340 
00341 #define AAACreateAndAddAVPToMessage(_msg_,_code_,_flags_,_vdr_,_data_,_len_) \
00342    ( AAAAddAVPToMessage(_msg_, \
00343    AAACreateAVP(_code_,_flags_,_vdr_,_data_,_len_, AVP_DUPLICATE_DATA),\
00344    (_msg_)->avpList.tail) )
00345 
00346 AAA_AVP* AAACreateAVP(
00347       AAA_AVPCode code,
00348       AAA_AVPFlag flags,
00349       AAAVendorId vendorId,
00350       char *data,
00351       unsigned int length,
00352       AVPDataStatus data_status);
00353 
00354 AAA_AVP* AAACloneAVP(
00355       AAA_AVP *avp,
00356       unsigned char duplicate_data );
00357 
00358 AAAReturnCode AAAAddAVPToMessage(
00359       AAAMessage *msg,
00360       AAA_AVP *avp,
00361       AAA_AVP *position);
00362 
00363 AAA_AVP *AAAFindMatchingAVP(
00364       AAAMessage *msg,
00365       AAA_AVP *startAvp,
00366       AAA_AVPCode avpCode,
00367       AAAVendorId vendorId,
00368       AAASearchType searchType);
00369 
00370 AAAReturnCode AAARemoveAVPFromMessage(
00371       AAAMessage *msg,
00372       AAA_AVP *avp);
00373 
00374 AAAReturnCode AAAFreeAVP(
00375       AAA_AVP **avp);
00376 
00377 AAA_AVP* AAAGetFirstAVP(
00378       AAA_AVP_LIST *avpList);
00379 
00380 AAA_AVP* AAAGetLastAVP(
00381       AAA_AVP_LIST *avpList);
00382 
00383 AAA_AVP* AAAGetNextAVP(
00384       AAA_AVP *avp);
00385 
00386 AAA_AVP* AAAGetPrevAVP(
00387       AAA_AVP *avp);
00388 
00389 char *AAAConvertAVPToString(
00390       AAA_AVP *avp,
00391       char *dest,
00392       unsigned int destLen);
00393 
00394 
00395 #endif

Generated on Tue May 22 16:00:26 2012 for Kamailio - The Open Source SIP Server by  doxygen 1.5.6