package main
+/*
+#include <rmr/RIC_message_types.h>
+#include <rmr/rmr.h>
+
+#cgo CFLAGS: -I../
+#cgo LDFLAGS: -lrmr_nng -lnng
+*/
+import "C"
+
import (
- "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
- /* TODO: removed to being able to integrate with UEMGR
- submgr "gerrit.o-ran-sc.org/r/ric-plt/submgr/pkg/control"
- */
+ "encoding/hex"
"errors"
+ submgr "gerrit.o-ran-sc.org/r/ric-plt/submgr/pkg/control"
+ "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
+ "github.com/spf13/viper"
+ "strconv"
)
type E2t struct {
+ submgr.E2ap
+}
+
+var c chan xapp.RMRParams = make(chan xapp.RMRParams, 1)
+
+var requestRawData string
+var deleteRawData string
+
+func init() {
+ viper.AutomaticEnv()
+ viper.SetEnvPrefix("e2t")
+ viper.AllowEmptyEnv(true)
+ requestRawData = viper.GetString("rawdata")
+ if requestRawData == "" {
+ requestRawData = "20c9001d000003ea7e00050000010002ea6300020003ea6c000700ea6d40020004"
+ }
+ xapp.Logger.Info("Initial RAW Data: %v", requestRawData)
+ deleteRawData = viper.GetString("rawdata")
+ if deleteRawData == "" {
+ deleteRawData = "20ca0012000002ea7e00050000010002ea6300020003"
+ }
+ xapp.Logger.Info("Initial RAW Data: %v", deleteRawData)
}
-func (e E2t ) Consume(mtype, sub_id int, len int, payload []byte) (err error) {
- /* TODO: removed to being able to integrate with UEMGR
- asn1 := submgr.Asn1{}
- message, err := asn1.Decode(payload)
+func (e *E2t) GenerateRequestPayload(subId uint16) (payload []byte, err error) {
+ skeleton, err := hex.DecodeString(requestRawData)
if err != nil {
- xapp.Logger.Debug("E2T asn1Decoding failure due to "+ err.Error())
- return
+ return make([]byte, 0), errors.New("unable to decode data provided in \"RCO_RAWDATA\" environment variable")
+ }
+ payload, err = e.SetSubscriptionResponseSequenceNumber(skeleton, subId)
+ return
+}
+
+func (e *E2t) GenerateDeletePayload(subId uint16) (payload []byte, err error) {
+ skeleton, err := hex.DecodeString(deleteRawData)
+ if err != nil {
+ return make([]byte, 0), errors.New("unable to decode data provided in \"RCO_RAWDATA\" environment variable")
}
- */
- xapp.Logger.Info("E2T Received Message with RMR Subsriprion ID: %v, Responding...", sub_id)
- err = e.subscriptionResponse(sub_id, payload)
+ payload, err = e.SetSubscriptionDeleteResponseSequenceNumber(skeleton, subId)
return
}
-func (e E2t ) subscriptionResponse(sub_id int, payload []byte) (err error) {
- /* TODO: removed to being able to integrate with UEMGR
- asn1 := submgr.Asn1{}
- payload, err := asn1.Encode(submgr.RmrPayload{8, sub_id, "E2T: RCO Subscribed"})
+func (e E2t) Consume(rp *xapp.RMRParams) (err error) {
+ switch rp.Mtype {
+ case C.RIC_SUB_REQ:
+ err = e.handleSubscriptionRequest(rp)
+ case C.RIC_SUB_DEL_REQ:
+ err = e.handleSubscriptionDeleteRequest(rp)
+ default:
+ err = errors.New("Message Type " + strconv.Itoa(rp.Mtype) + " is discarded")
+ xapp.Logger.Error("Unknown message type: %v", err)
+ }
+ return
+}
+
+func (e E2t) handleSubscriptionRequest(request *xapp.RMRParams) (err error) {
+ payloadSeqNum, err := e.GetSubscriptionRequestSequenceNumber(request.Payload)
+ if err != nil {
+ xapp.Logger.Error("Unable to get Subscription Sequence Number from Payload due to: " + err.Error())
+ }
+ xapp.Logger.Info("Subscription Request Received: RMR SUBSCRIPTION_ID: %v | PAYLOAD SEQUENCE_NUMBER: %v", payloadSeqNum, payloadSeqNum)
+ payload, err := e.GenerateRequestPayload(payloadSeqNum)
if err != nil {
+ xapp.Logger.Debug(err.Error())
return
}
- */
- if !xapp.Rmr.Send(12011, sub_id, len(payload), payload) {
- err = errors.New("rmr.Send() failed")
+ request.Payload = payload
+ request.Mtype = 12011
+ c <- *request
+ return
+}
+
+func (e E2t) handleSubscriptionDeleteRequest(request *xapp.RMRParams) (err error) {
+ payloadSeqNum, err := e.GetSubscriptionDeleteRequestSequenceNumber(request.Payload)
+ if err != nil {
+ xapp.Logger.Error("Unable to get Subscription Sequence Number from Payload due to: " + err.Error())
+ }
+ xapp.Logger.Info("Subscription Delete Request Received: RMR SUBSCRIPTION_ID: %v | PAYLOAD SEQUENCE_NUMBER: %v", payloadSeqNum, payloadSeqNum)
+ payload, err := e.GenerateDeletePayload(payloadSeqNum)
+ if err != nil {
+ xapp.Logger.Debug(err.Error())
+ return
}
+ request.Payload = payload
+ request.Mtype = 12021
+ c <- *request
return
}
+func (e *E2t) Run() {
+ for {
+ message := <-c
+ var payloadSeqNum uint16
+ var err error
+ if message.Mtype == 12011 {
+ payloadSeqNum, err = e.GetSubscriptionResponseSequenceNumber(message.Payload)
+ } else if message.Mtype == 12021 {
+ payloadSeqNum, err = e.GetSubscriptionDeleteResponseSequenceNumber(message.Payload)
+ } else {
+ err = errors.New("OH MY GOD")
+ }
+ if err != nil {
+ xapp.Logger.Debug("Unable to get Subscription Sequence Number from Payload due to: " + err.Error())
+ }
+ xapp.Logger.Info("Sending Message: TYPE: %v | RMR SUBSCRIPTION_ID: %v | PAYLOAD SEQUENCE_NUMBER: %v)", message.Mtype, message.SubId, payloadSeqNum)
+ xapp.Rmr.Send(&message, true)
+ }
+}
+
func main() {
e2t := E2t{}
+ go e2t.Run()
xapp.Run(e2t)
}