2 ==================================================================================
4 Copyright (c) 2019-2020 AT&T Intellectual Property.
6 Licensed under the Apache License, Version 2.0 (the "License");
7 you may not use this file except in compliance with the License.
8 You may obtain a copy of the License at
10 http://www.apache.org/licenses/LICENSE-2.0
12 Unless required by applicable law or agreed to in writing, software
13 distributed under the License is distributed on an "AS IS" BASIS,
14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 See the License for the specific language governing permissions and
16 limitations under the License.
17 ==================================================================================
22 * Author: Ashwin Shridharan, Shraboni Jana
26 #include "msgs_proc.hpp"
29 bool XappMsgHandler::decode_subscription_response(unsigned char* data_buf, size_t data_size){
31 subscription_helper subhelper;
32 subscription_response subresponse;
34 E2AP_PDU_t *e2pdu = 0;
38 ASN_STRUCT_RESET(asn_DEF_E2AP_PDU, e2pdu);
40 rval = asn_decode(0,ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, (void**)&e2pdu, data_buf, data_size);
44 //Put in Subscription Response Object.
45 //asn_fprint(stdout, &asn_DEF_E2AP_PDU, e2pdu);
48 mdclog_write(MDCLOG_ERR, "RC_WMORE");
52 mdclog_write(MDCLOG_ERR, "RC_FAIL");
58 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, e2pdu);
63 bool XappMsgHandler::a1_policy_handler(char * message, int *message_len, a1_policy_helper &helper){
65 rapidjson::Document doc;
66 if (doc.Parse<kParseStopWhenDoneFlag>(message).HasParseError()){
67 mdclog_write(MDCLOG_ERR, "Error: %s, %d :: Could not decode A1 JSON message %s\n", __FILE__, __LINE__, message);
72 rapidjson::Pointer temp1("/operation");
73 rapidjson::Value * ref1 = temp1.Get(doc);
75 mdclog_write(MDCLOG_ERR, "Error : %s, %d:: Could not extract policy type id from %s\n", __FILE__, __LINE__, message);
79 helper.operation = ref1->GetString();
81 // Extract policy id type
82 rapidjson::Pointer temp2("/policy_type_id");
83 rapidjson::Value * ref2 = temp2.Get(doc);
85 mdclog_write(MDCLOG_ERR, "Error : %s, %d:: Could not extract policy type id from %s\n", __FILE__, __LINE__, message);
88 //helper.policy_type_id = ref2->GetString();
89 helper.policy_type_id = to_string(ref2->GetInt());
91 // Extract policy instance id
92 rapidjson::Pointer temp("/policy_instance_id");
93 rapidjson::Value * ref = temp.Get(doc);
95 mdclog_write(MDCLOG_ERR, "Error : %s, %d:: Could not extract policy type id from %s\n", __FILE__, __LINE__, message);
98 helper.policy_instance_id = ref->GetString();
100 if (helper.policy_type_id == "1" && helper.operation == "CREATE"){
101 helper.status = "OK";
102 Document::AllocatorType& alloc = doc.GetAllocator();
105 handler_id.SetString(helper.handler_id.c_str(), helper.handler_id.length(), alloc);
108 status.SetString(helper.status.c_str(), helper.status.length(), alloc);
111 doc.AddMember("handler_id", handler_id, alloc);
112 doc.AddMember("status",status, alloc);
113 doc.RemoveMember("operation");
115 Writer<StringBuffer> writer(buffer);
117 strncpy(message,buffer.GetString(), buffer.GetLength());
118 *message_len = buffer.GetLength();
125 //For processing received messages.XappMsgHandler should mention if resend is required or not.
126 void XappMsgHandler::operator()(rmr_mbuf_t *message, bool *resend){
128 if (message->len > MAX_RMR_RECV_SIZE){
129 mdclog_write(MDCLOG_ERR, "Error : %s, %d, RMR message larger than %d. Ignoring ...", __FILE__, __LINE__, MAX_RMR_RECV_SIZE);
132 a1_policy_helper helper;
134 switch(message->mtype){
135 //need to fix the health check.
136 case (RIC_HEALTH_CHECK_REQ):
137 message->mtype = RIC_HEALTH_CHECK_RESP; // if we're here we are running and all is ok
138 message->sub_id = -1;
139 strncpy( (char*)message->payload, "HELLOWORLD OK\n", rmr_payload_size( message) );
144 mdclog_write(MDCLOG_INFO, "Received subscription message of type = %d", message->mtype);
145 unsigned char *me_id;
146 if( (me_id = (unsigned char *) malloc( sizeof( unsigned char ) * RMR_MAX_MEID )) == NULL ) {
147 mdclog_write(MDCLOG_ERR, "Error : %s, %d : malloc failed for me_id", __FILE__, __LINE__);
148 me_id = rmr_get_meid(message, NULL);
150 rmr_get_meid(message, me_id);
153 mdclog_write(MDCLOG_ERR, " Error :: %s, %d : rmr_get_meid failed me_id is NULL", __FILE__, __LINE__);
156 mdclog_write(MDCLOG_INFO,"RMR Received MEID: %s",me_id);
157 if(_ref_sub_handler !=NULL){
158 _ref_sub_handler->manage_subscription_response(message->mtype, reinterpret_cast< char const* >(me_id));
160 mdclog_write(MDCLOG_ERR, " Error :: %s, %d : Subscription handler not assigned in message processor !", __FILE__, __LINE__);
164 mdclog_write(MDCLOG_INFO, "Free RMR Received MEID memory: %s(0x%x)", me_id, me_id);
171 mdclog_write(MDCLOG_INFO, "In Message Handler: Received A1_POLICY_REQ.");
172 helper.handler_id = xapp_id;
174 res = a1_policy_handler((char*)message->payload, &message->len, helper);
176 message->mtype = A1_POLICY_RESP; // if we're here we are running and all is ok
177 message->sub_id = -1;
184 mdclog_write(MDCLOG_ERR, "Error :: Unknown message type %d received from RMR", message->mtype);