NS_Emulation: Delay Tx of first NS-RESET until Provider tells us it's up

Change-Id: I300cfeb120540940990a834596b0a83a539df080
diff --git a/library/NS_Emulation.ttcnpp b/library/NS_Emulation.ttcnpp
index dcc0e17..ee25d3e 100644
--- a/library/NS_Emulation.ttcnpp
+++ b/library/NS_Emulation.ttcnpp
@@ -108,10 +108,6 @@
 		}
 
 		f_change_state(NSE_S_DEAD_BLOCKED);
-		/* Send the first NS-ALIVE to test the connection */
-		if (not config.role_sgsn) {
-			f_sendReset();
-		}
 	}
 
 	type component NS_Provider_CT {
@@ -151,6 +147,7 @@
 		timer Tns_alive := 3.0;
 		timer Tns_test := 10.0;
 		timer Tns_block := 10.0;
+		timer Tns_reset := 10.0;
 	}
 
 	type record NSConfigurationIP {
@@ -185,6 +182,7 @@
 
 	private function f_sendReset() runs on NS_CT {
 		NSCP.send(ts_NS_RESET(NS_CAUSE_OM_INTERVENTION, config.nsvci, config.nsei));
+		Tns_reset.start;
 		g_state := NSE_S_WAIT_RESET;
 	}
 
@@ -219,12 +217,17 @@
 			f_sendAlive();
 		}
 
-		[] NSCP.receive(NS_Provider_Evt:{link_status:=NS_PROV_LINK_STATUS_UP}) {
+		[config.role_sgsn] NSCP.receive(NS_Provider_Evt:{link_status:=NS_PROV_LINK_STATUS_UP}) {
 			log("Provider Link came up: sending NS-ALIVE");
 			f_sendAlive();
 			Tns_test.start;
 			}
 
+		[not config.role_sgsn] NSCP.receive(NS_Provider_Evt:{link_status:=NS_PROV_LINK_STATUS_UP}) {
+			log("Provider Link came up: sending NS-RESET");
+			f_sendReset();
+			}
+
 		/* Stop t_alive when receiving ALIVE-ACK */
 		[Tns_alive.running] NSCP.receive(t_NS_ALIVE_ACK) {
 			log("NS-ALIVE-ACK received: stopping Tns-alive; starting Tns-test");
@@ -363,7 +366,14 @@
 
 	private altstep as_wait_reset() runs on NS_CT {
 		var PDU_NS rf;
+		[] Tns_reset.timeout {
+			/* If the sending entity of an NS-RESET PDU receives no NS-RESET-ACK PDU before timer
+			 * Tns-reset expires the corresponding NS-VCs shall remain blocked and dead and the
+			 * entire reset procedure shall be repeated */
+			f_sendReset();
+			}
 		[] NSCP.receive(tr_NS_RESET_ACK(config.nsvci, config.nsei)) -> value rf {
+			Tns_reset.stop;
 			f_change_state(NSE_S_ALIVE_BLOCKED);
 			f_sendAlive();
 			f_sendUnblock();