Skip to content
This repository has been archived by the owner on Oct 20, 2024. It is now read-only.

chore: Re-organises message serialization #33

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func main() {
heartbeatRequestMsg := messages.HeartbeatRequest{
RecoveryTimeStamp: recoveryTimeStamp,
}
pfcpClient.SendHeartbeatRequest(heartbeatRequestMsg, sequenceNumber)
pfcpClient.SendHeartbeatRequest(&heartbeatRequestMsg, sequenceNumber)
}
```

Expand Down
42 changes: 22 additions & 20 deletions client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,19 @@ func New(ServerAddress string) *Pfcp {
func (pfcp *Pfcp) sendNodePfcpMessage(message messages.PFCPMessage, sequenceNumber uint32) error {
messageType := message.GetMessageType()
header := messages.NewNodeHeader(messageType, sequenceNumber)
return pfcp.sendPfcpMessage(message, header)
message.SetHeader(header)
return pfcp.sendPfcpMessage(message)
}

func (pfcp *Pfcp) sendSessionPfcpMessage(message messages.PFCPMessage, seid uint64, sequenceNumber uint32) error {
messageType := message.GetMessageType()
header := messages.NewSessionHeader(messageType, seid, sequenceNumber)
return pfcp.sendPfcpMessage(message, header)
message.SetHeader(header)
return pfcp.sendPfcpMessage(message)
}

func (pfcp *Pfcp) sendPfcpMessage(message messages.PFCPMessage, header messages.Header) error {
payload := messages.Serialize(message, header)
func (pfcp *Pfcp) sendPfcpMessage(message messages.PFCPMessage) error {
payload := messages.Serialize(message)
if err := pfcp.Udp.Send(payload); err != nil {
log.Printf("Failed to send PFCP: %v\n", err)
return err
Expand All @@ -43,66 +45,66 @@ func (pfcp *Pfcp) sendPfcpMessage(message messages.PFCPMessage, header messages.
return nil
}

func (pfcp *Pfcp) SendHeartbeatRequest(msg messages.HeartbeatRequest, sequenceNumber uint32) error {
func (pfcp *Pfcp) SendHeartbeatRequest(msg *messages.HeartbeatRequest, sequenceNumber uint32) error {
return pfcp.sendNodePfcpMessage(msg, sequenceNumber)
}

func (pfcp *Pfcp) SendHeartbeatResponse(msg messages.HeartbeatResponse, sequenceNumber uint32) error {
func (pfcp *Pfcp) SendHeartbeatResponse(msg *messages.HeartbeatResponse, sequenceNumber uint32) error {
return pfcp.sendNodePfcpMessage(msg, sequenceNumber)
}

func (pfcp *Pfcp) SendPFCPAssociationSetupRequest(msg messages.PFCPAssociationSetupRequest, sequenceNumber uint32) error {
func (pfcp *Pfcp) SendPFCPAssociationSetupRequest(msg *messages.PFCPAssociationSetupRequest, sequenceNumber uint32) error {
return pfcp.sendNodePfcpMessage(msg, sequenceNumber)
}

func (pfcp *Pfcp) SendPFCPAssociationSetupResponse(msg messages.PFCPAssociationSetupResponse, sequenceNumber uint32) error {
func (pfcp *Pfcp) SendPFCPAssociationSetupResponse(msg *messages.PFCPAssociationSetupResponse, sequenceNumber uint32) error {
return pfcp.sendNodePfcpMessage(msg, sequenceNumber)
}

func (pfcp *Pfcp) SendPFCPAssociationUpdateRequest(msg messages.PFCPAssociationUpdateRequest, sequenceNumber uint32) error {
func (pfcp *Pfcp) SendPFCPAssociationUpdateRequest(msg *messages.PFCPAssociationUpdateRequest, sequenceNumber uint32) error {
return pfcp.sendNodePfcpMessage(msg, sequenceNumber)
}

func (pfcp *Pfcp) SendPFCPAssociationUpdateResponse(msg messages.PFCPAssociationUpdateResponse, sequenceNumber uint32) error {
func (pfcp *Pfcp) SendPFCPAssociationUpdateResponse(msg *messages.PFCPAssociationUpdateResponse, sequenceNumber uint32) error {
return pfcp.sendNodePfcpMessage(msg, sequenceNumber)
}

func (pfcp *Pfcp) SendPFCPAssociationReleaseRequest(msg messages.PFCPAssociationReleaseRequest, sequenceNumber uint32) error {
func (pfcp *Pfcp) SendPFCPAssociationReleaseRequest(msg *messages.PFCPAssociationReleaseRequest, sequenceNumber uint32) error {
return pfcp.sendNodePfcpMessage(msg, sequenceNumber)
}

func (pfcp *Pfcp) SendPFCPAssociationReleaseResponse(msg messages.PFCPAssociationReleaseResponse, sequenceNumber uint32) error {
func (pfcp *Pfcp) SendPFCPAssociationReleaseResponse(msg *messages.PFCPAssociationReleaseResponse, sequenceNumber uint32) error {
return pfcp.sendNodePfcpMessage(msg, sequenceNumber)
}

func (pfcp *Pfcp) SendPFCPNodeReportRequest(msg messages.PFCPNodeReportRequest, sequenceNumber uint32) error {
func (pfcp *Pfcp) SendPFCPNodeReportRequest(msg *messages.PFCPNodeReportRequest, sequenceNumber uint32) error {
return pfcp.sendNodePfcpMessage(msg, sequenceNumber)
}

func (pfcp *Pfcp) SendPFCPNodeReportResponse(msg messages.PFCPNodeReportResponse, sequenceNumber uint32) error {
func (pfcp *Pfcp) SendPFCPNodeReportResponse(msg *messages.PFCPNodeReportResponse, sequenceNumber uint32) error {
return pfcp.sendNodePfcpMessage(msg, sequenceNumber)
}

func (pfcp *Pfcp) SendPFCPSessionEstablishmentRequest(msg messages.PFCPSessionEstablishmentRequest, seid uint64, sequenceNumber uint32) error {
func (pfcp *Pfcp) SendPFCPSessionEstablishmentRequest(msg *messages.PFCPSessionEstablishmentRequest, seid uint64, sequenceNumber uint32) error {
return pfcp.sendSessionPfcpMessage(msg, seid, sequenceNumber)
}

func (pfcp *Pfcp) SendPFCPSessionEstablishmentResponse(msg messages.PFCPSessionEstablishmentResponse, seid uint64, sequenceNumber uint32) error {
func (pfcp *Pfcp) SendPFCPSessionEstablishmentResponse(msg *messages.PFCPSessionEstablishmentResponse, seid uint64, sequenceNumber uint32) error {
return pfcp.sendSessionPfcpMessage(msg, seid, sequenceNumber)
}

func (pfcp *Pfcp) SendPFCPSessionDeletionRequest(msg messages.PFCPSessionDeletionRequest, seid uint64, sequenceNumber uint32) error {
func (pfcp *Pfcp) SendPFCPSessionDeletionRequest(msg *messages.PFCPSessionDeletionRequest, seid uint64, sequenceNumber uint32) error {
return pfcp.sendSessionPfcpMessage(msg, seid, sequenceNumber)
}

func (pfcp *Pfcp) SendPFCPSessionDeletionResponse(msg messages.PFCPSessionDeletionResponse, seid uint64, sequenceNumber uint32) error {
func (pfcp *Pfcp) SendPFCPSessionDeletionResponse(msg *messages.PFCPSessionDeletionResponse, seid uint64, sequenceNumber uint32) error {
return pfcp.sendSessionPfcpMessage(msg, seid, sequenceNumber)
}

func (pfcp *Pfcp) SendPFCPSessionReportRequest(msg messages.PFCPSessionReportRequest, seid uint64, sequenceNumber uint32) error {
func (pfcp *Pfcp) SendPFCPSessionReportRequest(msg *messages.PFCPSessionReportRequest, seid uint64, sequenceNumber uint32) error {
return pfcp.sendSessionPfcpMessage(msg, seid, sequenceNumber)
}

func (pfcp *Pfcp) SendPFCPSessionReportResponse(msg messages.PFCPSessionReportResponse, seid uint64, sequenceNumber uint32) error {
func (pfcp *Pfcp) SendPFCPSessionReportResponse(msg *messages.PFCPSessionReportResponse, seid uint64, sequenceNumber uint32) error {
return pfcp.sendSessionPfcpMessage(msg, seid, sequenceNumber)
}
2 changes: 1 addition & 1 deletion client/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func TestGivenPfcpWhenSendHeartbeatRequestThenNoError(t *testing.T) {
RecoveryTimeStamp: recoveryTimeStamp,
}

err = pfcpClient.SendHeartbeatRequest(heartbeatRequestMsg, sequenceNumber)
err = pfcpClient.SendHeartbeatRequest(&heartbeatRequestMsg, sequenceNumber)

if err != nil {
t.Errorf("SendHeartbeatRequest failed: %v", err)
Expand Down
9 changes: 3 additions & 6 deletions ie/ie.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,11 @@ func DeserializeInformationElements(b []byte) ([]InformationElement, error) {
return nil, fmt.Errorf("not enough bytes for IE header")
}

ieType := IEType(binary.BigEndian.Uint16(b[index : index+2]))
ieLength := binary.BigEndian.Uint16(b[index+2 : index+4])
index += HeaderLength

ieHeader := Header{
Type: ieType,
Length: ieLength,
Type: IEType(binary.BigEndian.Uint16(b[index : index+2])),
Length: binary.BigEndian.Uint16(b[index+2 : index+4]),
}
index += HeaderLength

if len(b[index:]) < int(ieHeader.Length) {
return nil, fmt.Errorf("not enough bytes for IE data, expected %d, got %d", ieHeader.Length, len(b[index:]))
Expand Down
2 changes: 1 addition & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ func main() {
RecoveryTimeStamp: recoveryTimeStamp,
}
sequenceNumber := uint32(1)
err = pfcpClient.SendPFCPAssociationSetupRequest(message, sequenceNumber)
err = pfcpClient.SendPFCPAssociationSetupRequest(&message, sequenceNumber)
if err != nil {
fmt.Printf("Error sending Heartbeat Request: %v", err)
}
Expand Down
11 changes: 0 additions & 11 deletions messages/header.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,17 +94,6 @@ func (header Header) Serialize() []byte {
return buf.Bytes()
}

func Serialize(message PFCPMessage, messageHeader Header) []byte {
var payload []byte
ies := message.GetIEs()
for _, element := range ies {
payload = append(payload, element.Serialize()...)
}
messageHeader.MessageLength = uint16(len(payload))
headerBytes := messageHeader.Serialize()
return append(headerBytes, payload...)
}

func DeserializeHeader(data []byte) (Header, error) {
const baseHeaderSize = 8 // Base size for node-related messages
const seidSize = 8 // Size of SEID field
Expand Down
18 changes: 18 additions & 0 deletions messages/heartbeat.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@ import (
)

type HeartbeatRequest struct {
Header Header
RecoveryTimeStamp ie.RecoveryTimeStamp // Mandatory
SourceIPAddress ie.SourceIPAddress // Optional
}

type HeartbeatResponse struct {
Header Header
RecoveryTimeStamp ie.RecoveryTimeStamp // Mandatory
}

Expand Down Expand Up @@ -62,6 +64,22 @@ func DeserializeHeartbeatRequest(data []byte) (HeartbeatRequest, error) {
}, err
}

func (msg HeartbeatRequest) GetHeader() Header {
return msg.Header
}

func (msg HeartbeatResponse) GetHeader() Header {
return msg.Header
}

func (msg *HeartbeatRequest) SetHeader(header Header) {
msg.Header = header
}

func (msg *HeartbeatResponse) SetHeader(header Header) {
msg.Header = header
}

func DeserializeHeartbeatResponse(data []byte) (HeartbeatResponse, error) {
ies, err := ie.DeserializeInformationElements(data)
var recoveryTimeStamp ie.RecoveryTimeStamp
Expand Down
14 changes: 14 additions & 0 deletions messages/messages.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,21 @@ const (
)

type PFCPMessage interface {
GetHeader() Header
GetIEs() []ie.InformationElement
GetMessageType() MessageType
GetMessageTypeString() string
SetHeader(Header)
}

func Serialize(msg PFCPMessage) []byte {
var payload []byte
messageHeader := msg.GetHeader()
ies := msg.GetIEs()
for _, element := range ies {
payload = append(payload, element.Serialize()...)
}
messageHeader.MessageLength = uint16(len(payload))
headerBytes := messageHeader.Serialize()
return append(headerBytes, payload...)
}
18 changes: 18 additions & 0 deletions messages/pfcp_association_release.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@ package messages
import "github.com/dot-5g/pfcp/ie"

type PFCPAssociationReleaseRequest struct {
Header Header
NodeID ie.NodeID // Mandatory
}

type PFCPAssociationReleaseResponse struct {
Header Header
NodeID ie.NodeID // Mandatory
Cause ie.Cause // Mandatory
}
Expand Down Expand Up @@ -35,6 +37,22 @@ func (msg PFCPAssociationReleaseResponse) GetMessageTypeString() string {
return "PFCP Association Release Response"
}

func (msg *PFCPAssociationReleaseRequest) SetHeader(h Header) {
msg.Header = h
}

func (msg *PFCPAssociationReleaseResponse) SetHeader(h Header) {
msg.Header = h
}

func (msg PFCPAssociationReleaseRequest) GetHeader() Header {
return msg.Header
}

func (msg PFCPAssociationReleaseResponse) GetHeader() Header {
return msg.Header
}

func DeserializePFCPAssociationReleaseRequest(data []byte) (PFCPAssociationReleaseRequest, error) {
ies, err := ie.DeserializeInformationElements(data)
var nodeID ie.NodeID
Expand Down
18 changes: 18 additions & 0 deletions messages/pfcp_association_setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@ import (
)

type PFCPAssociationSetupRequest struct {
Header Header
NodeID ie.NodeID // Mandatory
RecoveryTimeStamp ie.RecoveryTimeStamp // Mandatory
UPFunctionFeatures ie.UPFunctionFeatures // Conditional
}

type PFCPAssociationSetupResponse struct {
Header Header
NodeID ie.NodeID // Mandatory
Cause ie.Cause // Mandatory
RecoveryTimeStamp ie.RecoveryTimeStamp // Mandatory
Expand Down Expand Up @@ -46,6 +48,22 @@ func (msg PFCPAssociationSetupResponse) GetMessageTypeString() string {
return "PFCP Association Setup Response"
}

func (msg *PFCPAssociationSetupRequest) SetHeader(h Header) {
msg.Header = h
}

func (msg *PFCPAssociationSetupResponse) SetHeader(h Header) {
msg.Header = h
}

func (msg PFCPAssociationSetupRequest) GetHeader() Header {
return msg.Header
}

func (msg PFCPAssociationSetupResponse) GetHeader() Header {
return msg.Header
}

func DeserializePFCPAssociationSetupRequest(data []byte) (PFCPAssociationSetupRequest, error) {
ies, err := ie.DeserializeInformationElements(data)
var nodeID ie.NodeID
Expand Down
18 changes: 18 additions & 0 deletions messages/pfcp_association_update.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@ package messages
import "github.com/dot-5g/pfcp/ie"

type PFCPAssociationUpdateRequest struct {
Header Header
NodeID ie.NodeID // Mandatory
}

type PFCPAssociationUpdateResponse struct {
Header Header
NodeID ie.NodeID // Mandatory
Cause ie.Cause // Mandatory
}
Expand Down Expand Up @@ -35,6 +37,22 @@ func (msg PFCPAssociationUpdateResponse) GetMessageTypeString() string {
return "PFCP Association Update Response"
}

func (msg *PFCPAssociationUpdateRequest) SetHeader(h Header) {
msg.Header = h
}

func (msg *PFCPAssociationUpdateResponse) SetHeader(h Header) {
msg.Header = h
}

func (msg PFCPAssociationUpdateRequest) GetHeader() Header {
return msg.Header
}

func (msg PFCPAssociationUpdateResponse) GetHeader() Header {
return msg.Header
}

func DeserializePFCPAssociationUpdateRequest(data []byte) (PFCPAssociationUpdateRequest, error) {
ies, err := ie.DeserializeInformationElements(data)
var nodeID ie.NodeID
Expand Down
18 changes: 18 additions & 0 deletions messages/pfcp_node_report.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@ import (
)

type PFCPNodeReportRequest struct {
Header Header
NodeID ie.NodeID // Mandatory
NodeReportType ie.NodeReportType // Mandatory
}

type PFCPNodeReportResponse struct {
Header Header
NodeID ie.NodeID // Mandatory
Cause ie.Cause // Mandatory
}
Expand Down Expand Up @@ -38,6 +40,22 @@ func (msg PFCPNodeReportResponse) GetMessageTypeString() string {
return "PFCP Node Report Response"
}

func (msg *PFCPNodeReportRequest) SetHeader(h Header) {
msg.Header = h
}

func (msg *PFCPNodeReportResponse) SetHeader(h Header) {
msg.Header = h
}

func (msg PFCPNodeReportRequest) GetHeader() Header {
return msg.Header
}

func (msg PFCPNodeReportResponse) GetHeader() Header {
return msg.Header
}

func DeserializePFCPNodeReportRequest(data []byte) (PFCPNodeReportRequest, error) {
ies, err := ie.DeserializeInformationElements(data)
var nodeID ie.NodeID
Expand Down
Loading
Loading