PFCP - ianchen0119/Introduce-to-5GC GitHub Wiki

PFCP 主要用於 UPF 與 SMF 之間的 N4 Interface,任何與 PFCP 有關的資料都可以在 3GPP TS 29.244 找到。

補充:

  • PFCP 使用 TLV 進行編碼
  • Tag + Length + Value = TLV
  • TLV 對訊息大小的壓縮很有幫助,只要將 Protocol 定義好就不需要用額外的 message 來描述資料
  • 處理 PFCP 時需要特別注意網路端與本地端的排序方式是否一致(大端或是小端)

Protocol Stack

下圖為 PFCP 的 Protocol Stack:

PFCP Message

  • Bit 0: SEID flag
  • if S = 0, SEID field is not present, k = 0, m = 0 and n = 5
  • if S = 1, SEID field is present, k = 1, m = 5 and n = 13.
  • Bit 1: MP (message priority)
  • Bit 2 - 4: Spare part
  • Bit 5 - 7: Version

PFCP message 由一個 message header + 零至多個 Information Element 組合而成。

至於一個 PFCP message 到底會帶有多少個 IE 則取決於該訊息的用途,像是:

  • PFCP Heartbeat Request/Response
  • PFCP Association Setup Request/Response
  • PFCP Session Establishment Request/Response
  • ... PFCP message 有 50 多種,不同 message 需要的 IE 都已經詳細定義在 TS 29.244。

PFCP message 的種類

主要可分為:

1. Node related PFCP message

2. Session related PFCP message

如果 MP = 1,第 16 段的 Bit 4 - 7 就會用來表示 Priority。

了解 PFCP message 的主要類別後,便可以進一步的研究所有 PFCP message:

PFCP Association

根據 TS 29.244 的定義,如果 CP Function 與 UP Function 並未建立 Association,則兩方都不應該受理未建立關係的 CP/UP 的請求。 如果要建立 N4 Association,可以由 SMF 發送 N4 Association Setup Request 給 UPF:

在建立 Association 後,N4 Association Release Request 與 N4 Association Update Request 可以由 SMF 或是 UPF 發起。

流程圖與相關定義在 TS 23.502 Clause 4.4.3。

SMF 行為

參考 TS 29.244 Clause 5.8.2。

當 Association 建立後,CP 的行為如下:

  • 必須提供 UP function(UPF)任何 node related parameters, e.g. PFDs
  • 必須提供 UP 一個 CP(SMF)支援的功能列表 (e.g. support of load and/or overload control)
  • 發起 Heartbeat procedure
  • 在 UP function 建立 PFCP sessions。
  • 如果 UPF 表示它要關機了,CP 應避免建立任何新的 PFCP Session。

UPF 行為

當 Association 建立後,UP 的行為如下:

  • 必須向 CP function 更新其所支援的功能
  • 如果 UP 與 CP 支援 load and/or overload control,必須向 CP function 更新其 load and/or overload control information。
  • 必須接受來自 CP function 的 PFCP Session related messages。
  • 回應 Heartbeat procedure
  • 如果 UP 即將 out of service,必須告知 CP。
  • 如果 CP function 支援 e UE IP Address Usage Reporting feature 且 UE 的 IP 由 UP 所分配,UP 應該向 CP 回報 t UE IP address usage information。

相關專案介紹

go-pfcp 是一套開源的 pfcp 套件,只要使用這個 Go package 就能快速的構造 PFCP 請求。 目前 go-pfcp 已經實作了 TS 29.244 R16 提到的多數 Procedure 與 Information Element,如果想要進一步了解如何 PFCP 訊息的話,參考該專案的原始程式碼會是一個不錯的選擇!

使用案例

如果要構造一個 Association Req,可以這樣做:

import (
	"time"

	"github.com/wmnsk/go-pfcp/ie"
	"github.com/wmnsk/go-pfcp/message"
)

req := message.NewAssociationSetupRequest(seq,
  ie.NewNodeID("", "", "go-pfcp.epc.3gppnetwork.org"),
  ie.NewRecoveryTimeStamp(time.Now()),
  ie.NewUserPlaneIPResourceInformation(0x71, 15, "127.0.0.1", "", "some.instance.example", ie.SrcInterfaceAccess),
)

以 Association Req 中的 IE User Plane IP Resource Information 來看,從 NewUserPlaneIPResourceInformation() 函式來觀察每一個參數分別代表什麼:

func NewUserPlaneIPResourceInformation(flags uint8, tRange uint8, v4, v6, ni string, si uint8) *IE {
	fields := NewUserPlaneIPResourceInformationFields(flags, tRange, v4, v6, ni, si)
	b, err := fields.Marshal()
	if err != nil {
		return nil
	}

	return New(UserPlaneIPResourceInformation, b)
}

上面的函式需要傳入 flags、tRange、v4、v6、ni 以及 si 這些 payload,我們可以對照 3GPP TS 29.244 中的說明理解每一個 payload 的意義:

  • flags 代表上圖中 Octets 5 的資料,將 0x71 轉為二進制為 01110001 後,我們可以逐一對照每個 Bit 所代表的意義:
    • Bit 8 為 Spare Part,所以為 0。
    • Bit 7 表示 ASSOSI,如果我們會在這個 IE 中表示 Associated Source Interface,那麼則設定為 1。
    • Bit 6 表示 ASSONI,如果我們會在這個 IE 中表示 Network Instance,那麼則設定為 1。
    • Bit 3 到 5 表示 TEID Range,上面的程式範例中該值為 100,即為 4。
    • Bit 2 表示是否包含 IPv6,上面的程式範例中不會傳入 IPv6 位址,所以該值為 0。
    • Bit 1 表示是否包含 IPv4,上面的程式範例中包含 IPv4 位址,所以該值為 1。