Initial commit of KPIMON xAPP for Bronze Release Enhancement.
[scp/ric-app/kpimon.git] / control / e2ap.go
diff --git a/control/e2ap.go b/control/e2ap.go
new file mode 100644 (file)
index 0000000..867564c
--- /dev/null
@@ -0,0 +1,253 @@
+/*
+==================================================================================
+  Copyright (c) 2019 AT&T Intellectual Property.
+  Copyright (c) 2019 Nokia
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================================
+*/
+
+package control
+
+/*
+#include <stdlib.h>
+#include <e2ap/wrapper.h>
+#cgo LDFLAGS: -le2apwrapper
+#cgo CFLAGS: -I/usr/local/include/e2ap
+*/
+import "C"
+
+import (
+       "errors"
+       "unsafe"
+)
+
+type E2ap struct {
+}
+
+/* RICsubscriptionRequest */
+
+func (c *E2ap) GetSubscriptionRequestSequenceNumber(payload []byte) (subId uint16, err error) {
+       cptr := unsafe.Pointer(&payload[0])
+       cret := C.e2ap_get_ric_subscription_request_sequence_number(cptr, C.size_t(len(payload)))
+       if cret < 0 {
+               return 0, errors.New("e2ap wrapper is unable to get Subscirption Request Sequence Number due to wrong or invalid payload")
+       }
+       subId = uint16(cret)
+       return
+}
+
+func (c *E2ap) SetSubscriptionRequestSequenceNumber(payload []byte, newSubscriptionid uint16) (newPayload []byte, err error) {
+       cptr := unsafe.Pointer(&payload[0])
+       size := C.e2ap_set_ric_subscription_request_sequence_number(cptr, C.size_t(len(payload)), C.long(newSubscriptionid))
+       if size < 0 {
+               return make([]byte, 0), errors.New("e2ap wrapper is unable to set Subscription Request Sequence Number due to wrong or invalid payload")
+       }
+       newPayload = C.GoBytes(cptr, (C.int(size)+7)/8)
+       return
+}
+
+func (c *E2ap) SetSubscriptionRequestPayload(payload []byte, ricRequestorID uint16, ricRequestSequenceNumber uint16, ranFunctionID uint16, eventTriggerDefinition []byte, eventTriggerDefinitionSize int, actionCount int, actionIds []int64, actionTypes []int64, actionDefinitions []ActionDefinition, subsequentActions []SubsequentAction) (newPayload []byte, err error) {
+       cptr := unsafe.Pointer(&payload[0])
+       eventTrigger := unsafe.Pointer(&eventTriggerDefinition[0])
+       actIds := unsafe.Pointer(&actionIds[0])
+       actTypes := unsafe.Pointer(&actionTypes[0])
+
+       count := len(actionDefinitions)
+       actDefs := (*C.RICactionDefinition)(C.calloc(C.size_t(len(actionDefinitions)), C.sizeof_RICactionDefinition))
+       for index := 0; index < count; index++ {
+               ptr := *(*C.RICactionDefinition)(unsafe.Pointer((uintptr)(unsafe.Pointer(actDefs)) + (uintptr)(C.sizeof_RICactionDefinition*C.int(index))))
+               ptr.size = C.int(actionDefinitions[index].Size)
+               if ptr.size != 0 {
+                       ptr.actionDefinition = (*C.uint8_t)(C.CBytes(actionDefinitions[index].Buf))
+               }
+       }
+       defer C.free(unsafe.Pointer(actDefs))
+
+       count = len(subsequentActions)
+       subActs := (*C.RICSubsequentAction)(C.calloc(C.size_t(len(subsequentActions)), C.sizeof_RICSubsequentAction))
+       for index := 0; index < count; index++ {
+               ptr := *(*C.RICSubsequentAction)(unsafe.Pointer((uintptr)(unsafe.Pointer(subActs)) + (uintptr)(C.sizeof_RICSubsequentAction*C.int(index))))
+               ptr.isValid = C.int(subsequentActions[index].IsValid)
+               ptr.subsequentActionType = C.long(subsequentActions[index].SubsequentActionType)
+               ptr.timeToWait = C.long(subsequentActions[index].TimeToWait)
+       }
+       defer C.free(unsafe.Pointer(subActs))
+
+       size := C.e2ap_encode_ric_subscription_request_message(cptr, C.size_t(len(payload)), C.long(ricRequestorID), C.long(ricRequestSequenceNumber), C.long(ranFunctionID), eventTrigger, C.size_t(eventTriggerDefinitionSize), C.int(actionCount), (*C.long)(actIds), (*C.long)(actTypes), actDefs, subActs)
+       if size < 0 {
+               return make([]byte, 0), errors.New("e2ap wrapper is unable to set Subscription Request Payload due to wrong or invalid payload")
+       }
+       newPayload = C.GoBytes(cptr, (C.int(size)+7)/8)
+       return
+}
+
+/* RICsubscriptionResponse */
+
+func (c *E2ap) GetSubscriptionResponseSequenceNumber(payload []byte) (subId uint16, err error) {
+       cptr := unsafe.Pointer(&payload[0])
+       cret := C.e2ap_get_ric_subscription_response_sequence_number(cptr, C.size_t(len(payload)))
+       if cret < 0 {
+               return 0, errors.New("e2ap wrapper is unable to get Subscirption Response Sequence Number due to wrong or invalid payload")
+       }
+       subId = uint16(cret)
+       return
+}
+
+func (c *E2ap) SetSubscriptionResponseSequenceNumber(payload []byte, newSubscriptionid uint16) (newPayload []byte, err error) {
+       cptr := unsafe.Pointer(&payload[0])
+       size := C.e2ap_set_ric_subscription_response_sequence_number(cptr, C.size_t(len(payload)), C.long(newSubscriptionid))
+       if size < 0 {
+               return make([]byte, 0), errors.New("e2ap wrapper is unable to set Subscription Response Sequence Number due to wrong or invalid payload")
+       }
+       newPayload = C.GoBytes(cptr, (C.int(size)+7)/8)
+       return
+}
+
+func (c *E2ap) GetSubscriptionResponseMessage(payload []byte) (decodedMsg *DecodedSubscriptionResponseMessage, err error) {
+       cptr := unsafe.Pointer(&payload[0])
+       decodedMsg = &DecodedSubscriptionResponseMessage{}
+       decodedCMsg := C.e2ap_decode_ric_subscription_response_message(cptr, C.size_t(len(payload)))
+       defer C.free(unsafe.Pointer(decodedCMsg))
+
+       if decodedCMsg == nil {
+               return decodedMsg, errors.New("e2ap wrapper is unable to decode subscription response message due to wrong or invalid payload")
+       }
+
+       decodedMsg.RequestID = int32(decodedCMsg.requestorID)
+       decodedMsg.RequestSequenceNumber = int32(decodedCMsg.requestSequenceNumber)
+       decodedMsg.FuncID = int32(decodedCMsg.ranfunctionID)
+
+       admittedCount := int(decodedCMsg.ricActionAdmittedList.count)
+       for index := 0; index < admittedCount; index++ {
+               decodedMsg.ActionAdmittedList.ActionID[index] = int32(decodedCMsg.ricActionAdmittedList.ricActionID[index])
+       }
+       decodedMsg.ActionAdmittedList.Count = admittedCount
+
+       notAdmittedCount := int(decodedCMsg.ricActionNotAdmittedList.count)
+       for index := 0; index < notAdmittedCount; index++ {
+               decodedMsg.ActionNotAdmittedList.ActionID[index] = int32(decodedCMsg.ricActionNotAdmittedList.ricActionID[index])
+               decodedMsg.ActionNotAdmittedList.Cause[index].CauseType = int32(decodedCMsg.ricActionNotAdmittedList.ricCause[index].ricCauseType)
+               decodedMsg.ActionNotAdmittedList.Cause[index].CauseID = int32(decodedCMsg.ricActionNotAdmittedList.ricCause[index].ricCauseID)
+       }
+       decodedMsg.ActionNotAdmittedList.Count = notAdmittedCount
+
+       return
+}
+
+/* RICsubscriptionFailure */
+
+func (c *E2ap) GetSubscriptionFailureSequenceNumber(payload []byte) (subId uint16, err error) {
+       cptr := unsafe.Pointer(&payload[0])
+       cret := C.e2ap_get_ric_subscription_failure_sequence_number(cptr, C.size_t(len(payload)))
+       if cret < 0 {
+               return 0, errors.New("e2ap wrapper is unable to get Subscirption Failure Sequence Number due to wrong or invalid payload")
+       }
+       subId = uint16(cret)
+       return
+}
+
+/* RICsubscriptionDeleteRequest */
+
+func (c *E2ap) GetSubscriptionDeleteRequestSequenceNumber(payload []byte) (subId uint16, err error) {
+       cptr := unsafe.Pointer(&payload[0])
+       cret := C.e2ap_get_ric_subscription_delete_request_sequence_number(cptr, C.size_t(len(payload)))
+       if cret < 0 {
+               return 0, errors.New("e2ap wrapper is unable to get Subscirption Delete Request Sequence Number due to wrong or invalid payload")
+       }
+       subId = uint16(cret)
+       return
+}
+
+func (c *E2ap) SetSubscriptionDeleteRequestSequenceNumber(payload []byte, newSubscriptionid uint16) (newPayload []byte, err error) {
+       cptr := unsafe.Pointer(&payload[0])
+       size := C.e2ap_set_ric_subscription_delete_request_sequence_number(cptr, C.size_t(len(payload)), C.long(newSubscriptionid))
+       if size < 0 {
+               return make([]byte, 0), errors.New("e2ap wrapper is unable to set Subscription Delete Request Sequence Number due to wrong or invalid payload")
+       }
+       newPayload = C.GoBytes(cptr, (C.int(size)+7)/8)
+       return
+}
+
+func (c *E2ap) SetSubscriptionDeleteRequestPayload(payload []byte, ricRequestorID uint16, ricRequestSequenceNumber uint16, ranFunctionID uint16) (newPayload []byte, err error) {
+       cptr := unsafe.Pointer(&payload[0])
+       size := C.e2ap_encode_ric_subscription_delete_request_message(cptr, C.size_t(len(payload)), C.long(ricRequestorID), C.long(ricRequestSequenceNumber), C.long(ranFunctionID))
+       if size < 0 {
+               return make([]byte, 0), errors.New("e2ap wrapper is unable to set Subscription Delete Request Payload due to wrong or invalid payload")
+       }
+       newPayload = C.GoBytes(cptr, (C.int(size)+7)/8)
+       return
+}
+
+/* RICsubscriptionDeleteResponse */
+
+func (c *E2ap) GetSubscriptionDeleteResponseSequenceNumber(payload []byte) (subId uint16, err error) {
+       cptr := unsafe.Pointer(&payload[0])
+       cret := C.e2ap_get_ric_subscription_delete_response_sequence_number(cptr, C.size_t(len(payload)))
+       if cret < 0 {
+               return 0, errors.New("e2ap wrapper is unable to get Subscirption Delete Response Sequence Number due to wrong or invalid payload")
+       }
+       subId = uint16(cret)
+       return
+}
+
+func (c *E2ap) SetSubscriptionDeleteResponseSequenceNumber(payload []byte, newSubscriptionid uint16) (newPayload []byte, err error) {
+       cptr := unsafe.Pointer(&payload[0])
+       size := C.e2ap_set_ric_subscription_delete_response_sequence_number(cptr, C.size_t(len(payload)), C.long(newSubscriptionid))
+       if size < 0 {
+               return make([]byte, 0), errors.New("e2ap wrapper is unable to set Subscription Delete Response Sequence Number due to wrong or invalid payload")
+       }
+       newPayload = C.GoBytes(cptr, (C.int(size)+7)/8)
+       return
+}
+
+/* RICsubscriptionDeleteFailure */
+
+func (c *E2ap) GetSubscriptionDeleteFailureSequenceNumber(payload []byte) (subId uint16, err error) {
+       cptr := unsafe.Pointer(&payload[0])
+       cret := C.e2ap_get_ric_subscription_delete_failure_sequence_number(cptr, C.size_t(len(payload)))
+       if cret < 0 {
+               return 0, errors.New("e2ap wrapper is unable to get Subscirption Failure Sequence Number due to wrong or invalid payload")
+       }
+       subId = uint16(cret)
+       return
+}
+
+/* RICindication */
+
+func (c *E2ap) GetIndicationMessage(payload []byte) (decodedMsg *DecodedIndicationMessage, err error) {
+       cptr := unsafe.Pointer(&payload[0])
+       decodedMsg = &DecodedIndicationMessage{}
+       decodedCMsg := C.e2ap_decode_ric_indication_message(cptr, C.size_t(len(payload)))
+       if decodedCMsg == nil {
+               return decodedMsg, errors.New("e2ap wrapper is unable to decode indication message due to wrong or invalid payload")
+       }
+       defer C.e2ap_free_decoded_ric_indication_message(decodedCMsg)
+
+       decodedMsg.RequestID = int32(decodedCMsg.requestorID)
+       decodedMsg.RequestSequenceNumber = int32(decodedCMsg.requestSequenceNumber)
+       decodedMsg.FuncID = int32(decodedCMsg.ranfunctionID)
+       decodedMsg.ActionID = int32(decodedCMsg.actionID)
+       decodedMsg.IndSN = int32(decodedCMsg.indicationSN)
+       decodedMsg.IndType = int32(decodedCMsg.indicationType)
+       indhdr := unsafe.Pointer(decodedCMsg.indicationHeader)
+       decodedMsg.IndHeader = C.GoBytes(indhdr, C.int(decodedCMsg.indicationHeaderSize))
+       decodedMsg.IndHeaderLength = int32(decodedCMsg.indicationHeaderSize)
+       indmsg := unsafe.Pointer(decodedCMsg.indicationMessage)
+       decodedMsg.IndMessage = C.GoBytes(indmsg, C.int(decodedCMsg.indicationMessageSize))
+       decodedMsg.IndMessageLength = int32(decodedCMsg.indicationMessageSize)
+       callproc := unsafe.Pointer(decodedCMsg.callProcessID)
+       decodedMsg.CallProcessID = C.GoBytes(callproc, C.int(decodedCMsg.callProcessIDSize))
+       decodedMsg.CallProcessIDLength = int32(decodedCMsg.callProcessIDSize)
+       return
+}