/*******************************************************************************
OpenAirInterface
Copyright(c) 1999 - 2014 Eurecom
OpenAirInterface 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 3 of the License, or
(at your option) any later version.
OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is
included in this distribution in the file called "COPYING". If not,
see .
Contact Information
OpenAirInterface Admin: openair_admin@eurecom.fr
OpenAirInterface Tech : openair_tech@eurecom.fr
OpenAirInterface Dev : openair4g-devel@eurecom.fr
Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France.
*******************************************************************************/
#include
#include
#include "hss_config.h"
#ifndef S6A_PROTO_H_
#define S6A_PROTO_H_
#define VENDOR_3GPP (10415)
#define APP_S6A (16777251)
/* Errors that fall within the Permanent Failures category shall be used to
* inform the peer that the request has failed, and should not be attempted
* again. The Result-Code AVP values defined in Diameter Base Protocol RFC 3588
* shall be applied. When one of the result codes defined here is included in a
* response, it shall be inside an Experimental-Result AVP and the Result-Code
* AVP shall be absent.
*/
#define DIAMETER_ERROR_USER_UNKNOWN (5001)
#define DIAMETER_ERROR_ROAMING_NOT_ALLOWED (5004)
#define DIAMETER_ERROR_UNKNOWN_EPS_SUBSCRIPTION (5420)
#define DIAMETER_ERROR_RAT_NOT_ALLOWED (5421)
#define DIAMETER_ERROR_EQUIPMENT_UNKNOWN (5422)
#define DIAMETER_ERROR_UNKOWN_SERVING_NODE (5423)
/* Result codes that fall within the transient failures category shall be used
* to inform a peer that the request could not be satisfied at the time it was
* received, but may be able to satisfy the request in the future. The
* Result-Code AVP values defined in Diameter Base Protocol RFC 3588 shall be
* applied. When one of the result codes defined here is included in a response,
* it shall be inside an Experimental-Result AVP and the Result-Code AVP shall
* be absent.
*/
#define DIAMETER_AUTHENTICATION_DATA_UNAVAILABLE (4181)
#define DIAMETER_ERROR_IS_VENDOR(x) \
((x == DIAMETER_ERROR_USER_UNKNOWN) || \
(x == DIAMETER_ERROR_ROAMING_NOT_ALLOWED) || \
(x == DIAMETER_ERROR_UNKNOWN_EPS_SUBSCRIPTION) || \
(x == DIAMETER_ERROR_RAT_NOT_ALLOWED) || \
(x == DIAMETER_ERROR_EQUIPMENT_UNKNOWN) || \
(x == DIAMETER_AUTHENTICATION_DATA_UNAVAILABLE) || \
(x == DIAMETER_ERROR_UNKOWN_SERVING_NODE))
#define AVP_CODE_IMEI (1402)
#define AVP_CODE_SOFTWARE_VERSION (1403)
#define AVP_CODE_NUMBER_OF_REQ_VECTORS (1410)
#define AVP_CODE_RE_SYNCHRONIZATION_INFO (1411)
#define AVP_CODE_IMMEDIATE_RESP_PREF (1412)
#define AVP_CODE_3GPP2_MEID (1471)
#define AVP_CODE_FEATURE_LIST (629)
#define AVP_CODE_VENDOR_ID (266)
typedef struct {
struct dict_object *dataobj_s6a_vendor; /* s6a vendor object */
struct dict_object *dataobj_s6a_app; /* s6a application object */
/* Commands */
struct dict_object *dataobj_s6a_auth_cmd; /* s6a authentication command */
struct dict_object *dataobj_s6a_loc_up; /* s6a update location */
struct dict_object *dataobj_s6a_purge_ue; /* s6a purge ue req */
struct dict_object *dataobj_s6a_cancel_loc_req; /* s6a Cancel Location req */
struct dict_object *dataobj_s6a_cancel_loc_ans; /* s6a Cancel Location ans */
/* AVPs */
struct dict_object *dataobj_s6a_origin_host;
struct dict_object *dataobj_s6a_origin_realm;
struct dict_object *dataobj_s6a_imsi; /* s6a imsi avp */
struct dict_object *dataobj_s6a_imei;
struct dict_object *dataobj_s6a_software_version;
struct dict_object *dataobj_s6a_supported_features;
struct dict_object *dataobj_s6a_req_e_utran_auth_info;
struct dict_object *dataobj_s6a_req_resync_info;
struct dict_object *dataobj_s6a_req_nb_of_req_vectors;
struct dict_object *dataobj_s6a_req_geran_auth_info;
struct dict_object *dataobj_s6a_immediate_response_pref;
struct dict_object *dataobj_s6a_visited_plmn_id;
struct dict_object *dataobj_s6a_result_code;
struct dict_object *dataobj_s6a_experimental_result;
struct dict_object *dataobj_s6a_vendor_id;
struct dict_object *dataobj_s6a_experimental_result_code;
struct dict_object *dataobj_s6a_auth_session_state;
struct dict_object *dataobj_s6a_authentication_info;
struct dict_object *dataobj_s6a_e_utran_vector;
struct dict_object *dataobj_s6a_rand;
struct dict_object *dataobj_s6a_xres;
struct dict_object *dataobj_s6a_autn;
struct dict_object *dataobj_s6a_kasme;
struct dict_object *dataobj_s6a_ulr_flags;
struct dict_object *dataobj_s6a_ula_flags;
struct dict_object *dataobj_s6a_pur_flags;
struct dict_object *dataobj_s6a_pua_flags;
struct dict_object *dataobj_s6a_rat_type;
struct dict_object *dataobj_s6a_terminal_info;
struct dict_object *dataobj_s6a_ue_srvcc_cap;
struct dict_object *dataobj_s6a_gmlc_addr;
struct dict_object *dataobj_s6a_subscription_data;
struct dict_object *dataobj_s6a_subscriber_status;
struct dict_object *dataobj_s6a_msisdn;
struct dict_object *dataobj_s6a_ambr;
struct dict_object *dataobj_s6a_network_access_mode;
struct dict_object *dataobj_s6a_access_restriction_data;
struct dict_object *dataobj_s6a_apn_configuration_profile;
struct dict_object *dataobj_s6a_subscribed_rau_tau_timer;
struct dict_object *dataobj_s6a_context_identifier;
/* All-APN-Configurations-Included-Indicator */
struct dict_object *dataobj_s6a_all_apn_conf_inc_ind;
struct dict_object *dataobj_s6a_apn_configuration;
/* Max-Requested-Bandwidth-UL */
struct dict_object *dataobj_s6a_max_bandwidth_ul;
/* Max-Requested-Bandwidth-DL */
struct dict_object *dataobj_s6a_max_bandwidth_dl;
struct dict_object *dataobj_s6a_pdn_type;
struct dict_object *dataobj_s6a_service_selection;
struct dict_object *dataobj_s6a_eps_subscribed_qos_profile;
struct dict_object *dataobj_s6a_qos_class_identifier;
struct dict_object *dataobj_s6a_allocation_retention_priority;
struct dict_object *dataobj_s6a_priority_level;
struct dict_object *dataobj_s6a_pre_emption_capability;
struct dict_object *dataobj_s6a_pre_emption_vulnerability;
struct dict_object *dataobj_s6a_served_party_ip_addr;
} s6a_cnf_t;
/* External definition of the S6A decriptor */
extern s6a_cnf_t s6a_cnf;
/* Length of IMSI should not exceed 15 digits */
#define IMSI_LENGTH (15)
#define IMEI_LENGTH (15)
#define SV_LENGTH (2)
/* ULR-Flags meaning: */
#define ULR_SINGLE_REGISTRATION_IND (1U)
#define ULR_S6A_S6D_INDICATOR (1U << 1)
#define ULR_SKIP_SUBSCRIBER_DATA (1U << 2)
#define ULR_GPRS_SUBSCRIPTION_DATA_IND (1U << 3)
#define ULR_NODE_TYPE_IND (1U << 4)
#define ULR_INITIAL_ATTACH_IND (1U << 5)
#define ULR_PS_LCS_SUPPORTED_BY_UE (1U << 6)
#define ULR_PAD_VALID(x) ((x & ~0x7f) == 0)
/* ULA-Flags */
#define ULA_SEPARATION_IND (1U)
/* PUR-Flags */
#define PUR_UE_PURGED_IN_MME (1U)
#define PUR_UE_PURGED_IN_SGSN (1U << 1)
#define PUR_PAD_VALID(x) ((x & ~0x3) == 0)
/* PUA-FLAGS */
#define PUA_FREEZE_M_TMSI (1U)
#define PUA_FREEZE_P_TMSI (1U << 1)
/* Access-restriction-data bits */
#define UTRAN_NOT_ALLOWED (1U)
#define GERAN_NOT_ALLOWED (1U << 1)
#define GAN_NOT_ALLOWED (1U << 2)
#define I_HSDPA_EVO_NOT_ALLOWED (1U << 3)
#define E_UTRAN_NOT_ALLOWED (1U << 4)
#define HO_TO_NON_3GPP_NOT_ALLOWED (1U << 5)
#define ARD_CHECK_PAD(x) ((x & ~0x3f) == 0)
#define FLAG_IS_SET(x, flag) ((x) & (flag))
#define FLAGS_SET(x, flags) ((x) |= (flags))
#define FLAGS_CLEAR(x, flags) ((x) = (x) & ~(flags))
/** \brief Initialize the s6a layer using freeDiameter
* \param hss_config_p pointer the global HSS configuration
* @returns 0 if the init was successfull, != 0 in case of failure
*/
int s6a_init(hss_config_t *hss_config_p);
/** \brief Callback function for new equipements connections to the HSS. See
* libfdproto from freeDiameter for more informations on the peer validate
* callback
* \param info Peer freeDiameter info
* \param auth Result of the peer authentication, possible values:
* * 1 = accept
* * 0 = unknown
* * -1 = reject
* \param cb2 possible second callback to validate the TLS authentication
* @return 0 if the init was successfull, != 0 in case of failure
*/
int s6a_peer_validate(struct peer_info *info, int *auth, int (**cb2)(struct peer_info *));
/* Callback called when corresponding request/answer is received */
int s6a_auth_info_cb(struct msg **msg, struct avp *paramavp,
struct session *sess, void *opaque,
enum disp_action *act);
int s6a_up_loc_cb(struct msg **msg, struct avp *paramavp,
struct session *sess, void *opaque,
enum disp_action *act);
int s6a_purge_ue_cb(struct msg **msg, struct avp *paramavp,
struct session *sess, void *opaque,
enum disp_action *act);
int s6a_add_subscription_data_avp(struct msg *message, mysql_ul_ans_t *msql_ans);
int s6a_add_result_code(struct msg *ans, struct avp *failed_avp,
int result_code, int experimental);
int s6a_add_ipv4_address(struct avp *avp, const char *ipv4_addr);
int s6a_add_ipv6_address(struct avp *avp, const char *ipv6_addr);
char *experimental_retcode_2_string(int ret_code);
char *retcode_2_string(int ret_code);
#endif /* S6A_PROTO_H_ */