Skip to content
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
276 changes: 268 additions & 8 deletions internal/sbi/api_uecontextmanagement.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@ package sbi

import (
"net/http"
"strconv"

"github.com/gin-gonic/gin"

"github.com/free5gc/openapi"
"github.com/free5gc/openapi/models"
Nudr_DataRepository "github.com/free5gc/openapi/udr/DataRepository"
"github.com/free5gc/udm/internal/logger"
"github.com/free5gc/udm/internal/util"
"github.com/free5gc/util/metrics/sbi"
)

Expand Down Expand Up @@ -245,6 +247,21 @@ func (s *Server) HandleGetAmfNon3gppAccess(c *gin.Context) {
logger.UecmLog.Infoln("Handle GetAmfNon3gppAccessRequest")

ueId := c.Param("ueId")
// TS 29.503 5.3.2.5.3
// Validate SUPI and GPSI format the UE ID (SUPI or GPSI) shall be in the format defined in 3GPP TS 23.003 & 29.571
valid := util.IsValidSupi(ueId) || util.IsValidGpsi(ueId)
if !valid {
problemDetail := models.ProblemDetails{
Title: "Invalid ueID format",
Status: http.StatusBadRequest,
Detail: "The ueID format is invalid",
Cause: "INVALID_KEY",
}
logger.UecmLog.Warnf("Registration Reject: Invalid ueID format [%s]", ueId)
c.Set(sbi.IN_PB_DETAILS_CTX_STR, http.StatusText(int(problemDetail.Status)))
c.JSON(int(problemDetail.Status), problemDetail)
return
}
supportedFeatures := c.Query("supported-features")
var queryAmfContextNon3gppRequest Nudr_DataRepository.QueryAmfContextNon3gppRequest
queryAmfContextNon3gppRequest.SupportedFeatures = &supportedFeatures
Expand All @@ -256,6 +273,23 @@ func (s *Server) HandleGetAmfNon3gppAccess(c *gin.Context) {
func (s *Server) HandleRegistrationAmfNon3gppAccess(c *gin.Context) {
var amfNon3GppAccessRegistration models.AmfNon3GppAccessRegistration

ueID := c.Param("ueId")
// TS 29.503 5.3.2.2.3
// Validate SUPI format the UE ID (SUPI) shall be in the format defined in 3GPP TS 23.003 & 29.571
valid := util.IsValidSupi(ueID)
if !valid {
problemDetail := models.ProblemDetails{
Title: "Invalid ueID format",
Status: http.StatusBadRequest,
Detail: "The ueID format is invalid",
Cause: "INVALID_KEY",
}
logger.UecmLog.Warnf("Registration Reject: Invalid ueID format [%s]", ueID)
c.Set(sbi.IN_PB_DETAILS_CTX_STR, http.StatusText(int(problemDetail.Status)))
c.JSON(int(problemDetail.Status), problemDetail)
return
}

requestBody, err := c.GetRawData()
if err != nil {
problemDetail := models.ProblemDetails{
Expand Down Expand Up @@ -284,16 +318,57 @@ func (s *Server) HandleRegistrationAmfNon3gppAccess(c *gin.Context) {
return
}

logger.UecmLog.Infof("Handle RegisterAmfNon3gppAccessRequest")
// TS 29.503 6.2.6.2.3 requirements check
missingIE := ""
if amfNon3GppAccessRegistration.AmfInstanceId == "" {
missingIE = "AmfInstanceId"
} else if amfNon3GppAccessRegistration.Guami == nil {
missingIE = "Guami"
} else if amfNon3GppAccessRegistration.DeregCallbackUri == "" {
missingIE = "DeregCallbackUri"
} else if amfNon3GppAccessRegistration.RatType == "" {
missingIE = "RatType"
}

ueID := c.Param("ueId")
if missingIE != "" {
problemDetail := models.ProblemDetails{
Title: "Missing or invalid parameter",
Status: http.StatusBadRequest,
Detail: "Mandatory IE " + missingIE + " is missing or invalid",
Cause: "MISSING_OR_INVALID_PARAMETER",
}
logger.UecmLog.Warnln("Mandatory IE " + missingIE + " is missing or invalid")
c.Set(sbi.IN_PB_DETAILS_CTX_STR, http.StatusText(int(problemDetail.Status)))
c.JSON(int(problemDetail.Status), problemDetail)
return
}

logger.UecmLog.Infof("Handle RegisterAmfNon3gppAccessRequest")

s.Processor().RegisterAmfNon3gppAccessProcedure(c, amfNon3GppAccessRegistration, ueID)
}

// RegistrationAmf3gppAccess - register as AMF for 3GPP access
func (s *Server) HandleRegistrationAmf3gppAccess(c *gin.Context) {
var amf3GppAccessRegistration models.Amf3GppAccessRegistration

ueID := c.Param("ueId")
// TS 29.503 5.3.2.2.2
// Validate SUPI format the UE ID (SUPI) shall be in the format defined in 3GPP TS 23.003 & 29.571
valid := util.IsValidSupi(ueID)
if !valid {
problemDetail := models.ProblemDetails{
Title: "Invalid ueID format",
Status: http.StatusBadRequest,
Detail: "The ueID format is invalid",
Cause: "INVALID_KEY",
}
logger.UecmLog.Warnf("Registration Reject: Invalid ueID format [%s]", ueID)
c.Set(sbi.IN_PB_DETAILS_CTX_STR, http.StatusText(int(problemDetail.Status)))
c.JSON(int(problemDetail.Status), problemDetail)
return
}

requestBody, err := c.GetRawData()
if err != nil {
problemDetail := models.ProblemDetails{
Expand Down Expand Up @@ -321,10 +396,33 @@ func (s *Server) HandleRegistrationAmf3gppAccess(c *gin.Context) {
c.JSON(int(rsp.Status), rsp)
return
}
// TS 29.503 6.2.6.2.2 requirements check
missingIE := ""
if amf3GppAccessRegistration.AmfInstanceId == "" {
missingIE = "AmfInstanceId"
} else if amf3GppAccessRegistration.Guami == nil {
missingIE = "Guami"
} else if amf3GppAccessRegistration.DeregCallbackUri == "" {
missingIE = "DeregCallbackUri"
} else if amf3GppAccessRegistration.RatType == "" {
missingIE = "RatType"
}

if missingIE != "" {
problemDetail := models.ProblemDetails{
Title: "Missing or invalid parameter",
Status: http.StatusBadRequest,
Detail: "Mandatory IE " + missingIE + " is missing or invalid",
Cause: "MISSING_OR_INVALID_PARAMETER",
}
logger.UecmLog.Warnln("Mandatory IE " + missingIE + " is missing or invalid")
c.Set(sbi.IN_PB_DETAILS_CTX_STR, http.StatusText(int(problemDetail.Status)))
c.JSON(int(problemDetail.Status), problemDetail)
return
}

logger.UecmLog.Infof("Handle RegistrationAmf3gppAccess")

ueID := c.Param("ueId")
logger.UecmLog.Info("UEID: ", ueID)

s.Processor().RegistrationAmf3gppAccessProcedure(c, amf3GppAccessRegistration, ueID)
Expand All @@ -333,6 +431,24 @@ func (s *Server) HandleRegistrationAmf3gppAccess(c *gin.Context) {
// UpdateAmfNon3gppAccess - update a parameter in the AMF registration for non-3GPP access
func (s *Server) HandleUpdateAmfNon3gppAccess(c *gin.Context) {
var amfNon3GppAccessRegistrationModification models.AmfNon3GppAccessRegistrationModification

ueID := c.Param("ueId")
// TS 29.503 5.3.2.6.3
// Validate SUPI format the UE ID (SUPI) shall be in the format defined in 3GPP TS 23.003 & 29.571
valid := util.IsValidSupi(ueID)
if !valid {
problemDetail := models.ProblemDetails{
Title: "Invalid ueID format",
Status: http.StatusBadRequest,
Detail: "The ueID format is invalid",
Cause: "INVALID_KEY",
}
logger.UecmLog.Warnf("Registration Reject: Invalid ueID format [%s]", ueID)
c.Set(sbi.IN_PB_DETAILS_CTX_STR, http.StatusText(int(problemDetail.Status)))
c.JSON(int(problemDetail.Status), problemDetail)
return
}

requestBody, err := c.GetRawData()
if err != nil {
problemDetail := models.ProblemDetails{
Expand Down Expand Up @@ -361,9 +477,26 @@ func (s *Server) HandleUpdateAmfNon3gppAccess(c *gin.Context) {
return
}

logger.UecmLog.Infof("Handle UpdateAmfNon3gppAccessRequest")
// TS 29.503 6.2.6.2.8 requirements check
missingIE := ""
if amfNon3GppAccessRegistrationModification.Guami == nil {
missingIE = "Guami"
}

ueID := c.Param("ueId")
if missingIE != "" {
problemDetail := models.ProblemDetails{
Title: "Missing or invalid parameter",
Status: http.StatusBadRequest,
Detail: "Mandatory IE " + missingIE + " is missing or invalid",
Cause: "MISSING_OR_INVALID_PARAMETER",
}
logger.UecmLog.Warnln("Mandatory IE " + missingIE + " is missing or invalid")
c.Set(sbi.IN_PB_DETAILS_CTX_STR, http.StatusText(int(problemDetail.Status)))
c.JSON(int(problemDetail.Status), problemDetail)
return
}

logger.UecmLog.Infof("Handle UpdateAmfNon3gppAccessRequest")

s.Processor().UpdateAmfNon3gppAccessProcedure(c, amfNon3GppAccessRegistrationModification, ueID)
}
Expand All @@ -372,6 +505,23 @@ func (s *Server) HandleUpdateAmfNon3gppAccess(c *gin.Context) {
func (s *Server) HandleUpdateAmf3gppAccess(c *gin.Context) {
var amf3GppAccessRegistrationModification models.Amf3GppAccessRegistrationModification

ueID := c.Param("ueId")
// TS 29.503 5.3.2.6.2
// Validate SUPI format the UE ID (SUPI) shall be in the format defined in 3GPP TS 23.003 & 29.571
valid := util.IsValidSupi(ueID)
if !valid {
problemDetail := models.ProblemDetails{
Title: "Invalid ueID format",
Status: http.StatusBadRequest,
Detail: "The ueID format is invalid",
Cause: "INVALID_KEY",
}
logger.UecmLog.Warnf("Registration Reject: Invalid ueID format [%s]", ueID)
c.Set(sbi.IN_PB_DETAILS_CTX_STR, http.StatusText(int(problemDetail.Status)))
c.JSON(int(problemDetail.Status), problemDetail)
return
}

requestBody, err := c.GetRawData()
if err != nil {
problemDetail := models.ProblemDetails{
Expand Down Expand Up @@ -400,9 +550,26 @@ func (s *Server) HandleUpdateAmf3gppAccess(c *gin.Context) {
return
}

logger.UecmLog.Infof("Handle UpdateAmf3gppAccessRequest")
// TS 29.503 6.2.6.2.7 requirements check
missingIE := ""
if amf3GppAccessRegistrationModification.Guami == nil {
missingIE = "Guami"
}

ueID := c.Param("ueId")
if missingIE != "" {
problemDetail := models.ProblemDetails{
Title: "Missing or invalid parameter",
Status: http.StatusBadRequest,
Detail: "Mandatory IE " + missingIE + " is missing or invalid",
Cause: "MISSING_OR_INVALID_PARAMETER",
}
logger.UecmLog.Warnln("Mandatory IE " + missingIE + " is missing or invalid")
c.Set(sbi.IN_PB_DETAILS_CTX_STR, http.StatusText(int(problemDetail.Status)))
c.JSON(int(problemDetail.Status), problemDetail)
return
}

logger.UecmLog.Infof("Handle UpdateAmf3gppAccessRequest")

s.Processor().UpdateAmf3gppAccessProcedure(c, amf3GppAccessRegistrationModification, ueID)
}
Expand Down Expand Up @@ -442,7 +609,36 @@ func (s *Server) HandleDeregistrationSmfRegistrations(c *gin.Context) {
logger.UecmLog.Infof("Handle DeregistrationSmfRegistrations")

ueID := c.Params.ByName("ueId")
// TS 29.503 5.3.2.4.4
// Validate SUPI format the UE ID (SUPI) shall be in the format defined in 3GPP TS 23.003 & 29.571
valid := util.IsValidSupi(ueID)
if !valid {
problemDetail := models.ProblemDetails{
Title: "Invalid ueID format",
Status: http.StatusBadRequest,
Detail: "The ueID format is invalid",
Cause: "INVALID_KEY",
}
logger.UecmLog.Warnf("Registration Reject: Invalid ueID format [%s]", ueID)
c.Set(sbi.IN_PB_DETAILS_CTX_STR, http.StatusText(int(problemDetail.Status)))
c.JSON(int(problemDetail.Status), problemDetail)
return
}
pduSessionID := c.Params.ByName("pduSessionId")
// TS 29.571 5.4.2 valid PDU Session ID is an integer in the range 0 to 255
pduSessionIDInt, err := strconv.Atoi(pduSessionID)
if pduSessionIDInt < 0 || pduSessionIDInt > 255 || err != nil {
problemDetail := models.ProblemDetails{
Title: "Missing or invalid parameter",
Status: http.StatusBadRequest,
Detail: "Mandatory IE PduSessionId is missing or invalid",
Cause: "MISSING_OR_INVALID_PARAMETER",
}
logger.UecmLog.Warnln("Mandatory IE PduSessionId is missing or invalid")
c.Set(sbi.IN_PB_DETAILS_CTX_STR, http.StatusText(int(problemDetail.Status)))
c.JSON(int(problemDetail.Status), problemDetail)
return
}

s.Processor().DeregistrationSmfRegistrationsProcedure(c, ueID, pduSessionID)
}
Expand All @@ -451,6 +647,23 @@ func (s *Server) HandleDeregistrationSmfRegistrations(c *gin.Context) {
func (s *Server) HandleRegistrationSmfRegistrations(c *gin.Context) {
var smfRegistration models.SmfRegistration

ueID := c.Params.ByName("ueId")
// TS 29.503 5.3.2.2.4
// Validate SUPI format the UE ID (SUPI) shall be in the format defined in 3GPP TS 23.003 & 29.571
valid := util.IsValidSupi(ueID)
if !valid {
problemDetail := models.ProblemDetails{
Title: "Invalid ueID format",
Status: http.StatusBadRequest,
Detail: "The ueID format is invalid",
Cause: "INVALID_KEY",
}
logger.UecmLog.Warnf("Registration Reject: Invalid ueID format [%s]", ueID)
c.Set(sbi.IN_PB_DETAILS_CTX_STR, http.StatusText(int(problemDetail.Status)))
c.JSON(int(problemDetail.Status), problemDetail)
return
}

requestBody, err := c.GetRawData()
if err != nil {
problemDetail := models.ProblemDetails{
Expand Down Expand Up @@ -479,10 +692,42 @@ func (s *Server) HandleRegistrationSmfRegistrations(c *gin.Context) {
return
}

// TS 29.503 6.2.6.2.4 requirements check
missingIE := ""
if smfRegistration.SmfInstanceId == "" {
missingIE = "SmfInstanceId"
}

if missingIE != "" {
problemDetail := models.ProblemDetails{
Title: "Missing or invalid parameter",
Status: http.StatusBadRequest,
Detail: "Mandatory IE " + missingIE + " is missing or invalid",
Cause: "MISSING_OR_INVALID_PARAMETER",
}
logger.UecmLog.Warnln("Mandatory IE " + missingIE + " is missing or invalid")
c.Set(sbi.IN_PB_DETAILS_CTX_STR, http.StatusText(int(problemDetail.Status)))
c.JSON(int(problemDetail.Status), problemDetail)
return
}

logger.UecmLog.Infof("Handle RegistrationSmfRegistrations")

ueID := c.Params.ByName("ueId")
pduSessionID := c.Params.ByName("pduSessionId")
// TS 29.571 5.4.2 valid PDU Session ID is an integer in the range 0 to 255
pduSessionIDInt, err := strconv.Atoi(pduSessionID)
if pduSessionIDInt < 0 || pduSessionIDInt > 255 || err != nil {
problemDetail := models.ProblemDetails{
Title: "Missing or invalid parameter",
Status: http.StatusBadRequest,
Detail: "Mandatory IE PduSessionId is missing or invalid",
Cause: "MISSING_OR_INVALID_PARAMETER",
}
logger.UecmLog.Warnln("Mandatory IE PduSessionId is missing or invalid")
c.Set(sbi.IN_PB_DETAILS_CTX_STR, http.StatusText(int(problemDetail.Status)))
c.JSON(int(problemDetail.Status), problemDetail)
return
}

s.Processor().RegistrationSmfRegistrationsProcedure(
c,
Expand All @@ -497,6 +742,21 @@ func (s *Server) HandleGetAmf3gppAccess(c *gin.Context) {
logger.UecmLog.Infof("Handle HandleGetAmf3gppAccessRequest")

ueID := c.Param("ueId")
// TS 29.503 5.3.2.5.2
// Validate SUPI and GPSI format the UE ID (SUPI or GPSI) shall be in the format defined in 3GPP TS 23.003 & 29.571
valid := util.IsValidSupi(ueID) || util.IsValidGpsi(ueID)
if !valid {
problemDetail := models.ProblemDetails{
Title: "Invalid ueID format",
Status: http.StatusBadRequest,
Detail: "The ueID format is invalid",
Cause: "INVALID_KEY",
}
logger.UecmLog.Warnf("Registration Reject: Invalid ueID format [%s]", ueID)
c.Set(sbi.IN_PB_DETAILS_CTX_STR, http.StatusText(int(problemDetail.Status)))
c.JSON(int(problemDetail.Status), problemDetail)
return
}
supportedFeatures := c.Query("supported-features")

s.Processor().GetAmf3gppAccessProcedure(c, ueID, supportedFeatures)
Expand Down
Loading
Loading