Categorygithub.com/tim-ywliu/go-pfcp
repositorypackage
0.0.17
Repository: https://github.com/tim-ywliu/go-pfcp.git
Documentation: pkg.go.dev

# Packages

No description provided by the author
No description provided by the author
No description provided by the author

# README

go-pfcp

PFCP implementation in Golang.

CI status GoDoc License

What is PFCP?

PFCP(Packet Forwarding Control Protocol) is a signaling protocol used in mobile networking infrastructure(LTE EPC, 5GC) to realize CUPS architecture(Control and User Plane Separation, not a printing system) defined in 3GPP TS29.244.

Are you looking for a GTP implementation in Golang? go-gtp would be the right choice for you :P

Project Status

This project is still WIP.
Implementation of all the messages and IEs defined in TS29.244 V16.7.0(2021-04) has been done, but the exported APIs may still be updated in the future, as they are not tested enough (we add a new tag in that case).

We are now working on implementing networking functionalities (like setting up associations, establish sessions with easy & quick APIs), as well as updating the messages and IE definitions according to the latest specifications.

Getting Started

Installation

go-pfcp supports Go Modules. Just run go mod tidy in your project's directory to collect the required packages automatically.

go mod tidy

Running examples

Exchanging Heartbeat

Small heartbeat client and server examples are available under examples/heartheat. The client sends HeartbeatRequest, and the server responds with HeartbeatResponse.

  1. run server first,

By default, the server listens on loopback. It can be specified explicitly by the -s flag.

go-pfcp/examples/heartbeat/hb-server$ go run main.go
2019/12/22 20:03:31 waiting for messages to come on: 127.0.0.2:8805
  1. then run client,

By default, the client sends a Heartbeat to loopback. It can be specified explicitly by the -s flag. It exits after printing the timestamp in Heartbeat Response from the server.

go-pfcp/examples/heartbeat/hb-client$ go run main.go
2019/12/22 20:03:36 sent Heartbeat Request to: 127.0.0.2:8805
2019/12/22 20:03:36 got Heartbeat Response with TS: 2019-12-22 20:03:36 +0900 JST, from: 127.0.0.2:8805
go-pfcp/examples/heartbeat/hb-client$
go-pfcp/examples/heartbeat/hb-client$ go run main.go
2019/12/22 20:03:40 sent Heartbeat Request to: 127.0.0.2:8805
2019/12/22 20:03:40 got Heartbeat Response with TS: 2019-12-22 20:03:40 +0900 JST, from: 127.0.0.2:8805
  1. and see the outcome on server

It starts listening again after responding to the client.

go-pfcp/examples/heartbeat/hb-server$ go run main.go
2019/12/22 20:03:31 waiting for messages to come on: 127.0.0.2:8805
2019/12/22 20:03:36 got Heartbeat Request with TS: 2019-12-22 20:03:36 +0900 JST, from: 127.0.0.1:47305
2019/12/22 20:03:36 sent Heartbeat Response to: 127.0.0.1:47305
2019/12/22 20:03:36 waiting for messages to come on: 127.0.0.2:8805
2019/12/22 20:03:40 got Heartbeat Request with TS: 2019-12-22 20:03:40 +0900 JST, from: 127.0.0.1:55395
2019/12/22 20:03:40 sent Heartbeat Response to: 127.0.0.1:55395
2019/12/22 20:03:40 waiting for messages to come on: 127.0.0.2:8805
^Csignal: interrupt

Supported Features

Messages

PFCP Node related messages

Message TypeMessageSxaSxbSxcN4Supported?
1Heartbeat RequestXXXXYes
2Heartbeat ResponseXXXXYes
3PFD Management Request-XXXYes
4PFD Management Response-XXXYes
5Association Setup RequestXXXXYes
6Association Setup ResponseXXXXYes
7Association Update RequestXXXXYes
8Association Update ResponseXXXXYes
9Association Release RequestXXXXYes
10Association Release ResponseXXXXYes
11Version Not Supported ResponseXXXXYes
12Node Report RequestXXXXYes
13Node Report ResponseXXXXYes
14Session Set Deletion RequestXX-Yes
15Session Set Deletion ResponseXX-Yes
16 to 49(For future use)-

PFCP Session related messages

Message TypeMessageSxaSxbSxcN4Supported?
50Session Establishment RequestXXXXYes
51Session Establishment ResponseXXXXYes
52Session Modification RequestXXXXYes
53Session Modification ResponseXXXXYes
54Session Deletion RequestXXXXYes
55Session Deletion ResponseXXXXYes
56Session Report RequestXXXXYes
57Session Report ResponseXXXXYes
58 to 99(For future use)-

