X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fxapp-mgmt%2Fmsgs_proc.cc;h=06cc81ae6264f6b0f49706cc085ae98e0b2f2cc7;hb=6d677813b02deda27db8039ec0de86a5332caa1f;hp=d20ef76aa8d215e62c7d715c9cd032aa59ffd661;hpb=433b7b2a72c174c75ce2c0c75b225fa0bb813d32;p=ric-app%2Fhw.git diff --git a/src/xapp-mgmt/msgs_proc.cc b/src/xapp-mgmt/msgs_proc.cc index d20ef76..06cc81a 100644 --- a/src/xapp-mgmt/msgs_proc.cc +++ b/src/xapp-mgmt/msgs_proc.cc @@ -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. @@ -25,69 +25,11 @@ #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,138 @@ 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 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; + if( (me_id = (unsigned char *) malloc( sizeof( unsigned char ) * RMR_MAX_MEID )) == NULL ) { + mdclog_write(MDCLOG_ERR, "Error : %s, %d : malloc failed for me_id", __FILE__, __LINE__); + me_id = rmr_get_meid(message, NULL); + } else { + rmr_get_meid(message, me_id); + } + if(me_id == NULL){ + mdclog_write(MDCLOG_ERR, " Error :: %s, %d : rmr_get_meid failed me_id is NULL", __FILE__, __LINE__); + break; + } + mdclog_write(MDCLOG_INFO,"RMR Received MEID: %s",me_id); + if(_ref_sub_handler !=NULL){ + _ref_sub_handler->manage_subscription_response(message->mtype, reinterpret_cast< char const* >(me_id)); + } else { + mdclog_write(MDCLOG_ERR, " Error :: %s, %d : Subscription handler not assigned in message processor !", __FILE__, __LINE__); + } + *resend = false; + if (me_id != NULL) { + mdclog_write(MDCLOG_INFO, "Free RMR Received MEID memory: %s(0x%x)", me_id, me_id); + free(me_id); + } 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; };