From 81d4ab18c89c472db52fb56752b8819ad958c240 Mon Sep 17 00:00:00 2001 From: Ghislain Bourgeois Date: Wed, 13 Dec 2023 13:23:16 -0500 Subject: [PATCH 1/4] chore: Add test generated gmm/gmm.dot to .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index fb278883..60a0ce1c 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,5 @@ cscope.* *.log *.pcap vendor* + +gmm/gmm.dot From a9c157909e459bf5acbb52656d4d0e859a520bdd Mon Sep 17 00:00:00 2001 From: Ghislain Bourgeois Date: Wed, 13 Dec 2023 13:24:04 -0500 Subject: [PATCH 2/4] chore: Remove deadcode from linters as it is abandonned by its upstream --- .golangci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index b7cf46c9..f67443dd 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -247,7 +247,6 @@ linters: # - structcheck - varcheck - ineffassign - # - deadcode - typecheck # Additional # - lll From 56bc468c026acd0e7e4dfb5e7da63bfc0387eee5 Mon Sep 17 00:00:00 2001 From: Ghislain Bourgeois Date: Wed, 13 Dec 2023 13:25:04 -0500 Subject: [PATCH 3/4] chore: Remove varcheck from linters as it is abandonned by its upstream --- .golangci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index f67443dd..0c4225bb 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -245,7 +245,6 @@ linters: # - unused # - gosimple # - structcheck - - varcheck - ineffassign - typecheck # Additional From 0c3735b3132a3ba8a5d6c50dab782ecd0917b664 Mon Sep 17 00:00:00 2001 From: Ghislain Bourgeois Date: Wed, 13 Dec 2023 17:37:07 -0500 Subject: [PATCH 4/4] chore: Enable errcheck linter with required fixes --- .golangci.yml | 2 +- amf_test.go | 8 +++++-- consumer/sm_context.go | 10 +++++++-- context/amf_ran.go | 4 +++- context/amf_ue.go | 13 +++++++++--- context/context.go | 18 ++++++++++++---- context/ran_ue.go | 9 ++++++-- gmm/handler.go | 4 +++- gmm/sm.go | 29 +++++++++++++++++++------- metrics/kafka.go | 8 +++++-- metrics/telemetry.go | 5 ++++- nas/handler.go | 9 ++++++-- ngap/dispatcher.go | 8 ++++--- ngap/handler.go | 13 +++++++++--- producer/oam.go | 5 ++++- producer/oam_test.go | 11 ++++++++-- service/amf_server.go | 12 ++++++++--- service/init.go | 47 +++++++++++++++++++++++++++++++++--------- 18 files changed, 165 insertions(+), 50 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 0c4225bb..62c52e9b 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -240,7 +240,7 @@ linters: enable: - gofmt # - govet - # - errcheck + - errcheck # - staticcheck # - unused # - gosimple diff --git a/amf_test.go b/amf_test.go index a7a30134..6f90141c 100644 --- a/amf_test.go +++ b/amf_test.go @@ -26,8 +26,12 @@ import ( var AMFTest = &service.AMF{} func init() { - os.Setenv("POD_IP", "127.0.0.1") - factory.InitConfigFactory("amfTest/amfcfg.yaml") + if err := os.Setenv("POD_IP", "127.0.0.1"); err != nil { + fmt.Printf("Could not set env POD_IP: %+v\n", err) + } + if err := factory.InitConfigFactory("amfTest/amfcfg.yaml"); err != nil { + fmt.Printf("Could not InitConfigFactory: %+v\n", err) + } } func GetNetworkSliceConfig() *protos.NetworkSliceResponse { diff --git a/consumer/sm_context.go b/consumer/sm_context.go index a6f20bf2..1d57dae2 100644 --- a/consumer/sm_context.go +++ b/consumer/sm_context.go @@ -16,6 +16,7 @@ import ( "github.com/antihax/optional" amf_context "github.com/omec-project/amf/context" + "github.com/omec-project/amf/logger" "github.com/omec-project/amf/util" "github.com/omec-project/nas/nasMessage" "github.com/omec-project/openapi" @@ -26,10 +27,15 @@ import ( func getServingSmfIndex(smfNum int) (servingSmfIndex int) { servingSmfIndexStr := os.Getenv("SERVING_SMF_INDEX") - i, _ := strconv.Atoi(servingSmfIndexStr) + i, err := strconv.Atoi(servingSmfIndexStr) + if err != nil { + logger.ConsumerLog.Errorf("Could not convert %s to int: %v", servingSmfIndexStr, err) + } servingSmfIndexInt := i + 1 servingSmfIndex = servingSmfIndexInt % smfNum - os.Setenv("SERVING_SMF_INDEX", strconv.Itoa(servingSmfIndex)) + if err := os.Setenv("SERVING_SMF_INDEX", strconv.Itoa(servingSmfIndex)); err != nil { + logger.ConsumerLog.Errorf("Could not set env SERVING_SMF_INDEX: %v", err) + } return } diff --git a/context/amf_ran.go b/context/amf_ran.go index 76aa3c09..bfae9e18 100644 --- a/context/amf_ran.go +++ b/context/amf_ran.go @@ -73,7 +73,9 @@ func (ran *AmfRan) Remove() { NfStatus: mi.NfStatusDisconnected, NfName: ran.GnbId, }, } - metrics.StatWriter.PublishNfStatusEvent(gnbStatus) + if err := metrics.StatWriter.PublishNfStatusEvent(gnbStatus); err != nil { + ran.Log.Errorf("Could not publish NfStatusEvent: %v", err) + } ran.SetRanStats(RanDisconnected) ran.Log.Infof("Remove RAN Context[ID: %+v]", ran.RanID()) diff --git a/context/amf_ue.go b/context/amf_ue.go index 18e7b9b2..3d8858b1 100644 --- a/context/amf_ue.go +++ b/context/amf_ue.go @@ -325,7 +325,10 @@ func (ue *AmfUe) UnmarshalJSON(data []byte) error { } } for key, val := range aux.SmCtxList { - keyVal, _ := strconv.ParseInt(key, 10, 32) + keyVal, err := strconv.ParseInt(key, 10, 32) + if err != nil { + logger.ContextLog.Errorf("Error parsing int from %s: %v", key, err) + } ue.StoreSmContext(int32(keyVal), &val) } sqn := uint8(aux.ULCount & 0x000000ff) @@ -486,7 +489,9 @@ func (ue *AmfUe) Remove() { } // tmsiGenerator.FreeID(int64(ue.Tmsi)) - AMF_Self().Drsm.ReleaseInt32ID(ue.Tmsi) + if err := AMF_Self().Drsm.ReleaseInt32ID(ue.Tmsi); err != nil { + logger.ContextLog.Errorf("Error releasing RanUe: %v", err) + } if len(ue.Supi) > 0 { AMF_Self().UePool.Delete(ue.Supi) @@ -1066,5 +1071,7 @@ func (ueContext *AmfUe) PublishUeCtxtInfo() { kafkaSmCtxt.UeState = string(ueState[0].CmState) // Send to stream - metrics.GetWriter().PublishUeCtxtEvent(kafkaSmCtxt, op) + if err := metrics.GetWriter().PublishUeCtxtEvent(kafkaSmCtxt, op); err != nil { + logger.ContextLog.Errorf("Could not publish Ue Context Event: %v", err) + } } diff --git a/context/context.go b/context/context.go index fbd0d135..945d96ea 100644 --- a/context/context.go +++ b/context/context.go @@ -146,7 +146,9 @@ func (context *AMFContext) AllocateGutiToUe(ue *AmfUe) { func (context *AMFContext) ReAllocateGutiToUe(ue *AmfUe) { servedGuami := context.ServedGuamiList[0] - context.Drsm.ReleaseInt32ID(ue.Tmsi) + if err := context.Drsm.ReleaseInt32ID(ue.Tmsi); err != nil { + logger.ContextLog.Errorf("Errro releasing tmsi: %v", err) + } // tmsiGenerator.FreeID(int64(ue.Tmsi)) ue.Tmsi = context.TmsiAllocate() @@ -168,7 +170,10 @@ func (context *AMFContext) AllocateRegistrationArea(ue *AmfUe, anType models.Acc taiList := make([]models.Tai, len(context.SupportTaiLists)) copy(taiList, context.SupportTaiLists) for i := range taiList { - tmp, _ := strconv.ParseUint(taiList[i].Tac, 10, 32) + tmp, err := strconv.ParseUint(taiList[i].Tac, 10, 32) + if err != nil { + logger.ContextLog.Errorf("Could not convert TAC to int: %v", err) + } taiList[i].Tac = fmt.Sprintf("%06x", tmp) logger.ContextLog.Infof("Supported Tai List in AMF Plmn: %v, Tac: %v", taiList[i].PlmnId, taiList[i].Tac) } @@ -209,7 +214,9 @@ func (context *AMFContext) DeleteAMFStatusSubscription(subscriptionID string) { logger.ContextLog.Error(err) } else { // amfStatusSubscriptionIDGenerator.FreeID(id) - context.Drsm.ReleaseInt32ID(int32(id)) + if err := context.Drsm.ReleaseInt32ID(int32(id)); err != nil { + logger.ContextLog.Error(err) + } } } @@ -431,7 +438,10 @@ func (context *AMFContext) InPlmnSupportList(snssai models.Snssai) bool { } func mapToByte(data map[string]interface{}) (ret []byte) { - ret, _ = json.Marshal(data) + ret, err := json.Marshal(data) + if err != nil { + logger.ContextLog.Error(err) + } return } diff --git a/context/ran_ue.go b/context/ran_ue.go index bb02b830..8e2d1dc4 100644 --- a/context/ran_ue.go +++ b/context/ran_ue.go @@ -106,7 +106,9 @@ func (ranUe *RanUe) Remove() error { self := AMF_Self() self.RanUePool.Delete(ranUe.AmfUeNgapId) // amfUeNGAPIDGenerator.FreeID(ranUe.AmfUeNgapId) - self.Drsm.ReleaseInt32ID(int32(ranUe.AmfUeNgapId)) + if err := self.Drsm.ReleaseInt32ID(int32(ranUe.AmfUeNgapId)); err != nil { + logger.ContextLog.Errorf("Error releasing UE: %v", err) + } return nil } @@ -243,7 +245,10 @@ func (ranUe *RanUe) UpdateLocation(userLocationInformation *ngapType.UserLocatio ranUe.Location.N3gaLocation.PortNumber = ngapConvert.PortNumberToInt(port) // N3GPP TAI is operator-specific // TODO: define N3GPP TAI - tmp, _ := strconv.ParseUint(amfSelf.SupportTaiLists[0].Tac, 10, 32) + tmp, err := strconv.ParseUint(amfSelf.SupportTaiLists[0].Tac, 10, 32) + if err != nil { + logger.ContextLog.Errorf("Error parsing TAC: %v", err) + } tac := fmt.Sprintf("%06x", tmp) ranUe.Location.N3gaLocation.N3gppTai = &models.Tai{ PlmnId: amfSelf.SupportTaiLists[0].PlmnId, diff --git a/gmm/handler.go b/gmm/handler.go index e33fab02..0e77b86c 100644 --- a/gmm/handler.go +++ b/gmm/handler.go @@ -122,7 +122,9 @@ func transport5GSMMessage(ue *context.AmfUe, anType models.AccessType, if !smContextExist { msg := new(nas.Message) - msg.PlainNasDecode(&smMessage) + if err := msg.PlainNasDecode(&smMessage); err != nil { + ue.GmmLog.Errorf("Could not decode Nas message: %v", err) + } if msg.GsmMessage != nil && msg.GsmMessage.Status5GSM != nil { ue.GmmLog.Warningf("SmContext doesn't exist, 5GSM Status message received from UE with cause %v", msg.GsmMessage.Status5GSM.Cause5GSM) return nil diff --git a/gmm/sm.go b/gmm/sm.go index 2c38bbd2..73deda60 100644 --- a/gmm/sm.go +++ b/gmm/sm.go @@ -58,7 +58,9 @@ func DeRegistered(state *fsm.State, event fsm.EventType, args fsm.ArgsType) { case NwInitiatedDeregistrationEvent: amfUe := args[ArgAmfUe].(*context.AmfUe) accessType := args[ArgAccessType].(models.AccessType) - NetworkInitiatedDeregistrationProcedure(amfUe, accessType) + if err := NetworkInitiatedDeregistrationProcedure(amfUe, accessType); err != nil { + logger.GmmLog.Errorln(err) + } case StartAuthEvent: logger.GmmLog.Debugln(event) case fsm.ExitEvent: @@ -138,7 +140,9 @@ func Registered(state *fsm.State, event fsm.EventType, args fsm.ArgsType) { case NwInitiatedDeregistrationEvent: amfUe := args[ArgAmfUe].(*context.AmfUe) accessType := args[ArgAccessType].(models.AccessType) - NetworkInitiatedDeregistrationProcedure(amfUe, accessType) + if err := NetworkInitiatedDeregistrationProcedure(amfUe, accessType); err != nil { + logger.GmmLog.Errorln(err) + } /*TODO */ case SliceInfoAddEvent: case SliceInfoDeleteEvent: @@ -222,11 +226,15 @@ func Authentication(state *fsm.State, event fsm.EventType, args fsm.ArgsType) { amfUe := args[ArgAmfUe].(*context.AmfUe) accessType := args[ArgAccessType].(models.AccessType) logger.GmmLog.Debugln(event) - HandleAuthenticationError(amfUe, accessType) + if err := HandleAuthenticationError(amfUe, accessType); err != nil { + logger.GmmLog.Errorln(err) + } case NwInitiatedDeregistrationEvent: amfUe := args[ArgAmfUe].(*context.AmfUe) accessType := args[ArgAccessType].(models.AccessType) - NetworkInitiatedDeregistrationProcedure(amfUe, accessType) + if err := NetworkInitiatedDeregistrationProcedure(amfUe, accessType); err != nil { + logger.GmmLog.Errorln(err) + } case fsm.ExitEvent: // clear authentication related data at exit amfUe := args[ArgAmfUe].(*context.AmfUe) @@ -268,11 +276,14 @@ func SecurityMode(state *fsm.State, event fsm.EventType, args fsm.ArgsType) { // Generate KnasEnc, KnasInt amfUe.DerivateAlgKey() if amfUe.CipheringAlg == security.AlgCiphering128NEA0 && amfUe.IntegrityAlg == security.AlgIntegrity128NIA0 { - GmmFSM.SendEvent(state, SecuritySkipEvent, fsm.ArgsType{ + err := GmmFSM.SendEvent(state, SecuritySkipEvent, fsm.ArgsType{ ArgAmfUe: amfUe, ArgAccessType: accessType, ArgNASMessage: amfUe.RegistrationRequest, }) + if err != nil { + logger.GmmLog.Errorln(err) + } } else { gmm_message.SendSecurityModeCommand(amfUe.RanUe[accessType], eapSuccess, eapMessage) } @@ -340,7 +351,9 @@ func SecurityMode(state *fsm.State, event fsm.EventType, args fsm.ArgsType) { accessType := args[ArgAccessType].(models.AccessType) amfUe.T3560.Stop() amfUe.T3560 = nil - NetworkInitiatedDeregistrationProcedure(amfUe, accessType) + if err := NetworkInitiatedDeregistrationProcedure(amfUe, accessType); err != nil { + logger.GmmLog.Errorln(err) + } case SecurityModeSuccessEvent: logger.GmmLog.Debugln(event) case SecurityModeFailEvent: @@ -440,7 +453,9 @@ func ContextSetup(state *fsm.State, event fsm.EventType, args fsm.ArgsType) { amfUe.T3550.Stop() amfUe.T3550 = nil amfUe.State[accessType].Set(context.Registered) - NetworkInitiatedDeregistrationProcedure(amfUe, accessType) + if err := NetworkInitiatedDeregistrationProcedure(amfUe, accessType); err != nil { + logger.GmmLog.Errorln(err) + } case ContextSetupFailEvent: logger.GmmLog.Debugln(event) case fsm.ExitEvent: diff --git a/metrics/kafka.go b/metrics/kafka.go index 790f5390..bda4f6dd 100644 --- a/metrics/kafka.go +++ b/metrics/kafka.go @@ -71,7 +71,9 @@ func (writer Writer) PublishUeCtxtEvent(ctxt mi.CoreSubscriber, op mi.Subscriber return err } else { logger.KafkaLog.Debugf("publishing ue context event[%s] ", msg) - StatWriter.SendMessage(msg) + if err := StatWriter.SendMessage(msg); err != nil { + logger.KafkaLog.Errorf("Could not publish ue context event, error [%v]", err.Error()) + } } return nil } @@ -102,7 +104,9 @@ func (writer Writer) PublishNfStatusEvent(msgEvent mi.MetricEvent) error { return err } else { logger.KafkaLog.Debugf("publishing nf status event[%s] ", msg) - StatWriter.SendMessage(msg) + if err := StatWriter.SendMessage(msg); err != nil { + logger.KafkaLog.Errorf("Error publishing nf status event: %v", err) + } } return nil } diff --git a/metrics/telemetry.go b/metrics/telemetry.go index 8789117a..ba2110d5 100644 --- a/metrics/telemetry.go +++ b/metrics/telemetry.go @@ -15,6 +15,7 @@ import ( "fmt" "net/http" + "github.com/omec-project/amf/logger" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" ) @@ -64,7 +65,9 @@ func init() { // InitMetrics initialises AMF stats func InitMetrics() { http.Handle("/metrics", promhttp.Handler()) - http.ListenAndServe(":9089", nil) + if err := http.ListenAndServe(":9089", nil); err != nil { + logger.InitLog.Errorf("Could not open metrics port: %v", err) + } } // IncrementNgapMsgStats increments message level stats diff --git a/nas/handler.go b/nas/handler.go index 162dfb64..9b205a13 100644 --- a/nas/handler.go +++ b/nas/handler.go @@ -36,7 +36,10 @@ func HandleNAS(ue *context.RanUe, procedureCode int64, nasPdu []byte) { } else { if amfSelf.EnableSctpLb { /* checking the guti-ue belongs to this amf instance */ - id, _ := amfSelf.Drsm.FindOwnerInt32ID(int32(ue.AmfUe.Tmsi)) + id, err := amfSelf.Drsm.FindOwnerInt32ID(int32(ue.AmfUe.Tmsi)) + if err != nil { + logger.NasLog.Errorf("Error checking guti-ue: %v", err) + } if id != nil && id.PodName != os.Getenv("HOSTNAME") { rsp := &sdcoreAmfServer.AmfMessage{} rsp.VerboseMsg = "Redirecting Msg From AMF Pod !" @@ -49,7 +52,9 @@ func HandleNAS(ue *context.RanUe, procedureCode int64, nasPdu []byte) { if ue != nil && ue.AmfUe != nil { ue.AmfUe.Remove() } else if ue != nil { - ue.Remove() + if err := ue.Remove(); err != nil { + logger.NasLog.Errorf("Error removing ue: %v", err) + } } ue.Ran.Amf2RanMsgChan <- rsp return diff --git a/ngap/dispatcher.go b/ngap/dispatcher.go index c1039184..be6020da 100644 --- a/ngap/dispatcher.go +++ b/ngap/dispatcher.go @@ -66,8 +66,8 @@ func DispatchLb(sctplbMsg *sdcoreAmfServer.SctplbMessage, Amf2RanMsgChan chan *s //ranUe.Log.Debugln("RanUe RanNgapId AmfNgapId: ", ranUe.RanUeNgapId, ranUe.AmfUeNgapId) /* checking whether same AMF instance can handle this message */ /* redirect it to correct owner if required */ - id, _ := amfSelf.Drsm.FindOwnerInt32ID(int32(ngapId.Value)) - if id == nil { + id, err := amfSelf.Drsm.FindOwnerInt32ID(int32(ngapId.Value)) + if id == nil || err != nil { ran.Log.Warningf("DispatchLb, Couldn't find owner for amfUeNgapid: %v", ngapId.Value) } else if id != nil && id.PodName != os.Getenv("HOSTNAME") { rsp := &sdcoreAmfServer.AmfMessage{} @@ -86,7 +86,9 @@ func DispatchLb(sctplbMsg *sdcoreAmfServer.SctplbMessage, Amf2RanMsgChan chan *s ranUe.AmfUe.Remove() } if ranUe != nil { - ranUe.Remove() + if err := ranUe.Remove(); err != nil { + ran.Log.Errorf("Could not remove ranUe: %v", err) + } } return } else { diff --git a/ngap/handler.go b/ngap/handler.go index 8373f9d3..3f800b8a 100644 --- a/ngap/handler.go +++ b/ngap/handler.go @@ -642,7 +642,9 @@ func HandleNGSetupRequest(ran *context.AmfRan, message *ngapType.NGAPPDU) { NfStatus: mi.NfStatusConnected, NfName: ran.GnbId, }, } - metrics.StatWriter.PublishNfStatusEvent(gnbStatus) + if err := metrics.StatWriter.PublishNfStatusEvent(gnbStatus); err != nil { + ran.Log.Errorf("Could not publish NfStatusEvent: %v", err) + } } else { ngap_message.SendNGSetupFailure(ran, cause) } @@ -1520,7 +1522,10 @@ func HandleInitialUEMessage(ran *context.AmfRan, message *ngapType.NGAPPDU, sctp } else { ranUe.Log.Tracef("find AmfUe [GUTI: %s]", guti) /* checking the guti-ue belongs to this amf instance */ - id, _ := amfSelf.Drsm.FindOwnerInt32ID(int32(amfUe.Tmsi)) + id, err := amfSelf.Drsm.FindOwnerInt32ID(int32(amfUe.Tmsi)) + if err != nil { + ranUe.Log.Errorf("Error checking the guti-ue in this instance: %v", err) + } if id != nil && id.PodName != os.Getenv("HOSTNAME") && amfSelf.EnableSctpLb { rsp := &sdcoreAmfServer.AmfMessage{} rsp.VerboseMsg = "Redirect Msg From AMF Pod !" @@ -1533,7 +1538,9 @@ func HandleInitialUEMessage(ran *context.AmfRan, message *ngapType.NGAPPDU, sctp if ranUe != nil && ranUe.AmfUe != nil { ranUe.AmfUe.Remove() } else if ranUe != nil { - ranUe.Remove() + if err := ranUe.Remove(); err != nil { + ranUe.Log.Errorf("Could not remove ranUe: %v", err) + } } ran.Amf2RanMsgChan <- rsp return diff --git a/producer/oam.go b/producer/oam.go index 4c057f20..d62135c7 100644 --- a/producer/oam.go +++ b/producer/oam.go @@ -76,10 +76,13 @@ func HandleOAMPurgeUEContextRequest(supi, reqUri string, msg interface{}) (inter ue.Remove() case context.Registered: logger.ProducerLog.Info("Deregistration triggered for the UE : ", ue.Supi) - gmm.GmmFSM.SendEvent(ue.State[models.AccessType__3_GPP_ACCESS], gmm.NwInitiatedDeregistrationEvent, fsm.ArgsType{ + err := gmm.GmmFSM.SendEvent(ue.State[models.AccessType__3_GPP_ACCESS], gmm.NwInitiatedDeregistrationEvent, fsm.ArgsType{ gmm.ArgAmfUe: ue, gmm.ArgAccessType: models.AccessType__3_GPP_ACCESS, }) + if err != nil { + logger.ProducerLog.Errorf("Error sending deregistration event: %v", err) + } } } return nil, "", nil, nil diff --git a/producer/oam_test.go b/producer/oam_test.go index f1d1bd03..cba62218 100644 --- a/producer/oam_test.go +++ b/producer/oam_test.go @@ -6,6 +6,7 @@ package producer import ( + "fmt" "testing" "github.com/omec-project/amf/context" @@ -25,7 +26,9 @@ type TestCases struct { } func init() { - factory.InitConfigFactory("../amfTest/amfcfg.yaml") + if err := factory.InitConfigFactory("../amfTest/amfcfg.yaml"); err != nil { + fmt.Printf("Error in InitConfigFactory: %v\n", err) + } self := context.AMF_Self() util.InitAmfContext(self) @@ -35,7 +38,11 @@ func init() { func TestHandleOAMPurgeUEContextRequest_UEDeregistered(t *testing.T) { self := context.AMF_Self() - self.Drsm, _ = util.MockDrsmInit() + var err error + self.Drsm, err = util.MockDrsmInit() + if err != nil { + fmt.Printf("Error in MockDrsmInit: %v\n", err) + } amfUe := self.NewAmfUe("imsi-208930100007497") HandleOAMPurgeUEContextRequest(amfUe.Supi, "", nil) diff --git a/service/amf_server.go b/service/amf_server.go index b3f04a2d..88926570 100644 --- a/service/amf_server.go +++ b/service/amf_server.go @@ -71,7 +71,9 @@ func (s *Server) HandleMessage(srv sdcoreAmfServer.NgapService_HandleMessageServ NfStatus: mi.NfStatusConnected, NfName: req.GnbId, }, } - metrics.StatWriter.PublishNfStatusEvent(gnbStatus) + if err := metrics.StatWriter.PublishNfStatusEvent(gnbStatus); err != nil { + log.Printf("Error publishing NfStatusEvent: %v", err) + } } } ran.Amf2RanMsgChan = Amf2RanMsgChan @@ -89,7 +91,9 @@ func (s *Server) HandleMessage(srv sdcoreAmfServer.NgapService_HandleMessageServ NfStatus: mi.NfStatusDisconnected, NfName: req.GnbId, }, } - metrics.StatWriter.PublishNfStatusEvent(gnbStatus) + if err := metrics.StatWriter.PublishNfStatusEvent(gnbStatus); err != nil { + log.Printf("Error publishing NfStatusEvent: %v", err) + } } else if req.Msgtype == sdcoreAmfServer.MsgType_GNB_CONN { log.Println("New GNB Connected ") // send nf(gnb) status notification @@ -100,7 +104,9 @@ func (s *Server) HandleMessage(srv sdcoreAmfServer.NgapService_HandleMessageServ NfStatus: mi.NfStatusConnected, NfName: req.GnbId, }, } - metrics.StatWriter.PublishNfStatusEvent(gnbStatus) + if err := metrics.StatWriter.PublishNfStatusEvent(gnbStatus); err != nil { + log.Printf("Error publishing NfStatusEvent: %v", err) + } } else { ngap.DispatchLb(req, Amf2RanMsgChan) } diff --git a/service/init.go b/service/init.go index 83b03d2a..93a46f5b 100644 --- a/service/init.go +++ b/service/init.go @@ -120,7 +120,9 @@ func (amf *AMF) Initialize(c *cli.Context) error { if factory.AmfConfig.Configuration.DebugProfilePort != 0 { addr := fmt.Sprintf(":%d", factory.AmfConfig.Configuration.DebugProfilePort) go func() { - http.ListenAndServe(addr, nil) + if err := http.ListenAndServe(addr, nil); err != nil { + initLog.Errorln(err) + } }() } @@ -292,6 +294,7 @@ func (amf *AMF) FilterCli(c *cli.Context) (args []string) { func (amf *AMF) Start() { initLog.Infoln("Server started") + var err error router := logger_util.NewGinWithLogrus(logger.GinLog) router.Use(cors.New(cors.Config{ @@ -323,13 +326,16 @@ func (amf *AMF) Start() { go metrics.InitMetrics() - if err := metrics.InitialiseKafkaStream(factory.AmfConfig.Configuration); err != nil { + if err = metrics.InitialiseKafkaStream(factory.AmfConfig.Configuration); err != nil { initLog.Errorf("initialise kafka stream failed, %v ", err.Error()) } self := context.AMF_Self() util.InitAmfContext(self) - self.Drsm, _ = util.InitDrsm() + self.Drsm, err = util.InitDrsm() + if err != nil { + initLog.Errorf("initialise DRSM failed, %v", err.Error()) + } addr := fmt.Sprintf("%s:%d", self.BindingIPv4, self.SBIPort) @@ -626,7 +632,10 @@ func (amf *AMF) UpdateConfig(commChannel chan *protos.NetworkSliceResponse) bool logger.GrpcLog.Infoln("Network Slice Name ", ns.Name) if ns.Nssai != nil { snssai = new(models.Snssai) - val, _ := strconv.ParseInt(ns.Nssai.Sst, 10, 64) + val, err := strconv.ParseInt(ns.Nssai.Sst, 10, 64) + if err != nil { + logger.GrpcLog.Errorln(err) + } snssai.Sst = int32(val) snssai.Sd = ns.Nssai.Sd } @@ -716,26 +725,38 @@ func UeConfigSliceDeleteHandler(supi, sst, sd string, msg interface{}) { // - Only 1 Allowed Nssai is exist and its slice information matched ns := msg.(*protos.NetworkSlice) if len(ue.AllowedNssai[models.AccessType__3_GPP_ACCESS]) == 1 { - st, _ := strconv.Atoi(ns.Nssai.Sst) + st, err := strconv.Atoi(ns.Nssai.Sst) + if err != nil { + logger.CfgLog.Errorln(err) + } if ue.AllowedNssai[models.AccessType__3_GPP_ACCESS][0].AllowedSnssai.Sst == int32(st) && ue.AllowedNssai[models.AccessType__3_GPP_ACCESS][0].AllowedSnssai.Sd == ns.Nssai.Sd { - gmm.GmmFSM.SendEvent(ue.State[models.AccessType__3_GPP_ACCESS], gmm.NwInitiatedDeregistrationEvent, fsm.ArgsType{ + err := gmm.GmmFSM.SendEvent(ue.State[models.AccessType__3_GPP_ACCESS], gmm.NwInitiatedDeregistrationEvent, fsm.ArgsType{ gmm.ArgAmfUe: ue, gmm.ArgAccessType: models.AccessType__3_GPP_ACCESS, }) + if err != nil { + logger.CfgLog.Errorln(err) + } } else { logger.CfgLog.Infof("Deleted slice not matched with slice info in UEContext") } } else { var Nssai models.Snssai - st, _ := strconv.Atoi(ns.Nssai.Sst) + st, err := strconv.Atoi(ns.Nssai.Sst) + if err != nil { + logger.CfgLog.Errorln(err) + } Nssai.Sst = int32(st) Nssai.Sd = ns.Nssai.Sd - gmm.GmmFSM.SendEvent(ue.State[models.AccessType__3_GPP_ACCESS], gmm.SliceInfoDeleteEvent, fsm.ArgsType{ + err = gmm.GmmFSM.SendEvent(ue.State[models.AccessType__3_GPP_ACCESS], gmm.SliceInfoDeleteEvent, fsm.ArgsType{ gmm.ArgAmfUe: ue, gmm.ArgAccessType: models.AccessType__3_GPP_ACCESS, gmm.ArgNssai: Nssai, }) + if err != nil { + logger.CfgLog.Errorln(err) + } } } @@ -745,14 +766,20 @@ func UeConfigSliceAddHandler(supi, sst, sd string, msg interface{}) { ns := msg.(*protos.NetworkSlice) var Nssai models.Snssai - st, _ := strconv.Atoi(ns.Nssai.Sst) + st, err := strconv.Atoi(ns.Nssai.Sst) + if err != nil { + logger.CfgLog.Errorln(err) + } Nssai.Sst = int32(st) Nssai.Sd = ns.Nssai.Sd - gmm.GmmFSM.SendEvent(ue.State[models.AccessType__3_GPP_ACCESS], gmm.SliceInfoAddEvent, fsm.ArgsType{ + err = gmm.GmmFSM.SendEvent(ue.State[models.AccessType__3_GPP_ACCESS], gmm.SliceInfoAddEvent, fsm.ArgsType{ gmm.ArgAmfUe: ue, gmm.ArgAccessType: models.AccessType__3_GPP_ACCESS, gmm.ArgNssai: Nssai, }) + if err != nil { + logger.CfgLog.Errorln(err) + } } func HandleImsiDeleteFromNetworkSlice(slice *protos.NetworkSlice) {