mirror of https://github.com/sipwise/sems.git
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.
373 lines
11 KiB
373 lines
11 KiB
/*
|
|
* 2003-04-07 created by bogdan
|
|
*
|
|
* Copyright (C) 2002-2003 FhG Fokus
|
|
* Copyright (C) 2007-2009 IPTEGO GmbH
|
|
*
|
|
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _AAA_DIAMETER_MSG_H
|
|
#define _AAA_DIAMETER_MSG_H
|
|
|
|
#include "str.h"
|
|
#include "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 to_32x_len( _len_ ) \
|
|
( (_len_)+(((_len_)&3)?4-((_len_)&3):0) )
|
|
|
|
#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;
|
|
|
|
|
|
/* #define AAA_CER 257 // Capabilities-Exchange-Request */
|
|
/* #define AAA_CEA 257 // Capabilities-Exchange-Answer */
|
|
|
|
/* #define AAA_DWR 280 // CC: Device-Watchdog-Request */
|
|
/* #define AAA_DWA 280 // CC: Device-Watchdog-Answer */
|
|
|
|
/* #define AAA_DPR 282 // CC: Disconnect-Peer-Request */
|
|
/* #define AAA_DPA 282 // CC: Disconnect-Peer-Answer */
|
|
|
|
|
|
/* 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_USPI = 16777241,
|
|
AAA_APP_RELAY = 0xffffffff,
|
|
} AAA_APP_IDS;
|
|
|
|
/* known command codes with rfc section */
|
|
typedef enum {
|
|
AAA_CC_ASR = 274, // Abort-Session-Request 8.5.1
|
|
AAA_CC_ASA = 274, // Abort-Session-Answer 8.5.2
|
|
AAA_CC_ACR = 271, // Accounting-Request 9.7.1
|
|
AAA_CC_ACA = 271, // Accounting-Answer 9.7.2
|
|
AAA_CC_CER = 257, // Capabilities-Exchange-Request 5.3.1
|
|
AAA_CC_CEA = 257, // Capabilities-Exchange-Answer 5.3.2
|
|
AAA_CC_DWR = 280, // Device-Watchdog-Request 5.5.1
|
|
AAA_CC_DWA = 280, // Device-Watchdog-Answer 5.5.2
|
|
AAA_CC_DPR = 282, // Disconnect-Peer-Request 5.4.1
|
|
AAA_CC_DPA = 282, // Disconnect-Peer-Answer 5.4.2
|
|
AAA_CC_RAR = 258, // Re-Auth-Request 8.3.1
|
|
AAA_CC_RAA = 258, // Re-Auth-Answer 8.3.2
|
|
AAA_CC_STR = 275, // Session-Termination-Request 8.4.1
|
|
AAA_CC_STA = 275, // Session-Termination-Answer 8.4.2
|
|
} AAA_CC;
|
|
|
|
|
|
|
|
/* 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_PERMANENT_FAILURE_START = 5000,
|
|
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_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,
|
|
/* begin SIP AAA with DIAMETER*/
|
|
AVP_Resource = 400,
|
|
AVP_Response = 401,
|
|
AVP_Challenge = 402,
|
|
AVP_Method = 403,
|
|
AVP_Service_Type = 404,
|
|
AVP_User_Group = 405,
|
|
AVP_SIP_MSGID = 406
|
|
|
|
/* end SIP AAA with DIAMETER */
|
|
}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;
|
|
struct avp *groupedHead;
|
|
} 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 appId);
|
|
|
|
AAAReturnCode AAAFreeMessage(
|
|
AAAMessage **message);
|
|
|
|
AAAReturnCode AAASetMessageResultCode(
|
|
AAAMessage *message,
|
|
AAAResultCode resultCode);
|
|
|
|
AAAMessage* AAAMessageSetReply(AAAMessage* msg);
|
|
|
|
void AAAPrintMessage(
|
|
AAAMessage *msg);
|
|
|
|
AAAReturnCode AAABuildMsgBuffer(
|
|
AAAMessage *msg );
|
|
|
|
AAAMessage* AAATranslateMessage(
|
|
unsigned char* source,
|
|
unsigned int sourceLen,
|
|
int attach_buf );
|
|
|
|
#endif
|