Control Message Encode/Decode
[ric-app/hw.git] / src / xapp-asn / e2ap / e2ap_indication.hpp
index 4848598..48051db 100644 (file)
@@ -19,7 +19,7 @@
 */
 
 /*
- * indication.hpp
+ * e2ap_indication.hpp
  *
  *  Created on: Sep 18, 2020
  *      Author: Shraboni Jana
@@ -66,15 +66,13 @@ RICindication-IEs E2AP-PROTOCOL-IES ::= {
 #include <sstream>
 #include <memory>
 
-#define IE_SIZE ((int)128)
+#include "e2ap_consts.hpp"
 
 template <typename E2SMIndicationHeader, typename E2SMIndicationMessage>
 class E2APIndication{
 
 public:
-       E2APIndication();
-       E2APIndication(unsigned char *, size_t *, bool&);
-       ~E2APIndication(void);
+
        class IndicationIEs{
                private:
                        long int ricRequestorID, ranFunctionID, ricActionID, ricIndicationSN, ricIndicationType;
@@ -87,28 +85,58 @@ public:
                        unsigned char ricCallProcessId[IE_SIZE];
                        size_t ricCallProcessId_size = IE_SIZE;
 
+                       bool is_callProcessID, is_ricIndicationSN;
+
                public:
-                       IndicationIEs(void) : ricRequestorID(0), ranFunctionID(0), ricActionID(0),ricIndicationSN(0), ricIndicationType(0){};
+                       IndicationIEs(void) : ricRequestorID(0), ranFunctionID(0), ricActionID(0),ricIndicationSN(0), ricIndicationType(0),is_callProcessID(false),is_ricIndicationSN(false){};
                        void* get_ricIndicationMessage(){return this->ricIndicationMessage; };
                        void* get_ricIndicationHeader(){return this->ricIndicationHeader; };
                        void* get_ricCallProcessId(){return this->ricCallProcessId;};
 
-                       size_t get_ricIndicationMessageSize(){return this->ricIndicationMessage_size; };
-                       size_t get_ricIndicationHeaderSize(){return this->ricIndicationHeader_size; };
-                       size_t get_ricCallProcessIdSize(){return this->ricCallProcessId_size;};
+                       size_t get_ricIndicationMessage_size(){return this->ricIndicationMessage_size; };
+                       size_t get_ricIndicationHeader_size(){return this->ricIndicationHeader_size; };
+                       size_t get_ricCallProcessId_size(){return this->ricCallProcessId_size;};
 
                        long int get_ricRequestorID(){return this->ricRequestorID;};
                        long int get_ranFunctionID(){return this->ranFunctionID;};
                        long int get_ricActionID(){return this->ricActionID;};
+                       long int get_ricIndicationType(){return this->ricIndicationType;}
                        long int get_ricIndicationSN(){return this->ricIndicationSN;};
+                       bool get_is_ricIndicationSN(){return this->is_ricIndicationSN;};
+                       bool get_is_callProcessID(){return this->is_callProcessID;};
+
+                       IndicationIEs& set_ricIndicationHeader(E2SMIndicationHeader e2smObj){
+                               bool res = e2smObj.encode(&(this->ricIndicationHeader)[0],&this->ricIndicationHeader_size);
+                               if(!res){
+                                               mdclog_write(MDCLOG_ERR, "Failed to encode: %s","RIC Indication Header");
+                                               mdclog_write(MDCLOG_ERR, "Error during encode: %s",e2smObj.get_error());
+
+                                       } else {
+                                                mdclog_write(MDCLOG_INFO, "Successfully encoded: %s","RIC Indication Header");
+                               }
+                                       return *this;
+                       }
+                       IndicationIEs& set_ricIndicationMessage(E2SMIndicationMessage e2smObj){
+                               bool res = e2smObj.encode(&(this->ricIndicationMessage)[0],&this->ricIndicationMessage_size);
+                               if(!res){
+                                                       mdclog_write(MDCLOG_ERR, "Failed to encode: %s","RIC Indication Message");
+                                                       mdclog_write(MDCLOG_ERR, "Error during encode: %s",e2smObj.get_error());
+                                               } else {
+                                                   mdclog_write(MDCLOG_INFO, "Successfully encoded: %s","RIC Indication Message");
+                                               }
+
+                               return *this;
 
-                       IndicationIEs& set_ricIndicationHeader(unsigned char* header, size_t header_size){
-                               memcpy(ricIndicationHeader,header,header_size); ricIndicationHeader_size = header_size; return *this;
                        }
+
+                       IndicationIEs& set_ricIndicationHeader(unsigned char* header, size_t header_size){
+                                                       memcpy(ricIndicationHeader,header,header_size); ricIndicationHeader_size = header_size; return *this;
+                                               }
                        IndicationIEs& set_ricIndicationMessage(unsigned char* message, size_t message_size){
-                               memcpy(ricIndicationHeader,message,message_size); ricIndicationMessage_size = message_size; return *this;}
+                                                       memcpy(ricIndicationHeader,message,message_size); ricIndicationMessage_size = message_size; return *this;}
 
                        IndicationIEs& set_ricCallProcessID(unsigned char* callproc, size_t callproc_size){
+                               is_callProcessID = true;
                                memcpy(ricCallProcessId, callproc, callproc_size); ricCallProcessId_size = callproc_size;
                                return *this;
                        }
@@ -117,11 +145,14 @@ public:
                        IndicationIEs& set_ranFunctionID(long int funcID){this->ranFunctionID = funcID; return *this;}
                        IndicationIEs& set_ricActionID(long int actID){ this->ricActionID = actID; return *this;}
                        IndicationIEs& set_ricIndicationType(long int typ){ this->ricIndicationType = typ; return *this;}
-                       IndicationIEs& set_ricIndicationSN(long int sn){ this->ricIndicationSN = sn; return *this;}
+                       IndicationIEs& set_ricIndicationSN(long int sn){ this->ricIndicationSN = sn; is_ricIndicationSN=true; return *this;}
 
 
        };
 
+   E2APIndication(IndicationIEs&);
+   E2APIndication(unsigned char *, size_t *);
+  ~E2APIndication(void);
   IndicationIEs getIndicationIEs(){ return *_indicationIEs.get(); }
 
   std::string get_error(void) const {return _error_string ; };
@@ -135,8 +166,6 @@ private:
   RICindication_IEs_t *IE_array;
   std::unique_ptr<IndicationIEs> _indicationIEs;
 
-  unsigned int ricIndicationIEs_Count;
-
   std::string _error_string;
   char _errbuf[128];
   size_t _errbuf_len = 128;
@@ -145,9 +174,7 @@ private:
 };
 
 template<typename T1, typename T2>
-E2APIndication<T1,T2>::E2APIndication(){
-
-  ricIndicationIEs_Count = 8;
+E2APIndication<T1,T2>::E2APIndication(IndicationIEs& ieObj){
 
   e2ap_pdu_obj = 0;
   e2ap_pdu_obj = (E2AP_PDU_t * )calloc(1, sizeof(E2AP_PDU_t));
@@ -158,24 +185,26 @@ E2APIndication<T1,T2>::E2APIndication(){
   assert(initMsg != 0);
 
   IE_array = 0;
-  IE_array = (RICindication_IEs_t *)calloc(ricIndicationIEs_Count, sizeof(RICindication_IEs_t));
+  IE_array = (RICindication_IEs_t *)calloc(RIC_INDICATION_IES_COUNT, sizeof(RICindication_IEs_t));
   assert(IE_array != 0);
 
   e2ap_pdu_obj->present = E2AP_PDU_PR_initiatingMessage;
   e2ap_pdu_obj->choice.initiatingMessage = initMsg;
 
   _indicationIEs = std::make_unique<IndicationIEs>();
+  *_indicationIEs = ieObj;
 
 };
 template<typename T1, typename T2>
-E2APIndication<T1,T2>::E2APIndication(unsigned char *buf, size_t *size, bool &status){
+E2APIndication<T1,T2>::E2APIndication(unsigned char *buf, size_t *size){
          e2ap_pdu_obj = 0;
          initMsg = 0;
          IE_array = 0;
 
          _indicationIEs = std::make_unique<IndicationIEs>();
-          status =  this->decode(buf, size);
-
+          bool status =  this->decode(buf, size);
+          if(!status)
+                  throw "E2AP Indication Decode Failed: "+this->get_error();
 }
 
 
@@ -331,77 +360,79 @@ bool E2APIndication<T1,T2>::setfields(InitiatingMessage_t *initMsg){
   ies_ricreq->id = ProtocolIE_ID_id_RICrequestID;
   ies_ricreq->value.present = RICindication_IEs__value_PR_RICrequestID;
   RICrequestID_t *ricrequest_ie = &ies_ricreq->value.choice.RICrequestID;
-  ricrequest_ie->ricRequestorID = _indicationIEs->ricRequestorID;
+  ricrequest_ie->ricRequestorID = _indicationIEs->get_ricRequestorID();
   ASN_SEQUENCE_ADD(&(ric_indication->protocolIEs), &(IE_array[ie_index]));
 
-  ie_index = 1;
+  ie_index++;
   RICindication_IEs_t *ies_ranfunc = &IE_array[ie_index];
   ies_ranfunc->criticality = Criticality_reject;
   ies_ranfunc->id = ProtocolIE_ID_id_RANfunctionID;
   ies_ranfunc->value.present = RICindication_IEs__value_PR_RANfunctionID;
   RANfunctionID_t *ranfunction_ie = &ies_ranfunc->value.choice.RANfunctionID;
-  *ranfunction_ie = _indicationIEs->ranFunctionID;
+  *ranfunction_ie = _indicationIEs->get_ranFunctionID();
   ASN_SEQUENCE_ADD(&(ric_indication->protocolIEs), &(IE_array[ie_index]));
 
-  ie_index = 2;
+  ie_index++;
   RICindication_IEs_t *ies_actid = &IE_array[ie_index];
   ies_actid->criticality = Criticality_reject;
   ies_actid->id = ProtocolIE_ID_id_RICactionID;
   ies_actid->value.present = RICindication_IEs__value_PR_RICactionID;
   RICactionID_t *ricaction_ie = &ies_actid->value.choice.RICactionID;
-  *ricaction_ie = _indicationIEs->ricActionID;
-  ASN_SEQUENCE_ADD(&(ric_indication->protocolIEs), &(IE_array[ie_index]));
-
-  ie_index = 3;
-  RICindication_IEs_t *ies_ricsn = &IE_array[ie_index];
-  ies_ricsn->criticality = Criticality_reject;
-  ies_ricsn->id = ProtocolIE_ID_id_RICindicationSN;
-  ies_ricsn->value.present = RICindication_IEs__value_PR_RICindicationSN;
-  RICindicationSN_t *ricsn_ie = &ies_ricsn->value.choice.RICindicationSN;
-  *ricsn_ie = _indicationIEs->ricIndicationSN;
+  *ricaction_ie = _indicationIEs->get_ricActionID();
   ASN_SEQUENCE_ADD(&(ric_indication->protocolIEs), &(IE_array[ie_index]));
 
+  if(_indicationIEs->get_is_ricIndicationSN())
+  {
+         ie_index++;
+         RICindication_IEs_t *ies_ricsn = &IE_array[ie_index];
+         ies_ricsn->criticality = Criticality_reject;
+         ies_ricsn->id = ProtocolIE_ID_id_RICindicationSN;
+         ies_ricsn->value.present = RICindication_IEs__value_PR_RICindicationSN;
+         RICindicationSN_t *ricsn_ie = &ies_ricsn->value.choice.RICindicationSN;
+         *ricsn_ie = _indicationIEs->get_ricIndicationSN();
+         ASN_SEQUENCE_ADD(&(ric_indication->protocolIEs), &(IE_array[ie_index]));
+  }
 
-  ie_index = 4;
+  ie_index++;
   RICindication_IEs_t *ies_indtyp = &IE_array[ie_index];
   ies_indtyp->criticality = Criticality_reject;
   ies_indtyp->id = ProtocolIE_ID_id_RICindicationType;
   ies_indtyp->value.present = RICindication_IEs__value_PR_RICindicationType;
   RICindicationType_t *rictype_ie = &ies_indtyp->value.choice.RICindicationType;
-  *rictype_ie = _indicationIEs->ricIndicationType;
+  *rictype_ie = _indicationIEs->get_ricIndicationType();
   ASN_SEQUENCE_ADD(&(ric_indication->protocolIEs), &(IE_array[ie_index]));
 
-  ie_index = 5;
+  ie_index++;
   RICindication_IEs_t *ies_richead = &IE_array[ie_index];
   ies_richead->criticality = Criticality_reject;
   ies_richead->id = ProtocolIE_ID_id_RICindicationHeader;
   ies_richead->value.present = RICindication_IEs__value_PR_RICindicationHeader;
   RICindicationHeader_t *richeader_ie = &ies_richead->value.choice.RICindicationHeader;
-  richeader_ie->buf = _indicationIEs->ricIndicationHeader;
-  richeader_ie->size = _indicationIEs->ricIndicationHeader_size;
+  richeader_ie->buf = (uint8_t*)_indicationIEs->get_ricIndicationHeader();
+  richeader_ie->size = _indicationIEs->get_ricIndicationHeader_size();
   ASN_SEQUENCE_ADD(&(ric_indication->protocolIEs), &(IE_array[ie_index]));
 
-  ie_index = 6;
+  ie_index++;
   RICindication_IEs_t *ies_indmsg = &IE_array[ie_index];
   ies_indmsg->criticality = Criticality_reject;
   ies_indmsg->id = ProtocolIE_ID_id_RICindicationMessage;
   ies_indmsg->value.present = RICindication_IEs__value_PR_RICindicationMessage;
   RICindicationMessage_t *ricmsg_ie = &ies_indmsg->value.choice.RICindicationMessage;
-  ricmsg_ie->buf = _indicationIEs->ricIndicationMessage;
-  ricmsg_ie->size = _indicationIEs->ricIndicationMessage_size;
+  ricmsg_ie->buf = (uint8_t*)_indicationIEs->get_ricIndicationMessage();
+  ricmsg_ie->size = _indicationIEs->get_ricIndicationMessage_size();
   ASN_SEQUENCE_ADD(&(ric_indication->protocolIEs), &(IE_array[ie_index]));
 
 
   // optional call process id ..
-  if (_indicationIEs->call_process_id_size > 0){
-    ie_index = 7;
+  if (_indicationIEs->get_is_callProcessID()){
+    ie_index++;
     RICindication_IEs_t *ies_ind_callprocessid = &IE_array[ie_index];
     ies_ind_callprocessid->criticality = Criticality_reject;
     ies_ind_callprocessid->id = ProtocolIE_ID_id_RICcallProcessID;
     ies_ind_callprocessid->value.present = RICindication_IEs__value_PR_RICcallProcessID;
     RICcallProcessID_t *riccallprocessid_ie = &ies_ind_callprocessid->value.choice.RICcallProcessID;
-    riccallprocessid_ie->buf = _indicationIEs->call_process_id;
-    riccallprocessid_ie->size = _indicationIEs->call_process_id_size;
+    riccallprocessid_ie->buf = (uint8_t*)_indicationIEs->get_ricCallProcessId();
+    riccallprocessid_ie->size = _indicationIEs->get_ricCallProcessId_size();
     ASN_SEQUENCE_ADD(&(ric_indication->protocolIEs), &(IE_array[ie_index]));
   }