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::encode_subscription_delete_request(unsigned char* buffer, size_t *buf_len){
31 subscription_helper sub_helper;
32 sub_helper.set_request(0); // requirement of subscription manager ... ?
33 sub_helper.set_function_id(0);
35 subscription_delete e2ap_sub_req_del;
37 // generate the delete request pdu
39 bool res = e2ap_sub_req_del.encode_e2ap_subscription(&buffer[0], buf_len, sub_helper);
41 mdclog_write(MDCLOG_ERR, "%s, %d: Error encoding subscription delete request pdu. Reason = %s", __FILE__, __LINE__, e2ap_sub_req_del.get_error().c_str());
49 bool XappMsgHandler::decode_subscription_response(unsigned char* data_buf, size_t data_size){
51 subscription_helper subhelper;
52 subscription_response subresponse;
54 E2AP_PDU_t *e2pdu = 0;
58 ASN_STRUCT_RESET(asn_DEF_E2AP_PDU, e2pdu);
60 rval = asn_decode(0,ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, (void**)&e2pdu, data_buf, data_size);
64 //Put in Subscription Response Object.
65 //asn_fprint(stdout, &asn_DEF_E2AP_PDU, e2pdu);
68 mdclog_write(MDCLOG_ERR, "RC_WMORE");
72 mdclog_write(MDCLOG_ERR, "RC_FAIL");
78 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, e2pdu);
83 bool XappMsgHandler::a1_policy_handler(char * message, int *message_len, a1_policy_helper &helper){
85 rapidjson::Document doc;
86 if (doc.Parse<kParseStopWhenDoneFlag>(message).HasParseError()){
87 mdclog_write(MDCLOG_ERR, "Error: %s, %d :: Could not decode A1 JSON message %s\n", __FILE__, __LINE__, message);
92 rapidjson::Pointer temp1("/operation");
93 rapidjson::Value * ref1 = temp1.Get(doc);
95 mdclog_write(MDCLOG_ERR, "Error : %s, %d:: Could not extract policy type id from %s\n", __FILE__, __LINE__, message);
99 helper.operation = ref1->GetString();
101 // Extract policy id type
102 rapidjson::Pointer temp2("/policy_type_id");
103 rapidjson::Value * ref2 = temp2.Get(doc);
105 mdclog_write(MDCLOG_ERR, "Error : %s, %d:: Could not extract policy type id from %s\n", __FILE__, __LINE__, message);
108 //helper.policy_type_id = ref2->GetString();
109 helper.policy_type_id = to_string(ref2->GetInt());
111 // Extract policy instance id
112 rapidjson::Pointer temp("/policy_instance_id");
113 rapidjson::Value * ref = temp.Get(doc);
115 mdclog_write(MDCLOG_ERR, "Error : %s, %d:: Could not extract policy type id from %s\n", __FILE__, __LINE__, message);
118 helper.policy_instance_id = ref->GetString();
120 if (helper.policy_type_id == "1" && helper.operation == "CREATE"){
121 helper.status = "OK";
122 Document::AllocatorType& alloc = doc.GetAllocator();
125 handler_id.SetString(helper.handler_id.c_str(), helper.handler_id.length(), alloc);
128 status.SetString(helper.status.c_str(), helper.status.length(), alloc);
131 doc.AddMember("handler_id", handler_id, alloc);
132 doc.AddMember("status",status, alloc);
133 doc.RemoveMember("operation");
135 Writer<StringBuffer> writer(buffer);
137 strncpy(message,buffer.GetString(), buffer.GetLength());
138 *message_len = buffer.GetLength();
145 //For processing received messages.XappMsgHandler should mention if resend is required or not.
146 void XappMsgHandler::operator()(rmr_mbuf_t *message, bool *resend){
148 if (message->len > MAX_RMR_RECV_SIZE){
149 mdclog_write(MDCLOG_ERR, "Error : %s, %d, RMR message larger than %d. Ignoring ...", __FILE__, __LINE__, MAX_RMR_RECV_SIZE);
152 a1_policy_helper helper;
154 std::string str_meid;
155 switch(message->mtype){
156 //need to fix the health check.
157 case (RIC_HEALTH_CHECK_REQ):
158 message->mtype = RIC_HEALTH_CHECK_RESP; // if we're here we are running and all is ok
159 message->sub_id = -1;
160 strncpy( (char*)message->payload, "HELLOWORLD OK\n", rmr_payload_size( message) );
165 mdclog_write(MDCLOG_INFO, "Received subscription message of type = %d", message->mtype);
166 unsigned char *me_id;
167 if( (me_id = (unsigned char *) malloc( sizeof( unsigned char ) * RMR_MAX_MEID )) == NULL ) {
168 mdclog_write(MDCLOG_ERR, "Error : %s, %d : malloc failed for me_id", __FILE__, __LINE__);
169 me_id = rmr_get_meid(message, NULL);
171 rmr_get_meid(message, me_id);
173 mdclog_write(MDCLOG_INFO,"RMR Received MEID: %s",me_id);
174 str_meid.insert(0,(char*)me_id);
175 if(_ref_sub_handler !=NULL){
176 _ref_sub_handler->manage_subscription_response(message->mtype, str_meid);
178 mdclog_write(MDCLOG_ERR, " Error :: %s, %d : Subscription handler not assigned in message processor !", __FILE__, __LINE__);
182 mdclog_write(MDCLOG_INFO, "Free RMR Received MEID memory: %s(0x%x)", me_id, me_id);
189 mdclog_write(MDCLOG_INFO, "In Message Handler: Received A1_POLICY_REQ.");
190 helper.handler_id = xapp_id;
192 res = a1_policy_handler((char*)message->payload, &message->len, helper);
194 message->mtype = A1_POLICY_RESP; // if we're here we are running and all is ok
195 message->sub_id = -1;
202 mdclog_write(MDCLOG_ERR, "Error :: Unknown message type %d received from RMR", message->mtype);