Diff between b0db5e1c330ade4cfa188105468aa6fd60293ab3 and f3904a8f1c2cae24bb19099143b2ea8e7511a7dd

Changed Files

File Additions Deletions Status
src/shared/hfp.c +39 -3 modified
unit/test-hfp.c +1 -0 modified

Full Patch

diff --git a/src/shared/hfp.c b/src/shared/hfp.c
index 2342c24..c2028ac 100644
--- a/src/shared/hfp.c
+++ b/src/shared/hfp.c
@@ -30,7 +30,11 @@
 	hfp_debug(_hfp->debug_callback, _hfp->debug_data, "%s:%s() " fmt, \
 						__FILE__, __func__, ## arg)
 
-#define HFP_HF_FEATURES	(HFP_HF_FEAT_CLIP | HFP_HF_FEAT_ESCO_S4_T2)
+#define HFP_HF_FEATURES	( \
+	HFP_HF_FEAT_ECNR | \
+	HFP_HF_FEAT_CLIP | \
+	HFP_HF_FEAT_ESCO_S4_T2 \
+)
 
 struct hfp_gw {
 	int ref_count;
@@ -1996,7 +2000,7 @@ static void clip_cb(struct hfp_context *context, void *user_data)
 							hfp->callbacks_data);
 }
 
-static void cmee_resp(enum hfp_result result, enum hfp_error cme_err,
+static void nrec_resp(enum hfp_result result, enum hfp_error cme_err,
 	void *user_data)
 {
 	struct hfp_hf *hfp = user_data;
@@ -2004,7 +2008,7 @@ static void cmee_resp(enum hfp_result result, enum hfp_error cme_err,
 	DBG(hfp, "");
 
 	if (result != HFP_RESULT_OK) {
-		DBG(hfp, "hf: CMEE error: %d", result);
+		DBG(hfp, "hf: NREC error: %d", result);
 		goto failed;
 	}
 
@@ -2020,6 +2024,38 @@ failed:
 						hfp->callbacks_data);
 }
 
+static void cmee_resp(enum hfp_result result, enum hfp_error cme_err,
+	void *user_data)
+{
+	struct hfp_hf *hfp = user_data;
+
+	DBG(hfp, "");
+
+	if (result != HFP_RESULT_OK) {
+		DBG(hfp, "hf: CMEE error: %d", result);
+		goto failed;
+	}
+
+	if (!(hfp->features & HFP_AG_FEAT_ECNR)) {
+		/* Jump to next setup state */
+		nrec_resp(HFP_RESULT_OK, cme_err, user_data);
+		return;
+	}
+
+	if (!hfp_hf_send_command(hfp, nrec_resp, hfp, "AT+NREC=0")) {
+		DBG(hfp, "hf: Could not send AT+NREC=0");
+		result = HFP_RESULT_ERROR;
+		goto failed;
+	}
+
+	return;
+
+failed:
+	if (hfp->callbacks->session_ready)
+		hfp->callbacks->session_ready(result, cme_err,
+						hfp->callbacks_data);
+}
+
 static void clip_resp(enum hfp_result result, enum hfp_error cme_err,
 	void *user_data)
 {
diff --git a/unit/test-hfp.c b/unit/test-hfp.c
index fc9fb18..94553d6 100644
--- a/unit/test-hfp.c
+++ b/unit/test-hfp.c
@@ -763,6 +763,7 @@ static void test_hf_robustness(gconstpointer data)
 		'0', ',', '\"', 'T', 'E', 'S', 'T', '\"', '\r', '\n'), \
 	frg_pdu('\r', '\n', 'O', 'K', '\r', '\n'), \
 	raw_pdu('\r', '\n', 'O', 'K', '\r', '\n'), \
+	raw_pdu('\r', '\n', 'O', 'K', '\r', '\n'), \
 	raw_pdu('\r', '\n', 'O', 'K', '\r', '\n')
 
 static void hf_cmd_complete(enum hfp_result res, enum hfp_error cme_err,