1681 lines
62 KiB
C
1681 lines
62 KiB
C
|
/*
|
|||
|
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
|
|||
|
*
|
|||
|
* This file is part of Open5GS.
|
|||
|
*
|
|||
|
* This program 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.
|
|||
|
*
|
|||
|
* This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
|||
|
*/
|
|||
|
|
|||
|
#if !defined(OGS_PFCP_INSIDE) && !defined(OGS_PFCP_COMPILATION)
|
|||
|
#error "This header cannot be included directly."
|
|||
|
#endif
|
|||
|
|
|||
|
#ifndef OGS_PFCP_TYPES_H
|
|||
|
#define OGS_PFCP_TYPES_H
|
|||
|
|
|||
|
#ifdef __cplusplus
|
|||
|
extern "C" {
|
|||
|
#endif
|
|||
|
|
|||
|
#define OGS_PFCP_VERSION 1
|
|||
|
|
|||
|
typedef uint16_t ogs_pfcp_pdr_id_t;
|
|||
|
typedef uint32_t ogs_pfcp_far_id_t;
|
|||
|
typedef uint32_t ogs_pfcp_urr_id_t;
|
|||
|
typedef uint32_t ogs_pfcp_qer_id_t;
|
|||
|
typedef uint8_t ogs_pfcp_bar_id_t;
|
|||
|
|
|||
|
#define OGS_PFCP_CAUSE_REQUEST_ACCEPTED 1
|
|||
|
#define OGS_PFCP_CAUSE_MORE_USAGE_REPORT_TO_SEND 2
|
|||
|
#define OGS_PFCP_CAUSE_REQUEST_REJECTED 64
|
|||
|
#define OGS_PFCP_CAUSE_SESSION_CONTEXT_NOT_FOUND 65
|
|||
|
#define OGS_PFCP_CAUSE_MANDATORY_IE_MISSING 66
|
|||
|
#define OGS_PFCP_CAUSE_CONDITIONAL_IE_MISSING 67
|
|||
|
#define OGS_PFCP_CAUSE_INVALID_LENGTH 68
|
|||
|
#define OGS_PFCP_CAUSE_MANDATORY_IE_INCORRECT 69
|
|||
|
#define OGS_PFCP_CAUSE_INVALID_FORWARDING_POLICY 70
|
|||
|
#define OGS_PFCP_CAUSE_INVALID_F_TEID_ALLOCATION_OPTION 71
|
|||
|
#define OGS_PFCP_CAUSE_NO_ESTABLISHED_PFCP_ASSOCIATION 72
|
|||
|
#define OGS_PFCP_CAUSE_RULE_CREATION_MODIFICATION_FAILURE 73
|
|||
|
#define OGS_PFCP_CAUSE_PFCP_ENTITY_IN_CONGESTION 74
|
|||
|
#define OGS_PFCP_CAUSE_NO_RESOURCES_AVAILABLE 75
|
|||
|
#define OGS_PFCP_CAUSE_SERVICE_NOT_SUPPORTED 76
|
|||
|
#define OGS_PFCP_CAUSE_SYSTEM_FAILURE 77
|
|||
|
#define OGS_PFCP_CAUSE_REDIRECTION_REQUESTED 78
|
|||
|
#define OGS_PFCP_CAUSE_ALL_DYNAMIC_ADDRESS_ARE_OCCUPIED 79
|
|||
|
|
|||
|
const char *ogs_pfcp_cause_get_name(uint8_t cause);
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.11 Precedence
|
|||
|
*
|
|||
|
* The Precedence value shall be encoded as an Unsigned32 binary integer value. The lower precedence values
|
|||
|
* indicate higher precedence of the PDR, and the higher precedence values
|
|||
|
* indicate lower precedence of the PDR when matching a packet.
|
|||
|
*/
|
|||
|
typedef uint32_t ogs_pfcp_precedence_t;
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.2 Source Interface
|
|||
|
* NOTE 1: The "Access" and "Core" values denote an uplink and downlink
|
|||
|
* traffic direction respectively.
|
|||
|
* NOTE 2: For indirect data forwarding, the Source Interface in the PDR and
|
|||
|
* the Destination Interface in the FAR shall both be set to "Access",
|
|||
|
* in the forwarding SGW(s). The Interface value does not infer any
|
|||
|
* traffic direction, in PDRs and FARs set up for indirect data
|
|||
|
* forwarding, i.e. with both the Source and Destination Interfaces set
|
|||
|
* to Access.
|
|||
|
*
|
|||
|
* 8.2.24 Destination Interface
|
|||
|
* NOTE 1: The "Access" and "Core" values denote a downlink and uplink
|
|||
|
* traffic direction respectively.
|
|||
|
* NOTE 2: LI Function may denote an SX3LIF or an LMISF. See clause 5.7.
|
|||
|
* NOTE 3: For indirect data forwarding, the Source Interface in the PDR and
|
|||
|
* the Destination Interface in the FAR shall both be set to "Access",
|
|||
|
* in the forwarding SGW(s). The Interface value does not infer any
|
|||
|
* traffic direction, in PDRs and FARs set up for indirect data
|
|||
|
* forwarding, i.e. with both the Source and Destination Interfaces set
|
|||
|
* to Access.
|
|||
|
* NOTE 4: For a HTTP redirection, the Source Interface in the PDR to match
|
|||
|
* the uplink packets to be redirected and the Destination Interface in
|
|||
|
* the FAR to enable the HTTP redirection shall both be set to "Access".
|
|||
|
*/
|
|||
|
#define OGS_PFCP_INTERFACE_ACCESS 0
|
|||
|
#define OGS_PFCP_INTERFACE_CORE 1
|
|||
|
#define OGS_PFCP_INTERFACE_SGI_N6_LAN 2
|
|||
|
#define OGS_PFCP_INTERFACE_CP_FUNCTION 3
|
|||
|
#define OGS_PFCP_INTERFACE_LI_FUNCTION 4
|
|||
|
#define OGS_PFCP_INTERFACE_UNKNOWN 0xff
|
|||
|
typedef uint8_t ogs_pfcp_interface_t;
|
|||
|
|
|||
|
/* 8.2.25 UP Function Features */
|
|||
|
|
|||
|
typedef struct ogs_pfcp_up_function_features_s {
|
|||
|
union {
|
|||
|
struct {
|
|||
|
/*
|
|||
|
* 5/8 TREU Sxb, Sxc, N4
|
|||
|
* Traffic Redirection Enforcement in the UP function is supported
|
|||
|
* by the UP function.
|
|||
|
* 5/7 HEEU Sxb, Sxc, N4
|
|||
|
* Header Enrichment of Uplink traffic is supported by the UP function.
|
|||
|
* 5/6 PFDM Sxb, Sxc, N4
|
|||
|
* The PFD Management procedure is supported by the UP function.
|
|||
|
* 5/5 FTUP Sxa, Sxb, N4
|
|||
|
* F-TEID allocation / release in the UP function is supported
|
|||
|
* by the UP function.
|
|||
|
* 5/4 TRST Sxb, Sxc, N4
|
|||
|
* Traffic Steering is supported by the UP function.
|
|||
|
* 5/3 DLBD Sxa, N4
|
|||
|
* The buffering parameter 'DL Buffering Duration' is supported
|
|||
|
* by the UP function.
|
|||
|
* 5/2 DDND Sxa, N4
|
|||
|
* The buffering parameter 'Downlink Data Notification Delay' is supported
|
|||
|
* by the UP function.
|
|||
|
* 5/1 BUCP Sxa, N4
|
|||
|
* Downlink Data Buffering in CP function is supported by the UP function.
|
|||
|
*/
|
|||
|
ED8(uint8_t treu:1;,
|
|||
|
uint8_t heeu:1;,
|
|||
|
uint8_t pfdm:1;,
|
|||
|
uint8_t ftup:1;,
|
|||
|
uint8_t trst:1;,
|
|||
|
uint8_t dldb:1;,
|
|||
|
uint8_t ddnd:1;,
|
|||
|
uint8_t bucp:1;)
|
|||
|
};
|
|||
|
uint8_t octet5;
|
|||
|
};
|
|||
|
union {
|
|||
|
struct {
|
|||
|
/*
|
|||
|
* 6/8 EPFAR Sxa, Sxb, Sxc, N4
|
|||
|
* The UP function supports the Enhanced PFCP Association Release feature
|
|||
|
* (see clause 5.18).
|
|||
|
* 6/7 PFDE Sxb, N4
|
|||
|
* The UP function supports a PFD Contents including a property
|
|||
|
* with multiple values.
|
|||
|
* 6/6 FRRT Sxb, N4
|
|||
|
* The UP function supports Framed Routing
|
|||
|
* (see IETF RFC 2865 [37] and IETF RFC 3162 [38]).
|
|||
|
* 6/5 TRACE Sxa, Sxb, Sxc, N4
|
|||
|
* The UP function supports Trace (see clause 5.15).
|
|||
|
* 6/4 QUOAC Sxb, Sxc, N4
|
|||
|
* The UP function supports being provisioned with the Quota Action
|
|||
|
* to apply when reaching quotas.
|
|||
|
* 6/3 UDBC Sxb, Sxc, N4
|
|||
|
* Support of UL/DL Buffering Control
|
|||
|
* 6/2 PDIU Sxa, Sxb, Sxc, N4
|
|||
|
* Support of PDI optimised signalling in UP function (see clause 5.2.1A.2).
|
|||
|
* 6/1 EMPU Sxa, Sxb, N4
|
|||
|
* Sending of End Marker packets supported by the UP function.
|
|||
|
*/
|
|||
|
ED8(uint8_t epfar:1;,
|
|||
|
uint8_t pfde:1;,
|
|||
|
uint8_t frrt:1;,
|
|||
|
uint8_t trace:1;,
|
|||
|
uint8_t quoac:1;,
|
|||
|
uint8_t udbc:1;,
|
|||
|
uint8_t pdiu:1;,
|
|||
|
uint8_t empu:1;)
|
|||
|
};
|
|||
|
uint8_t octet6;
|
|||
|
};
|
|||
|
union {
|
|||
|
struct {
|
|||
|
/*
|
|||
|
* 7/8 GCOM N4
|
|||
|
* UPF support of 5G VN Group Communication.(See clause 5.23)
|
|||
|
* 7/7 BUNDL Sxa, Sxb, Sxc, N4
|
|||
|
* PFCP messages bunding (see clause 6.5) is supported by the UP function.
|
|||
|
* 7/6 MTE N4
|
|||
|
* UPF supports multiple instances of Traffic Endpoint IDs in a PDI.
|
|||
|
* 7/5 MNOP Sxa, Sxb, Sxc, N4
|
|||
|
* The UP function supports measurement of number of packets
|
|||
|
* which is instructed with the flag 'Measurement of Number of Packets'
|
|||
|
* in a URR.See also clause 5.2.2.2.1.
|
|||
|
* 7/4 SSET N4
|
|||
|
* UPF support of PFCP sessions successively controlled
|
|||
|
* by different SMFs of a same SMF Set (see clause 5.22).
|
|||
|
* 7/3 UEIP Sxb, N4
|
|||
|
* The UP function supports allocating UE IP addresses or prefixes
|
|||
|
* (see clause 5.21).
|
|||
|
* 7/2 ADPDP Sxa, Sxb, Sxc, N4
|
|||
|
* The UP function supports the Activation and Deactivation
|
|||
|
* of Pre-defined PDRs (see clause 5.19).
|
|||
|
* 7/1 DPDRA Sxb, Sxc, N4
|
|||
|
* The UP function supports Deferred PDR Activation or Deactivation.
|
|||
|
*/
|
|||
|
ED8(uint8_t gcom:1;,
|
|||
|
uint8_t bundl:1;,
|
|||
|
uint8_t mte:1;,
|
|||
|
uint8_t mnop:1;,
|
|||
|
uint8_t sset:1;,
|
|||
|
uint8_t ueip:1;,
|
|||
|
uint8_t adpdp:1;,
|
|||
|
uint8_t dpdra:1;)
|
|||
|
};
|
|||
|
uint8_t octet7;
|
|||
|
};
|
|||
|
union {
|
|||
|
struct {
|
|||
|
/*
|
|||
|
* 8/8 MPTCP N4
|
|||
|
* UPF support of MPTCP Proxy functionality (see clause 5.20)
|
|||
|
* 8/7 TSCU N4
|
|||
|
* Time Sensitive Communication is supported by the UPF (see clause 5.26).
|
|||
|
* 8/6 IP6PL N4
|
|||
|
* UPF supports:
|
|||
|
* - UE IPv6 address(es) allocation with IPv6 prefix length other than
|
|||
|
* default /64 (including allocating /128 individual IPv6 addresses),
|
|||
|
* as specified in clause 4.6.2.2 of of 3GPP TS 23.316 [57]; and
|
|||
|
* - multiple UE IPv6 addresses allocation using multiple instances
|
|||
|
* of the UE IP Address IE in a same PDI or Traffic Endpoint,
|
|||
|
* or using multiple PDIs or Traffic Endpoints
|
|||
|
* with a different UE IP Address as specified in clause 5.21.1.
|
|||
|
* 8/5 IPTV N4
|
|||
|
* UPF support of IPTV service (see clause 5.25)
|
|||
|
* 8/4 NORP Sxa, Sxb, Sxc, N4
|
|||
|
* UP function support of Number of Reports as specified in clause 5.2.2.2.
|
|||
|
* 8/3 VTIME Sxb,N4
|
|||
|
* UP function support of quota validity time feature.
|
|||
|
* 8/2 RTTL N4
|
|||
|
* UPF supports redundant transmission at transport layer.
|
|||
|
* 8/1 MPAS N4
|
|||
|
* UPF support for multiple PFCP associations to the SMFs in an SMF set
|
|||
|
* (see clause 5.22.3).
|
|||
|
*/
|
|||
|
ED8(uint8_t mptcp:1;,
|
|||
|
uint8_t tscu:1;,
|
|||
|
uint8_t ip6pl:1;,
|
|||
|
uint8_t iptv:1;,
|
|||
|
uint8_t norp:1;,
|
|||
|
uint8_t vtime:1;,
|
|||
|
uint8_t rttl:1;,
|
|||
|
uint8_t mpas:1;)
|
|||
|
};
|
|||
|
uint8_t octet8;
|
|||
|
};
|
|||
|
union {
|
|||
|
struct {
|
|||
|
/*
|
|||
|
* 9/8 RDS Sxb, N4
|
|||
|
* UP function support of Reliable Data Service (see clause 5.29).
|
|||
|
* 9/7 DDDS N4
|
|||
|
* UPF support of reporting the first buffered / discarded downlink data
|
|||
|
* for downlink data delivery status notification.
|
|||
|
* 9/6 ETHAR N4
|
|||
|
* UPF support of Ethernet PDU Session Anchor Relocation (see clause 5.13.6).
|
|||
|
* 9/5 CIOT Sxb, N4
|
|||
|
* UP function support of CIoT feature,
|
|||
|
* e.g.small data packet rate enforcement.(see 5.4.15)
|
|||
|
* 9/4 MT-EDT Sxa
|
|||
|
* SGW-U support of reporting the size of DL Data Packets.
|
|||
|
* (see clause 5.2.4.1).
|
|||
|
* 9/3 GPQM N4
|
|||
|
* UPF support of per GTP-U Path QoS monitoring (see clause 5.24.5).
|
|||
|
* 9/2 QFQM N4
|
|||
|
* UPF support of per QoS flow per UE QoS monitoring (see clause 5.24.4).
|
|||
|
* 9/1 ATSSS-LL N4
|
|||
|
* UPF support of ATSSS-LLL steering functionality (see clause 5.20)
|
|||
|
*/
|
|||
|
ED8(uint8_t rds:1;,
|
|||
|
uint8_t ddds:1;,
|
|||
|
uint8_t ethar:1;,
|
|||
|
uint8_t ciot:1;,
|
|||
|
uint8_t mt_edt:1;,
|
|||
|
uint8_t gpqm:1;,
|
|||
|
uint8_t qfqm:1;,
|
|||
|
uint8_t atsss_ll:1;)
|
|||
|
};
|
|||
|
uint8_t octet9;
|
|||
|
};
|
|||
|
union {
|
|||
|
struct {
|
|||
|
/*
|
|||
|
* 10/8 DNSTS N4
|
|||
|
* UP function support DNS Traffic Steering based on
|
|||
|
* FQDN in the DNS Query message (see
|
|||
|
* clause 5.33.4)
|
|||
|
* 10/7 IPREP N4
|
|||
|
* UP function supports IP Address and Port number
|
|||
|
* replacement (see clause 5.33.3).
|
|||
|
* 10/6 RESPS Sxb, N4
|
|||
|
* UP function supports Restoration of PFCP Sessions
|
|||
|
* associated with one or more PGW-C/SMF FQ-
|
|||
|
* CSID(s), Group Id(s) or CP IP address(es) (see
|
|||
|
* clause 5.22.4)
|
|||
|
* 10/5 UPBER N4
|
|||
|
* UP function supports the uplink packets buffering
|
|||
|
* during EAS relocation.
|
|||
|
* 10/4 L2TP Sxb, N4
|
|||
|
* UP function supports the L2TP feature as described
|
|||
|
* in clause 5.31.
|
|||
|
* 10/3 NSPOC Sxa, Sxb, N4
|
|||
|
* UP function supports notifying start of Pause of
|
|||
|
* Charging via user plane.
|
|||
|
* 10/2 QUASF Sxb, Sxc, N4
|
|||
|
* The UP function supports being provisioned in a
|
|||
|
* URR with an Exempted Application ID for Quota
|
|||
|
* Action or an Exempted SDF Filter for Quota Action
|
|||
|
* which is to be used when the quota is exhausted.
|
|||
|
* See also clauses 5.2.2.2.1 and 5.2.2.3.1.
|
|||
|
* 10/1 RTTWP N4
|
|||
|
* UPF support of RTT measurements towards the UE Without PMF.
|
|||
|
*/
|
|||
|
ED8(uint8_t dnsts:1;,
|
|||
|
uint8_t iprep:1;,
|
|||
|
uint8_t resps:1;,
|
|||
|
uint8_t upber:1;,
|
|||
|
uint8_t l2tp:1;,
|
|||
|
uint8_t nspoc:1;,
|
|||
|
uint8_t quasf:1;,
|
|||
|
uint8_t rttwp:1;)
|
|||
|
};
|
|||
|
uint8_t octet10;
|
|||
|
};
|
|||
|
union {
|
|||
|
struct {
|
|||
|
|
|||
|
/*
|
|||
|
* 11/6 UPIDP N4
|
|||
|
* UP function supports User Plane Inactivity Detection
|
|||
|
* and reporting per PDR feature as specified in
|
|||
|
* clause 5.11.3.
|
|||
|
* 11/5 RATP Sxb, N4
|
|||
|
* UP function supports Redirection Address Types set
|
|||
|
* to "Port", "IPv4 address and Port", "IPv6 address
|
|||
|
* and Port", or "IPv4 and IPv6 addresses and Port".
|
|||
|
* 11/4 EPPPI N4
|
|||
|
* UP function supports Enhanced Provisioning of
|
|||
|
* Paging Policy Indicator feature as specified in
|
|||
|
* clause 5.36.2.
|
|||
|
* 11/3 PSUPRM N4, N4mb
|
|||
|
* UP function supports Per Slice UP Resource
|
|||
|
* Management (see clause 5.35).3GPP TS 29.244 version 17.7.1 Release 17
|
|||
|
* 11/2 MBSN4 N4
|
|||
|
* UPF supports sending MBS multicast session data
|
|||
|
* to associated PDU sessions using 5GC individual
|
|||
|
* delivery.
|
|||
|
* 11/1 DRQOS N4
|
|||
|
* UP function supports Direct Reporting of QoS
|
|||
|
* monitoring events to Local NEF or AF (see
|
|||
|
* clause 5.33.5).
|
|||
|
*/
|
|||
|
ED7(uint8_t spare:2;,
|
|||
|
uint8_t upidp:1;,
|
|||
|
uint8_t ratp:1;,
|
|||
|
uint8_t epppi:1;,
|
|||
|
uint8_t psuprm:1;,
|
|||
|
uint8_t mbsn4:1;,
|
|||
|
uint8_t drqos:1;)
|
|||
|
};
|
|||
|
uint8_t octet11;
|
|||
|
};
|
|||
|
} __attribute__ ((packed)) ogs_pfcp_up_function_features_t;
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.26 Apply Action
|
|||
|
*
|
|||
|
* The octet 5 shall be encoded as follows:
|
|||
|
*
|
|||
|
* Bit 1 – DROP (Drop): when set to 1, this indicates a request
|
|||
|
* to drop the packets.
|
|||
|
* Bit 2 – FORW (Forward): when set to 1, this indicates a request
|
|||
|
* to forward the packets.
|
|||
|
* Bit 3 – BUFF (Buffer): when set to 1, this indicates a request
|
|||
|
* to buffer the packets.
|
|||
|
* Bit 4 – NOCP (Notify the CP function): when set to 1,
|
|||
|
* this indicates a request to notify the CP function about the
|
|||
|
* arrival of a first downlink packet being buffered.
|
|||
|
* Bit 5 – DUPL (Duplicate): when set to 1, this indicates a request
|
|||
|
* to duplicate the packets.
|
|||
|
* Bit 6 – IPMA (IP Multicast Accept): when set to "1", this indicates
|
|||
|
* a request to accept UE requests to join an IP multicast group.
|
|||
|
* Bit 7 – IPMD (IP Multicast Deny): when set to "1", this indicates
|
|||
|
* a request to deny UE requests to join an IP multicast group.
|
|||
|
* Bit 8 – DFRT (Duplicate for Redundant Transmission): when set to "1",
|
|||
|
* this indicates a request to duplicate the packets
|
|||
|
* for redundant transmission (see clause 5.24.2).
|
|||
|
*
|
|||
|
* The octet 6 shall be encoded as follows:
|
|||
|
*
|
|||
|
* Bit 1 – EDRT (Eliminate Duplicate Packets for Redundant Transmission):
|
|||
|
* when set to "1", this indicates a request to eliminate duplicate packets
|
|||
|
* used for redundant transmission (see clause 5.24.2).
|
|||
|
* Bit 2 – BDPN (Buffered Downlink Packet Notification): when set to "1",
|
|||
|
* this indicates a request to notify the CP function about the first buffered
|
|||
|
* DL packet for downlink data delivery status notification.
|
|||
|
* Bit 3 – DDPN (Discarded Downlink Packet Notification): when set to "1",
|
|||
|
* this indicates a request to notify the CP function about the first discarded
|
|||
|
* DL packet for downlink data delivery status notification if the DL Buffering
|
|||
|
* Duration or DL Buffering Suggested Packet Count is exceeded or
|
|||
|
* it is discarded directly. See clause 5.2.3.1.
|
|||
|
*
|
|||
|
* Bit 4 - FSSM (Forward packets to lower layer SSM): when set to "1",
|
|||
|
* this indicates a request to the MB-UPF to forward MBS session data
|
|||
|
* towards a low layer SSM address allocated by the MB-UPF
|
|||
|
* using multicast transport.
|
|||
|
* Bit 5 – MBSU (Forward and replicate MBS data using Unicast transport):
|
|||
|
* when set to "1", this indicates a request to forward and replicate
|
|||
|
* MBS session data towards multiple remote GTP-U peers using unicast transport.
|
|||
|
* Bit 6 to 8 – Spare, for future use and seto to "0".
|
|||
|
|
|||
|
*
|
|||
|
* One and only one of the DROP, FORW, BUFF, IPMA and IPMD flags shall be
|
|||
|
* set to "1".
|
|||
|
*
|
|||
|
* The NOCP flag and BDPN flag may only be set if the BUFF flag is set.
|
|||
|
* The DUPL flag may be set with any of the DROP, FORW, BUFF and NOCP flags.
|
|||
|
* The DFRN flag may only be set if the FORW flag is set.
|
|||
|
* The EDRT flag may be set if the FORW flag is set.
|
|||
|
* The DDPN flag may be set with any of the DROP and BUFF flags.
|
|||
|
*
|
|||
|
* Both the MBSU flag and the FSSM flag may be set
|
|||
|
* (to require the MB-UPF to forward MBS session data
|
|||
|
* using both multicast and unicast transports).
|
|||
|
*/
|
|||
|
#define OGS_PFCP_APPLY_ACTION_DROP (1<<8)
|
|||
|
#define OGS_PFCP_APPLY_ACTION_FORW (1<<9)
|
|||
|
#define OGS_PFCP_APPLY_ACTION_BUFF (1<<10)
|
|||
|
#define OGS_PFCP_APPLY_ACTION_NOCP (1<<11)
|
|||
|
#define OGS_PFCP_APPLY_ACTION_DUPL (1<<12)
|
|||
|
#define OGS_PFCP_APPLY_ACTION_IPMA (1<<13)
|
|||
|
#define OGS_PFCP_APPLY_ACTION_IPMD (1<<14)
|
|||
|
#define OGS_PFCP_APPLY_ACTION_DFRT (1<<15)
|
|||
|
#define OGS_PFCP_APPLY_ACTION_EDRT (1<<0)
|
|||
|
#define OGS_PFCP_APPLY_ACTION_BDPN (1<<1)
|
|||
|
#define OGS_PFCP_APPLY_ACTION_DDPN (1<<2)
|
|||
|
#define OGS_PFCP_APPLY_ACTION_FSSM (1<<3)
|
|||
|
#define OGS_PFCP_APPLY_ACTION_MBSU (1<<4)
|
|||
|
typedef uint16_t ogs_pfcp_apply_action_t;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/* 8.2.58 CP Function Features */
|
|||
|
typedef struct ogs_pfcp_cp_function_features_s {
|
|||
|
union {
|
|||
|
struct {
|
|||
|
/*
|
|||
|
* 5/8 UIAUR Sxb, N4
|
|||
|
* CP function supports the UE IP Address Usage Reporting feature,
|
|||
|
* i.e. receiving and handling of UE IP Address Usage Information IE
|
|||
|
* (see clause 5.21.3.2).
|
|||
|
* 5/7 ARDR Sxb, N4
|
|||
|
* CP function supports Additional Usage Reports
|
|||
|
* in the PFCP Session Deletion Response (see clause 5.2.2.3.1).
|
|||
|
* 5/6 MPAS N4
|
|||
|
* SMF support for multiple PFCP associations from an SMF set to a single UPF
|
|||
|
* (see clause 5.22.3).
|
|||
|
* 5/5 BUNDL Sxa, Sxb, Sxc, N4
|
|||
|
* PFCP messages bunding (see clause 6.5) is supported by the CP function.
|
|||
|
* 5/4 SSET N4
|
|||
|
* SMF support of PFCP sessions successively controlled by different SMFs
|
|||
|
* of a same SMF Set (see clause 5.22).
|
|||
|
* 5/3 EPFAR Sxa, Sxb, Sxc, N4
|
|||
|
* The CP function supports the Enhanced PFCP Association Release feature
|
|||
|
* (see clause 5.18).
|
|||
|
* 5/2 OVRL Sxa, Sxb, Sxc, N4
|
|||
|
* Overload Control is supported by the CP function.
|
|||
|
* 5/1 LOAD Sxa, Sxb, Sxc, N4
|
|||
|
* Load Control is supported by the CP function.
|
|||
|
*/
|
|||
|
ED8(uint8_t uiaur:1;,
|
|||
|
uint8_t apdr:1;,
|
|||
|
uint8_t mpas:1;,
|
|||
|
uint8_t bundl:1;,
|
|||
|
uint8_t sset:1;,
|
|||
|
uint8_t epfar:1;,
|
|||
|
uint8_t ovrl:1;,
|
|||
|
uint8_t load:1;)
|
|||
|
};
|
|||
|
uint8_t octet5;
|
|||
|
};
|
|||
|
union {
|
|||
|
struct {
|
|||
|
|
|||
|
/*
|
|||
|
* 6/2 RPGUR Sxa, Sxb, N4, N4mb
|
|||
|
* CP function supports the Peer GTP-U Entity Restart
|
|||
|
* Reporting as specified in clause 20.3.4a of
|
|||
|
* 3GPP TS 23.007 [24] and in clause 5.5 of 3GPP TS 23.527 [40].
|
|||
|
* 6/1 PSUCC Sxb, Sxc, N4, N4mb
|
|||
|
* CP function supports PFCP session establishment
|
|||
|
* or modification with Partial Success, i.e. with UP
|
|||
|
* function reporting rules that cannot be activated.
|
|||
|
* See clause 5.2.9.
|
|||
|
*/
|
|||
|
ED3(uint8_t spare:6;,
|
|||
|
uint8_t rpgur:1;,
|
|||
|
uint8_t psucc:1;)
|
|||
|
};
|
|||
|
uint8_t octet6;
|
|||
|
};
|
|||
|
} __attribute__ ((packed)) ogs_pfcp_cp_function_features_t;
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.64 Outer Header Remaval
|
|||
|
*
|
|||
|
* NOTE 1: The SGW-U/I-UPF shall store GTP-U extension header(s) required
|
|||
|
* to be forwarded for this packet (as required by the comprehension rules
|
|||
|
* of Figure 5.2.1-2 of 3GPP TS 29.281 [3]) that are not requested
|
|||
|
* to be deleted by the GTP-U Extension Header Deletion field.
|
|||
|
* NOTE 2: The SGW-U/I-UPF shall store the GTP-U message type
|
|||
|
* for a GTP-U signalling message which is required to be forwarded,
|
|||
|
* e.g. for an End Marker message.
|
|||
|
* NOTE 3: This value may apply to DL packets received by a PGW-U
|
|||
|
* for non-IP PDN connections with SGi tunnelling based
|
|||
|
* on UDP/IP encapsulation (see clause 4.3.17.8.3.3.2 of 3GPP TS 23.401 [14]).
|
|||
|
* NOTE 4: The CP function shall use this value to instruct UP function
|
|||
|
* to remove the GTP-U/UDP/IP header regardless it is IPv4 or IPv6.
|
|||
|
* NOTE 5: This value may apply to DL packets received by a UPF over N6 for
|
|||
|
* Ethernet PDU sessions over (see clause 5.8.2.11.3 of 3GPP TS 23.501 [28]).
|
|||
|
* NOTE 6: This value may apply e.g. to DL packets received by a UPF
|
|||
|
* (PDU Session Anchor) over N6, when explicit N6 traffic routing information
|
|||
|
* is provided to the SMF (see clause 5.6.7 of 3GPP TS 23.501 [28]).
|
|||
|
*
|
|||
|
* The GTP-U Extension Header Deletion field (octet 6) shall be present
|
|||
|
* if it is required to delete GTP-U extension header(s) from incoming GTP-PDUs.
|
|||
|
* Octet 6 shall be absent if all GTP-U extension headers required
|
|||
|
* to be forwarded shall be stored as indicated in NOTE 1 of Table 8.2.64-1.
|
|||
|
*
|
|||
|
* The GTP-U Extension Header Deletion field, when present, shall be encoded
|
|||
|
* as specified in Table 8.2.64-2. It takes the form of a bitmask where each bit
|
|||
|
* provides instructions on the information to be deleted from the incoming
|
|||
|
* GTP-PDU packet. Spare bits shall be ignored by the receiver.
|
|||
|
*/
|
|||
|
typedef struct ogs_pfcp_outer_header_removal_s {
|
|||
|
#define OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV4 0
|
|||
|
#define OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IPV6 1
|
|||
|
#define OGS_PFCP_OUTER_HEADER_REMOVAL_UDP_IPV4 2
|
|||
|
#define OGS_PFCP_OUTER_HEADER_REMOVAL_UDP_IPV6 3
|
|||
|
#define OGS_PFCP_OUTER_HEADER_REMOVAL_IPV4 4
|
|||
|
#define OGS_PFCP_OUTER_HEADER_REMOVAL_IPV6 5
|
|||
|
#define OGS_PFCP_OUTER_HEADER_REMOVAL_GTPU_UDP_IP 6
|
|||
|
#define OGS_PFCP_OUTER_HEADER_REMOVAL_VLAN_STAG 7
|
|||
|
#define OGS_PFCP_OUTER_HEADER_REMOVAL_SLAN_CTAG 8
|
|||
|
uint8_t description;
|
|||
|
|
|||
|
#define OGS_PFCP_PDU_SESSION_CONTAINER_TO_BE_DELETED 1
|
|||
|
uint8_t gtpu_extheader_deletion;
|
|||
|
} ogs_pfcp_outer_header_removal_t;
|
|||
|
|
|||
|
#define OGS_PFCP_NODE_ID_IPV4 0
|
|||
|
#define OGS_PFCP_NODE_ID_IPV6 1
|
|||
|
#define OGS_PFCP_NODE_ID_FQDN 2
|
|||
|
typedef struct ogs_pfcp_node_id_s {
|
|||
|
ED2(uint8_t spare:4;,
|
|||
|
uint8_t type:4;)
|
|||
|
union {
|
|||
|
uint32_t addr;
|
|||
|
uint8_t addr6[OGS_IPV6_LEN];
|
|||
|
char fqdn[OGS_MAX_FQDN_LEN];
|
|||
|
};
|
|||
|
} __attribute__ ((packed)) ogs_pfcp_node_id_t;
|
|||
|
|
|||
|
typedef struct ogs_pfcp_f_seid_s {
|
|||
|
ED3(uint8_t spare:6;,
|
|||
|
uint8_t ipv4:1;,
|
|||
|
uint8_t ipv6:1;)
|
|||
|
uint64_t seid;
|
|||
|
union {
|
|||
|
uint32_t addr;
|
|||
|
uint8_t addr6[OGS_IPV6_LEN];
|
|||
|
struct {
|
|||
|
uint32_t addr;
|
|||
|
uint8_t addr6[OGS_IPV6_LEN];
|
|||
|
} both;
|
|||
|
};
|
|||
|
} __attribute__ ((packed)) ogs_pfcp_f_seid_t;
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.3 F-TEID
|
|||
|
*
|
|||
|
* The following flags are coded within Octet 5:
|
|||
|
*
|
|||
|
* - Bit 1 – V4: If this bit is set to "1" and the CH bit is not set,
|
|||
|
* then the IPv4 address field shall be present,
|
|||
|
* otherwise the IPv4 address field shall not be present.
|
|||
|
* - Bit 2 – V6: If this bit is set to "1" and the CH bit is not set,
|
|||
|
* then the IPv6 address field shall be present,
|
|||
|
* otherwise the IPv6 address field shall not be present.
|
|||
|
* - Bit 3 – CH (CHOOSE): If this bit is set to "1", then the TEID,
|
|||
|
* IPv4 address and IPv6 address fields shall not be present and
|
|||
|
* the UP function shall assign an F-TEID with an IP4 or an IPv6 address
|
|||
|
* if the V4 or V6 bit is set respectively. This bit shall only be set
|
|||
|
* by the CP function.
|
|||
|
* - Bit 4 – CHID (CHOOSE ID): If this bit is set to "1",
|
|||
|
* then the UP function shall assign the same F-TEID to the PDRs requested
|
|||
|
* to be created in a PFCP Session Establishment Request or
|
|||
|
* PFCP Session Modification Request with the same CHOOSE ID value.
|
|||
|
* This bit may only be set to "1" if the CH bit it set to "1".
|
|||
|
* This bit shall only be set by the CP function.
|
|||
|
* - Bit 5 to 8: Spare, for future use and set to 0.
|
|||
|
*
|
|||
|
* At least one of the V4 and V6 flags shall be set to "1", and
|
|||
|
* both may be set to "1" for both scenarios:
|
|||
|
*
|
|||
|
* - when the CP function is allocating F-TEID, i.e. both IPv4 address field
|
|||
|
* and IPv6 address field may be present;
|
|||
|
* - or when the UP function is requested to allocate the F-TEID,
|
|||
|
* i.e. when CHOOSE bit is set to "1", and the IPv4 address and
|
|||
|
* IPv6 address fields are not present.
|
|||
|
*
|
|||
|
* Octet 6 to 9 (TEID) shall be present and shall contain a GTP-U TEID,
|
|||
|
* if the CH bit in octet 5 is not set. When the TEID is present,
|
|||
|
* if both IPv4 and IPv6 addresses are present in the F-TEID IE,
|
|||
|
* then the TEID value shall be shared by both addresses.
|
|||
|
*
|
|||
|
* Octets "m to (m+3)" and/or "p to (p+15)"(IPv4 address / IPv6 address fields),
|
|||
|
* if present, it shall contain the respective IP address values.
|
|||
|
*
|
|||
|
* Octet q shall be present and shall contain a binary integer value
|
|||
|
* if the CHID bit in octet 5 is set to "1".
|
|||
|
*/
|
|||
|
typedef struct ogs_pfcp_f_teid_s {
|
|||
|
ED5(uint8_t spare1:4;,
|
|||
|
uint8_t chid:1;,
|
|||
|
uint8_t ch:1;,
|
|||
|
uint8_t ipv6:1;,
|
|||
|
uint8_t ipv4:1;)
|
|||
|
union {
|
|||
|
struct {
|
|||
|
ED4(uint8_t choose_id;,
|
|||
|
uint8_t spare2;,
|
|||
|
uint8_t spare3;,
|
|||
|
uint8_t spare4;)
|
|||
|
};
|
|||
|
struct {
|
|||
|
uint32_t teid;
|
|||
|
union {
|
|||
|
uint32_t addr;
|
|||
|
uint8_t addr6[OGS_IPV6_LEN];
|
|||
|
struct {
|
|||
|
uint32_t addr;
|
|||
|
uint8_t addr6[OGS_IPV6_LEN];
|
|||
|
} both;
|
|||
|
};
|
|||
|
};
|
|||
|
};
|
|||
|
} __attribute__ ((packed)) ogs_pfcp_f_teid_t;
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.62 UE IP Address
|
|||
|
*
|
|||
|
* - Bit 1 – V6: If this bit is set to "1", then the IPv6 address field
|
|||
|
* shall be present in the UE IP Address, otherwise the IPv6 address field
|
|||
|
* shall not be present.
|
|||
|
* - Bit 2 – V4: If this bit is set to "1", then the IPv4 address field
|
|||
|
* shall be present in the UE IP Address, otherwise the IPv4 address field
|
|||
|
* shall not be present.
|
|||
|
* - Bit 3 – S/D: This bit is only applicable to the UE IP Address IE
|
|||
|
* in the PDI IE. It shall be set to "0" and ignored by the receiver
|
|||
|
* in IEs other than PDI IE. In the PDI IE, if this bit is set to "0",
|
|||
|
* this indicates a Source IP address; if this bit is set to "1",
|
|||
|
* this indicates a Destination IP address.
|
|||
|
* - Bit 4 – IPv6D: This bit is only applicable to the UE IP address IE
|
|||
|
* in the PDI IE and whhen V6 bit is set to "1". If this bit is set to "1",
|
|||
|
* then the IPv6 Prefix Delegation Bits field shall be present,
|
|||
|
* otherwise the UP function shall consider IPv6 prefix is default /64.
|
|||
|
* - Bit 5 to 8 Spare, for future use and set to 0.
|
|||
|
*
|
|||
|
* Octets "m to (m+3)" or "p to (p+15)" (IPv4 address / IPv6 address fields),
|
|||
|
* if present, shall contain the address value.
|
|||
|
*
|
|||
|
* Octet r, if present, shall contain the number of bits is allocated
|
|||
|
* for IPv6 prefix delegation, e.g. if /60 prefix is used, the value
|
|||
|
* is set to "4". When using UE IP address IE in a PDI to match the packets,
|
|||
|
* the UP function shall only use the IPv6 prefix part and
|
|||
|
* ignore the interface identifier part.
|
|||
|
*/
|
|||
|
typedef struct ogs_pfcp_ue_ip_addr_s {
|
|||
|
ED8(uint8_t spare:1;,
|
|||
|
uint8_t ip6pl:1;,
|
|||
|
uint8_t chv6:1;,
|
|||
|
uint8_t chv4:1;,
|
|||
|
uint8_t ipv6d:1;,
|
|||
|
#define OGS_PFCP_UE_IP_SRC 0
|
|||
|
#define OGS_PFCP_UE_IP_DST 1
|
|||
|
uint8_t sd:1;,
|
|||
|
uint8_t ipv4:1;,
|
|||
|
uint8_t ipv6:1;)
|
|||
|
union {
|
|||
|
uint32_t addr;
|
|||
|
uint8_t addr6[OGS_IPV6_LEN];
|
|||
|
struct {
|
|||
|
uint32_t addr;
|
|||
|
uint8_t addr6[OGS_IPV6_LEN];
|
|||
|
} both;
|
|||
|
};
|
|||
|
} __attribute__ ((packed)) ogs_pfcp_ue_ip_addr_t;
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.56 Outer Header Creation
|
|||
|
*
|
|||
|
* NOTE 1: The SGW-U/I-UPF shall also create GTP-U extension header(s)
|
|||
|
* if any has been stored for this packet, during a previous outer header
|
|||
|
* removal (see clause 8.2.64).
|
|||
|
* NOTE 2: This value may apply to UL packets sent by a PGW-U
|
|||
|
* for non-IP PDN connections with SGi tunnelling based on UDP/IP encapsulation
|
|||
|
* (see clause 4.3.17.8.3.3.2 of 3GPP TS 23.401 [14]).
|
|||
|
* NOTE 3: The SGW-U/I-UPF shall set the GTP-U message type
|
|||
|
* to the value stored during the previous outer header removal.
|
|||
|
* NOTE 4: This value may apply to UL packets sent by a UPF
|
|||
|
* for Ethernet PDU sessions over N6
|
|||
|
* (see clause 5.8.2.11.6 of 3GPP TS 23.501 [28]).
|
|||
|
* NOTE 5: This value may apply e.g. to UL packets sent by a UPF
|
|||
|
* (PDU Session Anchor) over N6, when explicit N6 traffic routing information is provided to the SMF (see clause 5.6.7 of 3GPP TS 23.501 [28]).
|
|||
|
*
|
|||
|
* At least one bit of the Outer Header Creation Description field
|
|||
|
* shall be set to 1. Bits 5/1 and 5/2 may both be set to 1 if an F-TEID
|
|||
|
* with both an IPv4 and IPv6 addresses has been assigned by the GTP-U peer.
|
|||
|
* In this case, the UP function shall send the outgoing packet
|
|||
|
* towards the IPv4 or IPv6 address.
|
|||
|
*
|
|||
|
* The TEID field shall be present if the Outer Header Creation Description
|
|||
|
* requests the creation of a GTP-U header. Otherwise it shall not be present.
|
|||
|
* When present, it shall contain the destination GTP-U TEID to set
|
|||
|
* in the GTP-U header of the outgoing packet.
|
|||
|
*
|
|||
|
* The IPv4 Address field shall be present if the Outer Header Creation
|
|||
|
* Description requests the creation of an IPv4 header. Otherwise it shall
|
|||
|
* not be present. When present, it shall contain the destination IPv4 address
|
|||
|
* to set in the IPv4 header of the outgoing packet.
|
|||
|
*
|
|||
|
* The IPv6 Address field shall be present if the Outer Header Creation
|
|||
|
* Description requests the creation of an IPv6 header. Otherwise it shall
|
|||
|
* not be present. When present, it shall contain the destination IPv6 address
|
|||
|
* to set in the IPv6 header of the outgoing packet.
|
|||
|
*
|
|||
|
* The Port Number field shall be present if the Outer Header Creation
|
|||
|
* Description requests the creation of a UDP/IP header
|
|||
|
* (i.e. it is set to the value 4). Otherwise it shall not be present.
|
|||
|
* When present, it shall contain the destination Port Number to set
|
|||
|
* in the UDP header of the outgoing packet.
|
|||
|
*
|
|||
|
* The C-TAG field shall be present if the Outer Header Creation Description
|
|||
|
* requests the setting of the C-Tag in Ethernet packet. Otherwise it shall
|
|||
|
* not be present. When present, it shall contain the destination Customer-VLAN
|
|||
|
* tag to set in the Customer-VLAN tag header of the outgoing packet.
|
|||
|
*
|
|||
|
* The S-TAG field shall be present if the Outer Header Creation Description
|
|||
|
* requests the setting of the S-Tag in Ethernet packet. Otherwise it shall
|
|||
|
* not be present. When present, it shall contain the destination Service-VLAN
|
|||
|
* tag to set in the Service-VLAN tag header of the outgoing packet.
|
|||
|
*/
|
|||
|
typedef struct ogs_pfcp_outer_header_creation_s {
|
|||
|
ED8(uint8_t stag:1;,
|
|||
|
uint8_t ctag:1;,
|
|||
|
uint8_t ip6:1;,
|
|||
|
uint8_t ip4:1;,
|
|||
|
uint8_t udp6:1;,
|
|||
|
uint8_t udp4:1;,
|
|||
|
uint8_t gtpu6:1;,
|
|||
|
uint8_t gtpu4:1;)
|
|||
|
ED4(uint8_t spare:5;,
|
|||
|
uint8_t ssm_c_teid:1;,
|
|||
|
uint8_t n6:1;,
|
|||
|
uint8_t n19:1;)
|
|||
|
uint32_t teid;
|
|||
|
union {
|
|||
|
uint32_t addr;
|
|||
|
uint8_t addr6[OGS_IPV6_LEN];
|
|||
|
struct {
|
|||
|
uint32_t addr;
|
|||
|
uint8_t addr6[OGS_IPV6_LEN];
|
|||
|
} both;
|
|||
|
};
|
|||
|
} __attribute__ ((packed)) ogs_pfcp_outer_header_creation_t;
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.82 User Plane IP Resource Information
|
|||
|
*
|
|||
|
* The following flags are coded within Octet 5:
|
|||
|
* - Bit 1 – V4: If this bit is set to "1", then the IPv4 address field
|
|||
|
* shall be present, otherwise the IPv4 address field shall not be present.
|
|||
|
* - Bit 2 – V6: If this bit is set to "1", then the IPv6 address field
|
|||
|
* shall be present, otherwise the IPv6 address field shall not be present.
|
|||
|
* - Bit 3-5 – TEID Range Indication (TEIDRI): the value of this field
|
|||
|
* indicates the number of bits in the most significant octet of a TEID
|
|||
|
* that are used to partition the TEID range,
|
|||
|
* e.g. if this field is set to "4", then the first 4 bits in the TEID
|
|||
|
* are used to partition the TEID range.
|
|||
|
* - Bit 6 – Associated Network Instance (ASSONI): if this bit is set to "1",
|
|||
|
* then the Network Instance field shall be present, otherwise the Network
|
|||
|
* Instance field shall not be present.
|
|||
|
* - Bit 7 – Associated Source Interface (ASSOSI): if this bit is set to "1",
|
|||
|
* then the Source Interface field shall be present,
|
|||
|
* otherwise the Source Interface field shall not be present.
|
|||
|
* - Bit 8: Spare, for future use and set to 0.
|
|||
|
*
|
|||
|
* At least one of the V4 and V6 flags shall be set to "1",
|
|||
|
* and both may be set to "1".
|
|||
|
*
|
|||
|
* If both the ASSONI and ASSOSI flags are set to "0", this shall indicate
|
|||
|
* that the User Plane IP Resource Information provided can be used
|
|||
|
* by CP function for any Network Instance and any Source Interface
|
|||
|
* of GTP-U user plane in the UP function. Octet 6 (TEID Range) shall be
|
|||
|
* present if the TEID Range Indication is not set to zero and
|
|||
|
* shall contain a value of the bits which are used to partition the TEID range.
|
|||
|
* E.g. if the TEID Range Indication is set to "4", then Octet 6 shall be
|
|||
|
* one of values between 0 and 15. When TEID Range Indication is set to zero,
|
|||
|
* the Octet 6 shall not be present, the TEID is not partitioned,
|
|||
|
* i.e. all TEID values are available for use by the CP function.
|
|||
|
*
|
|||
|
* Octets "m to (m+3)" and/or "p to (p+15)" (IPv4 address / IPv6 address fields)
|
|||
|
* , if present, shall contain the respective IP address values.
|
|||
|
*
|
|||
|
* Octets "k to l", if present, shall contain a Network Instance value
|
|||
|
* as encoded in octet "5 to n+4" of the Figure 8.2.4-1 in clause 8.2.4,
|
|||
|
* identifying a Network Instance with which the IP address or TEID Range
|
|||
|
* is associated.
|
|||
|
*
|
|||
|
* Octet r, if present, shall contain a Source Interface value as encoded
|
|||
|
* in octet 5 of the Figure 8.2.2-1 in clause 8.2.2,
|
|||
|
* identifying the Source Interface with which the IP address or TEID Range
|
|||
|
* is associated.
|
|||
|
*/
|
|||
|
int16_t ogs_pfcp_build_user_plane_ip_resource_info(
|
|||
|
ogs_tlv_octet_t *octet,
|
|||
|
ogs_user_plane_ip_resource_info_t *info,
|
|||
|
void *data, int data_len);
|
|||
|
int16_t ogs_pfcp_parse_user_plane_ip_resource_info(
|
|||
|
ogs_user_plane_ip_resource_info_t *info,
|
|||
|
ogs_tlv_octet_t *octet);
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.5 SDF Filter
|
|||
|
*
|
|||
|
* The SDF Filter IE type shall be encoded as shown in Figure 8.2.5-1.
|
|||
|
* It contains an SDF Filter, i.e. a single IP flow packet filter.
|
|||
|
*
|
|||
|
* The following flags are coded within Octet 5:
|
|||
|
* - Bit 1 – FD (Flow Description): If this bit is set to "1",
|
|||
|
* then the Length of Flow Description and the Flow Description fields
|
|||
|
* shall be present, otherwise they shall not be present.
|
|||
|
* - Bit 2 – TTC (ToS Traffic Class): If this bit is set to "1",
|
|||
|
* then the ToS Traffic Class field shall be present,
|
|||
|
* otherwise the ToS Traffic Class field shall not be present.
|
|||
|
* - Bit 3 – SPI (Security Parameter Index): If this bit is set to "1",
|
|||
|
* then the Security Parameter Index field shall be present,
|
|||
|
* otherwise the Security Parameter Index field shall not be present.
|
|||
|
* - Bit 4 – FL (Flow Label): If this bit is set to "1",
|
|||
|
* then the Flow Label field shall be present, otherwise the Flow Label field
|
|||
|
* shall not be present.
|
|||
|
* - Bit 5 – BID (Bidirectional SDF Filter): If this bit is set to "1",
|
|||
|
* then the SDF Filter ID shall be present, otherwise the SDF Filter ID
|
|||
|
* shall not be present.
|
|||
|
* - Bit 6 to 8: Spare, for future use and set to 0.
|
|||
|
*
|
|||
|
* The Flow Description field, when present, shall be encoded as an OctetString
|
|||
|
* as specified in clause 5.4.2 of 3GPP TS 29.212 [8].
|
|||
|
*
|
|||
|
* The ToS Traffic Class field, when present, shall be encoded as an OctetString
|
|||
|
* on two octets as specified in clause 5.3.15 of 3GPP TS 29.212 [8].
|
|||
|
*
|
|||
|
* The Security Parameter Index field, when present, shall be encoded as
|
|||
|
* an OctetString on four octets and shall contain the IPsec security parameter
|
|||
|
* index (which is a 32-bit field), as specified in clause 5.3.51
|
|||
|
* of 3GPP TS 29.212 [8].
|
|||
|
*
|
|||
|
* The Flow Label field, when present, shall be encoded as an OctetString
|
|||
|
* on 3 octets as specified in clause 5.3.52 of 3GPP TS 29.212 [8] and
|
|||
|
* shall contain an IPv6 flow label (which is a 20-bit field).
|
|||
|
*
|
|||
|
* The bits 8 to 5 of the octet "v" shall be spare and set to zero, and
|
|||
|
* the remaining 20 bits shall contain the IPv6 flow label.
|
|||
|
*
|
|||
|
* An SDF Filter may:
|
|||
|
*
|
|||
|
* - be a pattern for matching the IP 5 tuple (source IP address or
|
|||
|
* IPv6 network prefix, destination IP address or IPv6 network prefix,
|
|||
|
* source port number, destination port number, protocol ID of the protocol
|
|||
|
* above IP). In the pattern:
|
|||
|
* - a value left unspecified in a filter matches any value of
|
|||
|
* the corresponding information in a packet;
|
|||
|
* - an IP address may be combined with a prefix mask;
|
|||
|
* - port numbers may be specified as port ranges;
|
|||
|
* - the pattern can be extended by the Type of Service (TOS) (IPv4) /
|
|||
|
* Traffic class (IPv6) and Mask;
|
|||
|
*
|
|||
|
* - consist of the destination IP address and optional mask, protocol ID
|
|||
|
* of the protocol above IP, the Type of Service (TOS) (IPv4) /
|
|||
|
* Traffic class (IPv6) and Mask and the IPsec Security Parameter Index (SPI);
|
|||
|
*
|
|||
|
* - consist of the destination IP address and optional mask,
|
|||
|
* the Type of Service (TOS) (IPv4) / Traffic class (IPv6) and Mask and
|
|||
|
* the Flow Label (IPv6).
|
|||
|
*
|
|||
|
* NOTE 1: The details about the IPsec Security Parameter Index (SPI),
|
|||
|
* the Type of Service (TOS) (IPv4) / Traffic class (IPv6) and Mask and
|
|||
|
* the Flow Label (IPv6) are defined in 3GPP TS 23.060 [19] clause 15.3.
|
|||
|
*
|
|||
|
* - extend the packet inspection beyond the possibilities described above and
|
|||
|
* look further into the packet. Such service data flow filters need
|
|||
|
* to be predefined in the PGW-U, as specified in clause 5.11
|
|||
|
* of 3GPP TS 23.214 [2].
|
|||
|
*
|
|||
|
* NOTE 2: Such filters may be used to support filtering with respect
|
|||
|
* to a service data flow based on the transport and application
|
|||
|
* protocols used above IP, e.g. for HTTP and WAP. Filtering
|
|||
|
* for further application protocols and services can also be supported.
|
|||
|
*
|
|||
|
* The SDF Filter ID, when present, shall be encoded as
|
|||
|
* an Unsigned32 binary integer value. It shall uniquely identify
|
|||
|
* an SDF Filter among all the SDF Filters provisioned for a given PFCP Session.
|
|||
|
* The source/destination IP address and port information, in a bidirectional
|
|||
|
* SDF Filter, shall be set as for downlink IP flows. The SDF filter
|
|||
|
* for the opposite direction has the same parameters, but having
|
|||
|
* the source and destination address/port parameters swapped. When being
|
|||
|
* provisioned with a bidirectional SDF filter in a PDR,
|
|||
|
* the UP function shall apply the SDF filter as specified in clause 5.2.1A.2A.
|
|||
|
*/
|
|||
|
|
|||
|
typedef struct ogs_pfcp_sdf_filter_s {
|
|||
|
union {
|
|||
|
struct {
|
|||
|
ED6(uint8_t spare1:3;,
|
|||
|
uint8_t bid:1;,
|
|||
|
uint8_t fl:1;,
|
|||
|
uint8_t spi:1;,
|
|||
|
uint8_t ttc:1;,
|
|||
|
uint8_t fd:1;)
|
|||
|
};
|
|||
|
uint8_t flags;
|
|||
|
};
|
|||
|
|
|||
|
uint8_t spare2;
|
|||
|
uint16_t flow_description_len;
|
|||
|
char *flow_description;
|
|||
|
uint16_t tos_traffic_class;
|
|||
|
uint32_t security_parameter_index;
|
|||
|
uint32_t flow_label;
|
|||
|
uint32_t sdf_filter_id;
|
|||
|
} __attribute__ ((packed)) ogs_pfcp_sdf_filter_t;
|
|||
|
|
|||
|
int16_t ogs_pfcp_build_sdf_filter(
|
|||
|
ogs_tlv_octet_t *octet, ogs_pfcp_sdf_filter_t *filter,
|
|||
|
void *data, int data_len);
|
|||
|
int16_t ogs_pfcp_parse_sdf_filter(
|
|||
|
ogs_pfcp_sdf_filter_t *filter, ogs_tlv_octet_t *octet);
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.8 MBR
|
|||
|
*
|
|||
|
* The UL/DL MBR fields shall be encoded as kilobits per second
|
|||
|
* (1 kbps = 1000 bps) in binary value. The UL/DL MBR fields may require
|
|||
|
* converting values in bits per second to kilobits per second
|
|||
|
* when the UL/DL MBR values are received from an interface other than
|
|||
|
* GTPv2 interface. If such conversions result in fractions,
|
|||
|
* then the value of UL/DL MBR fields shall be rounded upwards.
|
|||
|
* The range of UL/DL MBR is specified in 3GPP TS 36.413 [10].
|
|||
|
*
|
|||
|
* NOTE: The encoding is aligned on the encoding specified
|
|||
|
* in 3GPP TS 29.274 [9].
|
|||
|
*/
|
|||
|
|
|||
|
#define OGS_PFCP_BITRATE_LEN 10
|
|||
|
typedef struct ogs_pfcp_bitrate_s {
|
|||
|
uint64_t uplink;
|
|||
|
uint64_t downlink;
|
|||
|
} __attribute__ ((packed)) ogs_pfcp_bitrate_t;
|
|||
|
|
|||
|
int16_t ogs_pfcp_build_bitrate(ogs_tlv_octet_t *octet,
|
|||
|
ogs_pfcp_bitrate_t *bitrate, void *data, int data_len);
|
|||
|
int16_t ogs_pfcp_parse_bitrate(
|
|||
|
ogs_pfcp_bitrate_t *bitrate, ogs_tlv_octet_t *octet);
|
|||
|
|
|||
|
#define OGS_PFCP_GATE_OPEN 0
|
|||
|
#define OGS_PFCP_GATE_CLOSE 1
|
|||
|
typedef struct ogs_pfcp_gate_status_s {
|
|||
|
union {
|
|||
|
struct {
|
|||
|
ED3(uint8_t spare:4;,
|
|||
|
uint8_t uplink:2;,
|
|||
|
uint8_t downlink:2;)
|
|||
|
};
|
|||
|
uint8_t value;
|
|||
|
};
|
|||
|
} __attribute__ ((packed)) ogs_pfcp_gate_status_t;
|
|||
|
|
|||
|
/* 8.2.19 Reporting Triggers
|
|||
|
*/
|
|||
|
typedef struct ogs_pfcp_reporting_triggers_s {
|
|||
|
union {
|
|||
|
struct {
|
|||
|
ED8(uint8_t linked_usage_reporting:1;,
|
|||
|
uint8_t dropped_dl_traffic_threshold:1;,
|
|||
|
uint8_t stop_of_traffic:1;,
|
|||
|
uint8_t start_of_traffic:1;,
|
|||
|
uint8_t quota_holding_time:1;,
|
|||
|
uint8_t time_threshold:1;,
|
|||
|
uint8_t volume_threshold:1;,
|
|||
|
uint8_t periodic_reporting:1;)
|
|||
|
};
|
|||
|
uint8_t reptri_5;
|
|||
|
};
|
|||
|
union {
|
|||
|
struct {
|
|||
|
ED8(uint8_t quota_validity_time:1;,
|
|||
|
uint8_t ip_multicast_join_leave:1;,
|
|||
|
uint8_t event_quota:1;,
|
|||
|
uint8_t event_threshold:1;,
|
|||
|
uint8_t mac_addresses_reporting:1;,
|
|||
|
uint8_t envelope_closure:1;,
|
|||
|
uint8_t time_quota:1;,
|
|||
|
uint8_t volume_quota:1;)
|
|||
|
};
|
|||
|
uint8_t reptri_6;
|
|||
|
};
|
|||
|
union {
|
|||
|
struct {
|
|||
|
ED3(uint8_t spare:6;,
|
|||
|
uint8_t user_plane_inactivity_timer:1;,
|
|||
|
uint8_t report_the_end_marker_reception:1;)
|
|||
|
};
|
|||
|
uint8_t reptri_7;
|
|||
|
};
|
|||
|
} __attribute__ ((packed)) ogs_pfcp_reporting_triggers_t;
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.21 Report Type
|
|||
|
*
|
|||
|
* Octet 5 shall be encoded as follows:
|
|||
|
*
|
|||
|
* - Bit 1 – DLDR (Downlink Data Report): when set to 1,
|
|||
|
* this indicates Downlink Data Report
|
|||
|
* - Bit 2 – USAR (Usage Report): when set to 1, this indicates a Usage Report
|
|||
|
* - Bit 3 – ERIR (Error Indication Report): when set to 1,
|
|||
|
* this indicates an Error Indication Report.
|
|||
|
* - Bit 4 – UPIR (User Plane Inactivity Report): when set to 1,
|
|||
|
* this indicates a User Plane Inactivity Report.
|
|||
|
* - Bit 5 – TMIR (TSC Management Information Report): when set to "1",
|
|||
|
* this indicates a TSC Management Information Report.
|
|||
|
* - Bit 6 – Session Report (SESR): when set to "1",
|
|||
|
* this indicates a Session Report.
|
|||
|
* - Bit 7 – UISR (UP Initiated Session Request): when set to "1",
|
|||
|
* this indicates it is a UP function initiated request
|
|||
|
* for a reason which is indicated by the PFCPSRReq-Flags,
|
|||
|
* for the PFCP session.
|
|||
|
* - Bit 8 – Spare, for future use and set to "0".
|
|||
|
*
|
|||
|
* At least one bit shall be set to 1. Several bits may be set to 1.
|
|||
|
*/
|
|||
|
typedef struct ogs_pfcp_report_type_s {
|
|||
|
union {
|
|||
|
struct {
|
|||
|
ED8(uint8_t spare:1;,
|
|||
|
uint8_t up_initiated_session_request:1;,
|
|||
|
uint8_t session_report:1;,
|
|||
|
uint8_t tsc_management_information_report:1;,
|
|||
|
uint8_t user_plane_inactivity_report:1;,
|
|||
|
uint8_t error_indication_report:1;,
|
|||
|
uint8_t usage_report:1;,
|
|||
|
uint8_t downlink_data_report:1;)
|
|||
|
};
|
|||
|
uint8_t value;
|
|||
|
};
|
|||
|
} __attribute__ ((packed)) ogs_pfcp_report_type_t;
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.27 Downlink Data Service Information
|
|||
|
*/
|
|||
|
typedef struct ogs_pfcp_downlink_data_service_information_s {
|
|||
|
struct {
|
|||
|
ED3(uint8_t spare:6;,
|
|||
|
uint8_t qfii:1;,
|
|||
|
uint8_t ppi:1;)
|
|||
|
};
|
|||
|
union {
|
|||
|
uint8_t paging_policy_indication_value;
|
|||
|
uint8_t qfi;
|
|||
|
struct {
|
|||
|
uint8_t paging_policy_indication_value;
|
|||
|
uint8_t qfi;
|
|||
|
} both;
|
|||
|
};
|
|||
|
} __attribute__ ((packed)) ogs_pfcp_downlink_data_service_information_t;
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.31 PFCPSMReq-Flags
|
|||
|
*
|
|||
|
* The following bits within Octet 5 shall indicate:
|
|||
|
* - Bit 1 – DROBU (Drop Buffered Packets): if this bit is set to 1,
|
|||
|
* it indicates that the UP function shall drop all the packets currently
|
|||
|
* buffered for the PFCP session, if any, prior to further applying
|
|||
|
* the action specified in the Apply Action value of the FARs.
|
|||
|
* - Bit 2 – SNDEM (Send End Marker Packets): if this bit is set to 1,
|
|||
|
* it indicates that the UP function shall construct and send End Marker
|
|||
|
* packets towards the old F-TEID of the downstream node when switching
|
|||
|
* to the new F- TEID.
|
|||
|
* - Bit 3 – QAURR (Query All URRs): if this bit is set to 1, it indicates
|
|||
|
* that the UP function shall return immediate usage report(s)
|
|||
|
* for all the URRs previously provisioned for this PFCP session.
|
|||
|
* - Bit 4 - SUMPC (Stop of Usage Measurement to Pause Charging):
|
|||
|
* if this bit is set to "1", it indicates that the UP function
|
|||
|
* shall stop the usage measurement for all URRs
|
|||
|
* with the "ASPOC" flag set to "1".
|
|||
|
* - Bit 5 - RUMUC (Resume of Usage Measurement to Un-pause of Charging):
|
|||
|
* if this bit is set to "1", it indicates that the UP function
|
|||
|
* shall resume the usage measurement for all URRs
|
|||
|
* with the "ASPOC" flag set to "1".
|
|||
|
* - Bit 6 - DETEID (Delete All DL N3mb and/or N19mb F-TEIDs):
|
|||
|
* if this bit is set to "1", it indicates that the MB-UPF
|
|||
|
* shall delete all NG-RAN N3mb DL F-TEIDs
|
|||
|
* and all UPF N19mb DL F-TEIDs which were provisioned
|
|||
|
* in Add MBS Unicast Parameters IEs for the MBS session
|
|||
|
* (see clause 5.34.2.4).
|
|||
|
* - Bit 7 to 8 – Spare, for future use, shall be set to "0" by the sender
|
|||
|
* and discarded by the receiver.
|
|||
|
*/
|
|||
|
typedef struct ogs_pfcp_smreq_flags_s {
|
|||
|
union {
|
|||
|
struct {
|
|||
|
ED7(uint8_t spare:2;,
|
|||
|
uint8_t delete_all_dl_n3mb_and_or_n19mb_f_teids:1;,
|
|||
|
uint8_t resume_of_usage_measurement_to_un_pause_of_charging:1;,
|
|||
|
uint8_t stop_of_usage_measurement_to_pause_charging:1;,
|
|||
|
uint8_t query_all_urrs:1;,
|
|||
|
uint8_t send_end_marker_packets:1;,
|
|||
|
uint8_t drop_buffered_packets:1;)
|
|||
|
};
|
|||
|
uint8_t value;
|
|||
|
};
|
|||
|
} __attribute__ ((packed)) ogs_pfcp_smreq_flags_t;
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.40 Measurement Method
|
|||
|
*
|
|||
|
* Octet 5 shall be encoded as follows:
|
|||
|
* - Bit 1 – DURAT (Duration): when set to "1",
|
|||
|
* this indicates a request for measuring the duration of the traffic.
|
|||
|
* - Bit 2 – VOLUM (Volume): when set to "1",
|
|||
|
* this indicates a request for measuring the volume of the traffic.
|
|||
|
* - Bit 3 – EVENT (Event): when set to "1",
|
|||
|
* this indicates a request for measuring the events.
|
|||
|
* - Bit 4 to 8: Spare, for future use and set to "0".
|
|||
|
*
|
|||
|
* At least one bit shall be set to "1". Several bits may be set to "1".
|
|||
|
*/
|
|||
|
#define OGS_PFCP_MEASUREMENT_METHOD_DURATION 1
|
|||
|
#define OGS_PFCP_MEASUREMENT_METHOD_VOLUME 2
|
|||
|
#define OGS_PFCP_MEASUREMENT_METHOD_EVENT 4
|
|||
|
typedef uint8_t ogs_pfcp_measurement_method_t;
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.41 Usage Report Trigger
|
|||
|
*
|
|||
|
* The Usage Report Trigger IE shall be encoded as shown in Figure 8.2.41-1.
|
|||
|
* It indicates the trigger of the usage report.
|
|||
|
*/
|
|||
|
typedef struct ogs_pfcp_usage_report_trigger_s {
|
|||
|
union {
|
|||
|
struct {
|
|||
|
ED8(uint8_t immediate_report:1;;,
|
|||
|
uint8_t dropped_dl_traffic_threshold:1;,
|
|||
|
uint8_t stop_of_traffic:1;,
|
|||
|
uint8_t start_of_traffic:1;,
|
|||
|
uint8_t quota_holding_time:1;,
|
|||
|
uint8_t time_threshold:1;,
|
|||
|
uint8_t volume_threshold:1;,
|
|||
|
uint8_t periodic_reporting:1;)
|
|||
|
};
|
|||
|
uint8_t reptri_5;
|
|||
|
};
|
|||
|
union {
|
|||
|
struct {
|
|||
|
ED8(uint8_t event_threshold:1;,
|
|||
|
uint8_t mac_addresses_reporting:1;,
|
|||
|
uint8_t envelope_closure:1;,
|
|||
|
uint8_t monitoring_time:1;,
|
|||
|
uint8_t termination_report:1;,
|
|||
|
uint8_t linked_usage_reporting:1;,
|
|||
|
uint8_t time_quota:1;,
|
|||
|
uint8_t volume_quota:1;)
|
|||
|
};
|
|||
|
uint8_t reptri_6;
|
|||
|
};
|
|||
|
union {
|
|||
|
struct {
|
|||
|
ED7(uint8_t spare:2;,
|
|||
|
uint8_t user_plane_inactivity_timer:1;,
|
|||
|
uint8_t report_the_end_marker_reception:1;,
|
|||
|
uint8_t quota_validity_time:1;,
|
|||
|
uint8_t ip_multicast_join_leave:1;,
|
|||
|
uint8_t termination_by_up_function_report:1;,
|
|||
|
uint8_t event_quota:1;)
|
|||
|
};
|
|||
|
uint8_t reptri_7;
|
|||
|
};
|
|||
|
} __attribute__ ((packed)) ogs_pfcp_usage_report_trigger_t;
|
|||
|
|
|||
|
void ogs_pfcp_parse_usage_report_trigger(
|
|||
|
ogs_pfcp_usage_report_trigger_t *rep_trig,
|
|||
|
ogs_pfcp_tlv_usage_report_trigger_t *tlv);
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.42 Measurement Period
|
|||
|
*
|
|||
|
* The Measurement Period IE contains the period, in seconds,
|
|||
|
* for generating periodic usage reports or the periodic QoS monitoring reports.
|
|||
|
* It shall be encoded as shown in Figure 8.2.42-1.
|
|||
|
*
|
|||
|
* The Measurement Period field shall be encoded
|
|||
|
* as an Unsigned32 binary integer value.
|
|||
|
*/
|
|||
|
typedef uint32_t ogs_pfcp_measurement_period_t;
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.13 Volume Threshold
|
|||
|
*/
|
|||
|
typedef struct ogs_pfcp_volume_threshold_s {
|
|||
|
union {
|
|||
|
struct {
|
|||
|
ED4(uint8_t spare:5;,
|
|||
|
uint8_t dlvol:1;,
|
|||
|
uint8_t ulvol:1;,
|
|||
|
uint8_t tovol:1;)
|
|||
|
};
|
|||
|
uint8_t flags;
|
|||
|
};
|
|||
|
|
|||
|
uint64_t total_volume;
|
|||
|
uint64_t uplink_volume;
|
|||
|
uint64_t downlink_volume;
|
|||
|
|
|||
|
} __attribute__ ((packed)) ogs_pfcp_volume_threshold_t;
|
|||
|
|
|||
|
int16_t ogs_pfcp_build_volume(ogs_tlv_octet_t *octet,
|
|||
|
ogs_pfcp_volume_threshold_t *volume, void *data, int data_len);
|
|||
|
int16_t ogs_pfcp_parse_volume(
|
|||
|
ogs_pfcp_volume_threshold_t *volume, ogs_tlv_octet_t *octet);
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.50 Volume Quota
|
|||
|
*/
|
|||
|
typedef ogs_pfcp_volume_threshold_t ogs_pfcp_volume_quota_t;
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.113 Event Threshold
|
|||
|
*
|
|||
|
* The Event Threshold IE contains the Number of events after
|
|||
|
* which the measurement report is to be generated by the UP function.
|
|||
|
*
|
|||
|
* It shall be encoded as shown in Figure 8.2.113-1.
|
|||
|
*/
|
|||
|
typedef uint32_t ogs_pfcp_event_threshold_t;
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.112 Event Quota
|
|||
|
*
|
|||
|
* The Event Quota IE type shall be encoded as shown in Figure 8.2.112-1.
|
|||
|
* It contains the event quota to be monitored by the UP function.
|
|||
|
*/
|
|||
|
typedef uint32_t ogs_pfcp_event_quota_t;
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.14 Time Threshold
|
|||
|
*
|
|||
|
* The Time Threshold IE contains the traffic duration threshold
|
|||
|
* to be monitored by the UP function. It shall be encoded as shown
|
|||
|
* in Figure 8.2.14-1.
|
|||
|
*/
|
|||
|
typedef uint32_t ogs_pfcp_time_threshold_t;
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.51 Time Quota
|
|||
|
*
|
|||
|
* The Time Quota IE type shall be encoded as shown in Figure 8.2.51-1.
|
|||
|
* It contains the time quota to be monitored by the UP function.
|
|||
|
*/
|
|||
|
typedef uint32_t ogs_pfcp_time_quota_t;
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.48 Quota Holding Time
|
|||
|
*
|
|||
|
* The Quota Holding Time IE type shall be encoded as shown in Figure 8.2.48-1.
|
|||
|
* It contains the quota holding time in seconds.
|
|||
|
*
|
|||
|
* The Quota Holding Time value shall be encoded as
|
|||
|
* an Unsigned32 binary integer value.
|
|||
|
*/
|
|||
|
typedef uint32_t ogs_pfcp_quota_holding_time_t;
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.132 Quota Validity Time
|
|||
|
*
|
|||
|
* The Quota Validity Time IE type shall be encoded as shown
|
|||
|
* in Figure 8.2.132-1. It contains the quota validity time in seconds.
|
|||
|
*
|
|||
|
* The Quota Validity Time value shall be encoded as
|
|||
|
* an Unsigned32 binary integer value.
|
|||
|
*/
|
|||
|
typedef uint32_t ogs_pfcp_quota_validity_time_t;
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.49 Dropped DL Traffic Threshold
|
|||
|
*
|
|||
|
* The Dropped DL Traffic Threshold IE type shall be encoded as shown
|
|||
|
* in Figure 8.2.49-1. It contains the dropped DL traffic volume thresholds
|
|||
|
* to be monitored by the UP function.
|
|||
|
*
|
|||
|
* The following flags are coded within Octet 5:
|
|||
|
* - Bit 1 – DLPA: If this bit is set to "1",
|
|||
|
* then the Downlink Packets field shall be present,
|
|||
|
* otherwise the Downlink Packets field shall not be present.
|
|||
|
* - Bit 2 – DLBY: If this bit is set to "1",
|
|||
|
* then the Number of Bytes of Downlink Data field shall be present,
|
|||
|
* otherwise the Number of Bytes of Downlink Data field shall not be present.
|
|||
|
* - Bit 3 to 8: Spare, for future use and set to "0".
|
|||
|
*
|
|||
|
*
|
|||
|
* The Downlink Packets fields shall be encoded as an Unsigned64 binary
|
|||
|
* integer value. It shall contain a number of downlink packets.
|
|||
|
*
|
|||
|
* The Number of Bytes of Downlink Data fields shall be encoded
|
|||
|
* as an Unsigned64 binary integer value. It shall contain the number
|
|||
|
* of bytes of the downlink data.
|
|||
|
*/
|
|||
|
typedef struct ogs_pfcp_dropped_dl_traffic_threshold_s {
|
|||
|
union {
|
|||
|
struct {
|
|||
|
ED3(uint8_t spare:6;,
|
|||
|
uint8_t dlby:1;,
|
|||
|
uint8_t dlpa:1;)
|
|||
|
};
|
|||
|
uint8_t flags;
|
|||
|
};
|
|||
|
uint64_t downlink_packets;
|
|||
|
uint64_t number_of_bytes_of_downlink_data;
|
|||
|
} __attribute__ ((packed)) ogs_pfcp_dropped_dl_traffic_threshold_t;
|
|||
|
|
|||
|
int16_t ogs_pfcp_build_dropped_dl_traffic_threshold(
|
|||
|
ogs_tlv_octet_t *octet,
|
|||
|
ogs_pfcp_dropped_dl_traffic_threshold_t *threshold,
|
|||
|
void *data, int data_len);
|
|||
|
int16_t ogs_pfcp_parse_dropped_dl_traffic_threshold(
|
|||
|
ogs_pfcp_dropped_dl_traffic_threshold_t *threshold,
|
|||
|
ogs_tlv_octet_t *octet);
|
|||
|
|
|||
|
/** 8.2.71 UR-SEQN
|
|||
|
*
|
|||
|
* The UR-SEQN (Usage Report Sequence Number) IE identifies the order
|
|||
|
* in which a usage report is generated for a
|
|||
|
* given URR. It shall be encoded as shown in Figure 8.2.71-1.
|
|||
|
*
|
|||
|
* The UR-SEQN value shall be encoded as an Unsigned32 binary integer value.
|
|||
|
*/
|
|||
|
typedef uint32_t ogs_pfcp_urr_ur_seqn_t;
|
|||
|
|
|||
|
/** 8.2.52 Start Time
|
|||
|
*
|
|||
|
* The Start Time IE indicates the time at which the UP function started
|
|||
|
* to collect the charging information. It shall be encoded as shown
|
|||
|
* in Figure 8.2.52-1.
|
|||
|
*
|
|||
|
* The Start Time field shall contain a UTC time. Octets 5 to 8 shall
|
|||
|
* be encoded in the same format as the first four octets
|
|||
|
* of the 64-bit timestamp format as defined in clause 6 of IETF RFC 5905 [12].
|
|||
|
*
|
|||
|
* NOTE: The encoding is defined as the time in seconds relative to 00:00:00
|
|||
|
* on 1 January 1900.
|
|||
|
*/
|
|||
|
typedef uint32_t ogs_pfcp_start_time_t;
|
|||
|
|
|||
|
/** 8.2.53 End Time
|
|||
|
* The End Time IE indicates the time at which the UP function ended
|
|||
|
* to collect the charging information. It shall be encoded as shown
|
|||
|
* in Figure 8.2.53-1.
|
|||
|
*
|
|||
|
* The End Time field shall contain a UTC time. Octets 5 to 8 shall be
|
|||
|
* encoded in the same format as the first four octets of the 64-bit timestamp
|
|||
|
* format as defined in clause 6 of IETF RFC 5905 [12].
|
|||
|
*
|
|||
|
* NOTE: The encoding is defined as the time in seconds relative to 00:00:00
|
|||
|
* on 1 January 1900.
|
|||
|
*/
|
|||
|
typedef uint32_t ogs_pfcp_end_time_t;
|
|||
|
|
|||
|
/** 8.2.45 Duration Measurement
|
|||
|
*
|
|||
|
* The Duration Measurement IE type shall be encoded as shown
|
|||
|
* in Figure 8.2.45-1. It contains the used time in seconds
|
|||
|
*
|
|||
|
* The Duration value shall be encoded as an Unsigned32 binary integer value.
|
|||
|
*/
|
|||
|
typedef uint32_t ogs_pfcp_duration_measurement_t;
|
|||
|
|
|||
|
/** 8.2.46 Time of First Packet
|
|||
|
*
|
|||
|
* The Time of First Packet IE indicates the time stamp for the first
|
|||
|
* IP packet transmitted for a given usage report. It shall be encoded
|
|||
|
* as shown in Figure 8.2.46-1.
|
|||
|
*
|
|||
|
* The End Time field shall contain a UTC time. Octets 5 to 8 shall
|
|||
|
* be encoded in the same format as the first four octets
|
|||
|
* of the 64-bit timestamp format as defined in clause 6 of IETF RFC 5905 [12].
|
|||
|
*
|
|||
|
* NOTE: The encoding is defined as the time in seconds relative to 00:00:00
|
|||
|
* on 1 January 1900.
|
|||
|
*/
|
|||
|
typedef uint32_t ogs_pfcp_time_of_first_packet_t;
|
|||
|
|
|||
|
/** 8.2.47 Time of Last Packet
|
|||
|
*
|
|||
|
* The Time of Last Packet IE indicates the time stamp for the last
|
|||
|
* IP packet transmitted for a given usage report. It shall be encoded
|
|||
|
* as shown in Figure 8.2.47-1.
|
|||
|
*
|
|||
|
* The End Time field shall contain a UTC time. Octets 5 to 8 shall
|
|||
|
* be encoded in the same format as the first four octets
|
|||
|
* of the 64-bit timestamp format as defined in clause 6 of IETF RFC 5905 [12].
|
|||
|
*
|
|||
|
* NOTE: The encoding is defined as the time in seconds relative to 00:00:00
|
|||
|
* on 1 January 1900.
|
|||
|
*/
|
|||
|
typedef uint32_t ogs_pfcp_time_of_last_packet_t;
|
|||
|
|
|||
|
/** 8.2.44 Volume Measurement
|
|||
|
*
|
|||
|
* The Volume Measurement IE contains the measured traffic volumes.
|
|||
|
* It shall be encoded as shown in Figure 8.2.44-1.
|
|||
|
*
|
|||
|
* The following flags are coded within Octet 5:
|
|||
|
*
|
|||
|
* - Bit 1 – TOVOL: If this bit is set to "1", then the Total Volume field
|
|||
|
* shall be present, otherwise the Total Volume field shall not be present.
|
|||
|
* - Bit 2 – ULVOL: If this bit is set to "1", then the Uplink Volume field
|
|||
|
* shall be present, otherwise the Uplink Volume field shall not be present.
|
|||
|
* - Bit 3 – DLVOL: If this bit is set to "1", then the Downlink Volume field
|
|||
|
* shall be present, otherwise the Downlink Volume field shall not be present.
|
|||
|
* - Bit 4 – TONOP: If this bit is set to "1", then the Total Number of Packets
|
|||
|
* field shall be present, otherwise the Total Number of Packets field
|
|||
|
* shall not be present.
|
|||
|
* - Bit 5 – ULNOP: If this bit is set to "1", then the Uplink Number
|
|||
|
* of Packets field shall be present, otherwise the Uplink Number
|
|||
|
* of Packets field shall not be present.
|
|||
|
* - Bit 6 – DLNOP: If this bit is set to "1", then the Downlink Number
|
|||
|
* of Packets field shall be present, otherwise the Downlink Number
|
|||
|
* of Packets field shall not be present.
|
|||
|
* - Bit 7 to bit 8: Spare, for future use and set to "0".
|
|||
|
*
|
|||
|
* At least one bit shall be set to "1". Several bits may be set to "1".
|
|||
|
*
|
|||
|
* The Total Volume, Uplink Volume and Downlink Volume fields shall be encoded
|
|||
|
* as an Unsigned64 binary integer value. They shall contain the total,
|
|||
|
* uplink or downlink number of octets respectively
|
|||
|
*/
|
|||
|
typedef struct ogs_pfcp_volume_measurement_s {
|
|||
|
union {
|
|||
|
struct {
|
|||
|
ED7(uint8_t spare:2;,
|
|||
|
uint8_t dlnop:1;,
|
|||
|
uint8_t ulnop:1;,
|
|||
|
uint8_t tonop:1;,
|
|||
|
uint8_t dlvol:1;,
|
|||
|
uint8_t ulvol:1;,
|
|||
|
uint8_t tovol:1;)
|
|||
|
};
|
|||
|
uint8_t flags;
|
|||
|
};
|
|||
|
|
|||
|
uint64_t total_volume;
|
|||
|
uint64_t uplink_volume;
|
|||
|
uint64_t downlink_volume;
|
|||
|
uint64_t total_n_packets;
|
|||
|
uint64_t uplink_n_packets;
|
|||
|
uint64_t downlink_n_packets;
|
|||
|
} __attribute__ ((packed)) ogs_pfcp_volume_measurement_t;
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.68 Measurement Information
|
|||
|
*/
|
|||
|
typedef struct ogs_pfcp_measurement_information_s {
|
|||
|
union {
|
|||
|
struct {
|
|||
|
ED6(uint8_t spare:3;,
|
|||
|
uint8_t mnop:1;,
|
|||
|
uint8_t istm:1;,
|
|||
|
uint8_t radi:1;,
|
|||
|
uint8_t inam:1;,
|
|||
|
uint8_t mbqe:1;)
|
|||
|
};
|
|||
|
uint8_t octet5;
|
|||
|
};
|
|||
|
} __attribute__ ((packed)) ogs_pfcp_measurement_information_t;
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.179 Data Status
|
|||
|
*
|
|||
|
* The following flags are coded within Octet 5:
|
|||
|
*
|
|||
|
* Bit 1 – DROP: when set to "1", this indicates first DL packet is
|
|||
|
* discarded by the UP function.
|
|||
|
* Bit 2 – BUFF: when set to "1", this indicates first DL packet is
|
|||
|
* received and buffered by the UP function.
|
|||
|
* Bit 3 to 8 Spare, for future use and set to "0".
|
|||
|
*/
|
|||
|
#define OGS_PFCP_DATA_STATUS_DROP (1<<0)
|
|||
|
#define OGS_PFCP_DATA_STATUS_BUFF (1<<1)
|
|||
|
typedef uint8_t ogs_pfcp_data_status_t;
|
|||
|
|
|||
|
typedef struct ogs_pfcp_user_plane_report_s {
|
|||
|
ogs_pfcp_report_type_t type;
|
|||
|
struct {
|
|||
|
uint8_t pdr_id;
|
|||
|
uint8_t paging_policy_indication_value;
|
|||
|
uint8_t qfi;
|
|||
|
} downlink_data;
|
|||
|
struct {
|
|||
|
ogs_pfcp_urr_id_t id;
|
|||
|
ogs_pfcp_urr_ur_seqn_t seqn;
|
|||
|
ogs_pfcp_usage_report_trigger_t rep_trigger;
|
|||
|
ogs_pfcp_start_time_t start_time;
|
|||
|
ogs_pfcp_end_time_t end_time;
|
|||
|
ogs_pfcp_volume_measurement_t vol_measurement;
|
|||
|
ogs_pfcp_duration_measurement_t dur_measurement;
|
|||
|
ogs_pfcp_time_of_first_packet_t time_of_first_packet;
|
|||
|
ogs_pfcp_time_of_last_packet_t time_of_last_packet;
|
|||
|
} usage_report [OGS_MAX_NUM_OF_URR];
|
|||
|
unsigned int num_of_usage_report;
|
|||
|
struct {
|
|||
|
ogs_pfcp_f_teid_t remote_f_teid;
|
|||
|
int remote_f_teid_len;
|
|||
|
} error_indication;
|
|||
|
} ogs_pfcp_user_plane_report_t;
|
|||
|
|
|||
|
int16_t ogs_pfcp_build_volume_measurement(ogs_tlv_octet_t *octet,
|
|||
|
ogs_pfcp_volume_measurement_t *volume, void *data, int data_len);
|
|||
|
int16_t ogs_pfcp_parse_volume_measurement(
|
|||
|
ogs_pfcp_volume_measurement_t *volume, ogs_tlv_octet_t *octet);
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.101 User ID
|
|||
|
*
|
|||
|
* The User ID IE type shall be encoded as shown in Figure 8.2.101-1.
|
|||
|
*
|
|||
|
* The following flags are coded within Octet 5:
|
|||
|
*
|
|||
|
* - Bit 1 – IMSIF: If this bit is set to "1",
|
|||
|
* then the Length of IMSI and IMSI fields shall be present,
|
|||
|
* otherwise these fields shall not be present.
|
|||
|
* - Bit 2 – IMEIF: If this bit is set to "1",
|
|||
|
* then the Length of IMEI and IMEI fields shall be present,
|
|||
|
* otherwise these fields shall not be present.
|
|||
|
* - Bit 3 – MSISDNF: If this bit is set to "1",
|
|||
|
* then the Length of MSISDN and MSISDN fields shall be present,
|
|||
|
* otherwise these fields shall not be present.
|
|||
|
* - Bit 4 – NAIF: If this bit is set to "1",
|
|||
|
* then the Length of NAI and NAI fields shall be present,
|
|||
|
* otherwise these fields shall not be present.
|
|||
|
* - Bit 5 – SUPIF: If this bit is set to "1",
|
|||
|
* then the Length of SUPI and SUPI fields shall be present,
|
|||
|
* otherwise these fields shall not be present.
|
|||
|
* - Bit 6 – GPSIF: If this bit is set to "1",
|
|||
|
* then the Length of GPSI and GPSI fields shall be present,
|
|||
|
* otherwise these fields shall not be present.
|
|||
|
* - Bit 7 – PEIF: If this bit is set to "1",
|
|||
|
* then the Length of PEI and PEI fields shall be present,
|
|||
|
* otherwise these fields shall not be present.
|
|||
|
* - Bit 8: Spare, for future use and set to "0".
|
|||
|
*
|
|||
|
* One or more flags may be set to "1".
|
|||
|
*
|
|||
|
* For 5GS User Identities:
|
|||
|
* -The SUPI field shall only be used for carrying a Global Cable Identifier
|
|||
|
* (GCI) or a Global Line Identifier (GLI). The IMSI and NAI, if received
|
|||
|
* by the SMF in the SUPI, shall be included in the IMSI and NAI field respectively.
|
|||
|
* -The GPSI field shall only be used for carrying an External Identifier.
|
|||
|
* The MSISDN, if received by the SMF in the SUPI, shall be included
|
|||
|
* in the MSISDN field.
|
|||
|
* -The PEI field shall only be used for carrying an MAC address or
|
|||
|
* an Extended Unique Identifier. The IMEI, if received by the SMF in the PEI,
|
|||
|
* shall be included in the IMEI field.
|
|||
|
*
|
|||
|
* The coding of IMSI field, from octets 7 to 'a' shall be encoded
|
|||
|
* as the octets 5 to n+4 of the IMSI IE type
|
|||
|
* specified in clause 8.3 of 3GPP TS 29.274 [9].
|
|||
|
*
|
|||
|
* The coding of IMEI field, in octets 'b+1' to 'c' shall be encoded
|
|||
|
* as the octets 5 to n+4 of the MEI IE type
|
|||
|
* specified in clause 8.10 of 3GPP TS 29.274 [9].
|
|||
|
*
|
|||
|
* The coding of MSISDN field, in octets 'd+1' to 'e' shall be encoded
|
|||
|
* as the octets 5 to n+4 of the MSISDN IE type
|
|||
|
* specified in clause 8.11 of 3GPP TS 29.274 [9].
|
|||
|
*
|
|||
|
* The coding of the SUPI field, in octets 'h+1' to 'i' shall be encoded
|
|||
|
* as the Supi data type specified in clause 5.3.2 of 3GPP TS 29.571 [61].
|
|||
|
*
|
|||
|
* The coding of the GPSI field, in octets 'j+1' to 'k' shall be encoded
|
|||
|
* as the Gpsi data type specified in clause 5.3.2 of 3GPP TS 29.571 [61].
|
|||
|
*
|
|||
|
* The coding of the PEI field, in octets 'l+1' to 'm' shall be encoded
|
|||
|
* as the Pei data type specified in clause 5.3.2 of 3GPP TS 29.571 [61].
|
|||
|
*
|
|||
|
* The NAI field, in octets 'f+1' to 'g' shall be encoded as an Octet String
|
|||
|
* (see IETF RFC 4282 [36]).
|
|||
|
*/
|
|||
|
typedef struct ogs_pfcp_user_id_flags_s {
|
|||
|
union {
|
|||
|
struct {
|
|||
|
ED8(uint8_t spare:1;,
|
|||
|
uint8_t peif:1;,
|
|||
|
uint8_t gpsif:1;,
|
|||
|
uint8_t supif:1;,
|
|||
|
uint8_t naif:1;,
|
|||
|
uint8_t msisdnf:1;,
|
|||
|
uint8_t imeif:1;,
|
|||
|
uint8_t imsif:1;)
|
|||
|
};
|
|||
|
uint8_t flags;
|
|||
|
};
|
|||
|
} ogs_pfcp_user_id_flags_t;
|
|||
|
|
|||
|
typedef struct ogs_pfcp_user_id_s {
|
|||
|
union {
|
|||
|
struct {
|
|||
|
ED8(uint8_t spare:1;,
|
|||
|
uint8_t peif:1;,
|
|||
|
uint8_t gpsif:1;,
|
|||
|
uint8_t supif:1;,
|
|||
|
uint8_t naif:1;,
|
|||
|
uint8_t msisdnf:1;,
|
|||
|
uint8_t imeif:1;,
|
|||
|
uint8_t imsif:1;)
|
|||
|
};
|
|||
|
uint8_t flags;
|
|||
|
};
|
|||
|
|
|||
|
uint8_t imsi_len;
|
|||
|
uint8_t imsi[OGS_MAX_IMSI_LEN];
|
|||
|
uint8_t imeisv_len;
|
|||
|
uint8_t imeisv[OGS_MAX_IMEISV_LEN];
|
|||
|
uint8_t msisdn_len;
|
|||
|
uint8_t msisdn[OGS_MAX_MSISDN_LEN];
|
|||
|
} ogs_pfcp_user_id_t;
|
|||
|
|
|||
|
int16_t ogs_pfcp_build_user_id(
|
|||
|
ogs_tlv_octet_t *octet, ogs_pfcp_user_id_t *user_id,
|
|||
|
void *data, int data_len);
|
|||
|
|
|||
|
/*
|
|||
|
* 8.2.136 PFCPSEReq-Flags
|
|||
|
*
|
|||
|
* The following bits within Octet 5 shall indicate:
|
|||
|
* - Bit 1 – RESTI (Restoration Indication): if this bit is set to "1",
|
|||
|
* it indicates to the UP function that the PFCP session to be established is
|
|||
|
* to restore an existing PFCP session.
|
|||
|
* - Bit 2 – SUMPC (Stop of Usage Measurement to Pause Charging):
|
|||
|
* if this bit is set to "1", it indicates that the UP function shall
|
|||
|
* stop the usage measurement for all URRs with the "ASPOC" flag set to "1".
|
|||
|
*/
|
|||
|
typedef struct ogs_pfcp_sereq_flags_s {
|
|||
|
union {
|
|||
|
struct {
|
|||
|
ED3(uint8_t spare:6;,
|
|||
|
uint8_t stop_of_usage_measurement_to_pause_charging:1;,
|
|||
|
uint8_t restoration_indication:1;)
|
|||
|
};
|
|||
|
uint8_t value;
|
|||
|
};
|
|||
|
} __attribute__ ((packed)) ogs_pfcp_sereq_flags_t;
|
|||
|
|
|||
|
#ifdef __cplusplus
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
#endif /* OGS_PFCP_TYPES_H */
|