MME2 changes - Propped commits from openmme/paging branch. Added scripts
for code gen

Change-Id: Ie55032217232214ac8544ca76ea34335205329e4
diff --git a/src/s11/main.c b/src/s11/main.c
new file mode 100644
index 0000000..489a433
--- /dev/null
+++ b/src/s11/main.c
@@ -0,0 +1,274 @@
+/*
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "thread_pool.h"
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "message_queues.h"
+#include "s11.h"
+#include "s11_config.h"
+#include <sys/types.h>
+#include "msgType.h"
+#include "../gtpV2Codec/gtpV2StackWrappers.h"
+/**Global and externs **/
+extern s11_config g_s11_cfg;
+
+/*S11 CP communication parameters*/
+int g_s11_fd;
+struct sockaddr_in g_s11_cp_addr;
+socklen_t g_s11_serv_size;
+struct sockaddr_in g_client_addr;
+socklen_t g_client_addr_size;
+int ipc_reader_tipc_s11;
+
+/*Connections to send response(CS/MB) to mme-app*/
+int g_resp_fd;
+
+pthread_t tipcReaderS11_t;
+
+pthread_mutex_t s11_net_lock = PTHREAD_MUTEX_INITIALIZER;
+
+struct thread_pool *g_tpool;
+struct thread_pool *g_tpool_tipc_reader_s11;
+/**End: global and externs**/
+
+extern char processName[255];
+extern int pid;
+
+
+void
+handle_mmeapp_message_s11(void * data)
+{
+	char *msg = ((char *) data) + (sizeof(uint32_t)*2);
+
+	msg_type_t* msg_type = (msg_type_t*)(msg);
+
+	switch(*msg_type)
+	{
+	case create_session_request:
+		create_session_handler(msg);
+		break;
+	case modify_bearer_request:
+		modify_bearer_handler(msg);
+		break;
+	case delete_session_request:
+		delete_session_handler(msg);
+		break;
+	case release_bearer_request:
+		release_bearer_handler(msg);
+		break;
+	case ddn_acknowledgement:
+		ddn_ack_handler(msg);
+		break;
+	default:
+		break;
+	}
+	free(data);
+}
+
+void * tipc_msg_handler_s11()
+{
+	int bytesRead = 0;
+	while (1)
+	{
+		unsigned char buffer[255] = {0};
+		if ((bytesRead = read_tipc_msg(ipc_reader_tipc_s11, buffer, 255)) > 0)
+		{
+			unsigned char *tmpBuf = (unsigned char *) malloc(sizeof(char) * bytesRead);
+			memcpy(tmpBuf, buffer, bytesRead);
+			log_msg(LOG_INFO, "S11 message received from mme-app");
+			insert_job(g_tpool_tipc_reader_s11, handle_mmeapp_message_s11, tmpBuf);
+		}
+	}
+}
+struct GtpV2Stack* gtpStack_gp = NULL;
+extern struct MsgBuffer* csReqMsgBuf_p;
+extern struct MsgBuffer* mbReqMsgBuf_p;
+extern struct MsgBuffer* dsReqMsgBuf_p;
+extern struct MsgBuffer* rbReqMsgBuf_p;
+extern struct MsgBuffer* ddnAckMsgBuf_p;
+
+int
+init_s11_workers()
+{
+	if ((ipc_reader_tipc_s11 = 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_s11, s11AppInstanceNum_c) != 1)
+	{
+		log_msg(LOG_ERROR, "Failed to bind IPC Reader tipc socket \n");
+		return -E_FAIL;
+	}
+
+	/* Initialize thread pool for mme-app messages */
+	g_tpool_tipc_reader_s11 = thread_pool_new(3);
+
+	if (g_tpool_tipc_reader_s11 == NULL) {
+		log_msg(LOG_ERROR, "Error in creating thread pool. \n");
+		return -E_FAIL_INIT;
+	}
+
+	log_msg(LOG_INFO, "S11 Listener thead pool initalized.\n");
+
+	// thread to read incoming ipc messages from tipc socket
+	pthread_attr_t attr;
+	pthread_attr_init(&attr);
+	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+	pthread_create(&tipcReaderS11_t, &attr, &tipc_msg_handler_s11, NULL);
+	pthread_attr_destroy(&attr);
+
+	return 0;
+}
+
+/*Initialize sctp socket connection for eNB*/
+int
+init_gtpv2()
+{
+	/*Create UDP socket*/
+	g_s11_fd = socket(PF_INET, SOCK_DGRAM, 0);
+
+	g_client_addr.sin_family = AF_INET;
+	//g_client_addr.sin_addr.s_addr = htonl(g_s11_cfg.local_egtp_ip);
+	g_client_addr.sin_addr.s_addr = htonl(g_s11_cfg.local_egtp_ip);
+	fprintf(stderr, "....................local egtp %d\n", g_s11_cfg.local_egtp_ip);
+	//g_client_addr.sin_port = htons(0); /* TODO: Read value from config */
+	g_client_addr.sin_port = htons(g_s11_cfg.egtp_def_port);
+
+	bind(g_s11_fd, (struct sockaddr *)&g_client_addr, sizeof(g_client_addr));
+	g_client_addr_size = sizeof(g_client_addr);
+
+	/*Configure settings in address struct*/
+	g_s11_cp_addr.sin_family = AF_INET;
+	//g_s11_cp_addr.sin_port = htons(g_s11_cfg.egtp_def_port);
+	fprintf(stderr, ".................... egtp def port %d\n", g_s11_cfg.egtp_def_port);
+	g_s11_cp_addr.sin_port = htons(g_s11_cfg.egtp_def_port);
+	//g_s11_cp_addr.sin_addr.s_addr = htonl(g_s11_cfg.sgw_ip);
+	fprintf(stderr, "....................sgw ip %d\n", g_s11_cfg.sgw_ip);
+	g_s11_cp_addr.sin_addr.s_addr = htonl(g_s11_cfg.sgw_ip);
+	memset(g_s11_cp_addr.sin_zero, '\0', sizeof(g_s11_cp_addr.sin_zero));
+
+	g_s11_serv_size = sizeof(g_s11_cp_addr);
+
+	return SUCCESS;
+}
+
+/**
+  Opening pipe connection from S11 app to MME(Single queue pipe)
+*/
+int
+init_s11_ipc()
+{
+	log_msg(LOG_INFO, "Connecting to mme-app S11 CS response queue\n");
+	if ((g_resp_fd  = create_tipc_socket()) <= 0)
+		return -E_FAIL;
+
+	log_msg(LOG_INFO, "S11 - mme-app IPC: Connected.\n");
+
+	return 0;
+}
+
+/**
+  Read incoming S11 messages and pass to threadpool
+  for processing.
+*/
+void
+s11_reader()
+{
+	unsigned char buffer[S11_GTPV2C_BUF_LEN];
+	int len;
+
+	while(1) {
+		//len = recvfrom(g_s11_fd, buffer, S11_GTPV2C_BUF_LEN, 0,
+		//	&g_client_addr, &g_client_addr_size);
+		len = recvfrom(g_s11_fd, buffer, S11_GTPV2C_BUF_LEN, 0,
+			(struct sockaddr*)&g_s11_cp_addr, &g_s11_serv_size);
+
+		if(len > 0) {
+			MsgBuffer* tmp_buf_p = createMsgBuffer(len);
+			MsgBuffer_writeBytes(tmp_buf_p, buffer, len, true);
+			MsgBuffer_rewind(tmp_buf_p);
+			log_msg(LOG_INFO, "S11 Received msg len : %d \n",len);
+			insert_job(g_tpool, handle_s11_message, tmp_buf_p);
+		}
+
+	}
+}
+
+int
+main(int argc, char **argv)
+{
+	memcpy (processName, argv[0], strlen(argv[0]));
+	pid = getpid();
+
+	init_parser("conf/s11.json");
+	parse_s11_conf();
+
+	// init stack
+	gtpStack_gp = createGtpV2Stack();
+	if (gtpStack_gp == NULL)
+	{
+		log_msg(LOG_ERROR, "Error in initializing ipc.\n");
+		return -1;
+	}
+
+	csReqMsgBuf_p = createMsgBuffer(4096);
+	mbReqMsgBuf_p = createMsgBuffer(4096);
+	dsReqMsgBuf_p = createMsgBuffer(4096);
+	rbReqMsgBuf_p = createMsgBuffer(4096);
+	ddnAckMsgBuf_p = createMsgBuffer(4096);
+
+	if (csReqMsgBuf_p == NULL || mbReqMsgBuf_p == NULL || dsReqMsgBuf_p == NULL || rbReqMsgBuf_p == NULL || ddnAckMsgBuf_p == NULL)
+	{
+		log_msg(LOG_ERROR, "Error in initializing msg buffers required by gtp codec.\n");
+		return -1;
+	}
+
+	/*Init writer sockets*/
+	if (init_s11_ipc() != 0) {
+		log_msg(LOG_ERROR, "Error in initializing ipc.\n");
+		return -1;
+	}
+
+	init_s11_workers();
+
+	/* Initialize thread pool for S11 messages from CP*/
+	g_tpool = thread_pool_new(S11_THREADPOOL_SIZE);
+
+	if (g_tpool == NULL) {
+		log_msg(LOG_ERROR, "Error in creating thread pool. \n");
+		return -1;
+	}
+	log_msg(LOG_INFO, "S11 listener threadpool initialized.\n");
+
+	if (init_gtpv2() != 0)
+		return -1;
+
+	s11_reader();
+
+	return 0;
+}