X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=Bouncer%2Fsrc%2Fxapp.cc;fp=Bouncer%2Fsrc%2Fxapp.cc;h=64beee4a8708c2036660344767e52b6c0b8f7dd1;hb=ff20129c8f517cca6e0b4de6544ff64aebe7c171;hp=0000000000000000000000000000000000000000;hpb=35882dccfbc1b35af0e5704e14e0ecb9eba0f52a;p=ric-app%2Fbouncer.git diff --git a/Bouncer/src/xapp.cc b/Bouncer/src/xapp.cc new file mode 100644 index 0000000..64beee4 --- /dev/null +++ b/Bouncer/src/xapp.cc @@ -0,0 +1,254 @@ +/* +# ================================================================================== +# Copyright (c) 2020 HCL Technologies Limited. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ================================================================================== +*/ + +#include "xapp.hpp" +#define BUFFER_SIZE 1024 + + Xapp::Xapp(XappSettings &config, XappRmr &rmr){ + + rmr_ref = &rmr; + config_ref = &config; + xapp_mutex = NULL; + subhandler_ref = NULL; + return; + } + +Xapp::~Xapp(void){ + + //Joining the threads + int threadcnt = xapp_rcv_thread.size(); + for(int i=0; i~mutex(); + delete xapp_mutex; + } +}; + +//Stop the xapp. Note- To be run only from unit test scripts. +void Xapp::stop(void){ + // Get the mutex lock + std::lock_guard guard(*xapp_mutex); + rmr_ref->set_listen(false); + rmr_ref->~XappRmr(); + + //Detaching the threads....not sure if this is the right way to stop the receiver threads. + //Hence function should be called only in Unit Tests + int threadcnt = xapp_rcv_thread.size(); + for(int i=0; iset_listen(true); + if(xapp_mutex == NULL){ + xapp_mutex = new std::mutex(); + } + std::lock_guard guard(*xapp_mutex); + + for(int j=0; j < _callbacks.size(); j++){ + std::thread th_recv([&](){ rmr_ref->xapp_rmr_receive(std::move(_callbacks[j]), rmr_ref);}); + xapp_rcv_thread.push_back(std::move(th_recv)); + } + + return; +} + +//Starting a seperate single receiver +void Xapp::start_xapp_receiver(XappMsgHandler& mp_handler){ + //start a receiver thread. Can be multiple receiver threads for more than 1 listening port. + rmr_ref->set_listen(true); + if(xapp_mutex == NULL){ + xapp_mutex = new std::mutex(); + } + + mdclog_write(MDCLOG_INFO,"Receiver Thread file= %s, line=%d",__FILE__,__LINE__); + std::lock_guard guard(*xapp_mutex); + std::thread th_recv([&](){ rmr_ref->xapp_rmr_receive(std::move(mp_handler), rmr_ref);}); + xapp_rcv_thread.push_back(std::move(th_recv)); + return; +} + +void Xapp::shutdown(){ + return; +} + + +void Xapp::startup_subscribe_requests(void ){ + + bool res; + size_t data_size = ASN_BUFF_MAX_SIZE; + unsigned char data[data_size]; + unsigned char meid[RMR_MAX_MEID]; + std::string xapp_id = config_ref->operator [](XappSettings::SettingName::XAPP_ID); + + mdclog_write(MDCLOG_INFO,"Preparing to send subscription in file= %s, line=%d",__FILE__,__LINE__); + + auto gnblist = get_rnib_gnblist(); + + int sz = gnblist.size(); + + if(sz <= 0) + mdclog_write(MDCLOG_INFO,"Subscriptions cannot be sent as GNBList in RNIB is NULL"); + + for(int i = 0; imanage_subscription_request(gnblist[i], transmitter); + + if(result==SUBSCR_SUCCESS){ + mdclog_write(MDCLOG_INFO,"Subscription SUCCESSFUL in file= %s, line=%d for MEID %s",__FILE__,__LINE__, meid); + } + else { + mdclog_write(MDCLOG_ERR,"Subscription FAILED in file= %s, line=%d for MEID %s",__FILE__,__LINE__, meid); + } + } + +} + +void Xapp::startup_get_policies(void){ + + int policy_id = BOUNCER_POLICY_ID; + + std::string policy_query = "{\"policy_type_id\":" + std::to_string(policy_id) + "}"; + unsigned char * message = (unsigned char *)calloc(policy_query.length(), sizeof(unsigned char)); + memcpy(message, policy_query.c_str(), policy_query.length()); + xapp_rmr_header header; + header.payload_length = policy_query.length(); + header.message_type = A1_POLICY_QUERY; + mdclog_write(MDCLOG_INFO, "Sending request for policy id %d\n", policy_id); + rmr_ref->xapp_rmr_send(&header, (void *)message); + free(message); + +} + +void Xapp::set_rnib_gnblist(void) { + + openSdl(); + + void *result = getListGnbIds(); + if(strlen((char*)result) < 1){ + mdclog_write(MDCLOG_ERR, "ERROR: no data from getListGnbIds\n"); + return; + } + + mdclog_write(MDCLOG_INFO, "GNB List in R-NIB %s\n", (char*)result); + + + Document doc; + ParseResult parseJson = doc.Parse((char*)result); + if (!parseJson) { + std::cerr << "JSON parse error: %s (%u)", GetParseErrorFunc(parseJson.Code()); + return; + } + + if(!doc.HasMember("gnb_list")){ + mdclog_write(MDCLOG_INFO, "JSON Has No GNB List Object"); + return; + } + assert(doc.HasMember("gnb_list")); + + const Value& gnblist = doc["gnb_list"]; + if (gnblist.IsNull()) + return; + + if(!gnblist.IsArray()){ + mdclog_write(MDCLOG_INFO, "GNB List is not an array"); + return; + } + + + assert(gnblist.IsArray()); + for (SizeType i = 0; i < gnblist.Size(); i++) // Uses SizeType instead of size_t + { + assert(gnblist[i].IsObject()); + const Value& gnbobj = gnblist[i]; + assert(gnbobj.HasMember("inventory_name")); + assert(gnbobj["inventory_name"].IsString()); + std::string name = gnbobj["inventory_name"].GetString(); + rnib_gnblist.push_back(name); + + } + closeSdl(); + return; + +} + + + + + +