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;
+}