EPIC ID: RICAPP-200 Upgrading rc version to 1.0.3 and fixing E2SM RC control structure
[ric-app/rc.git] / control / rcE2SmRc.go
1 package control
2
3 /*
4 #include <e2sm/wrapper.h>
5 #cgo LDFLAGS: -le2smwrapper -lm
6 #cgo CFLAGS: -I/usr/local/include/e2sm
7 */
8 import "C"
9
10 import (
11         "errors"
12         "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
13         "unsafe"
14         _ "log"
15         _"encoding/binary"
16         "encoding/hex"
17         "strings"
18         //"strconv"
19         "fmt"
20 )
21
22 type E2sm struct {
23 }
24
25 func (c *E2sm) SetRicControlHeader(buffer []byte, ueIdData *UEid, ricControlStyleType int64, ricControlActionID int64) (newBuffer []byte, err error) {
26
27         xapp.Logger.Info("SetRicControlHeader Enter \n")
28         cptr := unsafe.Pointer(&buffer[0])
29         //cptr_ueIDbuf := unsafe.Pointer(&ueIDbuf[0])
30
31         lplmnIdBuf := strings.Join(strings.Fields(ueIdData.pLMNIdentitybuf), "")
32         /*
33         lIntvar, _ := strconv.Atoi(lplmnIdBuf)
34         xapp.Logger.Info("lIntvar = %d\n", lIntvar)
35
36         lIntegerByte := ConverIntegerToByte(lIntvar)
37         //ml.MavLog(ml.INFO, lTransId, " lIntegerByte = %v\n", lIntegerByte)
38         xapp.Logger.Info(" lIntegerByte = %v\n", lIntegerByte)
39         lOutByte := get_bytepack_plmnId(lIntegerByte)
40         */
41         lOutByte, err := hex.DecodeString(lplmnIdBuf)
42         if err != nil {
43                 panic(err)
44         }
45         fmt.Println(lOutByte)
46         fmt.Printf("% x", lOutByte)
47         xapp.Logger.Info("lOutByte Len:%d\n", len(lOutByte))
48         xapp.Logger.Info("lOutByte = %02X\n", lOutByte)
49         cptrRanParameterValue := unsafe.Pointer(&lOutByte[0])
50         
51
52                 pLMNIdentity := C.CString(ueIdData.pLMNIdentitybuf)
53         defer C.free(unsafe.Pointer(pLMNIdentity))
54                 pLMNIdentity_size := C.size_t(len(ueIdData.pLMNIdentitybuf))
55                 aMFRegionID := C.CString(ueIdData.aMFRegionIDbuf)
56         defer C.free(unsafe.Pointer(aMFRegionID))
57                 aMFSetID := C.CString(ueIdData.aMFSetIDbuf)
58         defer C.free(unsafe.Pointer(aMFSetID))
59                 aMFPointer := C.CString(ueIdData.aMFPointerbuf)
60         defer C.free(unsafe.Pointer(aMFPointer))
61
62         uEID_C := C.struct_uEID{
63                 amf_UE_NGAP_Id: C.long(ueIdData.amf_UE_NGAP_Id),
64                 pLMNIdentity : pLMNIdentity,
65                 pLMNIdentity_size : pLMNIdentity_size,
66                 aMFRegionID : aMFRegionID,
67                 aMFRegionID_size : 1, //AMFRegionID ::= BIT STRING (SIZE(8))
68                 aMFSetID : aMFSetID,
69                 aMFSetID_size: 2, //BIT STRING (SIZE(10))
70                 aMFPointer : aMFPointer,
71                 aMFPointer_size : 1,  //BIT STRING (SIZE(6))
72         }
73
74         xapp.Logger.Debug("uEID_C amf_UE_NGAP_Id  = %l",uEID_C.amf_UE_NGAP_Id)
75         xapp.Logger.Debug("uEID_C pLMNIdentity = %s",uEID_C.pLMNIdentity)
76         xapp.Logger.Debug("uEID_C aMFRegionID %s = ",uEID_C.aMFRegionID)
77         xapp.Logger.Debug("uEID_C aMFSetID  %s = ",uEID_C.aMFSetID)
78         xapp.Logger.Debug("uEID_C aMFPointer %s = ",uEID_C.aMFPointer)
79
80         size := C.e2sm_encode_ric_control_header(cptr, C.size_t(len(buffer)),&uEID_C ,(*C.long)(&ueIdData.F1AP_id[0]),C.size_t(len(ueIdData.F1AP_id)),(*C.long)(&ueIdData.E1AP_id[0]),C.size_t(len(ueIdData.E1AP_id)),(C.long)(ricControlStyleType), (C.long)(ricControlActionID), cptrRanParameterValue,C.size_t(len(lOutByte)))
81
82         //size := C.e2sm_encode_ric_control_header(cptr, C.size_t(len(buffer)),&uEID_C ,(*C.long)(&ueIdData.F1AP_id[0]),(*C.long)(&ueIdData.E1AP_id[0]),(C.long)(ricControlStyleType), (C.long)(ricControlActionID))
83         
84         if size < 0 {
85                 return make([]byte, 0), errors.New("e2sm wrapper is unable to set EventTriggerDefinition due to wrong or invalid input")
86         }
87         newBuffer = C.GoBytes(cptr, (C.int(size)+7)/8)
88         xapp.Logger.Info("E2sm SetRicControlHeader is success")
89         return
90 }
91
92 func (c *E2sm) SetRicControlMessage(buffer []byte, targetPrimaryCell int64, targetCell int64, nrCGIOrECGI int64, nrOrEUtraCell int64, pLMNIdentitybuf string,NRcellIdbuf []byte) (newBuffer []byte, err error) {
93         
94         xapp.Logger.Info("SetRicControlMessagei Enter  ")
95         //lOutByte, err := hex.DecodeString(string(ranParameterValue))
96          lplmnIdBuf := strings.Join(strings.Fields(pLMNIdentitybuf), "")
97         //lOutByte, err := hex.DecodeString(lplmnIdBuf)
98         //if err != nil {
99           //      return 
100         //}
101         NRCGI:="00"+lplmnIdBuf+string(NRcellIdbuf)
102         lOutByte, _ := hex.DecodeString(NRCGI)
103         //tmp_plmn:=[]byte(lplmnIdBuf)
104         cptrRanParameterValue := unsafe.Pointer(&lOutByte[0])
105
106
107         cptr := unsafe.Pointer(&buffer[0])
108         //cptrRanParameterValue2 := unsafe.Pointer(&NRcellIdbuf[0])
109
110         /*
111         lIntvar, _ := strconv.Atoi(string(ranParameterValue))
112         xapp.Logger.Info("lIntvar %d\n", lIntvar)
113         lIntegerByte := ConverIntegerToByte(lIntvar)
114         xapp.Logger.Info("lIntegerByte %v\n", lIntegerByte)
115         lOutByte := get_bytepack_plmnId(lIntegerByte)
116         xapp.Logger.Info("lOutByte Len:%d\n", len(lOutByte))
117         xapp.Logger.Info("lOutByte %02X\n", lOutByte)
118         cptrRanParameterValue := unsafe.Pointer(&lOutByte[0])
119         xapp.Logger.Info("cptrRanParameterValue = %v\n ", cptrRanParameterValue)
120         */
121
122         size := C.e2sm_encode_ric_control_message(cptr, C.size_t(len(buffer)), C.long(targetPrimaryCell),
123                 C.long(targetCell), C.long(nrOrEUtraCell), C.long(nrCGIOrECGI), cptrRanParameterValue,C.size_t(len(lOutByte)))
124
125         if size < 0 {
126                 return make([]byte, 0), errors.New("e2sm wrapper is unable to set RicControlMessage due to wrong or invalid input")
127         }
128         newBuffer = C.GoBytes(cptr, (C.int(size)+7)/8) //TOCHECK: if C.int(size) is returning bits not bytes to get correct size of the buffer.
129         xapp.Logger.Info("E2sm SetRicControlMessage is success")
130         return
131 }
132
133 func (c *E2sm) GetControlOutcome(buffer []byte) (controlOutcome *ControlOutcomeMsg, err error) {
134         cptr := unsafe.Pointer(&buffer[0])
135         controlOutcome = &ControlOutcomeMsg{}
136         //lTransId := gTransIdDefVal
137         //ml.MavLog(ml.INFO, lTransId, "Decode Control Outcome: ")
138         xapp.Logger.Info("Decode Control Outcome: ")
139         decodedMsg := C.e2sm_decode_ric_call_process_outcome(cptr, C.size_t(len(buffer)))
140         defer C.e2sm_free_ric_call_process_outcome(decodedMsg)
141         if decodedMsg == nil {
142                 return controlOutcome, errors.New("e2sm wrapper is unable to get ControlOutcome due to wrong or invalid input")
143         }
144         //ml.MavLog(ml.INFO, lTransId, "Decoded Control Outcome: ")
145         controlOutcome.ControlOutcomeType = int32(decodedMsg.ric_controlOutcome_formats.present)
146         if controlOutcome.ControlOutcomeType == 1 {
147                 controlOutcome := &ControlOutcomeFormat1{}
148                 controlOutcomeFormat1_C := *(**C.E2SM_RC_ControlOutcome_Format1_t)(unsafe.Pointer(&decodedMsg.ric_controlOutcome_formats.choice[0]))
149                 controlOutcome.ControlOutcomeFormat1ItemCount = int(controlOutcomeFormat1_C.ranP_List.list.count)
150                 controlOutcome.ControlOutcomeFormat1Item = make([]ControlOutcomeFormat1ItemType, controlOutcome.ControlOutcomeFormat1ItemCount +1)
151                 //ml.MavLog(ml.INFO, lTransId, "RIC Control Outcome  Format1 Item Count = %d ", controlOutcome.ControlOutcomeFormat1ItemCount)
152                 for i := 0; i < controlOutcome.ControlOutcomeFormat1ItemCount; i++ {
153                         ControlOutcomeFormat1Item :=  &controlOutcome.ControlOutcomeFormat1Item[i]
154                         var sizeof_E2SM_RC_ControlOutcome_Format1_Item_t *C.E2SM_RC_ControlOutcome_Format1_Item_t
155                         ControlOutcomeFormat1Item_C :=  *(*(**C.E2SM_RC_ControlOutcome_Format1_Item_t)(unsafe.Pointer(uintptr(unsafe.Pointer(controlOutcomeFormat1_C.ranP_List.list.array)) + (uintptr)(i)*unsafe.Sizeof(sizeof_E2SM_RC_ControlOutcome_Format1_Item_t))))
156                         ControlOutcomeFormat1Item.RanParameterID = int64(ControlOutcomeFormat1Item_C.ranParameter_ID)
157                         ControlOutcomeFormat1Item.RANParameterValueType = int(ControlOutcomeFormat1Item_C.ranParameter_value.present)
158                         ranParameterValue_C := (C.RANParameter_Value_t)(ControlOutcomeFormat1Item_C.ranParameter_value)
159                         if ControlOutcomeFormat1Item.RANParameterValueType == 5 {
160                                 //ml.MavLog(ml.INFO, lTransId, "RANParameterValueType  is RANParameter_Value_PR_valueOctS")
161                                 ranParameterValue := &OctetString{}
162                                 ranParameter_C := (*C.OCTET_STRING_t)(unsafe.Pointer(&ranParameterValue_C.choice[0]))
163                                 ranParameterValue.Size = int(ranParameter_C.size)
164                                 ranParameterValue.Buf = C.GoBytes(unsafe.Pointer(ranParameter_C.buf), C.int(ranParameter_C.size))
165                                 ControlOutcomeFormat1Item.RANParameterValue = ranParameterValue
166                                 //ml.MavLog(ml.INFO, lTransId, "RANParameterValue = ", ControlOutcomeFormat1Item.RANParameterValue)
167                         }
168                 }
169         } else {
170                 return controlOutcome, errors.New("Unknown RIC Control Outcome type")
171         }
172         return controlOutcome , err
173 }
174
175 func (c *E2sm) get_plmn_from_mcc_mnc(plmnIdBuf []byte)(bytePackedPlmnId []uint8) {
176         //lTransId := gTransIdDefVal
177         hexResp, _ := hex.DecodeString(string(plmnIdBuf))
178         //ml.MavLog(ml.INFO, lTransId, "get_plmn_from_mcc_mnc plmnIdBuf and hexResp = ", plmnIdBuf,hexResp)
179         var mcc []uint8 = make([]uint8, 3)
180         var mnc []uint8 = make([]uint8, 3)
181
182         mcc[0] = hexResp[0] >> 4
183         mcc[1] = hexResp[0] & 0xf
184         mcc[2] = hexResp[1] >> 4
185         mnc[0] = hexResp[1] & 0xf
186         mnc[1] = hexResp[2] >> 4
187         mnc[2] = hexResp[2] & 0xf
188
189         var tmpPlmnId []uint8 = make([]uint8, 6)
190         tmpPlmnId[0] = mcc[0]
191         tmpPlmnId[1] =  mcc[1]
192         tmpPlmnId[2] =  mcc[2]
193       if len(mcc) == 2 {
194                 tmpPlmnId[3] = 0x0f
195                 tmpPlmnId[4] = mnc[0]
196                 tmpPlmnId[5] = mnc[1]
197         } else {
198                 tmpPlmnId[3] = mnc[0]
199                 tmpPlmnId[4] = mnc[1]
200                 tmpPlmnId[5] = mnc[2]
201         }
202         //ml.MavLog(ml.INFO, lTransId, "\n tmpPlmnId " , tmpPlmnId)
203         bytePackedPlmnId = make([]uint8,3)
204         bytePackedPlmnId[0] = ((tmpPlmnId[1] & 0x0F) << 4) | (tmpPlmnId[0] & 0x0F)
205         bytePackedPlmnId[1] = ((tmpPlmnId[3] & 0x0F) << 4) | (tmpPlmnId[2] & 0x0F)
206         bytePackedPlmnId[2] = ((tmpPlmnId[5] & 0x0F) << 4) | (tmpPlmnId[4] & 0x0F)
207         //ml.MavLog(ml.INFO, lTransId, "\n bytePackedPlmnId " , bytePackedPlmnId)
208         return
209 }
210