Add license file
[ric-plt/xapp-frame.git] / pkg / xapp / rmr.go
old mode 100755 (executable)
new mode 100644 (file)
index 9077792..56e0eb1
@@ -136,6 +136,8 @@ func (m *RMRClient) parseMessage(rxBuffer *C.rmr_mbuf_t) {
        meidBuf := make([]byte, int(C.RMR_MAX_MEID))
        if meidCstr := C.rmr_get_meid(rxBuffer, (*C.uchar)(unsafe.Pointer(&meidBuf[0]))); meidCstr != nil {
                params.Meid.RanName = strings.TrimRight(string(meidBuf), "\000")
+               //params.Meid.PlmnID = strings.TrimRight(string(meidBuf[0:16]), "\000")
+               //params.Meid.EnbID = strings.TrimRight(string(meidBuf[16:32]), "\000")
        }
 
        xidBuf := make([]byte, int(C.RMR_MAX_XID))
@@ -170,39 +172,20 @@ func (m *RMRClient) Allocate() *C.rmr_mbuf_t {
 
 func (m *RMRClient) Free(mbuf *C.rmr_mbuf_t) {
        if mbuf == nil {
-               Logger.Error("rmrClient: Can't free mbuffer, given nil pointer")
                return
        }
        C.rmr_free_msg(mbuf)
 }
 
 func (m *RMRClient) SendMsg(params *RMRParams) bool {
-       return m.SendBuffer(params, false)
+       return m.Send(params, false)
 }
 
 func (m *RMRClient) SendRts(params *RMRParams) bool {
-       return m.SendBuffer(params, true)
+       return m.Send(params, true)
 }
 
-func (m *RMRClient) SendBuffer(params *RMRParams, isRts bool) bool {
-       defer m.Free(params.Mbuf)
-       for i := 0; i < 10; i++ {
-               errCode := m.Send(params, isRts)
-               if errCode == C.RMR_OK {
-                       m.UpdateStatCounter("Transmitted")
-                       return true
-               }
-               if errCode != C.RMR_ERR_RETRY {
-                       Logger.Error("rmrClient: rmr_send returned hard error - %d", errCode)
-                       break
-               }
-
-       }
-       m.UpdateStatCounter("TransmitError")
-       return false
-}
-
-func (m *RMRClient) Send(params *RMRParams, isRts bool) C.int {
+func (m *RMRClient) Send(params *RMRParams, isRts bool) bool {
        txBuffer := params.Mbuf
        if txBuffer == nil {
                txBuffer = m.Allocate()
@@ -221,29 +204,58 @@ func (m *RMRClient) Send(params *RMRParams, isRts bool) C.int {
                if params.Meid != nil {
                        b := make([]byte, int(C.RMR_MAX_MEID))
                        copy(b, []byte(params.Meid.RanName))
+                       //copy(b, []byte(params.Meid.PlmnID))
+                       //copy(b[16:], []byte(params.Meid.EnbID))
                        C.rmr_bytes2meid(txBuffer, (*C.uchar)(unsafe.Pointer(&b[0])), C.int(len(b)))
                }
                xidLen := len(params.Xid)
                if xidLen > 0 && xidLen <= C.RMR_MAX_XID {
-                       b := make([]byte, int(C.RMR_MAX_MEID))
+                       b := make([]byte, int(C.RMR_MAX_XID))
                        copy(b, []byte(params.Xid))
                        C.rmr_bytes2xact(txBuffer, (*C.uchar)(unsafe.Pointer(&b[0])), C.int(len(b)))
                }
        }
        C.write_bytes_array(txBuffer.payload, datap, txBuffer.len)
 
+       return m.SendBuf(txBuffer, isRts)
+}
+
+func (m *RMRClient) SendBuf(txBuffer *C.rmr_mbuf_t, isRts bool) bool {
+       var (
+               currBuffer  *C.rmr_mbuf_t
+               state       bool   = true
+               counterName string = "Transmitted"
+       )
+
        txBuffer.state = 0
-       currBuffer := txBuffer
        if isRts {
                currBuffer = C.rmr_rts_msg(m.context, txBuffer)
        } else {
                currBuffer = C.rmr_send_msg(m.context, txBuffer)
        }
 
-       if currBuffer != nil {
-               return currBuffer.state
+       if currBuffer == nil {
+               m.UpdateStatCounter("TransmitError")
+               return false
+       }
+
+       // Just quick retry seems to help for K8s issue
+       for j := 0; j < 3 && currBuffer != nil && currBuffer.state == C.RMR_ERR_RETRY; j++ {
+               if isRts {
+                       currBuffer = C.rmr_rts_msg(m.context, currBuffer)
+               } else {
+                       currBuffer = C.rmr_send_msg(m.context, currBuffer)
+               }
+       }
+
+       if currBuffer.state != C.RMR_OK {
+               state = false
+               counterName = "TransmitError"
        }
-       return -1
+
+       m.UpdateStatCounter(counterName)
+       m.Free(currBuffer)
+       return state
 }
 
 func (m *RMRClient) UpdateStatCounter(name string) {