Files
2026-07-30 11:19:44 +05:30

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
****************************************************************************
*/