(continued)
E2 setup(ricplt and odu-high) part 2
I will introduce more details on E2Manager implementation.
- e2term source code: o-ran-sc-bronze-20200810\ric-plt.e2\RIC-E2-TERMINATION, which is implemented in C++
- e2mgr source code: o-ran-sc-bronze-20200810\ric-plt.e2mgr, which is implemented in Go. e2mgr uses the RMR library with cgo.
Let’s focus on e2mgr.
e2mgr uses RMR for inter-node E2AP signalling exchange, and imposes RESTful API for E2 connection management.
e2mgr RMR msg flow
// within main function
rmrReceiver := rmrreceiver.NewRmrReceiver(logger, rmrMessenger, notificationManager)
defer rmrMessenger.Close()
go rmrReceiver.ListenAndHandle()
// within services.rmrreceiver.ListenAndHandle
// TODO: go routine?
_ = r.nManager.HandleMessage(mbuf)
// within managers.notificationManager.HandleMessage
func (m NotificationManager) HandleMessage(mbuf *rmrCgo.MBuf) error {
notificationHandler, err := m.notificationHandlerProvider.GetNotificationHandler(mbuf.MType)
if err != nil {
m.logger.Errorf("#NotificationManager.HandleMessage - Error: %s", err)
return err
}
notificationRequest := models.NewNotificationRequest(mbuf.Meid, *mbuf.Payload, time.Now(), *mbuf.XAction, mbuf.GetMsgSrc())
go notificationHandler.Handle(notificationRequest)
return nil
}
// within providers.notificationhandlerprovider.GetNotificationHandler
provider.Register(rmrCgo.RIC_X2_SETUP_RESP, x2SetupResponseHandler)
provider.Register(rmrCgo.RIC_X2_SETUP_FAILURE, x2SetupFailureResponseHandler)
provider.Register(rmrCgo.RIC_ENDC_X2_SETUP_RESP, endcSetupResponseHandler)
provider.Register(rmrCgo.RIC_ENDC_X2_SETUP_FAILURE, endcSetupFailureResponseHandler)
provider.Register(rmrCgo.RIC_SCTP_CONNECTION_FAILURE, ranLostConnectionHandler)
//provider.Register(rmrCgo.RIC_ENB_LOAD_INFORMATION, enbLoadInformationNotificationHandler)
provider.Register(rmrCgo.RIC_ENB_CONF_UPDATE, x2EnbConfigurationUpdateHandler)
provider.Register(rmrCgo.RIC_ENDC_CONF_UPDATE, endcConfigurationUpdateHandler)
provider.Register(rmrCgo.RIC_X2_RESET_RESP, x2ResetResponseHandler)
provider.Register(rmrCgo.RIC_X2_RESET, x2ResetRequestNotificationHandler)
provider.Register(rmrCgo.RIC_E2_TERM_INIT, e2TermInitNotificationHandler)
provider.Register(rmrCgo.E2_TERM_KEEP_ALIVE_RESP, e2TKeepAliveResponseHandler)
provider.Register(rmrCgo.RIC_E2_SETUP_REQ, e2SetupRequestNotificationHandler)
e2mgr E2 management flow
// within main function
httpMsgHandlerProvider := httpmsghandlerprovider.NewIncomingRequestHandlerProvider(logger, rmrSender, config, rnibDataService, ranSetupManager, e2tInstancesManager, e2tAssociationManager, routingManagerClient)
rootController := controllers.NewRootController(rnibDataService)
nodebController := controllers.NewNodebController(logger, httpMsgHandlerProvider)
e2tController := controllers.NewE2TController(logger, httpMsgHandlerProvider)
_ = httpserver.Run(logger, config.Http.Port, rootController, nodebController, e2tController)
// within providers.httpmsghandlerprovider
ShutdownRequest: httpmsghandlers.NewDeleteAllRequestHandler(logger, rmrSender, config, rNibDataService