pycrate/pycrate_mobile/TS29244_PFCP.py

5856 lines
187 KiB
Python

# -*- coding: UTF-8 -*-
#/**
# * Software Name : pycrate
# * Version : 0.5
# *
# * Copyright 2021. Benoit Michau. P1Sec.
# *
# * This library is free software; you can redistribute it and/or
# * modify it under the terms of the GNU Lesser General Public
# * License as published by the Free Software Foundation; either
# * version 2.1 of the License, or (at your option) any later version.
# *
# * This library 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
# * Lesser General Public License for more details.
# *
# * You should have received a copy of the GNU Lesser General Public
# * License along with this library; if not, write to the Free Software
# * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# * MA 02110-1301 USA
# *
# *--------------------------------------------------------
# * File Name : pycrate_mobile/TS29244_PFCP.py
# * Created : 2021-04-28
# * Authors : Benoit Michau
# *--------------------------------------------------------
#*/
__all__ = [
'PFCPIEType',
'PFCPDispatcher',
'PFCPHeartbeatRequest',
'PFCPHeartbeatResponse',
'PFCPPFDManagementRequest',
'PFCPPFDManagementResponse',
'PFCPAssociationSetupRequest',
'PFCPAssociationSetupResponse',
'PFCPAssociationUpdateRequest',
'PFCPAssociationUpdateResponse',
'PFCPAssociationReleaseRequest',
'PFCPAssociationReleaseResponse',
'PFCPVersionNotSupportedResponse',
'PFCPNodeReportRequest',
'PFCPNodeReportResponse',
'PFCPSessionSetDeletionRequest',
'PFCPSessionSetDeletionResponse',
'PFCPSessionEstablishmentRequest',
'PFCPSessionEstablishmentResponse',
'PFCPSessionModificationRequest',
'PFCPSessionModificationResponse',
'PFCPSessionDeletionRequest',
'PFCPSessionDeletionResponse',
'PFCPSessionReportRequest',
'PFCPSessionReportResponse',
'ERR_PFCP_BUF_TOO_SHORT',
'ERR_PFCP_BUF_INVALID',
'ERR_PFCP_TYPE_NONEXIST',
'parse_PFCP',
]
#------------------------------------------------------------------------------#
# 3GPP TS 29.244: Interface between the Control Plane and the User Plane nodes
# release 17 (h00)
#------------------------------------------------------------------------------#
# Packet Forwarding Control Protocol
# listening on UDP 8805
import re
from enum import IntEnum
from pycrate_core.utils import *
from pycrate_core.elt import *
from pycrate_core.base import *
from pycrate_core.charpy import *
from pycrate_ether.Ethernet import EtherType_dict
from pycrate_mobile.TS24008_IE import PLMN, IPAddr
#------------------------------------------------------------------------------#
# some utilities and generic structures
#------------------------------------------------------------------------------#
def strip_name(s):
# change 3GPP starting str with TGPP
s = re.sub('^3G', 'TG', s)
# remove unneeded chars
s = re.sub('[\s\(\)\'-/]', '', s).strip()
return s
class BitFlags(Envelope):
"""Envelope containing a list of 1-byte structures
Those structures eventually get set to transparent when decoding a shorter buffer
and encoding a shorter list of values
"""
ENV_SEL_TRANS = False
def set_val(self, vals):
vals_inner = None
if isinstance(vals, (list, tuple)):
l = len(vals)
if l < len(self._content)-1:
# set last Octets as transparent
[o.set_trans(True) for o in self._content[l:]]
elif isinstance(vals, dict):
# when a key is not identifying a direct OctetX sub-structure
# we take it appart for setting it afterwards
vals_inner = {}
for k, v in vals.items():
if k not in self._by_name:
vals_inner[k] = v
del vals[k]
Envelope.set_val(self, vals)
if vals_inner:
# iterate over each OctetX and check if a bit flag is to be set
for i, o in enumerate(self._content):
for k, v in vals_inner.items():
if hasattr(o, '_by_name') and k in o._by_name:
o[k].set_val(v)
del vals_inner[k]
if not vals_inner:
break
for o in self._content[:1+i]:
o.set_trans(False)
def _from_char(self, char):
if self.get_trans():
return
# check if some 1-byte structures need to be set transparent
if self._blauto is not None:
l = self._blauto() >> 3
else:
l = char.len_byte()
if l < len(self._content)-1:
[o.set_trans(True) for o in self._content[l:]]
Envelope._from_char(self, char)
class _IEExtUint32(Envelope):
_GEN = (
Uint32('Val'),
Buf('ext', val=b'', rep=REPR_HEX)
)
class _LU8V(Envelope):
_GEN = (
Uint8('Len'),
Buf('Val', val=b'')
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['Len'].set_valauto(lambda: self['Val'].get_len())
self['Val'].set_blauto(lambda: self['Len'].get_val()<<3)
if 'rep' in kwargs:
self['Val']._rep = kwargs['rep']
class _LU16V(Envelope):
_GEN = (
Uint16('Len'),
Buf('Val', val=b'')
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['Len'].set_valauto(lambda: self['Val'].get_len())
self['Val'].set_blauto(lambda: self['Len'].get_val()<<3)
if 'rep' in kwargs:
self['Val']._rep = kwargs['rep']
class _LU16LU16V(Envelope):
_GEN = (
Uint16('Len'),
Sequence('Vals', GEN=_LU16V('LV'))
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['Len'].set_valauto(lambda: self['Vals'].get_len())
self['Vals'].set_blauto(lambda: self['Len'].get_val()<<3)
self['Vals']._tmpl._name = self._name
if 'rep' in kwargs:
self['Vals']._tmpl['Val']._rep = kwargs['rep']
#------------------------------------------------------------------------------#
# TS 29.244, section 8.1: Information Elements Format
#------------------------------------------------------------------------------#
PFCPIEType_dict = {
0 : 'Reserved',
1 : 'Create PDR',
2 : 'PDI',
3 : 'Create FAR',
4 : 'Forwarding Parameters',
5 : 'Duplicating Parameters',
6 : 'Create URR',
7 : 'Create QER',
8 : 'Created PDR',
9 : 'Update PDR',
10 : 'Update FAR',
11 : 'Update Forwarding Parameters',
12 : 'Update BAR (Session Report Response)',
13 : 'Update URR',
14 : 'Update QER',
15 : 'Remove PDR',
16 : 'Remove FAR',
17 : 'Remove URR',
18 : 'Remove QER',
19 : 'Cause',
20 : 'Source Interface',
21 : 'F-TEID',
22 : 'Network Instance',
23 : 'SDF Filter',
24 : 'Application ID',
25 : 'Gate Status',
26 : 'MBR',
27 : 'GBR',
28 : 'QER Correlation ID',
29 : 'Precedence',
30 : 'Transport Level Marking',
31 : 'Volume Threshold',
32 : 'Time Threshold',
33 : 'Monitoring Time',
34 : 'Subsequent Volume Threshold',
35 : 'Subsequent Time Threshold',
36 : 'Inactivity Detection Time',
37 : 'Reporting Triggers',
38 : 'Redirect Information',
39 : 'Report Type',
40 : 'Offending IE',
41 : 'Forwarding Policy',
42 : 'Destination Interface',
43 : 'UP Function Features',
44 : 'Apply Action',
45 : 'Downlink Data Service Information',
46 : 'Downlink Data Notification Delay',
47 : 'DL Buffering Duration',
48 : 'DL Buffering Suggested Packet Count',
49 : 'PFCPSMReq-Flags',
50 : 'PFCPSRRsp-Flags',
51 : 'Load Control Information',
52 : 'Sequence Number',
53 : 'Metric',
54 : 'Overload Control Information',
55 : 'Timer',
56 : 'PDR ID',
57 : 'F-SEID',
58 : 'Application ID\'s PFDs',
59 : 'PFD Context',
60 : 'Node ID',
61 : 'PFD Contents',
62 : 'Measurement Method',
63 : 'Usage Report Trigger',
64 : 'Measurement Period',
65 : 'FQ-CSID',
66 : 'Volume Measurement',
67 : 'Duration Measurement',
68 : 'Application Detection Information',
69 : 'Time of First Packet',
70 : 'Time of Last Packet',
71 : 'Quota Holding Time',
72 : 'Dropped DL Traffic Threshold',
73 : 'Volume Quota',
74 : 'Time Quota',
75 : 'Start Time',
76 : 'End Time',
77 : 'Query URR',
78 : 'Usage Report (Session Modification Response)',
79 : 'Usage Report (Session Deletion Response)',
80 : 'Usage Report (Session Report Request)',
81 : 'URR ID',
82 : 'Linked URR ID',
83 : 'Downlink Data Report',
84 : 'Outer Header Creation',
85 : 'Create BAR',
86 : 'Update BAR (Session Modification Request)',
87 : 'Remove BAR',
88 : 'BAR ID',
89 : 'CP Function Features',
90 : 'Usage Information',
91 : 'Application Instance ID',
92 : 'Flow Information',
93 : 'UE IP Address',
94 : 'Packet Rate',
95 : 'Outer Header Removal',
96 : 'Recovery Time Stamp',
97 : 'DL Flow Level Marking',
98 : 'Header Enrichment',
99 : 'Error Indication Report',
100 : 'Measurement Information',
101 : 'Node Report Type',
102 : 'User Plane Path Failure Report',
103 : 'Remote GTP-U Peer',
104 : 'UR-SEQN',
105 : 'Update Duplicating Parameters',
106 : 'Activate Predefined Rules ',
107 : 'Deactivate Predefined Rules ',
108 : 'FAR ID',
109 : 'QER ID',
110 : 'OCI Flags',
111 : 'Association Release Request',
112 : 'Graceful Release Period',
113 : 'PDN Type',
114 : 'Failed Rule ID',
115 : 'Time Quota Mechanism',
116 : 'Reserved',
117 : 'User Plane Inactivity Timer',
118 : 'Aggregated URRs',
119 : 'Multiplier',
120 : 'Aggregated URR ID',
121 : 'Subsequent Volume Quota',
122 : 'Subsequent Time Quota',
123 : 'RQI',
124 : 'QFI',
125 : 'Query URR Reference',
126 : 'Additional Usage Reports Information',
127 : 'Create Traffic Endpoint',
128 : 'Created Traffic Endpoint',
129 : 'Update Traffic Endpoint',
130 : 'Remove Traffic Endpoint',
131 : 'Traffic Endpoint ID',
132 : 'Ethernet Packet Filter',
133 : 'MAC Address',
134 : 'C-TAG',
135 : 'S-TAG',
136 : 'Ethertype',
137 : 'Proxying',
138 : 'Ethernet Filter ID',
139 : 'Ethernet Filter Properties',
140 : 'Suggested Buffering Packets Count',
141 : 'User ID',
142 : 'Ethernet PDU Session Information',
143 : 'Ethernet Traffic Information',
144 : 'MAC Addresses Detected',
145 : 'MAC Addresses Removed',
146 : 'Ethernet Inactivity Timer',
147 : 'Additional Monitoring Time',
148 : 'Event Quota',
149 : 'Event Threshold',
150 : 'Subsequent Event Quota',
151 : 'Subsequent Event Threshold',
152 : 'Trace Information',
153 : 'Framed-Route',
154 : 'Framed-Routing',
155 : 'Framed-IPv6-Route',
156 : 'Time Stamp ',
157 : 'Averaging Window',
158 : 'Paging Policy Indicator',
159 : 'APN/DNN',
160 : '3GPP Interface Type',
161 : 'PFCPSRReq-Flags',
162 : 'PFCPAUReq-Flags',
163 : 'Activation Time',
164 : 'Deactivation Time',
165 : 'Create MAR',
166 : '3GPP Access Forwarding Action Information',
167 : 'Non-3GPP Access Forwarding Action Information',
168 : 'Remove MAR',
169 : 'Update MAR',
170 : 'MAR ID',
171 : 'Steering Functionality',
172 : 'Steering Mode',
173 : 'Weight',
174 : 'Priority',
175 : 'Update 3GPP Access Forwarding Action Information',
176 : 'Update Non 3GPP Access Forwarding Action Information',
177 : 'UE IP Address Pool Identity',
178 : 'Alternative SMF IP Address',
179 : 'Packet Replication and Detection Carry-On Information',
180 : 'SMF Set ID',
181 : 'Quota Validity Time',
182 : 'Number of Reports',
183 : 'Session Retention Information',
184 : 'PFCPASRsp-Flags',
185 : 'CP PFCP Entity IP Address',
186 : 'PFCPSEReq-Flags',
187 : 'User Plane Path Recovery Report',
188 : 'IP Multicast Addressing Info',
189 : 'Join IP Multicast Information',
190 : 'Leave IP Multicast Information',
191 : 'IP Multicast Address',
192 : 'Source IP Address',
193 : 'Packet Rate Status',
194 : 'Create Bridge Info for TSC',
195 : 'Created Bridge Info for TSC',
196 : 'DS-TT Port Number',
197 : 'NW-TT Port Number',
198 : 'TSN Bridge ID',
199 : 'TSC Management Information (Session Modification Request)',
200 : 'TSC Management Information (Session Modification Response)',
201 : 'TSC Management Information (Session Report Request)',
202 : 'Port Management Information Container',
203 : 'Clock Drift Control Information',
204 : 'Requested Clock Drift Information',
205 : 'Clock Drift Report',
206 : 'TSN Time Domain Number',
207 : 'Time Offset Threshold',
208 : 'Cumulative RateRatio Threshold',
209 : 'Time Offset Measurement',
210 : 'Cumulative RateRatio Measurement',
211 : 'Remove SRR ',
212 : 'Create SRR ',
213 : 'Update SRR',
214 : 'Session Report',
215 : 'SRR ID',
216 : 'Access Availability Control Information',
217 : 'Requested Access Availability Information',
218 : 'Access Availability Report',
219 : 'Access Availability Information',
220 : 'Provide ATSSS Control Information',
221 : 'ATSSS Control Parameters',
222 : 'MPTCP Control Information',
223 : 'ATSSS-LL Control Information',
224 : 'PMF Control Information',
225 : 'MPTCP Parameters',
226 : 'ATSSS-LL Parameters',
227 : 'PMF Parameters',
228 : 'MPTCP Address Information',
229 : 'UE Link-Specific IP Address',
230 : 'PMF Address Information',
231 : 'ATSSS-LL Information',
232 : 'Data Network Access Identifier',
233 : 'UE IP Address Pool Information',
234 : 'Average Packet Delay',
235 : 'Minimum Packet Delay',
236 : 'Maximum Packet Delay',
237 : 'QoS Report Trigger',
238 : 'GTP-U Path QoS Control Information',
239 : 'GTP-U Path QoS Report',
240 : 'QoS Information',
241 : 'GTP-U Path Interface Type',
242 : 'QoS Monitoring per QoS flow Control Information',
243 : 'Requested QoS Monitoring',
244 : 'Reporting Frequency',
245 : 'Packet Delay Thresholds',
246 : 'Minimum Wait Time',
247 : 'QoS Monitoring Report',
248 : 'QoS Monitoring Measurement',
249 : 'MT-EDT Control Information',
250 : 'DL Data Packets Size',
251 : 'QER Control Indications',
252 : 'Packet Rate Status Report',
253 : 'NF Instance ID',
254 : 'Ethernet Context Information',
255 : 'Redundant Transmission Detection Parameters',
256 : 'Updated PDR',
257 : 'S-NSSAI',
258 : 'IP version',
259 : 'PFCPASReq-Flags',
260 : 'Data Status',
261 : 'Provide RDS Configuration Information',
262 : 'RDS Configuration Information',
263 : 'Query Packet Rate Status',
264 : 'Packet Rate Status Report (Session Modification Response)',
265 : 'MPTCP Applicable Indication',
266 : 'Bridge Management Information Container',
267 : 'UE IP Address Usage Information',
268 : 'Number of UE IP Addresses',
269 : 'Validity Timer',
270 : 'Redundant Transmission Forwarding Parameters',
271 : 'Transport Delay Reporting',
272 : 'Partial Failure Information (Session Establishment Response) ',
273 : 'Partial Failure Information (Session Modification Response) ',
274 : 'Offending IE Information',
275 : 'RAT Type',
}
PFCPIEType = IntEnum('PFCPIEType', {strip_name(v): k for k, v in PFCPIEType_dict.items()})
class PFCPIE(Envelope):
"""PFCP Information Element
"""
# this is to decode the content of the Data into each specific IE structure
DECODE_IE_DATA = True
_GEN = (
Uint16('Type', val=0, dic=PFCPIEType_dict),
Uint16('Len'),
Uint16('EID', rep=REPR_HEX),
Buf('Data', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['Len'].set_valauto(lambda: self['Data'].get_len() + (2 if self['Type'].get_val() & 0x8000 else 0))
self['EID'].set_transauto(lambda: False if self['Type'].get_val() & 0x8000 else True)
self['Data'].set_blauto(lambda: (self['Len'].get_val() - (2 if self['Type'].get_val() & 0x8000 else 0)) << 3)
def set_val(self, val):
t, d = None, None
if isinstance(val, (tuple, list)):
if len(val) > 3:
t, d = val[0], val[3]
elif val:
t = val[0]
elif isinstance(val, dict):
if 'Type' in val:
t = val['Type']
if 'Data' in val:
d = val['Data']
if t and t in PFCPIELUT and not isinstance(d, bytes_types):
self.set_ie_class(t)
Envelope.set_val(self, val)
def _from_char(self, char):
if self.DECODE_IE_DATA:
t = char.to_uint(16)
if t in PFCPIELUT:
self.set_ie_class(t)
Envelope._from_char(self, char)
def set_ie_class(self, t):
"""replace the default Data buffer with a specifically defined class structure
according to the IE Type value `t'
"""
IE = PFCPIELUT[t]('Data')
if not hasattr(IE, '_bl') or IE._bl is None:
IE.set_blauto(lambda: (self['Len'].get_val() - (2 if self['Type'].get_val() & 0x8000 else 0)) << 3)
self.replace(self['Data'], IE)
class PFCPIEs(Sequence):
"""PFCP Grouped Information Element
"""
# for mandatory / optional IE types
MAND = ()
OPT = ()
#
_GEN = PFCPIE()
def __init__(self, *args, **kwargs):
Sequence.__init__(self, *args, **kwargs)
if 'mand' in kwargs:
ids = kwargs['mand']
assert( isinstance(ids, (tuple, list)) and all([isinstance(i, integer_types) for i in ids]) )
self.MAND = tuple(ids)
if 'opt' in kwargs:
ids = kwargs['opt']
assert( isinstance(ids, (tuple, list)) and all([isinstance(i, integer_types) for i in ids]) )
self.OPT = tuple(ids)
def chk_comp(self):
"""check the compliance of the sequence of IEs against the list of mandatory
IEs and the potential presence of unexpected IEs
return 2 lists
1st contains the list of missing mandatory IE types
2nd contains the list of unexpected IE types
"""
# check the sequence of PFCP IEs for errors against the list of mandatory
# and optional IEs
mand = list(self.MAND)
opt = list(self.OPT)
unex = []
if ie in self:
ie_type = ie['Type'].get_val()
if ie_type in mand:
mand.remove(ie_type)
elif ie_type in opt:
opt.remove(ie_type)
else:
unex.append(ie_type)
return mand, unex
#------------------------------------------------------------------------------#
# TS 29.244, section 7.4.3.1: PFCP PFD Management Request
#------------------------------------------------------------------------------#
# IE Type: 58
class ApplicationIDsPFDs(PFCPIEs):
MAND = (
PFCPIEType.ApplicationID.value,
)
OPT = (
PFCPIEType.PFDContext.value,
)
# IE Type: 59
class PFDContext(PFCPIEs):
MAND = (
PFCPIEType.PFDContents.value,
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.4.4.1: PFCP Association Setup Request
#------------------------------------------------------------------------------#
# IE Type: 183
class SessionRetentionInformation(PFCPIEs):
OPT = (
PFCPIEType.CPPFCPEntityIPAddress.value,
)
# IE Type: 233
class UEIPAddressPoolInformation(PFCPIEs):
MAND = (
PFCPIEType.UEIPAddressPoolIdentity.value,
)
OPT = (
PFCPIEType.NetworkInstance.value,
PFCPIEType.SNSSAI.value,
PFCPIEType.IPversion.value
)
# IE Type: 203
class ClockDriftControlInformation(PFCPIEs):
MAND = (
PFCPIEType.RequestedClockDriftInformation.value,
)
OPT = (
PFCPIEType.TSNTimeDomainNumber.value,
PFCPIEType.TimeOffsetThreshold.value,
PFCPIEType.CumulativeRateRatioThreshold.value
)
# IE Type: 238
class GTPUPathQoSControlInformation(PFCPIEs):
MAND = (
PFCPIEType.QoSReportTrigger.value,
)
OPT = (
PFCPIEType.RemoteGTPUPeer.value,
PFCPIEType.GTPUPathInterfaceType.value,
PFCPIEType.TransportLevelMarking.value,
PFCPIEType.MeasurementPeriod.value,
PFCPIEType.AveragePacketDelay.value,
PFCPIEType.MinimumPacketDelay.value,
PFCPIEType.MaximumPacketDelay.value,
PFCPIEType.Timer.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.4.4.3.1: UE IP Address Usage Information IE within PFCP Association Update Request
#------------------------------------------------------------------------------#
# IE Type: 267
class UEIPAddressUsageInformation(PFCPIEs):
MAND = (
PFCPIEType.SequenceNumber.value,
PFCPIEType.Metric.value,
PFCPIEType.ValidityTimer.value,
PFCPIEType.NumberofUEIPAddresses.value,
PFCPIEType.NetworkInstance.value
)
OPT = (
PFCPIEType.UEIPAddressPoolIdentity.value,
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.4.5.1.2: User Plane Path Failure Report IE within PFCP Node Report Request
#------------------------------------------------------------------------------#
# IE Type: 102
class UserPlanePathFailureReport(PFCPIEs):
MAND = (
PFCPIEType.RemoteGTPUPeer.value,
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.4.5.1.3: User Plane Path Recovery Report IE within PFCP Node Report Request
#------------------------------------------------------------------------------#
# IE Type: 187
class UserPlanePathRecoveryReport(PFCPIEs):
MAND = (
PFCPIEType.RemoteGTPUPeer.value,
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.4.5.1.4: Clock Drift Report IE within PFCP Node Report Request
#------------------------------------------------------------------------------#
# IE Type: 205
class ClockDriftReport(PFCPIEs):
MAND = (
PFCPIEType.TSNTimeDomainNumber.value,
)
OPT = (
PFCPIEType.TimeOffsetMeasurement.value,
PFCPIEType.CumulativeRateRatioMeasurement.value,
PFCPIEType.TimeStamp.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.4.5.1.5: GTP-U Path QoS Report IE within PFCP Node Report Request
#------------------------------------------------------------------------------#
# IE Type: 239
class GTPUPathQoSReport(PFCPIEs):
MAND = (
PFCPIEType.RemoteGTPUPeer.value,
PFCPIEType.QoSReportTrigger.value,
PFCPIEType.TimeStamp.value,
PFCPIEType.QoSInformation.value
)
OPT = (
PFCPIEType.GTPUPathInterfaceType.value,
PFCPIEType.StartTime.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.4.5.1.6: QoS Information in GTP-U Path QoS Report IE
#------------------------------------------------------------------------------#
# IE Type: 240
class QoSInformation(PFCPIEs):
MAND = (
PFCPIEType.AveragePacketDelay.value,
)
OPT = (
PFCPIEType.MinimumPacketDelay.value,
PFCPIEType.MaximumPacketDelay.value,
PFCPIEType.TransportLevelMarking.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.2.2: Create PDR IE within PFCP Session Establishment Request
#------------------------------------------------------------------------------#
# IE Type: 1
class CreatePDR(PFCPIEs):
MAND = (
PFCPIEType.PDRID.value,
PFCPIEType.Precedence.value,
PFCPIEType.PDI.value
)
OPT = (
PFCPIEType.OuterHeaderRemoval.value,
PFCPIEType.FARID.value,
PFCPIEType.URRID.value,
PFCPIEType.QERID.value,
PFCPIEType.ActivatePredefinedRules.value,
PFCPIEType.ActivationTime.value,
PFCPIEType.DeactivationTime.value,
PFCPIEType.MARID.value,
PFCPIEType.PacketReplicationandDetectionCarryOnInformation.value,
PFCPIEType.IPMulticastAddressingInfo.value,
PFCPIEType.UEIPAddressPoolIdentity.value,
PFCPIEType.MPTCPApplicableIndication.value,
PFCPIEType.TransportDelayReporting.value
)
# IE Type: 2
class PDI(PFCPIEs):
MAND = (
PFCPIEType.SourceInterface.value,
)
OPT = (
PFCPIEType.FTEID.value,
PFCPIEType.NetworkInstance.value,
PFCPIEType.RedundantTransmissionDetectionParameters.value,
PFCPIEType.UEIPAddress.value,
PFCPIEType.TrafficEndpointID.value,
PFCPIEType.SDFFilter.value,
PFCPIEType.ApplicationID.value,
PFCPIEType.EthernetPDUSessionInformation.value,
PFCPIEType.EthernetPacketFilter.value,
PFCPIEType.QFI.value,
PFCPIEType.FramedRoute.value,
PFCPIEType.FramedRouting.value,
PFCPIEType.FramedIPv6Route.value,
PFCPIEType.TGPPInterfaceType.value,
PFCPIEType.IPMulticastAddressingInfo.value
)
# IE Type: 132
class EthernetPacketFilter(PFCPIEs):
OPT = (
PFCPIEType.EthernetFilterID.value,
PFCPIEType.EthernetFilterProperties.value,
PFCPIEType.MACAddress.value,
PFCPIEType.Ethertype.value,
PFCPIEType.CTAG.value,
PFCPIEType.STAG.value,
PFCPIEType.SDFFilter.value,
)
# IE Type: 188
class IPMulticastAddressingInfo(PFCPIEs):
MAND = (
PFCPIEType.IPMulticastAddress.value,
)
OPT = (
PFCPIEType.SourceIPAddress.value,
)
# IE Type: 255
class RedundantTransmissionDetectionParameters(PFCPIEs):
MAND = (
PFCPIEType.FTEID.value,
)
OPT = (
PFCPIEType.NetworkInstance.value,
)
# IE Type: 271
class TransportDelayReporting(PFCPIEs):
MAND = (
PFCPIEType.RemoteGTPUPeer.value,
)
OPT = (
PFCPIEType.TransportLevelMarking.value,
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.2.3: Create FAR IE within PFCP Session Establishment Request
#------------------------------------------------------------------------------#
# IE Type: 3
class CreateFAR(PFCPIEs):
MAND = (
PFCPIEType.FARID.value,
PFCPIEType.ApplyAction.value,
)
OPT = (
PFCPIEType.ForwardingParameters.value,
PFCPIEType.DuplicatingParameters.value,
PFCPIEType.BARID.value,
PFCPIEType.RedundantTransmissionForwardingParameters.value
)
# IE Type: 4
class ForwardingParameters(PFCPIEs):
MAND = (
PFCPIEType.DestinationInterface.value,
)
OPT = (
PFCPIEType.NetworkInstance.value,
PFCPIEType.RedirectInformation.value,
PFCPIEType.OuterHeaderCreation.value,
PFCPIEType.TransportLevelMarking.value,
PFCPIEType.ForwardingPolicy.value,
PFCPIEType.HeaderEnrichment.value,
PFCPIEType.TrafficEndpointID.value,
PFCPIEType.Proxying.value,
PFCPIEType.TGPPInterfaceType.value,
PFCPIEType.DataNetworkAccessIdentifier.value
)
# IE Type: 5
class DuplicatingParameters(PFCPIEs):
MAND = (
PFCPIEType.DestinationInterface.value,
)
OPT = (
PFCPIEType.OuterHeaderCreation.value,
PFCPIEType.TransportLevelMarking.value,
PFCPIEType.ForwardingPolicy.value
)
# IE Type: 270
class RedundantTransmissionForwardingParameters(PFCPIEs):
MAND = (
PFCPIEType.OuterHeaderCreation.value,
)
OPT = (
PFCPIEType.NetworkInstance.value,
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.2.4: Create URR IE within PFCP Session Establishment Request
#------------------------------------------------------------------------------#
# IE Type: 6
class CreateURR(PFCPIEs):
MAND = (
PFCPIEType.URRID.value,
PFCPIEType.MeasurementMethod.value,
PFCPIEType.ReportingTriggers.value
)
OPT = (
PFCPIEType.MeasurementPeriod.value,
PFCPIEType.VolumeThreshold.value,
PFCPIEType.VolumeQuota.value,
PFCPIEType.EventThreshold.value,
PFCPIEType.EventQuota.value,
PFCPIEType.TimeThreshold.value,
PFCPIEType.TimeQuota.value,
PFCPIEType.QuotaHoldingTime.value,
PFCPIEType.DroppedDLTrafficThreshold.value,
PFCPIEType.QuotaValidityTime.value,
PFCPIEType.MonitoringTime.value,
PFCPIEType.SubsequentVolumeThreshold.value,
PFCPIEType.SubsequentTimeThreshold.value,
PFCPIEType.SubsequentVolumeQuota.value,
PFCPIEType.SubsequentTimeQuota.value,
PFCPIEType.SubsequentEventThreshold.value,
PFCPIEType.SubsequentEventQuota.value,
PFCPIEType.InactivityDetectionTime.value,
PFCPIEType.LinkedURRID.value,
PFCPIEType.MeasurementInformation.value,
PFCPIEType.TimeQuotaMechanism.value,
PFCPIEType.AggregatedURRs.value,
PFCPIEType.FARID.value,
PFCPIEType.EthernetInactivityTimer.value,
PFCPIEType.AdditionalMonitoringTime.value,
PFCPIEType.NumberofReports.value,
PFCPIEType.ApplicationID.value,
PFCPIEType.SDFFilter.value
)
# IE Type: 118
class AggregatedURRs(PFCPIEs):
MAND = (
PFCPIEType.AggregatedURRID.value,
PFCPIEType.Multiplier.value
)
# IE Type: 147
class AdditionalMonitoringTime(PFCPIEs):
MAND = (
PFCPIEType.MonitoringTime.value,
)
OPT = (
PFCPIEType.SubsequentVolumeThreshold.value,
PFCPIEType.SubsequentTimeThreshold.value,
PFCPIEType.SubsequentVolumeQuota.value,
PFCPIEType.SubsequentTimeQuota.value,
PFCPIEType.EventThreshold.value,
PFCPIEType.EventQuota.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.2.5: Create QER IE within PFCP Session Establishment Request
#------------------------------------------------------------------------------#
# IE Type: 7
class CreateQER(PFCPIEs):
MAND = (
PFCPIEType.QERID.value,
PFCPIEType.GateStatus.value
)
OPT = (
PFCPIEType.QERCorrelationID.value,
PFCPIEType.MBR.value,
PFCPIEType.GBR.value,
PFCPIEType.PacketRate.value,
PFCPIEType.PacketRateStatus.value,
PFCPIEType.DLFlowLevelMarking.value,
PFCPIEType.QFI.value,
PFCPIEType.RQI.value,
PFCPIEType.PagingPolicyIndicator.value,
PFCPIEType.AveragingWindow.value,
PFCPIEType.QERControlIndications.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.2.6: Create BAR IE within PFCP Session Establishment Request
#------------------------------------------------------------------------------#
# IE Type: 85
class CreateBAR(PFCPIEs):
MAND = (
PFCPIEType.BARID.value,
)
OPT = (
PFCPIEType.DownlinkDataNotificationDelay.value,
PFCPIEType.SuggestedBufferingPacketsCount.value,
PFCPIEType.MTEDTControlInformation.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.2.7: Create Traffic Endpoint IE within PFCP Session Establishment Request
#------------------------------------------------------------------------------#
# IE Type:
class CreateTrafficEndpoint(PFCPIEs):
MAND = (
PFCPIEType.TrafficEndpointID.value,
)
OPT = (
PFCPIEType.FTEID.value,
PFCPIEType.NetworkInstance.value,
PFCPIEType.RedundantTransmissionDetectionParameters.value,
PFCPIEType.UEIPAddress.value,
PFCPIEType.EthernetPDUSessionInformation.value,
PFCPIEType.FramedRoute.value,
PFCPIEType.FramedRouting.value,
PFCPIEType.FramedIPv6Route.value,
PFCPIEType.QFI.value,
PFCPIEType.TGPPInterfaceType.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.2.8: Create MAR IE within PFCP Session Establishment Request
#------------------------------------------------------------------------------#
# IE Type: 165
class CreateMAR(PFCPIEs):
MAND = (
PFCPIEType.MARID.value,
PFCPIEType.SteeringFunctionality.value,
PFCPIEType.SteeringMode.value
)
OPT = (
PFCPIEType.TGPPAccessForwardingActionInformation.value,
PFCPIEType.Non3GPPAccessForwardingActionInformation.value
)
# IE Type: 166
class TGPPAccessForwardingActionInformation(PFCPIEs):
MAND = (
PFCPIEType.FARID.value,
)
OPT = (
PFCPIEType.Weight.value,
PFCPIEType.Priority.value,
PFCPIEType.URRID.value
)
# IE Type: 167
class Non3GPPAccessForwardingActionInformation(PFCPIEs):
MAND = (
PFCPIEType.FARID.value,
)
OPT = (
PFCPIEType.Weight.value,
PFCPIEType.Priority.value,
PFCPIEType.URRID.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.2.9: Create SRR IE within PFCP Session Establishment Request
#------------------------------------------------------------------------------#
# IE Type: 212
class CreateSRR(PFCPIEs):
MAND = (
PFCPIEType.SRRID.value,
)
OPT = (
PFCPIEType.AccessAvailabilityControlInformation.value,
PFCPIEType.QoSMonitoringperQoSflowControlInformation.value
)
# IE Type: 216
class AccessAvailabilityControlInformation(PFCPIEs):
MAND = (
PFCPIEType.RequestedAccessAvailabilityInformation.value,
)
# IE Type: 242
class QoSMonitoringperQoSflowControlInformation(PFCPIEs):
MAND = (
PFCPIEType.QFI.value,
PFCPIEType.RequestedQoSMonitoring.value,
PFCPIEType.ReportingFrequency.value
)
OPT = (
PFCPIEType.PacketDelayThresholds.value,
PFCPIEType.MinimumWaitTime.value,
PFCPIEType.MeasurementPeriod.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.2.10: Provide ATSSS Control Information IE within PFCP Session Establishment Request
#------------------------------------------------------------------------------#
# IE Type: 220
class ProvideATSSSControlInformation(PFCPIEs):
OPT = (
PFCPIEType.MPTCPControlInformation.value,
PFCPIEType.ATSSSLLControlInformation.value,
PFCPIEType.PMFControlInformation.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.2.11: Provide RDS Configuration Information IE within PFCP Session Establishment Request
#------------------------------------------------------------------------------#
# IE Type: 261
class ProvideRDSConfigurationInformation(PFCPIEs):
OPT = (
PFCPIEType.RDSConfigurationInformation.value,
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.3: PFCP Session Establishment Response
#------------------------------------------------------------------------------#
# IE Type: 272
class PartialFailureInformationSessionEstablishmentResponse(PFCPIEs):
MAND = (
PFCPIEType.FailedRuleID.value,
PFCPIEType.Cause.value,
PFCPIEType.OffendingIEInformation.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.3.2: Created PDR IE within PFCP Session Establishment Response
#------------------------------------------------------------------------------#
# IE Type: 8
class CreatedPDR(PFCPIEs):
MAND = (
PFCPIEType.PDRID.value,
)
OPT = (
PFCPIEType.FTEID.value,
PFCPIEType.FTEID.value,
PFCPIEType.UEIPAddress.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.3.3: Load Control Information IE within PFCP Session Establishment Response
#------------------------------------------------------------------------------#
# IE Type: 51
class LoadControlInformation(PFCPIEs):
MAND = (
PFCPIEType.SequenceNumber.value,
PFCPIEType.Metric.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.3.4: Overload Control Information IE within PFCP Session Establishment Response
#------------------------------------------------------------------------------#
# IE Type: 54
class OverloadControlInformation(PFCPIEs):
MAND = (
PFCPIEType.SequenceNumber.value,
PFCPIEType.Metric.value,
PFCPIEType.Timer.value
)
OPT = (
PFCPIEType.OCIFlags.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.3.5: Created Traffic Endpoint IE within PFCP Session Establishment Response
#------------------------------------------------------------------------------#
# IE Type: 128
class CreatedTrafficEndpoint(PFCPIEs):
MAND = (
PFCPIEType.TrafficEndpointID.value,
)
OPT = (
PFCPIEType.FTEID.value,
PFCPIEType.FTEID.value,
PFCPIEType.UEIPAddress.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.3.6: Created Bridge Info for TSC IE within PFCP Session Establishment Response
#------------------------------------------------------------------------------#
# IE Type: 195
class CreatedBridgeInfoforTSC(PFCPIEs):
OPT = (
PFCPIEType.DSTTPortNumber.value,
PFCPIEType.TSNBridgeID.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.3.7: ATSSS Control Parameters IE within PFCP Session Establishment Response
#------------------------------------------------------------------------------#
# IE Type: 221
class ATSSSControlParameters(PFCPIEs):
OPT = (
PFCPIEType.MPTCPParameters.value,
PFCPIEType.ATSSSLLParameters.value,
PFCPIEType.PMFParameters.value
)
# IE Type: 225
class MPTCPParameters(PFCPIEs):
MAND = (
PFCPIEType.MPTCPAddressInformation.value,
PFCPIEType.UELinkSpecificIPAddress.value
)
# IE Type: 226
class ATSSSLLParameters(PFCPIEs):
MAND = (
PFCPIEType.ATSSSLLInformation.value,
)
# IE Type: 227
class PMFParameters(PFCPIEs):
MAND = (
PFCPIEType.PMFAddressInformation.value,
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.4.2: Update PDR IE within PFCP Session Modification Request
#------------------------------------------------------------------------------#
# IE Type: 9
class UpdatePDR(PFCPIEs):
MAND = (
PFCPIEType.PDRID.value,
)
OPT = (
PFCPIEType.OuterHeaderRemoval.value,
PFCPIEType.Precedence.value,
PFCPIEType.PDI.value,
PFCPIEType.FARID.value,
PFCPIEType.URRID.value,
PFCPIEType.QERID.value,
PFCPIEType.ActivatePredefinedRules.value,
PFCPIEType.DeactivatePredefinedRules.value,
PFCPIEType.ActivationTime.value,
PFCPIEType.DeactivationTime.value,
PFCPIEType.IPMulticastAddressingInfo.value,
PFCPIEType.TransportDelayReporting.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.4.3: Update FAR IE within PFCP Session Modification Request
#------------------------------------------------------------------------------#
# IE Type: 10
class UpdateFAR(PFCPIEs):
MAND = (
PFCPIEType.FARID.value,
)
OPT = (
PFCPIEType.ApplyAction.value,
PFCPIEType.UpdateForwardingParameters.value,
PFCPIEType.UpdateDuplicatingParameters.value,
PFCPIEType.RedundantTransmissionForwardingParameters.value,
PFCPIEType.BARID.value
)
# IE Type: 11
class UpdateForwardingParameters(PFCPIEs):
OPT = (
PFCPIEType.DestinationInterface.value,
PFCPIEType.NetworkInstance.value,
PFCPIEType.RedirectInformation.value,
PFCPIEType.OuterHeaderCreation.value,
PFCPIEType.TransportLevelMarking.value,
PFCPIEType.ForwardingPolicy.value,
PFCPIEType.HeaderEnrichment.value,
PFCPIEType.PFCPSMReqFlags.value,
PFCPIEType.TrafficEndpointID.value,
PFCPIEType.TGPPInterfaceType.value,
PFCPIEType.DataNetworkAccessIdentifier.value
)
# IE Type: 105
class UpdateDuplicatingParameters(PFCPIEs):
OPT = (
PFCPIEType.DestinationInterface.value,
PFCPIEType.OuterHeaderCreation.value,
PFCPIEType.TransportLevelMarking.value,
PFCPIEType.ForwardingPolicy.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.4.4: Update URR IE within PFCP Session Modification Request
#------------------------------------------------------------------------------#
# IE Type: 13
class UpdateURR(PFCPIEs):
MAND = (
PFCPIEType.URRID.value,
)
OPT = (
PFCPIEType.MeasurementMethod.value,
PFCPIEType.ReportingTriggers.value,
PFCPIEType.MeasurementPeriod.value,
PFCPIEType.VolumeThreshold.value,
PFCPIEType.VolumeQuota.value,
PFCPIEType.TimeThreshold.value,
PFCPIEType.TimeQuota.value,
PFCPIEType.EventThreshold.value,
PFCPIEType.EventQuota.value,
PFCPIEType.QuotaHoldingTime.value,
PFCPIEType.DroppedDLTrafficThreshold.value,
PFCPIEType.QuotaValidityTime.value,
PFCPIEType.MonitoringTime.value,
PFCPIEType.SubsequentVolumeThreshold.value,
PFCPIEType.SubsequentTimeThreshold.value,
PFCPIEType.SubsequentVolumeQuota.value,
PFCPIEType.SubsequentTimeQuota.value,
PFCPIEType.SubsequentEventThreshold.value,
PFCPIEType.SubsequentEventQuota.value,
PFCPIEType.InactivityDetectionTime.value,
PFCPIEType.LinkedURRID.value,
PFCPIEType.MeasurementInformation.value,
PFCPIEType.TimeQuotaMechanism.value,
PFCPIEType.AggregatedURRs.value,
PFCPIEType.FARID.value,
PFCPIEType.EthernetInactivityTimer.value,
PFCPIEType.AdditionalMonitoringTime.value,
PFCPIEType.NumberofReports.value,
PFCPIEType.ApplicationID.value,
PFCPIEType.SDFFilter.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.4.5: Update QER IE within PFCP Session Modification Request
#------------------------------------------------------------------------------#
# IE Type: 14
class UpdateQER(PFCPIEs):
MAND = (
PFCPIEType.QERID.value,
)
OPT = (
PFCPIEType.QERCorrelationID.value,
PFCPIEType.GateStatus.value,
PFCPIEType.MBR.value,
PFCPIEType.GBR.value,
PFCPIEType.PacketRate.value,
PFCPIEType.DLFlowLevelMarking.value,
PFCPIEType.QFI.value,
PFCPIEType.RQI.value,
PFCPIEType.PagingPolicyIndicator.value,
PFCPIEType.AveragingWindow.value,
PFCPIEType.QERControlIndications.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.4.6: Remove PDR IE within PFCP Session Modification Request
#------------------------------------------------------------------------------#
# IE Type: 15
class RemovePDR(PFCPIEs):
MAND = (
PFCPIEType.PDRID.value,
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.4.7: Remove FAR IE within PFCP Session Modification Request
#------------------------------------------------------------------------------#
# IE Type: 16
class RemoveFAR(PFCPIEs):
MAND = (
PFCPIEType.FARID.value,
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.4.8: Remove URR IE within PFCP Session Modification Request
#------------------------------------------------------------------------------#
# IE Type: 17
class RemoveURR(PFCPIEs):
MAND = (
PFCPIEType.URRID.value,
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.4.9: Remove QER IE within PFCP Session Modification Request
#------------------------------------------------------------------------------#
# IE Type: 18
class RemoveQER(PFCPIEs):
MAND = (
PFCPIEType.QERID.value,
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.4.10: Query URR IE within PFCP Session Modification Request
#------------------------------------------------------------------------------#
# IE Type: 77
class QueryURR(PFCPIEs):
MAND = (
PFCPIEType.URRID.value,
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.4.11: Update BAR IE within PFCP Session Modification Request
#------------------------------------------------------------------------------#
# IE Type: 86
class UpdateBARSessionModificationRequest(PFCPIEs):
MAND = (
PFCPIEType.BARID.value,
)
OPT = (
PFCPIEType.DownlinkDataNotificationDelay.value,
PFCPIEType.SuggestedBufferingPacketsCount.value,
PFCPIEType.MTEDTControlInformation.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.4.12: Remove BAR IE within PFCP Session Modification Request
#------------------------------------------------------------------------------#
# IE Type: 87
class RemoveBAR(PFCPIEs):
MAND = (
PFCPIEType.BARID.value,
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.4.13: Update Traffic Endpoint IE within PFCP Session Modification Request
#------------------------------------------------------------------------------#
# IE Type: 129
class UpdateTrafficEndpoint(PFCPIEs):
MAND = (
PFCPIEType.TrafficEndpointID.value,
)
OPT = (
PFCPIEType.FTEID.value,
PFCPIEType.NetworkInstance.value,
PFCPIEType.RedundantTransmissionDetectionParameters.value,
PFCPIEType.UEIPAddress.value,
PFCPIEType.FramedRoute.value,
PFCPIEType.FramedRouting.value,
PFCPIEType.FramedIPv6Route.value,
PFCPIEType.QFI.value,
PFCPIEType.TGPPInterfaceType.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.4.14: Remove Traffic Endpoint IE within PFCP Session Modification Request
#------------------------------------------------------------------------------#
# IE Type: 130
class RemoveTrafficEndpoint(PFCPIEs):
MAND = (
PFCPIEType.TrafficEndpointID.value,
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.4.15: Remove MAR IE within PFCP Session Modification Request
#------------------------------------------------------------------------------#
# IE Type: 168
class RemoveMAR(PFCPIEs):
MAND = (
PFCPIEType.MARID.value,
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.4.16: Update MAR IE within PFCP Session Modification Request
#------------------------------------------------------------------------------#
# IE Type: 169
class UpdateMAR(PFCPIEs):
MAND = (
PFCPIEType.MARID.value,
)
OPT = (
PFCPIEType.SteeringFunctionality.value,
PFCPIEType.SteeringMode.value,
PFCPIEType.Update3GPPAccessForwardingActionInformation.value,
PFCPIEType.UpdateNon3GPPAccessForwardingActionInformation.value,
PFCPIEType.TGPPAccessForwardingActionInformation.value,
PFCPIEType.Non3GPPAccessForwardingActionInformation.value
)
# IE Type: 175
class Update3GPPAccessForwardingActionInformation(PFCPIEs):
OPT = (
PFCPIEType.FARID.value,
PFCPIEType.Weight.value,
PFCPIEType.Priority.value,
PFCPIEType.URRID.value
)
# IE Type: 176
class UpdateNon3GPPAccessForwardingActionInformation(PFCPIEs):
OPT = (
PFCPIEType.FARID.value,
PFCPIEType.Weight.value,
PFCPIEType.Priority.value,
PFCPIEType.URRID.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.4.18: TSC Management Information IE within PFCP Session Modification Request
#------------------------------------------------------------------------------#
# IE Type: 199
class TSCManagementInformationSessionModificationRequest(PFCPIEs):
OPT = (
PFCPIEType.PortManagementInformationContainer.value,
PFCPIEType.BridgeManagementInformationContainer.value,
PFCPIEType.NWTTPortNumber.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.4.19: Remove SRR IE within PFCP Session Modification Request
#------------------------------------------------------------------------------#
# IE Type: 211
class RemoveSRR(PFCPIEs):
MAND = (
PFCPIEType.SRRID.value,
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.4.20: Update SRR IE within PFCP Session Modification Request
#------------------------------------------------------------------------------#
# IE Type: 213
class UpdateSRR(PFCPIEs):
MAND = (
PFCPIEType.SRRID.value,
)
OPT = (
PFCPIEType.AccessAvailabilityControlInformation.value,
PFCPIEType.QoSMonitoringperQoSflowControlInformation.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.4.21: Ethernet Context Information within PFCP Session Modification Request
#------------------------------------------------------------------------------#
# IE Type: 254
class EthernetContextInformation(PFCPIEs):
MAND = (
PFCPIEType.MACAddressesDetected.value,
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.4.22: Query Packet Rate Status IE within PFCP Session Modification Request
#------------------------------------------------------------------------------#
# IE Type: 263
class QueryPacketRateStatus(PFCPIEs):
MAND = (
PFCPIEType.QERID.value,
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.5: PFCP Session Modification Response
#------------------------------------------------------------------------------#
# IE Type: 273
class PartialFailureInformationSessionModificationResponse(PFCPIEs):
MAND = (
PFCPIEType.FailedRuleID.value,
PFCPIEType.Cause.value,
PFCPIEType.OffendingIEInformation.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.5.2: Usage Report IE within PFCP Session Modification Response
#------------------------------------------------------------------------------#
# IE Type: 78
class UsageReportSessionModificationResponse(PFCPIEs):
MAND = (
PFCPIEType.URRID.value,
PFCPIEType.URSEQN.value,
PFCPIEType.UsageReportTrigger.value
)
OPT = (
PFCPIEType.StartTime.value,
PFCPIEType.EndTime.value,
PFCPIEType.VolumeMeasurement.value,
PFCPIEType.DurationMeasurement.value,
PFCPIEType.TimeofFirstPacket.value,
PFCPIEType.TimeofLastPacket.value,
PFCPIEType.UsageInformation.value,
PFCPIEType.QueryURRReference.value,
PFCPIEType.EthernetTrafficInformation.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.5.3: TSC Management Information IE within PFCP Session Modification Response
#------------------------------------------------------------------------------#
# IE Type: 200
class TSCManagementInformationSessionModificationResponse(PFCPIEs):
OPT = (
PFCPIEType.PortManagementInformationContainer.value,
PFCPIEType.BridgeManagementInformationContainer.value,
PFCPIEType.NWTTPortNumber.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.5.4: Packet Rate Status Report IE within PFCP Session Modification Response
#------------------------------------------------------------------------------#
# IE Type: 264
class PacketRateStatusReportSessionModificationResponse(PFCPIEs):
MAND = (
PFCPIEType.QERID.value,
PFCPIEType.PacketRateStatus.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.5.5: Updated PDR IE within PFCP Session Modification Response
#------------------------------------------------------------------------------#
# IE Type: 256
class UpdatedPDR(PFCPIEs):
MAND = (
PFCPIEType.PDRID.value,
)
OPT = (
PFCPIEType.FTEID.value,
PFCPIEType.FTEID.value,
PFCPIEType.UEIPAddress.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.7: PFCP Session Deletion Response
#------------------------------------------------------------------------------#
# IE Type: 252
class PacketRateStatusReport(PFCPIEs):
MAND = (
PFCPIEType.QERID.value,
PFCPIEType.PacketRateStatus.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.7.2: Usage Report IE within PFCP Session Deletion Response
#------------------------------------------------------------------------------#
# IE Type: 79
class UsageReportSessionDeletionResponse(PFCPIEs):
MAND = (
PFCPIEType.URRID.value,
PFCPIEType.URSEQN.value,
PFCPIEType.UsageReportTrigger.value
)
OPT = (
PFCPIEType.StartTime.value,
PFCPIEType.EndTime.value,
PFCPIEType.VolumeMeasurement.value,
PFCPIEType.DurationMeasurement.value,
PFCPIEType.TimeofFirstPacket.value,
PFCPIEType.TimeofLastPacket.value,
PFCPIEType.UsageInformation.value,
PFCPIEType.EthernetTrafficInformation.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.8.2: Downlink Data Report IE within PFCP Session Report Request
#------------------------------------------------------------------------------#
# IE Type: 83
class DownlinkDataReport(PFCPIEs):
MAND = (
PFCPIEType.PDRID.value,
)
OPT = (
PFCPIEType.DownlinkDataServiceInformation.value,
PFCPIEType.DLDataPacketsSize.value,
PFCPIEType.DataStatus.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.8.3: Usage Report IE within PFCP Session Report Request
#------------------------------------------------------------------------------#
# IE Type: 80
class UsageReportSessionReportRequest(PFCPIEs):
MAND = (
PFCPIEType.DownlinkDataServiceInformation.value,
PFCPIEType.DLDataPacketsSize.value,
PFCPIEType.DataStatus.value
)
OPT = (
PFCPIEType.StartTime.value,
PFCPIEType.EndTime.value,
PFCPIEType.VolumeMeasurement.value,
PFCPIEType.DurationMeasurement.value,
PFCPIEType.ApplicationDetectionInformation.value,
PFCPIEType.UEIPAddress.value,
PFCPIEType.NetworkInstance.value,
PFCPIEType.TimeofFirstPacket.value,
PFCPIEType.TimeofLastPacket.value,
PFCPIEType.UsageInformation.value,
PFCPIEType.QueryURRReference.value,
PFCPIEType.TimeStamp.value,
PFCPIEType.EthernetTrafficInformation.value,
PFCPIEType.JoinIPMulticastInformation.value,
PFCPIEType.LeaveIPMulticastInformation.value
)
# IE Type: 68
class ApplicationDetectionInformation(PFCPIEs):
MAND = (
PFCPIEType.ApplicationID.value,
)
OPT = (
PFCPIEType.ApplicationInstanceID.value,
PFCPIEType.FlowInformation.value,
PFCPIEType.PDRID.value
)
# IE Type: 143
class EthernetTrafficInformation(PFCPIEs):
OPT = (
PFCPIEType.MACAddressesDetected.value,
PFCPIEType.MACAddressesRemoved.value
)
# IE Type: 189
class JoinIPMulticastInformation(PFCPIEs):
MAND = (
PFCPIEType.IPMulticastAddress.value,
)
OPT = (
PFCPIEType.SourceIPAddress.value,
)
# IE Type: 190
class LeaveIPMulticastInformation(PFCPIEs):
MAND = (
PFCPIEType.IPMulticastAddress.value,
)
OPT = (
PFCPIEType.SourceIPAddress.value,
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.8.4: Error Indication Report IE within PFCP Session Report Reques
#------------------------------------------------------------------------------#
# IE Type: 99
class ErrorIndicationReport(PFCPIEs):
MAND = (
PFCPIEType.FTEID.value,
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.8.5 TSC: Management Information IE within PFCP Session Report Request
#------------------------------------------------------------------------------#
# IE Type: 201
class TSCManagementInformationSessionReportRequest(PFCPIEs):
OPT = (
PFCPIEType.PortManagementInformationContainer.value,
PFCPIEType.BridgeManagementInformationContainer.value,
PFCPIEType.NWTTPortNumber.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.8.6: Session Report IE within PFCP Session Report Request
#------------------------------------------------------------------------------#
# IE Type: 214
class SessionReport(PFCPIEs):
MAND = (
PFCPIEType.SRRID.value,
)
OPT = (
PFCPIEType.AccessAvailabilityReport.value,
PFCPIEType.QoSMonitoringReport.value,
)
# IE Type: 218
class AccessAvailabilityReport(PFCPIEs):
MAND = (
PFCPIEType.AccessAvailabilityInformation
)
# IE Type: 247
class QoSMonitoringReport(PFCPIEs):
MAND = (
PFCPIEType.QFI.value,
PFCPIEType.QoSMonitoringMeasurement.value,
PFCPIEType.TimeStamp.value
)
OPT = (
PFCPIEType.StartTime.value,
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.9.2: Update BAR IE within PFCP Session Report Response
#------------------------------------------------------------------------------#
# IE Type: 12
class UpdateBARSessionReportResponse(PFCPIEs):
MAND = (
PFCPIEType.BARID.value,
)
OPT = (
PFCPIEType.DownlinkDataNotificationDelay.value,
PFCPIEType.DLBufferingDuration.value,
PFCPIEType.DLBufferingSuggestedPacketCount.value,
PFCPIEType.SuggestedBufferingPacketsCount.value
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.1: Cause
#------------------------------------------------------------------------------#
Cause_dict = {
1 : 'Request accepted',
2 : 'More Usage Report to send',
3 : 'Request partially accepted',
64 : 'Request rejected (reason not specified)',
65 : 'Session context not found',
66 : 'Mandatory IE missing',
67 : 'Conditional IE missing',
68 : 'Invalid length',
69 : 'Mandatory IE incorrect',
70 : 'Invalid Forwarding Policy',
71 : 'Invalid F-TEID allocation option',
72 : 'No established PFCP Association ',
73 : 'Rule creation/modification Failure ',
74 : 'PFCP entity in congestion',
75 : 'No resources available',
76 : 'Service not supported',
77 : 'System failure',
78 : 'Redirection Requested',
79 : 'All dynamic addresses are occupied',
80 : 'Unknown Pre-defined Rule',
81 : 'Unknown Application ID',
}
# IE Type: 19
class Cause(Uint8):
_dic = Cause_dict
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.2: Source Interface
#------------------------------------------------------------------------------#
SourceInterface_dict = {
0 : 'Access',
1 : 'Core',
2 : 'SGi-LAN/N6-LAN',
3 : 'CP-function',
4 : '5G VN Internal'
}
# IE Type: 20
class SourceInterface(Envelope):
_GEN = (
Uint('spare', bl=4, rep=REPR_HEX),
Uint('If', bl=4, dic=SourceInterface_dict),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.3: F-TEID
#------------------------------------------------------------------------------#
# IE Type: 21
class FTEID(Envelope):
ENV_SEL_TRANS = False
_GEN = (
Uint('spare', bl=4, rep=REPR_HEX),
Uint('CHID', bl=1),
Uint('CH', bl=1),
Uint('V6', bl=1),
Uint('V4', bl=1),
Uint32('TEID'),
IPAddr('IPv4Addr', bl=32),
IPAddr('IPv6Addr', bl=128),
Uint8('CHOOSE_ID'),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['TEID'].set_transauto(lambda: True if self['CH'].get_val() else False)
self['IPv4Addr'].set_transauto(lambda: False if self['V4'].get_val() and not self['CH'].get_val() else True)
self['IPv6Addr'].set_transauto(lambda: False if self['V6'].get_val() and not self['CH'].get_val() else True)
self['CHOOSE_ID'].set_transauto(lambda: False if self['CHID'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.4: Network Instance
#------------------------------------------------------------------------------#
# IE Type: 22
class NetworkInstance(Buf):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.5: SDF Filter
#------------------------------------------------------------------------------#
# IE Type: 23
class SDFFilter(Envelope):
ENV_SEL_TRANS = False
_GEN = (
Uint('spare', bl=3, rep=REPR_HEX),
Uint('BID', bl=1),
Uint('FL', bl=1),
Uint('SPI', bl=1),
Uint('TTC', bl=1),
Uint('FD', bl=1),
Uint8('spare', rep=REPR_HEX),
_LU16V('FlowDesc', rep=REPR_HEX),
Buf('ToSTrafficClass', val=b'\0\0', bl=16, rep=REPR_HEX),
Buf('SecurityParameterIndex', val=b'\0\0\0\0', bl=32, rep=REPR_HEX),
Buf('FlowLabel', bal=b'\0\0\0', bl=24, rep=REPR_HEX),
Uint32('SDFFilterID'),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['FlowDesc'].set_transauto(lambda: False if self['FD'].get_val() else True)
self['ToSTrafficClass'].set_transauto(lambda: False if self['TTC'].get_val() else True)
self['SecurityParameterIndex'].set_transauto(lambda: False if self['SPI'].get_val() else True)
self['FlowLabel'].set_transauto(lambda: False if self['FL'].get_val() else True)
self['SDFFilterID'].set_transauto(lambda: False if self['BID'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.6: Application ID
#------------------------------------------------------------------------------#
# IE Type: 24
class ApplicationID(Buf):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.7: Gate Status
#------------------------------------------------------------------------------#
# IE Type: 25
class GateStatus(Envelope):
_GEN = (
Uint('spare', bl=4, rep=REPR_HEX),
Uint('ULGate', bl=2, dic={0: 'Open', 1: 'Close'}),
Uint('DLGate', bl=2, dic={0: 'Open', 1: 'Close'}),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.8: MBR
#------------------------------------------------------------------------------#
class _ULDLBR(Envelope):
_GEN = (
Uint('UL', bl=40), # in kbps
Uint('DL', bl=40), # in kbps
Buf('ext', val=b'', rep=REPR_HEX)
)
# IE Type: 26
class MBR(_ULDLBR):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.9: GBR
#------------------------------------------------------------------------------#
# IE Type: 27
class GBR(_ULDLBR):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.10: QER Correlation ID
#------------------------------------------------------------------------------#
# IE Type: 28
class QERCorrelationID(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.11: Precedence
#------------------------------------------------------------------------------#
# IE Type: 29
class Precedence(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.12: Transport Level Marking
#------------------------------------------------------------------------------#
# IE Type: 30
class TransportLevelMarking(Envelope):
_GEN = (
Buf('ToSTrafficClass', val=b'\0\0', bl=16, rep=REPR_HEX),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.13: Volume Threshold
#------------------------------------------------------------------------------#
class _Volume(Envelope):
ENV_SEL_TRANS = False
_GEN = (
Uint('spare', bl=5, rep=REPR_HEX),
Uint('DLVOL', bl=1),
Uint('ULVOL', bl=1),
Uint('TOVOL', bl=1),
Uint64('Total'),
Uint64('Uplink'),
Uint64('Downlink'),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['Total'].set_transauto(lambda: False if self['TOVOL'].get_val() else True)
self['Uplink'].set_transauto(lambda: False if self['ULVOL'].get_val() else True)
self['Downlink'].set_transauto(lambda: False if self['DLVOL'].get_val() else True)
# IE Type: 31
class VolumeThreshold(_Volume):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.14: Time Threshold
#------------------------------------------------------------------------------#
# IE Type: 32
class TimeThreshold(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.15: Monitoring Time
#------------------------------------------------------------------------------#
# IE Type: 33
class MonitoringTime(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.16: Subsequent Volume Threshold
#------------------------------------------------------------------------------#
# IE Type: 34
class SubsequentVolumeThreshold(VolumeThreshold):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.17: Subsequent Time Threshold
#------------------------------------------------------------------------------#
# IE Type: 35
class SubsequentTimeThreshold(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.18: Inactivity Detection Time
#------------------------------------------------------------------------------#
# IE Type: 36
class InactivityDetectionTime(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.19: Reporting Triggers
#------------------------------------------------------------------------------#
# IE Type: 37
class ReportingTriggers(BitFlags):
_GEN = (
Envelope('Octet1', GEN=(
Uint('LIUSA', bl=1),
Uint('DROTH', bl=1),
Uint('STOPT', bl=1),
Uint('START', bl=1),
Uint('QUHTI', bl=1),
Uint('TIMTH', bl=1),
Uint('VOLTH', bl=1),
Uint('PERIO', bl=1))),
Envelope('Octet2', GEN=(
Uint('QUVTI', bl=1),
Uint('IPMJL', bl=1),
Uint('EVEQU', bl=1),
Uint('EVETH', bl=1),
Uint('MACAR', bl=1),
Uint('ENVCL', bl=1),
Uint('TIMQU', bl=1),
Uint('VOLQU', bl=1))),
Envelope('Octet3', GEN=(
Uint('spare', bl=7, rep=REPR_HEX),
Uint('REEMR', bl=1))),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.20: Redirect Information
#------------------------------------------------------------------------------#
RedirectAccessType_dict = {
0 : 'IPv4 address',
1 : 'IPv6 address',
2 : 'URL',
3 : 'SIP URI',
4 : 'IPv4 and IPv6 addresses',
}
class _RedirectServerAddr(Envelope):
_GEN = (
Uint16('Len'),
UTF8String('Val')
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['Len'].set_valauto(lambda: self['Val'].get_len())
self['Val'].set_blauto(lambda: self['Len'].get_val()<<3)
# IE Type: 38
class RedirectInformation(Envelope):
ENV_SEL_TRANS = False
_GEN = (
Uint('spare', bl=4, rep=REPR_HEX),
Uint('RedirectAccessType', bl=4, dic=RedirectAccessType_dict),
_RedirectServerAddr('RedirectServerAddr'),
_RedirectServerAddr('OtherRedirectServerAddr'),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['OtherRedirectServerAddr'].set_transauto(lambda: False if self['RedirectAccessType'].get_val() == 4 else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.21: Report Type
#------------------------------------------------------------------------------#
# IE Type: 39
class ReportType(Envelope):
_GEN = (
Uint('spare', bl=1),
Uint('UISR', bl=1),
Uint('SESR', bl=1),
Uint('TMIR', bl=1),
Uint('UPIR', bl=1),
Uint('ERIR', bl=1),
Uint('USAR', bl=1),
Uint('DLDR', bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.22: Offending IE
#------------------------------------------------------------------------------#
# IE Type: 40
class OffendingIE(Uint16):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.23: Forwarding Policy
#------------------------------------------------------------------------------#
# IE Type: 41
class ForwardingPolicy(Envelope):
_GEN = (
Uint8('Len'),
Buf('ID', val=b'', rep=REPR_HEX),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['Len'].set_valauto(lambda: self['ID'].get_len())
self['ID'].set_blauto(lambda: self['Len'].get_val()<<3)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.24: Destination Interface
#------------------------------------------------------------------------------#
DestinationInterface_dict = {
0 : 'Access',
1 : 'Core',
2 : 'SGi-LAN/N6-LAN',
3 : 'CP- Function',
4 : 'LI Function',
5 : '5G VN Internal'
}
# IE Type: 42
class DestinationInterface(Envelope):
_GEN = (
Uint('spare', bl=4),
Uint('Val', bl=4, dic=DestinationInterface_dict),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.25: UP Function Features
#------------------------------------------------------------------------------#
# IE Type: 43
class UPFunctionFeatures(BitFlags):
_GEN = (
Envelope('Octet1', GEN=(
Uint('TREU', bl=1),
Uint('HEEU', bl=1),
Uint('PFDM', bl=1),
Uint('FTUP', bl=1),
Uint('TRST', bl=1),
Uint('DLBD', bl=1),
Uint('DDND', bl=1),
Uint('BUCP', bl=1))
),
Envelope('Octet2', GEN=(
Uint('EPFAR', bl=1),
Uint('PFDE', bl=1),
Uint('FRRT', bl=1),
Uint('TRACE', bl=1),
Uint('QUOAC', bl=1),
Uint('UDBC', bl=1),
Uint('PDIU', bl=1),
Uint('EMPU', bl=1))
),
Envelope('Octet3', GEN=(
Uint('GCOM', bl=1),
Uint('BUNDL', bl=1),
Uint('MTE', bl=1),
Uint('MNOP', bl=1),
Uint('SSET', bl=1),
Uint('UEIP', bl=1),
Uint('ADPDP', bl=1),
Uint('DPDRA', bl=1))
),
Envelope('Octet4', GEN=(
Uint('MPTCP', bl=1),
Uint('TSCU', bl=1),
Uint('IP6PL', bl=1),
Uint('IPTV', bl=1),
Uint('NORP', bl=1),
Uint('VTIME', bl=1),
Uint('RTTL', bl=1),
Uint('MPAS', bl=1))
),
Envelope('Octet5', GEN=(
Uint('RDS', bl=1),
Uint('DDDS', bl=1),
Uint('ETHAR', bl=1),
Uint('CIOT', bl=1),
Uint('MT-EDT', bl=1),
Uint('GPQM', bl=1),
Uint('QFQM', bl=1),
Uint('ATSSS-LL', bl=1))
),
Envelope('Octet6', GEN=(
Uint('spare', bl=5, rep=REPR_HEX),
Uint('NSPOC', bl=1),
Uint('QUASF', bl=1),
Uint('RTTWP', bl=1))
),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.26: Apply Action
#------------------------------------------------------------------------------#
# IE Type: 44
class ApplyAction(BitFlags):
_GEN = (
Envelope('Octet1', GEN=(
Uint('DFRT', bl=1),
Uint('IPMD', bl=1),
Uint('IPMA', bl=1),
Uint('DUPL', bl=1),
Uint('NOCP', bl=1),
Uint('BUFF', bl=1),
Uint('FORW', bl=1),
Uint('DROP', bl=1))),
Envelope('Octet2', GEN=(
Uint('spare', bl=5, rep=REPR_HEX),
Uint('DDPN', bl=1),
Uint('BDPN', bl=1),
Uint('EDRT', bl=1))),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.27: Downlink Data Service Information
#------------------------------------------------------------------------------#
class _IEUint6(Envelope):
_GEN = (
Uint('spare', bl=2),
Uint('Val', bl=6)
)
# IE Type: 45
class DownlinkDataServiceInformation(Envelope):
_GEN = (
Uint('spare', bl=6, rep=REPR_HEX),
Uint('QFII', bl=1),
Uint('PPI', bl=1),
_IEUint6('PagingPolicyInd'),
_IEUint6('QFI'),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['PagingPolicyInd'].set_transauto(lambda: False if self['PPI'].get_val() else True)
self['QFI'].set_transauto(lambda: False if self['QFII'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.28: Downlink Data Notification Delay
#------------------------------------------------------------------------------#
# IE Type: 46
class DownlinkDataNotificationDelay(Envelope):
_GEN = (
Uint8('Val', desc='multiple of 50ms'),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.29: DL Buffering Duration
#------------------------------------------------------------------------------#
TimerUnit_dict = {
0 : '2 sec',
1 : '1 min',
2 : '10 min',
3 : '1 hr',
4 : '10 hr',
7 : 'infinite'
}
class _Timer(Envelope):
_GEN = (
Uint('TimerUnit', bl=3, dic=TimerUnit_dict),
Uint('TimerVal', bl=5),
Buf('ext', val=b'', rep=REPR_HEX)
)
# IE Type: 47
class DLBufferingDuration(_Timer):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.30: DL Buffering Suggested Packet Count
#------------------------------------------------------------------------------#
# IE Type: 48
# this is an Uint, of the length indicated in the length prefix... life is such dangerous !
class DLBufferingSuggestedPacketCount(Uint):
# to get it properly working with pycrate_core, we need to set the bit length
# when a value is set
def set_val(self, val):
self._bl = val.bit_length()
if self._bl % 8:
# need to increase the bl to the next multiple of 8 bits
self._bl += 8 - (self._bl % 8)
Uint.set_val(self, val)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.31: PFCPSMReq-Flags
#------------------------------------------------------------------------------#
# IE Type: 49
class PFCPSMReqFlags(Envelope):
_GEN = (
Uint('spare', bl=5, rep=REPR_HEX),
Uint('QAURR', bl=1),
Uint('SNDEM', bl=1),
Uint('DROBU', bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.32: PFCPSRRsp-Flags
#------------------------------------------------------------------------------#
# IE Type: 50
class PFCPSRRspFlags(Envelope):
_GEN = (
Uint('spare', bl=7, rep=REPR_HEX),
Uint('DROBU', val=1, bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.33: Sequence Number
#------------------------------------------------------------------------------#
# IE Type: 52
class SequenceNumber(Uint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.34: Metric
#------------------------------------------------------------------------------#
# IE Type: 53
class Metric(Uint8):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.35: Timer
#------------------------------------------------------------------------------#
# IE Type: 55
class Timer(_Timer):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.36: Packet Detection Rule ID (PDR ID)
#------------------------------------------------------------------------------#
# IE Type: 56
class PDRID(Envelope):
_GEN = (
Uint16('Val'),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.37: F-SEID
#------------------------------------------------------------------------------#
# IE Type: 57
class FSEID(Envelope):
ENV_SEL_TRANS = False
_GEN = (
Uint('spare', bl=6, rep=REPR_HEX),
Uint('V4', bl=1),
Uint('V6', bl=1),
Uint64('SEID'),
IPAddr('IPv4Addr', bl=32),
IPAddr('IPv6Addr', bl=128),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['IPv4Addr'].set_transauto(lambda: False if self['V4'].get_val() else True)
self['IPv6Addr'].set_transauto(lambda: False if self['V6'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.38: Node ID
#------------------------------------------------------------------------------#
NodeIDType_dict = {
0 : 'IPv4 address',
1 : 'IPv6 address',
2 : 'FQDN'
}
class FQDN(Sequence):
_GEN = _LU8V('Label')
def set_val(self, val):
if isinstance(val, str_types):
self.encode(val)
else:
Sequence.set_val(self, val)
def encode(self, val):
fqdn_labels = val.split('.')
Sequence.set_val(self, [{'Value': fqdn_label.encode()} for fqdn_label in fqdn_labels])
def decode(self):
return '.'.join([fqdn_label[1].decode() for fqdn_label in self.get_val()])
def repr(self):
# element transparency
if self.get_trans():
trans = ' [transparent]'
else:
trans = ''
# additional description
if self._desc:
desc = ' [%s]' % self._desc
else:
desc = ''
#
return '<%s%s%s : %s>' % \
(self._name, desc, trans, self.decode())
__repr__ = repr
def show(self):
return self.get_hier_abs() * ' ' + self.repr()
# IE Type: 60
class NodeID(Envelope):
_GEN = (
Uint('spare', bl=4),
Uint('Type', bl=4, dic=NodeIDType_dict),
Alt('Val', GEN={
0 : IPAddr('IPv4Addr', bl=32),
1 : IPAddr('IPv6Addr', bl=128),
2 : FQDN()},
DEFAULT=Buf('unk', val=b'', rep=REPR_HEX),
sel=lambda self: self.get_env()['Type'].get_val()
),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.39: PFD Contents
#------------------------------------------------------------------------------#
# IE Type: 61
class PFDContents(Envelope):
ENV_SEL_TRANS = False
_GEN = (
Uint('ADNP', bl=1),
Uint('AU', bl=1),
Uint('AFD', bl=1),
Uint('DNP', bl=1),
Uint('CP', bl=1),
Uint('DN', bl=1),
Uint('U', bl=1),
Uint('FD', bl=1),
Uint8('spare', rep=REPR_HEX),
_LU16V('FlowDesc', rep=REPR_HEX),
_LU16V('URL'),
_LU16V('DomainName'),
_LU16V('CustomPFDContent', rep=REPR_HEX),
_LU16V('DomainNameProtocol'),
_LU16LU16V('AdditionalFlowDesc'),
_LU16LU16V('AdditionalURL'),
_LU16LU16V('AdditionalDomainNameAndProtocol'),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['FlowDesc'].set_transauto(lambda: False if self['FD'].get_val() else True)
self['URL'].set_transauto(lambda: False if self['U'].get_val() else True)
self['DomainName'].set_transauto(lambda: False if self['DN'].get_val() else True)
self['CustomPFDContent'].set_transauto(lambda: False if self['CP'].get_val() else True)
self['DomainNameProtocol'].set_transauto(lambda: False if self['DNP'].get_val() else True)
self['AdditionalFlowDesc'].set_transauto(lambda: False if self['AFD'].get_val() else True)
self['AdditionalURL'].set_transauto(lambda: False if self['AU'].get_val() else True)
self['AdditionalDomainNameAndProtocol'].set_transauto(lambda: False if self['ADNP'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.40: Measurement Method
#------------------------------------------------------------------------------#
# IE Type: 62
class MeasurementMethod(Envelope):
_GEN = (
Uint('spare', bl=5, rep=REPR_HEX),
Uint('EVENT', bl=1),
Uint('VOLUM', bl=1),
Uint('DURAT', bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.41: Usage Report Trigger
#------------------------------------------------------------------------------#
# IE Type: 63
class UsageReportTrigger(BitFlags):
_GEN = (
Envelope('Octet1', GEN=(
Uint('IMMER', bl=1),
Uint('DROTH', bl=1),
Uint('STOPT', bl=1),
Uint('START', bl=1),
Uint('QUHTI', bl=1),
Uint('TIMTH', bl=1),
Uint('VOLTH', bl=1),
Uint('PERIO', bl=1))),
Envelope('Octet2', GEN=(
Uint('EVETH', bl=1),
Uint('MACAR', bl=1),
Uint('ENVCL', bl=1),
Uint('MONIT', bl=1),
Uint('TERMR', bl=1),
Uint('LIUSA', bl=1),
Uint('TIMQU', bl=1),
Uint('VOLQU', bl=1))),
Envelope('Octet3', GEN=(
Uint('spare', bl=3, rep=REPR_HEX),
Uint('EMRRE', bl=1),
Uint('QUVTI', bl=1),
Uint('IPMJL', bl=1),
Uint('TEBUR', bl=1),
Uint('EVEQU', bl=1))),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.42: Measurement Period
#------------------------------------------------------------------------------#
# IE Type: 64
class MeasurementPeriod(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.43: Fully qualified PDN Connection Set Identifier (FQ-CSID)
#------------------------------------------------------------------------------#
NodeType_dict = {
0 : 'MME',
1 : 'SGW-C',
2 : 'PGW-C',
3 : 'ePDG',
4 : 'TWAN',
5 : 'PGW-U/SGW-U'
}
# IE Type: 65
class FQCSID(Envelope):
_GEN = (
Uint('NodeIDType', bl=4, dic={0: 'IPv4', 1: 'IPv6', 2:'MCCMNC-based'}),
Uint('NumCSIDs', bl=4),
Alt('NodeAddr', GEN={
0 : IPAddr('IPv4Addr', bl=32),
1 : IPAddr('IPv6Addr', bl=128),
2 : Buf('MCCMNCAddr', bl=32, rep=REPR_HEX)},
DEFAULT=Buf('none', bl=0),
sel=lambda self: self.get_env()['NodeIDType'].get_val()),
Sequence('CSIDs', GEN=Uint16('CSID')),
Uint('spare', bl=4),
Uint('NodeType', bl=4, dic=NodeType_dict),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['NumCSIDs'].set_valauto(lambda: self['CSIDs'].get_num())
self['CSIDs'].set_numauto(lambda: self['NumCSIDs'].get_val())
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.44: Volume Measurement
#------------------------------------------------------------------------------#
# IE Type: 66
class VolumeMeasurement(Envelope):
ENV_SEL_TRANS = False
_GEN = (
Uint('spare', bl=2, rep=REPR_HEX),
Uint('DLNOP', bl=1),
Uint('ULNOP', bl=1),
Uint('TONOP', bl=1),
Uint('DLVOL', bl=1),
Uint('ULVOL', bl=1),
Uint('TOVOL', bl=1),
Uint64('TotalVolume'),
Uint64('UplinkVolume'),
Uint64('DownlinkVolume'),
Uint64('TotalNumPackets'),
Uint64('UplinkNumPackets'),
Uint64('DownlinkNumPackets'),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['TotalVolume'].set_transauto(lambda: False if self['TOVOL'].get_val() else True)
self['UplinkVolume'].set_transauto(lambda: False if self['ULVOL'].get_val() else True)
self['DownlinkVolume'].set_transauto(lambda: False if self['DLVOL'].get_val() else True)
self['TotalNumPackets'].set_transauto(lambda: False if self['TONOP'].get_val() else True)
self['UplinkNumPackets'].set_transauto(lambda: False if self['ULNOP'].get_val() else True)
self['DownlinkNumPackets'].set_transauto(lambda: False if self['DLNOP'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.45: Duration Measurement
#------------------------------------------------------------------------------#
# IE Type: 67
class DurationMeasurement(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.46: Time of First Packet
#------------------------------------------------------------------------------#
# IE Type: 69
class TimeofFirstPacket(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.47: Time of Last Packet
#------------------------------------------------------------------------------#
# IE Type: 70
class TimeofLastPacket(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.48: Quota Holding Time
#------------------------------------------------------------------------------#
# IE Type: 71
class QuotaHoldingTime(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.49: Dropped DL Traffic Threshold
#------------------------------------------------------------------------------#
# IE Type: 72
class DroppedDLTrafficThreshold(Envelope):
_GEN = (
Uint('spare', bl=6),
Uint('DLBY', bl=1),
Uint('DLPA', bl=1),
Uint64('DLPackets'),
Uint64('NumBytesDLData'),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.50: Volume Quota
#------------------------------------------------------------------------------#
# IE Type: 73
class VolumeQuota(_Volume):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.51: Time Quota
#------------------------------------------------------------------------------#
# IE Type: 74
class TimeQuota(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.52: Start Time
#------------------------------------------------------------------------------#
# IE Type: 75
class StartTime(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.53: End Time
#------------------------------------------------------------------------------#
# IE Type: 76
class EndTime(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.54: URR ID
#------------------------------------------------------------------------------#
# IE Type: 81
class URRID(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.55: Linked URR ID
#------------------------------------------------------------------------------#
# IE Type: 82
class LinkedURRID(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.56: Outer Header Creation
#------------------------------------------------------------------------------#
# IE Type: 84
class OuterHeaderCreation(Envelope):
_GEN = (
Uint('STAG', bl=1),
Uint('CTAG', bl=1),
Uint('IPv6', bl=1),
Uint('IPv4', bl=1),
Uint('UDP_IPv6', bl=1),
Uint('UDP_IPv4', bl=1),
Uint('GTPU_UDP_IPv6', bl=1),
Uint('GTPU_UDP_IPv4', bl=1),
Uint('spare', bl=6, rep=REPR_HEX),
Uint('N6', bl=1),
Uint('N19', bl=1),
Uint32('TEID'),
IPAddr('IPv4Addr', bl=32),
IPAddr('IPv6Addr', bl=128),
Uint16('Port'),
Buf('VLAN_CTAG', bl=24, rep=REPR_HEX),
Buf('VLAN_STAG', bl=24, rep=REPR_HEX),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['TEID'].set_transauto(lambda: False if (
self['GTPU_UDP_IPv6'].get_val() or self['GTPU_UDP_IPv4'].get_val()) else True)
self['IPv4Addr'].set_transauto(lambda: False if (
self['IPv4'].get_val() or self['UDP_IPv4'].get_val() or self['GTPU_UDP_IPv4'].get_val()) else True)
self['IPv6Addr'].set_transauto(lambda: False if (
self['IPv6'].get_val() or self['UDP_IPv6'].get_val() or self['GTPU_UDP_IPv6'].get_val()) else True)
self['Port'].set_transauto(lambda: False if (
self['UDP_IPv6'].get_val() or self['UDP_IPv4'].get_val() or self['GTPU_UDP_IPv6'].get_val() or self['GTPU_UDP_IPv4'].get_val()) else True)
self['VLAN_CTAG'].set_transauto(lambda: False if (
self['CTAG'].get_val()) else True)
self['VLAN_STAG'].set_transauto(lambda: False if (
self['STAG'].get_val()) else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.57: BAR ID
#------------------------------------------------------------------------------#
# IE Type: 88
class BARID(Envelope):
_GEN = (
Uint8('Val'),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.58: CP Function Features
#------------------------------------------------------------------------------#
# IE Type: 89
class CPFunctionFeatures(BitFlags):
_GEN = (
Envelope('Octet1', GEN=(
Uint('UIAUR', bl=1),
Uint('ARDR', bl=1),
Uint('MPAS', bl=1),
Uint('BUNDL', bl=1),
Uint('SSET', bl=1),
Uint('EPFAR', bl=1),
Uint('OVRL', bl=1),
Uint('LOAD', bl=1))),
Envelope('Octet2', GEN=(
Uint('spare', bl=7, rep=REPR_HEX),
Uint('PSUCC', bl=1))),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.59: Usage Information
#------------------------------------------------------------------------------#
# IE Type: 90
class UsageInformation(Envelope):
_GEN = (
Uint('spare', bl=4, rep=REPR_HEX),
Uint('UBE', bl=1),
Uint('UAE', bl=1),
Uint('AFT', bl=1),
Uint('BEF', bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.60: Application Instance ID
#------------------------------------------------------------------------------#
# IE Type: 91
class ApplicationInstanceID(Buf):
_rep = REPR_HEX
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.61: Flow Information
#------------------------------------------------------------------------------#
FlowDirection_dict = {
0 : 'Unspecified',
1 : 'Downlink',
2 : 'Uplink',
3 : 'Bidirectional'
}
# IE Type: 92
class FlowInformation(Envelope):
_GEN = (
Uint('spare', bl=5, rep=REPR_HEX),
Uint('FlowDir', bl=3, dic=FlowDirection_dict),
Uint16('Len'),
Buf('FlowDesc', rep=REPR_HEX),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['Len'].set_valauto(lambda: self['FlowDesc'].get_len())
self['FlowDesc'].set_blauto(lambda: self['Len'].get_val()<<3)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.62: UE IP Address
#------------------------------------------------------------------------------#
# IE Type: 93
class UEIPAddress(Envelope):
_GEN = (
Uint('spare', bl=1, rep=REPR_HEX),
Uint('IP6PL', bl=1),
Uint('CHV6', bl=1),
Uint('CHV4', bl=1),
Uint('IPv6D', bl=1),
Uint('SD', bl=1),
Uint('V4', bl=1),
Uint('V6', bl=1),
IPAddr('IPv4Addr', bl=32),
IPAddr('IPv6Addr', bl=128),
Uint8('IPv6PrefDeleg'),
Uint8('IPv6PrefLen'),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['IPv4Addr'].set_transauto(lambda: False if self['V4'].get_val() else True)
self['IPv6Addr'].set_transauto(lambda: False if self['V6'].get_val() else True)
self['IPv6PrefDeleg'].set_transauto(lambda: False if self['IPv6D'].get_val() else True)
self['IPv6PrefLen'].set_transauto(lambda: False if self['IP6PL'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.63: Packet Rate
#------------------------------------------------------------------------------#
TimeUnit_dict = {
0 : 'min',
1 : '6 min',
2 : 'hr',
3 : 'day',
4 : 'week'
}
# IE Type: 94
class PacketRate(Envelope):
_GEN = (
Uint('spare', bl=5, rep=REPR_HEX),
Uint('APRC', bl=1),
Uint('DLPR', bl=1),
Uint('ULPR', bl=1),
Envelope('Uplink', GEN=(
Uint('spare', bl=5, rep=REPR_HEX),
Uint('TimeUnit', bl=3, dic=TimeUnit_dict),
Uint16('PacketRate'))
),
Envelope('Downlink', GEN=(
Uint('spare', bl=5, rep=REPR_HEX),
Uint('TimeUnit', bl=3, dic=TimeUnit_dict),
Uint16('PacketRate'))
),
Envelope('AddUplink', GEN=(
Uint('spare', bl=5, rep=REPR_HEX),
Uint('TimeUnit', bl=3, dic=TimeUnit_dict),
Uint16('PacketRate'))
),
Envelope('AddDownlink', GEN=(
Uint('spare', bl=5, rep=REPR_HEX),
Uint('TimeUnit', bl=3, dic=TimeUnit_dict),
Uint16('PacketRate'))
),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['Uplink'].set_transauto(lambda: False if self['ULPR'].get_val() else True)
self['Downlink'].set_transauto(lambda: False if self['DLPR'].get_val() else True)
self['AddUplink'].set_transauto(lambda: False if (self['ULPR'].get_val() and self['APRC'].get_val()) else True)
self['AddDownlink'].set_transauto(lambda: False if (self['DLPR'].get_val() and self['APRC'].get_val()) else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.64: Outer Header Removal
#------------------------------------------------------------------------------#
OuterHeaderRemovalDesc_dict = {
0 : 'GTP-U/UDP/IPv4',
1 : 'GTP-U/UDP/IPv6',
2 : 'UDP/IPv4',
3 : 'UDP/IPv6',
4 : 'IPv4',
5 : 'IPv6',
6 : 'GTP-U/UDP/IP',
7 : 'VLAN S-TAG',
8 : 'S-TAG and C-TAG'
}
class _GTPUExtHdrDel(Envelope):
_GEN = (
Uint('spare', bl=7),
Uint('PDUSessionContainer', bl=1)
)
# IE Type: 95
class OuterHeaderRemoval(Envelope):
_GEN = (
Uint8('Desc', dic=OuterHeaderRemovalDesc_dict),
_GTPUExtHdrDel('GTPUExtHdrDel'),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
# Warning: spec is really unclear about to have GTPUExtHdrDel or not
self['GTPUExtHdrDel'].set_transauto(lambda: False if self['Desc'].get_val() == 6 else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.65: Recovery Time Stamp
#------------------------------------------------------------------------------#
# IE Type: 96
class RecoveryTimeStamp(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.66: DL Flow Level Marking
#------------------------------------------------------------------------------#
# IE Type: 97
class DLFlowLevelMarking(Envelope):
_GEN = (
Uint('spare', bl=6, rep=REPR_HEX),
Uint('SCI', bl=1),
Uint('TTC', bl=1),
Buf('ToSTrafficClass', val=b'\0\0', bl=16, rep=REPR_HEX),
Buf('ServiceClassInd', val=b'\0\0', bl=16, rep=REPR_HEX),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['ToSTrafficClass'].set_transauto(lambda: False if self['TTC'].get_val() else True)
self['ServiceClassInd'].set_transauto(lambda: False if self['SCI'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.67: Header Enrichment
#------------------------------------------------------------------------------#
# IE Type: 98
class HeaderEnrichment(Envelope):
_GEN = (
Uint('spare', bl=3, rep=REPR_HEX),
Uint('Type', bl=5, dic={0: 'HTTP'}),
_LU8V('HeaderFieldName'),
_LU16V('HeaderFieldValue'),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.68: Measurement Information
#------------------------------------------------------------------------------#
# IE Type: 100
class MeasurementInformation(Envelope):
_GEN = (
Uint('spare', bl=1),
Uint('ASPOC', bl=1),
Uint('SSPOC', bl=1),
Uint('MNOP', bl=1),
Uint('ISTM', bl=1),
Uint('RADI', bl=1),
Uint('INAM', bl=1),
Uint('MBQE', bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.69: Node Report Type
#------------------------------------------------------------------------------#
# IE Type: 101
class NodeReportType(Envelope):
_GEN = (
Uint('spare', bl=4, rep=REPR_HEX),
Uint('GPQR', bl=1),
Uint('CKDR', bl=1),
Uint('UPRR', bl=1),
Uint('UPFR', bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.70: Remote GTP-U Peer
#------------------------------------------------------------------------------#
# IE Type: 103
class RemoteGTPUPeer(Envelope):
_GEN = (
Uint('spare', bl=4),
Uint('NI', bl=1),
Uint('DI', bl=1),
Uint('V4', bl=1),
Uint('V6', bl=1),
IPAddr('IPv4Addr', bl=32),
IPAddr('IPv6Addr', bl=128),
_LU16V('DestinationInterface'),
_LU16V('NetworkInstance'),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['IPv4Addr'].set_transauto(lambda: False if self['V4'].get_val() else True)
self['IPv6Addr'].set_transauto(lambda: False if self['V6'].get_val() else True)
self['DestinationInterface'].set_transauto(lambda: False if self['DI'].get_val() else True)
self['NetworkInstance'].set_transauto(lambda: False if self['NI'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.71: UR-SEQN
#------------------------------------------------------------------------------#
# IE Type: 104
class URSEQN(Uint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.72: Activate Predefined Rules
#------------------------------------------------------------------------------#
# IE Type: 106
class ActivatePredefinedRules(Buf):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.73: Deactivate Predefined Rules
#------------------------------------------------------------------------------#
# IE Type: 107
class DeactivatePredefinedRules(Buf):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.74: FAR ID
#------------------------------------------------------------------------------#
# IE Type: 108
class FARID(Envelope):
_GEN = (
Uint32('Val'),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.75: QER ID
#------------------------------------------------------------------------------#
# IE Type: 109
class QERID(Envelope):
_GEN = (
Uint32('Val'),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.76: OCI Flags
#------------------------------------------------------------------------------#
# IE Type: 110
class OCIFlags(Envelope):
_GEN = (
Uint('spare', bl=7, rep=REPR_HEX),
Uint('AOCI', val=1, bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.77: PFCP Association Release Request
#------------------------------------------------------------------------------#
# IE Type: 111
class AssociationReleaseRequest(Envelope):
_GEN = (
Uint('spare', bl=6, rep=REPR_HEX),
Uint('URSS', bl=1),
Uint('SARR', bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.78: Graceful Release Period
#------------------------------------------------------------------------------#
# IE Type: 112
class GracefulReleasePeriod(_Timer):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.79: PDN Type
#------------------------------------------------------------------------------#
PDNType_dict = {
1 : 'IPv4',
2 : 'IPv6',
3 : 'IPv4v6',
4 : 'Non-IP',
5 : 'Ethernet'
}
# IE Type: 113
class PDNType(Envelope):
_GEN = (
Uint('spare', bl=5, rep=REPR_HEX),
Uint('Val', bl=3, dic=PDNType_dict),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.80: Failed Rule ID
#------------------------------------------------------------------------------#
RuleIDType_dict = {
0 : 'PDR',
1 : 'FAR',
2 : 'QER',
3 : 'URR',
4 : 'BAR',
5 : 'MAR',
6 : 'SRR',
}
# IE Type: 114
class FailedRuleID(Envelope):
_GEN = (
Uint('spare', bl=4, rep=REPR_HEX),
Uint('RuleIDType', bl=4, dic=RuleIDType_dict),
Alt('RuleIDVal', GEN={
0 : Uint16('PDRID'),
1 : Uint32('FARID'),
2 : Uint32('QERID'),
3 : Uint32('URRID'),
4 : Uint8('BARID'),
5 : Uint16('MARID'),
6 : Uint8('SRRID')
},
DEFAULT=Buf('unk', val=b'', rep=REPR_HEX),
sel=lambda self: self.get_env()['RuleIDType'].get_val()
),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.81: Time Quota Mechanism
#------------------------------------------------------------------------------#
# IE Type: 115
class TimeQuotaMechanism(Envelope):
_GEN = (
Uint('spare', bl=6, rep=REPR_HEX),
Uint('BTIT', bl=2, dic={0: 'CTP', 1: 'DTP'}),
Uint32('BaseTimeInterval'),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.83: User Plane Inactivity Timer
#------------------------------------------------------------------------------#
# IE Type: 117
class UserPlaneInactivityTimer(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.84: Multiplier
#------------------------------------------------------------------------------#
# IE Type: 119
class Multiplier(Envelope):
_GEN = (
Int64('ValueDigits'),
Int32('Exponent')
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.85: Aggregated URR ID IE
#------------------------------------------------------------------------------#
# IE Type: 120
class AggregatedURRID(Uint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.86: Subsequent Volume Quota
#------------------------------------------------------------------------------#
# IE Type: 121
class SubsequentVolumeQuota(_Volume):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.87: Subsequent Time Quota
#------------------------------------------------------------------------------#
# IE Type: 122
class SubsequentTimeQuota(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.88: RQI
#------------------------------------------------------------------------------#
# IE Type: 123
class RQI(Envelope):
_GEN = (
Uint('spare', bl=7, rep=REPR_HEX),
Uint('RQI', val=1, bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.89: QFI
#------------------------------------------------------------------------------#
# IE Type: 124
class QFI(Envelope):
_GEN = (
Uint('spare', bl=2, rep=REPR_HEX),
Uint('QFI', val=1, bl=6),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.90: Query URR Reference
#------------------------------------------------------------------------------#
# IE Type: 125
class QueryURRReference(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.91: Additional Usage Reports Information
#------------------------------------------------------------------------------#
# IE Type: 126
class AdditionalUsageReportsInformation(Envelope):
_GEN = (
Uint('AURI', bl=1),
Uint('Num', bl=15),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.92: Traffic Endpoint ID
#------------------------------------------------------------------------------#
# IE Type: 131
class TrafficEndpointID(Envelope):
_GEN = (
Uint8('Val'),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.93: MAC address
#------------------------------------------------------------------------------#
# IE Type: 133
class MACAddress(Envelope):
_GEN = (
Uint('spare', bl=4, rep=REPR_HEX),
Uint('UDES', bl=1),
Uint('USOU', bl=1),
Uint('DEST', bl=1),
Uint('SOUR', bl=1),
Buf('SrcMACAddr', bl=48, rep=REPR_HEX),
Buf('DstMACAddr', bl=48, rep=REPR_HEX),
Buf('UpperSrcMACAddr', bl=48, rep=REPR_HEX),
Buf('UpperDstMACAddr', bl=48, rep=REPR_HEX),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['SrcMACAddr'].set_transauto(lambda: False if self['SOUR'].get_val() else True)
self['DstMACAddr'].set_transauto(lambda: False if self['DEST'].get_val() else True)
self['UpperSrcMACAddr'].set_transauto(lambda: False if self['USOU'].get_val() else True)
self['UpperDstMACAddr'].set_transauto(lambda: False if self['UDES'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.94: C-TAG (Customer-VLAN tag)
#------------------------------------------------------------------------------#
class _VLANTAG(Envelope):
_GEN = (
Uint('spare', bl=5, rep=REPR_HEX),
Uint('VID', bl=1),
Uint('DEI', bl=1),
Uint('PCP', bl=1),
Uint('CVID_MSB', bl=4),
Uint('DEIFlag', bl=1),
Uint('PCPValue', bl=1),
Uint8('CVID_LSB'),
Buf('ext', val=b'', rep=REPR_HEX)
)
# IE Type: 134
class CTAG(_VLANTAG):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.95: S-TAG (Service-VLAN tag)
#------------------------------------------------------------------------------#
# IE Type: 135
class STAG(_VLANTAG):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.96: Ethertype
#------------------------------------------------------------------------------#
# IE Type: 136
class Ethertype(Envelope):
_GEN = (
Uint16('Val', rep=REPR_HEX, dic=EtherType_dict),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.97: Proxying
#------------------------------------------------------------------------------#
# IE Type: 137
class Proxying(Envelope):
_GEN = (
Uint('spare', bl=6, rep=REPR_HEX),
Uint('INS', bl=1),
Uint('ARP', bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.98: Ethernet Filter ID
#------------------------------------------------------------------------------#
# IE Type: 138
class EthernetFilterID(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.99: Ethernet Filter Properties
#------------------------------------------------------------------------------#
# IE Type: 139
class EthernetFilterProperties(Envelope):
_GEN = (
Uint('spare', bl=7),
Uint('BIDE', bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.100: Suggested Buffering Packets Count
#------------------------------------------------------------------------------#
# IE Type: 140
class SuggestedBufferingPacketsCount(Envelope):
_GEN = (
Uint8('Val'),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.101: User ID
#------------------------------------------------------------------------------#
# IE Type: 141
class UserID(Envelope):
_GEN = (
Uint('spare', bl=4, rep=REPR_HEX),
Uint('NAIF', bl=1),
Uint('MSISDNF', bl=1),
Uint('IMEIF', bl=1),
Uint('IMSIF', bl=1),
_LU8V('IMSI'),
_LU8V('IMEI'),
_LU8V('MSISDN'),
_LU8V('NAI'),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['IMSI'].set_transauto(lambda: False if self['IMSIF'].get_val() else True)
self['IMEI'].set_transauto(lambda: False if self['IMEIF'].get_val() else True)
self['MSISDN'].set_transauto(lambda: False if self['MSISDNF'].get_val() else True)
self['NAI'].set_transauto(lambda: False if self['NAIF'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.102: Ethernet PDU Session Information
#------------------------------------------------------------------------------#
# IE Type: 142
class EthernetPDUSessionInformation(Envelope):
_GEN = (
Uint('spare', bl=7, rep=REPR_HEX),
Uint('ETHI', val=1, bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.103: MAC Addresses Detected
#------------------------------------------------------------------------------#
class _MACAddresses(Envelope):
_GEN = (
Uint8('NumAddrs'),
Sequence('Addrs', GEN=Buf('MACAddr', bl=48, rep=REPR_HEX)),
_LU8V('CTAG', rep=REPR_HEX),
_LU8V('STAG', rep=REPR_HEX),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['NumAddrs'].set_valauto(lambda: self['Addrs'].get_num())
self['Addrs'].set_numauto(lambda: self['NumAddrs'].get_val())
# IE Type: 144
class MACAddressesDetected(_MACAddresses):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.104: MAC Addresses Removed
#------------------------------------------------------------------------------#
# IE Type: 145
class MACAddressesRemoved(_MACAddresses):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.105: Ethernet Inactivity Timer
#------------------------------------------------------------------------------#
# IE Type: 146
class EthernetInactivityTimer(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.106: Subsequent Event Quota
#------------------------------------------------------------------------------#
# IE Type: 150
class SubsequentEventQuota(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.107: Subsequent Event Threshold
#------------------------------------------------------------------------------#
# IE Type: 151
class SubsequentEventThreshold(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.108: Trace Information
#------------------------------------------------------------------------------#
# IE Type: 152
class TraceInformation(Envelope):
_GEN = (
PLMN(),
Uint24('TraceID'),
_LU8V('TriggeringEvents', rep=REPR_HEX),
Uint8('SessionTraceDepth'),
_LU8V('ListOfInterfaces', rep=REPR_HEX),
_LU8V('IPAdressOfTraceCollectionEntity', rep=REPR_HEX),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.109: Framed-Route
#------------------------------------------------------------------------------#
# IE Type: 153
class FramedRoute(Buf):
_rep = REPR_HEX
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.110: Framed-Routing
#------------------------------------------------------------------------------#
# IE Type: 154
class FramedRouting(Uint32):
_dic = {
0 : 'None',
1 : 'Send routing packets',
2 : 'Listen for routing packets',
3 : 'Send and Listen'
}
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.111: Framed-IPv6-Route
#------------------------------------------------------------------------------#
# IE Type: 155
class FramedIPv6Route(Buf):
_rep = REPR_HEX
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.112: Event Quota
#------------------------------------------------------------------------------#
# IE Type: 148
class EventQuota(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.113: Event Threshold
#------------------------------------------------------------------------------#
# IE Type: 149
class EventThreshold(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.114: Time Stamp
#------------------------------------------------------------------------------#
# IE Type: 156
class TimeStamp(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.115: Averaging Window
#------------------------------------------------------------------------------#
# IE Type: 157
class AveragingWindow(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.116: Paging Policy Indicator (PPI)
#------------------------------------------------------------------------------#
# IE Type: 158
class PagingPolicyIndicator(Envelope):
_GEN = (
Uint('spare', bl=5, rep=REPR_HEX),
Uint('PPI', bl=3),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.117: APN/DNN
#------------------------------------------------------------------------------#
# IE Type: 159
class APNDNN(FQDN):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.118: 3GPP Interface Type
#------------------------------------------------------------------------------#
TGPPInterfaceType_dict = {
0 : 'S1-U',
1 : 'S5 /S8-U',
2 : 'S4-U',
3 : 'S11-U',
4 : 'S12',
5 : 'Gn/Gp-U',
6 : 'S2a-U',
7 : 'S2b-U',
8 : 'eNodeB GTP-U interface for DL data forwarding',
9 : 'eNodeB GTP-U interface for UL data forwarding',
10 : 'SGW/UPF GTP-U interface for DL data forwarding',
11 : 'N3 3GPP Access',
12 : 'N3 Trusted Non-3GPP Access',
13 : 'N3 Untrusted Non-3GPP Access',
14 : 'N3 for data forwarding',
15 : 'N9',
16 : 'SGi',
17 : 'N6',
18 : 'N19',
19 : 'S8-U',
20 : 'Gp-U',
21 : 'N9 for roaming',
22 : 'Iu-U',
23 : 'N9 for data forwarding',
24 : 'Sxa-U',
25 : 'Sxb-U',
26 : 'Sxc-U',
27 : 'N4-U',
28 : 'SGW/UPF GTP-U interface for UL data forwarding',
}
# IE Type: 160
class TGPPInterfaceType(Envelope):
_GEN = (
Uint('spare', bl=2, rep=REPR_HEX),
Uint('Val', bl=6, dic=TGPPInterfaceType_dict),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.119: PFCPSRReq-Flags
#------------------------------------------------------------------------------#
# IE Type: 161
class PFCPSRReqFlags(Envelope):
_GEN = (
Uint('spare', bl=7, rep=REPR_HEX),
Uint('PSDBU', val=1, bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.120: PFCPAUReq-Flags
#------------------------------------------------------------------------------#
# IE Type: 162
class PFCPAUReqFlags(Envelope):
_GEN = (
Uint('spare', bl=7, rep=REPR_HEX),
Uint('PARPS', val=1, bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.121: Activation Time
#------------------------------------------------------------------------------#
# IE Type: 163
class ActivationTime(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.122: Deactivation Time
#------------------------------------------------------------------------------#
# IE Type: 164
class DeactivationTime(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.123: MAR ID
#------------------------------------------------------------------------------#
# IE Type: 170
class MARID(Envelope):
_GEN = (
Uint16('Val'),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.124: Steering Functionality
#------------------------------------------------------------------------------#
# IE Type: 171
class SteeringFunctionality(Envelope):
_GEN = (
Uint('spare', bl=4, rep=REPR_HEX),
Uint('Val', bl=4, dic={0: 'ATSSS-LL', 1: 'MPTCP'}),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.125: Steering Mode
#------------------------------------------------------------------------------#
SteeringMode_dict = {
0 : 'Active-Standby',
1 : 'Smallest Delay',
2 : 'Load Balancing',
3 : 'Priority-based'
}
# IE Type: 172
class SteeringMode(Envelope):
_GEN = (
Uint('spare', bl=4, rep=REPR_HEX),
Uint('Val', bl=4, dic=SteeringMode_dict),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.126: Weight
#------------------------------------------------------------------------------#
# IE Type: 173
class Weight(Uint8):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.127: Priority
#------------------------------------------------------------------------------#
Priority_dict = {
0 : 'Active',
1 : 'Standby',
2 : 'No Standby',
3 : 'High',
4 : 'Low',
}
# IE Type: 174
class Priority(Envelope):
_GEN = (
Uint('spare', bl=4, rep=REPR_HEX),
Uint('Val', bl=4, dic=Priority_dict),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.128: UE IP address Pool Identity
#------------------------------------------------------------------------------#
# IE Type: 177
class UEIPAddressPoolIdentity(Envelope):
_GEN = (
Uint16('Len'),
Buf('Val'),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['Len'].set_valauto(lambda: self['Val'].get_len())
self['Val'].set_blauto(lambda: self['Len'].get_val()<<3)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.129: Alternative SMF IP Address
#------------------------------------------------------------------------------#
# IE Type: 178
class AlternativeSMFIPAddress(Envelope):
_GEN = (
Uint('spare', bl=6, rep=REPR_HEX),
Uint('V4', bl=1),
Uint('V6', bl=1),
IPAddr('IPv4Addr', bl=32),
IPAddr('IPv6Addr', bl=128),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['IPv4Addr'].set_transauto(lambda: False if self['V4'].get_val() else True)
self['IPv6Addr'].set_transauto(lambda: False if self['V6'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.130: Packet Replication and Detection Carry-On Information
#------------------------------------------------------------------------------#
# IE Type: 179
class PacketReplicationandDetectionCarryOnInformation(Envelope):
_GEN = (
Uint('spare', bl=4, rep=REPR_HEX),
Uint('DCARONI', bl=1),
Uint('PRIN6I', bl=1),
Uint('PRIN19I', bl=1),
Uint('PRIUEAI', bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.131: SMF Set ID
#------------------------------------------------------------------------------#
# IE Type: 180
class SMFSetID(Envelope):
_GEN = (
Uint8('spare'),
FQDN(),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.132: Quota Validity Time
#------------------------------------------------------------------------------#
# IE Type: 181
class QuotaValidityTime(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.133: Number of Reports
#------------------------------------------------------------------------------#
# IE Type: 182
class NumberofReports(Uint16):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.134: PFCPASRsp-Flags
#------------------------------------------------------------------------------#
# IE Type: 184
class PFCPASRspFlags(Envelope):
_GEN = (
Uint('spare', bl=6, rep=REPR_HEX),
Uint('UUPSI', bl=1),
Uint('PSREI', bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.135: CP PFCP Entity IP Address
#------------------------------------------------------------------------------#
# IE Type: 185
class CPPFCPEntityIPAddress(Envelope):
_GEN = (
Uint('spare', bl=6, rep=REPR_HEX),
Uint('V4', bl=1),
Uint('V6', bl=1),
IPAddr('IPv4Addr', bl=32),
IPAddr('IPv6Addr', bl=128),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['IPv4Addr'].set_transauto(lambda: False if self['V4'].get_val() else True)
self['IPv6Addr'].set_transauto(lambda: False if self['V6'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.136: PFCPSEReq-Flags
#------------------------------------------------------------------------------#
# IE Type: 186
class PFCPSEReqFlags(Envelope):
_GEN = (
Uint('spare', bl=7, rep=REPR_HEX),
Uint('RESTI', val=1, bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.137: IP Multicast Address
#------------------------------------------------------------------------------#
# IE Type: 191
class IPMulticastAddress(Envelope):
_GEN = (
Uint('spare', bl=4, rep=REPR_HEX),
Uint('A', bl=1),
Uint('R', bl=1),
Uint('V4', bl=1),
Uint('V6', bl=1),
IPAddr('IPv4Addr', bl=32),
IPAddr('IPv6Addr', bl=128),
IPAddr('IPv4AddrEnd', bl=32),
IPAddr('IPv6AddrEnd', bl=128),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['IPv4Addr'].set_transauto(lambda:
False if not self['A'].get_val() and self['V4'].get_val() else True)
self['IPv6Addr'].set_transauto(lambda:
False if not self['A'].get_val() and self['V6'].get_val() else True)
self['IPv4AddrEnd'].set_transauto(lambda:
False if not self['A'].get_val() and self['R'].get_val() and self['V4'].get_val() else True)
self['IPv6AddrEnd'].set_transauto(lambda:
False if not self['A'].get_val() and self['R'].get_val() and self['V6'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.138: Source IP Address
#------------------------------------------------------------------------------#
# IE Type: 192
class SourceIPAddress(Envelope):
_GEN = (
Uint('spare', bl=5, rep=REPR_HEX),
Uint('MPL', bl=1),
Uint('V4', bl=1),
Uint('V6', bl=1),
IPAddr('IPv4Addr', bl=32),
IPAddr('IPv6Addr', bl=128),
Uint8('MaskPrefLen'),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['IPv4Addr'].set_transauto(lambda: False if self['V4'].get_val() else True)
self['IPv6Addr'].set_transauto(lambda: False if self['V6'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.139: Packet Rate Status
#------------------------------------------------------------------------------#
# IE Type: 193
class PacketRateStatus(Envelope):
_GEN = (
Uint('spare', bl=5, rep=REPR_HEX),
Uint('APR', bl=1),
Uint('DL', bl=1),
Uint('UL', bl=1),
Uint16('NumRemainUplinkPacketsAllowed'),
Uint16('NumRemainAddUplinkPacketsAllowed'),
Uint16('NumRemainDownlinkPacketsAllowed'),
Uint16('NumRemainAddDownlinkPacketsAllowed'),
Uint64('RateCtrlStatusValidityTime'),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['NumRemainUplinkPacketsAllowed'].set_transauto(lambda:
False if self['UL'].get_val() else True)
self['NumRemainAddUplinkPacketsAllowed'].set_transauto(lambda:
False if self['UL'].get_val() and self['APR'].get_val() else True)
self['NumRemainDownlinkPacketsAllowed'].set_transauto(lambda:
False if self['DL'].get_val() else True)
self['NumRemainAddDownlinkPacketsAllowed'].set_transauto(lambda:
False if self['DL'].get_val() and self['APR'].get_val() else True)
self['RateCtrlStatusValidityTime'].set_transauto(lambda:
False if self['UL'].get_val() or self['DL'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.140: Create Bridge Info for TSC IE
#------------------------------------------------------------------------------#
# IE Type: 194
class CreateBridgeInfoforTSC(Envelope):
_GEN = (
Uint('spare', bl=7, rep=REPR_HEX),
Uint('BII', val=1, bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.141: DS-TT Port Number
#------------------------------------------------------------------------------#
# IE Type: 196
class DSTTPortNumber(Uint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.142: NW-TT Port Number
#------------------------------------------------------------------------------#
# IE Type: 197
class NWTTPortNumber(Uint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.143: TSN Bridge ID
#------------------------------------------------------------------------------#
# IE Type: 198
class TSNBridgeID(Envelope):
_GEN = (
Uint('spare', bl=7, rep=REPR_HEX),
Uint('BID', val=1, bl=1),
Uint64('BridgeID'),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['BridgeID'].set_transauto(lambda: False if self['BID'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.144: Port Management Information Container
#------------------------------------------------------------------------------#
# IE Type: 202
class PortManagementInformationContainer(Buf):
_rep = REPR_HEX
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.145: Requested Clock Drift Information
#------------------------------------------------------------------------------#
# IE Type: 204
class RequestedClockDriftInformation(Envelope):
_GEN = (
Uint('spare', bl=6, rep=REPR_HEX),
Uint('RRCR', bl=1),
Uint('RRTO', bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.146: TSN Time Domain Number
#------------------------------------------------------------------------------#
# IE Type: 206
class TSNTimeDomainNumber(Envelope):
_GEN = (
Uint8('Val'),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.147: Time Offset Threshold
#------------------------------------------------------------------------------#
# IE Type: 207
class TimeOffsetThreshold(Envelope):
_GEN = (
Int64('Val', desc='nanoseconds'),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.148: Cumulative rateRatio Threshold
#------------------------------------------------------------------------------#
# IE Type: 208
class CumulativeRateRatioThreshold(Envelope):
_GEN = (
Int32('Val'),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.149: Time Offset Measurement
#------------------------------------------------------------------------------#
# IE Type: 209
class TimeOffsetMeasurement(Envelope):
_GEN = (
Int64('Val'),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.150: Cumulative rateRatio Measurement
#------------------------------------------------------------------------------#
# IE Type: 210
class CumulativeRateRatioMeasurement(Envelope):
_GEN = (
Int32('Val'),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.151: SRR ID
#------------------------------------------------------------------------------#
# IE Type: 215
class SRRID(Envelope):
_GEN = (
Uint8('Val'),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.152: Requested Access Availability Information
#------------------------------------------------------------------------------#
# IE Type: 217
class RequestedAccessAvailabilityInformation(Envelope):
_GEN = (
Uint('spare', bl=7, rep=REPR_HEX),
Uint('RRCA', val=1, bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.153: Access Availability Information
#------------------------------------------------------------------------------#
# IE Type: 219
class AccessAvailabilityInformation(Envelope):
_GEN = (
Uint('spare', bl=4, rep=REPR_HEX),
Uint('AvailabilityStatus', bl=2, dic={0: 'Access unavailable', 1: 'Access available'}),
Uint('AccessType', bl=2, dic={0: '3GPP access type', 1: 'Non-3GPP access type'}),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.154: MPTCP Control Information
#------------------------------------------------------------------------------#
# IE Type: 222
class MPTCPControlInformation(Envelope):
_GEN = (
Uint('spare', bl=7, rep=REPR_HEX),
Uint('TCI', bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.155: ATSSS-LL Control Information
#------------------------------------------------------------------------------#
# IE Type: 223
class ATSSSLLControlInformation(Envelope):
_GEN = (
Uint('spare', bl=7, rep=REPR_HEX),
Uint('LLI', bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.156: PMF Control Information
#------------------------------------------------------------------------------#
# IE Type: 224
class PMFControlInformation(Envelope):
_GEN = (
Uint('spare', bl=6, rep=REPR_HEX),
Uint('DRTTI', bl=1),
Uint('PMFI', bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.157: MPTCP Address Information
#------------------------------------------------------------------------------#
# IE Type: 228
class MPTCPAddressInformation(Envelope):
_GEN = (
Uint('spare', bl=6, rep=REPR_HEX),
Uint('V4', bl=1),
Uint('V6', bl=1),
Uint8('ProxyType'),
Uint16('ProxyPort'),
Buf('ProxyIPv4Addr', bl=32, rep=REPR_HEX),
Buf('ProxyIPv6Addr', bl=128, rep=REPR_HEX),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['ProxyIPv4Addr'].set_transauto(lambda: False if self['V4'].get_val() else True)
self['ProxyIPv6Addr'].set_transauto(lambda: False if self['V6'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.158: UE Link-Specific IP Address
#------------------------------------------------------------------------------#
# IE Type: 229
class UELinkSpecificIPAddress(Envelope):
_GEN = (
Uint('spare', bl=4, rep=REPR_HEX),
Uint('NV6', bl=1),
Uint('NV4', bl=1),
Uint('V6', bl=1),
Uint('V4', bl=1),
IPAddr('IPv4Addr', bl=32),
IPAddr('IPv6Addr', bl=128),
IPAddr('IPv4AddrNon3GPP', bl=32),
IPAddr('IPv6AddrNon3GPP', bl=128),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['IPv4Addr'].set_transauto(lambda: False if self['V4'].get_val() else True)
self['IPv6Addr'].set_transauto(lambda: False if self['V6'].get_val() else True)
self['IPv4AddrNon3GPP'].set_transauto(lambda: False if self['NV4'].get_val() else True)
self['IPv6AddrNon3GPP'].set_transauto(lambda: False if self['NV6'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.159: PMF Address Information
#------------------------------------------------------------------------------#
# IE Type: 230
class PMFAddressInformation(Envelope):
_GEN = (
Uint('spare', bl=5, rep=REPR_HEX),
Uint('MAC', bl=1),
Uint('V6', bl=1),
Uint('V4', bl=1),
IPAddr('IPv4Addr', bl=32),
IPAddr('IPv6Addr', bl=128),
Uint16('Port3GPP'),
Uint16('PortNon3GPP'),
Buf('MAC3GPP', bl=48, rep=REPR_HEX),
Buf('MACNon3GPP', bl=48, rep=REPR_HEX),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['IPv4Addr'].set_transauto(lambda: False if self['V4'].get_val() else True)
self['IPv6Addr'].set_transauto(lambda: False if self['V6'].get_val() else True)
self['Port3GPP'].set_transauto(lambda: False if (self['V4'].get_val() or self['V6'].get_val()) else True)
self['PortNon3GPP'].set_transauto(lambda: False if (self['V4'].get_val() or self['V6'].get_val()) else True)
self['MAC3GPP'].set_transauto(lambda: False if self['MAC'].get_val() else True)
self['MACNon3GPP'].set_transauto(lambda: False if self['MAC'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.160: ATSSS-LL Information
#------------------------------------------------------------------------------#
# IE Type: 231
class ATSSSLLInformation(Envelope):
_GEN = (
Uint('spare', bl=7, rep=REPR_HEX),
Uint('LLI', bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.161: Data Network Access Identifier
#------------------------------------------------------------------------------#
# IE Type: 232
class DataNetworkAccessIdentifier(Buf):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.162: Average Packet Delay
#------------------------------------------------------------------------------#
# IE Type: 234
class AveragePacketDelay(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.163: Minimum Packet Delay
#------------------------------------------------------------------------------#
# IE Type: 235
class MinimumPacketDelay(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.164: Maximum Packet Delay
#------------------------------------------------------------------------------#
# IE Type: 236
class MaximumPacketDelay(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.165: QoS Report Trigger
#------------------------------------------------------------------------------#
# IE Type: 237
class QoSReportTrigger(Envelope):
_GEN = (
Uint('spare', bl=5, rep=REPR_HEX),
Uint('IRE', bl=1),
Uint('THR', bl=1),
Uint('PER', bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.166: GTP-U Path Interface Type
#------------------------------------------------------------------------------#
# IE Type: 241
class GTPUPathInterfaceType(Envelope):
_GEN = (
Uint('spare', bl=6, rep=REPR_HEX),
Uint('N3', bl=1),
Uint('N9', bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.167: Requested Qos Monitoring
#------------------------------------------------------------------------------#
# IE Type: 243
class RequestedQoSMonitoring(Envelope):
_GEN = (
Uint('spare', bl=4, rep=REPR_HEX),
Uint('GTPUPM', bl=1),
Uint('RP', bl=1),
Uint('UL', bl=1),
Uint('DL', bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.168: Reporting Frequency
#------------------------------------------------------------------------------#
# IE Type: 244
class ReportingFrequency(Envelope):
_GEN = (
Uint('spare', bl=5, rep=REPR_HEX),
Uint('SESRL', bl=1),
Uint('PERIO', bl=1),
Uint('EVETT', bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.169: Packet Delay Thresholds
#------------------------------------------------------------------------------#
# IE Type: 245
class PacketDelayThresholds(Envelope):
_GEN = (
Uint('spare', bl=5, rep=REPR_HEX),
Uint('RP', bl=1),
Uint('UL', bl=1),
Uint('DL', bl=1),
Uint32('DownlinkPacketDelayThreshold'),
Uint32('UplinkPacketDelayThreshold'),
Uint32('RoundTripPacketDelayThreshold'),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['DownlinkPacketDelayThreshold'].set_transauto(lambda: False if self['DL'].get_val() else True)
self['UplinkPacketDelayThreshold'].set_transauto(lambda: False if self['UL'].get_val() else True)
self['RoundTripPacketDelayThreshold'].set_transauto(lambda: False if self['RP'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.170: Minimum Wait Time
#------------------------------------------------------------------------------#
# IE Type: 246
class MinimumWaitTime(_IEExtUint32):
pass
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.171: QoS Monitoring Measurement
#------------------------------------------------------------------------------#
# IE Type: 248
class QoSMonitoringMeasurement(Envelope):
_GEN = (
Uint('spare', bl=4, rep=REPR_HEX),
Uint('PLMF', bl=1),
Uint('RP', bl=1),
Uint('UL', bl=1),
Uint('DL', bl=1),
Uint32('DownlinkPacketDelay'),
Uint32('UplinkPacketDelay'),
Uint32('RoundTripPacketDelay'),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['DownlinkPacketDelay'].set_transauto(lambda: False if self['DL'].get_val() else True)
self['UplinkPacketDelay'].set_transauto(lambda: False if self['UL'].get_val() else True)
self['RoundTripPacketDelay'].set_transauto(lambda: False if self['RP'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.172: MT-EDT Control Information
#------------------------------------------------------------------------------#
# IE Type: 249
class MTEDTControlInformation(Envelope):
_GEN = (
Uint('spare', bl=7, rep=REPR_HEX),
Uint('RDSI', val=1, bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.173: DL Data Packets Size
#------------------------------------------------------------------------------#
# IE Type: 250
class DLDataPacketsSize(Envelope):
_GEN = (
Uint16('Val'),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.174: QER Control Indications
#------------------------------------------------------------------------------#
# IE Type: 251
class QERControlIndications(Envelope):
_GEN = (
Uint('spare', bl=7, rep=REPR_HEX),
Uint('RCSR', val=1, bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.175: NF Instance ID
#------------------------------------------------------------------------------#
# IE Type: 253
class NFInstanceID(Buf):
_bl = 128
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.176: S-NSSAI
#------------------------------------------------------------------------------#
# IE Type: 257
class SNSSAI(Envelope):
_GEN = (
Uint8('SST'),
Uint24('SD')
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.177: IP version
#------------------------------------------------------------------------------#
# IE Type: 258
class IPversion(Envelope):
_GEN = (
Uint('spare', bl=7, rep=REPR_HEX),
Uint('V6', bl=1),
Uint('V4', bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.178: PFCPASReq-Flags
#------------------------------------------------------------------------------#
# IE Type: 259
class PFCPASReqFlags(Envelope):
_GEN = (
Uint('spare', bl=7, rep=REPR_HEX),
Uint('UUPSI', val=1, bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.179: Data Status
#------------------------------------------------------------------------------#
# IE Type: 260
class DataStatus(Envelope):
_GEN = (
Uint('spare', bl=6, rep=REPR_HEX),
Uint('BUFF', bl=1),
Uint('DROP', bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.180: RDS Configuration Information
#------------------------------------------------------------------------------#
# IE Type: 262
class RDSConfigurationInformation(Envelope):
_GEN = (
Uint('spare', bl=7, rep=REPR_HEX),
Uint('RDS', val=1, bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.181: MPTCP Applicable Indication
#------------------------------------------------------------------------------#
# IE Type: 265
class MPTCPApplicableIndication(Envelope):
_GEN = (
Uint('spare', bl=7, rep=REPR_HEX),
Uint('MAI', val=1, bl=1),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.182: Bridge Management Information Container
#------------------------------------------------------------------------------#
# IE Type: 266
class BridgeManagementInformationContainer(Buf):
_rep = REPR_HEX
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.183: Number of UE IP Addresses
#------------------------------------------------------------------------------#
# IE Type: 268
class NumberofUEIPAddresses(Envelope):
_GEN = (
Uint('spare', bl=6, rep=REPR_HEX),
Uint('IPv6', bl=1),
Uint('IPv4', bl=1),
Uint32('NumOfUEIPv4Addrs'),
Uint32('NumOfUEIPv6Addrs'),
Buf('ext', val=b'', rep=REPR_HEX)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['NumOfUEIPv4Addrs'].set_transauto(lambda: False if self['IPv4'].get_val() else True)
self['NumOfUEIPv6Addrs'].set_transauto(lambda: False if self['IPv6'].get_val() else True)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.184: Validity Timer
#------------------------------------------------------------------------------#
# IE Type: 269
class ValidityTimer(Envelope):
_GEN = (
Uint16('Val'),
Buf('ext', val=b'', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.185: Offending IE Information
#------------------------------------------------------------------------------#
# IE Type: 274
class OffendingIEInformation(Envelope):
_GEN = (
Uint16('Type'),
Buf('Val', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 8.2.186: RAT Type
#------------------------------------------------------------------------------#
RATType_dict = {
0 : 'reserved',
1 : 'UTRAN',
2 : 'GERAN',
3 : 'WLAN',
4 : 'GAN',
5 : 'HSPA Evolution',
6 : 'EUTRAN (WB-E-UTRAN)',
7 : 'Virtual',
8 : 'EUTRAN-NB-IoT',
9 : 'LTE-M',
10 : 'NR',
}
# IE Type: 275
class RATType(Envelope):
_GEN = (
Uint8('Val', dic=RATType_dict),
Buf('Val', rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# The Grand PFCP IE Lookup Table
#------------------------------------------------------------------------------#
PFCPIELUT = {
1 : CreatePDR,
2 : PDI,
3 : CreateFAR,
4 : ForwardingParameters,
5 : DuplicatingParameters,
6 : CreateURR,
7 : CreateQER,
8 : CreatedPDR,
9 : UpdatePDR,
10 : UpdateFAR,
11 : UpdateForwardingParameters,
12 : UpdateBARSessionReportResponse,
13 : UpdateURR,
14 : UpdateQER,
15 : RemovePDR,
16 : RemoveFAR,
17 : RemoveURR,
18 : RemoveQER,
19 : Cause,
20 : SourceInterface,
21 : FTEID,
22 : NetworkInstance,
23 : SDFFilter,
24 : ApplicationID,
25 : GateStatus,
26 : MBR,
27 : GBR,
28 : QERCorrelationID,
29 : Precedence,
30 : TransportLevelMarking,
31 : VolumeThreshold,
32 : TimeThreshold,
33 : MonitoringTime,
34 : SubsequentVolumeThreshold,
35 : SubsequentTimeThreshold,
36 : InactivityDetectionTime,
37 : ReportingTriggers,
38 : RedirectInformation,
39 : ReportType,
40 : OffendingIE,
41 : ForwardingPolicy,
42 : DestinationInterface,
43 : UPFunctionFeatures,
44 : ApplyAction,
45 : DownlinkDataServiceInformation,
46 : DownlinkDataNotificationDelay,
47 : DLBufferingDuration,
48 : DLBufferingSuggestedPacketCount,
49 : PFCPSMReqFlags,
50 : PFCPSRRspFlags,
51 : LoadControlInformation,
52 : SequenceNumber,
53 : Metric,
54 : OverloadControlInformation,
55 : Timer,
56 : PDRID,
57 : FSEID,
58 : ApplicationIDsPFDs,
59 : PFDContext,
60 : NodeID,
61 : PFDContents,
62 : MeasurementMethod,
63 : UsageReportTrigger,
64 : MeasurementPeriod,
65 : FQCSID,
66 : VolumeMeasurement,
67 : DurationMeasurement,
68 : ApplicationDetectionInformation,
69 : TimeofFirstPacket,
70 : TimeofLastPacket,
71 : QuotaHoldingTime,
72 : DroppedDLTrafficThreshold,
73 : VolumeQuota,
74 : TimeQuota,
75 : StartTime,
76 : EndTime,
77 : QueryURR,
78 : UsageReportSessionModificationResponse,
79 : UsageReportSessionDeletionResponse,
80 : UsageReportSessionReportRequest,
81 : URRID,
82 : LinkedURRID,
83 : DownlinkDataReport,
84 : OuterHeaderCreation,
85 : CreateBAR,
86 : UpdateBARSessionModificationRequest,
87 : RemoveBAR,
88 : BARID,
89 : CPFunctionFeatures,
90 : UsageInformation,
91 : ApplicationInstanceID,
92 : FlowInformation,
93 : UEIPAddress,
94 : PacketRate,
95 : OuterHeaderRemoval,
96 : RecoveryTimeStamp,
97 : DLFlowLevelMarking,
98 : HeaderEnrichment,
99 : ErrorIndicationReport,
100 : MeasurementInformation,
101 : NodeReportType,
102 : UserPlanePathFailureReport,
103 : RemoteGTPUPeer,
104 : URSEQN,
105 : UpdateDuplicatingParameters,
106 : ActivatePredefinedRules,
107 : DeactivatePredefinedRules,
108 : FARID,
109 : QERID,
110 : OCIFlags,
111 : AssociationReleaseRequest,
112 : GracefulReleasePeriod,
113 : PDNType,
114 : FailedRuleID,
115 : TimeQuotaMechanism,
117 : UserPlaneInactivityTimer,
118 : AggregatedURRs,
119 : Multiplier,
120 : AggregatedURRID,
121 : SubsequentVolumeQuota,
122 : SubsequentTimeQuota,
123 : RQI,
124 : QFI,
125 : QueryURRReference,
126 : AdditionalUsageReportsInformation,
127 : CreateTrafficEndpoint,
128 : CreatedTrafficEndpoint,
129 : UpdateTrafficEndpoint,
130 : RemoveTrafficEndpoint,
131 : TrafficEndpointID,
132 : EthernetPacketFilter,
133 : MACAddress,
134 : CTAG,
135 : STAG,
136 : Ethertype,
137 : Proxying,
138 : EthernetFilterID,
139 : EthernetFilterProperties,
140 : SuggestedBufferingPacketsCount,
141 : UserID,
142 : EthernetPDUSessionInformation,
143 : EthernetTrafficInformation,
144 : MACAddressesDetected,
145 : MACAddressesRemoved,
146 : EthernetInactivityTimer,
147 : AdditionalMonitoringTime,
148 : EventQuota,
149 : EventThreshold,
150 : SubsequentEventQuota,
151 : SubsequentEventThreshold,
152 : TraceInformation,
153 : FramedRoute,
154 : FramedRouting,
155 : FramedIPv6Route,
156 : TimeStamp,
157 : AveragingWindow,
158 : PagingPolicyIndicator,
159 : APNDNN,
160 : TGPPInterfaceType,
161 : PFCPSRReqFlags,
162 : PFCPAUReqFlags,
163 : ActivationTime,
164 : DeactivationTime,
165 : CreateMAR,
166 : TGPPAccessForwardingActionInformation,
167 : Non3GPPAccessForwardingActionInformation,
168 : RemoveMAR,
169 : UpdateMAR,
170 : MARID,
171 : SteeringFunctionality,
172 : SteeringMode,
173 : Weight,
174 : Priority,
175 : Update3GPPAccessForwardingActionInformation,
176 : UpdateNon3GPPAccessForwardingActionInformation,
177 : UEIPAddressPoolIdentity,
178 : AlternativeSMFIPAddress,
179 : PacketReplicationandDetectionCarryOnInformation,
180 : SMFSetID,
181 : QuotaValidityTime,
182 : NumberofReports,
183 : SessionRetentionInformation,
184 : PFCPASRspFlags,
185 : CPPFCPEntityIPAddress,
186 : PFCPSEReqFlags,
187 : UserPlanePathRecoveryReport,
188 : IPMulticastAddressingInfo,
189 : JoinIPMulticastInformation,
190 : LeaveIPMulticastInformation,
191 : IPMulticastAddress,
192 : SourceIPAddress,
193 : PacketRateStatus,
194 : CreateBridgeInfoforTSC,
195 : CreatedBridgeInfoforTSC,
196 : DSTTPortNumber,
197 : NWTTPortNumber,
198 : TSNBridgeID,
199 : TSCManagementInformationSessionModificationRequest,
200 : TSCManagementInformationSessionModificationResponse,
201 : TSCManagementInformationSessionReportRequest,
202 : PortManagementInformationContainer,
203 : ClockDriftControlInformation,
204 : RequestedClockDriftInformation,
205 : ClockDriftReport,
206 : TSNTimeDomainNumber,
207 : TimeOffsetThreshold,
208 : CumulativeRateRatioThreshold,
209 : TimeOffsetMeasurement,
210 : CumulativeRateRatioMeasurement,
211 : RemoveSRR,
212 : CreateSRR,
213 : UpdateSRR,
214 : SessionReport,
215 : SRRID,
216 : AccessAvailabilityControlInformation,
217 : RequestedAccessAvailabilityInformation,
218 : AccessAvailabilityReport,
219 : AccessAvailabilityInformation,
220 : ProvideATSSSControlInformation,
221 : ATSSSControlParameters,
222 : MPTCPControlInformation,
223 : ATSSSLLControlInformation,
224 : PMFControlInformation,
225 : MPTCPParameters,
226 : ATSSSLLParameters,
227 : PMFParameters,
228 : MPTCPAddressInformation,
229 : UELinkSpecificIPAddress,
230 : PMFAddressInformation,
231 : ATSSSLLInformation,
232 : DataNetworkAccessIdentifier,
233 : UEIPAddressPoolInformation,
234 : AveragePacketDelay,
235 : MinimumPacketDelay,
236 : MaximumPacketDelay,
237 : QoSReportTrigger,
238 : GTPUPathQoSControlInformation,
239 : GTPUPathQoSReport,
240 : QoSInformation,
241 : GTPUPathInterfaceType,
242 : QoSMonitoringperQoSflowControlInformation,
243 : RequestedQoSMonitoring,
244 : ReportingFrequency,
245 : PacketDelayThresholds,
246 : MinimumWaitTime,
247 : QoSMonitoringReport,
248 : QoSMonitoringMeasurement,
249 : MTEDTControlInformation,
250 : DLDataPacketsSize,
251 : QERControlIndications,
252 : PacketRateStatusReport,
253 : NFInstanceID,
254 : EthernetContextInformation,
255 : RedundantTransmissionDetectionParameters,
256 : UpdatedPDR,
257 : SNSSAI,
258 : IPversion,
259 : PFCPASReqFlags,
260 : DataStatus,
261 : ProvideRDSConfigurationInformation,
262 : RDSConfigurationInformation,
263 : QueryPacketRateStatus,
264 : PacketRateStatusReportSessionModificationResponse,
265 : MPTCPApplicableIndication,
266 : BridgeManagementInformationContainer,
267 : UEIPAddressUsageInformation,
268 : NumberofUEIPAddresses,
269 : ValidityTimer,
270 : RedundantTransmissionForwardingParameters,
271 : TransportDelayReporting,
272 : PartialFailureInformationSessionEstablishmentResponse,
273 : PartialFailureInformationSessionModificationResponse,
274 : OffendingIEInformation,
275 : RATType
}
def _chk_ies():
for ie in PFCPIEType:
if ie.value not in PFCPIELUT:
print('missing IE in LUT: %s %i' % (ie.name, ie.value))
else:
if PFCPIELUT[ie.value].__name__ != ie.name:
print('mismatching IE name: %i, %s - %s' % (ie.value, ie.name, PFCPIELUT[ie.value].__name__))
#------------------------------------------------------------------------------#
# TS 29.244, section 7.3: Message Types
#------------------------------------------------------------------------------#
PFCPMsgType_dict = {
0 : 'Reserved',
# PFCP Node related messages
1 : 'PFCP Heartbeat Request',
2 : 'PFCP Heartbeat Response',
3 : 'PFCP PFD Management Request',
4 : 'PFCP PFD Management Response',
5 : 'PFCP Association Setup Request',
6 : 'PFCP Association Setup Response',
7 : 'PFCP Association Update Request',
8 : 'PFCP Association Update Response',
9 : 'PFCP Association Release Request',
10 : 'PFCP Association Release Response',
11 : 'PFCP Version Not Supported Response',
12 : 'PFCP Node Report Request',
13 : 'PFCP Node Report Response',
14 : 'PFCP Session Set Deletion Request',
15 : 'PFCP Session Set Deletion Response',
# PFCP Session related messages
50 : 'PFCP Session Establishment Request',
51 : 'PFCP Session Establishment Response',
52 : 'PFCP Session Modification Request',
53 : 'PFCP Session Modification Response',
54 : 'PFCP Session Deletion Request',
55 : 'PFCP Session Deletion Response',
56 : 'PFCP Session Report Request',
57 : 'PFCP Session Report Response',
}
PFCPMsgType = IntEnum('PFCPMsgType', {strip_name(v) : k for k, v in PFCPMsgType_dict.items()})
# PFCP Request / Response (success, error)
PFCPReqResp = {
1 : (2, ),
3 : (4, ),
5 : (6, 11),
7 : (8, ),
9 : (10, ),
12 : (13, ),
14 : (15, ),
50 : (51, ),
52 : (53, ),
54 : (55, ),
56 : (57, ),
}
#------------------------------------------------------------------------------#
# TS 29.244, section 7.2: Message Format
#------------------------------------------------------------------------------#
class PFCPHdr(Envelope):
"""PFCP Header
"""
_GEN = (
Uint('Vers', val=1, bl=3),
Uint('spare', bl=2),
Uint('FO', bl=1, dic={0: 'no Follow-On message', 1: 'Follow-On message'}),
Uint('MP', bl=1),
Uint('S', bl=1, dic={0: 'SEID not present', 1: 'SEID present'}),
Uint8('Type', dic=PFCPMsgType_dict),
Uint16('Len'),
Uint64('SEID', rep=REPR_HEX),
Uint24('Seqn'),
Alt('MPSel', GEN={
0 : Uint8('spare'),
1 : Envelope('MP', GEN=(
Uint('MsgPriority', bl=4, dic={0:'lowest priority', 15:'highest priority'}),
Uint('spare', bl=4)
))},
sel=lambda self: self.get_env()['MP'].get_val()
)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['Len'].set_valauto(lambda: self.get_payload().get_len() + (12 if self['S'].get_val() else 4))
self['SEID'].set_transauto(lambda: self['S'].get_val() == 0)
# PFCP Node Related Msg: S = 0
# PFCP Session Related Msg: S = 1
class PFCPMsg(Envelope):
"""PFCP Message
"""
_GEN = (
PFCPHdr('Hdr'),
PFCPIEs('IEs', hier=1)
)
def __init__(self, *args, **kwargs):
Envelope.__init__(self, *args, **kwargs)
self['IEs'].set_blauto(lambda: (self['Hdr']['Len'].get_val() - (12 if self['Hdr']['S'].get_val() else 4)) << 3)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.4.2: Heartbeat Messages
#------------------------------------------------------------------------------#
class PFCPHeartbeatRequest(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 0, 'Type': PFCPMsgType.PFCPHeartbeatRequest.value}),
PFCPIEs('IEs', hier=1,
mand=[
PFCPIEType.RecoveryTimeStamp.value
],
opt=[
PFCPIEType.SourceIPAddress.value
])
)
class PFCPHeartbeatResponse(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 0, 'Type': PFCPMsgType.PFCPHeartbeatResponse.value}),
PFCPIEs('IEs', hier=1,
mand=[
PFCPIEType.RecoveryTimeStamp.value
],
opt=[])
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.4.3: PFCP PFD Management
#------------------------------------------------------------------------------#
class PFCPPFDManagementRequest(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 0, 'Type': PFCPMsgType.PFCPPFDManagementRequest.value}),
PFCPIEs('IEs', hier=1,
opt=[
PFCPIEType.ApplicationIDsPFDs.value,
PFCPIEType.NodeID.value
])
)
class PFCPPFDManagementResponse(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 0, 'Type': PFCPMsgType.PFCPPFDManagementResponse.value}),
PFCPIEs('IEs', hier=1,
mand=[
PFCPIEType.Cause.value
],
opt=[
PFCPIEType.OffendingIE.value,
PFCPIEType.NodeID.value
])
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.4.4: PFCP Association messages
#------------------------------------------------------------------------------#
class PFCPAssociationSetupRequest(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 0, 'Type': PFCPMsgType.PFCPAssociationSetupRequest.value}),
PFCPIEs('IEs', hier=1,
mand=[
PFCPIEType.NodeID.value,
PFCPIEType.RecoveryTimeStamp.value
],
opt=[
PFCPIEType.UPFunctionFeatures.value,
PFCPIEType.CPFunctionFeatures.value,
PFCPIEType.AlternativeSMFIPAddress.value,
PFCPIEType.SMFSetID.value,
PFCPIEType.SessionRetentionInformation.value,
PFCPIEType.UEIPAddressPoolInformation.value,
PFCPIEType.GTPUPathQoSControlInformation.value,
PFCPIEType.ClockDriftControlInformation.value,
PFCPIEType.NFInstanceID.value,
PFCPIEType.PFCPASReqFlags.value
])
)
class PFCPAssociationSetupResponse(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 0, 'Type': PFCPMsgType.PFCPAssociationSetupResponse.value}),
PFCPIEs('IEs', hier=1,
mand=[
PFCPIEType.NodeID.value,
PFCPIEType.Cause.value,
PFCPIEType.RecoveryTimeStamp.value
],
opt=[
PFCPIEType.UPFunctionFeatures.value,
PFCPIEType.CPFunctionFeatures.value,
PFCPIEType.AlternativeSMFIPAddress.value,
PFCPIEType.SMFSetID.value,
PFCPIEType.PFCPASRspFlags.value,
PFCPIEType.ClockDriftControlInformation.value,
PFCPIEType.UEIPAddressPoolInformation.value,
PFCPIEType.GTPUPathQoSControlInformation.value,
PFCPIEType.NFInstanceID.value
])
)
class PFCPAssociationUpdateRequest(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 0, 'Type': PFCPMsgType.PFCPAssociationUpdateRequest.value}),
PFCPIEs('IEs', hier=1,
mand=[
PFCPIEType.NodeID.value,
],
opt=[
PFCPIEType.UPFunctionFeatures.value,
PFCPIEType.CPFunctionFeatures.value,
PFCPIEType.AssociationReleaseRequest.value,
PFCPIEType.GracefulReleasePeriod.value,
PFCPIEType.PFCPAUReqFlags.value,
PFCPIEType.AlternativeSMFIPAddress.value,
PFCPIEType.SMFSetID.value,
PFCPIEType.ClockDriftControlInformation.value,
PFCPIEType.UEIPAddressPoolInformation.value,
PFCPIEType.GTPUPathQoSControlInformation.value,
PFCPIEType.UEIPAddressUsageInformation.value
])
)
class PFCPAssociationUpdateResponse(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 0, 'Type': PFCPMsgType.PFCPAssociationUpdateResponse.value}),
PFCPIEs('IEs', hier=1,
mand=[
PFCPIEType.NodeID.value,
PFCPIEType.Cause.value
],
opt=[
PFCPIEType.UPFunctionFeatures.value,
PFCPIEType.CPFunctionFeatures.value,
PFCPIEType.UEIPAddressUsageInformation.value
])
)
class PFCPAssociationReleaseRequest(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 0, 'Type': PFCPMsgType.PFCPAssociationReleaseRequest.value}),
PFCPIEs('IEs', hier=1,
mand=[
PFCPIEType.NodeID.value,
])
)
class PFCPAssociationReleaseResponse(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 0, 'Type': PFCPMsgType.PFCPAssociationReleaseResponse.value}),
PFCPIEs('IEs', hier=1,
mand=[
PFCPIEType.NodeID.value,
PFCPIEType.Cause.value
])
)
class PFCPVersionNotSupportedResponse(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 0, 'Type': PFCPMsgType.PFCPVersionNotSupportedResponse.value}),
PFCPIEs('IEs', hier=1)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.4.5: PFCP Node Report Procedure
#------------------------------------------------------------------------------#
class PFCPNodeReportRequest(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 0, 'Type': PFCPMsgType.PFCPNodeReportRequest.value}),
PFCPIEs('IEs', hier=1,
mand=[
PFCPIEType.NodeID.value,
PFCPIEType.NodeReportType.value
],
opt=[
PFCPIEType.UserPlanePathFailureReport.value,
PFCPIEType.UserPlanePathRecoveryReport.value,
PFCPIEType.ClockDriftReport.value,
PFCPIEType.GTPUPathQoSReport.value
])
)
class PFCPNodeReportResponse(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 0, 'Type': PFCPMsgType.PFCPNodeReportResponse.value}),
PFCPIEs('IEs', hier=1,
mand=[
PFCPIEType.NodeID.value,
PFCPIEType.Cause.value
],
opt=[
PFCPIEType.OffendingIE.value
])
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.4.6: PFCP Session Set Deletion
#------------------------------------------------------------------------------#
class PFCPSessionSetDeletionRequest(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 0, 'Type': PFCPMsgType.PFCPSessionSetDeletionRequest.value}),
PFCPIEs('IEs', hier=1,
mand=[
PFCPIEType.NodeID.value
],
opt=[
PFCPIEType.FQCSID.value,
PFCPIEType.FQCSID.value,
PFCPIEType.FQCSID.value,
PFCPIEType.FQCSID.value,
PFCPIEType.FQCSID.value,
PFCPIEType.FQCSID.value,
])
)
class PFCPSessionSetDeletionResponse(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 0, 'Type': PFCPMsgType.PFCPSessionSetDeletionResponse.value}),
PFCPIEs('IEs', hier=1,
mand=[
PFCPIEType.NodeID.value,
PFCPIEType.Cause.value
],
opt=[
PFCPIEType.OffendingIE.value
])
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.2: PFCP Session Establishment Request
#------------------------------------------------------------------------------#
class PFCPSessionEstablishmentRequest(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 1, 'Type': PFCPMsgType.PFCPSessionEstablishmentRequest.value}),
PFCPIEs('IEs', hier=1,
mand=[
PFCPIEType.NodeID.value,
PFCPIEType.FSEID.value,
PFCPIEType.CreatePDR.value,
PFCPIEType.CreateFAR.value
],
opt=[
PFCPIEType.CreateURR.value,
PFCPIEType.CreateQER.value,
PFCPIEType.CreateBAR.value,
PFCPIEType.CreateTrafficEndpoint.value,
PFCPIEType.PDNType.value,
PFCPIEType.FQCSID.value,
PFCPIEType.FQCSID.value,
PFCPIEType.FQCSID.value,
PFCPIEType.FQCSID.value,
PFCPIEType.FQCSID.value,
PFCPIEType.UserPlaneInactivityTimer.value,
PFCPIEType.UserID.value,
PFCPIEType.TraceInformation.value,
PFCPIEType.APNDNN.value,
PFCPIEType.CreateMAR.value,
PFCPIEType.PFCPSEReqFlags.value,
PFCPIEType.CreateBridgeInfoforTSC.value,
PFCPIEType.CreateSRR.value,
PFCPIEType.ProvideATSSSControlInformation.value,
PFCPIEType.RecoveryTimeStamp.value,
PFCPIEType.SNSSAI.value,
PFCPIEType.ProvideRDSConfigurationInformation.value,
PFCPIEType.RATType.value,
])
)
class PFCPSessionEstablishmentResponse(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 1, 'Type': PFCPMsgType.PFCPSessionEstablishmentResponse.value}),
PFCPIEs('IEs', hier=1,
mand=[
PFCPIEType.NodeID.value,
PFCPIEType.Cause.value
],
opt=[
PFCPIEType.OffendingIE.value,
PFCPIEType.FSEID.value,
PFCPIEType.CreatePDR.value,
PFCPIEType.LoadControlInformation.value,
PFCPIEType.OverloadControlInformation.value,
PFCPIEType.FQCSID.value,
PFCPIEType.FailedRuleID.value,
PFCPIEType.CreatedTrafficEndpoint.value,
PFCPIEType.CreatedBridgeInfoforTSC.value,
PFCPIEType.ATSSSControlParameters.value,
PFCPIEType.RDSConfigurationInformation.value,
PFCPIEType.PartialFailureInformationSessionEstablishmentResponse.value
])
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.4: PFCP Session Modification Request
#------------------------------------------------------------------------------#
class PFCPSessionModificationRequest(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 1, 'Type': PFCPMsgType.PFCPSessionModificationRequest.value}),
PFCPIEs('IEs', hier=1,
mand=[
],
opt=[
PFCPIEType.FSEID.value,
PFCPIEType.RemovePDR.value,
PFCPIEType.RemoveFAR.value,
PFCPIEType.RemoveURR.value,
PFCPIEType.RemoveQER.value,
PFCPIEType.RemoveBAR.value,
PFCPIEType.RemoveTrafficEndpoint.value,
PFCPIEType.CreatePDR.value,
PFCPIEType.CreateFAR.value,
PFCPIEType.CreateURR.value,
PFCPIEType.CreateQER.value,
PFCPIEType.CreateBAR.value,
PFCPIEType.CreateTrafficEndpoint.value,
PFCPIEType.UpdatePDR.value,
PFCPIEType.UpdateFAR.value,
PFCPIEType.UpdateURR.value,
PFCPIEType.UpdateQER.value,
PFCPIEType.UpdateBARSessionModificationRequest.value,
PFCPIEType.UpdateTrafficEndpoint.value,
PFCPIEType.PFCPSMReqFlags.value,
PFCPIEType.QueryURR.value,
PFCPIEType.FQCSID.value,
PFCPIEType.FQCSID.value,
PFCPIEType.FQCSID.value,
PFCPIEType.FQCSID.value,
PFCPIEType.FQCSID.value,
PFCPIEType.UserPlaneInactivityTimer.value,
PFCPIEType.QueryURRReference.value,
PFCPIEType.TraceInformation.value,
PFCPIEType.RemoveMAR.value,
PFCPIEType.UpdateMAR.value,
PFCPIEType.CreateMAR.value,
PFCPIEType.NodeID.value,
PFCPIEType.TSCManagementInformationSessionModificationRequest.value,
PFCPIEType.RemoveSRR.value,
PFCPIEType.CreateSRR.value,
PFCPIEType.UpdateSRR.value,
PFCPIEType.ProvideATSSSControlInformation.value,
PFCPIEType.EthernetContextInformation.value,
PFCPIEType.AccessAvailabilityInformation.value,
PFCPIEType.QueryPacketRateStatus.value,
PFCPIEType.SNSSAI.value,
PFCPIEType.RATType.value,
])
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.5: PFCP Session Modification Response
#------------------------------------------------------------------------------#
class PFCPSessionModificationResponse(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 1, 'Type': PFCPMsgType.PFCPSessionModificationResponse.value}),
PFCPIEs('IEs', hier=1,
mand=[
PFCPIEType.Cause.value
],
opt=[
PFCPIEType.OffendingIE.value,
PFCPIEType.CreatedPDR.value,
PFCPIEType.LoadControlInformation.value,
PFCPIEType.OverloadControlInformation.value,
PFCPIEType.UsageReportSessionModificationResponse.value,
PFCPIEType.FailedRuleID.value,
PFCPIEType.AdditionalUsageReportsInformation.value,
PFCPIEType.CreatedTrafficEndpoint.value,
PFCPIEType.TSCManagementInformationSessionModificationResponse.value,
PFCPIEType.ATSSSControlParameters.value,
PFCPIEType.UpdatedPDR.value,
PFCPIEType.PacketRateStatusReport.value,
PFCPIEType.PartialFailureInformationSessionModificationResponse.value
])
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.6: PFCP Session Deletion Request
#------------------------------------------------------------------------------#
class PFCPSessionDeletionRequest(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 1, 'Type': PFCPMsgType.PFCPSessionDeletionRequest.value}),
PFCPIEs('IEs', hier=1)
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.7: PFCP Session Deletion Response
#------------------------------------------------------------------------------#
class PFCPSessionDeletionResponse(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 1, 'Type': PFCPMsgType.PFCPSessionDeletionResponse.value}),
PFCPIEs('IEs', hier=1,
mand=[
PFCPIEType.Cause.value
],
opt=[
PFCPIEType.OffendingIE.value,
PFCPIEType.LoadControlInformation.value,
PFCPIEType.OverloadControlInformation.value,
PFCPIEType.UsageReportSessionDeletionResponse.value,
PFCPIEType.AdditionalUsageReportsInformation.value,
PFCPIEType.PacketRateStatusReport.value,
PFCPIEType.SessionReport.value
])
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.8: PFCP Session Report Request
#------------------------------------------------------------------------------#
class PFCPSessionReportRequest(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 1, 'Type': PFCPMsgType.PFCPSessionReportRequest.value}),
PFCPIEs('IEs', hier=1,
mand=[
PFCPIEType.ReportType.value
],
opt=[
PFCPIEType.DownlinkDataReport.value,
PFCPIEType.UsageReportSessionReportRequest.value,
PFCPIEType.ErrorIndicationReport.value,
PFCPIEType.LoadControlInformation.value,
PFCPIEType.OverloadControlInformation.value,
PFCPIEType.AdditionalUsageReportsInformation.value,
PFCPIEType.PFCPSRReqFlags.value,
PFCPIEType.FSEID.value,
PFCPIEType.PacketRateStatusReport.value,
PFCPIEType.TSCManagementInformationSessionReportRequest.value,
PFCPIEType.SessionReport.value
])
)
#------------------------------------------------------------------------------#
# TS 29.244, section 7.5.9: PFCP Session Report Response
#------------------------------------------------------------------------------#
class PFCPSessionReportResponse(PFCPMsg):
_GEN = (
PFCPHdr('Hdr', val={'S': 1, 'Type': PFCPMsgType.PFCPSessionReportResponse.value}),
PFCPIEs('IEs', hier=1,
mand=[
PFCPIEType.Cause.value
],
opt=[
PFCPIEType.OffendingIE.value,
PFCPIEType.UpdateBARSessionReportResponse.value,
PFCPIEType.PFCPSRRspFlags.value,
PFCPIEType.FSEID.value,
PFCPIEType.FTEID.value,
PFCPIEType.AlternativeSMFIPAddress.value
])
)
#------------------------------------------------------------------------------#
# General parser
#------------------------------------------------------------------------------#
PFCPDispatcher = {
1 : PFCPHeartbeatRequest,
2 : PFCPHeartbeatResponse,
3 : PFCPPFDManagementRequest,
4 : PFCPPFDManagementResponse,
5 : PFCPAssociationSetupRequest,
6 : PFCPAssociationSetupResponse,
7 : PFCPAssociationUpdateRequest,
8 : PFCPAssociationUpdateResponse,
9 : PFCPAssociationReleaseRequest,
10 : PFCPAssociationReleaseResponse,
11 : PFCPVersionNotSupportedResponse,
12 : PFCPNodeReportRequest,
13 : PFCPNodeReportResponse,
14 : PFCPSessionSetDeletionRequest,
15 : PFCPSessionSetDeletionResponse,
50 : PFCPSessionEstablishmentRequest,
51 : PFCPSessionEstablishmentResponse,
52 : PFCPSessionModificationRequest,
53 : PFCPSessionModificationResponse,
54 : PFCPSessionDeletionRequest,
55 : PFCPSessionDeletionResponse,
56 : PFCPSessionReportRequest,
57 : PFCPSessionReportResponse
}
ERR_PFCP_BUF_TOO_SHORT = 1
ERR_PFCP_BUF_INVALID = 2
ERR_PFCP_TYPE_NONEXIST = 3
def parse_PFCP(buf):
"""parses the buffer `buf' for PFCP message and returns a 2-tuple:
- PFCP message structure, or None if parsing failed
- parsing error code, 0 if parsing succeeded, > 0 otherwise
"""
if len(buf) < 8:
return None, ERR_PFCP_BUF_TOO_SHORT
if python_version < 3:
type = ord(buf[1])
else:
type = buf[1]
try:
Msg = PFCPDispatcher[type]()
except KeyError:
return None, ERR_PFCP_TYPE_NONEXIST
try:
Msg.from_bytes(buf)
except Exception:
return None, ERR_PFCP_BUF_INVALID
else:
# TODO: support piggy-backed PFCP message (FO flag)
return Msg, 0