Information Elements

All the IEs are of the same type: ie.IE.

Constructors are available for every type of IEs.
To create CreatePDR IE, use NewCreatePDR(). Parameters for those constructors are implemented as friendly for Gophers as possible. See ie/ie_test.go for detailed (and working) usage.

// returned type and parameters in NewCreatePDR() are all *ie.IE.
createPDR := ie.NewCreatePDR(
    ie.NewPDRID(0xffff),
    ie.NewPrecedence(0x11111111),
    ie.NewPDI(
        ie.NewSourceInterface(ie.SrcInterfaceAccess),
        ie.NewFTEID(0x01, 0x11111111, net.ParseIP("127.0.0.1"), nil, 0),
        ie.NewNetworkInstance("some.instance.example"),
        ie.NewRedundantTransmissionParametersInPDI(
            ie.NewFTEID(0x01, 0x11111111, net.ParseIP("127.0.0.1"), nil, 0),
            ie.NewNetworkInstance("some.instance.example"),
        ),
        ie.NewUEIPAddress(0x02, "127.0.0.1", "", 0),
        ie.NewTrafficEndpointID(0x01),
        ie.NewSDFFilter("aaaaaaaa", "bb", "cccc", "ddd", 0xffffffff),
        ie.NewApplicationID("https://github.com/tim-ywliu/go-pfcp/"),
        ie.NewEthernetPDUSessionInformation(0x01),
        ie.NewEthernetPacketFilter(
            ie.NewEthernetFilterID(0xffffffff),
            ie.NewEthernetFilterProperties(0x01),
            ie.NewMACAddress(mac1, mac2, mac3, mac4),
            ie.NewEthertype(0xffff),
            ie.NewCTAG(0x07, 1, 1, 4095),
            ie.NewSTAG(0x07, 1, 1, 4095),
            ie.NewSDFFilter("aaaaaaaa", "bb", "cccc", "ddd", 0xffffffff),
        ),
    ),
    ie.NewOuterHeaderRemoval(0x01, 0x02),
    ie.NewFARID(0xffffffff),
    ie.NewURRID(0xffffffff),
    ie.NewQERID(0xffffffff),
    ie.NewActivatePredefinedRules("go-pfcp"),
    ie.NewActivationTime(time.Date(2019, time.January, 1, 0, 0, 0, 0, time.UTC)),
    ie.NewDeactivationTime(time.Date(2019, time.January, 1, 0, 0, 0, 0, time.UTC)),
    ie.NewMARID(0x1111),
    ie.NewPacketReplicationAndDetectionCarryOnInformation(0x0f),
    ie.NewIPMulticastAddressingInfo(
        ie.NewIPMulticastAddress(net.ParseIP("127.0.0.1"), nil, net.ParseIP("127.0.0.1"), nil),
        ie.NewSourceIPAddress(net.ParseIP("127.0.0.1"), nil, 24),
    ),
    ie.NewUEIPAddressPoolIdentity("go-pfcp"),
)

