You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

427 lines
18 KiB
C++

/**
* Copyright 2013-2021 Software Radio Systems Limited
*
* This file is part of srsLTE.
*
* srsLTE is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* srsLTE 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 Affero General Public License for more details.
*
* A copy of the GNU Affero General Public License can be found in
* the LICENSE file in the top-level directory of this distribution
* and at http://www.gnu.org/licenses/.
*
*/
#ifndef SRSLTE_GTPC_IES_H
#define SRSLTE_GTPC_IES_H
#include "srslte/phy/io/netsource.h"
namespace srslte {
/****************************************************************
*
* GTP-C IE Types
* Ref: TS 29.274 v10.14.0 Table 8.1-1
*
****************************************************************/
enum gtpc_ie_type {
// const uint8_t GTPC_IE_TYPE_RESERVED = 0;
GTPC_IE_TYPE_IMSI = 1,
GTPC_IE_TYPE_CAUSE = 2,
GTPC_IE_TYPE_RECOVERY = 3,
// 4 to 50 RESERVED_FOR_S101_INTERFACE
GTPC_IE_TYPE_STN_SR = 51,
// 52 to 70 RESERVED_FOR_SV_INTERFACE
GTPC_IE_TYPE_APN = 71,
GTPC_IE_TYPE_AMBR = 72,
GTPC_IE_TYPE_EBI = 73,
GTPC_IE_TYPE_IP_ADDRESS = 74,
GTPC_IE_TYPE_MEI = 75,
GTPC_IE_TYPE_MSISDN = 76,
GTPC_IE_TYPE_INDICATION = 77,
GTPC_IE_TYPE_PCO = 78,
GTPC_IE_TYPE_PDN_ADDRESS_ALLOCATION = 79,
GTPC_IE_TYPE_BEARER_QOS = 80,
GTPC_IE_TYPE_FLOW_QOS = 81,
GTPC_IE_TYPE_RAT_TYPE = 82,
GTPC_IE_TYPE_SERVING_NETWORK = 83,
GTPC_IE_TYPE_BEARER_TFT = 84,
GTPC_IE_TYPE_TAD = 85,
GTPC_IE_TYPE_ULI = 86,
GTPC_IE_TYPE_F_TEID = 87,
GTPC_IE_TYPE_TMSI = 88,
GTPC_IE_TYPE_GLOBAL_CN_ID = 89,
GTPC_IE_TYPE_S103_PDN_DATA_FORWARDING_INFO = 90,
GTPC_IE_TYPE_S1_U_DATA_FORWARDING_INFO = 91,
GTPC_IE_TYPE_DELAY_VALUE = 92,
GTPC_IE_TYPE_BEARER_CONTEXT = 93,
GTPC_IE_TYPE_CHARGING_ID = 94,
GTPC_IE_TYPE_CHARGING_CHARACTERISTICS = 95,
GTPC_IE_TYPE_TRACE_INFORMATION = 96,
GTPC_IE_TYPE_BEARER_FLAGS = 97,
// 98 Reserved
GTPC_IE_TYPE_PDN_TYPE = 99,
GTPC_IE_TYPE_PROCEDURE_TRANSACTION_ID = 100,
GTPC_IE_TYPE_DRX_PARAMETER = 101,
// 102 Reserved
GTPC_IE_TYPE_MM_CONTEXT_GSM_KEY_AND_TRIPLETS = 103,
GTPC_IE_TYPE_MM_CONTEXT_UMTS_KEY_USED_CIPHER_AND_QUINTUPLETS = 104,
GTPC_IE_TYPE_MM_CONTEXT_GSM_KEY_USED_CIPHER_AND_QUINTUPLETS = 105,
GTPC_IE_TYPE_MM_CONTEXT_UMTS_KEY_AND_QUINTUPLETS = 106,
GTPC_IE_TYPE_MM_CONTEXT_EPS_SECURITY_CONTEXT_QUADRUPLETS_AND_QUINTUPLETS = 107,
GTPC_IE_TYPE_MM_CONTEXT_UMTS_KEY_QUADRUPLETS_AND_QUINTUPLETS = 108,
GTPC_IE_TYPE_PDN_CONNECTION = 109,
GTPC_IE_TYPE_PDU_NUMBERS = 110,
GTPC_IE_TYPE_P_TMSI = 111,
GTPC_IE_TYPE_P_TMSI_SIGNATURE = 112,
GTPC_IE_TYPE_HOP_COUNTER = 113,
GTPC_IE_TYPE_UE_TIME_ZONE = 114,
GTPC_IE_TYPE_TRACE_REFERENCE = 115,
GTPC_IE_TYPE_COMPLETE_REQUEST_MESSAGE = 116,
GTPC_IE_TYPE_GUTI = 117,
GTPC_IE_TYPE_F_CONTAINER = 118,
GTPC_IE_TYPE_F_CAUSE = 119,
GTPC_IE_TYPE_SELECTED_PLMN_ID = 120,
GTPC_IE_TYPE_TARGET_IDENTIFICATION = 121,
// 122 Reserved
GTPC_IE_TYPE_PACKET_FLOW_ID = 123,
GTPC_IE_TYPE_RAB_CONTEXT = 124,
GTPC_IE_TYPE_SOURCE_RNC_PDCP_CONTEXT_INFO = 125,
GTPC_IE_TYPE_UDP_SOURCE_PORT_NUMBER = 126,
GTPC_IE_TYPE_APN_RESTRICTION = 127,
GTPC_IE_TYPE_SELECTION_MODE = 128,
GTPC_IE_TYPE_SOURCE_IDENTIFICATION = 129,
// 130 RESERVED
GTPC_IE_TYPE_CHANGE_REPORTING_ACTION = 131,
GTPC_IE_TYPE_FQ_CSID = 132,
GTPC_IE_TYPE_CHANNEL_NEEDED = 133,
GTPC_IE_TYPE_EMLPP_PRIORITY = 134,
GTPC_IE_TYPE_NODE_TYPE = 135,
GTPC_IE_TYPE_FQDN = 136,
GTPC_IE_TYPE_TI = 137,
GTPC_IE_TYPE_MBMS_SESSION_DURATION = 138,
GTPC_IE_TYPE_MBMS_SERVICE_AREA = 139,
GTPC_IE_TYPE_MBMS_SESSION_IDENTIFIER = 140,
GTPC_IE_TYPE_MBMS_FLOW_IDENTIFIER = 141,
GTPC_IE_TYPE_MBMS_IP_MULTICAST_DISTRIBUTION = 142,
GTPC_IE_TYPE_MBMS_DISTRIBUTION_ACKNOWLEDGE = 143,
GTPC_IE_TYPE_RFSP_INDEX = 144,
GTPC_IE_TYPE_UCI = 145,
GTPC_IE_TYPE_CSG_INFORMATION_REPORTING_ACTION = 146,
GTPC_IE_TYPE_CSG_ID = 147,
GTPC_IE_TYPE_CMI = 148,
GTPC_IE_TYPE_SERVICE_INDICATOR = 149,
GTPC_IE_TYPE_DETACH_TYPE = 150,
GTPC_IE_TYPE_LDN = 151,
GTPC_IE_TYPE_NODE_FEATURES = 152,
GTPC_IE_TYPE_MBMS_TIME_TO_DATA_TRANSFER = 153,
GTPC_IE_TYPE_THROTTLING = 154,
GTPC_IE_TYPE_ARP = 155,
GTPC_IE_TYPE_EPC_TIMER = 156,
GTPC_IE_TYPE_SIGNALLING_PRIORITY_INDICATION = 157,
GTPC_IE_TYPE_TMGI = 158,
GTPC_IE_TYPE_ADDITIONAL_MM_CONTEXT_FOR_SRVCC = 159,
GTPC_IE_TYPE_ADDITIONAL_FLAGS_FOR_SRVCC = 160,
// 161 RESERVED
GTPC_IE_TYPE_MDT_CONFIGURATION = 162,
GTPC_IE_TYPE_APCO = 163,
// 164 RESERVED
GTPC_IE_TYPE_CHANGE_TO_REPORT_FLAGS = 165,
// 168 TO 254 SPARE. FOR FUTURE USE.
GTPC_IE_TYPE_PRIVATE_EXTENSION = 255
};
/****************************************************************
*
* GTP-C IMSI IE
* Ref: TS 29.274 v10.14.0 Figure 8.3-1
*
****************************************************************/
/*
* The IMSI should be kept as an uint64_t.
* The responsibility to convert from uint64_t to BCD coded is on
* the pack_imsi_ie function
*/
/****************************************************************************
*
* GTP-C Cause IE
* Ref: 3GPP TS 29.274 v10.14.0 Figure 8.4-1 and Table 8.4-1
*
***************************************************************************/
enum gtpc_cause_value {
// Reserved
GTPC_CAUSE_VALUE_LOCAL_DETACH = 2,
GTPC_CAUSE_VALUE_COMPLETE_DETACH = 3,
GTPC_CAUSE_VALUE_RAT_CHANGED_FROM_3GPP_TO_NON_3GPP = 4,
GTPC_CAUSE_VALUE_ISR_DEACTIVATION = 5,
GTPC_CAUSE_VALUE_ERROR_INDICATION_RECEIVED_FROM_RNC_ENODEB_S4_SGSN = 6,
GTPC_CAUSE_VALUE_IMSI_DETACH_ONLY = 7,
GTPC_CAUSE_VALUE_REACTIVATION_REQUESTED = 8,
GTPC_CAUSE_VALUE_PDN_RECONNECTION_TO_THIS_APN_DISALLOWED = 9,
GTPC_CAUSE_VALUE_ACCESS_CHANGED_FROM_NON_3GPP_TO_3GPP = 10,
GTPC_CAUSE_VALUE_PDN_CONNECTION_INACTIVITY_TIMER_EXPIRES = 11,
// Spare. This value range shall be used by Cause values in an initial/request message.
GTPC_CAUSE_VALUE_REQUEST_ACCEPTED = 16,
GTPC_CAUSE_VALUE_REQUEST_ACCEPTED_PARTIALLY = 17,
GTPC_CAUSE_VALUE_NEW_PDN_TYPE_DUE_TO_NETWORK_PREFERENCE = 18,
GTPC_CAUSE_VALUE_NEW_PDN_TYPE_DUE_TO_SINGLE_ADDRESS_BEARER_ONLY = 19,
// 20-63 Spare.
GTPC_CAUSE_VALUE_CONTEXT_NOT_FOUND = 64,
GTPC_CAUSE_VALUE_INVALID_MESSAGE_FORMAT = 65,
GTPC_CAUSE_VALUE_VERSION_NOT_SUPPORTED_BY_NEXT_PEER = 66,
GTPC_CAUSE_VALUE_INVALID_LENGTH = 67,
GTPC_CAUSE_VALUE_SERVICE_NOT_SUPPORTED = 68,
GTPC_CAUSE_VALUE_MANDATORY_IE_INCORRECT = 69,
GTPC_CAUSE_VALUE_MANDATORY_IE_MISSING = 70,
// 71 Shall not be used.
GTPC_CAUSE_VALUE_SYSTEM_FAILURE = 72,
GTPC_CAUSE_VALUE_NO_RESOURCES_AVAILABLE = 73,
GTPC_CAUSE_VALUE_SEMANTIC_ERROR_IN_THE_TFT_OPERATION = 74,
GTPC_CAUSE_VALUE_SYNTACTIC_ERROR_IN_THE_TFT_OPERATION = 75,
GTPC_CAUSE_VALUE_SEMANTIC_ERRORS_IN_PACKET_FILTER = 76,
GTPC_CAUSE_VALUE_SYNTACTIC_ERRORS_IN_PACKET_FILTER = 77,
GTPC_CAUSE_VALUE_MISSING_OR_UNKNOWN_APN = 78,
// 79 Shall not be used.
GTPC_CAUSE_VALUE_GRE_KEY_NOT_FOUND = 80,
GTPC_CAUSE_VALUE_RELOCATION_FAILURE = 81,
GTPC_CAUSE_VALUE_DENIED_IN_RAT = 82,
GTPC_CAUSE_VALUE_PREFERRED_PDN_TYPE_NOT_SUPPORTED = 83,
GTPC_CAUSE_VALUE_ALL_DYNAMIC_ADDRESSES_ARE_OCCUPIED = 84,
GTPC_CAUSE_VALUE_UE_CONTEXT_WITHOUT_TFT_ALREADY_ACTIVATED = 85,
GTPC_CAUSE_VALUE_PROTOCOL_TYPE_NOT_SUPPORTED = 86,
GTPC_CAUSE_VALUE_UE_NOT_RESPONDING = 87,
GTPC_CAUSE_VALUE_UE_REFUSES = 88,
GTPC_CAUSE_VALUE_SERVICE_DENIED = 89,
GTPC_CAUSE_VALUE_UNABLE_TO_PAGE_UE = 90,
GTPC_CAUSE_VALUE_NO_MEMORY_AVAILABLE = 91,
GTPC_CAUSE_VALUE_USER_AUTHENTICATION_FAILED = 92,
GTPC_CAUSE_VALUE_APN_ACCESS_DENIED_NO_SUBSCRIPTION = 93,
GTPC_CAUSE_VALUE_REQUEST_REJECTED = 94,
GTPC_CAUSE_VALUE_P_TMSI_SIGNATURE_MISMATCH = 95,
GTPC_CAUSE_VALUE_IMSI_IMEI_NOT_KNOWN = 96,
GTPC_CAUSE_VALUE_SEMANTIC_ERROR_IN_THE_TAD_OPERATION = 97,
GTPC_CAUSE_VALUE_SYNTACTIC_ERROR_IN_THE_TAD_OPERATION = 98,
// 99 Shall not be used.
GTPC_CAUSE_VALUE_REMOTE_PEER_NOT_RESPONDING = 100,
GTPC_CAUSE_VALUE_COLLISION_WITH_NETWORK_INITIATED_REQUEST = 101,
GTPC_CAUSE_VALUE_UNABLE_TO_PAGE_UE_DUE_TO_SUSPENSION = 102,
GTPC_CAUSE_VALUE_CONDITIONAL_IE_MISSING = 103,
GTPC_CAUSE_VALUE_APN_RESTRICTION_TYPE_INCOMPATIBLE_WITH_CURRENTLY_ACTIVE_PDN_CONNECTION = 104,
GTPC_CAUSE_VALUE_INVALID_OVERALL_LENGTH_OF_THE_TRIGGERED_RESPONSE_MSG_AND_A_PIGGYBACKED_INITIAL_MSG = 105,
GTPC_CAUSE_VALUE_DATA_FORWARDING_NOT_SUPPORTED = 106,
GTPC_CAUSE_VALUE_INVALID_REPLY_FROM_REMOTE_PEER = 107,
GTPC_CAUSE_VALUE_FALLBACK_TO_GTPV1 = 108,
GTPC_CAUSE_VALUE_INVALID_PEER = 109,
GTPC_CAUSE_VALUE_TEMPORARILY_REJECTED_DUE_TO_HANDOVER_PROCEDURE_IN_PROGRESS = 110,
GTPC_CAUSE_VALUE_MODIFICATIONS_NOT_LIMITED_TO_S1_U_BEARERS = 111,
GTPC_CAUSE_VALUE_REQUEST_REJECTED_FOR_A_PMIPV6_REASON = 112,
GTPC_CAUSE_VALUE_APN_CONGESTION = 113,
GTPC_CAUSE_VALUE_BEARER_HANDLING_NOT_SUPPORTED = 114,
GTPC_CAUSE_VALUE_UE_ALREADY_RE_ATTACHED = 115,
GTPC_CAUSE_VALUE_MULTIPLE_PDN_CONNECTIONS_FOR_A_GIVEN_APN_NOT_ALLOWED = 116
// 117-239 Spare. For future use in a triggered/response message.
// 240-255 Spare. For future use in an initial/request message.
};
struct gtpc_cause_ie {
enum gtpc_cause_value cause_value;
bool pce;
bool bce;
bool cs;
enum gtpc_ie_type offending_ie_type;
uint16_t length_of_offending_ie;
uint8_t offending_ie_instance;
};
/****************************************************************************
*
* GTP-C Recovery IE
* Ref: 3GPP TS 29.274 v10.14.0 Figure 8.5-1
*
***************************************************************************/
/*
* The Recovery (Restart Counter) IE should be kept as an uint8_t.
*/
/****************************************************************************
*
* GTP-C Access Point Name IE
* Ref: 3GPP TS 29.274 v10.14.0 Figure 8.6-1
*
***************************************************************************/
/*
* APN IE should be kept as an null terminated string.
* This string will be kept in a char[MAX_APN_LENGTH] buffer.
*/
#define MAX_APN_LENGTH 1024
/****************************************************************************
*
* GTP-C Aggregate Maximum bit-rate IE
* Ref: 3GPP TS 29.274 v10.14.0 Table 8.7-1
*
***************************************************************************/
struct gtpc_ambr_ie {
uint32_t apn_ambr_uplink;
uint32_t apn_ambr_downlink;
};
/****************************************************************************
*
* GTP-C EPS Bearer ID address IE
* Ref: 3GPP TS 29.274 v10.14.0 Figure 8.8-1
*
***************************************************************************/
/*
* The EPS Bearer ID (EBI) IE should be kept as an uint8_t.
*/
/****************************************************************************
*
* GTP-C IP address IE
* Ref: 3GPP TS 29.274 v10.14.0 Figure 8.9-1
*
***************************************************************************/
/*
* IP addresse IEs should the sockaddr_storage struct, which can hold IPv4
* and IPv6 addresses.
*/
// TODO
// TODO IEs between 8.10 and 8.13 missing
// TODO
/****************************************************************************
*
* GTP-C PDN Type IE
* Ref: 3GPP TS 29.274 v10.14.0 Figure 8.14-1
*
***************************************************************************/
enum gtpc_pdn_type { GTPC_PDN_TYPE_IPV4 = 1, GTPC_PDN_TYPE_IPV6 = 2, GTPC_PDN_TYPE_IPV4V6 = 3 };
struct gtpc_pdn_address_allocation_ie {
enum gtpc_pdn_type pdn_type;
bool ipv4_present;
bool ipv6_present;
in_addr_t ipv4;
struct in6_addr ipv6;
};
/****************************************************************************
*
* GTP-C Bearer Quality of Service IE
* Ref: 3GPP TS 29.274 v10.14.0 Figure 8.15-1
*
***************************************************************************/
struct gtpc_bearer_qos_ie {
struct {
uint8_t pvi : 1;
uint8_t spare : 1;
uint8_t pl : 4;
uint8_t pci : 1;
uint8_t spare2 : 1;
} arp;
uint8_t qci;
uint8_t mbr_ul;
uint8_t mbr_dl;
uint8_t gbr_ul;
uint8_t gbr_dl;
};
// TODO
// TODO IEs between 8.16 and 8.17 missing
// TODO
/****************************************************************************
*
* GTP-C RAT Type IE
* Ref: 3GPP TS 29.274 v10.14.0 Figure 8.17-1
*
***************************************************************************/
enum gtpc_rat_type { UTRAN = 1, GERAN, WLAN, GAN, HSPA_EVOLUTION, EUTRAN, Virtual };
// TODO
// TODO IEs between 8.17 and 8.22 missing
// TODO
/****************************************************************************
*
* GTP-C Fully Qualified Tunnel End-point Identifier (F-TEID) IE
* Ref: 3GPP TS 29.274 v10.14.0 Figure 8.22-1
*
***************************************************************************/
enum gtpc_interface_type {
S1_U_ENODEB_GTP_U_INTERFACE,
S1_U_SGW_GTP_U_INTERFACE,
S12_RNC_GTP_U_INTERFACE,
S12_SGW_GTP_U_INTERFACE,
S5_S8_SGW_GTP_U_INTERFACE,
S5_S8_PGW_GTP_U_INTERFACE,
S5_S8_SGW_GTP_C_INTERFACE,
S5_S8_PGW_GTP_C_INTERFACE,
S5_S8_SGW_PMIPV6_INTERFACE, //(the 32 bit GRE key is encoded in 32 bit TEID field and since alternate CoA is not used
// the control plane and user plane addresses are the same for PMIPv6)
S5_S8_PGW_PMIPV6_INTERFACE, //(the 32 bit GRE key is encoded in 32 bit TEID field and the control plane and user plane
// addresses are the same for PMIPv6)
S11_MME_GTP_C_INTERFACE,
S11_S4_SGW_GTP_C_INTERFACE,
S10_MME_GTP_C_INTERFACE,
S3_MME_GTP_C_INTERFACE,
S3_SGSN_GTP_C_INTERFACE,
S4_SGSN_GTP_U_INTERFACE,
S4_SGW_GTP_U_INTERFACE,
S4_SGSN_GTP_C_INTERFACE,
S16_SGSN_GTP_C_INTERFACE,
ENODEB_GTP_U_INTERFACE_FOR_DL_DATA_FORWARDING,
ENODEB_GTP_U_INTERFACE_FOR_UL_DATA_FORWARDING,
RNC_GTP_U_INTERFACE_FOR_DATA_FORWARDING,
SGSN_GTP_U_INTERFACE_FOR_DATA_FORWARDING,
SGW_GTP_U_INTERFACE_FOR_DL_DATA_FORWARDING,
SM_MBMS_GW_GTP_C_INTERFACE,
SN_MBMS_GW_GTP_C_INTERFACE,
SM_MME_GTP_C_INTERFACE,
SN_SGSN_GTP_C_INTERFACE,
SGW_GTP_U_INTERFACE_FOR_UL_DATA_FORWARDING,
SN_SGSN_GTP_U_INTERFACE,
S2B_EPDG_GTP_C_INTERFACE,
S2B_U_EPDG_GTP_U_INTERFACE,
S2B_PGW_GTP_C_INTERFACE,
S2B_U_PGW_GTP_U_INTERFACE
};
typedef struct gtpc_f_teid_ie {
bool ipv4_present;
bool ipv6_present;
enum gtpc_interface_type interface_type;
uint32_t teid;
in_addr_t ipv4;
struct in6_addr ipv6; // TODO
} gtp_fteid_t;
// TODO
// TODO IEs between 8.22 and 8.28 missing
// TODO
/****************************************************************************
*
* GTP-C Bearer Context IE
* Ref: 3GPP TS 29.274 v10.14.0 Table 8.28-1
*
***************************************************************************/
// The usage of this grouped IE is specific to the GTP-C message being sent.
// As such, each GTP-C message will define it's bearer context structures
// locally, according to the rules of TS 29.274 v10.14.0 Section 7.
} // namespace srslte
#endif // SRSLTE_GTPC_IES_H