You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kamailio/modules/acc/diam_message.h

403 lines
11 KiB

/*
* $Id$
*
* Copyright (C) 2002-2003 FhG Fokus
*
* This file is part of disc, a free diameter server/client.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* History:
* ---------
* 2003-04-07 created by bogdan
*/
/*! \file
* \ingroup acc
* \brief Acc:: Diameter messages
*
* - Module: \ref acc
*/
#ifdef DIAM_ACC
#ifndef _AAA_DIAMETER_MSG_H
#define _AAA_DIAMETER_MSG_H
#include "../../str.h"
#include "../../mem/mem.h"
#define ad_malloc pkg_malloc
#define ad_free pkg_free
/*********************************** AAA TYPES *******************************/
#define AAA_NO_VENDOR_ID 0
#define VER_SIZE 1
#define MESSAGE_LENGTH_SIZE 3
#define FLAGS_SIZE 1
#define COMMAND_CODE_SIZE 3
#define APPLICATION_ID_SIZE 4
#define HOP_BY_HOP_IDENTIFIER_SIZE 4
#define END_TO_END_IDENTIFIER_SIZE 4
#define AVP_CODE_SIZE 4
#define AVP_FLAGS_SIZE 1
#define AVP_LENGTH_SIZE 3
#define AVP_VENDOR_ID_SIZE 4
#define AAA_MSG_HDR_SIZE \
(VER_SIZE + MESSAGE_LENGTH_SIZE + FLAGS_SIZE + COMMAND_CODE_SIZE +\
APPLICATION_ID_SIZE+HOP_BY_HOP_IDENTIFIER_SIZE+END_TO_END_IDENTIFIER_SIZE)
#define AVP_HDR_SIZE(_flags_) \
(AVP_CODE_SIZE+AVP_FLAGS_SIZE+AVP_LENGTH_SIZE+\
AVP_VENDOR_ID_SIZE*(((_flags_)&AAA_AVP_FLAG_VENDOR_SPECIFIC)!=0) )
/* message codes
*/
#ifndef WORDS_BIGENDIAN
#define AS_MSG_CODE 0x12010000
#define AC_MSG_CODE 0x0f010000
#define CE_MSG_CODE 0x01010000
#define DW_MSG_CODE 0x18010000
#define DP_MSG_CODE 0x1a010000
#define RA_MSG_CODE 0x02010000
#define ST_MSG_CODE 0x13010000
#define MASK_MSG_CODE 0xffffff00
#else
#error BIG endian detected!!
#define AS_MSG_CODE 0x00000112
#define AC_MSG_CODE 0x0000010f
#define CE_MSG_CODE 0x00000101
#define DW_MSG_CODE 0x00000118
#define DP_MSG_CODE 0x0000011a
#define RA_MSG_CODE 0x00000102
#define ST_MSG_CODE 0x00000113
#define MASK_MSG_CODE 0x00ffffff
#endif
typedef unsigned int AAACommandCode;
typedef unsigned int AAAVendorId;
typedef unsigned int AAAExtensionId;
typedef unsigned int AAA_AVPCode;
typedef unsigned int AAAValue;
typedef unsigned int AAAApplicationId;
typedef void* AAAApplicationRef;
typedef str AAASessionId;
typedef unsigned int AAAMsgIdentifier;
typedef unsigned char AAAMsgFlag;
/* Status codes returned by functions in the AAA API */
typedef enum {
AAA_ERR_NOT_FOUND = -2, /* handle or id not found */
AAA_ERR_FAILURE = -1, /* unspecified failure during an AAA op. */
AAA_ERR_SUCCESS = 0, /* AAA operation succeeded */
AAA_ERR_NOMEM, /* op. caused memory to be exhausted */
AAA_ERR_PROTO, /* AAA protocol error */
AAA_ERR_SECURITY,
AAA_ERR_PARAMETER,
AAA_ERR_CONFIG,
AAA_ERR_UNKNOWN_CMD,
AAA_ERR_MISSING_AVP,
AAA_ERR_ALREADY_INIT,
AAA_ERR_TIMED_OUT,
AAA_ERR_CANNOT_SEND_MSG,
AAA_ERR_ALREADY_REGISTERED,
AAA_ERR_CANNOT_REGISTER,
AAA_ERR_NOT_INITIALIZED,
AAA_ERR_NETWORK_ERROR,
} AAAReturnCode;
/* The following are AVP data type codes. They correspond directly to
* the AVP data types outline in the Diameter specification [1]: */
typedef enum {
AAA_AVP_DATA_TYPE,
AAA_AVP_STRING_TYPE,
AAA_AVP_ADDRESS_TYPE,
AAA_AVP_INTEGER32_TYPE,
AAA_AVP_INTEGER64_TYPE,
AAA_AVP_TIME_TYPE,
} AAA_AVPDataType;
/* The following are used for AVP header flags and for flags in the AVP
* wrapper struct and AVP dictionary definitions. */
typedef enum {
AAA_AVP_FLAG_NONE = 0x00,
AAA_AVP_FLAG_MANDATORY = 0x40,
AAA_AVP_FLAG_RESERVED = 0x1F,
AAA_AVP_FLAG_VENDOR_SPECIFIC = 0x80,
AAA_AVP_FLAG_END_TO_END_ENCRYPT = 0x20,
} AAA_AVPFlag;
/* List with all known application identifiers */
typedef enum {
AAA_APP_DIAMETER_COMMON_MSG = 0,
AAA_APP_NASREQ = 1,
AAA_APP_MOBILE_IP = 2,
AAA_APP_DIAMETER_BASE_ACC = 3,
AAA_APP_RELAY = 0xffffffff,
}AAA_APP_IDS;
/* The following are the result codes returned from remote servers as
* part of messages */
typedef enum {
AAA_MUTI_ROUND_AUTH = 1001,
AAA_SUCCESS = 2001,
AAA_COMMAND_UNSUPPORTED = 3001,
AAA_UNABLE_TO_DELIVER = 3002,
AAA_REALM_NOT_SERVED = 3003,
AAA_TOO_BUSY = 3004,
AAA_LOOP_DETECTED = 3005,
AAA_REDIRECT_INDICATION = 3006,
AAA_APPLICATION_UNSUPPORTED = 3007,
AAA_INVALID_HDR_BITS = 3008,
AAA_INVALID_AVP_BITS = 3009,
AAA_UNKNOWN_PEER = 3010,
AAA_AUTHENTICATION_REJECTED = 4001,
AAA_OUT_OF_SPACE = 4002,
AAA_ELECTION_LOST = 4003,
AAA_AVP_UNSUPPORTED = 5001,
AAA_UNKNOWN_SESSION_ID = 5002,
AAA_AUTHORIZATION_REJECTED = 5003,
AAA_INVALID_AVP_VALUE = 5004,
AAA_MISSING_AVP = 5005,
AAA_RESOURCES_EXCEEDED = 5006,
AAA_CONTRADICTING_AVPS = 5007,
AAA_AVP_NOT_ALLOWED = 5008,
AAA_AVP_OCCURS_TOO_MANY_TIMES = 5009,
AAA_NO_COMMON_APPLICATION = 5010,
AAA_UNSUPPORTED_VERSION = 5011,
AAA_UNABLE_TO_COMPLY = 5012,
AAA_INVALID_BIT_IN_HEADER = 5013,
AAA_INVALIS_AVP_LENGTH = 5014,
AAA_INVALID_MESSGE_LENGTH = 5015,
AAA_INVALID_AVP_BIT_COMBO = 5016,
AAA_NO_COMMON_SECURITY = 5017,
} AAAResultCode;
typedef enum {
AVP_User_Name = 1,
AVP_Class = 25,
AVP_Session_Timeout = 27,
AVP_Proxy_State = 33,
AVP_Host_IP_Address = 257,
AVP_Auth_Application_Id = 258,
AVP_Vendor_Specific_Application_Id= 260,
AVP_Redirect_Max_Cache_Time = 262,
AVP_Session_Id = 263,
AVP_Origin_Host = 264,
AVP_Supported_Vendor_Id = 265,
AVP_Vendor_Id = 266,
AVP_Result_Code = 268,
AVP_Product_Name = 269,
AVP_Session_Binding = 270,
AVP_Disconnect_Cause = 273,
AVP_Auth_Request_Type = 274,
AVP_Auth_Grace_Period = 276,
AVP_Auth_Session_State = 277,
AVP_Origin_State_Id = 278,
AVP_Accounting_Record_Type = 279,
AVP_Proxy_Host = 280,
AVP_Error_Message = 281,
AVP_Record_Route = 282,
AVP_Destination_Realm = 283,
AVP_Proxy_Info = 284,
AVP_Re_Auth_Request_Type = 285,
AVP_Authorization_Lifetime = 291,
AVP_Redirect_Host = 292,
AVP_Destination_Host = 293,
AVP_Termination_Cause = 295,
AVP_Origin_Realm = 296,
AVP_Resource = 400,
AVP_Response = 401,
AVP_Challenge = 402,
AVP_Method = 403,
AVP_Service_Type = 404,
AVP_User_Group = 405,
AVP_SIP_MSGID = 406
}AAA_AVPCodeNr;
/* The following type allows the client to specify which direction to
* search for an AVP in the AVP list: */
typedef enum {
AAA_FORWARD_SEARCH = 0,
AAA_BACKWARD_SEARCH
} AAASearchType;
typedef enum {
AAA_ACCT_EVENT = 1,
AAA_ACCT_START = 2,
AAA_ACCT_INTERIM = 3,
AAA_ACCT_STOP = 4
} AAAAcctMessageType;
typedef enum {
AVP_DUPLICATE_DATA,
AVP_DONT_FREE_DATA,
AVP_FREE_DATA,
} AVPDataStatus;
/* The following structure contains a message AVP in parsed format */
typedef struct avp {
struct avp *next;
struct avp *prev;
enum {
AAA_RADIUS,
AAA_DIAMETER
} packetType;
AAA_AVPCode code;
AAA_AVPFlag flags;
AAA_AVPDataType type;
AAAVendorId vendorId;
str data;
unsigned char free_it;
} AAA_AVP;
/* The following structure is used for representing lists of AVPs on the
* message: */
typedef struct _avp_list_t {
AAA_AVP *head;
AAA_AVP *tail;
} AAA_AVP_LIST;
/* The following structure contains the full AAA message: */
typedef struct _message_t {
AAAMsgFlag flags;
AAACommandCode commandCode;
AAAApplicationId applicationId;
AAAMsgIdentifier endtoendId;
AAAMsgIdentifier hopbyhopId;
AAASessionId *sId;
AAA_AVP *sessionId;
AAA_AVP *orig_host;
AAA_AVP *orig_realm;
AAA_AVP *dest_host;
AAA_AVP *dest_realm;
AAA_AVP *res_code;
AAA_AVP *auth_ses_state;
AAA_AVP_LIST avpList;
str buf;
void *in_peer;
} AAAMessage;
/**************************** AAA MESSAGE FUNCTIONS **************************/
/* MESSAGES
*/
#define is_req(_msg_) \
(((_msg_)->flags)&0x80)
AAAMessage* AAAInMessage(AAACommandCode commandCode,
AAAApplicationId applicationId);
AAAReturnCode AAAFreeMessage(
AAAMessage **message);
AAAResultCode AAASetMessageResultCode(
AAAMessage *message,
AAAResultCode resultCode);
void AAAPrintMessage(
AAAMessage *msg);
AAAReturnCode AAABuildMsgBuffer(
AAAMessage *msg );
AAAMessage* AAATranslateMessage(
unsigned char* source,
unsigned int sourceLen,
int attach_buf );
/* AVPS
*/
#define AAACreateAndAddAVPToMessage(_msg_,_code_,_flags_,_vdr_,_data_,_len_) \
( AAAAddAVPToMessage(_msg_, \
AAACreateAVP(_code_,_flags_,_vdr_,_data_,_len_, AVP_DUPLICATE_DATA),\
(_msg_)->avpList.tail) )
AAA_AVP* AAACreateAVP(
AAA_AVPCode code,
AAA_AVPFlag flags,
AAAVendorId vendorId,
char *data,
size_t length,
AVPDataStatus data_status);
AAA_AVP* AAACloneAVP(
AAA_AVP *avp,
unsigned char duplicate_data );
AAAReturnCode AAAAddAVPToMessage(
AAAMessage *msg,
AAA_AVP *avp,
AAA_AVP *position);
AAA_AVP *AAAFindMatchingAVP(
AAAMessage *msg,
AAA_AVP *startAvp,
AAA_AVPCode avpCode,
AAAVendorId vendorId,
AAASearchType searchType);
AAAReturnCode AAARemoveAVPFromMessage(
AAAMessage *msg,
AAA_AVP *avp);
AAAReturnCode AAAFreeAVP(
AAA_AVP **avp);
AAA_AVP* AAAGetFirstAVP(
AAA_AVP_LIST *avpList);
AAA_AVP* AAAGetLastAVP(
AAA_AVP_LIST *avpList);
AAA_AVP* AAAGetNextAVP(
AAA_AVP *avp);
AAA_AVP* AAAGetPrevAVP(
AAA_AVP *avp);
char *AAAConvertAVPToString(
AAA_AVP *avp,
char *dest,
unsigned int destLen);
#endif
#endif