X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fxapp-mgmt%2Fmsgs_proc.cc;h=067f1bf7a769b526dbbd700a75245d11009b9a8c;hb=3baf0b7442b45212ad859904fb061c3de4daef69;hp=3b5223d06ecae7a3d3f14776498708d452080852;hpb=b85024cd183a527cd8d61353637850cb6d30cf36;p=ric-app%2Fhw.git diff --git a/src/xapp-mgmt/msgs_proc.cc b/src/xapp-mgmt/msgs_proc.cc index 3b5223d..067f1bf 100644 --- a/src/xapp-mgmt/msgs_proc.cc +++ b/src/xapp-mgmt/msgs_proc.cc @@ -231,50 +231,121 @@ bool XappMsgHandler::decode_subscription_delete_response_failure(unsigned char* } -//For processing received messages. -void XappMsgHandler::operator()(rmr_mbuf_t *message, bool *resend){ +bool XappMsgHandler::a1_policy_handler(char * message, int *message_len, a1_policy_helper &helper){ - 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; + 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; } - 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; - - case (RIC_SUB_RESP): - //Received Subscription Response Message - decode_subscription_response(message->payload,message->len); - break; - - case (RIC_SUB_DEL_RESP): - decode_subscription_delete_response(message->payload,message->len); - break; - - case (RIC_SUB_FAILURE): - decode_subscription_response_failure(message->payload, message->len); - break; - - case (RIC_SUB_DEL_FAILURE): - decode_subscription_delete_response_failure(message->payload,message->len); - break; - // case A1_POLICY_REQ: - // break; - - - default: - *resend = false; - mdclog_write(MDCLOG_ERR, "Error :: Unknown message type %d received from RMR", message->mtype); - + //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(); + + // 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 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; + + case (RIC_SUB_RESP): + //Received Subscription Response Message + decode_subscription_response(message->payload,message->len); + break; + + case (RIC_SUB_DEL_RESP): + decode_subscription_delete_response(message->payload,message->len); + break; + + case (RIC_SUB_FAILURE): + decode_subscription_response_failure(message->payload, message->len); + break; + + case (RIC_SUB_DEL_FAILURE): + decode_subscription_delete_response_failure(message->payload,message->len); + break; + + case A1_POLICY_REQ: + + helper.handler_id = xapp_id; + 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; + + default: + { + *resend = false; + mdclog_write(MDCLOG_ERR, "Error :: Unknown message type %d received from RMR", message->mtype); + } + } - return; + return; };