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/cdp/diameter.h

294 lines
10 KiB

/*
* $Id$
*
* Copyright (C) 2012 Smile Communications, jason.penton@smilecoms.com
* Copyright (C) 2012 Smile Communications, richard.good@smilecoms.com
*
* The initial version of this code was written by Dragos Vingarzan
* (dragos(dot)vingarzan(at)fokus(dot)fraunhofer(dot)de and the
* Fruanhofer Institute. It was and still is maintained in a separate
* branch of the original SER. We are therefore migrating it to
* Kamailio/SR and look forward to maintaining it from here on out.
* 2011/2012 Smile Communications, Pty. Ltd.
* ported/maintained/improved by
* Jason Penton (jason(dot)penton(at)smilecoms.com and
* Richard Good (richard(dot)good(at)smilecoms.com) as part of an
* effort to add full IMS support to Kamailio/SR using a new and
* improved architecture
*
* NB: Alot of this code was originally part of OpenIMSCore,
* FhG Fokus.
* Copyright (C) 2004-2006 FhG Fokus
* Thanks for great work! This is an effort to
* break apart the various CSCF functions into logically separate
* components. We hope this will drive wider use. We also feel
* that in this way the architecture is more complete and thereby easier
* to manage in the Kamailio/SR environment
*
* This file is part of Kamailio, a free SIP server.
*
* Kamailio 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
*
* Kamailio 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
*
*/
#ifndef DIAMETER_H_
#define DIAMETER_H_
#include "utils.h"
#include <ctype.h>
#include "diameter_code_result.h"
#include "diameter_code_avp.h"
#define get_2bytes(_b) \
((((unsigned char)(_b)[0])<<8)|\
(((unsigned char)(_b)[1])))
#define get_3bytes(_b) \
((((unsigned char)(_b)[0])<<16)|(((unsigned char)(_b)[1])<<8)|\
(((unsigned char)(_b)[2])))
#define get_4bytes(_b) \
((((unsigned char)(_b)[0])<<24)|(((unsigned char)(_b)[1])<<16)|\
(((unsigned char)(_b)[2])<<8)|(((unsigned char)(_b)[3])))
#define set_2bytes(_b,_v) \
{(_b)[0]=((_v)&0x0000ff00)>>8;\
(_b)[1]=((_v)&0x000000ff);}
#define set_3bytes(_b,_v) \
{(_b)[0]=((_v)&0x00ff0000)>>16;(_b)[1]=((_v)&0x0000ff00)>>8;\
(_b)[2]=((_v)&0x000000ff);}
#define set_4bytes(_b,_v) \
{(_b)[0]=((_v)&0xff000000)>>24;(_b)[1]=((_v)&0x00ff0000)>>16;\
(_b)[2]=((_v)&0x0000ff00)>>8;(_b)[3]=((_v)&0x000000ff);}
#define to_32x_len( _len_ ) \
( (_len_)+(((_len_)&3)?4-((_len_)&3):0) )
/* 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) )
/* mesage 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; /**< Code for a Diameter Command */
typedef unsigned int AAAVendorId; /**< Vendor identifier */
typedef unsigned int AAAExtensionId; /**< Extension identifier */
typedef unsigned int AAA_AVPCode; /**< Code for an AVP */
typedef unsigned int AAAValue; /**< Value */
typedef unsigned int AAAApplicationId; /**< Application Identifier */
typedef void* AAAApplicationRef; /**< Application Reference */
typedef str AAASessionId; /**< Session Identifier */
typedef unsigned int AAAMsgIdentifier; /**< Message Identifier */
typedef unsigned char AAAMsgFlag; /**< Message flag */
#define Flag_Request 0x80
#define Flag_Proxyable 0x40
#define Code_CE 257
#define Code_DW 280
#define Code_DP 282
/** 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 type allows the client to specify which direction to
* search for an AVP in the AVP list: */
typedef enum {
AAA_FORWARD_SEARCH = 0, /**< search forward */
AAA_BACKWARD_SEARCH /**< search backwards */
} AAASearchType;
/** Hint on what do do with the AVP payload */
typedef enum {
AVP_DUPLICATE_DATA, /**< Duplicate the payload; the source can be safely removed at any time */
AVP_DONT_FREE_DATA, /**< Don't duplicate and don't free; the source will always be there. */
AVP_FREE_DATA, /**< Don't duplicate, but free when done; this is the only reference to source. */
} AVPDataStatus;
/** This structure contains a message AVP in parsed format */
typedef struct avp {
struct avp *next; /**< next AVP if in a list */
struct avp *prev; /**< previous AVP if in a list */
AAA_AVPCode code; /**< AVP code */
AAA_AVPFlag flags; /**< AVP flags */
AAA_AVPDataType type; /**< AVP payload type */
AAAVendorId vendorId; /**< AVP vendor id */
str data; /**< AVP payload */
unsigned char free_it; /**< if to free the payload when done */
} AAA_AVP;
/**
* This structure is used for representing lists of AVPs on the
* message or in grouped AVPs. */
typedef struct _avp_list_t {
AAA_AVP *head; /**< The first AVP in the list */
AAA_AVP *tail; /**< The last AVP in the list */
} AAA_AVP_LIST;
/** This structure contains the full AAA message. */
typedef struct _message_t {
AAACommandCode commandCode; /**< command code for the message */
AAAMsgFlag flags; /**< flags */
AAAApplicationId applicationId; /**< application identifier */
AAAMsgIdentifier endtoendId; /**< End-to-end identifier */
AAAMsgIdentifier hopbyhopId; /**< Hop-by-hop identitfier */
AAA_AVP *sessionId; /**< SessionId */
AAA_AVP *orig_host; /**< shortcut to Origin Host AVP */
AAA_AVP *orig_realm; /**< shortcut to Origin Realm AVP */
AAA_AVP *dest_host; /**< shortcut to Destination Host AVP */
AAA_AVP *dest_realm; /**< shortcut to Destination Realm AVP */
AAA_AVP *res_code; /**< shortcut to Result Code AVP */
AAA_AVP *auth_ses_state;/**< shortcut to Authorization Session State AVP */
AAA_AVP_LIST avpList; /**< list of AVPs in the message */
str buf; /**< Diameter network representation */
void *in_peer; /**< Peer that this message was received from */
} AAAMessage;
/**************************** AAA MESSAGE FUNCTIONS **************************/
/* MESSAGES */
/** if the message is a request */
#define is_req(_msg_) \
(((_msg_)->flags)&0x80)
/*************************** AAA Transactions ********************************/
/**
* This structure defines a Diameter Transaction.
* This is used to link a response to a request
*/
typedef struct _AAATransaction{
unsigned int hash,label;
AAAApplicationId application_id;
AAACommandCode command_code;
} AAATransaction;
/** Function for callback on transaction events: response or time-out for request. */
typedef void (AAATransactionCallback_f)(int is_timeout,void *param,AAAMessage *ans, long elapsed_msecs);
/** Function for callback on request received */
typedef AAAMessage* (AAARequestHandler_f)(AAAMessage *req, void *param);
/** Function for callback on response received */
typedef void (AAAResponseHandler_f)(AAAMessage *res, void *param);
#endif /*DIAMETER_H_*/