esp32_bluetooth_classic_sni.../libs/scapy/contrib/pfcp.py
Matheus Eduardo Garbelini 86890704fd initial commit
todo: add documentation & wireshark dissector
2021-08-31 19:51:03 +08:00

2648 lines
79 KiB
Python
Executable file

#! /usr/bin/env python
# Copyright (C) 2019 Travelping GmbH <info@travelping.com>
# This file is part of Scapy
# Scapy is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# any later version.
#
# Scapy is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Scapy. If not, see <http://www.gnu.org/licenses/>.
# 3GPP TS 29.244
# scapy.contrib.description = 3GPP Packet Forwarding Control Protocol
# scapy.contrib.status = loads
import struct
from scapy.compat import chb, orb
from scapy.error import warning
from scapy.fields import Field, BitEnumField, BitField, ByteEnumField, \
ShortEnumField, ByteField, IntField, LongField, \
ConditionalField, FieldLenField, BitFieldLenField, FieldListField, \
IPField, MACField, PacketListField, ShortField, \
StrLenField, StrField, XBitField, XByteField, XIntField, XLongField, \
ThreeBytesField, SignedLongField, SignedIntField, MultipleTypeField
from scapy.layers.inet import UDP
from scapy.layers.inet6 import IP6Field
from scapy.data import IANA_ENTERPRISE_NUMBERS
from scapy.packet import bind_layers, bind_bottom_up, \
Packet, Raw
from scapy.volatile import RandNum, RandBin
PFCPmessageType = {
1: "heartbeat_request",
2: "heartbeat_response",
3: "pfd_management_request",
4: "pfd_management_response",
5: "association_setup_request",
6: "association_setup_response",
7: "association_update_request",
8: "association_update_response",
9: "association_release_request",
10: "association_release_response",
11: "version_not_supported_response",
12: "node_report_request",
13: "node_report_response",
14: "session_set_deletion_request",
15: "session_set_deletion_response",
50: "session_establishment_request",
51: "session_establishment_response",
52: "session_modification_request",
53: "session_modification_response",
54: "session_deletion_request",
55: "session_deletion_response",
56: "session_report_request",
57: "session_report_response",
}
IEType = {
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 (PFCP 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: "PFCP Association Release Request",
112: "Graceful Release Period",
113: "PDN Type",
114: "Failed Rule ID",
115: "Time Quota Mechanism",
116: "User Plane IP Resource Information",
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: "Event Time Stamp",
157: "Averaging Window",
158: "Paging Policy Indicator",
159: "APN/DNN",
160: "3GPP Interface Type",
}
CauseValues = {
0: "Reserved",
1: "Request accepted",
64: "Request rejected",
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 Sx Association",
73: "Rule creation/modification Failure",
74: "PFCP entity in congestion",
75: "No resources available",
76: "Service not supported",
77: "System failure",
}
SourceInterface = {
0: "Access",
1: "Core",
2: "SGi-LAN/N6-LAN",
3: "CP-function",
}
DestinationInterface = {
0: "Access",
1: "Core",
2: "SGi-LAN/N6-LAN",
3: "CP-function",
4: "LI function",
}
RedirectAddressType = {
0: "IPv4 address",
1: "IPv6 address",
2: "URL",
3: "SIP URI",
}
GateStatus = {
0: "OPEN",
1: "CLOSED",
2: "CLOSED_RESERVED_2",
3: "CLOSED_RESERVED_3",
}
TimerUnit = {
0: '2 seconds',
1: '1 minute',
2: '10 minutes',
3: '1 hour',
4: '10 hours',
7: 'infinite',
}
OuterHeaderRemovalDescription = {
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",
}
NodeIdType = {
0: "IPv4",
1: "IPv6",
2: "FQDN",
}
FqCSIDNodeIdType = {
0: "IPv4",
1: "IPv6",
2: "MCCMNCId",
}
FlowDirection = {
0: "Unspecified",
1: "Downlink", # traffic to the UE
2: "Uplink", # traffic from the UE
3: "Bidirectional",
4: "Unspecified4",
5: "Unspecified5",
6: "Unspecified6",
7: "Unspecified7",
}
TimeUnit = {
0: "minute",
1: "6 minutes",
2: "hour",
3: "day",
4: "week",
5: "min5", # same as 0 (minute)
6: "min6", # same as 0 (minute)
7: "min7", # same as 0 (minute)
}
HeaderType = {
0: "HTTP",
}
PDNType = {
0: "IPv4",
1: "IPv6",
2: "IPv4v6",
3: "Non-IP",
4: "Ethernet",
}
RuleIDType = {
0: "PDR",
1: "FAR",
2: "QER",
3: "URR",
4: "BAR",
# TODO: other values should be interpreted as '1' if received
}
BaseTimeInterval = {
0: "CTP",
1: "DTP",
}
InterfaceType = {
0: "S1-U",
1: "S5 /S8-U",
2: "S4-U",
3: "S11-U",
4: "S12-U",
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",
}
class PFCPLengthMixin(object):
def post_build(self, p, pay):
p += pay
if self.length is None:
tmp_len = len(p) - 4
p = p[:2] + struct.pack("!H", tmp_len) + p[4:]
return p
class PFCP(PFCPLengthMixin, Packet):
# 3GPP TS 29.244 V15.6.0 (2019-07)
# without the version
name = "PFCP (v1) Header"
fields_desc = [
BitField("version", 1, 3),
XBitField("spare_b2", 0, 1),
XBitField("spare_b3", 0, 1),
XBitField("spare_b4", 0, 1),
BitField("MP", 0, 1),
BitField("S", 1, 1),
ByteEnumField("message_type", None, PFCPmessageType),
ShortField("length", None),
ConditionalField(XLongField("seid", 0),
lambda pkt:pkt.S == 1),
ThreeBytesField("seq", 0),
ConditionalField(BitField("priority", 0, 4),
lambda pkt:pkt.MP == 1),
ConditionalField(BitField("spare_p", 0, 4),
lambda pkt:pkt.MP == 1),
ConditionalField(ByteField("spare_oct", 0),
lambda pkt:pkt.MP == 0),
]
def hashret(self):
return struct.pack("B", self.version) + struct.pack("I", self.seq) + \
self.payload.hashret()
def answers(self, other):
return (isinstance(other, PFCP) and
self.version == other.version and
self.seq == other.seq and
self.payload.answers(other.payload))
class APNStrLenField(StrLenField):
# Inspired by DNSStrField
def m2i(self, pkt, s):
ret_s = b""
tmp_s = s
while tmp_s:
tmp_len = orb(tmp_s[0]) + 1
if tmp_len > len(tmp_s):
warning("APN prematured end of character-string (size=%i, remaining bytes=%i)" % (tmp_len, len(tmp_s))) # noqa: E501
ret_s += tmp_s[1:tmp_len]
tmp_s = tmp_s[tmp_len:]
if len(tmp_s):
ret_s += b"."
s = ret_s
return s
def i2m(self, pkt, s):
s = b"".join(chb(len(x)) + x for x in s.split(b"."))
return s
class ExtraDataField(StrField):
def __init__(self, name, default=b""):
StrField.__init__(self, name, default)
def addfield(self, pkt, s, val):
return s + self.i2m(pkt, val)
def getfield(self, pkt, s):
# + 4 accounts for the ietype and length fields
p = len(pkt.original) - len(s)
length = pkt.length + 4 - p
return s[length:], self.m2i(pkt, s[:length])
def randval(self):
return RandBin(RandNum(0, 2))
class Int40Field(Field):
def __init__(self, name, default):
Field.__init__(self, name, default, "BI")
def addfield(self, pkt, s, val):
val = self.i2m(pkt, val)
return s + struct.pack("!BI", val >> 32, val & 0xffffffff)
def getfield(self, pkt, s):
hi, lo = struct.unpack("!BI", s[:5])
return s[5:], self.m2i(pkt, (hi << 32) + lo)
def randval(self):
return RandNum(0, 2**40 - 1)
def IE_Dispatcher(s):
"""Choose the correct Information Element class."""
# Get the IE type
ietype = (orb(s[0]) * 256) + orb(s[1])
if ietype & 0x8000:
return IE_EnterpriseSpecific(s)
cls = ietypecls.get(ietype, Raw)
if cls is Raw:
cls = IE_NotImplemented
return cls(s)
class IE_Base(PFCPLengthMixin, Packet):
default_length = None
def __init__(self, *args, **kwargs):
self.fields_desc[0].default = self.ie_type
self.fields_desc[1].default = self.default_length
super(IE_Base, self).__init__(*args, **kwargs)
def extract_padding(self, pkt):
return "", pkt
fields_desc = [
ShortEnumField("ietype", 0, IEType),
ShortField("length", None)
]
class IE_Compound(IE_Base):
fields_desc = IE_Base.fields_desc + [
PacketListField("IE_list", None, IE_Dispatcher,
length_from=lambda pkt: pkt.length)
]
class IE_CreatePDR(IE_Compound):
name = "IE Create PDR"
ie_type = 1
class IE_PDI(IE_Compound):
name = "IE PDI"
ie_type = 2
class IE_CreateFAR(IE_Compound):
name = "IE Create FAR"
ie_type = 3
class IE_ForwardingParameters(IE_Compound):
name = "IE Forwarding Parameters"
ie_type = 4
class IE_DuplicatingParameters(IE_Compound):
name = "IE Duplicating Parameters"
ie_type = 5
class IE_CreateURR(IE_Compound):
name = "IE Create URR"
ie_type = 6
class IE_CreateQER(IE_Compound):
name = "IE Create QER"
ie_type = 7
class IE_CreatedPDR(IE_Compound):
name = "IE Created PDR"
ie_type = 8
class IE_UpdatePDR(IE_Compound):
name = "IE Update PDR"
ie_type = 9
class IE_UpdateFAR(IE_Compound):
name = "IE Update FAR"
ie_type = 10
class IE_UpdateForwardingParameters(IE_Compound):
name = "IE Update Forwarding Parameters"
ie_type = 11
class IE_UpdateBAR_SRR(IE_Compound):
name = "IE Update BAR (PFCP Session Report Response)"
ie_type = 12
class IE_UpdateURR(IE_Compound):
name = "IE Update URR"
ie_type = 13
class IE_UpdateQER(IE_Compound):
name = "IE Update QER"
ie_type = 14
class IE_RemovePDR(IE_Compound):
name = "IE Remove PDR"
ie_type = 15
class IE_RemoveFAR(IE_Compound):
name = "IE Remove FAR"
ie_type = 16
class IE_RemoveURR(IE_Compound):
name = "IE Remove URR"
ie_type = 17
class IE_RemoveQER(IE_Compound):
name = "IE Remove QER"
ie_type = 18
class IE_LoadControlInformation(IE_Compound):
name = "IE Load Control Information"
ie_type = 51
class IE_OverloadControlInformation(IE_Compound):
name = "IE Overload Control Information"
ie_type = 54
class IE_ApplicationID_PFDs(IE_Compound):
name = "IE Application ID's PFDs"
ie_type = 58
class IE_PFDContext(IE_Compound):
name = "IE PFD context"
ie_type = 59
class IE_ApplicationDetectionInformation(IE_Compound):
name = "IE Application Detection Information"
ie_type = 68
class IE_QueryURR(IE_Compound):
name = "IE Query URR"
ie_type = 77
class IE_UsageReport_SMR(IE_Compound):
name = "IE Usage Report (Session Modification Response)"
ie_type = 78
class IE_UsageReport_SDR(IE_Compound):
name = "IE Usage Report (Session Deletion Response)"
ie_type = 79
class IE_UsageReport_SRR(IE_Compound):
name = "IE Usage Report (Session Report Request)"
ie_type = 80
class IE_DownlinkDataReport(IE_Compound):
name = "IE Downlink Data Report"
ie_type = 83
class IE_Create_BAR(IE_Compound):
name = "IE Create BAR"
ie_type = 85
class IE_Update_BAR_SMR(IE_Compound):
name = "IE Update BAR (Session Modification Request)"
ie_type = 86
class IE_Remove_BAR(IE_Compound):
name = "IE Remove BAR"
ie_type = 87
class IE_ErrorIndicationReport(IE_Compound):
name = "IE Error Indication Report"
ie_type = 99
class IE_UserPlanePathFailureReport(IE_Compound):
name = "IE User Plane Path Failure Report"
ie_type = 102
class IE_UpdateDuplicatingParameters(IE_Compound):
name = "IE Update Duplicating Parameters"
ie_type = 105
class IE_AggregatedURRs(IE_Compound):
name = "IE Aggregated URRs"
ie_type = 118
class IE_CreateTrafficEndpoint(IE_Compound):
name = "IE Create Traffic Endpoint"
ie_type = 127
class IE_CreatedTrafficEndpoint(IE_Compound):
name = "IE Created Traffic Endpoint"
ie_type = 128
class IE_UpdateTrafficEndpoint(IE_Compound):
name = "IE Update Traffic Endpoint"
ie_type = 129
class IE_RemoveTrafficEndpoint(IE_Compound):
name = "IE Remove Traffic Endpoint"
ie_type = 130
class IE_EthernetPacketFilter(IE_Compound):
name = "IE Ethernet Packet Filter"
ie_type = 132
class IE_EthernetTrafficInformation(IE_Compound):
name = "IE Ethernet Traffic Information"
ie_type = 143
class IE_AdditionalMonitoringTime(IE_Compound):
name = "IE Additional Monitoring Time"
ie_type = 147
class IE_Cause(IE_Base):
ie_type = 19
name = "IE Cause"
fields_desc = IE_Base.fields_desc + [
ByteEnumField("cause", None, CauseValues)
]
class IE_SourceInterface(IE_Base):
name = "IE Source Interface"
ie_type = 20
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 4),
BitEnumField("interface", "Access", 4, SourceInterface),
ExtraDataField("extra_data"),
]
class IE_FTEID(IE_Base):
name = "IE F-TEID"
ie_type = 21
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 4),
BitField("CHID", 0, 1),
BitField("CH", 0, 1),
BitField("V6", 0, 1),
BitField("V4", 0, 1),
ConditionalField(XIntField("TEID", 0), lambda x: x.CH == 0),
ConditionalField(IPField("ipv4", 0),
lambda x: x.V4 == 1 and x.CH == 0),
ConditionalField(IP6Field("ipv6", 0),
lambda x: x.V6 == 1 and x.CH == 0),
ConditionalField(ByteField("choose_id", 0),
lambda x: x.CHID == 1),
ExtraDataField("extra_data"),
]
class IE_NetworkInstance(IE_Base):
name = "IE Network Instance"
ie_type = 22
fields_desc = IE_Base.fields_desc + [
APNStrLenField("instance", "", length_from=lambda x: x.length)
]
class IE_SDF_Filter(IE_Base):
name = "IE SDF Filter"
ie_type = 23
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 3),
BitField("BID", 0, 1),
BitField("FL", 0, 1),
BitField("SPI", 0, 1),
BitField("TTC", 0, 1),
BitField("FD", 0, 1),
ByteField("spare_oct", 0),
ConditionalField(FieldLenField("flow_description_length", None,
length_of="flow_description"),
lambda pkt: pkt.FD == 1),
ConditionalField(StrLenField("flow_description", "",
length_from=lambda pkt:
pkt.flow_description_length),
lambda pkt: pkt.FD == 1),
ConditionalField(ByteField("tos_traffic_class", 0),
lambda pkt: pkt.TTC == 1),
ConditionalField(ByteField("tos_traffic_mask", 0),
lambda pkt: pkt.TTC == 1),
ConditionalField(IntField("security_parameter_index", 0),
lambda pkt: pkt.SPI == 1),
ConditionalField(ThreeBytesField("flow_label", 0),
lambda pkt: pkt.FL == 1),
ConditionalField(IntField("sdf_filter_id", 0),
lambda pkt: pkt.BID == 1),
ExtraDataField("extra_data"),
]
class IE_ApplicationId(IE_Base):
name = "IE Application ID"
ie_type = 24
fields_desc = IE_Base.fields_desc + [
StrLenField("id", "", length_from=lambda x: x.length),
]
class IE_GateStatus(IE_Base):
name = "IE Gate Status"
ie_type = 25
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 4),
BitEnumField("ul", "OPEN", 2, GateStatus),
BitEnumField("dl", "OPEN", 2, GateStatus),
ExtraDataField("extra_data"),
]
class IE_MBR(IE_Base):
name = "IE MBR"
ie_type = 26
fields_desc = IE_Base.fields_desc + [
Int40Field("ul", 0),
Int40Field("dl", 0),
ExtraDataField("extra_data"),
]
class IE_GBR(IE_Base):
name = "IE GBR"
ie_type = 27
fields_desc = IE_Base.fields_desc + [
Int40Field("ul", 0),
Int40Field("dl", 0),
ExtraDataField("extra_data"),
]
class IE_QERCorrelationId(IE_Base):
name = "IE QER Correlation ID"
ie_type = 28
fields_desc = IE_Base.fields_desc + [
IntField("id", 0),
ExtraDataField("extra_data"),
]
class IE_Precedence(IE_Base):
name = "IE Precedence"
ie_type = 29
fields_desc = IE_Base.fields_desc + [
IntField("precedence", 0),
ExtraDataField("extra_data"),
]
class IE_TransportLevelMarking(IE_Base):
name = "IE Transport Level Marking"
ie_type = 30
fields_desc = IE_Base.fields_desc + [
XByteField("tos", 0),
XByteField("traffic_class", 0),
ExtraDataField("extra_data"),
]
class IE_VolumeThreshold(IE_Base):
name = "IE Volume Threshold"
ie_type = 31
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 5),
BitField("DLVOL", 0, 1),
BitField("ULVOL", 0, 1),
BitField("TOVOL", 0, 1),
ConditionalField(XLongField("total", 0), lambda x: x.TOVOL == 1),
ConditionalField(XLongField("uplink", 0), lambda x: x.ULVOL == 1),
ConditionalField(XLongField("downlink", 0), lambda x: x.DLVOL == 1),
ExtraDataField("extra_data"),
]
class IE_TimeThreshold(IE_Base):
name = "IE Time Threshold"
ie_type = 32
fields_desc = IE_Base.fields_desc + [
IntField("threshold", 0),
ExtraDataField("extra_data"),
]
class IE_MonitoringTime(IE_Base):
name = "IE Monitoring Time"
ie_type = 33
fields_desc = IE_Base.fields_desc + [
IntField("time_value", 0),
ExtraDataField("extra_data"),
]
class IE_SubsequentVolumeThreshold(IE_Base):
name = "IE Subsequent Volume Threshold"
ie_type = 34
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 5),
BitField("DLVOL", 0, 1),
BitField("ULVOL", 0, 1),
BitField("TOVOL", 0, 1),
ConditionalField(XLongField("total", 0), lambda x: x.TOVOL == 1),
ConditionalField(XLongField("uplink", 0), lambda x: x.ULVOL == 1),
ConditionalField(XLongField("downlink", 0), lambda x: x.DLVOL == 1),
ExtraDataField("extra_data"),
]
class IE_SubsequentTimeThreshold(IE_Base):
name = "IE Subsequent Time Threshold"
ie_type = 35
fields_desc = IE_Base.fields_desc + [
IntField("threshold", 0),
ExtraDataField("extra_data"),
]
class IE_InactivityDetectionTime(IE_Base):
name = "IE Inactivity Detection Time"
ie_type = 36
fields_desc = IE_Base.fields_desc + [
IntField("time_value", 0),
ExtraDataField("extra_data"),
]
class IE_ReportingTriggers(IE_Base):
name = "IE Reporting Triggers"
ie_type = 37
fields_desc = IE_Base.fields_desc + [
BitField("linked_usage_reporting", 0, 1),
BitField("dropped_dl_traffic_threshold", 0, 1),
BitField("stop_of_traffic", 0, 1),
BitField("start_of_traffic", 0, 1),
BitField("quota_holding_time", 0, 1),
BitField("time_threshold", 0, 1),
BitField("volume_threshold", 0, 1),
BitField("periodic_reporting", 0, 1),
XBitField("spare", 0, 2),
BitField("event_quota", 0, 1),
BitField("event_threshold", 0, 1),
BitField("mac_addresses_reporting", 0, 1),
BitField("envelope_closure", 0, 1),
BitField("time_quota", 0, 1),
BitField("volume_quota", 0, 1),
ExtraDataField("extra_data"),
]
class IE_RedirectInformation(IE_Base):
name = "IE Redirect Information"
ie_type = 38
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 4),
BitEnumField("type", "IPv4 address", 4, RedirectAddressType),
FieldLenField("address_length", None, length_of="address"),
StrLenField("address", "", length_from=lambda pkt: pkt.address_length),
ExtraDataField("extra_data"),
]
class IE_ReportType(IE_Base):
name = "IE Report Type"
ie_type = 39
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 4),
BitField("UPIR", 0, 1),
BitField("ERIR", 0, 1),
BitField("USAR", 0, 1),
BitField("DLDR", 0, 1),
ExtraDataField("extra_data"),
]
class IE_OffendingIE(IE_Base):
name = "IE Offending IE"
ie_type = 40
fields_desc = IE_Base.fields_desc + [
ShortEnumField("type", None, IEType)
]
class IE_ForwardingPolicy(IE_Base):
name = "IE Forwarding Policy"
ie_type = 41
fields_desc = IE_Base.fields_desc + [
FieldLenField("policy_identifier_length", None,
length_of="policy_identifier", fmt="B"),
StrLenField("policy_identifier", "",
length_from=lambda pkt: pkt.policy_identifier_length)
]
class IE_DestinationInterface(IE_Base):
name = "IE Destination Interface"
ie_type = 42
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 4),
BitEnumField("interface", "Access", 4, DestinationInterface),
ExtraDataField("extra_data"),
]
class IE_UPFunctionFeatures(IE_Base):
name = "IE UP Function Features"
ie_type = 43
default_length = 2
fields_desc = IE_Base.fields_desc + [
ConditionalField(BitField("TREU", None, 1), lambda x: x.length > 0),
ConditionalField(BitField("HEEU", None, 1), lambda x: x.length > 0),
ConditionalField(BitField("PFDM", None, 1), lambda x: x.length > 0),
ConditionalField(BitField("FTUP", None, 1), lambda x: x.length > 0),
ConditionalField(BitField("TRST", None, 1), lambda x: x.length > 0),
ConditionalField(BitField("DLBD", None, 1), lambda x: x.length > 0),
ConditionalField(BitField("DDND", None, 1), lambda x: x.length > 0),
ConditionalField(BitField("BUCP", None, 1), lambda x: x.length > 0),
ConditionalField(BitField("spare", None, 1), lambda x: x.length > 1),
ConditionalField(BitField("PFDE", None, 1), lambda x: x.length > 1),
ConditionalField(BitField("FRRT", None, 1), lambda x: x.length > 1),
ConditionalField(BitField("TRACE", None, 1), lambda x: x.length > 1),
ConditionalField(BitField("QUOAC", None, 1), lambda x: x.length > 1),
ConditionalField(BitField("UDBC", None, 1), lambda x: x.length > 1),
ConditionalField(BitField("PDIU", None, 1), lambda x: x.length > 1),
ConditionalField(BitField("EMPU", None, 1), lambda x: x.length > 1),
ExtraDataField("extra_data"),
]
class IE_ApplyAction(IE_Base):
name = "IE Apply Action"
ie_type = 44
fields_desc = IE_Base.fields_desc + [
XBitField("spare", None, 3),
BitField("DUPL", 0, 1),
BitField("NOCP", 0, 1),
BitField("BUFF", 0, 1),
BitField("FORW", 0, 1),
BitField("DROP", 0, 1),
ExtraDataField("extra_data"),
]
class IE_DownlinkDataServiceInformation(IE_Base):
name = "IE Downlink Data Service Information"
ie_type = 45
fields_desc = IE_Base.fields_desc + [
XBitField("spare_1", None, 6),
BitField("QFII", 0, 1),
BitField("PPI", 0, 1),
ConditionalField(
XBitField("spare_2", None, 2),
lambda x: x.PPI == 1),
ConditionalField(
XBitField("ppi_val", None, 6),
lambda x: x.PPI == 1),
ConditionalField(
XBitField("spare_3", None, 2),
lambda x: x.QFII == 1),
ConditionalField(
XBitField("qfi_val", None, 6),
lambda x: x.QFII == 1),
ExtraDataField("extra_data"),
]
class IE_DownlinkDataNotificationDelay(IE_Base):
name = "IE Downlink Data Notification Delay"
ie_type = 46
fields_desc = IE_Base.fields_desc + [
ByteField("delay", 0), # in multiples of 50
ExtraDataField("extra_data"),
]
class IE_DLBufferingDuration(IE_Base):
name = "IE DL Buffering Duration"
ie_type = 47
fields_desc = IE_Base.fields_desc + [
BitEnumField("timer_unit", "2 seconds", 3, TimerUnit),
BitField("timer_value", 0, 5),
ExtraDataField("extra_data"),
]
class IE_DLBufferingSuggestedPacketCount(IE_Base):
name = "IE DL Buffering Suggested Packet Count"
ie_type = 48
fields_desc = IE_Base.fields_desc + [
MultipleTypeField([
(
ByteField("count", 0),
(lambda x: x.length == 1,
lambda x, val: x.length == 1 or
(x.length is None and val < 256)),
),
(
ShortField("count", 0),
(lambda x: x.length == 2,
lambda x, val: x.length == 1 or
(x.length is None and val >= 256))
),
], ByteField("count", 0))
]
class IE_PFCPSMReqFlags(IE_Base):
name = "IE PFCPSMReq-Flags"
ie_type = 49
fields_desc = IE_Base.fields_desc + [
XBitField("spare", None, 5),
BitField("QUARR", 0, 1),
BitField("SNDEM", 0, 1),
BitField("DROBU", 0, 1),
ExtraDataField("extra_data"),
]
class IE_PFCPSRRspFlags(IE_Base):
name = "IE PFCPSRRsp-Flags"
ie_type = 50
fields_desc = IE_Base.fields_desc + [
XBitField("spare", None, 7),
BitField("DROBU", 0, 1),
ExtraDataField("extra_data"),
]
class IE_SequenceNumber(IE_Base):
name = "IE Sequence Number"
ie_type = 52
fields_desc = IE_Base.fields_desc + [
IntField("number", 0),
]
class IE_Metric(IE_Base):
name = "IE Metric"
ie_type = 53
fields_desc = IE_Base.fields_desc + [
ByteField("metric", 0),
]
class IE_Timer(IE_Base):
name = "IE Timer"
ie_type = 55
fields_desc = IE_Base.fields_desc + [
BitEnumField("timer_unit", "2 seconds", 3, TimerUnit),
BitField("timer_value", 0, 5),
ExtraDataField("extra_data"),
]
class IE_PDR_Id(IE_Base):
name = "IE PDR ID"
ie_type = 56
fields_desc = IE_Base.fields_desc + [
ShortField("id", 0),
ExtraDataField("extra_data"),
]
class IE_FSEID(IE_Base):
name = "IE F-SEID"
ie_type = 57
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 6),
BitField("v4", 0, 1),
BitField("v6", 0, 1),
XLongField("seid", 0),
ConditionalField(IPField("ipv4", 0),
lambda x: x.v4 == 1),
ConditionalField(IP6Field("ipv6", 0),
lambda x: x.v6 == 1),
ExtraDataField("extra_data"),
]
class IE_NodeId(IE_Base):
name = "IE Node ID"
ie_type = 60
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 4),
BitEnumField("id_type", "IPv4", 4, NodeIdType),
ConditionalField(IPField("ipv4", 0),
lambda x: x.id_type == 0),
ConditionalField(IP6Field("ipv6", 0),
lambda x: x.id_type == 1),
ConditionalField(
APNStrLenField("id", "", length_from=lambda x: x.length - 1),
lambda x: x.id_type == 2),
ExtraDataField("extra_data"),
]
class IE_PFDContents(IE_Base):
name = "IE PFD contents"
ie_type = 61
fields_desc = IE_Base.fields_desc + [
BitField("ADNP", 0, 1),
BitField("AURL", 0, 1),
BitField("AFD", 0, 1),
BitField("DNP", 0, 1),
BitField("CP", 0, 1),
BitField("DN", 0, 1),
BitField("URL", 0, 1),
BitField("FD", 0, 1),
ByteField("spare_2", 0),
ConditionalField(FieldLenField("flow_length", None, length_of="flow"),
lambda pkt: pkt.FD == 1),
ConditionalField(StrLenField("flow", "",
length_from=lambda pkt: pkt.flow_length),
lambda pkt: pkt.FD == 1),
ConditionalField(FieldLenField("url_length", None, length_of="url"),
lambda pkt: pkt.URL == 1),
ConditionalField(StrLenField("url", "",
length_from=lambda pkt: pkt.url_length),
lambda pkt: pkt.URL == 1),
ConditionalField(FieldLenField("domain_length", None,
length_of="domain"),
lambda pkt: pkt.DN == 1),
ConditionalField(
StrLenField("domain", "",
length_from=lambda pkt: pkt.domain_length),
lambda pkt: pkt.DN == 1),
ConditionalField(FieldLenField("custom_length", None,
length_of="custom"),
lambda pkt: pkt.CP == 1),
ConditionalField(
StrLenField("custom", "",
length_from=lambda pkt: pkt.custom_length),
lambda pkt: pkt.CP == 1),
ConditionalField(FieldLenField("dnp_length", None, length_of="dnp"),
lambda pkt: pkt.DNP == 1),
ConditionalField(StrLenField("dnp", "",
length_from=lambda pkt: pkt.dnp_length),
lambda pkt: pkt.DNP == 1),
ConditionalField(FieldLenField("additional_flow_length", None,
length_of="additional_flow"),
lambda pkt: pkt.AFD == 1),
ConditionalField(
StrLenField("additional_flow", "",
length_from=lambda pkt: pkt.additional_flow_length),
lambda pkt: pkt.AFD == 1),
ConditionalField(FieldLenField("additional_url_length", None,
length_of="additional_url"),
lambda pkt: pkt.AURL == 1),
ConditionalField(
StrLenField("additional_url", "",
length_from=lambda pkt: pkt.additional_url_length),
lambda pkt: pkt.AURL == 1),
ConditionalField(
FieldLenField("additional_dn_dnp_length", None,
length_of="additional_dn_dnp"),
lambda pkt: pkt.ADNP == 1),
ConditionalField(
StrLenField("additional_dn_dnp", "",
length_from=lambda pkt: pkt.additional_dn_dnp_length),
lambda pkt: pkt.ADNP == 1),
ExtraDataField("extra_data"),
]
class IE_MeasurementMethod(IE_Base):
name = "IE Measurement Method"
ie_type = 62
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 5),
BitField("EVENT", 0, 1),
BitField("VOLUM", 0, 1),
BitField("DURAT", 0, 1),
ExtraDataField("extra_data"),
]
class IE_UsageReportTrigger(IE_Base):
name = "IE Usage Report Trigger"
ie_type = 63
fields_desc = IE_Base.fields_desc + [
BitField("IMMER", 0, 1),
BitField("DROTH", 0, 1),
BitField("STOPT", 0, 1),
BitField("START", 0, 1),
BitField("QUHTI", 0, 1),
BitField("TIMTH", 0, 1),
BitField("VOLTH", 0, 1),
BitField("PERIO", 0, 1),
BitField("EVETH", 0, 1),
BitField("MACAR", 0, 1),
BitField("ENVCL", 0, 1),
BitField("MONIT", 0, 1),
BitField("TERMR", 0, 1),
BitField("LIUSA", 0, 1),
BitField("TIMQU", 0, 1),
BitField("VOLQU", 0, 1),
ExtraDataField("extra_data"),
]
class IE_MeasurementPeriod(IE_Base):
name = "IE Measurement Period"
ie_type = 64
fields_desc = IE_Base.fields_desc + [
IntField("period", 0),
ExtraDataField("extra_data"),
]
class IE_FqCSID(IE_Base):
name = "IE FQ-CSID"
ie_type = 65
fields_desc = IE_Base.fields_desc + [
BitEnumField("node_id_type", "IPv4", 4, FqCSIDNodeIdType),
BitFieldLenField("num_csids", None, 4, count_of="csids"),
ConditionalField(IPField("ipv4", 0),
lambda x: x.node_id_type == 0),
ConditionalField(IP6Field("ipv6", 0),
lambda x: x.node_id_type == 1),
ConditionalField(
# FIXME: split (value = mcc * 1000 + mnc)
BitField("mcc_mnc", 0, 20),
lambda x: x.node_id_type == 2),
# "Least significant 12 bits is a 12 bit integer assigned by
# an operator to an MME, SGW-C, SGW-U, PGW-C or PGW-U."
ConditionalField(
BitField("extra_id", 0, 12),
lambda x: x.node_id_type == 2),
FieldListField("csids", None, ShortField("csid", 0),
count_from=lambda x: x.num_csids),
ExtraDataField("extra_data"),
]
class IE_VolumeMeasurement(IE_Base):
name = "IE Volume Measurement"
ie_type = 66
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 5),
BitField("DLVOL", 0, 1),
BitField("ULVOL", 0, 1),
BitField("TOVOL", 0, 1),
ConditionalField(XLongField("total", 0), lambda x: x.TOVOL == 1),
ConditionalField(XLongField("uplink", 0), lambda x: x.ULVOL == 1),
ConditionalField(XLongField("downlink", 0), lambda x: x.DLVOL == 1),
ExtraDataField("extra_data"),
]
class IE_DurationMeasurement(IE_Base):
name = "IE Duration Measurement"
ie_type = 67
fields_desc = IE_Base.fields_desc + [
IntField("duration", 0),
ExtraDataField("extra_data"),
]
class IE_TimeOfFirstPacket(IE_Base):
name = "IE Time of First Packet"
ie_type = 69
fields_desc = IE_Base.fields_desc + [
IntField("timestamp", 0),
ExtraDataField("extra_data"),
]
class IE_TimeOfLastPacket(IE_Base):
name = "IE Time of Last Packet"
ie_type = 70
fields_desc = IE_Base.fields_desc + [
IntField("timestamp", 0),
ExtraDataField("extra_data"),
]
class IE_QuotaHoldingTime(IE_Base):
name = "IE Quota Holding Time"
ie_type = 71
fields_desc = IE_Base.fields_desc + [
IntField("time_value", 0),
ExtraDataField("extra_data"),
]
class IE_DroppedDLTrafficThreshold(IE_Base):
name = "IE Dropped DL Traffic Threshold"
ie_type = 72
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 6),
BitField("DLBY", 0, 1),
BitField("DLPA", 0, 1),
ConditionalField(LongField("packet_count", 0),
lambda x: x.DLPA == 1),
ConditionalField(LongField("byte_count", 0),
lambda x: x.DLBY == 1),
ExtraDataField("extra_data"),
]
class IE_VolumeQuota(IE_Base):
name = "IE Volume Quota"
ie_type = 73
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 5),
BitField("DLVOL", 0, 1),
BitField("ULVOL", 0, 1),
BitField("TOVOL", 0, 1),
ConditionalField(XLongField("total", 0), lambda x: x.TOVOL == 1),
ConditionalField(XLongField("uplink", 0), lambda x: x.ULVOL == 1),
ConditionalField(XLongField("downlink", 0), lambda x: x.DLVOL == 1),
ExtraDataField("extra_data"),
]
class IE_TimeQuota(IE_Base):
name = "IE Time Quota"
ie_type = 74
fields_desc = IE_Base.fields_desc + [
IntField("quota", 0),
ExtraDataField("extra_data"),
]
class IE_StartTime(IE_Base):
name = "IE Start Time"
ie_type = 75
fields_desc = IE_Base.fields_desc + [
IntField("timestamp", 0),
ExtraDataField("extra_data"),
]
class IE_EndTime(IE_Base):
name = "IE End Time"
ie_type = 76
fields_desc = IE_Base.fields_desc + [
IntField("timestamp", 0),
ExtraDataField("extra_data"),
]
class IE_URR_Id(IE_Base):
name = "IE URR ID"
ie_type = 81
fields_desc = IE_Base.fields_desc + [
IntField("id", 0),
ExtraDataField("extra_data"),
]
class IE_LinkedURR_Id(IE_Base):
name = "IE Linked URR ID"
ie_type = 82
fields_desc = IE_Base.fields_desc + [
IntField("id", 0),
ExtraDataField("extra_data"),
]
class IE_OuterHeaderCreation(IE_Base):
name = "IE Outer Header Creation"
ie_type = 84
fields_desc = IE_Base.fields_desc + [
BitField("STAG", 0, 1),
BitField("CTAG", 0, 1),
BitField("IPV6", 0, 1),
BitField("IPV4", 0, 1),
BitField("UDPIPV6", 0, 1),
BitField("UDPIPV4", 0, 1),
BitField("GTPUUDPIPV6", 0, 1),
BitField("GTPUUDPIPV4", 0, 1),
ByteField("spare", 0),
ConditionalField(XIntField("TEID", 0),
lambda x: x.GTPUUDPIPV4 == 1 or x.GTPUUDPIPV6 == 1),
ConditionalField(IPField("ipv4", 0),
lambda x:
x.IPV4 == 1 or x.UDPIPV4 == 1 or x.GTPUUDPIPV4 == 1),
ConditionalField(IP6Field("ipv6", 0),
lambda x:
x.IPV6 == 1 or x.UDPIPV6 == 1 or x.GTPUUDPIPV6 == 1),
ConditionalField(ShortField("port", 0),
lambda x: x.UDPIPV4 == 1 or x.UDPIPV6 == 1),
ConditionalField(ThreeBytesField("ctag", 0),
lambda x: x.CTAG == 1),
ConditionalField(ThreeBytesField("stag", 0),
lambda x: x.STAG == 1),
ExtraDataField("extra_data"),
]
class IE_BAR_Id(IE_Base):
name = "IE BAR ID"
ie_type = 88
fields_desc = IE_Base.fields_desc + [
ByteField("id", 0),
ExtraDataField("extra_data"),
]
class IE_CPFunctionFeatures(IE_Base):
name = "IE CP Function Features"
ie_type = 89
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 6),
BitField("OVRL", 0, 1),
BitField("LOAD", 0, 1),
ExtraDataField("extra_data"),
]
class IE_UsageInformation(IE_Base):
name = "IE Usage Information"
ie_type = 90
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 4),
BitField("UBE", 0, 1),
BitField("UAE", 0, 1),
BitField("AFT", 0, 1),
BitField("BEF", 0, 1),
ExtraDataField("extra_data"),
]
class IE_ApplicationInstanceId(IE_Base):
name = "IE Application Instance ID"
ie_type = 91
fields_desc = IE_Base.fields_desc + [
StrLenField("id", "", length_from=lambda x: x.length)
]
class IE_FlowInformation(IE_Base):
name = "IE Flow Information"
ie_type = 92
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 5),
BitEnumField("direction", "Unspecified", 3, FlowDirection),
FieldLenField("flow_length", None, length_of="flow"),
StrLenField("flow", "", length_from=lambda x: x.flow_length),
ExtraDataField("extra_data"),
]
class IE_UE_IP_Address(IE_Base):
name = "IE UE IP Address"
ie_type = 93
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 5),
BitField("SD", 0, 1), # source or dest
BitField("V4", 0, 1),
BitField("V6", 0, 1),
ConditionalField(IPField("ipv4", 0), lambda x: x.V4 == 1),
ConditionalField(IP6Field("ipv6", 0), lambda x: x.V6 == 1),
ExtraDataField("extra_data"),
]
class IE_PacketRate(IE_Base):
name = "IE Packet Rate"
ie_type = 94
fields_desc = IE_Base.fields_desc + [
XBitField("spare_1", 0, 6),
BitField("DLPR", 0, 1),
BitField("ULPR", 0, 1),
ConditionalField(BitField("spare_2", 0, 5), lambda x: x.ULPR == 1),
ConditionalField(BitEnumField("ul_time_unit", "minute", 3, TimeUnit),
lambda x: x.ULPR == 1),
ConditionalField(ShortField("ul_max_packet_rate", 0),
lambda x: x.ULPR == 1),
ConditionalField(BitField("spare_3", 0, 5), lambda x: x.DLPR == 1),
ConditionalField(BitEnumField("dl_time_unit", "minute", 3, TimeUnit),
lambda x: x.DLPR == 1),
ConditionalField(ShortField("dl_max_packet_rate", 0),
lambda x: x.DLPR == 1),
ExtraDataField("extra_data"),
]
class IE_OuterHeaderRemoval(IE_Base):
name = "IE Outer Header Removal"
ie_type = 95
fields_desc = IE_Base.fields_desc + [
ByteEnumField("header", None, OuterHeaderRemovalDescription),
ConditionalField(XBitField("spare", None, 7),
lambda x: x.length is not None and x.length > 1),
ConditionalField(BitField("pdu_session_container", None, 1),
lambda x: x.length is not None and x.length > 1),
ExtraDataField("extra_data"),
]
class IE_RecoveryTimeStamp(IE_Base):
name = "IE Recovery Time Stamp"
ie_type = 96
default_length = 4
fields_desc = IE_Base.fields_desc + [
IntField("timestamp", 0),
ExtraDataField("extra_data"),
]
class IE_DLFlowLevelMarking(IE_Base):
name = "IE DL Flow Level Marking"
ie_type = 97
fields_desc = IE_Base.fields_desc + [
XBitField("spare_1", 0, 6),
BitField("SCI", 0, 1),
BitField("TTC", 0, 1),
ConditionalField(ByteField("traffic_class", 0), lambda x: x.TTC),
ConditionalField(ByteField("traffic_class_mask", 0), lambda x: x.TTC),
ConditionalField(ByteField("service_class_indicator", 0),
lambda x: x.SCI),
ConditionalField(ByteField("spare_2", 0), lambda x: x.SCI),
ExtraDataField("extra_data"),
]
class IE_HeaderEnrichment(IE_Base):
name = "IE Header Enrichment"
ie_type = 98
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 3),
BitEnumField("header_type", "HTTP", 5, HeaderType),
FieldLenField("name_length", None, fmt="B", length_of="name"),
StrLenField("name", "", length_from=lambda x: x.name_length),
FieldLenField("value_length", None, fmt="B", length_of="value"),
StrLenField("value", "", length_from=lambda x: x.value_length),
ExtraDataField("extra_data"),
]
class IE_MeasurementInformation(IE_Base):
name = "IE Measurement Information"
ie_type = 100
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 3),
BitField("MNOP", 0, 1),
BitField("ISTM", 0, 1),
BitField("RADI", 0, 1),
BitField("INAM", 0, 1),
BitField("MBQE", 0, 1),
ExtraDataField("extra_data"),
]
class IE_NodeReportType(IE_Base):
name = "IE Node Report Type"
ie_type = 101
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 7),
BitField("UPFR", 0, 1),
ExtraDataField("extra_data"),
]
class IE_RemoteGTP_U_Peer(IE_Base):
name = "IE Remote GTP-U Peer"
ie_type = 103
fields_desc = IE_Base.fields_desc + [
XBitField("spare_1", 0, 4),
BitField("NI", 0, 1),
BitField("DI", 0, 1),
BitField("V4", 0, 1),
BitField("V6", 0, 1),
ConditionalField(IPField("ipv4", 0), lambda x: x.V4 == 1),
ConditionalField(IP6Field("ipv6", 0), lambda x: x.V6 == 1),
ConditionalField(ByteField("dest_interface_length", 1),
lambda x: x.DI == 1),
ConditionalField(XBitField("spare_2", 0, 4), lambda x: x.DI == 1),
ConditionalField(
BitEnumField("dest_interface", "Access", 4, DestinationInterface),
lambda x: x.DI == 1),
ConditionalField(
FieldLenField("network_instance_length", 1,
length_of="network_instance"),
lambda x: x.NI == 1),
ConditionalField(
APNStrLenField("network_instance", "",
length_from=lambda x: x.network_instance_length),
lambda x: x.NI == 1),
ExtraDataField("extra_data"),
]
class IE_UR_SEQN(IE_Base):
name = "IE UR-SEQN"
ie_type = 104
fields_desc = IE_Base.fields_desc + [
IntField("number", 0),
]
class IE_ActivatePredefinedRules(IE_Base):
name = "IE Activate Predefined Rules"
ie_type = 106
fields_desc = IE_Base.fields_desc + [
StrLenField("name", "", length_from=lambda x: x.length)
]
class IE_DeactivatePredefinedRules(IE_Base):
name = "IE Deactivate Predefined Rules"
ie_type = 107
fields_desc = IE_Base.fields_desc + [
StrLenField("name", "", length_from=lambda x: x.length)
]
class IE_FAR_Id(IE_Base):
name = "IE FAR ID"
ie_type = 108
fields_desc = IE_Base.fields_desc + [
IntField("id", 0),
ExtraDataField("extra_data"),
]
class IE_QER_Id(IE_Base):
name = "IE QER ID"
ie_type = 109
fields_desc = IE_Base.fields_desc + [
IntField("id", 0),
ExtraDataField("extra_data"),
]
class IE_OCIFlags(IE_Base):
name = "IE OCI Flags"
ie_type = 110
fields_desc = IE_Base.fields_desc + [
XBitField("spare", None, 7),
BitField("AOCI", 0, 1),
ExtraDataField("extra_data"),
]
class IE_PFCPAssociationReleaseRequest(IE_Base):
name = "IE PFCP Association Release Request"
ie_type = 111
fields_desc = IE_Base.fields_desc + [
XBitField("spare", None, 7),
BitField("SARR", 0, 1),
ExtraDataField("extra_data"),
]
class IE_GracefulReleasePeriod(IE_Base):
name = "IE Graceful Release Period"
ie_type = 112
fields_desc = IE_Base.fields_desc + [
BitEnumField("release_timer_unit", "2 seconds", 3, TimerUnit),
BitField("release_timer_value", 0, 5),
ExtraDataField("extra_data"),
]
class IE_PDNType(IE_Base):
name = "IE PDN Type"
ie_type = 113
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 5),
BitEnumField("pdn_type", "IPv4", 3, PDNType),
ExtraDataField("extra_data"),
]
class IE_FailedRuleId(IE_Base):
name = "IE Failed Rule ID"
ie_type = 114
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 3),
BitEnumField("type", "PDR", 5, RuleIDType),
ConditionalField(ShortField("pdr_id", 0),
lambda x: x.type == 0),
ConditionalField(IntField("far_id", 0),
lambda x: x.type == 1 or x.type > 4),
ConditionalField(IntField("qer_id", 0), lambda x: x.type == 2),
ConditionalField(IntField("urr_id", 0), lambda x: x.type == 3),
ConditionalField(ByteField("bar_id", 0),
lambda x: x.type == 4),
ExtraDataField("extra_data"),
]
class IE_TimeQuotaMechanism(IE_Base):
name = "IE Time Quota Mechanism"
ie_type = 115
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 6),
BitEnumField("base_time_interval_type", "CTP", 2, BaseTimeInterval),
IntField("interval", 0),
ExtraDataField("extra_data"),
]
class IE_UserPlaneIPResourceInformation(IE_Base):
name = "IE User Plane IP Resource Information"
ie_type = 116
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 1),
BitField("ASSOSI", 0, 1),
BitField("ASSONI", 0, 1),
BitField("TEIDRI", 0, 3),
BitField("V6", 0, 1),
BitField("V4", 0, 1),
ConditionalField(XByteField("teid_range", 0), lambda x: x.TEIDRI != 0),
ConditionalField(IPField("ipv4", 0), lambda x: x.V4 == 1),
ConditionalField(IP6Field("ipv6", 0),
lambda x: x.V6 == 1),
ConditionalField(
APNStrLenField("network_instance", "",
length_from=lambda x:
x.length - 1 - (1 if x.TEIDRI != 0 else 0) -
(x.V4 * 4) - (x.V6 * 16) - x.ASSOSI),
lambda x: x.ASSONI == 1),
ConditionalField(XBitField("spare", None, 4), lambda x: x.ASSOSI == 1),
ConditionalField(
BitEnumField("interface", "Access", 4, SourceInterface),
lambda x: x.ASSOSI == 1),
ExtraDataField("extra_data"),
]
class IE_UserPlaneInactivityTimer(IE_Base):
name = "IE User Plane Inactivity Timer"
ie_type = 117
fields_desc = IE_Base.fields_desc + [
IntField("timer", 0),
ExtraDataField("extra_data"),
]
class IE_Multiplier(IE_Base):
name = "IE Multiplier"
ie_type = 119
fields_desc = IE_Base.fields_desc + [
SignedLongField("digits", 0),
SignedIntField("exponent", 0),
]
class IE_AggregatedURR_Id(IE_Base):
name = "IE Aggregated URR ID"
ie_type = 120
fields_desc = IE_Base.fields_desc + [
IntField("id", 0),
]
class IE_SubsequentVolumeQuota(IE_Base):
name = "IE Subsequent Volume Quota"
ie_type = 121
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 5),
BitField("DLVOL", 0, 1),
BitField("ULVOL", 0, 1),
BitField("TOVOL", 0, 1),
ConditionalField(XLongField("total", 0), lambda x: x.TOVOL == 1),
ConditionalField(XLongField("uplink", 0), lambda x: x.ULVOL == 1),
ConditionalField(XLongField("downlink", 0), lambda x: x.DLVOL == 1),
ExtraDataField("extra_data"),
]
class IE_SubsequentTimeQuota(IE_Base):
name = "IE Subsequent Time Quota"
ie_type = 122
fields_desc = IE_Base.fields_desc + [
IntField("quota", 0),
ExtraDataField("extra_data"),
]
class IE_RQI(IE_Base):
name = "IE RQI"
ie_type = 123
fields_desc = IE_Base.fields_desc + [
XBitField("spare", None, 7),
BitField("RQI", 0, 1),
ExtraDataField("extra_data"),
]
class IE_QFI(IE_Base):
name = "IE QFI"
ie_type = 124
fields_desc = IE_Base.fields_desc + [
XBitField("spare", None, 2),
BitField("QFI", 0, 6),
ExtraDataField("extra_data"),
]
class IE_QueryURRReference(IE_Base):
name = "IE Query URR Reference"
ie_type = 125
fields_desc = IE_Base.fields_desc + [
IntField("reference", 0),
ExtraDataField("extra_data"),
]
class IE_AdditionalUsageReportsInformation(IE_Base):
name = "IE Additional Usage Reports Information"
ie_type = 126
fields_desc = IE_Base.fields_desc + [
BitField("AURI", 0, 1),
BitField("reports", 0, 15),
ExtraDataField("extra_data"),
]
class IE_TrafficEndpointId(IE_Base):
name = "IE Traffic Endpoint ID"
ie_type = 131
fields_desc = IE_Base.fields_desc + [
ByteField("id", 0),
ExtraDataField("extra_data"),
]
class IE_MACAddress(IE_Base):
name = "IE MAC Address"
ie_type = 133
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 4),
BitField("UDES", 0, 1),
BitField("USOU", 0, 1),
BitField("DEST", 0, 1),
BitField("SOUR", 0, 1),
ConditionalField(MACField("source_mac", 0),
lambda x: x.SOUR == 1),
ConditionalField(MACField("destination_mac", 0),
lambda x: x.DEST == 1),
ConditionalField(MACField("upper_source_mac", 0),
lambda x: x.USOU == 1),
ConditionalField(MACField("upper_destination_mac", 0),
lambda x: x.UDES == 1),
ExtraDataField("extra_data"),
]
class IE_C_TAG(IE_Base):
name = "IE C-TAG"
ie_type = 134
fields_desc = IE_Base.fields_desc + [
XBitField("spare_1", 0, 5),
BitField("VID", 0, 1),
BitField("DEI", 0, 1),
BitField("PCP", 0, 1),
# TODO: fix cvid_value
ConditionalField(
BitField("cvid_value_hi", 0, 4), lambda x: x.VID == 1),
ConditionalField(BitField("spare_2", 0, 4), lambda x: x.VID == 0),
ConditionalField(BitField("dei_flag", 0, 1), lambda x: x.DEI == 1),
ConditionalField(BitField("spare_3", 0, 1), lambda x: x.DEI == 0),
ConditionalField(BitField("pcp_value", 0, 3), lambda x: x.PCP == 1),
ConditionalField(BitField("spare_4", 0, 3), lambda x: x.PCP == 0),
ConditionalField(ByteField("cvid_value_low", 0),
lambda x: x.VID == 1),
ConditionalField(ByteField("spare_5", 0), lambda x: x.VID == 0),
ExtraDataField("extra_data"),
]
class IE_S_TAG(IE_Base):
name = "IE S-TAG"
ie_type = 135
fields_desc = IE_Base.fields_desc + [
XBitField("spare_1", 0, 5),
BitField("VID", 0, 1),
BitField("DEI", 0, 1),
BitField("PCP", 0, 1),
# TODO: fix svid_value
ConditionalField(BitField("svid_value_hi", 0, 4),
lambda x: x.VID == 1),
ConditionalField(BitField("spare_2", 0, 4), lambda x: x.VID == 0),
ConditionalField(BitField("dei_flag", 0, 1), lambda x: x.DEI == 1),
ConditionalField(BitField("spare_3", 0, 1), lambda x: x.DEI == 0),
ConditionalField(BitField("pcp_value", 0, 3), lambda x: x.PCP == 1),
ConditionalField(BitField("spare_4", 0, 3), lambda x: x.PCP == 0),
ConditionalField(ByteField("svid_value_low", 0),
lambda x: x.VID == 1),
ConditionalField(ByteField("spare_5", 0), lambda x: x.VID == 0),
ExtraDataField("extra_data"),
]
class IE_Ethertype(IE_Base):
name = "IE Ethertype"
ie_type = 136
fields_desc = IE_Base.fields_desc + [
ShortField("type", 0),
ExtraDataField("extra_data"),
]
class IE_Proxying(IE_Base):
name = "IE Proxying"
ie_type = 137
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 6),
BitField("INS", 0, 1),
BitField("ARP", 0, 1),
ExtraDataField("extra_data"),
]
class IE_EthernetFilterId(IE_Base):
name = "IE Ethernet Filter ID"
ie_type = 138
fields_desc = IE_Base.fields_desc + [
IntField("id", 0),
ExtraDataField("extra_data"),
]
class IE_EthernetFilterProperties(IE_Base):
name = "IE Ethernet Filter Properties"
ie_type = 139
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 7),
BitField("BIDE", 0, 1),
ExtraDataField("extra_data"),
]
class IE_SuggestedBufferingPacketsCount(IE_Base):
name = "IE Suggested Buffering Packets Count"
ie_type = 140
fields_desc = IE_Base.fields_desc + [
ByteField("count", 0),
ExtraDataField("extra_data"),
]
class IE_UserId(IE_Base):
name = "IE User ID"
ie_type = 141
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 4),
BitField("NAIF", 0, 1),
BitField("MSISDNF", 0, 1),
BitField("IMEIF", 0, 1),
BitField("IMSIF", 0, 1),
ConditionalField(
FieldLenField("imsi_length", None, length_of="imsi", fmt="B"),
lambda x: x.IMSIF == 1),
ConditionalField(
StrLenField("imsi", "", length_from=lambda x: x.imsi_length),
lambda x: x.IMSIF == 1),
ConditionalField(
FieldLenField("imei_length", None, length_of="imei", fmt="B"),
lambda x: x.IMEIF == 1),
ConditionalField(
StrLenField("imei", "", length_from=lambda x: x.imei_length),
lambda x: x.IMEIF == 1),
ConditionalField(
FieldLenField("msisdn_length", None, length_of="msisdn", fmt="B"),
lambda x: x.MSISDNF == 1),
ConditionalField(
StrLenField("msisdn", "", length_from=lambda x: x.msisdn_length),
lambda x: x.MSISDNF == 1),
ConditionalField(
FieldLenField("nai_length", None, length_of="nai", fmt="B"),
lambda x: x.NAIF == 1),
ConditionalField(
StrLenField("nai", "", length_from=lambda x: x.nai_length),
lambda x: x.NAIF == 1),
ExtraDataField("extra_data"),
]
class IE_EthernetPDUSessionInformation(IE_Base):
name = "IE Ethernet PDU Session Information"
ie_type = 142
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 7),
BitField("ETHI", 0, 1),
ExtraDataField("extra_data"),
]
class IE_MACAddressesDetected(IE_Base):
name = "IE MAC Addresses Detected"
ie_type = 144
fields_desc = IE_Base.fields_desc + [
FieldLenField("num_macs", None, count_of="macs", fmt="B"),
FieldListField("macs", None, MACField("mac", 0),
count_from=lambda x: x.num_macs),
ExtraDataField("extra_data"),
]
class IE_MACAddressesRemoved(IE_Base):
name = "IE MAC Addresses Removed"
ie_type = 145
fields_desc = IE_Base.fields_desc + [
FieldLenField("num_macs", None, count_of="macs", fmt="B"),
FieldListField("macs", None, MACField("mac", 0),
count_from=lambda x: x.num_macs),
ExtraDataField("extra_data"),
]
class IE_EthernetInactivityTimer(IE_Base):
name = "IE Ethernet Inactivity Timer"
ie_type = 146
fields_desc = IE_Base.fields_desc + [
IntField("timer", 0),
ExtraDataField("extra_data"),
]
class IE_EventQuota(IE_Base):
name = "IE Event Quota"
ie_type = 148
fields_desc = IE_Base.fields_desc + [
IntField("event_quota", 0),
ExtraDataField("extra_data"),
]
class IE_EventThreshold(IE_Base):
name = "IE Event Threshold"
ie_type = 149
fields_desc = IE_Base.fields_desc + [
IntField("event_threshold", 0),
ExtraDataField("extra_data"),
]
class IE_SubsequentEventQuota(IE_Base):
name = "IE Subsequent Event Quota"
ie_type = 150
fields_desc = IE_Base.fields_desc + [
IntField("subsequent_event_quota", 0),
ExtraDataField("extra_data"),
]
class IE_SubsequentEventThreshold(IE_Base):
name = "IE Subsequent Event Threshold"
ie_type = 151
fields_desc = IE_Base.fields_desc + [
IntField("subsequent_event_threshold", 0),
ExtraDataField("extra_data"),
]
class IE_TraceInformation(IE_Base):
# TODO: more detailed decoding
# TODO: fix IP address handling
name = "IE Trace Information"
ie_type = 152
fields_desc = IE_Base.fields_desc + [
BitField("mcc_digit_2", 0, 4),
BitField("mcc_digit_1", 0, 4),
BitField("mnc_digit_3", 0, 4),
BitField("mcc_digit_3", 0, 4),
BitField("mnc_digit_2", 0, 4),
BitField("mnc_digit_1", 0, 4),
ThreeBytesField("trace_id", 0), # FIXME
FieldLenField("triggering_events_length", None,
length_of="triggering_events", fmt="B"),
StrLenField("triggering_events", "",
length_from=lambda x: x.triggering_events_length),
ByteField("session_trace_depth", 0),
FieldLenField("list_of_interfaces_length", None,
length_of="list_of_interfaces", fmt="B"),
StrLenField("list_of_interfaces", "",
length_from=lambda x: x.list_of_interfaces_length),
FieldLenField("ip_address_length", None,
length_of="ip_address", fmt="B"),
StrLenField("ip_address", "",
length_from=lambda x: x.ip_address_length),
ExtraDataField("extra_data"),
]
class IE_FramedRoute(IE_Base):
name = "IE Framed-Route"
ie_type = 153
fields_desc = IE_Base.fields_desc + [
StrLenField("framed_route", "", length_from=lambda x: x.length)
]
class IE_FramedRouting(IE_Base):
name = "IE Framed-Routing"
ie_type = 154
fields_desc = IE_Base.fields_desc + [
StrLenField("framed_routing", "", length_from=lambda x: x.length)
]
class IE_FramedIPv6Route(IE_Base):
name = "IE Framed-IPv6-Route"
ie_type = 155
fields_desc = IE_Base.fields_desc + [
StrLenField("framed_ipv6_route", "", length_from=lambda x: x.length)
]
class IE_EventTimeStamp(IE_Base):
name = "IE Event Time Stamp"
ie_type = 156
fields_desc = IE_Base.fields_desc + [
IntField("timestamp", 0),
ExtraDataField("extra_data"),
]
class IE_AveragingWindow(IE_Base):
name = "IE Averaging Window"
ie_type = 157
fields_desc = IE_Base.fields_desc + [
IntField("averaging_window", 0),
ExtraDataField("extra_data"),
]
class IE_PagingPolicyIndicator(IE_Base):
name = "IE Paging Policy Indicator"
ie_type = 158
fields_desc = IE_Base.fields_desc + [
XBitField("spare", 0, 5),
BitField("ppi", 0, 3),
ExtraDataField("extra_data"),
]
class IE_APN_DNN(IE_Base):
name = "IE APN/DNN"
ie_type = 159
fields_desc = IE_Base.fields_desc + [
APNStrLenField("apn_dnn", "", length_from=lambda x: x.length)
]
class IE_3GPP_InterfaceType(IE_Base):
name = "IE 3GPP Interface Type"
ie_type = 160
fields_desc = IE_Base.fields_desc + [
XBitField("spare_1", 0, 2),
BitEnumField("interface_type", "S1-U", 6, InterfaceType),
ExtraDataField("extra_data"),
]
class IE_EnterpriseSpecific(IE_Base):
name = "Enterpise Specific"
ie_type = None
fields_desc = IE_Base.fields_desc + [
ShortEnumField("enterprise_id", None, IANA_ENTERPRISE_NUMBERS),
StrLenField("data", "", length_from=lambda x: x.length - 2),
]
class IE_NotImplemented(IE_Base):
name = "IE not implemented"
ie_type = 0
fields_desc = IE_Base.fields_desc + [
StrLenField("data", "", length_from=lambda x: x.length)
]
ietypecls = {
1: IE_CreatePDR,
2: IE_PDI,
3: IE_CreateFAR,
4: IE_ForwardingParameters,
5: IE_DuplicatingParameters,
6: IE_CreateURR,
7: IE_CreateQER,
8: IE_CreatedPDR,
9: IE_UpdatePDR,
10: IE_UpdateFAR,
11: IE_UpdateForwardingParameters,
12: IE_UpdateBAR_SRR,
13: IE_UpdateURR,
14: IE_UpdateQER,
15: IE_RemovePDR,
16: IE_RemoveFAR,
17: IE_RemoveURR,
18: IE_RemoveQER,
19: IE_Cause,
20: IE_SourceInterface,
21: IE_FTEID,
22: IE_NetworkInstance,
23: IE_SDF_Filter,
24: IE_ApplicationId,
25: IE_GateStatus,
26: IE_MBR,
27: IE_GBR,
28: IE_QERCorrelationId,
29: IE_Precedence,
30: IE_TransportLevelMarking,
31: IE_VolumeThreshold,
32: IE_TimeThreshold,
33: IE_MonitoringTime,
34: IE_SubsequentVolumeThreshold,
35: IE_SubsequentTimeThreshold,
36: IE_InactivityDetectionTime,
37: IE_ReportingTriggers,
38: IE_RedirectInformation,
39: IE_ReportType,
40: IE_OffendingIE,
41: IE_ForwardingPolicy,
42: IE_DestinationInterface,
43: IE_UPFunctionFeatures,
44: IE_ApplyAction,
45: IE_DownlinkDataServiceInformation,
46: IE_DownlinkDataNotificationDelay,
47: IE_DLBufferingDuration,
48: IE_DLBufferingSuggestedPacketCount,
49: IE_PFCPSMReqFlags,
50: IE_PFCPSRRspFlags,
51: IE_LoadControlInformation,
52: IE_SequenceNumber,
53: IE_Metric,
54: IE_OverloadControlInformation,
55: IE_Timer,
56: IE_PDR_Id,
57: IE_FSEID,
58: IE_ApplicationID_PFDs,
59: IE_PFDContext,
60: IE_NodeId,
61: IE_PFDContents,
62: IE_MeasurementMethod,
63: IE_UsageReportTrigger,
64: IE_MeasurementPeriod,
65: IE_FqCSID,
66: IE_VolumeMeasurement,
67: IE_DurationMeasurement,
68: IE_ApplicationDetectionInformation,
69: IE_TimeOfFirstPacket,
70: IE_TimeOfLastPacket,
71: IE_QuotaHoldingTime,
72: IE_DroppedDLTrafficThreshold,
73: IE_VolumeQuota,
74: IE_TimeQuota,
75: IE_StartTime,
76: IE_EndTime,
77: IE_QueryURR,
78: IE_UsageReport_SMR,
79: IE_UsageReport_SDR,
80: IE_UsageReport_SRR,
81: IE_URR_Id,
82: IE_LinkedURR_Id,
83: IE_DownlinkDataReport,
84: IE_OuterHeaderCreation,
85: IE_Create_BAR,
86: IE_Update_BAR_SMR,
87: IE_Remove_BAR,
88: IE_BAR_Id,
89: IE_CPFunctionFeatures,
90: IE_UsageInformation,
91: IE_ApplicationInstanceId,
92: IE_FlowInformation,
93: IE_UE_IP_Address,
94: IE_PacketRate,
95: IE_OuterHeaderRemoval,
96: IE_RecoveryTimeStamp,
97: IE_DLFlowLevelMarking,
98: IE_HeaderEnrichment,
99: IE_ErrorIndicationReport,
100: IE_MeasurementInformation,
101: IE_NodeReportType,
102: IE_UserPlanePathFailureReport,
103: IE_RemoteGTP_U_Peer,
104: IE_UR_SEQN,
105: IE_UpdateDuplicatingParameters,
106: IE_ActivatePredefinedRules,
107: IE_DeactivatePredefinedRules,
108: IE_FAR_Id,
109: IE_QER_Id,
110: IE_OCIFlags,
111: IE_PFCPAssociationReleaseRequest,
112: IE_GracefulReleasePeriod,
113: IE_PDNType,
114: IE_FailedRuleId,
115: IE_TimeQuotaMechanism,
116: IE_UserPlaneIPResourceInformation,
117: IE_UserPlaneInactivityTimer,
118: IE_AggregatedURRs,
119: IE_Multiplier,
120: IE_AggregatedURR_Id,
121: IE_SubsequentVolumeQuota,
122: IE_SubsequentTimeQuota,
123: IE_RQI,
124: IE_QFI,
125: IE_QueryURRReference,
126: IE_AdditionalUsageReportsInformation,
127: IE_CreateTrafficEndpoint,
128: IE_CreatedTrafficEndpoint,
129: IE_UpdateTrafficEndpoint,
130: IE_RemoveTrafficEndpoint,
131: IE_TrafficEndpointId,
132: IE_EthernetPacketFilter,
133: IE_MACAddress,
134: IE_C_TAG,
135: IE_S_TAG,
136: IE_Ethertype,
137: IE_Proxying,
138: IE_EthernetFilterId,
139: IE_EthernetFilterProperties,
140: IE_SuggestedBufferingPacketsCount,
141: IE_UserId,
142: IE_EthernetPDUSessionInformation,
143: IE_EthernetTrafficInformation,
144: IE_MACAddressesDetected,
145: IE_MACAddressesRemoved,
146: IE_EthernetInactivityTimer,
147: IE_AdditionalMonitoringTime,
148: IE_EventQuota,
149: IE_EventThreshold,
150: IE_SubsequentEventQuota,
151: IE_SubsequentEventThreshold,
152: IE_TraceInformation,
153: IE_FramedRoute,
154: IE_FramedRouting,
155: IE_FramedIPv6Route,
156: IE_EventTimeStamp,
157: IE_AveragingWindow,
158: IE_PagingPolicyIndicator,
159: IE_APN_DNN,
160: IE_3GPP_InterfaceType,
}
#
# PFCP Messages
# 3GPP TS 29.244 V15.6.0 (2019-07)
#
# class PFCPMessage(Packet):
# fields_desc = [PacketListField("IE_list", None, IE_Dispatcher)]
class PFCPHeartbeatRequest(Packet):
name = "PFCP Heartbeat Request"
fields_desc = [
PacketListField("IE_list", [IE_RecoveryTimeStamp()], IE_Dispatcher)
]
class PFCPHeartbeatResponse(Packet):
name = "PFCP Heartbeat Response"
fields_desc = [
PacketListField("IE_list", [IE_RecoveryTimeStamp()], IE_Dispatcher)
]
def answers(self, other):
return isinstance(other, PFCPHeartbeatRequest)
class PFCPPFDManagementRequest(Packet):
name = "PFCP PFD Management Request"
fields_desc = [PacketListField("IE_list", [], IE_Dispatcher)]
class PFCPPFDManagementResponse(Packet):
name = "PFCP PFD Management Response"
fields_desc = [PacketListField("IE_list", [], IE_Dispatcher)]
def answers(self, other):
return isinstance(other, PFCPPFDManagementRequest)
class PFCPAssociationSetupRequest(Packet):
name = "PFCP Association Setup Request"
fields_desc = [PacketListField("IE_list", [], IE_Dispatcher)]
class PFCPAssociationSetupResponse(Packet):
name = "PFCP Association Setup Response"
fields_desc = [PacketListField("IE_list", [], IE_Dispatcher)]
def answers(self, other):
return isinstance(other, PFCPAssociationSetupRequest)
class PFCPAssociationUpdateRequest(Packet):
name = "PFCP Association Update Request"
fields_desc = [PacketListField("IE_list", [], IE_Dispatcher)]
class PFCPAssociationUpdateResponse(Packet):
name = "PFCP Association Update Response"
fields_desc = [PacketListField("IE_list", [], IE_Dispatcher)]
def answers(self, other):
return isinstance(other, PFCPAssociationUpdateRequest)
class PFCPAssociationReleaseRequest(Packet):
name = "PFCP Association Release Request"
fields_desc = [PacketListField("IE_list", [], IE_Dispatcher)]
class PFCPAssociationReleaseResponse(Packet):
name = "PFCP Association Release Response"
fields_desc = [PacketListField("IE_list", [], IE_Dispatcher)]
def answers(self, other):
return isinstance(other, PFCPAssociationReleaseRequest)
class PFCPVersionNotSupportedResponse(Packet):
name = "PFCP Version Not Supported Response"
fields_desc = [PacketListField("IE_list", [], IE_Dispatcher)]
# TODO: answers()
class PFCPNodeReportRequest(Packet):
name = "PFCP Node Report Request"
fields_desc = [PacketListField("IE_list", [], IE_Dispatcher)]
class PFCPNodeReportResponse(Packet):
name = "PFCP Node Report Response"
fields_desc = [PacketListField("IE_list", [], IE_Dispatcher)]
def answers(self, other):
return isinstance(other, PFCPNodeReportRequest)
class PFCPSessionSetDeletionRequest(Packet):
name = "PFCP Session Set Deletion Request"
fields_desc = [PacketListField("IE_list", [], IE_Dispatcher)]
class PFCPSessionSetDeletionResponse(Packet):
name = "PFCP Session Set Deletion Response"
fields_desc = [PacketListField("IE_list", [], IE_Dispatcher)]
def answers(self, other):
return isinstance(other, PFCPSessionSetDeletionRequest)
class PFCPSessionEstablishmentRequest(Packet):
name = "PFCP Session Establishment Request"
fields_desc = [PacketListField("IE_list", [], IE_Dispatcher)]
class PFCPSessionEstablishmentResponse(Packet):
name = "PFCP Session Establishment Response"
fields_desc = [PacketListField("IE_list", [], IE_Dispatcher)]
def answers(self, other):
return isinstance(other, PFCPSessionEstablishmentRequest)
class PFCPSessionModificationRequest(Packet):
name = "PFCP Session Modification Request"
fields_desc = [PacketListField("IE_list", [], IE_Dispatcher)]
class PFCPSessionModificationResponse(Packet):
name = "PFCP Session Modification Response"
fields_desc = [PacketListField("IE_list", [], IE_Dispatcher)]
def answers(self, other):
return isinstance(other, PFCPSessionModificationRequest)
class PFCPSessionDeletionRequest(Packet):
name = "PFCP Session Deletion Request"
fields_desc = [PacketListField("IE_list", [], IE_Dispatcher)]
class PFCPSessionDeletionResponse(Packet):
name = "PFCP Session Deletion Response"
fields_desc = [PacketListField("IE_list", [], IE_Dispatcher)]
def answers(self, other):
return isinstance(other, PFCPSessionDeletionRequest)
class PFCPSessionReportRequest(Packet):
name = "PFCP Session Report Request"
fields_desc = [PacketListField("IE_list", [], IE_Dispatcher)]
class PFCPSessionReportResponse(Packet):
name = "PFCP Session Report Response"
fields_desc = [PacketListField("IE_list", [], IE_Dispatcher)]
def answers(self, other):
return isinstance(other, PFCPSessionReportRequest)
bind_bottom_up(UDP, PFCP, dport=8805)
bind_bottom_up(UDP, PFCP, sport=8805)
bind_layers(UDP, PFCP, dport=8805, sport=8805)
bind_layers(PFCP, PFCPHeartbeatRequest, message_type=1)
bind_layers(PFCP, PFCPHeartbeatResponse, message_type=2)
bind_layers(PFCP, PFCPPFDManagementRequest, message_type=3)
bind_layers(PFCP, PFCPPFDManagementResponse, message_type=4)
bind_layers(PFCP, PFCPAssociationSetupRequest, message_type=5)
bind_layers(PFCP, PFCPAssociationSetupResponse, message_type=6)
bind_layers(PFCP, PFCPAssociationUpdateRequest, message_type=7)
bind_layers(PFCP, PFCPAssociationUpdateResponse, message_type=8)
bind_layers(PFCP, PFCPAssociationReleaseRequest, message_type=9)
bind_layers(PFCP, PFCPAssociationReleaseResponse, message_type=10)
bind_layers(PFCP, PFCPVersionNotSupportedResponse, message_type=11)
bind_layers(PFCP, PFCPNodeReportRequest, message_type=12)
bind_layers(PFCP, PFCPNodeReportResponse, message_type=13)
bind_layers(PFCP, PFCPSessionSetDeletionRequest, message_type=14)
bind_layers(PFCP, PFCPSessionSetDeletionResponse, message_type=15)
bind_layers(PFCP, PFCPSessionEstablishmentRequest, message_type=50)
bind_layers(PFCP, PFCPSessionEstablishmentResponse, message_type=51)
bind_layers(PFCP, PFCPSessionModificationRequest, message_type=52)
bind_layers(PFCP, PFCPSessionModificationResponse, message_type=53)
bind_layers(PFCP, PFCPSessionDeletionRequest, message_type=54)
bind_layers(PFCP, PFCPSessionDeletionResponse, message_type=55)
bind_layers(PFCP, PFCPSessionReportRequest, message_type=56)
bind_layers(PFCP, PFCPSessionReportResponse, message_type=57)
# FIXME: the following fails with pfcplib-generated pcaps:
# bind_layers(PFCP, PFCPSessionEstablishmentRequest, message_type=50, S=1)
# bind_layers(PFCP, PFCPSessionEstablishmentResponse, message_type=51, S=1)
# bind_layers(PFCP, PFCPSessionModificationRequest, message_type=52, S=1)
# bind_layers(PFCP, PFCPSessionModificationResponse, message_type=53, S=1)
# bind_layers(PFCP, PFCPSessionDeletionRequest, message_type=54, S=1)
# bind_layers(PFCP, PFCPSessionDeletionResponse, message_type=55, S=1)
# bind_layers(PFCP, PFCPSessionReportRequest, message_type=56, S=1)
# bind_layers(PFCP, PFCPSessionReportResponse, message_type=57, S=1)
# TODO: limit possible child IEs based on IE type
IE_UE_IP_Address(SD=0, V4=0, V6=0, spare=0)