mme: Add code to derive NAS token from NAS ul_count

NAS Token is derived from kasme and NAS ul_count as specified in 3GPP TS
33.401 A.9, and its LSB 16 bits passed to the network when mapping the GUTI to
RAI+PTMSI+PTIMSI_SIG.

Take the chance to move guti2rai_ptmsi() up to before the place it is
used.
Change-Id: I5e6003a2fe3e74cc93cfe4a288e6c114aa288d0b
diff --git a/library/S1AP_Emulation.ttcn b/library/S1AP_Emulation.ttcn
index 1ef4a76..e3e3216 100644
--- a/library/S1AP_Emulation.ttcn
+++ b/library/S1AP_Emulation.ttcn
@@ -438,6 +438,7 @@
 		var S1APEM_Config s1cfg;
 		var charstring vlr_name, mme_name;
 		var integer ai;
+		var octetstring kasme;
 
 		alt {
 		/* Configuration primitive from client */
@@ -544,8 +545,13 @@
 			f_create_expect_proc(procedureCode, vc_conn);
 			S1AP_PROC.reply(S1APEM_register_proc:{procedureCode, vc_conn}) to vc_conn;
 			}
+		[] S1AP_PROC.getcall(S1APEM_derive_nas_token:{?, ?, -}) -> param(kasme, vc_conn) {
+			var integer assoc_id := f_assoc_id_by_comp(vc_conn);
+			var OCT32 nas_token := f_kdf_nas_token(kasme, S1apAssociationTable[assoc_id].nus.tx_count)
+			S1apAssociationTable[assoc_id].nus.tx_count := S1apAssociationTable[assoc_id].nus.tx_count + 1;
+			S1AP_PROC.reply(S1APEM_derive_nas_token:{kasme, vc_conn, nas_token}) to vc_conn;
+			}
 		}
-
 	}
 }
 
@@ -566,10 +572,12 @@
 
 signature S1APEM_register(in MME_UE_S1AP_ID mme_id, in ENB_UE_S1AP_ID enb_id, in S1AP_ConnHdlr hdlr);
 signature S1APEM_register_proc(in integer procedureCode, in S1AP_ConnHdlr hdlr);
+signature S1APEM_derive_nas_token(in octetstring kasme, in S1AP_ConnHdlr hdlr, out OCT32 nas_token);
 
 type port S1APEM_PROC_PT procedure {
 	inout S1APEM_register;
 	inout S1APEM_register_proc;
+	inout S1APEM_derive_nas_token;
 } with { extension "internal" };
 
 /* Function that can be used as create_cb and will use the expect table */
@@ -669,6 +677,17 @@
 	log(procedureCode);
 }
 
+/* Derive NAS Token (and post-increment ul_count): */
+function f_s1apem_derive_nas_token(in octetstring kasme) runs on S1AP_ConnHdlr return OCT32
+{
+	var OCT32 nas_token;
+	S1AP_PROC.call(S1APEM_derive_nas_token:{kasme, self, -}) {
+		[] S1AP_PROC.getreply(S1APEM_derive_nas_token:{kasme, self, ?}) -> param(nas_token) {
+			return nas_token;
+		};
+	}
+}
+
 private function f_expect_table_init()
 runs on S1AP_Emulation_CT {
 	var integer i;