ns2: nse: add a uptime/downtime to track the last state change

To show adminstrator the last state change of a nse add a timestamp and
show it on the vty

> show ns nse 1234

NSEI 01234: UDP, ALIVE since 0d 0h 0m 16s
 FSM Instance Name: 'GPRS-NS2-SNS-SGSN(NSE01234-SNS)[0x6120000012a0]', ID: 'NSE01234-SNS'
  Log-Level: 'DEBUG', State: 'CONFIGURED'
  Timer: 4
 Maximum number of remote  NS-VCs: 8, IPv4 Endpoints: 2, IPv6 Endpoints: 0
 [...]

Related: OS#5028
Change-Id: I8143080a3c5c9a55d37dfad44ba2ac6561daa216
diff --git a/src/gb/gprs_ns2.c b/src/gb/gprs_ns2.c
index 6c48ca6..c00537d 100644
--- a/src/gb/gprs_ns2.c
+++ b/src/gb/gprs_ns2.c
@@ -838,6 +838,7 @@
 	nse->mtu = 0;
 	llist_add_tail(&nse->list, &nsi->nse);
 	INIT_LLIST_HEAD(&nse->nsvc);
+	osmo_clock_gettime(CLOCK_MONOTONIC, &nse->ts_alive_change);
 
 	return nse;
 }
@@ -1400,6 +1401,7 @@
 	/* wait until both data_weight and sig_weight are != 0 before declaring NSE as alive */
 	if (unblocked && nse->sum_data_weight && nse->sum_sig_weight) {
 		nse->alive = true;
+		osmo_clock_gettime(CLOCK_MONOTONIC, &nse->ts_alive_change);
 		ns2_prim_status_ind(nse, NULL, 0, GPRS_NS2_AFF_CAUSE_RECOVERY);
 		nse->first = false;
 		return;
@@ -1408,6 +1410,7 @@
 	if (nse->alive && (nse->sum_data_weight == 0 || nse->sum_sig_weight == 0)) {
 		/* nse became unavailable */
 		nse->alive = false;
+		osmo_clock_gettime(CLOCK_MONOTONIC, &nse->ts_alive_change);
 		ns2_prim_status_ind(nse, NULL, 0, GPRS_NS2_AFF_CAUSE_FAILURE);
 	}
 }