Skip to content

Commit

Permalink
SDCORE-842: Adding Support for UE Requested PDU Session Release Proce…
Browse files Browse the repository at this point in the history
…dure (#43)

1) Generating and processing NGAP/NAS message for the procedure
2) Terminating PDU Session Contexts in Real UE and gNodeB component
  • Loading branch information
Vini Gajjar committed Mar 21, 2022
1 parent 832a5a6 commit 29f4108
Show file tree
Hide file tree
Showing 18 changed files with 434 additions and 130 deletions.
140 changes: 72 additions & 68 deletions common/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ const (
// For setting up channels between UE and GNB to exchange user data
DATA_BEARER_SETUP_REQUEST_EVENT
DATA_BEARER_SETUP_RESPONSE_EVENT
DATA_BEARER_RELEASE_REQUEST_EVENT

// gNB acknowledges simue for releasing UE context using this event
CTX_RELEASE_ACKNOWLEDGEMENT_EVENT
Expand Down Expand Up @@ -141,6 +142,7 @@ const (
DOWNLINK_NAS_TRANSPORT_EVENT EventType = N2_EVENT + 1 + iota
INITIAL_CTX_SETUP_REQUEST_EVENT
PDU_SESS_RESOURCE_SETUP_REQUEST_EVENT
PDU_SESS_RESOURCE_RELEASE_COMMAND_EVENT
UE_CTX_RELEASE_COMMAND_EVENT
)

Expand All @@ -150,79 +152,81 @@ const (
)

var evtStrMap map[EventType]string = map[EventType]string{
INIT_EVENT: "INIT-EVENT",
QUIT_EVENT: "QUIT-EVENT",
ERROR_EVENT: "ERROR-EVENT",
PROFILE_START_EVENT: "PROFILE-START-EVENT",
PROFILE_PASS_EVENT: "PROFILE-PASS-EVENT",
PROFILE_FAIL_EVENT: "PROFILE-FAIL-EVENT",
DATA_PKT_GEN_REQUEST_EVENT: "DATA-PACKET-GENERATION-REQUEST-EVENT",
DATA_PKT_GEN_SUCCESS_EVENT: "DATA-PACKET-SUCCESS-EVENT",
DATA_PKT_GEN_FAILURE_EVENT: "DATA-PACKET-FAILURE-EVENT",
CONNECTION_REQUEST_EVENT: "CONNECTION-REQUEST-EVENT",
CONNECTION_RELEASE_REQUEST_EVENT: "CONNECTION-RELEASE-REQUEST-EVENT",
UL_INFO_TRANSFER_EVENT: "UL-INFO-TRANSFER-EVENT",
DL_INFO_TRANSFER_EVENT: "DL-INFO-TRANSFER-EVENT",
UL_UE_DATA_TRANSFER_EVENT: "UL-UE-DATA-TRANSFER-EVENT",
DL_UE_DATA_TRANSFER_EVENT: "DL-UE-DATA-TRANSFER-EVENT",
LAST_DATA_PKT_EVENT: "LAST-DATA-PACKET-EVENT",
DATA_BEARER_SETUP_REQUEST_EVENT: "DATA-BEARER-SETUP-REQUEST-EVENT",
DATA_BEARER_SETUP_RESPONSE_EVENT: "DATA-BEARER-SETUP-RESPONSE-EVENT",
CTX_RELEASE_ACKNOWLEDGEMENT_EVENT: "CONTEXT-RELEASE-ACKNOWLEDGEMENT-EVENT",
TRIGGER_AN_RELEASE_EVENT: "TRIGGER-AN-RELEASE-EVENT",
REG_REQUEST_EVENT: "REGESTRATION-REQUEST-EVENT",
REG_ACCEPT_EVENT: "REGESTRATION-ACCEPT-EVENT",
REG_COMPLETE_EVENT: "REGESTRATION-COMPLETE-EVENT",
REG_REJECT_EVENT: "REGESTRATION-REJECT-EVENT",
DEREG_REQUEST_UE_ORIG_EVENT: "DEREGISTRATION-REQUEST-UE-ORIG-EVENT",
DEREG_ACCEPT_UE_ORIG_EVENT: "DEREGISTRATION-ACCEPT-UE-ORIG-EVENT",
DEREG_REQUEST_UE_TERM_EVENT: "DEREGISTRATION-REQUEST-UE-TERM-EVENT",
DEREG_ACCEPT_UE_TERM_EVENT: "DEREGISTRATION-ACCEPT-UE-TERM-EVENT",
SERVICE_REQUEST_EVENT: "SERVICE-REQUEST-EVENT",
SERVICE_REJECT_EVENT: "SERVICE-REJECT-EVENT",
SERVICE_ACCEPT_EVENT: "SERVICE-ACCEPT-EVENT",
AUTH_REQUEST_EVENT: "AUTHENTICATION-REQUEST-EVENT",
AUTH_RESPONSE_EVENT: "AUTHENTICATION-RESPONSE-EVENT",
AUTH_REJECT_EVENT: "AUTHENTICATION-REJECT-EVENT",
AUTH_FAILURE_EVENT: "AUTHENTICATION-FAILURE-EVENT",
AUTH_RESULT_EVENT: "AUTHENTICATION-RESULT-EVENT",
ID_REQUEST_EVENT: "ID-REQUEST-EVENT",
ID_RESPONSE_EVENT: "ID-RESPONSE-EVENT",
SEC_MOD_COMMAND_EVENT: "SECURITY-MODE-COMMAND-EVENT",
SEC_MOD_COMPLETE_EVENT: "SECURITY-MODE-COMPLETE-EVENT",
SEC_MOD_REJECT_EVENT: "SECURITY-MODE-REJECT-EVENT",
FIVE_GMM_STATUS_EVENT: "FIVE-GMM-STATUS-EVENT",
NOTIFICATION_EVENT: "NOTIFICATION-EVENT",
NOTIFICATION_RESPONSE_EVENT: "NOTIFICATION-RESPONSE-EVENT",
UL_NAS_TRANSPORT_EVENT: "UL-NAS-TRANSPORT-EVENT",
DL_NAS_TRANSPORT_EVENT: "DL-NAS-TRANSPORT-EVENT",
PDU_SESS_EST_REQUEST_EVENT: "PDU-SESSION-ESTABLISHMENT-REQUEST-EVENT",
PDU_SESS_EST_ACCEPT_EVENT: "PDU-SESSION-ESTABLISHMENT-ACCEPT-EVENT",
PDU_SESS_EST_REJECT_EVENT: "PDU-SESSION-ESTABLISHMENT-REJECT-EVENT",
PDU_SESS_AUTH_COMMAND_EVENT: "PDU-SESSION-AUTHENTICATION-COMMAND-EVENT",
PDU_SESS_AUTH_COMPLETE_EVENT: "PDU-SESSION-AUTHENTICATION-COMPLETE-EVENT",
PDU_SESS_AUTH_RESULT_EVENT: "PDU-SESSION-AUTHENTICATION-RESULT-EVENT",
PDU_SESS_MOD_REQUEST_EVENT: "PDU-SESSION-MODIFICATION-REQUEST-EVENT",
PDU_SESS_MOD_REJECT_EVENT: "PDU-SESSION-MODIFICATION-REJECT-EVENT",
PDU_SESS_MOD_COMMAND_EVENT: "PDU-SESSION-MODIFICATION-COMMAND-EVENT",
PDU_SESS_MOD_COMPLETE_EVENT: "PDU-SESSION-MODIFICATION-COMPLETE-EVENT",
PDU_SESS_MOD_CMD_REJECT_EVENT: "PDU-SESSION-MODIFICATION-COMMAND-REJECT-EVENT",
PDU_SESS_REL_REQUEST_EVENT: "PDU-SESSION-RELEASE-REQUEST-EVENT",
PDU_SESS_REL_REJECT_EVENT: "PDU-SESSION-RELEASE-REJECT-EVENT",
PDU_SESS_REL_COMMAND_EVENT: "PDU-SESSION-RELEASE-COMMAND-EVENT",
PDU_SESS_REL_COMPLETE_EVENT: "PDU-SESSION-RELEASE-COMPLETE-EVENT",
FIVEGSM_STATUS_EVENT: "FIVEGSM-STATUS-EVENT",
DOWNLINK_NAS_TRANSPORT_EVENT: "DOWNLINK-NAS-TRANSPORT-EVENT",
INITIAL_CTX_SETUP_REQUEST_EVENT: "INITIAL-CONTEXT-SETUP-REQUEST-EVENT",
PDU_SESS_RESOURCE_SETUP_REQUEST_EVENT: "PDU-SESSION-RESOURCE-SETUP-REQUEST-EVENT",
UE_CTX_RELEASE_COMMAND_EVENT: "UE-CONTEXT-RELEASE-COMMAND-EVENT",
DL_UE_DATA_TRANSPORT_EVENT: "DL-UE-DATA-TRANSPORT-EVENT",
INIT_EVENT: "INIT-EVENT",
QUIT_EVENT: "QUIT-EVENT",
ERROR_EVENT: "ERROR-EVENT",
PROFILE_START_EVENT: "PROFILE-START-EVENT",
PROFILE_PASS_EVENT: "PROFILE-PASS-EVENT",
PROFILE_FAIL_EVENT: "PROFILE-FAIL-EVENT",
DATA_PKT_GEN_REQUEST_EVENT: "DATA-PACKET-GENERATION-REQUEST-EVENT",
DATA_PKT_GEN_SUCCESS_EVENT: "DATA-PACKET-SUCCESS-EVENT",
DATA_PKT_GEN_FAILURE_EVENT: "DATA-PACKET-FAILURE-EVENT",
CONNECTION_REQUEST_EVENT: "CONNECTION-REQUEST-EVENT",
CONNECTION_RELEASE_REQUEST_EVENT: "CONNECTION-RELEASE-REQUEST-EVENT",
UL_INFO_TRANSFER_EVENT: "UL-INFO-TRANSFER-EVENT",
DL_INFO_TRANSFER_EVENT: "DL-INFO-TRANSFER-EVENT",
UL_UE_DATA_TRANSFER_EVENT: "UL-UE-DATA-TRANSFER-EVENT",
DL_UE_DATA_TRANSFER_EVENT: "DL-UE-DATA-TRANSFER-EVENT",
LAST_DATA_PKT_EVENT: "LAST-DATA-PACKET-EVENT",
DATA_BEARER_SETUP_REQUEST_EVENT: "DATA-BEARER-SETUP-REQUEST-EVENT",
DATA_BEARER_SETUP_RESPONSE_EVENT: "DATA-BEARER-SETUP-RESPONSE-EVENT",
DATA_BEARER_RELEASE_REQUEST_EVENT: "DATA-BEARER-RELEASE-REQUEST-EVENT",
CTX_RELEASE_ACKNOWLEDGEMENT_EVENT: "CONTEXT-RELEASE-ACKNOWLEDGEMENT-EVENT",
TRIGGER_AN_RELEASE_EVENT: "TRIGGER-AN-RELEASE-EVENT",
REG_REQUEST_EVENT: "REGESTRATION-REQUEST-EVENT",
REG_ACCEPT_EVENT: "REGESTRATION-ACCEPT-EVENT",
REG_COMPLETE_EVENT: "REGESTRATION-COMPLETE-EVENT",
REG_REJECT_EVENT: "REGESTRATION-REJECT-EVENT",
DEREG_REQUEST_UE_ORIG_EVENT: "DEREGISTRATION-REQUEST-UE-ORIG-EVENT",
DEREG_ACCEPT_UE_ORIG_EVENT: "DEREGISTRATION-ACCEPT-UE-ORIG-EVENT",
DEREG_REQUEST_UE_TERM_EVENT: "DEREGISTRATION-REQUEST-UE-TERM-EVENT",
DEREG_ACCEPT_UE_TERM_EVENT: "DEREGISTRATION-ACCEPT-UE-TERM-EVENT",
SERVICE_REQUEST_EVENT: "SERVICE-REQUEST-EVENT",
SERVICE_REJECT_EVENT: "SERVICE-REJECT-EVENT",
SERVICE_ACCEPT_EVENT: "SERVICE-ACCEPT-EVENT",
AUTH_REQUEST_EVENT: "AUTHENTICATION-REQUEST-EVENT",
AUTH_RESPONSE_EVENT: "AUTHENTICATION-RESPONSE-EVENT",
AUTH_REJECT_EVENT: "AUTHENTICATION-REJECT-EVENT",
AUTH_FAILURE_EVENT: "AUTHENTICATION-FAILURE-EVENT",
AUTH_RESULT_EVENT: "AUTHENTICATION-RESULT-EVENT",
ID_REQUEST_EVENT: "ID-REQUEST-EVENT",
ID_RESPONSE_EVENT: "ID-RESPONSE-EVENT",
SEC_MOD_COMMAND_EVENT: "SECURITY-MODE-COMMAND-EVENT",
SEC_MOD_COMPLETE_EVENT: "SECURITY-MODE-COMPLETE-EVENT",
SEC_MOD_REJECT_EVENT: "SECURITY-MODE-REJECT-EVENT",
FIVE_GMM_STATUS_EVENT: "FIVE-GMM-STATUS-EVENT",
NOTIFICATION_EVENT: "NOTIFICATION-EVENT",
NOTIFICATION_RESPONSE_EVENT: "NOTIFICATION-RESPONSE-EVENT",
UL_NAS_TRANSPORT_EVENT: "UL-NAS-TRANSPORT-EVENT",
DL_NAS_TRANSPORT_EVENT: "DL-NAS-TRANSPORT-EVENT",
PDU_SESS_EST_REQUEST_EVENT: "PDU-SESSION-ESTABLISHMENT-REQUEST-EVENT",
PDU_SESS_EST_ACCEPT_EVENT: "PDU-SESSION-ESTABLISHMENT-ACCEPT-EVENT",
PDU_SESS_EST_REJECT_EVENT: "PDU-SESSION-ESTABLISHMENT-REJECT-EVENT",
PDU_SESS_AUTH_COMMAND_EVENT: "PDU-SESSION-AUTHENTICATION-COMMAND-EVENT",
PDU_SESS_AUTH_COMPLETE_EVENT: "PDU-SESSION-AUTHENTICATION-COMPLETE-EVENT",
PDU_SESS_AUTH_RESULT_EVENT: "PDU-SESSION-AUTHENTICATION-RESULT-EVENT",
PDU_SESS_MOD_REQUEST_EVENT: "PDU-SESSION-MODIFICATION-REQUEST-EVENT",
PDU_SESS_MOD_REJECT_EVENT: "PDU-SESSION-MODIFICATION-REJECT-EVENT",
PDU_SESS_MOD_COMMAND_EVENT: "PDU-SESSION-MODIFICATION-COMMAND-EVENT",
PDU_SESS_MOD_COMPLETE_EVENT: "PDU-SESSION-MODIFICATION-COMPLETE-EVENT",
PDU_SESS_MOD_CMD_REJECT_EVENT: "PDU-SESSION-MODIFICATION-COMMAND-REJECT-EVENT",
PDU_SESS_REL_REQUEST_EVENT: "PDU-SESSION-RELEASE-REQUEST-EVENT",
PDU_SESS_REL_REJECT_EVENT: "PDU-SESSION-RELEASE-REJECT-EVENT",
PDU_SESS_REL_COMMAND_EVENT: "PDU-SESSION-RELEASE-COMMAND-EVENT",
PDU_SESS_REL_COMPLETE_EVENT: "PDU-SESSION-RELEASE-COMPLETE-EVENT",
PDU_SESS_RESOURCE_RELEASE_COMMAND_EVENT: "PDU-SESSION-RESOURCE-RELEASE-COMMAND-EVENT",
FIVEGSM_STATUS_EVENT: "FIVEGSM-STATUS-EVENT",
DOWNLINK_NAS_TRANSPORT_EVENT: "DOWNLINK-NAS-TRANSPORT-EVENT",
INITIAL_CTX_SETUP_REQUEST_EVENT: "INITIAL-CONTEXT-SETUP-REQUEST-EVENT",
PDU_SESS_RESOURCE_SETUP_REQUEST_EVENT: "PDU-SESSION-RESOURCE-SETUP-REQUEST-EVENT",
UE_CTX_RELEASE_COMMAND_EVENT: "UE-CONTEXT-RELEASE-COMMAND-EVENT",
DL_UE_DATA_TRANSPORT_EVENT: "DL-UE-DATA-TRANSPORT-EVENT",
}

func (id EventType) String() string {
evtStr, ok := evtStrMap[id]
if !ok {
logger.AppLog.Fatalln("Invaid Event ID:", id)
logger.AppLog.Fatalf("Invalid Event ID: %#v", id)
}
return evtStr
}
20 changes: 11 additions & 9 deletions common/procedures.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ type ProcedureType uint8
const (
REGISTRATION_PROCEDURE ProcedureType = 1 + iota
PDU_SESSION_ESTABLISHMENT_PROCEDURE
UE_REQUESTED_PDU_SESSION_RELEASE_PROCEDURE
USER_DATA_PKT_GENERATION_PROCEDURE
UE_INITIATED_DEREGISTRATION_PROCEDURE
AN_RELEASE_PROCEDURE
Expand All @@ -20,20 +21,21 @@ const (
)

var procStrMap = map[ProcedureType]string{
REGISTRATION_PROCEDURE: "REGISTRATION-PROCEDURE",
PDU_SESSION_ESTABLISHMENT_PROCEDURE: "PDU-SESSION-ESTABLISHMENT-PROCEDURE",
USER_DATA_PKT_GENERATION_PROCEDURE: "USER-DATA-PACKET-GENERATION-PROCEDURE",
UE_INITIATED_DEREGISTRATION_PROCEDURE: "UE-INITIATED-DEREGISTRATION-PROCEDURE",
AN_RELEASE_PROCEDURE: "AN-RELEASE-PROCEDURE",
UE_TRIGGERED_SERVICE_REQUEST_PROCEDURE: "UE-TRIGGERED-SERVICE-REQUEST-PROCEDURE",
NW_TRIGGERED_UE_DEREGISTRATION_PROCEDURE: "NW-TRIGGERED-UE-DEREGISTRATION-PROCEDURE",
AMF_RELEASE_PROCEDURE: "AMF_RELEASE_PROCEDURE",
REGISTRATION_PROCEDURE: "REGISTRATION-PROCEDURE",
PDU_SESSION_ESTABLISHMENT_PROCEDURE: "PDU-SESSION-ESTABLISHMENT-PROCEDURE",
USER_DATA_PKT_GENERATION_PROCEDURE: "USER-DATA-PACKET-GENERATION-PROCEDURE",
UE_INITIATED_DEREGISTRATION_PROCEDURE: "UE-INITIATED-DEREGISTRATION-PROCEDURE",
AN_RELEASE_PROCEDURE: "AN-RELEASE-PROCEDURE",
UE_TRIGGERED_SERVICE_REQUEST_PROCEDURE: "UE-TRIGGERED-SERVICE-REQUEST-PROCEDURE",
NW_TRIGGERED_UE_DEREGISTRATION_PROCEDURE: "NW-TRIGGERED-UE-DEREGISTRATION-PROCEDURE",
AMF_RELEASE_PROCEDURE: "AMF-RELEASE-PROCEDURE",
UE_REQUESTED_PDU_SESSION_RELEASE_PROCEDURE: "UE-REQUESTED-PDU-SESSION-RELEASE-PROCEDURE",
}

func (id ProcedureType) String() string {
procStr, ok := procStrMap[id]
if !ok {
logger.AppLog.Fatalln("Invalid Procedure ID:", id)
logger.AppLog.Fatalf("Invalid Procedure ID: %#v", id)
}
return procStr
}
9 changes: 9 additions & 0 deletions config/gnbsim.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,15 @@ configuration:
plmnId: # Public Land Mobile Network ID, <PLMN ID> = <MCC><MNC>. Should match startImsi
mcc: 208 # Mobile Country Code (3 digits string, digit: 0~9)
mnc: 93 # Mobile Network Code (2 or 3 digits string, digit: 0~9)
- profileType: uereqpdusessrelease # profile type
profileName: profile7 # uniqely identifies a profile within application
enable: false # Set true to execute the profile, false otherwise.
gnbName: gnb1 # gNB to be used for this profile
startImsi: 208930100007497 # First IMSI. Subsequent values will be used if ueCount is more than 1
ueCount: 5 # Number of UEs for for which the profile will be executed
plmnId: # Public Land Mobile Network ID, <PLMN ID> = <MCC><MNC>. Should match startImsi
mcc: 208 # Mobile Country Code (3 digits string, digit: 0~9)
mnc: 93 # Mobile Network Code (2 or 3 digits string, digit: 0~9)

logger:
logLevel: info # how detailed the log will be, values: trace, debug, info, warn, error, fatal, panic
8 changes: 4 additions & 4 deletions gnodeb/context/gnbcpue.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package context

import (
"fmt"
"sync"

"github.com/omec-project/gnbsim/common"
Expand Down Expand Up @@ -48,14 +49,13 @@ func NewGnbCpUe(ngapId int64, gnb *GNodeB, amf *GnbAmf) *GnbCpUe {
}

// GetGnbUpUe returns the GnbUpUe instance corresponding to provided PDU Sess ID
func (ctx *GnbCpUe) GetGnbUpUe(pduSessId int64) *GnbUpUe {
func (ctx *GnbCpUe) GetGnbUpUe(pduSessId int64) (*GnbUpUe, error) {
ctx.Log.Infoln("Fetching GnbUpUe for pduSessId:", pduSessId)
val, ok := ctx.GnbUpUes.Load(pduSessId)
if ok {
return val.(*GnbUpUe)
return val.(*GnbUpUe), nil
} else {
ctx.Log.Errorln("key not present:", pduSessId)
return nil
return nil, fmt.Errorf("key not present: %v", pduSessId)
}
}

Expand Down
5 changes: 4 additions & 1 deletion gnodeb/gnodeb.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,10 @@ func RequestConnection(gnb *gnbctx.GNodeB, uemsg *common.UuMessage) (chan common
// TODO: Launching a GO Routine for gNB and handling the waitgroup
var wg sync.WaitGroup
wg.Add(1)
go gnbcpueworker.Init(gnbUe, &wg)
go func() {
defer wg.Done()
gnbcpueworker.Init(gnbUe)
}()
//Channel on which UE can write message to GnbUe and from which GnbUe will
//be reading.
ch := gnbUe.ReadChan
Expand Down
2 changes: 1 addition & 1 deletion gnodeb/transport/cptransport.go
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ func (cpTprt *GnbCpTransport) ReceiveFromPeer(peer transportcommon.TransportPeer
}
}

cpTprt.Log.Infof("Read %v bytes from %v\n", n, conn)
cpTprt.Log.Infof("Read %v bytes from %v\n", n, amf.GetIpAddr())
//TODO Post to gnbamfworker channel
gnbamfworker.HandleMessage(cpTprt.GnbInstance, amf, recvMsg[:n])
}
Expand Down

0 comments on commit 29f4108

Please sign in to comment.