MME2 changes - Propped commits from openmme/paging branch. Added scripts
for code gen
Change-Id: Ie55032217232214ac8544ca76ea34335205329e4
diff --git a/src/s6a/main.c b/src/s6a/main.c
new file mode 100644
index 0000000..9d851e3
--- /dev/null
+++ b/src/s6a/main.c
@@ -0,0 +1,288 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * 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 <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <stdio.h>
+
+#include <freeDiameter/freeDiameter-host.h>
+#include <freeDiameter/libfdcore.h>
+#include <freeDiameter/libfdproto.h>
+#include "s6a_config.h"
+#include "s6a.h"
+#include "s6a_fd.h"
+#include "err_codes.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+#include "hss_message.h"
+#include "thread_pool.h"
+#include <sys/types.h>
+
+/**Globals and externs**/
+struct fd_dict_objects g_fd_dict_objs;
+struct fd_dict_data g_fd_dict_data;
+int g_Q_mme_S6a_fd;
+
+int g_our_hss_fd;
+struct thread_pool *g_tpool;
+extern s6a_config g_s6a_cfg;
+
+pthread_t g_AIR_handler_tid, g_ULR_handler_tid;
+pthread_t g_detach_handler_tid;
+pthread_t g_our_hss_tid;
+
+extern char processName[255];
+extern int pid;
+
+int ipc_reader_tipc_s6;
+
+extern void*
+S6Req_handler(void *data);
+
+/**Globals and externs**/
+
+/**
+ * @brief Initialize communication channel IPC or IPC to non freediameter HSS
+ * ready
+ * @param None
+ * @return void
+ */
+void
+init_hss_rpc()
+{
+ struct sockaddr_un hss_serv;
+
+ g_our_hss_fd = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (g_our_hss_fd < 0) {
+ log_msg(LOG_ERROR, "HSS socket creation failed.\n");
+ perror("Error opening HSS socket");
+ exit(-1);
+ }
+
+ hss_serv.sun_family = AF_UNIX;
+ strcpy(hss_serv.sun_path, g_s6a_cfg.hss_ipc_endpt);
+
+ if (connect(g_our_hss_fd, (struct sockaddr *)&hss_serv,
+ sizeof(struct sockaddr_un)) < 0) {
+ log_msg(LOG_ERROR, "HSS connect failed.\n");
+ perror("connecting HSS socket");
+ close(g_our_hss_fd);
+ exit(-1);
+ }
+ log_msg(LOG_INFO, "Connected to HSS\n");
+}
+
+/**
+ * @brief Initialize freediameter library, dictionary and data elements
+ * ready
+ * @param None
+ * @return int SUCCESS or S6A_FD_ERROR
+ */
+static int
+init_fd()
+{
+ log_msg(LOG_INFO, "INIT FD .. .\n");
+
+ /* Initialize the core freeDiameter library */
+ CHECK_FCT_DO(fd_core_initialize(), return S6A_FD_ERROR);
+
+ /* Parse the configuration file */
+ CHECK_FCT_DO(fd_core_parseconf(S6A_FD_CONF), return S6A_FD_ERROR);
+
+ if(SUCCESS != s6a_fd_init()) exit(S6A_FD_ERROR);
+
+ if(SUCCESS != s6a_fd_objs_init()) exit(S6A_FD_ERROR);
+
+ if(SUCCESS != s6a_fd_data_init()) exit(S6A_FD_ERROR);
+
+ if(SUCCESS != s6a_fd_cb_reg()) exit(S6A_FD_ERROR);
+
+ CHECK_FCT_DO( fd_core_start(), return S6A_FD_ERROR);
+
+ return SUCCESS;
+}
+
+/**
+ * @brief Unused
+ * ready
+ * @param
+ * @return i
+ */
+static void
+check_args(int argc, char **argv)
+{
+ /*Parsse arguments to extract file path*/
+ /*If no file path mentioned then use default*/
+ /*For wrong arguments print help*/
+ return;
+}
+
+void * AIR_handler(void * data)
+{
+ int bytesRead = 0;
+ while (1)
+ {
+ unsigned char buffer[255] = {0};
+ if ((bytesRead = read_tipc_msg(ipc_reader_tipc_s6, buffer, 255)) > 0)
+ {
+ unsigned char *tmpBuf = (unsigned char *) malloc(sizeof(char) * bytesRead);
+ memcpy(tmpBuf, buffer, bytesRead);
+ log_msg(LOG_INFO, "S6 message received from mme-app");
+ S6Req_handler(tmpBuf);
+ free(tmpBuf);
+ memset(buffer, 0, 255);
+ }
+ }
+}
+
+/**
+ * @brief Initialize s6a application message handlers
+ * ready
+ * @param None
+ * @return int SUCCESS or FAIL
+ */
+static int
+init_handlers()
+{
+ if ((ipc_reader_tipc_s6 = create_tipc_socket()) <= 0)
+ {
+ log_msg(LOG_ERROR, "Failed to create IPC Reader tipc socket \n");
+ return -E_FAIL;
+ }
+ if ( bind_tipc_socket(ipc_reader_tipc_s6, s6AppInstanceNum_c) != 1)
+ {
+ log_msg(LOG_ERROR, "failed to bind port name %s\n", strerror(errno));
+ return -E_FAIL;
+ }
+
+ pthread_attr_t attr;
+
+ pthread_attr_init(&attr);
+ /* set the thread detach state */
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+ pthread_create(&g_AIR_handler_tid, &attr, &AIR_handler, NULL);
+
+ pthread_attr_destroy(&attr);
+ return 0;
+}
+
+/**
+ * @brief initialize s6a application IPC mechanism, queues
+ * ready
+ * @param None
+ * @return int as SUCCESS or FAIL. exit() in case of error.
+ */
+static int
+init_s6a_ipc()
+{
+ g_Q_mme_S6a_fd = create_tipc_socket();
+ if (g_Q_mme_S6a_fd == -1) {
+ log_msg(LOG_ERROR, "Error in opening writer IPC channel\n");
+ pthread_exit(NULL);
+ }
+ log_msg(LOG_INFO, "S6a response - mme-app TIPC: Connected.\n");
+
+ return 0;
+}
+
+/**
+ * @brief HSS message listener. Listen hss response and delegate to thread pool
+ * case of dummy hss
+ * ready
+ * @param None
+ * @return void
+ */
+void
+s6a_run()
+{
+ unsigned char buf[HSS_RCV_BUF_SIZE];
+ int len;
+
+ /*If using in build perf-hss then start thread to handle it's responses*/
+ if(HSS_FD == g_s6a_cfg.hss_type) {
+ /*Use main thread for ULR or stats etc.*/
+ while(1) {
+ sleep(10);
+ }
+ } else {
+
+ while(1) {
+ bzero(buf, sizeof(buf));
+
+ if ((len = read(g_our_hss_fd, buf,
+ sizeof(struct hss_resp_msg))) < 0) {
+ log_msg(LOG_ERROR, "Error reading hss buff\n");
+ perror("reading stream message");
+ exit(-1);
+ } else if (len == 0) {
+ log_msg(LOG_ERROR, "Error reading hss buff\n");
+ perror("reading stream message");
+ exit(-1);
+ }else {
+ unsigned char *tmp_buf = (unsigned char *)
+ calloc(sizeof(char), len);
+ memcpy(tmp_buf, buf, len);
+ log_msg(LOG_INFO, "HSS Received msg len : %d \n",len);
+ insert_job(g_tpool, hss_resp_handler, tmp_buf);
+ }
+ }
+ } /*else - HSS_PERF*/
+}
+
+/**
+ * brief main for s6a application
+ * @param argc and argv
+ * @return int - program's exit code
+ */
+int
+main(int argc, char **argv)
+{
+
+ memcpy (processName, argv[0], strlen(argv[0]));
+ pid = getpid();
+
+ /*Check cmd line arguments for config file path*/
+ check_args(argc, argv);
+
+ init_parser("conf/s6a.json");
+ parse_s6a_conf();
+
+ if(HSS_FD == g_s6a_cfg.hss_type){
+ /*Initialize free diameter*/
+ init_fd();
+ } else {
+ init_hss_rpc();
+ /* Initialize thread pool for handling HSS resp*/
+ g_tpool = thread_pool_new(HSS_RESP_THREADPOOL_SIZE);
+ if (g_tpool == NULL) {
+ log_msg(LOG_ERROR, "Error in creating thread pool. \n");
+ return -1;
+ }
+ }
+
+ init_s6a_ipc();
+
+ /*Initialize listner for AIR and ULR from mme-app*/
+ init_handlers();
+
+ s6a_run();
+
+ return 0;
+}