gsup_server: Implement IPA CCM handling using new libosmo-abis function
diff --git a/src/gsup_server.c b/src/gsup_server.c
index 41a03f4..525b3b5 100644
--- a/src/gsup_server.c
+++ b/src/gsup_server.c
@@ -45,7 +45,6 @@
 	return 0;
 }
 
-
 /* Data from a given client has arrived over the socket */
 static int osmo_gsup_server_read_cb(struct ipa_server_conn *conn,
 			       struct msgb *msg)
@@ -54,39 +53,18 @@
 	struct ipaccess_head_ext *he = (struct ipaccess_head_ext *) msgb_l2(msg);
 	struct osmo_gsup_conn *clnt = (struct osmo_gsup_conn *)conn->data;
 	int rc;
-	static struct ipaccess_unit ipa_dev = {
-		.unit_name = "HLR",
-		/* FIXME */
-	};
 
 	msg->l2h = &hh->data[0];
 
-	/* FIXME: not BTS for server side? */
-#if 0
-	rc = ipaccess_bts_handle_ccm(conn, &ipa_dev, msg);
-
-	if (rc < 0) {
-		LOGP(DLGSUP, LOGL_NOTICE,
-		     "GSUP received an invalid IPA/CCM message from %s:%d\n",
-		     conn->addr, conn->port);
-		/* Link has been closed */
-		clnt->is_connected = 0;
-		msgb_free(msg);
-		return -1;
-	}
-
-	if (rc == 1) {
-		uint8_t msg_type = *(msg->l2h);
-		/* CCM message */
-		if (msg_type == IPAC_MSGT_PONG) {
-			LOGP(DLGSUP, LOGL_DEBUG, "GSUP receiving PONG\n");
-			clnt->got_ipa_pong = 1;
+	if (hh->proto == IPAC_PROTO_IPACCESS) {
+		rc = ipa_server_conn_ccm(conn, msg);
+		if (rc < 0) {
+			/* conn is already invalid here! */
+			msgb_free(msg);
+			return -1;
 		}
-
-		msgb_free(msg);
 		return 0;
 	}
-#endif
 
 	if (hh->proto != IPAC_PROTO_OSMO)
 		goto invalid;
@@ -117,6 +95,15 @@
 
 }
 
+static int osmo_gsup_server_ccm_cb(struct ipa_server_conn *conn,
+				   struct msgb *msg, struct tlv_parsed *tlvp,
+				   struct ipaccess_unit *unit)
+{
+	LOGP(DLGSUP, LOGL_INFO, "CCM Callback\n");
+	/* TODO: ? */
+	return 0;
+}
+
 static int osmo_gsup_server_closed_cb(struct ipa_server_conn *conn)
 {
 	struct osmo_gsup_conn *clnt = (struct osmo_gsup_conn *)conn->data;
@@ -135,6 +122,7 @@
 	struct osmo_gsup_conn *conn;
 	struct osmo_gsup_server *gsups =
 		(struct osmo_gsup_server *) link->data;
+	int rc;
 
 	conn = talloc_zero(link->data, struct osmo_gsup_conn);
 	OSMO_ASSERT(conn);
@@ -142,6 +130,7 @@
 	conn->conn = ipa_server_conn_create(conn, link, fd,
 					   osmo_gsup_server_read_cb,
 					   osmo_gsup_server_closed_cb, conn);
+	conn->conn->ccm_cb = osmo_gsup_server_ccm_cb;
 	OSMO_ASSERT(conn->conn);
 
 	/* link data structure with server structure */
@@ -150,13 +139,20 @@
 
 	LOGP(DLGSUP, LOGL_INFO, "New GSUP client %s:%d\n",
 		conn->conn->addr, conn->conn->port);
+
+	/* request the identity of the client */
+	rc = ipa_ccm_send_id_req(fd);
+	if (rc < 0)
+		goto failed;
 #if 0
 	rc = oap_init(&gsups->oap_config, &conn->oap_state);
 	if (rc != 0)
 		goto failed;
-failed:
 #endif
 	return 0;
+failed:
+	ipa_server_conn_destroy(conn->conn);
+	return -1;
 }
 
 struct osmo_gsup_server *