321 lines
10 KiB
C
321 lines
10 KiB
C
/* ipdiameter_session.h - IPNet Diameter session head file */
|
|
|
|
/*
|
|
* Copyright (c) 2007 Wind River Systems, Inc.
|
|
*
|
|
* The right to copy, distribute or otherwise make use of this software
|
|
* may be licensed only pursuant to the terms of an applicable Wind River
|
|
* license agreement. No license to Wind River intellectual property rights
|
|
* is granted herein. All rights not licensed by Wind River are reserved
|
|
* by Wind River.
|
|
*/
|
|
|
|
/*
|
|
modification history
|
|
--------------------
|
|
01g,20mar09,tlu Add RAR-RX event and re-auth field to session structure
|
|
01f,17apr08,tlu Add compile condition to call ipcom mutex utilities directly
|
|
for VxWorks, and call recursive semaphore for Linux
|
|
01e,10oct07,tlu Port to Linux
|
|
01d,06jul07,tlu Add multiple servers to session struct for server redundancy
|
|
01c,26jun07,tlu Add ipdiameter_session_delete as an application API
|
|
01b,20jun07,tlu Make DIAMETER_CLIENT_AUTH_EV_ANSWER_RX and
|
|
DIAMETER_CLIENT_AUTH_EV_ANSWER_RX_DEFAULT same event
|
|
01a,26apr07,tlu Created.
|
|
*/
|
|
|
|
#ifndef IPDIAMETER_SESSION_H
|
|
#define IPDIAMETER_SESSION_H
|
|
|
|
|
|
/*
|
|
****************************************************************************
|
|
* INCLUDE FILES
|
|
****************************************************************************
|
|
*/
|
|
|
|
#include <ipcom_tags.h>
|
|
#include <ipcom_type.h>
|
|
#include <ipcom_sock.h>
|
|
#include <ipcom_sock6.h>
|
|
#include <ipcom_list.h>
|
|
#include <ipcom_tmo2.h>
|
|
|
|
#include <ipdiameter_config.h>
|
|
#include <ipdiameter_constant.h>
|
|
|
|
|
|
|
|
/*
|
|
****************************************************************************
|
|
* DEFINES
|
|
****************************************************************************
|
|
*/
|
|
|
|
#define IPDIAMETER_ENABLE_REENTRANT
|
|
|
|
|
|
|
|
/*
|
|
*===========================================================================
|
|
* Client authentication session state machine events
|
|
*===========================================================================
|
|
* session auth events on client side.
|
|
* refer to RFC 3588, section 8.1,
|
|
* and draft-ietf-dime-rfc3588bis-xx, section 8.1
|
|
*/
|
|
|
|
typedef enum
|
|
{
|
|
DIAMETER_CLIENT_AUTH_EV_ACCESS_REQ = 1,
|
|
DIAMETER_CLIENT_AUTH_EV_ASR_RX,
|
|
DIAMETER_CLIENT_AUTH_EV_ANSWER_RX_DEFAULT,
|
|
DIAMETER_CLIENT_AUTH_EV_ANSWER_RX_NO_SERVICE,
|
|
DIAMETER_CLIENT_AUTH_EV_ANSWER_RX_PROC_ERR,
|
|
DIAMETER_CLIENT_AUTH_EV_ANSWER_RX_REJECT,
|
|
DIAMETER_CLIENT_AUTH_EV_ACCESS_REQ_SERVICE,
|
|
DIAMETER_CLIENT_AUTH_EV_TIMEOUT_EXPIRES,
|
|
DIAMETER_CLIENT_AUTH_EV_LIFETIME_GRACE_EXPIRES,
|
|
DIAMETER_CLIENT_AUTH_EV_STA_RX,
|
|
DIAMETER_CLIENT_AUTH_EV_SERV_TERMINATED,
|
|
DIAMETER_CLIENT_AUTH_EV_RAR_RX
|
|
} Ipdiameter_client_auth_events;
|
|
|
|
#define DIAMETER_CLIENT_AUTH_EV_ANSWER_RX DIAMETER_CLIENT_AUTH_EV_ANSWER_RX_DEFAULT
|
|
|
|
#define DIAMETER_CLIENT_AUTH_EV_ACCESS_REQ_SERVICE DIAMETER_CLIENT_AUTH_EV_ACCESS_REQ
|
|
#define DIAMETER_CLIENT_AUTH_EV_ANSWER_RX_NO_STATE DIAMETER_CLIENT_AUTH_EV_ANSWER_RX_DEFAULT
|
|
|
|
|
|
/*
|
|
*===========================================================================
|
|
* Session termination cause values
|
|
*===========================================================================
|
|
* refer to RFC 3588, section 8.15
|
|
*/
|
|
|
|
typedef enum
|
|
{
|
|
DIAMETER_LOGOUT = 1,
|
|
DIAMETER_SERVICE_NOT_PROVIDED,
|
|
DIAMETER_BAD_ANSWER,
|
|
DIAMETER_ADMINISTRATIVE,
|
|
DIAMETER_LINK_BROKEN,
|
|
DIAMETER_AUTH_EXPIRED,
|
|
DIAMETER_USER_MOVED,
|
|
DIAMETER_SESSION_TIMEOUT
|
|
} Ipdiameter_session_termination_cause;
|
|
|
|
|
|
/*
|
|
*===========================================================================
|
|
* Session states
|
|
*===========================================================================
|
|
* refer to RFC 3588, section 8.1
|
|
*/
|
|
|
|
typedef enum
|
|
{
|
|
DIAMETER_SESSION_STATE_IDLE = 1,
|
|
DIAMETER_SESSION_STATE_PENDING,
|
|
DIAMETER_SESSION_STATE_OPEN,
|
|
DIAMETER_SESSION_STATE_DISCON,
|
|
DIAMETER_SESSION_STATE_PENDINGS,
|
|
DIAMETER_SESSION_STATE_PENDINGI,
|
|
DIAMETER_SESSION_STATE_PENDINGE,
|
|
DIAMETER_SESSION_STATE_PENDINGB,
|
|
DIAMETER_SESSION_STATE_PENDINGL
|
|
} Ipdiameter_session_state;
|
|
|
|
|
|
/*
|
|
*===========================================================================
|
|
* Auth-Session-State values
|
|
*===========================================================================
|
|
* refer to RFC 3588, section 8.11
|
|
*/
|
|
|
|
typedef enum
|
|
{
|
|
DIAMETER_STATE_MAINTAINED = 0,
|
|
DIAMETER_NO_STATE_MAINTAINED
|
|
} Ipdiameter_auth_session_state;
|
|
|
|
|
|
/*
|
|
****************************************************************************
|
|
* TYPES
|
|
****************************************************************************
|
|
*/
|
|
|
|
struct Ipdiameter_header;
|
|
struct Ipdiameter_server;
|
|
struct Ipdiameter_request_struct;
|
|
|
|
/*
|
|
*===========================================================================
|
|
* Ipdiameter_session
|
|
*===========================================================================
|
|
* Diameter user session.
|
|
* refer to RFC 3588, section 8
|
|
*/
|
|
|
|
typedef struct Ipdiameter_session_struct
|
|
{
|
|
Ipcom_list session_list;
|
|
|
|
/* seconds since the session started (0 if not started) */
|
|
Ip_time_t start_time;
|
|
|
|
/* timeout handler for session timeout */
|
|
Ipcom_tmo2 session_tmo;
|
|
|
|
/* timeout handler for authentication timeout */
|
|
Ipcom_tmo2 auth_tmo;
|
|
|
|
/* timer related intevals */
|
|
Ip_u32 session_timeout;
|
|
Ip_u32 auth_lifetime;
|
|
Ip_u32 auth_grace_period;
|
|
|
|
#ifdef IPDIAMETER_ENABLE_REENTRANT
|
|
Ipcom_mutex code_mutex; /* Mutex to protect IPDIAMETER session data. */
|
|
#endif
|
|
|
|
/* selected server, the index number of serv_list */
|
|
Ip_s8 selected_server;
|
|
/* tried servers, the bit map represents the tried servers */
|
|
Ip_u8 tried_servers;
|
|
|
|
/* the servers for the session, supplied by applications */
|
|
Ip_u8 num_servers; /* Number of valid entries in 'serv_list' below. */
|
|
struct Ipdiameter_server *serv_list[IPDIAMETER_MAX_SPECIFIED_SERVERS];
|
|
|
|
/* the next hop to send the packet to */
|
|
struct Ipdiameter_peer_entry *peer;
|
|
|
|
/* Session ID */
|
|
Ip_u16 session_id_len;
|
|
char session_id[IPDIAMETER_MAX_SESSION_ID_SIZE];
|
|
|
|
/* Auth application ID, refer to RFC 3588, section 2.4 */
|
|
Ip_u32 appl_id;
|
|
|
|
/* Whether to perform subsequent re-auth */
|
|
/* refer to draft-ieft-dime-rfc3588bits-xx, section 8.3 */
|
|
Ip_bool perform_re_auth;
|
|
|
|
/* Record Diameter EAP auth cookie for RAR event callback */
|
|
void *auth_cookie;
|
|
|
|
/* Session state, the session is stateless by default */
|
|
Ip_bool is_stateful;
|
|
Ipdiameter_session_state state;
|
|
|
|
/* the process that currently holds the semaphore and taken counter */
|
|
Ip_pid_t pid;
|
|
Ip_u8 s_counter;
|
|
|
|
/* Application event callback function pointer. */
|
|
Ip_err (*event_callback)(int event, struct Ipdiameter_request_struct *request,
|
|
struct Ipdiameter_header *request_packet,
|
|
struct Ipdiameter_header *response_packet,
|
|
struct Ipdiameter_server *server);
|
|
|
|
/* Requests associated with this session. */
|
|
Ip_u32 request_num; /* number of requests. */
|
|
Ipcom_list request_head;
|
|
}
|
|
Ipdiameter_session;
|
|
|
|
|
|
/*
|
|
****************************************************************************
|
|
* Application APIs
|
|
****************************************************************************
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
IP_PUBLIC void ipdiameter_session_delete(char *session_id);
|
|
|
|
|
|
|
|
/*
|
|
****************************************************************************
|
|
* GLOBAL FUNCTIONS
|
|
****************************************************************************
|
|
*/
|
|
|
|
struct Ipdiameter_request_entry;
|
|
struct Ipdiameter_peer_entry;
|
|
|
|
IP_PUBLIC Ipdiameter_session *
|
|
ipdiameter_create_session(struct Ipdiameter_request_entry *reqent);
|
|
IP_PUBLIC void ipdiameter_delete_session(Ipdiameter_session *session);
|
|
IP_PUBLIC Ipdiameter_session *ipdiameter_find_session(char *session_id);
|
|
IP_PUBLIC Ip_err ipdiameter_discon_user(Ipdiameter_session *session);
|
|
IP_PUBLIC Ip_err ipdiameter_session_cleanup(Ipdiameter_session *session);
|
|
IP_PUBLIC void ipdiameter_session_add_req(Ipdiameter_session *session,
|
|
struct Ipdiameter_header *packet);
|
|
IP_PUBLIC void ipdiameter_session_remove_req(Ipdiameter_session *session,
|
|
struct Ipdiameter_request_entry *reqent);
|
|
IP_PUBLIC struct Ipdiameter_request_entry *
|
|
ipdiameter_session_find_req(Ipdiameter_session *session, Ip_u32 hbh_id);
|
|
IP_PUBLIC Ip_err ipdiameter_session_update_reqs(Ipdiameter_session *session);
|
|
|
|
IP_PUBLIC struct Ipdiameter_peer_entry *
|
|
ipdiameter_session_select_route(Ipdiameter_session *session);
|
|
IP_PUBLIC void ipdiameter_session_set_state(Ipdiameter_session *session,
|
|
Ipdiameter_session_state state);
|
|
IP_PUBLIC void ipdiameter_session_set_peer(Ipdiameter_session *session,
|
|
struct Ipdiameter_peer_entry *peer);
|
|
IP_PUBLIC Ip_err ipdiameter_session_start_timers(Ipdiameter_session *session,
|
|
struct Ipdiameter_header *hdr);
|
|
|
|
IP_PUBLIC Ip_err ipdiameter_client_auth_fsm(Ipdiameter_session *session,
|
|
struct Ipdiameter_header *hdr, int event);
|
|
|
|
IP_PUBLIC char * ipdiameter_session_appl_id(Ip_u32 appl_id);
|
|
IP_PUBLIC char * ipdiameter_session_state(Ipdiameter_session_state state);
|
|
|
|
|
|
IP_PUBLIC void ipdiameter_session_lck(Ipdiameter_session *session);
|
|
IP_PUBLIC void ipdiameter_session_unlck(Ipdiameter_session *session);
|
|
|
|
#ifdef IPDIAMETER_ENABLE_REENTRANT
|
|
|
|
#ifdef IP_PORT_VXWORKS
|
|
#define IPDIAMETER_SESSION_LOCK(session) ipcom_mutex_lock(session->code_mutex)
|
|
#define IPDIAMETER_SESSION_UNLOCK(session) ipcom_mutex_unlock(session->code_mutex)
|
|
#else /* !IP_PORT_VXWORKS, Linux recursive semaphore */
|
|
#define IPDIAMETER_SESSION_LOCK(session) ipdiameter_session_lck(session)
|
|
#define IPDIAMETER_SESSION_UNLOCK(session) ipdiameter_session_unlck(session)
|
|
#endif /* IP_PORT_VXWORKS */
|
|
|
|
#else
|
|
#define IPDIAMETER_SESSION_LOCK(session) IP_NOOP
|
|
#define IPDIAMETER_SESSION_UNLOCK(session) IP_NOOP
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* #ifndef IPDIAMETER_SESSION_H */
|
|
|
|
|
|
/*
|
|
****************************************************************************
|
|
* END OF FILE
|
|
****************************************************************************
|
|
*/
|
|
|