From 98d1262cac91b613f341c85ce8a25a09d1b3c984 Mon Sep 17 00:00:00 2001 From: roundspring2003 Date: Sun, 28 Dec 2025 06:11:51 +0000 Subject: [PATCH 1/4] feat: impelmentation of vrf --- clean.sh | 8 ++++++ go.mod | 5 +--- go.sum | 9 ------- internal/nwucp/handler.go | 19 +++++++++++++++ internal/vrf/vrf.go | 46 +++++++++++++++++++++++++++++++++++ pkg/procedure/Procedure.go | 50 ++++++++++++-------------------------- 6 files changed, 90 insertions(+), 47 deletions(-) create mode 100644 internal/vrf/vrf.go diff --git a/clean.sh b/clean.sh index 9feeca5..8b59a19 100755 --- a/clean.sh +++ b/clean.sh @@ -18,3 +18,11 @@ for XFRMI in ${XFRMIs}; do sudo ip link del ${XFRMI} echo del ${XFRMI} done + +# Remove all VRF interfaces +echo "[Info] Remove all VRF interfaces" +VRFs=$(ip link show type vrf | awk 'NR%2==1 {print $2}' | cut -d @ -f 1) +for VRF in ${VRFs}; do + sudo ip link del ${VRF} + echo del ${VRF} +done diff --git a/go.mod b/go.mod index b54a003..841a5f6 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/free5gc/n3iwue -go 1.21 +go 1.25.5 require ( github.com/antonfisher/nested-logrus-formatter v1.3.1 @@ -13,7 +13,6 @@ require ( github.com/free5gc/ngap v1.0.8 github.com/free5gc/openapi v1.0.8 github.com/free5gc/util v1.0.7-0.20241017071924-da29aef99a1c - github.com/go-ping/ping v0.0.0-20211014180314-6e2b003bffdd github.com/google/gopacket v1.1.19 github.com/pkg/errors v0.9.1 github.com/sirupsen/logrus v1.8.1 @@ -36,7 +35,6 @@ require ( github.com/goccy/go-json v0.10.2 // indirect github.com/golang-jwt/jwt v3.2.1+incompatible // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect - github.com/google/uuid v1.2.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.2.4 // indirect github.com/leodido/go-urn v1.2.4 // indirect @@ -50,7 +48,6 @@ require ( github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df // indirect golang.org/x/arch v0.3.0 // indirect golang.org/x/crypto v0.21.0 // indirect - golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect golang.org/x/text v0.14.0 // indirect google.golang.org/protobuf v1.33.0 // indirect ) diff --git a/go.sum b/go.sum index 6dcab9e..f145c04 100644 --- a/go.sum +++ b/go.sum @@ -83,8 +83,6 @@ github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SU github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ping/ping v0.0.0-20211014180314-6e2b003bffdd h1:WwvAAgvP2MO5bxYtSlDovMFWiTd9vi+Ey7CJ54wAUrc= -github.com/go-ping/ping v0.0.0-20211014180314-6e2b003bffdd/go.mod h1:xIFjORFzTxqIV/tDVGO4eDy/bLuSyawEeojSm3GfRGk= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= @@ -147,8 +145,6 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= @@ -294,7 +290,6 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= @@ -312,9 +307,6 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -343,7 +335,6 @@ golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/internal/nwucp/handler.go b/internal/nwucp/handler.go index f3a9d38..82485cb 100755 --- a/internal/nwucp/handler.go +++ b/internal/nwucp/handler.go @@ -9,6 +9,7 @@ import ( "github.com/free5gc/n3iwue/internal/gre" "github.com/free5gc/n3iwue/internal/logger" "github.com/free5gc/n3iwue/internal/packet/nasPacket" + "github.com/free5gc/n3iwue/internal/vrf" context "github.com/free5gc/n3iwue/pkg/context" "github.com/free5gc/nas" "github.com/free5gc/nas/nasType" @@ -87,6 +88,17 @@ func (s *Server) handleDLNASTransport(evt *context.HandleDLNASTransportEvt) { newGREName := fmt.Sprintf("%s-id-%d", n3ueSelf.N3ueInfo.GreIfaceName, n3ueSelf.N3ueInfo.XfrmiId) + // Create VRF + vrfName := fmt.Sprintf("vrf-pdu-%d", n3ueSelf.PduSessionCount) + vrfTableID := 100 + int(n3ueSelf.PduSessionCount) + + vrfLink, err := vrf.CreateOrGetVRF(vrfName, vrfTableID) + if err != nil { + nwucpLog.Errorf("Create VRF failed:%s: %v", vrfName, err) + return + } + nwucpLog.Infof("Use VRF %s (Table %d)", vrfName, vrfTableID) + var linkGREs map[uint8]*netlink.Link if linkGREs, err = gre.SetupGreTunnels(newGREName, n3ueSelf.TemporaryXfrmiName, n3ueSelf.UEInnerAddr.IP, n3ueSelf.TemporaryUPIPAddr, pduAddress, n3ueSelf.TemporaryQosInfo); err != nil { @@ -115,6 +127,12 @@ func (s *Server) handleDLNASTransport(evt *context.HandleDLNASTransportEvt) { nwucpLog.Errorf("not found target address for QFI [%v] from NAS", qfi) continue } + //Bind GRE interface to VRF + if err := netlink.LinkSetMaster(tunnel, vrfLink); err != nil { + nwucpLog.Errorf("Failed to bind %s to VRF %s", tunnel.Attrs().Name, vrfName) + continue + } + nwucpLog.Infof("Interface %s bound to VRF %s", tunnel.Attrs().Name, vrfName) nwucpLog.Infof("Add route: QFI[%+v] remote address[%+v]", qfi, remoteAddress) upRoute := &netlink.Route{ @@ -124,6 +142,7 @@ func (s *Server) handleDLNASTransport(evt *context.HandleDLNASTransportEvt) { Mask: remoteAddress.Mask, }, Priority: priority, + Table: vrfTableID, } if err := netlink.RouteAdd(upRoute); err != nil { nwucpLog.Warnf("netlink.RouteAdd: %+v", err) diff --git a/internal/vrf/vrf.go b/internal/vrf/vrf.go new file mode 100644 index 0000000..441cd3f --- /dev/null +++ b/internal/vrf/vrf.go @@ -0,0 +1,46 @@ +package vrf + +import ( + "fmt" + + "github.com/vishvananda/netlink" + + "github.com/free5gc/n3iwue/pkg/context" +) + +func CreateOrGetVRF(vrfName string, tableID int) (netlink.Link, error) { + // Try to get VRF + link, err := netlink.LinkByName(vrfName) + if err == nil { + // Found, check if it is a VRF + if vrf, ok := link.(*netlink.Vrf); ok { + if vrf.Table == uint32(tableID) { + return vrf, nil // VRF exists and is correct + } + return nil, fmt.Errorf("VRF %s exists but Table ID mismatch (need %d, actual %d)", vrfName, tableID, vrf.Table) + } + return nil, fmt.Errorf("Device %s exists but is not a VRF", vrfName) + } + + // Create VRF (l3mdev) device + vrfLink := &netlink.Vrf{ + LinkAttrs: netlink.LinkAttrs{Name: vrfName}, + Table: uint32(tableID), + } + + if err := netlink.LinkAdd(vrfLink); err != nil { + return nil, fmt.Errorf("netlink.LinkAdd VRF %s failed: %v", vrfName, err) + } + + // Enable VRF device + if err := netlink.LinkSetUp(vrfLink); err != nil { + return nil, fmt.Errorf("netlink.LinkSetUp VRF %s failed: %v", vrfName, err) + } + + // Add to CreatedIface for auto cleanup + n3ueSelf := context.N3UESelf() + var createdLink netlink.Link = vrfLink + n3ueSelf.CreatedIface = append(n3ueSelf.CreatedIface, &createdLink) + + return vrfLink, nil +} diff --git a/pkg/procedure/Procedure.go b/pkg/procedure/Procedure.go index 5aff0ee..29fc017 100755 --- a/pkg/procedure/Procedure.go +++ b/pkg/procedure/Procedure.go @@ -3,11 +3,10 @@ package procedure import ( "context" "fmt" + "os/exec" "runtime/debug" "sync" - "time" - "github.com/go-ping/ping" "github.com/sirupsen/logrus" "github.com/free5gc/n3iwue/internal/logger" @@ -127,46 +126,29 @@ func (s *Server) handleEvent(evt n3iwue_context.ProcedureEvt) { func (s *Server) TestConnectivity(addr string) error { n3ueSelf := s.Context() - // Ping remote - pinger, err := ping.NewPinger(addr) - if err != nil { - return err - } - - // Run with root - pinger.SetPrivileged(true) + // Calculate the VRF ID used for the last session + // Since PduSessionCount is incremented after session establishment, we subtract 1 + vrfID := n3ueSelf.PduSessionCount - 1 + vrfName := fmt.Sprintf("vrf-pdu-%d", vrfID) - pinger.OnRecv = func(pkt *ping.Packet) { - AppLog.Infof("%d bytes from %s: icmp_seq=%d time=%v\n", - pkt.Nbytes, pkt.IPAddr, pkt.Seq, pkt.Rtt) - } - pinger.OnFinish = func(stats *ping.Statistics) { - AppLog.Infof("\n--- %s ping statistics ---\n", stats.Addr) - AppLog.Infof("%d packets transmitted, %d packets received, %v%% packet loss\n", - stats.PacketsSent, stats.PacketsRecv, stats.PacketLoss) - AppLog.Infof("round-trip min/avg/max/stddev = %v/%v/%v/%v\n", - stats.MinRtt, stats.AvgRtt, stats.MaxRtt, stats.StdDevRtt) - } + AppLog.Infof("Ping %s using VRF %s", addr, vrfName) - pinger.Count = 5 - pinger.Timeout = 10 * time.Second + args := []string{"vrf", "exec", vrfName, "ping", "-c", "5"} if n3ueSelf.N3ueInfo.DnIPAddr != "" { - pinger.Source = n3ueSelf.N3ueInfo.DnIPAddr + args = append(args, "-I", n3ueSelf.N3ueInfo.DnIPAddr) } + args = append(args, addr) - time.Sleep(3 * time.Second) + // Use ip vrf exec to ping + cmd := exec.Command("ip", args...) - if err := pinger.Run(); err != nil { - return fmt.Errorf("Running ping failed: %+v", err) - } - - time.Sleep(1 * time.Second) - - stats := pinger.Statistics() - if stats.PacketsSent != stats.PacketsRecv { - return fmt.Errorf("Ping Failed") + // We can capture output to log it + output, err := cmd.CombinedOutput() + if err != nil { + return fmt.Errorf("ping failed: %v, output: %s", err, string(output)) } + AppLog.Infof("Ping output:\n%s", string(output)) return nil } From 307f94184ceb0691b78d7bdf14976ea3ee85d46e Mon Sep 17 00:00:00 2001 From: roundspring2003 Date: Mon, 29 Dec 2025 20:37:59 +0000 Subject: [PATCH 2/4] fix: golangci-lint --- internal/nwucp/handler.go | 10 +- internal/packet/nasPacket/nasPduDl.go | 4 +- internal/packet/nasPacket/nasPduUl.go | 332 +++++++++++++------------- internal/qos/qos.go | 2 +- internal/security/ranUe.go | 7 +- internal/security/security.go | 10 +- internal/vrf/vrf.go | 2 +- pkg/factory/config.go | 2 +- pkg/factory/factory.go | 8 +- pkg/ike/handler.go | 19 +- pkg/ike/security.go | 3 +- pkg/ike/send.go | 3 +- pkg/ike/xfrm/xfrm.go | 8 +- pkg/procedure/Procedure.go | 2 +- 14 files changed, 204 insertions(+), 208 deletions(-) diff --git a/internal/nwucp/handler.go b/internal/nwucp/handler.go index 82485cb..d270ba9 100755 --- a/internal/nwucp/handler.go +++ b/internal/nwucp/handler.go @@ -50,7 +50,7 @@ func (s *Server) handleRegistrationAccept(evt *context.HandleRegistrationAcceptE n3ueSelf := s.Context() nasMsg := evt.NasMsg n3ueSelf.RanUeContext.DLCount.AddOne() - n3ueSelf.GUTI = nasMsg.GmmMessage.RegistrationAccept.GUTI5G + n3ueSelf.GUTI = nasMsg.RegistrationAccept.GUTI5G // send NAS Registration Complete Msg pdu := nasPacket.GetRegistrationComplete(nil) @@ -66,7 +66,7 @@ func (s *Server) handleDLNASTransport(evt *context.HandleDLNASTransportEvt) { n3ueSelf := s.Context() nasMsg := evt.NasMsg - payloadContainer := nasMsg.GmmMessage.DLNASTransport.PayloadContainer + payloadContainer := nasMsg.DLNASTransport.PayloadContainer byteArray := payloadContainer.Buffer[:payloadContainer.Len] if err := nasMsg.GsmMessageDecode(&byteArray); err != nil { nwucpLog.Errorf("NAS Decode Fail: %+v", err) @@ -77,7 +77,7 @@ func (s *Server) handleDLNASTransport(evt *context.HandleDLNASTransportEvt) { case nas.MsgTypePDUSessionEstablishmentAccept: nwucpLog.Tracef("Get PDUSession Establishment Accept") - pduAddress, err := nasPacket.GetPDUAddress(nasMsg.GsmMessage.PDUSessionEstablishmentAccept) + pduAddress, err := nasPacket.GetPDUAddress(nasMsg.PDUSessionEstablishmentAccept) if err != nil { nwucpLog.Errorf("GetPDUAddress Fail: %+v", err) return @@ -127,7 +127,7 @@ func (s *Server) handleDLNASTransport(evt *context.HandleDLNASTransportEvt) { nwucpLog.Errorf("not found target address for QFI [%v] from NAS", qfi) continue } - //Bind GRE interface to VRF + // Bind GRE interface to VRF if err := netlink.LinkSetMaster(tunnel, vrfLink); err != nil { nwucpLog.Errorf("Failed to bind %s to VRF %s", tunnel.Attrs().Name, vrfName) continue @@ -179,7 +179,7 @@ func (s *Server) handleDeregistrationReqUeTerminated(evt *context.HandleDeregist n3ueSelf := s.Context() nasMsg := evt.NasMsg - deregistrationRequest := nasMsg.GmmMessage.DeregistrationRequestUETerminatedDeregistration + deregistrationRequest := nasMsg.DeregistrationRequestUETerminatedDeregistration if deregistrationRequest == nil { nwucpLog.Errorf("Deregistration Request UE Terminated is nil") return diff --git a/internal/packet/nasPacket/nasPduDl.go b/internal/packet/nasPacket/nasPduDl.go index edac870..37c883e 100644 --- a/internal/packet/nasPacket/nasPduDl.go +++ b/internal/packet/nasPacket/nasPduDl.go @@ -17,7 +17,7 @@ func DecodePDUSessionEstablishmentAccept( buffer []byte, ) (*nas.Message, error) { if length == 0 { - return nil, fmt.Errorf("Empty buffer") + return nil, fmt.Errorf("empty buffer") } nasEnv, n := ngapPacket.DecapNasPduFromEnvelope(buffer[:length]) @@ -31,7 +31,7 @@ func DecodePDUSessionEstablishmentAccept( } // Retrieve GSM from GmmMessage.DLNASTransport.PayloadContainer and decode - payloadContainer := nasMsg.GmmMessage.DLNASTransport.PayloadContainer + payloadContainer := nasMsg.DLNASTransport.PayloadContainer byteArray := payloadContainer.Buffer[:payloadContainer.Len] if err := nasMsg.GsmMessageDecode(&byteArray); err != nil { return nil, fmt.Errorf("NAS Decode Fail: %+v", err) diff --git a/internal/packet/nasPacket/nasPduUl.go b/internal/packet/nasPacket/nasPduUl.go index 739313f..1955d3e 100644 --- a/internal/packet/nasPacket/nasPduUl.go +++ b/internal/packet/nasPacket/nasPduUl.go @@ -39,13 +39,13 @@ func GetRegistrationRequest( registrationRequest := nasMessage.NewRegistrationRequest(0) registrationRequest.SetExtendedProtocolDiscriminator(nasMessage.Epd5GSMobilityManagementMessage) - registrationRequest.SpareHalfOctetAndSecurityHeaderType.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) - registrationRequest.SpareHalfOctetAndSecurityHeaderType.SetSpareHalfOctet(0x00) - registrationRequest.RegistrationRequestMessageIdentity.SetMessageType(nas.MsgTypeRegistrationRequest) - registrationRequest.NgksiAndRegistrationType5GS.SetTSC(nasMessage.TypeOfSecurityContextFlagNative) + registrationRequest.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) + registrationRequest.SetSpareHalfOctet(0x00) + registrationRequest.SetMessageType(nas.MsgTypeRegistrationRequest) + registrationRequest.SetTSC(nasMessage.TypeOfSecurityContextFlagNative) registrationRequest.NgksiAndRegistrationType5GS.SetNasKeySetIdentifiler(0x7) - registrationRequest.NgksiAndRegistrationType5GS.SetFOR(1) - registrationRequest.NgksiAndRegistrationType5GS.SetRegistrationType5GS(registrationType) + registrationRequest.SetFOR(1) + registrationRequest.SetRegistrationType5GS(registrationType) registrationRequest.MobileIdentity5GS = mobileIdentity registrationRequest.UESecurityCapability = ueSecurityCapability @@ -57,10 +57,10 @@ func GetRegistrationRequest( registrationRequest.NASMessageContainer = nasType.NewNASMessageContainer( nasMessage.RegistrationRequestNASMessageContainerType) registrationRequest.NASMessageContainer.SetLen(uint16(len(nasMessageContainer))) - registrationRequest.NASMessageContainer.SetNASMessageContainerContents(nasMessageContainer) + registrationRequest.SetNASMessageContainerContents(nasMessageContainer) } - m.GmmMessage.RegistrationRequest = registrationRequest + m.RegistrationRequest = registrationRequest data := new(bytes.Buffer) err := m.GmmMessageEncode(data) @@ -77,23 +77,23 @@ func GetPduSessionEstablishmentRequest(pduSessionId uint8) []byte { m.GsmHeader.SetMessageType(nas.MsgTypePDUSessionEstablishmentRequest) pduSessionEstablishmentRequest := nasMessage.NewPDUSessionEstablishmentRequest(0) - pduSessionEstablishmentRequest.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + pduSessionEstablishmentRequest.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSSessionManagementMessage) pduSessionEstablishmentRequest.SetMessageType(nas.MsgTypePDUSessionEstablishmentRequest) - pduSessionEstablishmentRequest.PDUSessionID.SetPDUSessionID(pduSessionId) - pduSessionEstablishmentRequest.PTI.SetPTI(0x00) - pduSessionEstablishmentRequest.IntegrityProtectionMaximumDataRate. + pduSessionEstablishmentRequest.SetPDUSessionID(pduSessionId) + pduSessionEstablishmentRequest.SetPTI(0x00) + pduSessionEstablishmentRequest. SetMaximumDataRatePerUEForUserPlaneIntegrityProtectionForDownLink(0xff) - pduSessionEstablishmentRequest.IntegrityProtectionMaximumDataRate. + pduSessionEstablishmentRequest. SetMaximumDataRatePerUEForUserPlaneIntegrityProtectionForUpLink(0xff) pduSessionEstablishmentRequest.PDUSessionType = nasType.NewPDUSessionType( nasMessage.PDUSessionEstablishmentRequestPDUSessionTypeType, ) - pduSessionEstablishmentRequest.PDUSessionType.SetPDUSessionTypeValue(uint8(0x01)) // IPv4 type + pduSessionEstablishmentRequest.SetPDUSessionTypeValue(uint8(0x01)) // IPv4 type pduSessionEstablishmentRequest.SSCMode = nasType.NewSSCMode(nasMessage.PDUSessionEstablishmentRequestSSCModeType) - pduSessionEstablishmentRequest.SSCMode.SetSSCMode(uint8(0x01)) // SSC Mode 1 + pduSessionEstablishmentRequest.SetSSCMode(uint8(0x01)) // SSC Mode 1 pduSessionEstablishmentRequest.ExtendedProtocolConfigurationOptions = nasType.NewExtendedProtocolConfigurationOptions( nasMessage.PDUSessionEstablishmentRequestExtendedProtocolConfigurationOptionsType, @@ -105,10 +105,10 @@ func GetPduSessionEstablishmentRequest(pduSessionId uint8) []byte { pcoContents := protocolConfigurationOptions.Marshal() pcoContentsLength := len(pcoContents) pduSessionEstablishmentRequest.ExtendedProtocolConfigurationOptions.SetLen(uint16(pcoContentsLength)) - pduSessionEstablishmentRequest.ExtendedProtocolConfigurationOptions. + pduSessionEstablishmentRequest. SetExtendedProtocolConfigurationOptionsContents(pcoContents) - m.GsmMessage.PDUSessionEstablishmentRequest = pduSessionEstablishmentRequest + m.PDUSessionEstablishmentRequest = pduSessionEstablishmentRequest data := new(bytes.Buffer) err := m.GsmMessageEncode(data) @@ -129,20 +129,20 @@ func GetUlNasTransport_PduSessionEstablishmentRequest(pduSessionId uint8, reques m.GmmHeader.SetMessageType(nas.MsgTypeULNASTransport) ulNasTransport := nasMessage.NewULNASTransport(0) - ulNasTransport.SpareHalfOctetAndSecurityHeaderType.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) + ulNasTransport.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) ulNasTransport.SetMessageType(nas.MsgTypeULNASTransport) - ulNasTransport.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + ulNasTransport.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSMobilityManagementMessage) ulNasTransport.PduSessionID2Value = new(nasType.PduSessionID2Value) ulNasTransport.PduSessionID2Value.SetIei(nasMessage.ULNASTransportPduSessionID2ValueType) - ulNasTransport.PduSessionID2Value.SetPduSessionID2Value(pduSessionId) + ulNasTransport.SetPduSessionID2Value(pduSessionId) ulNasTransport.RequestType = new(nasType.RequestType) ulNasTransport.RequestType.SetIei(nasMessage.ULNASTransportRequestTypeType) - ulNasTransport.RequestType.SetRequestTypeValue(requestType) + ulNasTransport.SetRequestTypeValue(requestType) if dnnString != "" { ulNasTransport.DNN = new(nasType.DNN) ulNasTransport.DNN.SetIei(nasMessage.ULNASTransportDNNType) - ulNasTransport.DNN.SetDNN(dnnString) + ulNasTransport.SetDNN(dnnString) } ulNasTransport.SNSSAI = nasType.NewSNSSAI(nasMessage.ULNASTransportSNSSAIType) @@ -155,19 +155,19 @@ func GetUlNasTransport_PduSessionEstablishmentRequest(pduSessionId uint8, reques logger.NasMsgLog.Warnf("sNssai SD decode error: %+v", err) } copy(sdTemp[:], sd) - ulNasTransport.SNSSAI.SetSD(sdTemp) + ulNasTransport.SetSD(sdTemp) ulNasTransport.SNSSAI.SetLen(4) } - ulNasTransport.SNSSAI.SetSST(uint8(sNssai.Sst)) + ulNasTransport.SetSST(uint8(sNssai.Sst)) } - ulNasTransport.SpareHalfOctetAndPayloadContainerType.SetPayloadContainerType( + ulNasTransport.SetPayloadContainerType( nasMessage.PayloadContainerTypeN1SMInfo, ) ulNasTransport.PayloadContainer.SetLen(uint16(len(pduSessionEstablishmentRequest))) - ulNasTransport.PayloadContainer.SetPayloadContainerContents(pduSessionEstablishmentRequest) + ulNasTransport.SetPayloadContainerContents(pduSessionEstablishmentRequest) - m.GmmMessage.ULNASTransport = ulNasTransport + m.ULNASTransport = ulNasTransport data := new(bytes.Buffer) err := m.GmmMessageEncode(data) @@ -188,20 +188,20 @@ func GetUlNasTransport_PduSessionModificationRequest(pduSessionId uint8, request m.GmmHeader.SetMessageType(nas.MsgTypeULNASTransport) ulNasTransport := nasMessage.NewULNASTransport(0) - ulNasTransport.SpareHalfOctetAndSecurityHeaderType.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) + ulNasTransport.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) ulNasTransport.SetMessageType(nas.MsgTypeULNASTransport) - ulNasTransport.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + ulNasTransport.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSMobilityManagementMessage) ulNasTransport.PduSessionID2Value = new(nasType.PduSessionID2Value) ulNasTransport.PduSessionID2Value.SetIei(nasMessage.ULNASTransportPduSessionID2ValueType) - ulNasTransport.PduSessionID2Value.SetPduSessionID2Value(pduSessionId) + ulNasTransport.SetPduSessionID2Value(pduSessionId) ulNasTransport.RequestType = new(nasType.RequestType) ulNasTransport.RequestType.SetIei(nasMessage.ULNASTransportRequestTypeType) - ulNasTransport.RequestType.SetRequestTypeValue(requestType) + ulNasTransport.SetRequestTypeValue(requestType) if dnnString != "" { ulNasTransport.DNN = new(nasType.DNN) ulNasTransport.DNN.SetIei(nasMessage.ULNASTransportDNNType) - ulNasTransport.DNN.SetDNN(dnnString) + ulNasTransport.SetDNN(dnnString) } ulNasTransport.SNSSAI = nasType.NewSNSSAI(nasMessage.ULNASTransportSNSSAIType) @@ -214,19 +214,19 @@ func GetUlNasTransport_PduSessionModificationRequest(pduSessionId uint8, request logger.NasMsgLog.Warnf("sNssai SD decode error: %+v", err) } copy(sdTemp[:], sd) - ulNasTransport.SNSSAI.SetSD(sdTemp) + ulNasTransport.SetSD(sdTemp) ulNasTransport.SNSSAI.SetLen(4) } - ulNasTransport.SNSSAI.SetSST(uint8(sNssai.Sst)) + ulNasTransport.SetSST(uint8(sNssai.Sst)) } - ulNasTransport.SpareHalfOctetAndPayloadContainerType.SetPayloadContainerType( + ulNasTransport.SetPayloadContainerType( nasMessage.PayloadContainerTypeN1SMInfo, ) ulNasTransport.PayloadContainer.SetLen(uint16(len(pduSessionModificationRequest))) - ulNasTransport.PayloadContainer.SetPayloadContainerContents(pduSessionModificationRequest) + ulNasTransport.SetPayloadContainerContents(pduSessionModificationRequest) - m.GmmMessage.ULNASTransport = ulNasTransport + m.ULNASTransport = ulNasTransport data := new(bytes.Buffer) err := m.GmmMessageEncode(data) @@ -243,18 +243,18 @@ func GetPduSessionModificationRequest(pduSessionId uint8) []byte { m.GsmHeader.SetMessageType(nas.MsgTypePDUSessionModificationRequest) pduSessionModificationRequest := nasMessage.NewPDUSessionModificationRequest(0) - pduSessionModificationRequest.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + pduSessionModificationRequest.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSSessionManagementMessage) pduSessionModificationRequest.SetMessageType(nas.MsgTypePDUSessionModificationRequest) - pduSessionModificationRequest.PDUSessionID.SetPDUSessionID(pduSessionId) - pduSessionModificationRequest.PTI.SetPTI(0x00) + pduSessionModificationRequest.SetPDUSessionID(pduSessionId) + pduSessionModificationRequest.SetPTI(0x00) // pduSessionModificationRequest.RequestedQosFlowDescriptions = nasType.NewRequestedQosFlowDescriptions(nasMessage. // PDUSessionModificationRequestRequestedQosFlowDescriptionsType) // pduSessionModificationRequest.RequestedQosFlowDescriptions.SetLen(6) // pduSessionModificationRequest.RequestedQosFlowDescriptions.SetQoSFlowDescriptions([]uint8{0x09, 0x20, 0x41, 0x01, // 0x01, 0x09}) - m.GsmMessage.PDUSessionModificationRequest = pduSessionModificationRequest + m.PDUSessionModificationRequest = pduSessionModificationRequest data := new(bytes.Buffer) err := m.GsmMessageEncode(data) @@ -271,13 +271,13 @@ func GetPduSessionModificationComplete(pduSessionId uint8) []byte { m.GsmHeader.SetMessageType(nas.MsgTypePDUSessionModificationComplete) pduSessionModificationComplete := nasMessage.NewPDUSessionModificationComplete(0) - pduSessionModificationComplete.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + pduSessionModificationComplete.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSSessionManagementMessage) pduSessionModificationComplete.SetMessageType(nas.MsgTypePDUSessionModificationComplete) - pduSessionModificationComplete.PDUSessionID.SetPDUSessionID(pduSessionId) - pduSessionModificationComplete.PTI.SetPTI(0x00) + pduSessionModificationComplete.SetPDUSessionID(pduSessionId) + pduSessionModificationComplete.SetPTI(0x00) - m.GsmMessage.PDUSessionModificationComplete = pduSessionModificationComplete + m.PDUSessionModificationComplete = pduSessionModificationComplete data := new(bytes.Buffer) err := m.GsmMessageEncode(data) @@ -294,13 +294,13 @@ func GetPduSessionModificationCommandReject(pduSessionId uint8) []byte { m.GsmHeader.SetMessageType(nas.MsgTypePDUSessionModificationCommandReject) pduSessionModificationCommandReject := nasMessage.NewPDUSessionModificationCommandReject(0) - pduSessionModificationCommandReject.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + pduSessionModificationCommandReject.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSSessionManagementMessage) pduSessionModificationCommandReject.SetMessageType(nas.MsgTypePDUSessionModificationCommandReject) - pduSessionModificationCommandReject.PDUSessionID.SetPDUSessionID(pduSessionId) - pduSessionModificationCommandReject.PTI.SetPTI(0x00) + pduSessionModificationCommandReject.SetPDUSessionID(pduSessionId) + pduSessionModificationCommandReject.SetPTI(0x00) - m.GsmMessage.PDUSessionModificationCommandReject = pduSessionModificationCommandReject + m.PDUSessionModificationCommandReject = pduSessionModificationCommandReject data := new(bytes.Buffer) err := m.GsmMessageEncode(data) @@ -317,13 +317,13 @@ func GetPduSessionReleaseRequest(pduSessionId uint8) []byte { m.GsmHeader.SetMessageType(nas.MsgTypePDUSessionReleaseRequest) pduSessionReleaseRequest := nasMessage.NewPDUSessionReleaseRequest(0) - pduSessionReleaseRequest.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + pduSessionReleaseRequest.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSSessionManagementMessage) pduSessionReleaseRequest.SetMessageType(nas.MsgTypePDUSessionReleaseRequest) - pduSessionReleaseRequest.PDUSessionID.SetPDUSessionID(pduSessionId) - pduSessionReleaseRequest.PTI.SetPTI(0x00) + pduSessionReleaseRequest.SetPDUSessionID(pduSessionId) + pduSessionReleaseRequest.SetPTI(0x00) - m.GsmMessage.PDUSessionReleaseRequest = pduSessionReleaseRequest + m.PDUSessionReleaseRequest = pduSessionReleaseRequest data := new(bytes.Buffer) err := m.GsmMessageEncode(data) @@ -340,13 +340,13 @@ func GetPduSessionReleaseComplete(pduSessionId uint8) []byte { m.GsmHeader.SetMessageType(nas.MsgTypePDUSessionReleaseComplete) pduSessionReleaseComplete := nasMessage.NewPDUSessionReleaseComplete(0) - pduSessionReleaseComplete.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + pduSessionReleaseComplete.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSSessionManagementMessage) pduSessionReleaseComplete.SetMessageType(nas.MsgTypePDUSessionReleaseComplete) - pduSessionReleaseComplete.PDUSessionID.SetPDUSessionID(pduSessionId) - pduSessionReleaseComplete.PTI.SetPTI(0x00) + pduSessionReleaseComplete.SetPDUSessionID(pduSessionId) + pduSessionReleaseComplete.SetPTI(0x00) - m.GsmMessage.PDUSessionReleaseComplete = pduSessionReleaseComplete + m.PDUSessionReleaseComplete = pduSessionReleaseComplete data := new(bytes.Buffer) err := m.GsmMessageEncode(data) @@ -363,13 +363,13 @@ func GetPduSessionReleaseReject(pduSessionId uint8) []byte { m.GsmHeader.SetMessageType(nas.MsgTypePDUSessionReleaseReject) pduSessionReleaseReject := nasMessage.NewPDUSessionReleaseReject(0) - pduSessionReleaseReject.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + pduSessionReleaseReject.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSSessionManagementMessage) pduSessionReleaseReject.SetMessageType(nas.MsgTypePDUSessionReleaseReject) - pduSessionReleaseReject.PDUSessionID.SetPDUSessionID(pduSessionId) - pduSessionReleaseReject.PTI.SetPTI(0x00) + pduSessionReleaseReject.SetPDUSessionID(pduSessionId) + pduSessionReleaseReject.SetPTI(0x00) - m.GsmMessage.PDUSessionReleaseReject = pduSessionReleaseReject + m.PDUSessionReleaseReject = pduSessionReleaseReject data := new(bytes.Buffer) err := m.GsmMessageEncode(data) @@ -386,15 +386,15 @@ func GetPduSessionAuthenticationComplete(pduSessionId uint8) []byte { m.GsmHeader.SetMessageType(nas.MsgTypePDUSessionAuthenticationComplete) pduSessionAuthenticaitonComplete := nasMessage.NewPDUSessionAuthenticationComplete(0) - pduSessionAuthenticaitonComplete.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + pduSessionAuthenticaitonComplete.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSSessionManagementMessage) pduSessionAuthenticaitonComplete.SetMessageType(nas.MsgTypePDUSessionAuthenticationComplete) - pduSessionAuthenticaitonComplete.PDUSessionID.SetPDUSessionID(pduSessionId) - pduSessionAuthenticaitonComplete.PTI.SetPTI(0x00) + pduSessionAuthenticaitonComplete.SetPDUSessionID(pduSessionId) + pduSessionAuthenticaitonComplete.SetPTI(0x00) pduSessionAuthenticaitonComplete.EAPMessage.SetLen(6) - pduSessionAuthenticaitonComplete.EAPMessage.SetEAPMessage([]byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55}) + pduSessionAuthenticaitonComplete.SetEAPMessage([]byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55}) - m.GsmMessage.PDUSessionAuthenticationComplete = pduSessionAuthenticaitonComplete + m.PDUSessionAuthenticationComplete = pduSessionAuthenticaitonComplete data := new(bytes.Buffer) err := m.GsmMessageEncode(data) @@ -429,21 +429,21 @@ func GetUlNasTransport_PduSessionCommonData(pduSessionId uint8, types string) [] m.GmmHeader.SetMessageType(nas.MsgTypeULNASTransport) ulNasTransport := nasMessage.NewULNASTransport(0) - ulNasTransport.SpareHalfOctetAndSecurityHeaderType.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) + ulNasTransport.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) ulNasTransport.SetMessageType(nas.MsgTypeULNASTransport) - ulNasTransport.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + ulNasTransport.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSMobilityManagementMessage) ulNasTransport.PduSessionID2Value = new(nasType.PduSessionID2Value) ulNasTransport.PduSessionID2Value.SetIei(nasMessage.ULNASTransportPduSessionID2ValueType) - ulNasTransport.PduSessionID2Value.SetPduSessionID2Value(pduSessionId) + ulNasTransport.SetPduSessionID2Value(pduSessionId) - ulNasTransport.SpareHalfOctetAndPayloadContainerType.SetPayloadContainerType( + ulNasTransport.SetPayloadContainerType( nasMessage.PayloadContainerTypeN1SMInfo, ) ulNasTransport.PayloadContainer.SetLen(uint16(len(payload))) - ulNasTransport.PayloadContainer.SetPayloadContainerContents(payload) + ulNasTransport.SetPayloadContainerContents(payload) - m.GmmMessage.ULNASTransport = ulNasTransport + m.ULNASTransport = ulNasTransport data := new(bytes.Buffer) err := m.GmmMessageEncode(data) @@ -460,14 +460,14 @@ func GetIdentityResponse(mobileIdentity nasType.MobileIdentity) []byte { m.GmmHeader.SetMessageType(nas.MsgTypeIdentityResponse) identityResponse := nasMessage.NewIdentityResponse(0) - identityResponse.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + identityResponse.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSMobilityManagementMessage) - identityResponse.IdentityResponseMessageIdentity.SetMessageType(nas.MsgTypeIdentityResponse) - identityResponse.SpareHalfOctetAndSecurityHeaderType.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) - identityResponse.SpareHalfOctetAndSecurityHeaderType.SetSpareHalfOctet(0) + identityResponse.SetMessageType(nas.MsgTypeIdentityResponse) + identityResponse.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) + identityResponse.SetSpareHalfOctet(0) identityResponse.MobileIdentity = mobileIdentity - m.GmmMessage.IdentityResponse = identityResponse + m.IdentityResponse = identityResponse data := new(bytes.Buffer) err := m.GmmMessageEncode(data) @@ -484,15 +484,15 @@ func GetNotificationResponse(pDUSessionStatus []uint8) []byte { m.GmmHeader.SetMessageType(nas.MsgTypeNotificationResponse) notificationResponse := nasMessage.NewNotificationResponse(0) - notificationResponse.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + notificationResponse.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSMobilityManagementMessage) notificationResponse.SetMessageType(nas.MsgTypeNotificationResponse) notificationResponse.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) notificationResponse.PDUSessionStatus = new(nasType.PDUSessionStatus) - notificationResponse.PDUSessionStatus.SetIei(nasMessage.NotificationResponsePDUSessionStatusType) - notificationResponse.PDUSessionStatus.Buffer = pDUSessionStatus + notificationResponse.SetIei(nasMessage.NotificationResponsePDUSessionStatusType) + notificationResponse.Buffer = pDUSessionStatus - m.GmmMessage.NotificationResponse = notificationResponse + m.NotificationResponse = notificationResponse data := new(bytes.Buffer) err := m.GmmMessageEncode(data) @@ -514,7 +514,7 @@ func GetConfigurationUpdateComplete() []byte { configurationUpdateComplete.SetSpareHalfOctet(0x00) configurationUpdateComplete.SetMessageType(nas.MsgTypeConfigurationUpdateComplete) - m.GmmMessage.ConfigurationUpdateComplete = configurationUpdateComplete + m.ConfigurationUpdateComplete = configurationUpdateComplete data := new(bytes.Buffer) err := m.GmmMessageEncode(data) @@ -554,7 +554,7 @@ func GetServiceRequest(serviceType uint8) []byte { case nasMessage.ServiceTypeSignalling: } - m.GmmMessage.ServiceRequest = serviceRequest + m.ServiceRequest = serviceRequest data := new(bytes.Buffer) err := m.GmmMessageEncode(data) @@ -571,11 +571,11 @@ func GetAuthenticationResponse(authenticationResponseParam []uint8, eapMsg strin m.GmmHeader.SetMessageType(nas.MsgTypeAuthenticationResponse) authenticationResponse := nasMessage.NewAuthenticationResponse(0) - authenticationResponse.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + authenticationResponse.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSMobilityManagementMessage) - authenticationResponse.SpareHalfOctetAndSecurityHeaderType.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) - authenticationResponse.SpareHalfOctetAndSecurityHeaderType.SetSpareHalfOctet(0) - authenticationResponse.AuthenticationResponseMessageIdentity.SetMessageType(nas.MsgTypeAuthenticationResponse) + authenticationResponse.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) + authenticationResponse.SetSpareHalfOctet(0) + authenticationResponse.SetMessageType(nas.MsgTypeAuthenticationResponse) if len(authenticationResponseParam) > 0 { authenticationResponse.AuthenticationResponseParameter = nasType.NewAuthenticationResponseParameter( @@ -589,10 +589,10 @@ func GetAuthenticationResponse(authenticationResponseParam []uint8, eapMsg strin } authenticationResponse.EAPMessage = nasType.NewEAPMessage(nasMessage.AuthenticationResponseEAPMessageType) authenticationResponse.EAPMessage.SetLen(uint16(len(rawEapMsg))) - authenticationResponse.EAPMessage.SetEAPMessage(rawEapMsg) + authenticationResponse.SetEAPMessage(rawEapMsg) } - m.GmmMessage.AuthenticationResponse = authenticationResponse + m.AuthenticationResponse = authenticationResponse data := new(bytes.Buffer) err := m.GmmMessageEncode(data) @@ -609,21 +609,21 @@ func GetAuthenticationFailure(cause5GMM uint8, authenticationFailureParam []uint m.GmmHeader.SetMessageType(nas.MsgTypeAuthenticationFailure) authenticationFailure := nasMessage.NewAuthenticationFailure(0) - authenticationFailure.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + authenticationFailure.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSMobilityManagementMessage) - authenticationFailure.SpareHalfOctetAndSecurityHeaderType.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) - authenticationFailure.SpareHalfOctetAndSecurityHeaderType.SetSpareHalfOctet(0) - authenticationFailure.AuthenticationFailureMessageIdentity.SetMessageType(nas.MsgTypeAuthenticationFailure) - authenticationFailure.Cause5GMM.SetCauseValue(cause5GMM) + authenticationFailure.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) + authenticationFailure.SetSpareHalfOctet(0) + authenticationFailure.SetMessageType(nas.MsgTypeAuthenticationFailure) + authenticationFailure.SetCauseValue(cause5GMM) if cause5GMM == nasMessage.Cause5GMMSynchFailure { authenticationFailure.AuthenticationFailureParameter = nasType.NewAuthenticationFailureParameter( nasMessage.AuthenticationFailureAuthenticationFailureParameterType) - authenticationFailure.AuthenticationFailureParameter.SetLen(uint8(len(authenticationFailureParam))) + authenticationFailure.SetLen(uint8(len(authenticationFailureParam))) copy(authenticationFailure.AuthenticationFailureParameter.Octet[:], authenticationFailureParam) } - m.GmmMessage.AuthenticationFailure = authenticationFailure + m.AuthenticationFailure = authenticationFailure data := new(bytes.Buffer) err := m.GmmMessageEncode(data) @@ -640,20 +640,20 @@ func GetRegistrationComplete(sorTransparentContainer []uint8) []byte { m.GmmHeader.SetMessageType(nas.MsgTypeRegistrationComplete) registrationComplete := nasMessage.NewRegistrationComplete(0) - registrationComplete.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + registrationComplete.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSMobilityManagementMessage) - registrationComplete.SpareHalfOctetAndSecurityHeaderType.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) - registrationComplete.SpareHalfOctetAndSecurityHeaderType.SetSpareHalfOctet(0) - registrationComplete.RegistrationCompleteMessageIdentity.SetMessageType(nas.MsgTypeRegistrationComplete) + registrationComplete.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) + registrationComplete.SetSpareHalfOctet(0) + registrationComplete.SetMessageType(nas.MsgTypeRegistrationComplete) if sorTransparentContainer != nil { registrationComplete.SORTransparentContainer = nasType.NewSORTransparentContainer( nasMessage.RegistrationCompleteSORTransparentContainerType) - registrationComplete.SORTransparentContainer.SetLen(uint16(len(sorTransparentContainer))) - registrationComplete.SORTransparentContainer.SetSORContent(sorTransparentContainer) + registrationComplete.SetLen(uint16(len(sorTransparentContainer))) + registrationComplete.SetSORContent(sorTransparentContainer) } - m.GmmMessage.RegistrationComplete = registrationComplete + m.RegistrationComplete = registrationComplete data := new(bytes.Buffer) err := m.GmmMessageEncode(data) @@ -671,12 +671,12 @@ func GetSecurityModeComplete(nasMessageContainer []uint8) []byte { m.GmmHeader.SetMessageType(nas.MsgTypeSecurityModeComplete) securityModeComplete := nasMessage.NewSecurityModeComplete(0) - securityModeComplete.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + securityModeComplete.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSMobilityManagementMessage) // TODO: modify security header type if need security protected - securityModeComplete.SpareHalfOctetAndSecurityHeaderType.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) - securityModeComplete.SpareHalfOctetAndSecurityHeaderType.SetSpareHalfOctet(0) - securityModeComplete.SecurityModeCompleteMessageIdentity.SetMessageType(nas.MsgTypeSecurityModeComplete) + securityModeComplete.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) + securityModeComplete.SetSpareHalfOctet(0) + securityModeComplete.SetMessageType(nas.MsgTypeSecurityModeComplete) securityModeComplete.IMEISV = nasType.NewIMEISV(nasMessage.SecurityModeCompleteIMEISVType) securityModeComplete.IMEISV.SetLen(9) @@ -690,10 +690,10 @@ func GetSecurityModeComplete(nasMessageContainer []uint8) []byte { securityModeComplete.NASMessageContainer = nasType.NewNASMessageContainer( nasMessage.SecurityModeCompleteNASMessageContainerType) securityModeComplete.NASMessageContainer.SetLen(uint16(len(nasMessageContainer))) - securityModeComplete.NASMessageContainer.SetNASMessageContainerContents(nasMessageContainer) + securityModeComplete.SetNASMessageContainerContents(nasMessageContainer) } - m.GmmMessage.SecurityModeComplete = securityModeComplete + m.SecurityModeComplete = securityModeComplete data := new(bytes.Buffer) err := m.GmmMessageEncode(data) @@ -710,15 +710,15 @@ func GetSecurityModeReject(cause5GMM uint8) []byte { m.GmmHeader.SetMessageType(nas.MsgTypeSecurityModeReject) securityModeReject := nasMessage.NewSecurityModeReject(0) - securityModeReject.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + securityModeReject.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSMobilityManagementMessage) - securityModeReject.SpareHalfOctetAndSecurityHeaderType.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) - securityModeReject.SpareHalfOctetAndSecurityHeaderType.SetSpareHalfOctet(0) - securityModeReject.SecurityModeRejectMessageIdentity.SetMessageType(nas.MsgTypeSecurityModeReject) + securityModeReject.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) + securityModeReject.SetSpareHalfOctet(0) + securityModeReject.SetMessageType(nas.MsgTypeSecurityModeReject) - securityModeReject.Cause5GMM.SetCauseValue(cause5GMM) + securityModeReject.SetCauseValue(cause5GMM) - m.GmmMessage.SecurityModeReject = securityModeReject + m.SecurityModeReject = securityModeReject data := new(bytes.Buffer) err := m.GmmMessageEncode(data) @@ -737,24 +737,24 @@ func GetDeregistrationRequest(accessType uint8, switchOff uint8, ngKsi uint8, m.GmmHeader.SetMessageType(nas.MsgTypeDeregistrationRequestUEOriginatingDeregistration) deregistrationRequest := nasMessage.NewDeregistrationRequestUEOriginatingDeregistration(0) - deregistrationRequest.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + deregistrationRequest.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSMobilityManagementMessage) - deregistrationRequest.SpareHalfOctetAndSecurityHeaderType.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) - deregistrationRequest.SpareHalfOctetAndSecurityHeaderType.SetSpareHalfOctet(0) - deregistrationRequest.DeregistrationRequestMessageIdentity.SetMessageType( + deregistrationRequest.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) + deregistrationRequest.SetSpareHalfOctet(0) + deregistrationRequest.SetMessageType( nas.MsgTypeDeregistrationRequestUEOriginatingDeregistration) - deregistrationRequest.NgksiAndDeregistrationType.SetAccessType(accessType) - deregistrationRequest.NgksiAndDeregistrationType.SetSwitchOff(switchOff) - deregistrationRequest.NgksiAndDeregistrationType.SetReRegistrationRequired(0) - deregistrationRequest.NgksiAndDeregistrationType.SetTSC(ngKsi) - deregistrationRequest.NgksiAndDeregistrationType.SetNasKeySetIdentifiler(ngKsi) - deregistrationRequest.MobileIdentity5GS.SetLen(mobileIdentity5GS.GetLen()) - deregistrationRequest.MobileIdentity5GS.SetMobileIdentity5GSContents( + deregistrationRequest.SetAccessType(accessType) + deregistrationRequest.SetSwitchOff(switchOff) + deregistrationRequest.SetReRegistrationRequired(0) + deregistrationRequest.SetTSC(ngKsi) + deregistrationRequest.SetNasKeySetIdentifiler(ngKsi) + deregistrationRequest.SetLen(mobileIdentity5GS.GetLen()) + deregistrationRequest.SetMobileIdentity5GSContents( mobileIdentity5GS.GetMobileIdentity5GSContents(), ) - m.GmmMessage.DeregistrationRequestUEOriginatingDeregistration = deregistrationRequest + m.DeregistrationRequestUEOriginatingDeregistration = deregistrationRequest data := new(bytes.Buffer) err := m.GmmMessageEncode(data) @@ -771,14 +771,14 @@ func GetDeregistrationAccept() []byte { m.GmmHeader.SetMessageType(nas.MsgTypeDeregistrationAcceptUETerminatedDeregistration) deregistrationAccept := nasMessage.NewDeregistrationAcceptUETerminatedDeregistration(0) - deregistrationAccept.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + deregistrationAccept.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSMobilityManagementMessage) - deregistrationAccept.SpareHalfOctetAndSecurityHeaderType.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) - deregistrationAccept.SpareHalfOctetAndSecurityHeaderType.SetSpareHalfOctet(0) - deregistrationAccept.DeregistrationAcceptMessageIdentity.SetMessageType( + deregistrationAccept.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) + deregistrationAccept.SetSpareHalfOctet(0) + deregistrationAccept.SetMessageType( nas.MsgTypeDeregistrationAcceptUETerminatedDeregistration) - m.GmmMessage.DeregistrationAcceptUETerminatedDeregistration = deregistrationAccept + m.DeregistrationAcceptUETerminatedDeregistration = deregistrationAccept data := new(bytes.Buffer) err := m.GmmMessageEncode(data) @@ -795,15 +795,15 @@ func GetStatus5GMM(cause uint8) []byte { m.GmmHeader.SetMessageType(nas.MsgTypeStatus5GMM) status5GMM := nasMessage.NewStatus5GMM(0) - status5GMM.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + status5GMM.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSMobilityManagementMessage, ) - status5GMM.SpareHalfOctetAndSecurityHeaderType.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) - status5GMM.SpareHalfOctetAndSecurityHeaderType.SetSpareHalfOctet(0) - status5GMM.STATUSMessageIdentity5GMM.SetMessageType(nas.MsgTypeStatus5GMM) - status5GMM.Cause5GMM.SetCauseValue(cause) + status5GMM.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) + status5GMM.SetSpareHalfOctet(0) + status5GMM.SetMessageType(nas.MsgTypeStatus5GMM) + status5GMM.SetCauseValue(cause) - m.GmmMessage.Status5GMM = status5GMM + m.Status5GMM = status5GMM data := new(bytes.Buffer) err := m.GmmMessageEncode(data) @@ -820,13 +820,13 @@ func GetStatus5GSM(pduSessionId uint8, cause uint8) []byte { m.GsmHeader.SetMessageType(nas.MsgTypeStatus5GSM) status5GSM := nasMessage.NewStatus5GSM(0) - status5GSM.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator(nasMessage.Epd5GSSessionManagementMessage) - status5GSM.STATUSMessageIdentity5GSM.SetMessageType(nas.MsgTypeStatus5GSM) - status5GSM.PDUSessionID.SetPDUSessionID(pduSessionId) - status5GSM.PTI.SetPTI(0x00) - status5GSM.Cause5GSM.SetCauseValue(cause) + status5GSM.SetExtendedProtocolDiscriminator(nasMessage.Epd5GSSessionManagementMessage) + status5GSM.SetMessageType(nas.MsgTypeStatus5GSM) + status5GSM.SetPDUSessionID(pduSessionId) + status5GSM.SetPTI(0x00) + status5GSM.SetCauseValue(cause) - m.GsmMessage.Status5GSM = status5GSM + m.Status5GSM = status5GSM data := new(bytes.Buffer) err := m.GsmMessageEncode(data) @@ -845,21 +845,21 @@ func GetUlNasTransport_Status5GSM(pduSessionId uint8, cause uint8) []byte { m.GmmHeader.SetMessageType(nas.MsgTypeULNASTransport) ulNasTransport := nasMessage.NewULNASTransport(0) - ulNasTransport.SpareHalfOctetAndSecurityHeaderType.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) + ulNasTransport.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) ulNasTransport.SetMessageType(nas.MsgTypeULNASTransport) - ulNasTransport.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + ulNasTransport.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSMobilityManagementMessage) ulNasTransport.PduSessionID2Value = new(nasType.PduSessionID2Value) ulNasTransport.PduSessionID2Value.SetIei(nasMessage.ULNASTransportPduSessionID2ValueType) - ulNasTransport.PduSessionID2Value.SetPduSessionID2Value(pduSessionId) + ulNasTransport.SetPduSessionID2Value(pduSessionId) - ulNasTransport.SpareHalfOctetAndPayloadContainerType.SetPayloadContainerType( + ulNasTransport.SetPayloadContainerType( nasMessage.PayloadContainerTypeN1SMInfo, ) ulNasTransport.PayloadContainer.SetLen(uint16(len(payload))) - ulNasTransport.PayloadContainer.SetPayloadContainerContents(payload) + ulNasTransport.SetPayloadContainerContents(payload) - m.GmmMessage.ULNASTransport = ulNasTransport + m.ULNASTransport = ulNasTransport data := new(bytes.Buffer) err := m.GmmMessageEncode(data) @@ -878,21 +878,21 @@ func GetUlNasTransport_PduSessionReleaseRequest(pduSessionId uint8) []byte { m.GmmHeader.SetMessageType(nas.MsgTypeULNASTransport) ulNasTransport := nasMessage.NewULNASTransport(0) - ulNasTransport.SpareHalfOctetAndSecurityHeaderType.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) + ulNasTransport.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) ulNasTransport.SetMessageType(nas.MsgTypeULNASTransport) - ulNasTransport.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + ulNasTransport.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSMobilityManagementMessage) ulNasTransport.PduSessionID2Value = new(nasType.PduSessionID2Value) ulNasTransport.PduSessionID2Value.SetIei(nasMessage.ULNASTransportPduSessionID2ValueType) - ulNasTransport.PduSessionID2Value.SetPduSessionID2Value(pduSessionId) + ulNasTransport.SetPduSessionID2Value(pduSessionId) - ulNasTransport.SpareHalfOctetAndPayloadContainerType.SetPayloadContainerType( + ulNasTransport.SetPayloadContainerType( nasMessage.PayloadContainerTypeN1SMInfo, ) ulNasTransport.PayloadContainer.SetLen(uint16(len(pduSessionReleaseRequest))) - ulNasTransport.PayloadContainer.SetPayloadContainerContents(pduSessionReleaseRequest) + ulNasTransport.SetPayloadContainerContents(pduSessionReleaseRequest) - m.GmmMessage.ULNASTransport = ulNasTransport + m.ULNASTransport = ulNasTransport data := new(bytes.Buffer) err := m.GmmMessageEncode(data) @@ -913,20 +913,20 @@ func GetUlNasTransport_PduSessionReleaseComplete(pduSessionId uint8, requestType m.GmmHeader.SetMessageType(nas.MsgTypeULNASTransport) ulNasTransport := nasMessage.NewULNASTransport(0) - ulNasTransport.SpareHalfOctetAndSecurityHeaderType.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) + ulNasTransport.SetSecurityHeaderType(nas.SecurityHeaderTypePlainNas) ulNasTransport.SetMessageType(nas.MsgTypeULNASTransport) - ulNasTransport.ExtendedProtocolDiscriminator.SetExtendedProtocolDiscriminator( + ulNasTransport.SetExtendedProtocolDiscriminator( nasMessage.Epd5GSMobilityManagementMessage) ulNasTransport.PduSessionID2Value = new(nasType.PduSessionID2Value) ulNasTransport.PduSessionID2Value.SetIei(nasMessage.ULNASTransportPduSessionID2ValueType) - ulNasTransport.PduSessionID2Value.SetPduSessionID2Value(pduSessionId) + ulNasTransport.SetPduSessionID2Value(pduSessionId) ulNasTransport.RequestType = new(nasType.RequestType) ulNasTransport.RequestType.SetIei(nasMessage.ULNASTransportRequestTypeType) - ulNasTransport.RequestType.SetRequestTypeValue(requestType) + ulNasTransport.SetRequestTypeValue(requestType) if dnnString != "" { ulNasTransport.DNN = new(nasType.DNN) ulNasTransport.DNN.SetIei(nasMessage.ULNASTransportDNNType) - ulNasTransport.DNN.SetDNN(dnnString) + ulNasTransport.SetDNN(dnnString) } ulNasTransport.SNSSAI = nasType.NewSNSSAI(nasMessage.ULNASTransportSNSSAIType) ulNasTransport.SNSSAI.SetLen(1) @@ -938,19 +938,19 @@ func GetUlNasTransport_PduSessionReleaseComplete(pduSessionId uint8, requestType logger.NasMsgLog.Warnf("sNssai SD decode error: %+v", err) } copy(sdTemp[:], sd) - ulNasTransport.SNSSAI.SetSD(sdTemp) + ulNasTransport.SetSD(sdTemp) ulNasTransport.SNSSAI.SetLen(4) } - ulNasTransport.SNSSAI.SetSST(uint8(sNssai.Sst)) + ulNasTransport.SetSST(uint8(sNssai.Sst)) } - ulNasTransport.SpareHalfOctetAndPayloadContainerType.SetPayloadContainerType( + ulNasTransport.SetPayloadContainerType( nasMessage.PayloadContainerTypeN1SMInfo, ) ulNasTransport.PayloadContainer.SetLen(uint16(len(pduSessionReleaseRequest))) - ulNasTransport.PayloadContainer.SetPayloadContainerContents(pduSessionReleaseRequest) + ulNasTransport.SetPayloadContainerContents(pduSessionReleaseRequest) - m.GmmMessage.ULNASTransport = ulNasTransport + m.ULNASTransport = ulNasTransport data := new(bytes.Buffer) err := m.GmmMessageEncode(data) diff --git a/internal/qos/qos.go b/internal/qos/qos.go index 6363b18..90d237e 100644 --- a/internal/qos/qos.go +++ b/internal/qos/qos.go @@ -16,7 +16,7 @@ type PDUQoSInfo struct { func Parse5GQoSInfoNotify(n *message.Notification) (info *PDUQoSInfo, err error) { info = new(PDUQoSInfo) - var offset int = 0 + var offset int data := n.NotificationData dataLen := int(data[0]) info.PduSessionID = data[1] diff --git a/internal/security/ranUe.go b/internal/security/ranUe.go index 14daab7..f6e63e1 100644 --- a/internal/security/ranUe.go +++ b/internal/security/ranUe.go @@ -263,11 +263,12 @@ func (ue *RanUeContext) Get5GMMCapability() (capability5GMM *nasType.Capability5 } func (ue *RanUeContext) GetBearerType() uint8 { - if ue.AnType == models.AccessType__3_GPP_ACCESS { + switch ue.AnType { + case models.AccessType__3_GPP_ACCESS: return security.Bearer3GPP - } else if ue.AnType == models.AccessType_NON_3_GPP_ACCESS { + case models.AccessType_NON_3_GPP_ACCESS: return security.BearerNon3GPP - } else { + default: return security.OnlyOneBearer } } diff --git a/internal/security/security.go b/internal/security/security.go index 7cd71af..34d151d 100644 --- a/internal/security/security.go +++ b/internal/security/security.go @@ -73,7 +73,7 @@ func NASEncode(ue *RanUeContext, msg *nas.Message, securityContextAvailable bool // Add mac value payload = append(mac32, payload[:]...) // Add EPD and Security Type - msgSecurityHeader := []byte{msg.SecurityHeader.ProtocolDiscriminator, msg.SecurityHeader.SecurityHeaderType} + msgSecurityHeader := []byte{msg.ProtocolDiscriminator, msg.SecurityHeaderType} payload = append(msgSecurityHeader, payload[:]...) // Increase UL Count @@ -91,7 +91,7 @@ func NASEnvelopeEncode(ue *RanUeContext, msg *nas.Message, securityContextAvaila return nil, err } if msg == nil { - err = fmt.Errorf("Nas Message is empty") + err = fmt.Errorf("NAS message is empty") return nil, err } @@ -137,7 +137,7 @@ func NASEnvelopeEncode(ue *RanUeContext, msg *nas.Message, securityContextAvaila // Add mac value payload = append(mac32, payload[:]...) // Add EPD and Security Type - msgSecurityHeader := []byte{msg.SecurityHeader.ProtocolDiscriminator, msg.SecurityHeader.SecurityHeaderType} + msgSecurityHeader := []byte{msg.ProtocolDiscriminator, msg.SecurityHeaderType} payload = append(msgSecurityHeader, payload[:]...) // Increase UL Count @@ -164,7 +164,7 @@ func NASDecode(ue *RanUeContext, securityHeaderType uint8, payload []byte) (msg err = msg.PlainNasDecode(&payload) return nil, err } else if ue.IntegrityAlg == security.AlgIntegrity128NIA0 { - fmt.Println("decode payload is ", payload) + fmt.Printf("decode payload is %x\n", payload) // remove header payload = payload[3:] if err = security.NASEncrypt(ue.CipheringAlg, ue.KnasEnc, ue.DLCount.Get(), ue.GetBearerType(), @@ -197,7 +197,7 @@ func NASDecode(ue *RanUeContext, securityHeaderType uint8, payload []byte) (msg ciphered = true ue.DLCount.Set(0, 0) default: - return nil, fmt.Errorf("Wrong security header type: 0x%0x", msg.SecurityHeader.SecurityHeaderType) + return nil, fmt.Errorf("wrong security header type: 0x%0x", msg.SecurityHeaderType) } // Caculate ul count if ue.DLCount.SQN() > sequenceNumber { diff --git a/internal/vrf/vrf.go b/internal/vrf/vrf.go index 441cd3f..0e8329b 100644 --- a/internal/vrf/vrf.go +++ b/internal/vrf/vrf.go @@ -19,7 +19,7 @@ func CreateOrGetVRF(vrfName string, tableID int) (netlink.Link, error) { } return nil, fmt.Errorf("VRF %s exists but Table ID mismatch (need %d, actual %d)", vrfName, tableID, vrf.Table) } - return nil, fmt.Errorf("Device %s exists but is not a VRF", vrfName) + return nil, fmt.Errorf("device %s exists but is not a VRF", vrfName) } // Create VRF (l3mdev) device diff --git a/pkg/factory/config.go b/pkg/factory/config.go index 8472b2f..ca10237 100644 --- a/pkg/factory/config.go +++ b/pkg/factory/config.go @@ -302,7 +302,7 @@ func appendInvalid(err error) error { es := err.(govalidator.Errors).Errors() for _, e := range es { - errs = append(errs, fmt.Errorf("Invalid %w", e)) + errs = append(errs, fmt.Errorf("invalid %w", e)) } return error(errs) diff --git a/pkg/factory/factory.go b/pkg/factory/factory.go index dcaccfc..ad3c060 100644 --- a/pkg/factory/factory.go +++ b/pkg/factory/factory.go @@ -69,7 +69,7 @@ func WriteConfigWithKey(key, value string) error { if ptr := findNodePtrWithKey(&root, key); ptr != nil { ptr.Value = value } else { - return errors.New("There's no value with the key") + return errors.New("there's no value with the key") } if data, err = yaml.Marshal(&root); err != nil { @@ -101,7 +101,7 @@ func checkConfigVersion() error { currentVersion := N3ueConfig.GetVersion() if currentVersion != N3ueExpectedConfigVersion { - return fmt.Errorf("config version is [%s], but expected is [%s].", + return fmt.Errorf("config version is [%s], but expected is [%s]", currentVersion, N3ueExpectedConfigVersion) } @@ -115,10 +115,10 @@ func SyncConfigSQN(offset uint8) error { sqn = sqn + int64(offset) logger.CfgLog.Infof("Write SQN=%12x into config file", sqn) if err = WriteConfigWithKey("SQN", fmt.Sprintf("%12x", sqn)); err != nil { - return fmt.Errorf("Write config file: %+v", err) + return fmt.Errorf("write config file: %+v", err) } } else { - return fmt.Errorf("Parse SQN fail: %+v", err) + return fmt.Errorf("parse SQN fail: %+v", err) } return nil diff --git a/pkg/ike/handler.go b/pkg/ike/handler.go index 6743c79..525f642 100755 --- a/pkg/ike/handler.go +++ b/pkg/ike/handler.go @@ -13,7 +13,6 @@ import ( "github.com/sirupsen/logrus" "golang.org/x/sys/unix" - "github.com/free5gc/ike/eap" ike_eap "github.com/free5gc/ike/eap" ike_message "github.com/free5gc/ike/message" ike_security "github.com/free5gc/ike/security" @@ -142,11 +141,9 @@ func (s *Server) handleIKESAINIT( ikeLog.Info("Get SA payload") case ike_message.TypeKE: remotePublicKeyExchangeValue := ikePayload.(*ike_message.KeyExchange).KeyExchangeData - var i int = 0 - for { - if remotePublicKeyExchangeValue[i] != 0 { - break - } + var i int + for remotePublicKeyExchangeValue[i] == 0 { + i++ } remotePublicKeyExchangeValue = remotePublicKeyExchangeValue[i:] remotePublicKeyExchangeValueBig := new(big.Int).SetBytes(remotePublicKeyExchangeValue) @@ -193,7 +190,7 @@ func (s *Server) handleIKESAINIT( } ConcatenatedNonce := append(ikeSecurityAssociation.NonceInitiator, ikeSecurityAssociation.NonceResponder...) - err = ikeSecurityAssociation.IKESAKey.GenerateKeyForIKESA(ConcatenatedNonce, + err = ikeSecurityAssociation.GenerateKeyForIKESA(ConcatenatedNonce, sharedKeyExchangeData, ikeSecurityAssociation.LocalSPI, ikeSecurityAssociation.RemoteSPI) if err != nil { ikeLog.Errorf("Generate key for IKE SA failed: %+v", err) @@ -375,8 +372,8 @@ func (s *Server) handleIKEAUTH( } // Calculate for RES* - if decodedNAS == nil || decodedNAS.GmmMessage == nil { - nasLog.Error("decodedNAS is nil") + if decodedNAS.GmmMessage == nil { + nasLog.Error("decodedNAS.GmmMessage is nil") return } @@ -388,7 +385,7 @@ func (s *Server) handleIKEAUTH( decodedNAS.GmmMessage.GetMessageType()) } - rand := decodedNAS.AuthenticationRequest.GetRANDValue() + rand := decodedNAS.GetRANDValue() snn := n3ueSelf.N3ueInfo.GetSNN() nasLog.Infof("SNN: %+v", snn) @@ -512,7 +509,7 @@ func (s *Server) handleIKEAUTH( ikeSecurityAssociation.State++ case EAP_NASSecurityComplete: - if eapReq.Code != eap.EapCodeSuccess { + if eapReq.Code != ike_eap.EapCodeSuccess { ikeLog.Error("Not Success") return } diff --git a/pkg/ike/security.go b/pkg/ike/security.go index c04ca92..b3474be 100644 --- a/pkg/ike/security.go +++ b/pkg/ike/security.go @@ -6,7 +6,6 @@ import ( "github.com/pkg/errors" - "github.com/free5gc/ike/message" ike_message "github.com/free5gc/ike/message" ike_security "github.com/free5gc/ike/security" "github.com/free5gc/n3iwue/internal/logger" @@ -85,7 +84,7 @@ func (s *Server) BuildEAP5GANParameters() []byte { ikeLog.Debugf("S-NSSAI: %+v", snssaiBytes) nssai = append(nssai, snssai...) } - anParameter[0] = message.ANParametersTypeRequestedNSSAI + anParameter[0] = ike_message.ANParametersTypeRequestedNSSAI anParameter[1] = byte(len(nssai)) anParameter = append(anParameter, nssai...) diff --git a/pkg/ike/send.go b/pkg/ike/send.go index 355e56b..aa5f7e0 100755 --- a/pkg/ike/send.go +++ b/pkg/ike/send.go @@ -9,7 +9,6 @@ import ( "github.com/free5gc/ike" ike_message "github.com/free5gc/ike/message" - "github.com/free5gc/ike/security" ike_security "github.com/free5gc/ike/security" "github.com/free5gc/ike/security/dh" "github.com/free5gc/n3iwue/internal/logger" @@ -234,7 +233,7 @@ func (s *Server) SendIkeMsgToN3iwf( ikeLog.Trace("Send IKE message to N3IWF") ikeLog.Trace("Encoding...") - var ikeSAKey *security.IKESAKey + var ikeSAKey *ike_security.IKESAKey if ikeSA != nil { ikeSAKey = ikeSA.IKESAKey } diff --git a/pkg/ike/xfrm/xfrm.go b/pkg/ike/xfrm/xfrm.go index ef723e5..21ef45c 100644 --- a/pkg/ike/xfrm/xfrm.go +++ b/pkg/ike/xfrm/xfrm.go @@ -103,7 +103,7 @@ func ApplyXFRMRule( // Commit xfrm state to netlink var err error if err = netlink.XfrmStateAdd(xfrmState); err != nil { - return fmt.Errorf("Set XFRM state rule failed: %+v", err) + return fmt.Errorf("set XFRM state rule failed: %+v", err) } childSecurityAssociation.XfrmStateList = append(childSecurityAssociation.XfrmStateList, *xfrmState) @@ -134,7 +134,7 @@ func ApplyXFRMRule( // Commit xfrm policy to netlink if err = netlink.XfrmPolicyAdd(xfrmPolicy); err != nil { - return fmt.Errorf("Set XFRM policy rule failed: %+v", err) + return fmt.Errorf("set XFRM policy rule failed: %+v", err) } childSecurityAssociation.XfrmPolicyList = append(childSecurityAssociation.XfrmPolicyList, *xfrmPolicy) @@ -166,7 +166,7 @@ func ApplyXFRMRule( // Commit xfrm state to netlink if err = netlink.XfrmStateAdd(xfrmState); err != nil { - return fmt.Errorf("Set XFRM state rule failed: %+v", err) + return fmt.Errorf("set XFRM state rule failed: %+v", err) } childSecurityAssociation.XfrmStateList = append(childSecurityAssociation.XfrmStateList, *xfrmState) @@ -183,7 +183,7 @@ func ApplyXFRMRule( // Commit xfrm policy to netlink if err = netlink.XfrmPolicyAdd(xfrmPolicy); err != nil { - return fmt.Errorf("Set XFRM policy rule failed: %+v", err) + return fmt.Errorf("set XFRM policy rule failed: %+v", err) } childSecurityAssociation.XfrmPolicyList = append(childSecurityAssociation.XfrmPolicyList, *xfrmPolicy) diff --git a/pkg/procedure/Procedure.go b/pkg/procedure/Procedure.go index 29fc017..49bd958 100755 --- a/pkg/procedure/Procedure.go +++ b/pkg/procedure/Procedure.go @@ -140,7 +140,7 @@ func (s *Server) TestConnectivity(addr string) error { args = append(args, addr) // Use ip vrf exec to ping - cmd := exec.Command("ip", args...) + cmd := exec.CommandContext(context.Background(), "ip", args...) // We can capture output to log it output, err := cmd.CombinedOutput() From fe5b641f90a634bb429d3cb95e92d26960cab8d5 Mon Sep 17 00:00:00 2001 From: Yuan Chun <137044272+roundspring2003@users.noreply.github.com> Date: Sun, 4 Jan 2026 15:27:13 +0800 Subject: [PATCH 3/4] fix: conflict merge --- pkg/procedure/Procedure.go | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/pkg/procedure/Procedure.go b/pkg/procedure/Procedure.go index 5d0a83e..db34b95 100755 --- a/pkg/procedure/Procedure.go +++ b/pkg/procedure/Procedure.go @@ -3,10 +3,11 @@ package procedure import ( "context" "fmt" - "os/exec" "runtime/debug" "sync" + "time" + "github.com/go-ping/ping" "github.com/sirupsen/logrus" "github.com/free5gc/n3iwue/internal/logger" @@ -126,21 +127,34 @@ func (s *Server) handleEvent(evt n3iwue_context.ProcedureEvt) { func (s *Server) TestConnectivity(addr string) error { n3ueSelf := s.Context() - // Calculate the VRF ID used for the last session - // Since PduSessionCount is incremented after session establishment, we subtract 1 - vrfID := n3ueSelf.PduSessionCount - 1 - vrfName := fmt.Sprintf("vrf-pdu-%d", vrfID) + // Ping remote + pinger, err := ping.NewPinger(addr) + if err != nil { + return err + } + + // Run with root + pinger.SetPrivileged(true) - AppLog.Infof("Ping %s using VRF %s", addr, vrfName) + pinger.OnRecv = func(pkt *ping.Packet) { + AppLog.Infof("%d bytes from %s: icmp_seq=%d time=%v\n", + pkt.Nbytes, pkt.IPAddr, pkt.Seq, pkt.Rtt) + } + pinger.OnFinish = func(stats *ping.Statistics) { + AppLog.Infof("\n--- %s ping statistics ---\n", stats.Addr) + AppLog.Infof("%d packets transmitted, %d packets received, %v%% packet loss\n", + stats.PacketsSent, stats.PacketsRecv, stats.PacketLoss) + AppLog.Infof("round-trip min/avg/max/stddev = %v/%v/%v/%v\n", + stats.MinRtt, stats.AvgRtt, stats.MaxRtt, stats.StdDevRtt) + } - args := []string{"vrf", "exec", vrfName, "ping", "-c", "5"} + pinger.Count = 5 + pinger.Timeout = 10 * time.Second if n3ueSelf.N3ueInfo.DnIPAddr != "" { - args = append(args, "-I", n3ueSelf.N3ueInfo.DnIPAddr) + pinger.Source = n3ueSelf.N3ueInfo.DnIPAddr } - args = append(args, addr) - // Use ip vrf exec to ping - cmd := exec.CommandContext(context.Background(), "ip", args...) + time.Sleep(3 * time.Second) if err := pinger.Run(); err != nil { return fmt.Errorf("running ping failed: %+v", err) @@ -153,7 +167,6 @@ func (s *Server) TestConnectivity(addr string) error { return fmt.Errorf("ping failed") } - AppLog.Infof("Ping output:\n%s", string(output)) return nil } From ddbcb1a6710bca61ded44223fc592ea47c046b53 Mon Sep 17 00:00:00 2001 From: Yuan Chun <137044272+roundspring2003@users.noreply.github.com> Date: Sun, 4 Jan 2026 15:31:18 +0800 Subject: [PATCH 4/4] fix: fix conflict --- pkg/procedure/Procedure.go | 50 ++++++++++++-------------------------- 1 file changed, 16 insertions(+), 34 deletions(-) diff --git a/pkg/procedure/Procedure.go b/pkg/procedure/Procedure.go index db34b95..49bd958 100755 --- a/pkg/procedure/Procedure.go +++ b/pkg/procedure/Procedure.go @@ -3,11 +3,10 @@ package procedure import ( "context" "fmt" + "os/exec" "runtime/debug" "sync" - "time" - "github.com/go-ping/ping" "github.com/sirupsen/logrus" "github.com/free5gc/n3iwue/internal/logger" @@ -127,46 +126,29 @@ func (s *Server) handleEvent(evt n3iwue_context.ProcedureEvt) { func (s *Server) TestConnectivity(addr string) error { n3ueSelf := s.Context() - // Ping remote - pinger, err := ping.NewPinger(addr) - if err != nil { - return err - } - - // Run with root - pinger.SetPrivileged(true) + // Calculate the VRF ID used for the last session + // Since PduSessionCount is incremented after session establishment, we subtract 1 + vrfID := n3ueSelf.PduSessionCount - 1 + vrfName := fmt.Sprintf("vrf-pdu-%d", vrfID) - pinger.OnRecv = func(pkt *ping.Packet) { - AppLog.Infof("%d bytes from %s: icmp_seq=%d time=%v\n", - pkt.Nbytes, pkt.IPAddr, pkt.Seq, pkt.Rtt) - } - pinger.OnFinish = func(stats *ping.Statistics) { - AppLog.Infof("\n--- %s ping statistics ---\n", stats.Addr) - AppLog.Infof("%d packets transmitted, %d packets received, %v%% packet loss\n", - stats.PacketsSent, stats.PacketsRecv, stats.PacketLoss) - AppLog.Infof("round-trip min/avg/max/stddev = %v/%v/%v/%v\n", - stats.MinRtt, stats.AvgRtt, stats.MaxRtt, stats.StdDevRtt) - } + AppLog.Infof("Ping %s using VRF %s", addr, vrfName) - pinger.Count = 5 - pinger.Timeout = 10 * time.Second + args := []string{"vrf", "exec", vrfName, "ping", "-c", "5"} if n3ueSelf.N3ueInfo.DnIPAddr != "" { - pinger.Source = n3ueSelf.N3ueInfo.DnIPAddr + args = append(args, "-I", n3ueSelf.N3ueInfo.DnIPAddr) } + args = append(args, addr) - time.Sleep(3 * time.Second) + // Use ip vrf exec to ping + cmd := exec.CommandContext(context.Background(), "ip", args...) - if err := pinger.Run(); err != nil { - return fmt.Errorf("running ping failed: %+v", err) - } - - time.Sleep(1 * time.Second) - - stats := pinger.Statistics() - if stats.PacketsSent != stats.PacketsRecv { - return fmt.Errorf("ping failed") + // We can capture output to log it + output, err := cmd.CombinedOutput() + if err != nil { + return fmt.Errorf("ping failed: %v, output: %s", err, string(output)) } + AppLog.Infof("Ping output:\n%s", string(output)) return nil }