HelloWorld E2SM source
[ric-app/hw.git] / src / xapp-mgmt / msgs_proc.cc
1 /*
2 ==================================================================================
3
4         Copyright (c) 2019-2020 AT&T Intellectual Property.
5
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
9
10        http://www.apache.org/licenses/LICENSE-2.0
11
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 ==================================================================================
18 */
19 /*
20  * msgs_proc.cc
21  * Created on: 2019
22  * Author: Ashwin Shridharan, Shraboni Jana
23  */
24
25
26 #include "msgs_proc.hpp"
27
28
29 bool XappMsgHandler::encode_subscription_delete_request(unsigned char* buffer, size_t *buf_len){
30
31         subscription_helper sub_helper;
32         sub_helper.set_request(0); // requirement of subscription manager ... ?
33         sub_helper.set_function_id(0);
34
35         subscription_delete e2ap_sub_req_del;
36
37           // generate the delete request pdu
38
39           bool res = e2ap_sub_req_del.encode_e2ap_subscription(&buffer[0], buf_len, sub_helper);
40           if(! res){
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());
42             return false;
43           }
44
45         return true;
46
47 }
48
49 bool XappMsgHandler::decode_subscription_response(unsigned char* data_buf, size_t data_size){
50
51         subscription_helper subhelper;
52         subscription_response subresponse;
53         bool res = true;
54         E2AP_PDU_t *e2pdu = 0;
55
56         asn_dec_rval_t rval;
57
58         ASN_STRUCT_RESET(asn_DEF_E2AP_PDU, e2pdu);
59
60         rval = asn_decode(0,ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, (void**)&e2pdu, data_buf, data_size);
61         switch(rval.code)
62         {
63                 case RC_OK:
64                            //Put in Subscription Response Object.
65                            //asn_fprint(stdout, &asn_DEF_E2AP_PDU, e2pdu);
66                            break;
67                 case RC_WMORE:
68                                 mdclog_write(MDCLOG_ERR, "RC_WMORE");
69                                 res = false;
70                                 break;
71                 case RC_FAIL:
72                                 mdclog_write(MDCLOG_ERR, "RC_FAIL");
73                                 res = false;
74                                 break;
75                 default:
76                                 break;
77          }
78         ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, e2pdu);
79         return res;
80
81 }
82
83 bool  XappMsgHandler::a1_policy_handler(char * message, int *message_len, a1_policy_helper &helper){
84
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);
88     return false;
89   }
90
91   //Extract Operation
92   rapidjson::Pointer temp1("/operation");
93     rapidjson::Value * ref1 = temp1.Get(doc);
94     if (ref1 == NULL){
95       mdclog_write(MDCLOG_ERR, "Error : %s, %d:: Could not extract policy type id from %s\n", __FILE__, __LINE__, message);
96       return false;
97     }
98
99    helper.operation = ref1->GetString();
100
101   // Extract policy id type
102   rapidjson::Pointer temp2("/policy_type_id");
103   rapidjson::Value * ref2 = temp2.Get(doc);
104   if (ref2 == NULL){
105     mdclog_write(MDCLOG_ERR, "Error : %s, %d:: Could not extract policy type id from %s\n", __FILE__, __LINE__, message);
106     return false;
107   }
108   helper.policy_type_id = ref2->GetString();
109
110   // Extract policy instance id
111     rapidjson::Pointer temp("/policy_instance_id");
112     rapidjson::Value * ref = temp.Get(doc);
113     if (ref == NULL){
114       mdclog_write(MDCLOG_ERR, "Error : %s, %d:: Could not extract policy type id from %s\n", __FILE__, __LINE__, message);
115       return false;
116     }
117     helper.policy_instance_id = ref->GetString();
118
119     if (helper.policy_type_id == "1" && helper.operation == "CREATE"){
120         helper.status = "OK";
121         Document::AllocatorType& alloc = doc.GetAllocator();
122
123         Value handler_id;
124         handler_id.SetString(helper.handler_id.c_str(), helper.handler_id.length(), alloc);
125
126         Value status;
127         status.SetString(helper.status.c_str(), helper.status.length(), alloc);
128
129
130         doc.AddMember("handler_id", handler_id, alloc);
131         doc.AddMember("status",status, alloc);
132         doc.RemoveMember("operation");
133         StringBuffer buffer;
134         Writer<StringBuffer> writer(buffer);
135         doc.Accept(writer);
136         strncpy(message,buffer.GetString(), buffer.GetLength());
137         *message_len = buffer.GetLength();
138         return true;
139     }
140     return false;
141  }
142
143
144 //For processing received messages.XappMsgHandler should mention if resend is required or not.
145 void XappMsgHandler::operator()(rmr_mbuf_t *message, bool *resend){
146
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);
149                 return;
150         }
151         a1_policy_helper helper;
152         bool res=false;
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) );
159                                 *resend = true;
160                                 break;
161
162                 case (RIC_SUB_RESP):
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);
167
168                                 if(_ref_sub_handler !=NULL){
169                                         _ref_sub_handler->manage_subscription_response(message->mtype, me_id);
170                                 } else {
171                                         mdclog_write(MDCLOG_ERR, " Error :: %s, %d : Subscription handler not assigned in message processor !", __FILE__, __LINE__);
172                                 }
173                                 *resend = false;
174                                 break;
175
176         case A1_POLICY_REQ:
177                         helper.handler_id = xapp_id;
178                         res = a1_policy_handler((char*)message->payload, &message->len, helper);
179                         if(res){
180                                 message->mtype = A1_POLICY_RESP;        // if we're here we are running and all is ok
181                                 message->sub_id = -1;
182                                 *resend = true;
183                         }
184                         break;
185
186         default:
187                 {
188                         mdclog_write(MDCLOG_ERR, "Error :: Unknown message type %d received from RMR", message->mtype);
189                         *resend = false;
190                 }
191         }
192
193         return;
194
195 };
196
197