Or just use ie.New() to create an arbitrary IE(when you don't need constructors or you need to create an enterprise-specific one).

ie := ie.New(ieType, enterpriseID, payload)

Values can be retrieved by calling helper methods on *ie.IE. For instance, you can immediately get the value in a string by calling NetworkInstance().

ni := ie.NewNetworkInstance("some.instance.example")

v, err := ni.NetworkInstance()
// returns "some.instance.example" if ni is valid. Otherwise it returns error.

For complex IEs like F-TEID, <IE-name> method returns <IE-name>Fields structure.

fteid := ie.NewFTEID(0x01, 0x11111111, net.ParseIP("127.0.0.1"), nil, nil)

f, err := fteid.FTEID()
// returns FTEIDFields struct which contains values in its fields.

teid := f.TEID // has TEID as uint32
v4 := f.IPv4Address // has IPv4 address as net.IP

On grouped IEs, the value (or custom fields) can be retrieved by directly calling such methods.

createPDR := ie.NewCreatePDR(
    ie.NewPDRID(0xffff),
    // ...
)

v, err := createPDR.PDRID()
// returns 0xffff if createPDR contains PDRID and it is valid. Otherwise it returns error.

List of implemented IEs

IEs are (basically) implemented in conformance with TS29.244 V16.3.1(2020-04).

IE TypeInformation elementsSupported?
0(Reserved)-
1Create PDRYes
2PDIYes
3Create FARYes
4Forwarding ParametersYes
5Duplicating ParametersYes
6Create URRYes
7Create QERYes
8Created PDRYes
9Update PDRYes
10Update FARYes
11Update Forwarding ParametersYes
12Update BAR (PFCP Session Report Response)Yes
13Update URRYes
14Update QERYes
15Remove PDRYes
16Remove FARYes
17Remove URRYes
18Remove QERYes
19CauseYes
20Source InterfaceYes
21F-TEIDYes
22Network InstanceYes
23SDF FilterYes
24Application IDYes
25Gate StatusYes
26MBRYes
27GBRYes
28QER Correlation IDYes
29PrecedenceYes
30Transport Level MarkingYes
31Volume ThresholdYes
32Time ThresholdYes
33Monitoring TimeYes
34Subsequent Volume ThresholdYes
35Subsequent Time ThresholdYes
36Inactivity Detection TimeYes
37Reporting TriggersYes
38Redirect InformationYes
39Report TypeYes
40Offending IEYes
41Forwarding PolicyYes
42Destination InterfaceYes
43UP Function FeaturesYes
44Apply ActionYes
45Downlink Data Service InformationYes
46Downlink Data Notification DelayYes
47DL Buffering DurationYes
48DL Buffering Suggested Packet CountYes
49PFCPSMReq-FlagsYes
50PFCPSRRsp-FlagsYes
51Load Control InformationYes
52Sequence NumberYes
53MetricYes
54Overload Control InformationYes
55TimerYes
56Packet Detection Rule IDYes
57F-SEIDYes
58Application ID's PFDsYes
59PFD contextYes
60Node IDYes
61PFD contentsYes
62Measurement MethodYes
63Usage Report TriggerYes
64Measurement PeriodYes
65FQ-CSIDYes
66Volume MeasurementYes
67Duration MeasurementYes
68Application Detection InformationYes
69Time of First PacketYes
70Time of Last PacketYes
71Quota Holding TimeYes
72Dropped DL Traffic ThresholdYes
73Volume QuotaYes
74Time QuotaYes
75Start TimeYes
76End TimeYes
77Query URRYes
78Usage Report (Session Modification Response)Yes
79Usage Report (Session Deletion Response)Yes
80Usage Report (Session Report Request)Yes
81URR IDYes
82Linked URR IDYes
83Downlink Data ReportYes
84Outer Header CreationYes
85Create BARYes
86Update BAR (Session Modification Request)Yes
87Remove BARYes
88BAR IDYes
89CP Function FeaturesYes
90Usage InformationYes
91Application Instance IDYes
92Flow InformationYes
93UE IP AddressYes
94Packet RateYes
95Outer Header RemovalYes
96Recovery Time StampYes
97DL Flow Level MarkingYes
98Header EnrichmentYes
99Error Indication ReportYes
100Measurement InformationYes
101Node Report TypeYes
102User Plane Path Failure ReportYes
103Remote GTP-U PeerYes
104UR-SEQNYes
105Update Duplicating ParametersYes
106Activate Predefined RulesYes
107Deactivate Predefined RulesYes
108FAR IDYes
109QER IDYes
110OCI FlagsYes
111PFCP Association Release RequestYes
112Graceful Release PeriodYes
113PDN TypeYes
114Failed Rule IDYes
115Time Quota MechanismYes
116User Plane IP Resource InformationYes
117User Plane Inactivity TimerYes
118Aggregated URRsYes
119MultiplierYes
120Aggregated URR IDYes
121Subsequent Volume QuotaYes
122Subsequent Time QuotaYes
123RQIYes
124QFIYes
125Query URR ReferenceYes
126Additional Usage Reports InformationYes
127Create Traffic EndpointYes
128Created Traffic EndpointYes
129Update Traffic EndpointYes
130Remove Traffic EndpointYes
131Traffic Endpoint IDYes
132Ethernet Packet FilterYes
133MAC addressYes
134C-TAGYes
135S-TAGYes
136EthertypeYes
137ProxyingYes
138Ethernet Filter IDYes
139Ethernet Filter PropertiesYes
140Suggested Buffering Packets CountYes
141User IDYes
142Ethernet PDU Session InformationYes
143Ethernet Traffic InformationYes
144MAC Addresses DetectedYes
145MAC Addresses RemovedYes
146Ethernet Inactivity TimerYes
147Additional Monitoring TimeYes
148Event QuotaYes
149Event ThresholdYes
150Subsequent Event QuotaYes
151Subsequent Event ThresholdYes
152Trace InformationYes
153Framed-RouteYes
154Framed-RoutingYes
155Framed-IPv6-RouteYes
156Event Time StampYes
157Averaging WindowYes
158Paging Policy IndicatorYes
159APN/DNNYes
1603GPP Interface TypeYes
161PFCPSRReq-FlagsYes
162PFCPAUReq-FlagsYes
163Activation TimeYes
164Deactivation TimeYes
165Create MARYes
1663GPP Access Forwarding Action InformationYes
167Non-3GPP Access Forwarding Action InformationYes
168Remove MARYes
169Update MARYes
170MAR IDYes
171Steering FunctionalityYes
172Steering ModeYes
173WeightYes
174PriorityYes
175Update 3GPP Access Forwarding Action InformationYes
176Update Non 3GPP Access Forwarding Action InformationYes
177UE IP address Pool IdentityYes
178Alternative SMF IP AddressYes
179Packet Replication and Detection Carry-On InformationYes
180SMF Set IDYes
181Quota Validity TimeYes
182Number of ReportsYes
183PFCP Session Retention Information (within PFCP Association Setup Request)Yes
184PFCPASRsp-FlagsYes
185CP PFCP Entity IP AddressYes
186PFCPSEReq-FlagsYes
187User Plane Path Recovery ReportYes
188IP Multicast Addressing Info within PFCP Session Establishment RequestYes
189Join IP Multicast Information IE within Usage ReportYes
190Leave IP Multicast Information IE within Usage ReportYes
191IP Multicast AddressYes
192Source IP AddressYes
193Packet Rate StatusYes
194Create Bridge Info for TSCYes
195Created Bridge Info for TSCYes
196DS-TT Port NumberYes
197NW-TT Port NumberYes
198TSN Bridge IDYes
199TSC Management Information IE within PFCP Session Modification RequestYes
200TSC Management Information IE within PFCP Session Modification ResponseYes
201TSC Management Information IE within PFCP Session Report RequestYes
202Port Management Information ContainerYes
203Clock Drift Control InformationYes
204Requested Clock Drift InformationYes
205Clock Drift ReportYes
206TSN Time Domain NumberYes
207Time Offset ThresholdYes
208Cumulative rateRatio ThresholdYes
209Time Offset MeasurementYes
210Cumulative rateRatio MeasurementYes
211Remove SRRYes
212Create SRRYes
213Update SRRYes
214Session ReportYes
215SRR IDYes
216Access Availability Control InformationYes
217Requested Access Availability InformationYes
218Access Availability ReportYes
219Access Availability InformationYes
220Provide ATSSS Control InformationYes
221ATSSS Control ParametersYes
222MPTCP Control InformationYes
223ATSSS-LL Control InformationYes
224PMF Control InformationYes
225MPTCP ParametersYes
226ATSSS-LL ParametersYes
227PMF ParametersYes
228MPTCP Address InformationYes
229UE Link-Specific IP AddressYes
230PMF Address InformationYes
231ATSSS-LL InformationYes
232Data Network Access IdentifierYes
233UE IP address Pool InformationYes
234Average Packet DelayYes
235Minimum Packet DelayYes
236Maximum Packet DelayYes
237QoS Report TriggerYes
238GTP-U Path QoS Control InformationYes
239GTP-U Path QoS Report (PFCP Node Report Request)Yes
240QoS Information in GTP-U Path QoS ReportYes
241GTP-U Path Interface TypeYes
242QoS Monitoring per QoS flow Control InformationYes
243Requested QoS MonitoringYes
244Reporting FrequencyYes
245Packet Delay ThresholdsYes
246Minimum Wait TimeYes
247QoS Monitoring ReportYes
248QoS Monitoring MeasurementYes
249MT-EDT Control InformationYes
250DL Data Packets SizeYes
251QER Control IndicationsYes
252Packet Rate Status ReportYes
253NF Instance IDYes
254Ethernet Context InformationYes
255Redundant Transmission ParametersYes
256Updated PDRYes
257S-NSSAIYes
258IP versionYes
259PFCPASReq-FlagsYes
260Data StatusYes
261Provide RDS configuration informationYes
262RDS configuration informationYes
263Query Packet Rate Status IE within PFCP Session Modification RequestYes
264Packet Rate Status Report IE within PFCP Session Modification ResponseYes
265MPTCP Applicable IndicationYes
266Bridge Management Information ContainerYes
267UE IP Address Usage InformationYes
268Number of UE IP AddressesYes
269Validity TimerYes
270Redundant Transmission Forwarding ParametersYes
271Transport Delay ReportingYes
272 to 32767(For future use)-
32768 to 65535Reserved for vendor specific IEs-

Author(s)

Yoshiyuki Kurauchi (Website / LinkedIn)

I'm always open to welcome co-authors! Please feel free to talk to me.

LICENSE

MIT