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();
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 switch(message->mtype){
155 //need to fix the health check.
156 case (RIC_HEALTH_CHECK_REQ):
157 message->mtype = RIC_HEALTH_CHECK_RESP; // if we're here we are running and all is ok
158 message->sub_id = -1;
159 strncpy( (char*)message->payload, "HELLOWORLD OK\n", rmr_payload_size( message) );
164 mdclog_write(MDCLOG_INFO, "Received subscription message of type = %d", message->mtype);
165 unsigned char *me_id;
166 rmr_get_meid(message, me_id);
167 mdclog_write(MDCLOG_INFO,"RMR Received MEID: %s",me_id);
169 if(_ref_sub_handler !=NULL){
170 _ref_sub_handler->manage_subscription_response(message->mtype, me_id);
172 mdclog_write(MDCLOG_ERR, " Error :: %s, %d : Subscription handler not assigned in message processor !", __FILE__, __LINE__);
179 mdclog_write(MDCLOG_INFO, "In Message Handler: Received A1_POLICY_REQ.");
180 helper.handler_id = xapp_id;
182 res = a1_policy_handler((char*)message->payload, &message->len, helper);
184 message->mtype = A1_POLICY_RESP; // if we're here we are running and all is ok
185 message->sub_id = -1;
192 mdclog_write(MDCLOG_ERR, "Error :: Unknown message type %d received from RMR", message->mtype);