MME2 changes - Propped commits from openmme/paging branch. Added scripts
for code gen
Change-Id: Ie55032217232214ac8544ca76ea34335205329e4
diff --git a/src/s1ap/handlers/s1setup.c b/src/s1ap/handlers/s1setup.c
new file mode 100644
index 0000000..60e92d7
--- /dev/null
+++ b/src/s1ap/handlers/s1setup.c
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ *
+ * 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 <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "sctp_conn.h"
+#include "s1ap_structs.h"
+#include "s1ap_msg_codes.h"
+
+extern int g_enb_fd;
+extern s1ap_config g_s1ap_cfg;
+static struct Buffer resp_buf;
+
+int
+create_s1setup_response(/*enb info,*/unsigned char **s1_setup_resp)
+{
+ unsigned char data_len = 0;
+ unsigned char msg[50];
+ struct Buffer proto_ies;
+ struct Buffer gummies;
+ uint16_t proto_ie_id;
+ unsigned char tmp_str[4];
+ uint8_t criticality;
+
+ /*Leave a byte to fill length*/
+ resp_buf.pos = 0;
+ /*Only in case of s1setup resp, first byte is 0x20, not for any other
+ s1ap message. Nothing found in specs, please check.*/
+ /**procedureCode: id-S1Setup (17)**/
+ msg[0] = 0x20;
+ msg[1] = S1AP_SETUP_REQUEST_CODE;
+ msg[2] = CRITICALITY_REJECT;
+ buffer_copy(&resp_buf, msg, 3);
+
+ /**IE1*/
+ /**Item 0: id-MMEname*/
+ proto_ie_id = S1AP_IE_MMENAME;
+ copyU16(tmp_str, proto_ie_id);
+ buffer_copy(&proto_ies, tmp_str, sizeof(proto_ie_id));
+ criticality = CRITICALITY_IGNORE;
+ buffer_copy(&proto_ies, &criticality, sizeof(criticality));
+
+ data_len = strlen(g_s1ap_cfg.mme_name);
+ data_len = copyU16(tmp_str, data_len);
+ tmp_str[1] = tmp_str[1]+2;
+ buffer_copy(&proto_ies, &tmp_str[1], 1);
+ proto_ies.buf[proto_ies.pos++] = 0x06;/*quest: what is this in encoding?*/
+ proto_ies.buf[proto_ies.pos++] = 0x80;
+ buffer_copy(&proto_ies, g_s1ap_cfg.mme_name, strlen(g_s1ap_cfg.mme_name));
+
+ /*IE2*/
+ /**Item 1: id-ServedGUMMEIs*/
+ proto_ie_id = S1AP_IE_SERVED_GUMMEIES;
+ copyU16(tmp_str, proto_ie_id);
+ buffer_copy(&proto_ies, tmp_str, sizeof(proto_ie_id));
+ criticality = CRITICALITY_REJECT;
+ buffer_copy(&proto_ies, &criticality, sizeof(criticality));
+
+ //msg[i++] = 0x0b;//len
+ gummies.buf[0]=0x0;
+ gummies.buf[1]=0x0;
+ gummies.pos = 2;
+
+ /**Item 1: id-ServedGUMMEIs
+ * servedPLMNs: 1 item*/
+ buffer_copy(&gummies, &(g_s1ap_cfg.mme_plmn_id), sizeof(struct PLMN));
+ gummies.buf[gummies.pos++]=0x0;
+ gummies.buf[gummies.pos++]=0x0;
+
+ /**Item 1: id-ServedGUMMEIs
+ * servedGroupIDs: 1 item*/
+ data_len = copyU16(tmp_str, g_s1ap_cfg.mme_group_id);
+ buffer_copy(&gummies, tmp_str, data_len);
+
+ /**Item 1: id-ServedGUMMEIs
+ * servedMMECs: 1 item*/
+ gummies.buf[gummies.pos++]=0x0;
+ gummies.buf[gummies.pos++] = g_s1ap_cfg.mme_code;
+
+ data_len = copyU16(tmp_str, gummies.pos);
+ buffer_copy(&proto_ies, &(tmp_str[1]), 1);
+ buffer_copy(&proto_ies, &gummies.buf, gummies.pos);
+
+ /*IE3*/
+ /**id: id-RelativeMMECapacity (87)*/
+ proto_ie_id = S1AP_IE_REL_MME_CAPACITY;
+ copyU16(tmp_str, proto_ie_id);
+ buffer_copy(&proto_ies, tmp_str, sizeof(proto_ie_id));
+ criticality = CRITICALITY_IGNORE;
+ buffer_copy(&proto_ies, &criticality, sizeof(criticality));
+ data_len = 1;
+ buffer_copy(&proto_ies, &(data_len), 1);
+ g_s1ap_cfg.rel_cap = 1;
+ buffer_copy(&proto_ies, &(g_s1ap_cfg.rel_cap), 1);
+
+ /*number of proto IEs = 3*/
+ data_len = copyU16(tmp_str, 3);
+
+ data_len = data_len + proto_ies.pos + 1;
+ buffer_copy(&resp_buf, &data_len, 1);
+
+ resp_buf.buf[resp_buf.pos++] = 0;/*quest: packed value should be 2 bytes...
+ here it needs 3 bytes*/
+ buffer_copy(&resp_buf, tmp_str, 2);
+
+ buffer_copy(&resp_buf, &proto_ies, proto_ies.pos);
+ *s1_setup_resp = resp_buf.buf;
+
+ return resp_buf.pos;
+}
+
+int
+s1_setup_handler(InitiatingMessage_t *msg, int enb_fd)
+{
+ unsigned char *resp_msg = NULL;
+ int resp_len = 0;
+ /*struct proto_IE s1_init_ies;
+
+ /*****Message structure***
+ */
+ /*parse_IEs(msg+2, &s1_init_ies, S1AP_SETUP_REQUEST_CODE);
+
+ /*Validate all eNB info*/
+
+ /*Add eNB info to hash*/
+
+ /*Create S1Setup response*/
+ resp_len = create_s1setup_response(/*enb info,*/ &resp_msg);
+
+ /*Send S1Setup response*/
+ log_msg(LOG_INFO, "Send s1setup response.\n");
+ resp_len = send_sctp_msg(enb_fd, resp_msg, resp_len, 0);
+ log_msg(LOG_INFO, "send len %d\n", resp_len);
+ //free(resp_msg);
+
+ return SUCCESS;
+}
+