MME2 changes - Propped commits from openmme/paging branch. Added scripts
for code gen
Change-Id: Ie55032217232214ac8544ca76ea34335205329e4
diff --git a/src/mmeGrpcClient/mmeGrpcClient.cpp b/src/mmeGrpcClient/mmeGrpcClient.cpp
new file mode 100644
index 0000000..37d7814
--- /dev/null
+++ b/src/mmeGrpcClient/mmeGrpcClient.cpp
@@ -0,0 +1,291 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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 <iostream>
+#include <memory>
+#include <string>
+#include <sstream>
+#include <time.h>
+#include <grpcpp/grpcpp.h>
+#include <google/protobuf/text_format.h>
+#include <../mmeGrpcProtos/mmeGrpc.grpc.pb.h>
+
+using grpc::Channel;
+using grpc::ClientContext;
+using grpc::ClientReader;
+using grpc::ClientReaderWriter;
+using grpc::ClientWriter;
+using grpc::Status;
+using mmeGrpc::UeContextReqBuf;
+using mmeGrpc::UeContextRespBuf;
+using mmeGrpc::UeContextRespBuf_SessionContextRespBuf;
+using mmeGrpc::MmeGrpcCli;
+using mmeGrpc::Empty;
+using mmeGrpc::ProcedureStatsRespBuf;
+using mmeGrpc::EventInfoRespBuf;
+using mmeGrpc::EventInfoRespBuf_EventInfoBuf;
+
+using namespace std;
+
+class MmeGrpcCliClient {
+ public:
+ MmeGrpcCliClient(std::shared_ptr<Channel> channel)
+ : stub_(MmeGrpcCli::NewStub(channel)) {}
+
+ // Assembles the client's payload, sends it and presents the response back
+ // from the server.
+ void GetUeContext(const int32_t id) {
+ // Data we are sending to the server.
+ UeContextReqBuf request;
+ request.set_id(id);
+
+ // Container for the data we expect from the server.
+ UeContextRespBuf reply;
+
+ // Context for the client. It could be used to convey extra information to
+ // the server and/or tweak certain RPC behaviors.
+ ClientContext context;
+
+ // The actual RPC.
+ Status status = stub_->GetUeContext(&context, request, &reply);
+
+ // Act upon its status.
+ if (status.ok()) {
+
+ /*std::string textString;
+ google::protobuf::TextFormat::PrintToString(reply, &textString);
+ std::cout << textString << std::endl;
+ */
+ cout << "-----mobile context----- " << id << endl;
+ cout << "IMSI " << reply.imsi() << endl;
+ cout << "MSISDN " << reply.msisdn() << endl;
+ cout << "TAI " << reply.tai() << endl;
+ cout << "EUTRAN CGI " << reply.eutran_cgi() << endl;
+ cout << "Context ID " << reply.context_id() << endl;
+ cout << "Enb UE s1ap Teid " << reply.enb_ue_s1ap_id() << endl;
+ cout << "UE State " << reply.ue_state() << endl;
+
+ int sessioncontext_size=reply.sessioncontext_size();
+ for(int i=0;i<sessioncontext_size;i++)
+ {
+ const UeContextRespBuf_SessionContextRespBuf& sessioncontext = reply.sessioncontext(i);
+
+ cout << "-----session context------ " << i+1 << endl;
+ cout << " apn " << sessioncontext.apn() << endl;
+ cout << " PDN address " << sessioncontext.pdn_address() << endl;
+ cout << " Bearer ID " << sessioncontext.bearer_id() << endl;
+ cout << " s11 sgw gtpc teid " << sessioncontext.s11_sgw_gtpc_teid() << endl;
+ cout << " s5 pgw gtpc teid " << sessioncontext.s5_pgw_gtpc_teid() << endl;
+ cout << " s1u enb teid " << sessioncontext.s1u_enb_teid() << endl;
+ cout << " s1u sgw teid " << sessioncontext.s1u_sgw_teid() << endl;
+ cout << " s5u pgw teid " << sessioncontext.s5u_pgw_teid() << endl;
+ }
+
+ } else {
+ std::cout << status.error_code() << ": " << status.error_message()
+ << std::endl;
+ }
+ }
+
+ void ShowAllMobileContexts() {
+ UeContextRespBuf reply;
+
+ Empty request;
+ ClientContext context;
+
+ std::unique_ptr<ClientReader<UeContextRespBuf> > reader(
+ stub_->ShowAllMobileContexts(&context, request));
+
+ while (reader->Read(&reply))
+ {
+ cout << "-----mobile context----- " << endl;
+ cout << "IMSI " << reply.imsi() << endl;
+ cout << "MSISDN " << reply.msisdn() << endl;
+ cout << "TAI " << reply.tai() << endl;
+ cout << "EUTRAN CGI " << reply.eutran_cgi() << endl;
+ cout << "Context ID " << reply.context_id() << endl;
+ cout << "Enb UE s1ap Teid " << reply.enb_ue_s1ap_id() << endl;
+ cout << "UE State " << reply.ue_state() << endl;
+
+ int sessioncontext_size=reply.sessioncontext_size();
+ for(int i=0;i<sessioncontext_size;i++)
+ {
+ const UeContextRespBuf_SessionContextRespBuf& sessioncontext = reply.sessioncontext(i);
+
+ cout << "-----session context------ " << i+1 << endl;
+ cout << " apn " << sessioncontext.apn() << endl;
+ cout << " PDN address " << sessioncontext.pdn_address() << endl;
+ cout << " Bearer ID " << sessioncontext.bearer_id() << endl;
+ cout << " s11 sgw gtpc teid " << sessioncontext.s11_sgw_gtpc_teid() << endl;
+ cout << " s5 pgw gtpc teid " << sessioncontext.s5_pgw_gtpc_teid() << endl;
+ cout << " s1u enb teid " << sessioncontext.s1u_enb_teid() << endl;
+ cout << " s1u sgw teid " << sessioncontext.s1u_sgw_teid() << endl;
+ cout << " s5u pgw teid " << sessioncontext.s5u_pgw_teid() << endl;
+ }
+
+ }
+ Status status = reader->Finish();
+ if (status.ok()) {
+ std::cout << "show all mobile-contexts rpc succeeded." << std::endl;
+ } else {
+ std::cout << "show all mobile-contexts rpc failed." << std::endl;
+ }
+ }
+
+
+ void GetProcStats(){
+ // Container for the data we expect from the server.
+ ProcedureStatsRespBuf reply;
+
+ Empty request;
+
+ // Context for the client. It could be used to convey extra information to
+ // the server and/or tweak certain RPC behaviors.
+ ClientContext context;
+ // The actual RPC.
+ Status status = stub_->GetProcStats(&context, request, &reply);
+
+ // Act upon its status.
+ if (status.ok()) {
+ cout << endl << "-----procedure stats-----" << endl;
+ cout << "num_of_subs_attached " << reply.num_of_subscribers_attached() << endl;
+ cout << "num_of_air_sent " << reply.num_of_air_sent() << endl;
+ cout << "num_of_ulr_sent " << reply.num_of_ulr_sent() << endl;
+ cout << "num_of_processed_aia " << reply.num_of_processed_aia() << endl;
+ cout << "num_of_processed_ula " << reply.num_of_processed_ula() << endl;
+ cout << "num_of_auth_req_to_ue_sent " << reply.num_of_auth_req_to_ue_sent() << endl;
+ cout << "num_of_processed_auth_response " << reply.num_of_processed_auth_response() << endl;
+ cout << "num_of_sec_mode_cmd_to_ue_sent " << reply.num_of_sec_mode_cmd_to_ue_sent() << endl;
+ cout << "num_of_processed_sec_mode_resp " << reply.num_of_processed_sec_mode_resp() << endl;
+ cout << "num_of_esm_info_req_to_ue_sent " << reply.num_of_esm_info_req_to_ue_sent() << endl;
+ cout << "num_of_handled_esm_info_resp " << reply.num_of_handled_esm_info_resp() << endl;
+ cout << "num_of_cs_req_to_sgw_sent " << reply.num_of_cs_req_to_sgw_sent() << endl;
+ cout << "num_of_processed_cs_resp " << reply.num_of_processed_cs_resp() << endl;
+ cout << "num_of_init_ctxt_req_to_ue_sent " << reply.num_of_init_ctxt_req_to_ue_sent() << endl;
+ cout << "num_of_processed_init_ctxt_resp " << reply.num_of_processed_init_ctxt_resp() << endl;
+ cout << "num_of_mb_req_to_sgw_sent " << reply.num_of_mb_req_to_sgw_sent() << endl;
+ cout << "num_of_processed_attach_cmp_from_ue " << reply.num_of_processed_attach_cmp_from_ue() << endl;
+ cout << "num_of_processed_mb_resp " << reply.num_of_processed_mb_resp() << endl;
+ cout << "num_of_attach_done " << reply.num_of_attach_done() << endl;
+ cout << "num_of_del_session_req_sent " << reply.num_of_del_session_req_sent() << endl;
+ cout << "num_of_purge_req_sent " << reply.num_of_purge_req_sent() << endl;
+ cout << "num_of_processed_del_session_resp " << reply.num_of_processed_del_session_resp() << endl;
+ cout << "num_of_processed_pur_resp " << reply.num_of_processed_pur_resp() << endl;
+ cout << "num_of_detach_accept_to_ue_sent " << reply.num_of_detach_accept_to_ue_sent() << endl;
+ cout << "num_of_processed_detach_accept " << reply.num_of_processed_detach_accept() << endl;
+ cout << "num_of_ue_ctxt_release " << reply.num_of_ue_ctxt_release() << endl;
+ cout << "num_of_processed_ctxt_rel_resp " << reply.num_of_processed_ctxt_rel_resp() << endl;
+ cout << "num_of_rel_access_bearer_req_sent " << reply.num_of_rel_access_bearer_req_sent() << endl; cout << "num_of_rel_access_bearer_resp_received " << reply.num_of_rel_access_bearer_resp_received() << endl;
+ cout << "num_of_s1_rel_req_received " << reply.num_of_s1_rel_req_received() << endl;
+ cout << "num_of_s1_rel_cmd_sent " << reply.num_of_s1_rel_cmd_sent() << endl;
+ cout << "num_of_s1_rel_comp_received " << reply.num_of_s1_rel_comp_received() << endl;
+ cout << "num_of_clr_received " << reply.num_of_clr_received() << endl;
+ cout << "num_of_cla_sent " << reply.num_of_cla_sent() << endl;
+ cout << "num_of_detach_req_to_ue_sent " << reply.num_of_detach_req_to_ue_sent() << endl;
+ cout << "num_of_detach_accept_from_ue " << reply.num_of_detach_accept_from_ue() << endl;
+ cout << "total_num_of_subscribers " << reply.total_num_of_subscribers() << endl;
+ cout << "num_of_subscribers_detached " << reply.num_of_subscribers_detached() << endl;
+ cout << "num_of_tau_response_to_ue_sent " << reply.num_of_tau_response_to_ue_sent() << endl;
+
+ } else {
+ std::cout << status.error_code() << ": " << status.error_message()
+ << std::endl;
+ }
+ }
+
+ void GetDebugUeContext(const int32_t id){
+ // Container for the data we expect from the server.
+ EventInfoRespBuf reply;
+
+ UeContextReqBuf request;
+ request.set_id(id);
+
+ // Context for the client. It could be used to convey extra information to
+ // the server and/or tweak certain RPC behaviors.
+ ClientContext context;
+ // The actual RPC.
+ Status status = stub_->GetDebugUeContext(&context, request, &reply);
+
+ // Act upon its status.
+ if (status.ok())
+ {
+ int event_info_buf_size=reply.eventinfo_size();
+ cout << "EVENT\t\t\t\t\t\tSTATE\t\t\t\t\t\tTIMESTAMP" << endl;
+ cout << "-----------------------------------------------------------------" << endl;
+ for(int i=0; i<event_info_buf_size; i++)
+ {
+ const EventInfoRespBuf_EventInfoBuf& event_info=reply.eventinfo(i);
+
+ cout << event_info.event() << "\t\t\t\t\t\t"
+ << event_info.state() << "\t\t\t\t\t\t"
+ << event_info.time() << endl;
+ }
+ } else {
+ cout << status.error_code() << ": " << status.error_message() << endl;
+ }
+ }
+
+
+ private:
+ std::unique_ptr<MmeGrpcCli::Stub> stub_;
+};
+
+int main(int argc, char** argv) {
+ // Instantiate the client. It requires a channel, out of which the actual RPCs
+ // are created. This channel models a connection to an endpoint (in this case,
+ // localhost at port 50051). We indicate that the channel isn't authenticated
+ // (use of InsecureChannelCredentials()).
+
+ if((0==strcmp(argv[1],"mme-app"))&&(0==strcmp(argv[2],"show"))&&(0==strcmp(argv[3],"mobile-context")))
+ {
+ MmeGrpcCliClient MmeGrpcCli(grpc::CreateChannel(
+ "localhost:50051", grpc::InsecureChannelCredentials()));
+ stringstream sid;
+ sid << argv[4];
+ int32_t id = 1;
+ sid >> id;
+
+ MmeGrpcCli.GetUeContext(id);
+ }
+ else if((0==strcmp(argv[1],"mme-app"))&&(0==strcmp(argv[2],"show"))&&(0==strcmp(argv[3],"procedure-stats")))
+ {
+ MmeGrpcCliClient MmeGrpcCli(grpc::CreateChannel(
+ "localhost:50051", grpc::InsecureChannelCredentials()));
+
+ MmeGrpcCli.GetProcStats();
+ }
+ else if((0==strcmp(argv[1],"mme-app"))&&(0==strcmp(argv[2],"show"))&&(0==strcmp(argv[3],"mobile-contexts-all")))
+ {
+ MmeGrpcCliClient MmeGrpcCli(grpc::CreateChannel(
+ "localhost:50051", grpc::InsecureChannelCredentials()));
+
+ MmeGrpcCli.ShowAllMobileContexts();
+ }
+
+ else if((0==strcmp(argv[1],"mme-app"))&&(0==strcmp(argv[2],"debug"))&&(0==strcmp(argv[3],"show")) &&(0==strcmp(argv[4],"mobile-context")))
+ {
+ MmeGrpcCliClient MmeGrpcCli(grpc::CreateChannel(
+ "localhost:50051", grpc::InsecureChannelCredentials()));
+ stringstream sid;
+ sid << argv[5];
+ int32_t id = 1;
+ sid >> id;
+ cout << endl << "-----debug mobile context----- " << id << endl;
+ MmeGrpcCli.GetUeContext(id);
+ MmeGrpcCli.GetDebugUeContext(id);
+ }
+ return 0;
+}