gprs_ns2: rework id strings of nsvcs

Ensure all nsvcs ids are unique as UDP ids might not be unique when
multiple NSVCs connect to the same remote endpoint (multiple binds).
Change the format of all ids to look similiar.
FR: NSE11-NSVC23-FR-fr0-DLCI13.
UDP: NSE11-NSVC-UDP-10.0.0.1:23000-192.168.1.1:24000
UDP: NSE11-NSVC23-UDP-10.0.0.1:23000-192.168.1.1:24000
UDP: NSE11-NSVC66-UDP-[fd01::1]:23000-[fd03::2]:24000

Change-Id: I618e263e73fcc64d4e46b57aa3a2cb2783837907
diff --git a/src/gb/gprs_ns2.c b/src/gb/gprs_ns2.c
index d72f34e..975909b 100644
--- a/src/gb/gprs_ns2.c
+++ b/src/gb/gprs_ns2.c
@@ -980,7 +980,8 @@
 	enum gprs_ns2_vc_mode vc_mode;
 	uint16_t nsvci;
 	uint16_t nsei;
-	char idbuf[32];
+	const struct osmo_sockaddr *local;
+	char idbuf[256], tmp[INET6_ADDRSTRLEN + 8];
 
 	int rc, tlv;
 
@@ -1113,8 +1114,12 @@
 
 	nsvci = tlvp_val16be(&tp, NS_IE_VCI);
 	vc_mode = ns2_dialect_to_vc_mode(dialect);
-	snprintf(idbuf, sizeof(idbuf), "%s-NSE%05u-NSVC%05u", gprs_ns2_lltype_str(nse->ll),
-		 nse->nsei, nsvci);
+
+	local = gprs_ns2_ip_bind_sockaddr(bind);
+	osmo_sockaddr_to_str_buf(tmp, sizeof(tmp), local);
+	snprintf(idbuf, sizeof(idbuf), "%s-NSE%05u-NSVC%05u-%s-%s", gprs_ns2_lltype_str(nse->ll),
+		 nse->nsei, nsvci, tmp, osmo_sockaddr_to_str(remote));
+	osmo_identifier_sanitize_buf(idbuf, NULL, '_');
 	nsvc = ns2_vc_alloc(bind, nse, false, vc_mode, idbuf);
 	if (!nsvc)
 		return NS2_CS_SKIPPED;