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(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();
110 // Extract policy instance id
111 rapidjson::Pointer temp("/policy_instance_id");
112 rapidjson::Value * ref = temp.Get(doc);
114 mdclog_write(MDCLOG_ERR, "Error : %s, %d:: Could not extract policy type id from %s\n", __FILE__, __LINE__, message);
117 helper.policy_instance_id = ref->GetString();
119 if (helper.policy_type_id == "1" && helper.operation == "CREATE"){
120 helper.status = "OK";
121 Document::AllocatorType& alloc = doc.GetAllocator();
124 handler_id.SetString(helper.handler_id.c_str(), helper.handler_id.length(), alloc);
127 status.SetString(helper.status.c_str(), helper.status.length(), alloc);
130 doc.AddMember("handler_id", handler_id, alloc);
131 doc.AddMember("status",status, alloc);
132 doc.RemoveMember("operation");
134 Writer<StringBuffer> writer(buffer);
136 strncpy(message,buffer.GetString(), buffer.GetLength());
137 *message_len = buffer.GetLength();
144 //For processing received messages.XappMsgHandler should mention if resend is required or not.
145 void XappMsgHandler::operator()(rmr_mbuf_t *message, bool *resend){
147 if (message->len > MAX_RMR_RECV_SIZE){
148 mdclog_write(MDCLOG_ERR, "Error : %s, %d, RMR message larger than %d. Ignoring ...", __FILE__, __LINE__, MAX_RMR_RECV_SIZE);
151 a1_policy_helper helper;
153 switch(message->mtype){
154 //need to fix the health check.
155 case (RIC_HEALTH_CHECK_REQ):
156 message->mtype = RIC_HEALTH_CHECK_RESP; // if we're here we are running and all is ok
157 message->sub_id = -1;
158 strncpy( (char*)message->payload, "HELLOWORLD OK\n", rmr_payload_size( message) );
163 mdclog_write(MDCLOG_INFO, "Received subscription message of type = %d", message->mtype);
164 unsigned char *me_id;
165 rmr_get_meid(message, me_id);
166 mdclog_write(MDCLOG_INFO,"RMR Received MEID: %s",me_id);
168 if(_ref_sub_handler !=NULL){
169 _ref_sub_handler->manage_subscription_response(message->mtype, me_id);
171 mdclog_write(MDCLOG_ERR, " Error :: %s, %d : Subscription handler not assigned in message processor !", __FILE__, __LINE__);
177 helper.handler_id = xapp_id;
178 res = a1_policy_handler((char*)message->payload, &message->len, helper);
180 message->mtype = A1_POLICY_RESP; // if we're here we are running and all is ok
181 message->sub_id = -1;
188 mdclog_write(MDCLOG_ERR, "Error :: Unknown message type %d received from RMR", message->mtype);