original files of m241
This commit is contained in:
@@ -0,0 +1,320 @@
|
||||
/* 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
|
||||
****************************************************************************
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user