mirror of https://github.com/sipwise/kamailio.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.
294 lines
10 KiB
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_*/
|