Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-SMF
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
OpenXG
OpenXG-SMF
Commits
593cf973
Commit
593cf973
authored
Feb 18, 2021
by
Tien-Thinh Nguyen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove dead code
parent
4ef20876
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
27 additions
and
1461 deletions
+27
-1461
src/common/3gpp_29.274.h
src/common/3gpp_29.274.h
+0
-1450
src/common/utils/3gpp_conversions.hpp
src/common/utils/3gpp_conversions.hpp
+1
-1
src/pfcp/pfcp.cpp
src/pfcp/pfcp.cpp
+3
-2
src/pfcp/pfcp.hpp
src/pfcp/pfcp.hpp
+1
-2
src/smf_app/smf_app.cpp
src/smf_app/smf_app.cpp
+14
-1
src/smf_app/smf_app.hpp
src/smf_app/smf_app.hpp
+0
-1
src/smf_app/smf_config.hpp
src/smf_app/smf_config.hpp
+0
-1
src/smf_app/smf_context.hpp
src/smf_app/smf_context.hpp
+0
-1
src/smf_app/smf_msg.hpp
src/smf_app/smf_msg.hpp
+0
-1
src/smf_app/smf_pfcp_association.cpp
src/smf_app/smf_pfcp_association.cpp
+7
-0
src/smf_app/smf_pfcp_association.hpp
src/smf_app/smf_pfcp_association.hpp
+1
-0
src/smf_app/smf_procedure.cpp
src/smf_app/smf_procedure.cpp
+0
-1
No files found.
src/common/3gpp_29.274.h
View file @
593cf973
...
...
@@ -142,146 +142,6 @@ struct imsi_s {
};
typedef
struct
imsi_s
imsi_t
;
//-------------------------------------
// 8.4 Cause
enum
cause_value_e
{
/* Request / Initial message */
UNKNOWN_ERROR
=
-
1
,
LOCAL_DETACH
=
2
,
COMPLETE_DETACH
=
3
,
RAT_CHANGE_3GPP_TO_NON_3GPP
=
4
,
///< RAT changed from 3GPP to Non-3GPP
ISR_DEACTIVATION
=
5
,
ERROR_IND_FROM_RNC_ENB_SGSN
=
6
,
IMSI_DETACH_ONLY
=
7
,
REACTIVATION_REQUESTED
=
8
,
PDN_RECONNECTION_TO_THIS_APN_DISALLOWED
=
9
,
ACCESS_CHANGED_FROM_NON_3GPP_TO_3GPP
=
10
,
PDN_CONNECTION_INACTIVITY_TIMER_EXPIRES
=
11
,
PGW_NOT_RESPONDING
=
12
,
NETWORK_FAILURE
=
13
,
QOS_PARAMETER_MISMATCH
=
14
,
/* Acceptance in a Response/Triggered message */
REQUEST_ACCEPTED
=
16
,
REQUEST_ACCEPTED_PARTIALLY
=
17
,
NEW_PDN_TYPE_DUE_TO_NETWORK_PREFERENCE
=
18
,
///< New PDN type due to network preference
NEW_PDN_TYPE_DUE_TO_SINGLE_ADDRESS_BEARER_ONLY
=
19
,
///< New PDN type due to single address bearer only
/* Rejection in a Response triggered message. */
CONTEXT_NOT_FOUND
=
64
,
INVALID_MESSAGE_FORMAT
=
65
,
VERSION_NOT_SUPPORTED_BY_NEXT_PEER
=
66
,
INVALID_LENGTH
=
67
,
SERVICE_NOT_SUPPORTED
=
68
,
MANDATORY_IE_INCORRECT
=
69
,
MANDATORY_IE_MISSING
=
70
,
SYSTEM_FAILURE
=
72
,
NO_RESOURCES_AVAILABLE
=
73
,
SEMANTIC_ERROR_IN_THE_TFT_OPERATION
=
74
,
SYNTACTIC_ERROR_IN_THE_TFT_OPERATION
=
75
,
SEMANTIC_ERRORS_IN_PACKET_FILTER
=
76
,
SYNTACTIC_ERRORS_IN_PACKET_FILTER
=
77
,
MISSING_OR_UNKNOWN_APN
=
78
,
GRE_KEY_NOT_FOUND
=
80
,
RELOCATION_FAILURE
=
81
,
DENIED_IN_RAT
=
82
,
PREFERRED_PDN_TYPE_NOT_SUPPORTED
=
83
,
ALL_DYNAMIC_ADDRESSES_ARE_OCCUPIED
=
84
,
UE_CONTEXT_WITHOUT_TFT_ALREADY_ACTIVATED
=
85
,
PROTOCOL_TYPE_NOT_SUPPORTED
=
86
,
UE_NOT_RESPONDING
=
87
,
UE_REFUSES
=
88
,
SERVICE_DENIED
=
89
,
UNABLE_TO_PAGE_UE
=
90
,
NO_MEMORY_AVAILABLE
=
91
,
USER_AUTHENTICATION_FAILED
=
92
,
APN_ACCESS_DENIED_NO_SUBSCRIPTION
=
93
,
REQUEST_REJECTED
=
94
,
P_TMSI_SIGNATURE_MISMATCH
=
95
,
IMSI_IMEI_NOT_KNOWN
=
96
,
SEMANTIC_ERROR_IN_THE_TAD_OPERATION
=
97
,
SYNTACTIC_ERROR_IN_THE_TAD_OPERATION
=
98
,
REMOTE_PEER_NOT_RESPONDING
=
100
,
COLLISION_WITH_NETWORK_INITIATED_REQUEST
=
101
,
UNABLE_TO_PAGE_UE_DUE_TO_SUSPENSION
=
102
,
CONDITIONAL_IE_MISSING
=
103
,
APN_RESTRICTION_TYPE_INCOMPATIBLE_WITH_CURRENTLY_ACTIVE_PDN_CONNECTION
=
104
,
INVALID_OVERALL_LENGTH_OF_THE_TRIGGERED_RESPONSE_MESSAGE_AND_A_PIGGYBACKED_INITIAL_MESSAGE
=
105
,
DATA_FORWARDING_NOT_SUPPORTED
=
106
,
INVALID_REPLY_FROM_REMOTE_PEER
=
107
,
FALLBACK_TO_GTPV1
=
108
,
INVALID_PEER
=
109
,
TEMPORARILY_REJECTED_DUE_TO_TAU_HO_PROCEDURE_IN_PROGRESS
=
110
,
MODIFICATIONS_NOT_LIMITED_TO_S1_U_BEARERS
=
111
,
REQUEST_REJECTED_FOR_PMIPv6_REASON
=
112
,
APN_CONGESTION
=
113
,
BEARER_HANDLING_NOT_SUPPORTED
=
114
,
UE_ALREADY_RE_ATTACHED
=
115
,
MULTIPLE_PDN_CONNECTIONS_FOR_A_GIVEN_APN_NOT_ALLOWED
=
116
,
TARGET_ACCESS_RESTRICTED_FOR_THE_SUBSCRIBER
=
117
,
MME_SGSN_REFUSES_DUE_TO_VPLMN_POLICY
=
119
,
GTP_C_ENTITY_CONGESTION
=
120
,
LATE_OVERLAPPING_REQUEST
=
121
,
TIMED_OUT_REQUEST
=
122
,
UE_IS_TEMPORARILY_NOT_REACHABLE_DUE_TO_POWER_SAVING
=
123
,
RELOCATION_FAILURE_DUE_TO_NAS_MESSAGE_REDIRECTION
=
124
,
UE_NOT_AUTHORISED_BY_OCS_OR_EXTERNAL_AAA_SERVER
=
125
,
MULTIPLE_ACCESSES_TO_A_PDN_CONNECTION_NOT_ALLOWED
=
126
,
REQUEST_REJECTED_DUE_TO_UE_CAPABILITY
=
127
,
S1_U_PATH_FAILURE
=
128
};
typedef
struct
cause_s
{
uint8_t
cause_value
;
uint8_t
pce
:
1
;
uint8_t
bce
:
1
;
uint8_t
cs
:
1
;
uint8_t
offending_ie_instance
:
4
;
uint8_t
filler
:
1
;
uint8_t
offending_ie_type
;
uint16_t
offending_ie_length
;
}
cause_t
;
//------------------------------------------------------------------------------
// 8.5 recovery
// typedef struct recovery_s {
// uint8_t recovery;
//} recovery_t;
//------------------------------------------------------------------------------
// 8.6 Access Point Name
typedef
struct
apn_s
{
std
::
string
access_point_name
;
}
apn_t
;
//------------------------------------------------------------------------------
// 8.7 Aggregate Maximum Bit Rate (AMBR)
typedef
struct
ambr_s
{
uint32_t
br_ul
;
uint32_t
br_dl
;
}
ambr_t
;
//------------------------------------------------------------------------------
// 8.8 EPS Bearer ID (EBI)
#define EPS_BEARER_IDENTITY_UNASSIGNED (uint8_t) 0
#define EPS_BEARER_IDENTITY_RESERVED1 (uint8_t) 1
#define EPS_BEARER_IDENTITY_RESERVED2 (uint8_t) 2
#define EPS_BEARER_IDENTITY_RESERVED3 (uint8_t) 3
#define EPS_BEARER_IDENTITY_RESERVED4 (uint8_t) 4
#define EPS_BEARER_IDENTITY_FIRST (uint8_t) 5
#define EPS_BEARER_IDENTITY_LAST (uint8_t) 15
typedef
struct
ebi_s
{
uint8_t
ebi
;
ebi_s
()
:
ebi
(
EPS_BEARER_IDENTITY_UNASSIGNED
)
{}
ebi_s
(
const
uint8_t
&
e
)
:
ebi
(
e
)
{}
ebi_s
(
const
struct
ebi_s
&
e
)
:
ebi
(
e
.
ebi
)
{}
inline
bool
operator
==
(
const
struct
ebi_s
&
rhs
)
const
{
return
ebi
==
rhs
.
ebi
;
}
inline
bool
operator
!=
(
const
struct
ebi_s
&
rhs
)
const
{
return
!
(
ebi
==
rhs
.
ebi
);
}
}
ebi_t
;
//-------------------------------------
// 8.9 IP Address
typedef
struct
ip_address_s
{
...
...
@@ -464,684 +324,12 @@ struct msisdn_s {
typedef
struct
msisdn_s
msisdn_t
;
//-------------------------------------
// 8.12 Indication
typedef
struct
indication_s
{
uint8_t
daf
:
1
;
uint8_t
dtf
:
1
;
uint8_t
hi
:
1
;
uint8_t
dfi
:
1
;
uint8_t
oi
:
1
;
uint8_t
isrsi
:
1
;
uint8_t
israi
:
1
;
uint8_t
sgwci
:
1
;
uint8_t
sqci
:
1
;
uint8_t
uimsi
:
1
;
uint8_t
cfsi
:
1
;
uint8_t
crsi
:
1
;
uint8_t
p
:
1
;
uint8_t
pt
:
1
;
uint8_t
si
:
1
;
uint8_t
msv
:
1
;
uint8_t
retloc
:
1
;
uint8_t
pbic
:
1
;
uint8_t
srni
:
1
;
uint8_t
s6af
:
1
;
uint8_t
s4af
:
1
;
uint8_t
mbmdt
:
1
;
uint8_t
israu
:
1
;
uint8_t
ccrsi
:
1
;
uint8_t
cprai
:
1
;
uint8_t
arrl
:
1
;
uint8_t
ppof
:
1
;
uint8_t
ppon
:
1
;
uint8_t
ppsi
:
1
;
uint8_t
csfbi
:
1
;
uint8_t
clii
:
1
;
uint8_t
cpsr
:
1
;
uint8_t
nsi
:
1
;
uint8_t
uasi
:
1
;
uint8_t
dtci
:
1
;
uint8_t
bdwi
:
1
;
uint8_t
psci
:
1
;
uint8_t
pcri
:
1
;
uint8_t
aosi
:
1
;
uint8_t
aopi
:
1
;
uint8_t
roaai
:
1
;
uint8_t
epcosi
:
1
;
uint8_t
cpopci
:
1
;
uint8_t
pmtsmi
:
1
;
uint8_t
s11tf
:
1
;
uint8_t
pnsi
:
1
;
uint8_t
unaccsi
:
1
;
uint8_t
wpmsi
:
1
;
uint8_t
spare1
:
1
;
uint8_t
spare2
:
1
;
uint8_t
spare3
:
1
;
uint8_t
eevrsi
:
1
;
uint8_t
ltemui
:
1
;
uint8_t
ltempi
:
1
;
uint8_t
enbcpi
:
1
;
uint8_t
tspcmi
:
1
;
}
indication_t
;
//-------------------------------------
// 8.13 Protocol Configuration Options (PCO)
//-------------------------------------
// 8.34 PDN Type
enum
pdn_type_e
{
PDN_TYPE_E_IPV4
=
1
,
PDN_TYPE_E_IPV6
=
2
,
PDN_TYPE_E_IPV4V6
=
3
,
PDN_TYPE_E_NON_IP
=
4
,
};
static
const
std
::
vector
<
std
::
string
>
pdn_type_e2str
=
{
"Error"
,
"IPV4"
,
"IPV6"
,
"IPV4V6"
,
"NON_IP"
};
typedef
struct
pdn_type_s
{
uint8_t
pdn_type
;
pdn_type_s
()
:
pdn_type
(
PDN_TYPE_E_IPV4
)
{}
pdn_type_s
(
const
uint8_t
&
p
)
:
pdn_type
(
p
)
{}
pdn_type_s
(
const
struct
pdn_type_s
&
p
)
:
pdn_type
(
p
.
pdn_type
)
{}
bool
operator
==
(
const
struct
pdn_type_s
&
p
)
const
{
return
(
p
.
pdn_type
==
pdn_type
);
}
//------------------------------------------------------------------------------
bool
operator
==
(
const
pdn_type_e
&
p
)
const
{
return
(
p
==
pdn_type
);
}
//------------------------------------------------------------------------------
const
std
::
string
&
toString
()
const
{
return
pdn_type_e2str
.
at
(
pdn_type
);
}
}
pdn_type_t
;
/*
//-------------------------------------
// 8.14 PDN Address Allocation (PAA)
struct paa_s {
pdn_type_t pdn_type;
uint8_t ipv6_prefix_length;
struct in6_addr ipv6_address;
struct in_addr ipv4_address;
//------------------------------------------------------------------------------
bool is_ip_assigned() {
switch (pdn_type.pdn_type) {
case PDN_TYPE_E_IPV4:
if (ipv4_address.s_addr)
return true;
return false;
break;
case PDN_TYPE_E_IPV6:
if (ipv6_address.s6_addr32[0] | ipv6_address.s6_addr32[1]
| ipv6_address.s6_addr32[2] | ipv6_address.s6_addr32[3])
return true;
return false;
break;
case PDN_TYPE_E_IPV4V6:
// TODO
if (ipv4_address.s_addr)
return true;
if (ipv6_address.s6_addr32[0] | ipv6_address.s6_addr32[1]
| ipv6_address.s6_addr32[2] | ipv6_address.s6_addr32[3])
return true;
return false;
break;
case PDN_TYPE_E_NON_IP:
default:
return false;
}
}
};
typedef struct paa_s paa_t;
*/
//-------------------------------------
// 8.15 Bearer Quality of Service (Bearer QoS)
#define PRE_EMPTION_CAPABILITY_ENABLED (0x0)
#define PRE_EMPTION_CAPABILITY_DISABLED (0x1)
#define PRE_EMPTION_VULNERABILITY_ENABLED (0x0)
#define PRE_EMPTION_VULNERABILITY_DISABLED (0x1)
typedef
struct
bearer_qos_s
{
uint8_t
spare1
:
1
;
uint8_t
pci
:
1
;
uint8_t
pl
:
4
;
uint8_t
spare2
:
1
;
uint8_t
pvi
:
1
;
uint8_t
label_qci
;
uint64_t
maximum_bit_rate_for_uplink
;
uint64_t
maximum_bit_rate_for_downlink
;
uint64_t
guaranted_bit_rate_for_uplink
;
uint64_t
guaranted_bit_rate_for_downlink
;
bool
operator
==
(
const
struct
bearer_qos_s
&
q
)
const
{
return
(
(
q
.
label_qci
==
label_qci
)
&&
(
q
.
pl
==
pl
)
&&
(
q
.
pvi
==
pvi
)
&&
(
q
.
pci
==
pci
));
}
//------------------------------------------------------------------------------
std
::
string
toString
()
const
{
std
::
string
s
=
{};
s
.
append
(
"MBR UL="
).
append
(
std
::
to_string
(
maximum_bit_rate_for_uplink
));
s
.
append
(
", MBR DL="
).
append
(
std
::
to_string
(
maximum_bit_rate_for_downlink
));
s
.
append
(
", GBR UL="
).
append
(
std
::
to_string
(
guaranted_bit_rate_for_uplink
));
s
.
append
(
", GBR DL="
)
.
append
(
std
::
to_string
(
guaranted_bit_rate_for_downlink
));
s
.
append
(
", PCI="
).
append
(
std
::
to_string
(
pci
));
s
.
append
(
", PL="
).
append
(
std
::
to_string
(
pl
));
s
.
append
(
", PVI="
).
append
(
std
::
to_string
(
pvi
));
s
.
append
(
", QCI="
).
append
(
std
::
to_string
(
label_qci
));
return
s
;
}
}
bearer_qos_t
;
//-------------------------------------
// 8.16 Flow Quality of Service (Flow QoS)
typedef
struct
flow_qos_s
{
uint8_t
label_qci
;
uint64_t
maximum_bit_rate_for_uplink
;
uint64_t
maximum_bit_rate_for_downlink
;
uint64_t
guaranted_bit_rate_for_uplink
;
uint64_t
guaranted_bit_rate_for_downlink
;
}
flow_qos_t
;
//-------------------------------------
// 8.17 RAT Type
enum
rat_type_e
{
RAT_TYPE_E_RESERVED
=
0
,
RAT_TYPE_E_UTRAN
=
1
,
RAT_TYPE_E_GERAN
=
2
,
RAT_TYPE_E_WLAN
=
3
,
RAT_TYPE_E_GAN
=
4
,
RAT_TYPE_E_HSPA_EVOLUTION
=
5
,
RAT_TYPE_E_EUTRAN_WB_EUTRAN
=
6
,
RAT_TYPE_E_VIRTUAL
=
7
,
RAT_TYPE_E_EUTRAN_NB_IOT
=
8
,
RAT_TYPE_E_LTE_M
=
9
,
RAT_TYPE_E_NR
=
10
,
};
struct
rat_type_s
{
uint8_t
rat_type
;
rat_type_s
()
:
rat_type
(
RAT_TYPE_E_EUTRAN_WB_EUTRAN
)
{}
rat_type_s
(
const
rat_type_e
r
)
:
rat_type
(
r
)
{}
rat_type_s
(
const
rat_type_s
&
i
)
:
rat_type
(
i
.
rat_type
)
{}
//------------------------------------------------------------------------------
std
::
string
toString
()
const
{
switch
(
rat_type
)
{
case
RAT_TYPE_E_EUTRAN_WB_EUTRAN
:
return
std
::
string
(
"EUTRAN_WB_EUTRAN"
);
case
RAT_TYPE_E_EUTRAN_NB_IOT
:
return
std
::
string
(
"EUTRAN_NB_IOT"
);
case
RAT_TYPE_E_LTE_M
:
return
std
::
string
(
"LTE_M"
);
case
RAT_TYPE_E_NR
:
return
std
::
string
(
"NR"
);
case
RAT_TYPE_E_VIRTUAL
:
return
std
::
string
(
"VIRTUAL"
);
case
RAT_TYPE_E_RESERVED
:
return
std
::
string
(
"RESERVED"
);
case
RAT_TYPE_E_UTRAN
:
return
std
::
string
(
"UTRAN"
);
case
RAT_TYPE_E_GERAN
:
return
std
::
string
(
"GERAN"
);
case
RAT_TYPE_E_WLAN
:
return
std
::
string
(
"WLAN"
);
case
RAT_TYPE_E_GAN
:
return
std
::
string
(
"GAN"
);
case
RAT_TYPE_E_HSPA_EVOLUTION
:
return
std
::
string
(
"HSPA_EVOLUTION"
);
default:
return
std
::
to_string
(
rat_type
);
}
}
};
typedef
struct
rat_type_s
rat_type_t
;
//-------------------------------------
// 8.18 Serving Network
typedef
struct
serving_network_s
{
uint8_t
mcc_digit_2
:
4
;
uint8_t
mcc_digit_1
:
4
;
uint8_t
mnc_digit_3
:
4
;
uint8_t
mcc_digit_3
:
4
;
uint8_t
mnc_digit_2
:
4
;
uint8_t
mnc_digit_1
:
4
;
}
serving_network_t
;
//-------------------------------------
// 8.19 EPS Bearer Level Traffic Flow Template (Bearer TFT)
//-------------------------------------
// 8.20 Traffic Aggregate Description (TAD)
//-------------------------------------
// 8.21.1 CGI field
typedef
struct
gtpc2c_cgi_field_s
{
uint8_t
mcc_digit_2
:
4
;
uint8_t
mcc_digit_1
:
4
;
uint8_t
mnc_digit_3
:
4
;
uint8_t
mcc_digit_3
:
4
;
uint8_t
mnc_digit_2
:
4
;
uint8_t
mnc_digit_1
:
4
;
uint16_t
location_area_code
;
uint16_t
cell_identity
;
}
cgi_field_t
;
//-------------------------------------
// 8.21.2 SAI field
typedef
struct
gtpc2c_sai_field_s
{
uint8_t
mcc_digit_2
:
4
;
uint8_t
mcc_digit_1
:
4
;
uint8_t
mnc_digit_3
:
4
;
uint8_t
mcc_digit_3
:
4
;
uint8_t
mnc_digit_2
:
4
;
uint8_t
mnc_digit_1
:
4
;
uint16_t
location_area_code
;
uint16_t
service_area_code
;
}
sai_field_t
;
//-------------------------------------
// 8.21.3 RAI field
typedef
struct
gtpc2c_rai_field_s
{
uint8_t
mcc_digit_2
:
4
;
uint8_t
mcc_digit_1
:
4
;
uint8_t
mnc_digit_3
:
4
;
uint8_t
mcc_digit_3
:
4
;
uint8_t
mnc_digit_2
:
4
;
uint8_t
mnc_digit_1
:
4
;
uint16_t
location_area_code
;
uint16_t
routing_area_code
;
}
rai_field_t
;
//-------------------------------------
// 8.21.4 TAI field
typedef
struct
gtpc2c_tai_field_s
{
uint8_t
mcc_digit_2
:
4
;
uint8_t
mcc_digit_1
:
4
;
uint8_t
mnc_digit_3
:
4
;
uint8_t
mcc_digit_3
:
4
;
uint8_t
mnc_digit_2
:
4
;
uint8_t
mnc_digit_1
:
4
;
uint16_t
tracking_area_code
;
}
tai_field_t
;
//-------------------------------------
// 8.21.5 ECGI field
typedef
struct
gtpc2c_ecgi_field_s
{
uint8_t
mcc_digit_2
:
4
;
uint8_t
mcc_digit_1
:
4
;
uint8_t
mnc_digit_3
:
4
;
uint8_t
mcc_digit_3
:
4
;
uint8_t
mnc_digit_2
:
4
;
uint8_t
mnc_digit_1
:
4
;
uint8_t
spare
:
4
;
uint8_t
eci
:
4
;
uint8_t
e_utran_cell_identifier
[
3
];
//------------------------------------------------------------------------------
std
::
string
toString
()
const
{
std
::
string
s
=
{};
std
::
string
mccs
=
conv
::
mccToString
(
mcc_digit_1
,
mcc_digit_2
,
mcc_digit_3
);
std
::
string
mncs
=
conv
::
mncToString
(
mnc_digit_1
,
mnc_digit_2
,
mnc_digit_3
);
s
.
append
(
"mcc="
).
append
(
mccs
).
append
(
", MNC="
).
append
(
mncs
);
s
.
append
(
", ECI="
).
append
(
std
::
to_string
(
eci
));
uint32_t
we_utran_cell_identifier
=
static_cast
<
uint32_t
>
(
e_utran_cell_identifier
[
0
])
<<
16
;
we_utran_cell_identifier
|=
(
static_cast
<
uint32_t
>
(
e_utran_cell_identifier
[
1
])
<<
8
);
we_utran_cell_identifier
|=
static_cast
<
uint32_t
>
(
e_utran_cell_identifier
[
2
]);
s
.
append
(
", EUCI="
).
append
(
std
::
to_string
(
we_utran_cell_identifier
));
return
s
;
}
}
ecgi_field_t
;
//-------------------------------------
// 8.21.6 LAI field
typedef
struct
gtpc2c_lai_field_s
{
uint8_t
mcc_digit_2
:
4
;
uint8_t
mcc_digit_1
:
4
;
uint8_t
mnc_digit_3
:
4
;
uint8_t
mcc_digit_3
:
4
;
uint8_t
mnc_digit_2
:
4
;
uint8_t
mnc_digit_1
:
4
;
uint16_t
location_area_code
;
}
lai_field_t
;
//-------------------------------------
// 8.21.7 Macro eNodeB ID field
typedef
struct
gtpc2c_macro_enodeb_id_field_s
{
uint8_t
mcc_digit_2
:
4
;
uint8_t
mcc_digit_1
:
4
;
uint8_t
mnc_digit_3
:
4
;
uint8_t
mcc_digit_3
:
4
;
uint8_t
mnc_digit_2
:
4
;
uint8_t
mnc_digit_1
:
4
;
uint32_t
spare
:
4
;
uint32_t
macro_enodeb_id
:
20
;
uint32_t
lost_bits
:
8
;
}
macro_enodeb_id_field_t
;
//-------------------------------------
// 8.21.8 Extended Macro eNodeB ID field
typedef
struct
gtpc2c_extended_macro_enodeb_id_field_s
{
uint8_t
mcc_digit_2
:
4
;
uint8_t
mcc_digit_1
:
4
;
uint8_t
mnc_digit_3
:
4
;
uint8_t
mcc_digit_3
:
4
;
uint8_t
mnc_digit_2
:
4
;
uint8_t
mnc_digit_1
:
4
;
uint32_t
smenb
:
1
;
uint32_t
spare
:
2
;
uint32_t
extended_macro_enodeb_id
:
21
;
uint32_t
lost_bits
:
8
;
}
extended_macro_enodeb_id_field_t
;
//-------------------------------------
// 8.21 User Location Information (ULI)
typedef
struct
user_location_information_s
{
struct
user_location_information_ie_hdr_t
{
uint8_t
extended_macro_enodeb_id
:
1
;
uint8_t
macro_enodeb_id
:
1
;
uint8_t
lai
:
1
;
uint8_t
ecgi
:
1
;
uint8_t
tai
:
1
;
uint8_t
rai
:
1
;
uint8_t
sai
:
1
;
uint8_t
cgi
:
1
;
}
user_location_information_ie_hdr
;
cgi_field_t
cgi1
;
sai_field_t
sai1
;
rai_field_t
rai1
;
tai_field_t
tai1
;
ecgi_field_t
ecgi1
;
lai_field_t
lai1
;
macro_enodeb_id_field_t
macro_enodeb_id1
;
extended_macro_enodeb_id_field_t
extended_macro_enodeb_id1
;
}
user_location_information_t
;
typedef
user_location_information_t
uli_t
;
//-------------------------------------
// 8.22 Fully Qualified TEID (F-TEID)
/* WARNING: not complete... */
enum
interface_type_e
{
INTERFACE_TYPE_MIN
=
0
,
S1_U_ENODEB_GTP_U
=
INTERFACE_TYPE_MIN
,
S1_U_SGW_GTP_U
=
1
,
S12_RNC_GTP_U
=
2
,
S12_SGW_GTP_U
=
3
,
S5_S8_SGW_GTP_U
=
4
,
S5_S8_PGW_GTP_U
=
5
,
S5_S8_SGW_GTP_C
=
6
,
S5_S8_PGW_GTP_C
=
7
,
S5_S8_SGW_PMIPv6
=
8
,
S5_S8_PGW_PMIPv6
=
9
,
S11_MME_GTP_C
=
10
,
S11_S4_SGW_GTP_C
=
11
,
S10_MME_GTP_C
=
12
,
S3_MME_GTP_C
=
13
,
S3_SGSN_GTP_C
=
14
,
S4_SGSN_GTP_U
=
15
,
S4_SGW_GTP_U
=
16
,
S4_SGSN_GTP_C
=
17
,
S16_SGSN_GTP_C
=
18
,
ENODEB_GTP_U_DL_DATA_FORWARDING
=
19
,
ENODEB_GTP_U_UL_DATA_FORWARDING
=
20
,
RNC_GTP_U_DATA_FORWARDING
=
21
,
SGSN_GTP_U_DATA_FORWARDING
=
22
,
SGW_UPF_GTP_U_DL_DATA_FORWARDING
=
23
,
SM_MBMS_GW_GTP_C
=
24
,
SN_MBMS_GW_GTP_C
=
25
,
SM_MME_GTP_C
=
26
,
SN_SGSN_GTP_C
=
27
,
SGW_GTP_U_UL_DATA_FORWARDING
=
28
,
SN_SGSN_GTP_U
=
29
,
S2B_EPDG_GTP_C
=
30
,
S2B_U_EPDG_GTP_U
=
31
,
S2B_PGW_GTP_C
=
32
,
S2B_U_PGW_GTP_U
=
33
,
S2A_TWAN_GTP_U
=
34
,
S2A_TWAN_GTP_C
=
35
,
S2A_PGW_GTP_C
=
36
,
S2A_PGW_GTP_U
=
37
,
S11_MME_GTP_U
=
38
,
S11_SGW_GTP_U
=
39
,
INTERFACE_TYPE_MAX
=
S11_SGW_GTP_U
};
struct
interface_type_s
{
interface_type_e
interface_type
;
interface_type_s
()
:
interface_type
(
INTERFACE_TYPE_MIN
)
{}
interface_type_s
(
interface_type_e
t
)
:
interface_type
(
t
)
{}
//------------------------------------------------------------------------------
std
::
string
toString
()
const
{
const
char
*
interface_type2char
[
40
]
=
{
"S1_U_ENODEB_GTP_U"
,
"S1_U_SGW_GTP_U"
,
"S12_RNC_GTP_U"
,
"S12_SGW_GTP_U"
,
"S5_S8_SGW_GTP_U"
,
"S5_S8_PGW_GTP_U"
,
"S5_S8_SGW_GTP_C"
,
"S5_S8_PGW_GTP_C"
,
"S5_S8_SGW_PMIPv6"
,
"S5_S8_PGW_PMIPv6"
,
"S11_MME_GTP_C"
,
"S11_S4_SGW_GTP_C"
,
"S10_MME_GTP_C"
,
"S3_MME_GTP_C"
,
"S3_SGSN_GTP_C"
,
"S4_SGSN_GTP_U"
,
"S4_SGW_GTP_U"
,
"S4_SGSN_GTP_C"
,
"S16_SGSN_GTP_C"
,
"ENODEB_GTP_U_DL_DATA_FORWARDING"
,
"ENODEB_GTP_U_UL_DATA_FORWARDING"
,
"RNC_GTP_U_DATA_FORWARDING"
,
"SGSN_GTP_U_DATA_FORWARDING"
,
"SGW_UPF_GTP_U_DL_DATA_FORWARDING"
,
"SM_MBMS_GW_GTP_C"
,
"SN_MBMS_GW_GTP_C"
,
"SM_MME_GTP_C"
,
"SN_SGSN_GTP_C"
,
"SGW_GTP_U_UL_DATA_FORWARDING"
,
"SN_SGSN_GTP_U"
,
"S2B_EPDG_GTP_C"
,
"S2B_U_EPDG_GTP_U"
,
"S2B_PGW_GTP_C"
,
"S2B_U_PGW_GTP_U"
,
"S2A_TWAN_GTP_U"
,
"S2A_TWAN_GTP_C"
,
"S2A_PGW_GTP_C"
,
"S2A_PGW_GTP_U"
,
"S11_MME_GTP_U"
,
"S11_SGW_GTP_U"
};
if
((
interface_type
>=
INTERFACE_TYPE_MIN
)
&&
(
interface_type
<=
INTERFACE_TYPE_MAX
))
{
return
std
::
string
(
interface_type2char
[
interface_type
]);
}
else
{
return
std
::
to_string
(
interface_type
);
}
}
};
typedef
struct
interface_type_s
interface_type_t
;
struct
fully_qualified_tunnel_endpoint_identifier_s
{
uint8_t
v4
:
1
;
uint8_t
v6
:
1
;
uint8_t
interface_type
:
6
;
uint32_t
teid_gre_key
;
struct
in_addr
ipv4_address
;
struct
in6_addr
ipv6_address
;
bool
operator
<
(
const
struct
fully_qualified_tunnel_endpoint_identifier_s
&
f
)
const
{
return
(
teid_gre_key
<
f
.
teid_gre_key
)
or
(
ipv4_address
.
s_addr
<
f
.
ipv4_address
.
s_addr
)
or
(
interface_type
<
f
.
interface_type
)
or
(
v4
==
f
.
v4
)
or
(
v6
==
f
.
v6
)
or
(
ipv6_address
.
s6_addr32
[
0
]
==
f
.
ipv6_address
.
s6_addr32
[
0
])
or
(
ipv6_address
.
s6_addr32
[
1
]
==
f
.
ipv6_address
.
s6_addr32
[
1
])
or
(
ipv6_address
.
s6_addr32
[
2
]
==
f
.
ipv6_address
.
s6_addr32
[
2
])
or
(
ipv6_address
.
s6_addr32
[
3
]
==
f
.
ipv6_address
.
s6_addr32
[
3
]);
}
bool
operator
==
(
const
struct
fully_qualified_tunnel_endpoint_identifier_s
&
f
)
const
{
return
(
teid_gre_key
==
f
.
teid_gre_key
)
and
(
ipv4_address
.
s_addr
==
f
.
ipv4_address
.
s_addr
)
and
(
interface_type
==
f
.
interface_type
)
and
(
ipv6_address
.
s6_addr32
[
0
]
==
f
.
ipv6_address
.
s6_addr32
[
0
])
and
(
ipv6_address
.
s6_addr32
[
1
]
==
f
.
ipv6_address
.
s6_addr32
[
1
])
and
(
ipv6_address
.
s6_addr32
[
2
]
==
f
.
ipv6_address
.
s6_addr32
[
2
])
and
(
ipv6_address
.
s6_addr32
[
3
]
==
f
.
ipv6_address
.
s6_addr32
[
3
])
and
(
v4
==
f
.
v4
)
and
(
v6
==
f
.
v6
);
}
//------------------------------------------------------------------------------
std
::
string
toString
()
const
{
std
::
string
s
=
{};
interface_type_t
iface_type
((
interface_type_e
)
interface_type
);
if
((
v4
)
||
(
v6
))
{
// s.append("Interface type=").append(iface_type.toString());
s
.
append
(
"TEID="
).
append
(
std
::
to_string
(
teid_gre_key
));
if
(
v4
)
{
s
.
append
(
", IPv4="
).
append
(
conv
::
toString
(
ipv4_address
));
}
if
(
v6
)
{
s
.
append
(
", IPv6="
).
append
(
conv
::
toString
(
ipv6_address
));
}
}
else
{
s
.
append
(
"null_fteid"
);
}
return
s
;
}
bool
is_zero
()
const
{
return
((
!
v4
)
and
(
!
v6
));
}
};
typedef
struct
fully_qualified_tunnel_endpoint_identifier_s
fully_qualified_tunnel_endpoint_identifier_t
;
typedef
struct
fully_qualified_tunnel_endpoint_identifier_s
fteid_t
;
//-------------------------------------
// 8.24 Global CN-Id
// typedef struct global_cn_id_s {
// uint8_t mcc_digit_2 :4;
// uint8_t mcc_digit_1 :4;
// uint8_t mnc_digit_3 :4;
// uint8_t mcc_digit_3 :4;
// uint8_t mnc_digit_2 :4;
// uint8_t mnc_digit_1 :4;
// cn_id_t cn_id;
//} global_cn_id_t;
//-------------------------------------
// 8.27 Delay Value
typedef
struct
delay_value_s
{
uint8_t
delay_value
;
}
delay_value_t
;
//-------------------------------------
// 8.28 Bearer Context
//-------------------------------------
// 8.29 Charging ID
typedef
struct
charging_id_s
{
uint32_t
charging_id_value
;
}
charging_id_t
;
//-------------------------------------
// 8.30 Charging Characteristics
typedef
struct
charging_characteristics_s
{
uint16_t
charging_characteristics_value
;
}
charging_characteristics_t
;
//-------------------------------------
// 8.31 Trace Information
// typedef struct trace_information_s {
// uint8_t mcc_digit_2 :4;
// uint8_t mcc_digit_1 :4;
// uint8_t mnc_digit_3 :4;
// uint8_t mcc_digit_3 :4;
// uint8_t mnc_digit_2 :4;
// uint8_t mnc_digit_1 :4;
// uint8_t trace_id[3];
// uint8_t triggering_events[9];
// uint16_t list_of_ne_types;
// uint8_t session_trace_depth;
// uint16_t list_of_interfaces;
// char* ip_address_of_trace_collection_entity_;
//} trace_information_t;
//-------------------------------------
// 8.32 Bearer Flags
typedef
struct
bearer_flags_s
{
uint8_t
spare1
:
4
;
uint8_t
asi
:
1
;
uint8_t
vind
:
1
;
uint8_t
vb
:
1
;
uint8_t
ppc
:
1
;
}
bearer_flags_t
;
//-------------------------------------
// 8.35 Procedure Transaction ID (PTI)
typedef
struct
procedure_transaction_id_s
{
uint8_t
procedure_transaction_id
;
}
procedure_transaction_id_t
;
//-------------------------------------
// 8.38 MM Context
// 8.38 MM EPS Context
// typedef struct mm_context_eps_s {
// // todo: better structure for flags
//// uint32_t mm_context_flags:24;
// uint8_t sec_mode:3;
// // todo: uint8_t drxi:1;
// uint8_t ksi:3;
// uint8_t num_quit:3;
// uint8_t num_quad:3;
// // todo: osci 0 --> old stuff (everything from s to s+64 in 29.274 -->
// 8-38.5 not present uint8_t nas_int_alg:3; uint8_t
// nas_cipher_alg:4;
//// uint32_t nas_dl_count[3]; // todo: or directly uint32_t?
//// uint8_t nas_ul_count[3]; // todo: or directly uint32_t?
// count_t nas_dl_count;
// count_t nas_ul_count;
// uint8_t k_asme[32];
// mm_ue_eps_authentication_quadruplet_t* auth_quadruplet[5];
// mm_ue_eps_authentication_quintuplet_t* auth_quintuplet[5];
// // todo : drx_t* drx;
// uint8_t nh[32];
// uint8_t ncc:3;
// uint32_t ul_subscribed_ue_ambr;
// uint32_t dl_subscribed_ue_ambr;
// uint32_t ul_used_ue_ambr;
// uint32_t dl_used_ue_ambr;
// uint8_t ue_nc_length;
// ue_network_capability_t ue_nc;
// uint8_t ms_nc_length;
// ms_network_capability_t ms_nc;
// uint8_t mei_length;
// Mei_t mei;
// uint8_t vdp_lenth;
// uint8_t vdp; // todo: ??
// uint8_t access_restriction_flags;
//} mm_context_eps_t;
//-------------------------------------------------
// 8.44 UE Time Zone
typedef
struct
ue_time_zone_s
{
uint8_t
time_zone
;
uint8_t
spare1
:
6
;
uint8_t
daylight_saving_time
:
2
;
}
ue_time_zone_t
;
//-------------------------------------------------
// 8.49 Fully Qualified Cause (F-Cause)
// typedef struct fully_qualified_cause_s {
// uint8_t spare1 :4;
// uint8_t cause_type :4;
// char* f-cause_field;
//} fully_qualified_cause_t;
//-------------------------------------------------
// 8.50 PLMN ID
typedef
struct
plmn_id_s
{
...
...
@@ -1166,163 +354,6 @@ typedef struct plmn_id_s {
}
u
;
}
plmn_id_t
;
//-------------------------------------
// 8.51 Target Identification
enum
target_type_e
{
TARGET_TYPE_E_RNC_ID
=
0
,
TARGET_TYPE_E_MACRO_ENODEB_ID
=
1
,
TARGET_TYPE_E_CELL_IDENTIFIER
=
2
,
TARGET_TYPE_E_HOME_ENODEB_ID
=
3
,
TARGET_TYPE_E_EXTENDED_MACRO_ENODEB_ID
=
4
,
TARGET_TYPE_E_GNODEB_ID
=
5
,
TARGET_TYPE_E_MACRO_NG_ENODEB_ID
=
6
,
TARGET_TYPE_E_EXTENDED_NG_ENODEB_ID
=
7
,
};
typedef
struct
target_id_for_type_rnc_id_s
{
struct
target_id_for_type_rnc_id_hdr_s
{
uint8_t
mcc_digit_2
:
4
;
uint8_t
mcc_digit_1
:
4
;
uint8_t
mnc_digit_3
:
4
;
uint8_t
mcc_digit_3
:
4
;
uint8_t
mnc_digit_2_
:
4
;
uint8_t
mnc_digit_1
:
4
;
uint16_t
lac
;
uint8_t
rac
;
uint16_t
rnc_id
;
}
target_id_for_type_rnc_id_hdr
;
char
*
extended_rnc_id
;
}
target_id_for_type_rnc_id_t
;
typedef
struct
target_id_for_type_macro_enodeb_s
{
uint8_t
mcc_digit_2
:
4
;
uint8_t
mcc_digit_1
:
4
;
uint8_t
mnc_digit_3
:
4
;
uint8_t
mcc_digit_3
:
4
;
uint8_t
mnc_digit_2_
:
4
;
uint8_t
mnc_digit_1
:
4
;
uint32_t
spare1
:
4
;
uint32_t
macro_enodeb_id
:
20
;
uint16_t
tracking_area_code
;
}
target_id_for_type_macro_enodeb_t
;
typedef
struct
target_id_for_type_cell_identifier_s
{
uint8_t
cell_identifier
[
8
];
}
target_id_for_type_cell_identifier_t
;
typedef
struct
target_id_for_type_home_enodeb_t
{
uint8_t
mcc_digit_2
:
4
;
uint8_t
mcc_digit_1
:
4
;
uint8_t
mnc_digit_3
:
4
;
uint8_t
mcc_digit_3
:
4
;
uint8_t
mnc_digit_2
:
4
;
uint8_t
mnc_digit_1
:
4
;
uint32_t
spare1
:
4
;
uint32_t
home_enodeb_id
:
28
;
uint16_t
tracking_area_code
;
}
target_id_for_type_home_enodeb_t
;
typedef
struct
target_id_for_type_extended_macro_enodeb_s
{
uint8_t
mcc_digit_2
:
4
;
uint8_t
mcc_digit_1
:
4
;
uint8_t
mnc_digit_3
:
4
;
uint8_t
mcc_digit_3
:
4
;
uint8_t
mnc_digit_2_
:
4
;
uint8_t
mnc_digit_1
:
4
;
uint32_t
smenb_
:
1
;
uint32_t
spare1
:
2
;
uint32_t
extended_macro_enodeb_id
:
21
;
uint16_t
tracking_area_code
;
}
target_id_for_type_extended_macro_enodeb_t
;
typedef
struct
target_id_for_type_gnode_id_t
{
uint8_t
mcc_digit_2
:
4
;
uint8_t
mcc_digit_1
:
4
;
uint8_t
mnc_digit_3
:
4
;
uint8_t
mcc_digit_3
:
4
;
uint8_t
mnc_digit_2_
:
4
;
uint8_t
mnc_digit_1
:
4
;
uint8_t
spare
:
2
;
uint8_t
gnodeb_id_length
:
6
;
uint32_t
gnodeb_id
;
uint8_t
five_gs_tracking_area_code
[
3
];
}
target_id_for_type_gnode_id
;
typedef
struct
target_id_for_type_macro_ng_enodeb_s
{
uint8_t
mcc_digit_2
:
4
;
uint8_t
mcc_digit_1
:
4
;
uint8_t
mnc_digit_3
:
4
;
uint8_t
mcc_digit_3
:
4
;
uint8_t
mnc_digit_2_
:
4
;
uint8_t
mnc_digit_1
:
4
;
uint8_t
spare1
:
4
;
uint8_t
macro_enodeb_id
:
4
;
uint16_t
macro_ng_enodeb_id
;
uint32_t
five_gs_tracking_area_code
;
}
target_id_for_type_macro_ng_enodeb_t
;
typedef
struct
target_id_for_type_extended_macro_ng_enodeb_s
{
uint8_t
mcc_digit_2
:
4
;
uint8_t
mcc_digit_1
:
4
;
uint8_t
mnc_digit_3
:
4
;
uint8_t
mcc_digit_3
:
4
;
uint8_t
mnc_digit_2_
:
4
;
uint8_t
mnc_digit_1
:
4
;
uint8_t
smenb_
:
1
;
uint8_t
spare
:
2
;
uint8_t
extended_macro_enodeb_id
:
5
;
uint16_t
extended_macro_ng_enodeb_id
;
uint8_t
five_gs_tracking_area_code
[
3
];
}
target_id_for_type_extended_macro_ng_enodeb_t
;
typedef
struct
target_identification_s
{
uint8_t
target_type
;
union
{
target_id_for_type_rnc_id_t
rnc_id
;
target_id_for_type_macro_enodeb_t
macro_enodeb_id
;
target_id_for_type_cell_identifier_t
cell_identifier
;
target_id_for_type_home_enodeb_t
home_enodeb_id
;
target_id_for_type_extended_macro_enodeb_t
extended_macro_enodeb_id
;
target_id_for_type_gnode_id_t
gnodeb_id
;
target_id_for_type_macro_ng_enodeb_t
macro_ng_enodeb_id
;
target_id_for_type_extended_macro_ng_enodeb_t
extended_ng_enodeb_id
;
}
target_id
;
}
target_identification_t
;
//-------------------------------------
// 8.53 Packet Flow ID
typedef
struct
packet_flow_id_s
{
uint8_t
spare1
:
4
;
uint8_t
ebi
:
4
;
char
*
packet_flow_id
;
}
packet_flow_id_t
;
//-------------------------------------
// 8.56 Port Number
typedef
struct
port_number_s
{
uint16_t
port_number
;
}
port_number_t
;
//-------------------------------------
// 8.57 APN Restriction
typedef
struct
access_point_name_restriction_s
{
uint8_t
restriction_type_value
;
}
access_point_name_restriction_t
;
typedef
access_point_name_restriction_t
apn_restriction_t
;
//-------------------------------------
// 8.58 Selection Mode
enum
selection_mode_e
{
SELECTION_MODE_E_MS_OR_NETWORK_PROVIDED_APN_SUBSCRIPTION_VERIFIED
=
0
,
SELECTION_MODE_E_MS_PROVIDED_APN_SUBSCRIPTION_NOT_VERIFIED
=
1
,
SELECTION_MODE_E_NETWORK_PROVIDED_APN_SUBSCRIPTION_NOT_VERIFIED
=
2
,
SELECTION_MODE_E_FOR_FUTURE_USE
=
3
,
};
typedef
struct
selection_mode_s
{
uint8_t
spare1
:
6
;
uint8_t
selec_mode
:
2
;
}
selection_mode_t
;
//-------------------------------------
// 8.62 Fully qualified PDN Connection Set Identifier (FQ-CSID)
...
...
@@ -1381,491 +412,10 @@ typedef struct transaction_identifier_s {
uint8_t
transaction_identifier
;
}
transaction_identifier_t
;
//-------------------------------------
// 8.75 User CSG Information (UCI)
#define ACCESS_MODE_E_CLOSED_MODE (0)
#define ACCESS_MODE_E_HYBRID_MODE (1)
#define ACCESS_MODE_E_RESERVED2 (2)
#define ACCESS_MODE_E_RESERVED3 (3)
typedef
struct
user_csg_information_s
{
uint8_t
mcc_digit_2
:
4
;
uint8_t
mcc_digit_1
:
4
;
uint8_t
mnc_digit_3
:
4
;
uint8_t
mcc_digit_3
:
4
;
uint8_t
mnc_digit_2
:
4
;
uint8_t
mnc_digit_1
:
4
;
uint32_t
spare1
:
5
;
uint32_t
csg_id
:
27
;
uint8_t
access_mode
:
2
;
uint8_t
spare2
:
4
;
uint8_t
lcsg
:
1
;
uint8_t
cmi
:
1
;
}
user_csg_information_t
;
typedef
user_csg_information_t
uci_t
;
//-------------------------------------
// 8.76 CSG Information Reporting Action
typedef
struct
csg_reporting_action_s
{
uint8_t
spare1
:
5
;
uint8_t
uciuhc
:
1
;
uint8_t
ucishc
:
1
;
uint8_t
ucicsg
:
1
;
}
csg_reporting_action_t
;
//-------------------------------------
// 8.77 RFSP Index
typedef
struct
rfsp_index_s
{
uint8_t
rfsp_index
;
}
rfsp_index_t
;
//-------------------------------------
// 8.78 CSG ID
typedef
struct
csg_id_s
{
uint32_t
spare1
:
5
;
uint32_t
csg_id
:
27
;
}
csg_id_t
;
//-------------------------------------
// 8.79 CSG Membership Indication (CMI)
#define CSG_MEMBERSHIP_INDICATION_E_NON_CSG_MEMBERSHIP (0)
#define CSG_MEMBERSHIP_INDICATION_E_CSG_MEMBERSHIP (1)
typedef
struct
csg_membership_indication_s
{
uint8_t
spare1
:
7
;
uint8_t
cmi
:
1
;
}
csg_membership_indication_t
;
//-------------------------------------
// 8.80 Service indicator
#define SERVICE_INDICATOR_E_CS_CALL (1)
#define SERVICE_INDICATOR_E_SMS (2)
typedef
struct
service_indicator_s
{
uint8_t
service_indicator
;
}
service_indicator_t
;
//-------------------------------------
// 8.81 Detach Type
#define DETACH_TYPE_E_PS (1)
#define DETACH_TYPE_E_COMBINED_PS_CS (2)
typedef
struct
detach_type_s
{
uint8_t
detach_type
;
}
detach_type_t
;
//-------------------------------------
// 8.82 Local Distinguished Name (LDN)
typedef
struct
local_distinguished_name_s
{
std
::
string
ldn
;
}
local_distinguished_name_t
;
//-------------------------------------
// 8.83 Node Features
enum
support_features_e
{
SUPPORT_FEATURES_E_PRN
=
1
,
SUPPORT_FEATURES_E_MABR
=
2
,
SUPPORT_FEATURES_E_NTSR
=
4
,
SUPPORT_FEATURES_E_CIOT
=
8
,
SUPPORT_FEATURES_E_S1UN
=
16
,
};
typedef
struct
node_features_s
{
uint8_t
prn
:
1
;
uint8_t
mabr
:
1
;
uint8_t
ntsr
:
1
;
uint8_t
ciot
:
1
;
uint8_t
s1un
:
1
;
uint8_t
spare
:
3
;
}
node_features_t
;
//-------------------------------------
// 8.85 Throttling
enum
throttling_unit_e
{
THROTTLING_UNIT_E_SECONDS_2
=
0
,
THROTTLING_UNIT_E_MINUTES_1
=
1
,
THROTTLING_UNIT_E_MINUTES_10
=
2
,
THROTTLING_UNIT_E_HOURS_1
=
3
,
THROTTLING_UNIT_E_HOURS_10
=
4
,
THROTTLING_UNIT_E_DEACTIVATED
=
7
,
};
typedef
struct
throttling_s
{
uint8_t
throttling_delay_unit
:
3
;
uint8_t
throttling_delay_value
:
5
;
uint8_t
throttling_factor
;
}
throttling_t
;
//-------------------------------------
// 8.86 Allocation/Retention Priority (ARP)
typedef
struct
allocation_retention_priority_s
{
uint8_t
spare1
:
1
;
uint8_t
pci
:
1
;
uint8_t
pl
:
4
;
uint8_t
spare2
:
1
;
uint8_t
pvi
:
1
;
}
allocation_retention_priority_t
;
typedef
allocation_retention_priority_t
arp_t
;
//-------------------------------------
// 8.87 EPC Timer
enum
timer_unit_e
{
TIMER_UNIT_E_SECONDS_2
=
0
,
TIMER_UNIT_E_MINUTES_1
=
1
,
TIMER_UNIT_E_MINUTES_10
=
2
,
TIMER_UNIT_E_HOURS_1
=
3
,
TIMER_UNIT_E_HOURS_10
=
4
,
TIMER_UNIT_E_DEACTIVATED
=
7
,
};
typedef
struct
epc_timer_s
{
uint8_t
timer_unit
:
3
;
uint8_t
timer_value
:
5
;
}
epc_timer_t
;
//-------------------------------------
// 8.88 Signalling Priority Indication
typedef
struct
signalling_priority_indication_s
{
uint8_t
spare1
:
7
;
uint8_t
lapi
:
1
;
}
signalling_priority_indication_t
;
//-------------------------------------
// 8.90 Additional MM context for SRVCC
typedef
struct
additional_mm_context_for_srvcc_s
{
uint8_t
length_of_the_mobile_station_classmark_2
;
std
::
string
mobile_station_classmark_2
;
uint8_t
length_of_the_mobile_station_classmark_3
;
std
::
string
mobile_station_classmark_3
;
uint8_t
length_of_the_supported_codec_list
;
std
::
string
supported_codec_list
;
}
additional_mm_context_for_srvcc_t
;
//-------------------------------------
// 8.91 Additional flags for SRVCC
typedef
struct
additional_flags_for_srvcc_s
{
uint8_t
spare1
:
6
;
uint8_t
vf
:
1
;
uint8_t
ics
:
1
;
}
additional_flags_for_srvcc_t
;
//-------------------------------------
// 8.94 Additional Protocol Configuration Options (APCO)
typedef
struct
additional_protocol_configuration_options_s
{
std
::
string
additional_protocol_configuration_options
;
}
additional_protocol_configuration_options_t
;
//-------------------------------------
// 8.96 H(e)NB Information Reporting
typedef
struct
h_e_nb_information_reporting_s
{
uint8_t
spare1
:
7
;
uint8_t
fti
:
1
;
}
h_e_nb_information_reporting_t
;
//-------------------------------------
// 8.97 IPv4 Configuration Parameters (IP4CP)
typedef
struct
ipv4_configuration_parameters_s
{
uint8_t
subnet_prefix_length
;
uint32_t
ipv4_default_router_address
;
}
ipv4_configuration_parameters_t
;
//-------------------------------------
// 8.98 Change to Report Flags
typedef
struct
change_to_report_flags_s
{
uint8_t
spare1
:
6
;
uint8_t
tzcr
:
1
;
uint8_t
sncr
:
1
;
}
change_to_report_flags_t
;
//-------------------------------------
// 8.99 Action Indication
enum
indication_e
{
INDICATION_E_NO_ACTION
=
0
,
INDICATION_E_DEACTIVATION
=
1
,
INDICATION_E_PAGING
=
2
,
INDICATION_E_PAGING_STOP
=
3
,
};
typedef
struct
action_indication_ie_t
{
uint8_t
spare1
:
5
;
uint8_t
indication
:
3
;
}
action_indication_ie
;
//-------------------------------------
// 8.100 TWAN Identifier
#define RELAY_IDENTITY_TYPE_E_IPV4_OR_IPV6_ADDRESS (0)
#define RELAY_IDENTITY_TYPE_E_FQDN (1)
typedef
struct
twan_identifier_ie_t
{
uint8_t
spare1
:
3
;
uint8_t
laii
:
1
;
uint8_t
opnai
:
1
;
uint8_t
plmni
:
1
;
uint8_t
civai
:
1
;
uint8_t
bssidi
:
2
;
uint8_t
ssid_length
;
std
::
string
ssid
;
uint8_t
bssid
[
7
];
uint8_t
civic_address_length
;
std
::
string
civic_address_information
;
uint8_t
twan_plmn_id_
[
3
];
uint8_t
twan_operator_name_length
;
std
::
string
twan_operator_name
;
uint8_t
relay_identity_type
;
uint8_t
relay_identity_length
;
std
::
string
relay_identity
;
uint8_t
circuit_id_length
;
std
::
string
circuit_id
;
}
twan_identifier_ie
;
//-------------------------------------
// 8.101 ULI Timestamp
typedef
struct
uli_timestamp_s
{
uint32_t
uli_timestamp_value
;
}
uli_timestamp_t
;
//-------------------------------------
// 8.103 RAN/NAS Cause
enum
protocol_type_e
{
PROTOCOL_TYPE_E_S1AP
=
0
,
PROTOCOL_TYPE_E_EMM
=
1
,
PROTOCOL_TYPE_E_ESM
=
2
,
PROTOCOL_TYPE_E_DIAMETER
=
3
,
PROTOCOL_TYPE_E_IKEV2
=
4
,
};
enum
ran_nas_cause_type_e
{
RAN_NAS_CAUSE_TYPE_E_RADIO_NETWORK_LAYER
=
0
,
RAN_NAS_CAUSE_TYPE_E_TRANSPORT_LAYER
=
1
,
RAN_NAS_CAUSE_TYPE_E_NAS
=
2
,
RAN_NAS_CAUSE_TYPE_E_PROTOCOL
=
3
,
RAN_NAS_CAUSE_TYPE_E_MISCELLANEOUS
=
4
,
};
typedef
struct
ran_nas_cause_s
{
uint8_t
protocol_type
:
4
;
uint8_t
cause_type
:
4
;
union
{
uint16_t
s1ap
;
// TODO
uint8_t
emm
;
uint8_t
esm
;
uint16_t
diameter
;
uint16_t
ikev2
;
}
cause_value
;
}
ran_nas_cause_t
;
//-------------------------------------
// 8.104 CN Operator Selection Entity
#define SELECTION_ENTITY_E_UE_SELECTED (0)
#define SELECTION_ENTITY_E_NETWORK_SELECTED (1)
typedef
struct
cn_operator_selection_entity_s
{
uint8_t
spare1
:
6
;
uint8_t
selection_entity
:
2
;
}
cn_operator_selection_entity_t
;
//-------------------------------------
// 8.105 Trusted WLAN Mode Indication
typedef
struct
trusted_wlan_mode_indication_s
{
uint8_t
spare1
:
6
;
uint8_t
mcm
:
2
;
uint8_t
scm
:
1
;
}
trusted_wlan_mode_indication_t
;
//-------------------------------------
// 8.108 Presence Reporting Area Action
#define PRA_ACTION_E_START_REPORTING_CHANGES_OF_UE_PRESENCE_IN_PRA (1)
#define PRA_ACTION_E_STOP_REPORTING_CHANGES_OF_UE_PRESENCE_IN_PRA (2)
#define PRA_ACTION_E_MODIFY_ELEMENTS_COMPOSING_PRA (3)
typedef
struct
presence_reporting_area_action_s
{
struct
presence_reporting_area_action_hdr_s
{
uint8_t
spare1
:
4
;
uint8_t
inapra
:
1
;
uint8_t
action
:
3
;
uint8_t
presence_reporting_area_identifier
[
3
];
uint8_t
number_of_tai
:
4
;
uint8_t
number_of_rai
:
4
;
uint8_t
spare2
:
2
;
uint8_t
number_of_macro_enodeb
:
6
;
uint8_t
spare3
:
2
;
uint8_t
number_of_home_enodeb
:
6
;
uint8_t
spare4
:
2
;
uint8_t
number_of_ecgi
:
6
;
uint8_t
spare5
:
2
;
uint8_t
number_of_sai
:
6
;
uint8_t
spare6
:
2
;
uint8_t
number_of_cgi
:
6
;
}
presence_reporting_area_action_hdr
;
char
**
tais
;
char
**
macro_enb_ids
;
char
**
home_enb_ids
;
char
**
ecgis
;
char
**
rais
;
char
**
sais
;
char
**
cgis
;
uint8_t
spare7
:
2
;
uint8_t
number_of_extended_macro_enodeb
:
6
;
char
**
extended_macro_enb_ids
;
}
presence_reporting_area_action_t
;
//-------------------------------------
// 8.109 Presence Reporting Area Information
typedef
struct
presence_reporting_area_information_s
{
uint8_t
pra_identifier
[
3
];
uint8_t
spare1
:
4
;
uint8_t
inapra
:
2
;
uint8_t
apra
:
1
;
uint8_t
opra
:
1
;
uint8_t
ipra
:
1
;
}
presence_reporting_area_information_t
;
//-------------------------------------
// 8.110 TWAN Identifier Timestamp
typedef
struct
twan_identifier_timestamp_s
{
uint32_t
twan_identifier_timestamp_value
;
}
twan_identifier_timestamp_t
;
//-------------------------------------
// 8.113 Metric
typedef
struct
metric_ie_s
{
uint8_t
metric
;
}
metric_t
;
//-------------------------------------
// 8.114 Sequence Number
typedef
struct
sequence_number_s
{
uint32_t
sequence_number
;
}
sequence_number_t
;
//-------------------------------------
// 8.115 APN and Relative Capacity
typedef
struct
apn_and_relative_capacity_s
{
uint8_t
relative_capacity
;
uint8_t
apn_length
;
std
::
string
access_point_name
;
}
apn_and_relative_capacity_t
;
//-------------------------------------
// 8.116 WLAN Offloadability Indication
typedef
struct
wlan_offloadability_indication_s
{
uint8_t
spare1
:
6
;
uint8_t
eutran_indication
:
1
;
uint8_t
utran_indication_
:
1
;
}
wlan_offloadability_indication_t
;
//-------------------------------------
// 8.117 Paging and Service Information
typedef
struct
paging_and_service_information_s
{
uint8_t
spare1
:
4
;
uint8_t
epc_bearer_id
:
4
;
uint8_t
spare2
:
7
;
uint8_t
ppi
:
1
;
uint8_t
spare3
:
2
;
uint8_t
paging_policy_indication_value
:
6
;
}
paging_and_service_information_t
;
//-------------------------------------
// 8.118 Integer Number
typedef
struct
integer_number_s
{
union
{
uint8_t
i8
;
uint16_t
i16
;
uint32_t
i32
;
}
u
;
uint8_t
length
;
}
integer_number_t
;
//-------------------------------------
// 8.119 Millisecond Time Stamp
typedef
struct
millisecond_time_stamp_s
{
uint8_t
millisecond_time_stamp_value
[
6
];
}
millisecond_time_stamp_t
;
//-------------------------------------
// 8.123 Remote User ID
typedef
struct
remote_user_id_s
{
uint8_t
spare1
:
6
;
uint8_t
imeif
:
1
;
uint8_t
msisdnf
:
1
;
uint8_t
length_of_imsi
;
std
::
string
imsi
;
uint8_t
length_of_msisdn
;
std
::
string
msisdn
;
uint8_t
length_of_imei
;
std
::
string
imei
;
}
remote_user_id_t
;
//-------------------------------------
// 8.124 Remote UE IP Information
typedef
struct
remote_ue_ip_information_ie_t
{
std
::
string
remote_ue_ip_information
;
}
remote_ue_ip_information_ie
;
//-------------------------------------
// 8.125 CIoT Optimizations Support Indication
typedef
struct
ciot_optimizations_support_indication_s
{
uint8_t
spare1
:
4
;
uint8_t
ihcsi
:
1
;
uint8_t
awopdn
:
1
;
uint8_t
scnipdn
:
1
;
uint8_t
sgnipdn
:
1
;
}
ciot_optimizations_support_indication_t
;
//-------------------------------------
// 8.128 Extended Protocol Configuration Options (ePCO)
typedef
struct
extended_protocol_configuration_options_s
{
std
::
string
extended_protocol_configuration_options
;
}
extended_protocol_configuration_options_t
;
//-------------------------------------
// 8.129 Serving PLMN Rate Control
typedef
struct
serving_plmn_rate_control_s
{
uint32_t
uplink_rate_limit
;
uint32_t
downlink_rate_limit
;
}
serving_plmn_rate_control_t
;
//-------------------------------------
// 8.130 Counter
typedef
struct
counter_s
{
uint32_t
timestamp_value
;
uint8_t
counter_value
;
}
counter_t
;
//-------------------------------------
// 8.133 UP Function Selection Indication Flags
typedef
struct
up_function_selection_indication_flags_s
{
uint8_t
spare1
:
7
;
uint8_t
dcnr
:
1
;
}
up_function_selection_indication_flags_t
;
//-------------------------------------
// 8.134 Maximum Packet Loss Rate
typedef
struct
maximum_packet_loss_rate_s
{
uint8_t
spare1
:
6
;
uint8_t
dl
:
1
;
uint8_t
ul
:
1
;
uint16_t
maximum_packet_loss_rate_ul
;
uint16_t
maximum_packet_loss_rate_dl
;
}
maximum_packet_loss_rate_t
;
//-------------------------------------
// 8.135 APN Rate Control Status
// 8.136 Extended Trace Information
namespace
std
{
template
<
>
class
hash
<
fteid_t
>
{
public:
size_t
operator
()(
const
fteid_t
&
k
)
const
{
using
std
::
hash
;
using
std
::
size_t
;
std
::
size_t
h1
=
std
::
hash
<
uint32_t
>
()(
k
.
interface_type
);
std
::
size_t
h2
=
std
::
hash
<
uint32_t
>
()(
k
.
teid_gre_key
)
^
h1
;
if
(
k
.
v4
)
{
h2
^=
std
::
hash
<
uint32_t
>
()(
k
.
ipv4_address
.
s_addr
);
}
if
(
k
.
v6
)
{
h2
^=
std
::
hash
<
uint32_t
>
()(
k
.
ipv6_address
.
s6_addr32
[
0
]);
h2
^=
std
::
hash
<
uint32_t
>
()(
k
.
ipv6_address
.
s6_addr32
[
1
]);
h2
^=
std
::
hash
<
uint32_t
>
()(
k
.
ipv6_address
.
s6_addr32
[
2
]);
h2
^=
std
::
hash
<
uint32_t
>
()(
k
.
ipv6_address
.
s6_addr32
[
3
]);
}
return
h2
;
}
};
}
// namespace std
#endif
/* FILE_3GPP_29_274_SEEN */
src/common/utils/3gpp_conversions.hpp
View file @
593cf973
...
...
@@ -28,7 +28,7 @@
#ifndef FILE_3GPP_CONVERSIONS_HPP_SEEN
#define FILE_3GPP_CONVERSIONS_HPP_SEEN
#include "3gpp_29.274.h"
#include "3gpp_29.244.h"
#include "3gpp_24.501.h"
#include "endpoint.hpp"
...
...
src/pfcp/pfcp.cpp
View file @
593cf973
...
...
@@ -873,7 +873,7 @@ void pfcp_l4_stack::send_response(
//------------------------------------------------------------------------------
void
pfcp_l4_stack
::
notify_ul_error
(
const
pfcp_procedure
&
p
,
const
::
cause_value_e
cause
)
{
const
pfcp_procedure
&
p
,
const
cause_value_e
cause
)
{
Logger
::
pfcp
().
trace
(
"notify_ul_error proc %"
PRId64
" cause %d"
,
p
.
trxn_id
,
cause
);
}
...
...
@@ -908,7 +908,8 @@ void pfcp_l4_stack::time_out_event(
}
else
{
// abort procedure
notify_ul_error
(
it_proc
->
second
,
::
cause_value_e
::
REMOTE_PEER_NOT_RESPONDING
);
it_proc
->
second
,
cause_value_e
::
CAUSE_VALUE_PFCP_ENTITY_IN_CONGESTION
);
}
}
}
else
{
...
...
src/pfcp/pfcp.hpp
View file @
593cf973
...
...
@@ -28,7 +28,6 @@
#ifndef FILE_PFCP_HPP_SEEN
#define FILE_PFCP_HPP_SEEN
#include "3gpp_29.274.h"
#include "3gpp_29.244.hpp"
#include "itti.hpp"
#include "udp.hpp"
...
...
@@ -120,7 +119,7 @@ class pfcp_l4_stack : public udp_application {
void
stop_msg_retry_timer
(
pfcp_procedure
&
p
);
void
stop_msg_retry_timer
(
timer_id_t
&
t
);
void
stop_proc_cleanup_timer
(
pfcp_procedure
&
p
);
void
notify_ul_error
(
const
pfcp_procedure
&
p
,
const
::
cause_value_e
cause
);
void
notify_ul_error
(
const
pfcp_procedure
&
p
,
const
cause_value_e
cause
);
public:
static
const
uint8_t
version
=
2
;
...
...
src/smf_app/smf_app.cpp
View file @
593cf973
...
...
@@ -1294,9 +1294,22 @@ bool smf_app::handle_nf_status_notification(
}
else
{
return
false
;
}
}
else
{
}
if
(
event_type
.
compare
(
"NF_DEREGISTERED"
)
==
0
)
{
Logger
::
smf_app
().
debug
(
"This event (%s) has not been supported yet!"
,
event_type
);
// TODO: Remove UPF from the list UPFs if received DE-REGISTERED Event
/* std::string nf_instance_uri = {};
notification_msg.get_nf_instance_uri(nf_instance_uri);
std::vector<std::string> split_result;
boost::split(
split_result, nf_instance_uri, boost::is_any_of("/"));
if (split_result.size() > 0) {
std::string instance_id = split_result[split_result.size() -1];
pfcp_associations::get_instance().remove_association(instance_id);
}
*/
}
return
true
;
...
...
src/smf_app/smf_app.hpp
View file @
593cf973
...
...
@@ -39,7 +39,6 @@
#include <string>
#include <thread>
#include "3gpp_29.274.h"
#include "3gpp_29.502.h"
#include "itti_msg_n11.hpp"
#include "itti_msg_n4.hpp"
...
...
src/smf_app/smf_config.hpp
View file @
593cf973
...
...
@@ -39,7 +39,6 @@
#include "thread_sched.hpp"
#include "3gpp_29.244.h"
#include "3gpp_29.274.h"
#include "pfcp.hpp"
#include "smf.h"
...
...
src/smf_app/smf_context.hpp
View file @
593cf973
...
...
@@ -38,7 +38,6 @@
#include "3gpp_24.008.h"
#include "3gpp_29.244.h"
#include "3gpp_29.274.h"
#include "3gpp_29.502.h"
#include "3gpp_29.503.h"
#include "common_root_types.h"
...
...
src/smf_app/smf_msg.hpp
View file @
593cf973
...
...
@@ -34,7 +34,6 @@
#include "3gpp_24.007.h"
#include "3gpp_24.501.h"
#include "3gpp_29.244.h"
#include "3gpp_29.274.h"
#include "3gpp_29.508.h"
#include "3gpp_29.571.h"
#include "NgRanTargetId.h"
...
...
src/smf_app/smf_pfcp_association.cpp
View file @
593cf973
...
...
@@ -385,3 +385,10 @@ bool pfcp_associations::add_peer_candidate_node(
pending_associations
.
push_back
(
s
);
return
true
;
}
//------------------------------------------------------------------------------
bool
pfcp_associations
::
remove_association
(
const
std
::
string
&
node_instance_id
)
{
// TODO
return
true
;
}
src/smf_app/smf_pfcp_association.hpp
View file @
593cf973
...
...
@@ -217,6 +217,7 @@ class pfcp_associations {
bool
add_peer_candidate_node
(
const
pfcp
::
node_id_t
&
node_id
);
bool
add_peer_candidate_node
(
const
pfcp
::
node_id_t
&
node_id
,
const
upf_profile
&
profile
);
bool
remove_association
(
const
std
::
string
&
node_instance_id
);
};
}
// namespace smf
...
...
src/smf_app/smf_procedure.cpp
View file @
593cf973
...
...
@@ -31,7 +31,6 @@
#include <algorithm> // std::search
#include "3gpp_29.244.h"
#include "3gpp_29.274.h"
#include "3gpp_29.500.h"
#include "3gpp_29.502.h"
#include "3gpp_conversions.hpp"
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment