2649 lines
79 KiB
Python
2649 lines
79 KiB
Python
|
#! /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)
|