X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fxapp-mgmt%2Fsubs_mgmt.hpp;h=5d113ed76b5cdf751a8b0d0665d057ca2f44a7a8;hb=28b894594573ab1e7087ed8fb50b208d7b135b07;hp=5673308c469e471483dd547d2a68fe7e53cc266a;hpb=0f5c234d5da8897f2f831e02ff03912e582ba6e9;p=ric-app%2Fhw.git diff --git a/src/xapp-mgmt/subs_mgmt.hpp b/src/xapp-mgmt/subs_mgmt.hpp index 5673308..5d113ed 100644 --- a/src/xapp-mgmt/subs_mgmt.hpp +++ b/src/xapp-mgmt/subs_mgmt.hpp @@ -31,13 +31,15 @@ #include #include #include +#include +#include +#include #include #include - -#include "../xapp-asn/e2ap/subscription_delete_request.hpp" -#include "../xapp-asn/e2ap/subscription_delete_response.hpp" -#include "../xapp-asn/e2ap/subscription_request.hpp" -#include "../xapp-asn/e2ap/subscription_response.hpp" +#include +#include "e2ap_action.hpp" +#include "e2ap_subscription_request.hpp" +#include "e2sm_subscription.hpp" #define SUBSCR_SUCCESS 1 #define SUBSCR_ERR_TX -1 @@ -86,20 +88,18 @@ typedef enum { request_pending = 1, request_success, request_failed, - delete_request_pending, - delete_request_success, - delete_request_failed, request_duplicate }Subscription_Status_Types; -using transaction_identifier = unsigned char*; + +using transaction_identifier = std::string; using transaction_status = Subscription_Status_Types; class SubscriptionHandler { public: - SubscriptionHandler(unsigned int timeout_seconds = 10); + SubscriptionHandler(unsigned int timeout_seconds = 30); template int manage_subscription_request(transaction_identifier, AppTransmitter &&); @@ -109,13 +109,15 @@ public: void manage_subscription_response(int message_type, transaction_identifier id); - int const get_request_status(transaction_identifier); + int get_request_status(transaction_identifier); bool set_request_status(transaction_identifier, transaction_status); bool is_request_entry(transaction_identifier); void set_timeout(unsigned int); void clear(void); void set_ignore_subs_resp(bool b){_ignore_subs_resp = b;}; + void print_subscription_status(){ for(auto it:status_table){std::cout << it.first << "::" << it.second << std::endl;}}; + private: bool add_request_entry(transaction_identifier, transaction_status); @@ -137,6 +139,7 @@ private: template bool SubscriptionHandler::add_transmitter_entry(transaction_identifier id, AppTransmitter &&trans){ + mdclog_write(MDCLOG_INFO,"Entry added for Transaction ID: %s",id.c_str()); // add entry in hash table if it does not exist auto search = trans_table.find(id); @@ -176,80 +179,24 @@ int SubscriptionHandler::manage_subscription_request(transaction_identifier rmr_ if (!flg){ // clear state delete_request_entry(rmr_trans_id); - mdclog_write(MDCLOG_ERR, "%s, %d :: Error transmitting subscription request %s", __FILE__, __LINE__, rmr_trans_id ); + mdclog_write(MDCLOG_ERR, "%s, %d :: Error transmitting subscription request %s", __FILE__, __LINE__, rmr_trans_id.c_str() ); return SUBSCR_ERR_TX; } else { - mdclog_write(MDCLOG_INFO, "%s, %d :: Transmitted subscription request for trans_id %s", __FILE__, __LINE__, rmr_trans_id ); + mdclog_write(MDCLOG_INFO, "%s, %d :: Transmitted subscription request for trans_id %s", __FILE__, __LINE__, rmr_trans_id.c_str() ); add_transmitter_entry(rmr_trans_id, tx); } // record time stamp .. auto start = std::chrono::system_clock::now(); - res = SUBSCR_ERR_UNKNOWN; - - - while(1){ - // release lock and wait to be woken up - _cv.get()->wait_for(_local_lock, _time_out); - - // we have woken and acquired data_lock - // check status and return appropriate object - int status = get_request_status(rmr_trans_id); - - if (status == request_success){ - mdclog_write(MDCLOG_INFO, "Successfully subscribed for request for trans_id %s", rmr_trans_id); - res = SUBSCR_SUCCESS; - break; - } - - if (status == request_pending){ - // woken up spuriously or timed out - auto end = std::chrono::system_clock::now(); - std::chrono::duration f = end - start; - - if ( f > _time_out){ - - mdclog_write(MDCLOG_ERR, "%s, %d:: Subscription request with transaction id %s timed out waiting for response ", __FILE__, __LINE__, rmr_trans_id); - - //res = SUBSCR_ERR_TIMEOUT; - //sunny side scenario. assuming subscription response is received. - res = SUBSCR_SUCCESS; - break; - } - else{ - mdclog_write(MDCLOG_INFO, "Subscription request with transaction id %s Waiting for response....", rmr_trans_id); - continue; - } - - } - - if(status == request_failed){ - mdclog_write(MDCLOG_ERR, "Error :: %s, %d : Subscription Request with transaction id %s got failure response .. \n", __FILE__, __LINE__, rmr_trans_id); - res = SUBSCR_ERR_FAIL; - break; - } - - if (status == request_duplicate){ - mdclog_write(MDCLOG_ERR, "Error :: %s, %d : Subscription Request with transaction id %s is duplicate : subscription already present in table .. \n", __FILE__, __LINE__, rmr_trans_id); - res = SUBSCR_ERR_DUPLICATE; - break; - - } + std::chrono::milliseconds t_out(_time_out); - // if we are here, some spurious - // status obtained or request failed . we return appropriate error code - mdclog_write(MDCLOG_ERR, "Error :: %s, %d : Spurious time out caused by invalid state of request %s, and state = %d. Deleting request entry and failing .. \n", __FILE__, __LINE__, rmr_trans_id, status); - res = SUBSCR_ERR_UNKNOWN; - break; - }; + //the wait functionality has been removed. - delete_request_entry(rmr_trans_id); - // release data lock _local_lock.unlock(); - // std::cout <<"Returning res = " << res << " for request = " << rmr_trans_id << std::endl; - return res; + // std::cout <<"Returning res = " << res << " for request = " << rmr_trans_id << std::endl; + return res; }; #endif