rspro_client_fsm: Disconnect if Connect{Client,Bank}Res != ok

Change-Id: Id199f9c4cb4c86fd0dba8939334ac69878f4a3f5
diff --git a/src/rspro_client_fsm.c b/src/rspro_client_fsm.c
index f21dfd2..75d0f80 100644
--- a/src/rspro_client_fsm.c
+++ b/src/rspro_client_fsm.c
@@ -223,14 +223,25 @@
 
 static void srvc_st_established(struct osmo_fsm_inst *fi, uint32_t event, void *data)
 {
+	struct rspro_server_conn *srvc = (struct rspro_server_conn *) fi->priv;
+	RsproPDU_t *pdu = NULL;
+	e_ResultCode res;
+
 	switch (event) {
 	case SRVC_E_TCP_DOWN:
 	case SRVC_E_KA_TIMEOUT:
 		osmo_fsm_inst_state_chg(fi, SRVC_ST_REESTABLISH, T2_RECONNECT, 2);
 		break;
 	case SRVC_E_CLIENT_CONN_RES:
-		/* somehow notify the main code? */
-		osmo_fsm_inst_state_chg(fi, SRVC_ST_CONNECTED, 0, 0);
+		pdu = data;
+		res = rspro_get_result(pdu);
+		if (res != ResultCode_ok) {
+			ipa_client_conn_close(srvc->conn);
+			osmo_fsm_inst_dispatch(fi, SRVC_E_TCP_DOWN, NULL);
+		} else {
+			/* somehow notify the main code? */
+			osmo_fsm_inst_state_chg(fi, SRVC_ST_CONNECTED, 0, 0);
+		}
 		break;
 	default:
 		OSMO_ASSERT(0);
diff --git a/src/rspro_util.c b/src/rspro_util.c
index cad7412..35619ad 100644
--- a/src/rspro_util.c
+++ b/src/rspro_util.c
@@ -376,6 +376,28 @@
 	return pdu;
 }
 
+e_ResultCode rspro_get_result(const RsproPDU_t *pdu)
+{
+	switch (pdu->msg.present) {
+	case RsproPDUchoice_PR_connectBankRes:
+		return pdu->msg.choice.connectBankRes.result;
+	case RsproPDUchoice_PR_connectClientRes:
+		return pdu->msg.choice.connectClientRes.result;
+	case RsproPDUchoice_PR_createMappingRes:
+		return pdu->msg.choice.createMappingRes.result;
+	case RsproPDUchoice_PR_removeMappingRes:
+		return pdu->msg.choice.removeMappingRes.result;
+	case RsproPDUchoice_PR_configClientIdRes:
+		return pdu->msg.choice.configClientIdRes.result;
+	case RsproPDUchoice_PR_configClientBankRes:
+		return pdu->msg.choice.configClientBankRes.result;
+	case RsproPDUchoice_PR_setAtrRes:
+		return pdu->msg.choice.setAtrRes.result;
+	default:
+		OSMO_ASSERT(0);
+	}
+}
+
 void rspro2bank_slot(struct bank_slot *out, const BankSlot_t *in)
 {
 	out->bank_id = in->bankId;
diff --git a/src/rspro_util.h b/src/rspro_util.h
index a3eb380..6164e58 100644
--- a/src/rspro_util.h
+++ b/src/rspro_util.h
@@ -42,6 +42,8 @@
 RsproPDU_t *rspro_gen_TpduCard2Modem(const BankSlot_t *bank, const ClientSlot_t *client,
 				     const uint8_t *tpdu, unsigned int tpdu_len);
 
+e_ResultCode rspro_get_result(const RsproPDU_t *pdu);
+
 void rspro_comp_id_retrieve(struct app_comp_id *out, const ComponentIdentity_t *in);
 const char *rspro_IpAddr2str(const IpAddress_t *in);