A1 Message Handler update
[ric-app/hw.git] / src / xapp-mgmt / msgs_proc.cc
index d20ef76..99eb453 100644 (file)
@@ -1,7 +1,7 @@
 /*
 ==================================================================================
 
-        Copyright (c) 2018-2019 AT&T Intellectual Property.
+        Copyright (c) 2019-2020 AT&T Intellectual Property.
 
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
 
 #include "msgs_proc.hpp"
 
-//sending messages are encoded.
-bool XappMsgHandler::encode_subscription_request(unsigned char* buffer, size_t *buf_len)
-{
-       int request_id = 2; // will be over-written by subscription handler
-       int req_seq = 1;
-       int function_id = 0;
-       int action_id = 1;
-       int action_type = 0;
-       int subsequent_action = 0; // continue
-       int time_to_wait = 4; // 10ms
-
-       int message_type = 1;
-       int procedure_code = 27;
-       std::string egnb_id = "Testgnb";
-       std::string plmn_id = "Testplmn";
-
-       unsigned char event_buf[128];
-       size_t event_buf_len = 128;
-       bool res;
-
-
-       e2sm_event_trigger_helper trigger_data;
-       e2sm_event_trigger event_trigger;
-
-       trigger_data.egNB_id = egnb_id;
-       trigger_data.plmn_id = plmn_id;
-       trigger_data.egNB_id_type = 2;
-       trigger_data.interface_direction = 1;
-       trigger_data.procedure_code = procedure_code;
-       trigger_data.message_type = message_type;
-       //======================================================
-
-       // Encode the event trigger definition
-       res = event_trigger.encode_event_trigger(&event_buf[0], &event_buf_len, trigger_data);
-       if (!res){
-               mdclog_write(MDCLOG_ERR, "Error : %s, %d: Could not encode subscription Request. Reason = %s\n", __FILE__, __LINE__, event_trigger.get_error().c_str());
-               return false;
-       }
-       mdclog_write(MDCLOG_INFO, "Encoded event trigger definition into PDU of size %lu bytes\n", event_buf_len);
-
-
-       // create the subscription
-       subscription_helper subscr_req;
-       subscription_request e2ap_sub_req;
 
-       subscr_req.clear();
-       subscr_req.set_request(request_id, req_seq);
-       subscr_req.set_function_id(function_id);
-       subscr_req.add_action(action_id, action_type, "", subsequent_action, time_to_wait);
-
-       subscr_req.set_event_def(&event_buf[0], event_buf_len);
-       // generate the request pdu
-       res = e2ap_sub_req.encode_e2ap_subscription(&buffer[0], buf_len, subscr_req);
-       if(! res){
-               mdclog_write(MDCLOG_ERR, "%s, %d: Error encoding subscription pdu. Reason = ", __FILE__, __LINE__);
-               return false;
-       }
-       return true;
-}
 bool XappMsgHandler::encode_subscription_delete_request(unsigned char* buffer, size_t *buf_len){
 
        subscription_helper sub_helper;
-       sub_helper.set_request(0, 0); // requirement of subscription manager ... ?
+       sub_helper.set_request(0); // requirement of subscription manager ... ?
        sub_helper.set_function_id(0);
 
        subscription_delete e2ap_sub_req_del;
@@ -106,51 +48,21 @@ bool XappMsgHandler::encode_subscription_delete_request(unsigned char* buffer, s
 
 bool XappMsgHandler::decode_subscription_response(unsigned char* data_buf, size_t data_size){
 
+       subscription_helper subhelper;
+       subscription_response subresponse;
        bool res = true;
-       E2N_E2AP_PDU_t *e2pdu = 0;
-
-       asn_dec_rval_t rval;
-
-       ASN_STRUCT_RESET(asn_DEF_E2N_E2AP_PDU, e2pdu);
-
-       rval = asn_decode(0,ATS_ALIGNED_BASIC_PER, &asn_DEF_E2N_E2AP_PDU, (void**)&e2pdu, data_buf, data_size);
-       switch(rval.code)
-       {
-               case RC_OK:
-                         //Put in Subscription Response Object.
-                          asn_fprint(stdout, &asn_DEF_E2N_E2AP_PDU, e2pdu);
-
-                          break;
-               case RC_WMORE:
-                               mdclog_write(MDCLOG_ERR, "RC_WMORE");
-                               res = false;
-                               break;
-               case RC_FAIL:
-                               mdclog_write(MDCLOG_ERR, "RC_FAIL");
-                               res = false;
-                               break;
-               default:
-                               break;
-        }
-       ASN_STRUCT_FREE(asn_DEF_E2N_E2AP_PDU, e2pdu);
-       return res;
-
-}
-bool XappMsgHandler::decode_subscription_delete_response(unsigned char* data_buf, size_t data_size){
-
-       bool res = true;
-       E2N_E2AP_PDU_t *e2pdu = 0;
+       E2AP_PDU_t *e2pdu = 0;
 
        asn_dec_rval_t rval;
 
-       ASN_STRUCT_RESET(asn_DEF_E2N_E2AP_PDU, e2pdu);
+       ASN_STRUCT_RESET(asn_DEF_E2AP_PDU, e2pdu);
 
-       rval = asn_decode(0,ATS_ALIGNED_BASIC_PER, &asn_DEF_E2N_E2AP_PDU, (void**)&e2pdu, data_buf, data_size);
+       rval = asn_decode(0,ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, (void**)&e2pdu, data_buf, data_size);
        switch(rval.code)
        {
                case RC_OK:
-                         //Put in Subscription Delete Response Object.
-                          asn_fprint(stdout, &asn_DEF_E2N_E2AP_PDU, e2pdu);
+                          //Put in Subscription Response Object.
+                          //asn_fprint(stdout, &asn_DEF_E2AP_PDU, e2pdu);
                           break;
                case RC_WMORE:
                                mdclog_write(MDCLOG_ERR, "RC_WMORE");
@@ -163,119 +75,126 @@ bool XappMsgHandler::decode_subscription_delete_response(unsigned char* data_buf
                default:
                                break;
         }
-       ASN_STRUCT_FREE(asn_DEF_E2N_E2AP_PDU, e2pdu);
+       ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, e2pdu);
        return res;
 
 }
-bool XappMsgHandler::decode_subscription_response_failure(unsigned char* data_buf, size_t data_size){
-
-       bool res = true;
-       E2N_E2AP_PDU_t *e2pdu = 0;
 
-       asn_dec_rval_t rval;
+bool  XappMsgHandler::a1_policy_handler(char * message, int *message_len, a1_policy_helper &helper){
 
-       ASN_STRUCT_RESET(asn_DEF_E2N_E2AP_PDU, e2pdu);
+  rapidjson::Document doc;
+  if (doc.Parse(message).HasParseError()){
+    mdclog_write(MDCLOG_ERR, "Error: %s, %d :: Could not decode A1 JSON message %s\n", __FILE__, __LINE__, message);
+    return false;
+  }
 
-       rval = asn_decode(0,ATS_ALIGNED_BASIC_PER, &asn_DEF_E2N_E2AP_PDU, (void**)&e2pdu, data_buf, data_size);
-       switch(rval.code)
-       {
-               case RC_OK:
-                         //Extract Subscription Response Failure.
-                          asn_fprint(stdout, &asn_DEF_E2N_E2AP_PDU, e2pdu);
-                          break;
-               case RC_WMORE:
-                               mdclog_write(MDCLOG_ERR, "RC_WMORE");
-                               res = false;
-                               break;
-               case RC_FAIL:
-                               mdclog_write(MDCLOG_ERR, "RC_FAIL");
-                               res = false;
-                               break;
-               default:
+  //Extract Operation
+  rapidjson::Pointer temp1("/operation");
+    rapidjson::Value * ref1 = temp1.Get(doc);
+    if (ref1 == NULL){
+      mdclog_write(MDCLOG_ERR, "Error : %s, %d:: Could not extract policy type id from %s\n", __FILE__, __LINE__, message);
+      return false;
+    }
+
+   helper.operation = ref1->GetString();
+
+  // Extract policy id type
+  rapidjson::Pointer temp2("/policy_type_id");
+  rapidjson::Value * ref2 = temp2.Get(doc);
+  if (ref2 == NULL){
+    mdclog_write(MDCLOG_ERR, "Error : %s, %d:: Could not extract policy type id from %s\n", __FILE__, __LINE__, message);
+    return false;
+  }
+   //helper.policy_type_id = ref2->GetString();
+    helper.policy_type_id = to_string(ref2->GetInt());
+
+    // Extract policy instance id
+    rapidjson::Pointer temp("/policy_instance_id");
+    rapidjson::Value * ref = temp.Get(doc);
+    if (ref == NULL){
+      mdclog_write(MDCLOG_ERR, "Error : %s, %d:: Could not extract policy type id from %s\n", __FILE__, __LINE__, message);
+      return false;
+    }
+    helper.policy_instance_id = ref->GetString();
+
+    if (helper.policy_type_id == "1" && helper.operation == "CREATE"){
+       helper.status = "OK";
+       Document::AllocatorType& alloc = doc.GetAllocator();
+
+       Value handler_id;
+       handler_id.SetString(helper.handler_id.c_str(), helper.handler_id.length(), alloc);
+
+       Value status;
+       status.SetString(helper.status.c_str(), helper.status.length(), alloc);
+
+
+       doc.AddMember("handler_id", handler_id, alloc);
+       doc.AddMember("status",status, alloc);
+       doc.RemoveMember("operation");
+       StringBuffer buffer;
+       Writer<StringBuffer> writer(buffer);
+       doc.Accept(writer);
+       strncpy(message,buffer.GetString(), buffer.GetLength());
+       *message_len = buffer.GetLength();
+       return true;
+    }
+    return false;
+ }
+
+
+//For processing received messages.XappMsgHandler should mention if resend is required or not.
+void XappMsgHandler::operator()(rmr_mbuf_t *message, bool *resend){
+
+       if (message->len > MAX_RMR_RECV_SIZE){
+               mdclog_write(MDCLOG_ERR, "Error : %s, %d, RMR message larger than %d. Ignoring ...", __FILE__, __LINE__, MAX_RMR_RECV_SIZE);
+               return;
+       }
+       a1_policy_helper helper;
+       bool res=false;
+       switch(message->mtype){
+               //need to fix the health check.
+               case (RIC_HEALTH_CHECK_REQ):
+                               message->mtype = RIC_HEALTH_CHECK_RESP;        // if we're here we are running and all is ok
+                               message->sub_id = -1;
+                               strncpy( (char*)message->payload, "HELLOWORLD OK\n", rmr_payload_size( message) );
+                               *resend = true;
                                break;
-        }
-       ASN_STRUCT_FREE(asn_DEF_E2N_E2AP_PDU, e2pdu);
-       return res;
-
-}
 
-bool XappMsgHandler::decode_subscription_delete_response_failure(unsigned char* data_buf, size_t data_size){
-
-       bool res = true;
-       E2N_E2AP_PDU_t *e2pdu = 0;
-
-       asn_dec_rval_t rval;
-
-       ASN_STRUCT_RESET(asn_DEF_E2N_E2AP_PDU, e2pdu);
-
-       rval = asn_decode(0,ATS_ALIGNED_BASIC_PER, &asn_DEF_E2N_E2AP_PDU, (void**)&e2pdu, data_buf, data_size);
-       switch(rval.code)
-       {
-               case RC_OK:
-                         //Extract Subscription Delete Response Failure.
-                          asn_fprint(stdout, &asn_DEF_E2N_E2AP_PDU, e2pdu);
+               case (RIC_SUB_RESP):
+                       mdclog_write(MDCLOG_INFO, "Received subscription message of type = %d", message->mtype);
+                               unsigned char *me_id;
+                               rmr_get_meid(message, me_id);
+                               mdclog_write(MDCLOG_INFO,"RMR Received MEID: %s",me_id);
+
+                               if(_ref_sub_handler !=NULL){
+                                       _ref_sub_handler->manage_subscription_response(message->mtype, me_id);
+                               } else {
+                                       mdclog_write(MDCLOG_ERR, " Error :: %s, %d : Subscription handler not assigned in message processor !", __FILE__, __LINE__);
+                               }
+                               *resend = false;
                                break;
-               case RC_WMORE:
-                               mdclog_write(MDCLOG_ERR, "RC_WMORE");
-                               res = false;
-                               break;
-               case RC_FAIL:
-                               mdclog_write(MDCLOG_ERR, "RC_FAIL");
-                               res = false;
-                               break;
-               default:
-                               break;
-        }
-       ASN_STRUCT_FREE(asn_DEF_E2N_E2AP_PDU, e2pdu);
-       return res;
 
-}
+       case A1_POLICY_REQ:
 
-//For processing received messages.
-rmr_mbuf_t * XappMsgHandler::operator()(rmr_mbuf_t *message){
+                   mdclog_write(MDCLOG_INFO, "In Message Handler: Received A1_POLICY_REQ.");
+                       helper.handler_id = xapp_id;
 
-  if (message->len > MAX_RMR_RECV_SIZE){
-    mdclog_write(MDCLOG_ERR, "Error : %s, %d, RMR message larger than %d. Ignoring ...", __FILE__, __LINE__, MAX_RMR_RECV_SIZE);
-    return message;
-  }
-
-  switch(message->mtype){
-         //need to fix the health check.
-         case (RIC_HEALTH_CHECK_REQ):
-               message->mtype = RIC_HEALTH_CHECK_RESP;        // if we're here we are running and all is ok
-           message->sub_id = -1;
-         break;
-
-         case (RIC_SUB_RESP):
-               //Received Subscription Response Message
-               decode_subscription_response(message->payload,message->len);
-           message = NULL;
-         break;
-
-         case (RIC_SUB_DEL_RESP):
-               decode_subscription_delete_response(message->payload,message->len);
-               message = NULL;
-         break;
-
-         case (RIC_SUB_FAILURE):
-               decode_subscription_response_failure(message->payload, message->len);
-           message = NULL;
-      break;
+                       res = a1_policy_handler((char*)message->payload, &message->len, helper);
+                       if(res){
+                               message->mtype = A1_POLICY_RESP;        // if we're here we are running and all is ok
+                               message->sub_id = -1;
+                               *resend = true;
+                       }
+                       break;
 
-         case (RIC_SUB_DEL_FAILURE):
-               decode_subscription_delete_response_failure(message->payload,message->len);
-           message = NULL;
-         break;
-         //  case A1_POLICY_REQ:
-        // break;
-
-
-  default:
-    mdclog_write(MDCLOG_ERR, "Error :: Unknown message type %d received from RMR", message->mtype);
-
-  }
+       default:
+               {
+                       mdclog_write(MDCLOG_ERR, "Error :: Unknown message type %d received from RMR", message->mtype);
+                       *resend = false;
+               }
+       }
 
-  return message;
+       return;
 
 };