diff --git a/app/test-crypto-perf/cperf_ops.c b/app/test-crypto-perf/cperf_ops.c
index 479c40e..8baee12 100644
--- a/app/test-crypto-perf/cperf_ops.c
+++ b/app/test-crypto-perf/cperf_ops.c
@@ -45,7 +45,8 @@ test_ipsec_vec_populate(struct rte_mbuf *m, const struct cperf_options *options,
 
 	if ((options->aead_op == RTE_CRYPTO_AEAD_OP_ENCRYPT) ||
 		(options->cipher_op == RTE_CRYPTO_CIPHER_OP_ENCRYPT)) {
-		memcpy(ip, test_vector->plaintext.data, m->data_len);
+		memcpy(ip, test_vector->plaintext.data,
+		       sizeof(struct rte_ipv4_hdr));
 
 		ip->total_length = rte_cpu_to_be_16(m->data_len);
 	}
@@ -61,7 +62,6 @@ cperf_set_ops_security(struct rte_crypto_op **ops,
 		uint16_t iv_offset __rte_unused, uint32_t *imix_idx,
 		uint64_t *tsc_start)
 {
-	uint64_t tsc_start_temp, tsc_end_temp;
 	uint16_t i;
 
 	for (i = 0; i < nb_ops; i++) {
@@ -79,27 +79,10 @@ cperf_set_ops_security(struct rte_crypto_op **ops,
 		sym_op->m_src = (struct rte_mbuf *)((uint8_t *)ops[i] +
 							src_buf_offset);
 
-		if (options->op_type == CPERF_PDCP ||
-				options->op_type == CPERF_IPSEC) {
-			/* In case of IPsec, headroom is consumed by PMD,
-			 * hence resetting it.
-			 */
-			sym_op->m_src->data_off = options->headroom_sz;
-
+		if (options->op_type == CPERF_PDCP) {
 			sym_op->m_src->buf_len = options->segment_sz;
 			sym_op->m_src->data_len = options->test_buffer_size;
 			sym_op->m_src->pkt_len = sym_op->m_src->data_len;
-
-			if ((options->op_type == CPERF_IPSEC) &&
-			    (options->test_file == NULL) &&
-			    (options->test == CPERF_TEST_TYPE_THROUGHPUT)) {
-				tsc_start_temp = rte_rdtsc_precise();
-				test_ipsec_vec_populate(sym_op->m_src, options,
-							test_vector);
-				tsc_end_temp = rte_rdtsc_precise();
-
-				*tsc_start += (tsc_end_temp - tsc_start_temp);
-			}
 		}
 
 		if (options->op_type == CPERF_DOCSIS) {
@@ -135,8 +118,71 @@ cperf_set_ops_security(struct rte_crypto_op **ops,
 							dst_buf_offset);
 	}
 
+	RTE_SET_USED(tsc_start);
+	RTE_SET_USED(test_vector);
+
+	return 0;
+}
+
+static int
+cperf_set_ops_security_ipsec(struct rte_crypto_op **ops,
+		uint32_t src_buf_offset __rte_unused,
+		uint32_t dst_buf_offset __rte_unused,
+		uint16_t nb_ops, struct rte_cryptodev_sym_session *sess,
+		const struct cperf_options *options,
+		const struct cperf_test_vector *test_vector,
+		uint16_t iv_offset __rte_unused, uint32_t *imix_idx,
+		uint64_t *tsc_start)
+{
+	struct rte_security_session *sec_sess =
+			(struct rte_security_session *)sess;
+	const uint32_t test_buffer_size = options->test_buffer_size;
+	const uint32_t headroom_sz = options->headroom_sz;
+	const uint32_t segment_sz = options->segment_sz;
+	uint64_t tsc_start_temp, tsc_end_temp;
+	uint16_t i = 0;
+
+	RTE_SET_USED(imix_idx);
+
+	for (i = 0; i < nb_ops; i++) {
+		struct rte_crypto_sym_op *sym_op = ops[i]->sym;
+		struct rte_mbuf *m = sym_op->m_src;
+
+		ops[i]->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;
+		rte_security_attach_session(ops[i], sec_sess);
+		sym_op->m_src = (struct rte_mbuf *)((uint8_t *)ops[i] +
+							src_buf_offset);
+
+		/* In case of IPsec, headroom is consumed by PMD,
+		 * hence resetting it.
+		 */
+		m->data_off = headroom_sz;
+
+		m->buf_len = segment_sz;
+		m->data_len = test_buffer_size;
+		m->pkt_len = test_buffer_size;
+
+		sym_op->m_dst = NULL;
+	}
+
+	if (options->test_file != NULL)
+		return 0;
+
+	tsc_start_temp = rte_rdtsc_precise();
+
+	for (i = 0; i < nb_ops; i++) {
+		struct rte_crypto_sym_op *sym_op = ops[i]->sym;
+		struct rte_mbuf *m = sym_op->m_src;
+
+		test_ipsec_vec_populate(m, options, test_vector);
+	}
+
+	tsc_end_temp = rte_rdtsc_precise();
+	*tsc_start += tsc_end_temp - tsc_start_temp;
+
 	return 0;
 }
+
 #endif
 
 static int
@@ -1055,10 +1101,12 @@ cperf_get_op_functions(const struct cperf_options *options,
 		break;
 #ifdef RTE_LIB_SECURITY
 	case CPERF_PDCP:
-	case CPERF_IPSEC:
 	case CPERF_DOCSIS:
 		op_fns->populate_ops = cperf_set_ops_security;
 		break;
+	case CPERF_IPSEC:
+		op_fns->populate_ops = cperf_set_ops_security_ipsec;
+		break;
 #endif
 	default:
 		return -1;
diff --git a/app/test-crypto-perf/cperf_test_latency.c b/app/test-crypto-perf/cperf_test_latency.c
index 4c7bc72..9ada431 100644
--- a/app/test-crypto-perf/cperf_test_latency.c
+++ b/app/test-crypto-perf/cperf_test_latency.c
@@ -199,7 +199,7 @@ cperf_latency_test_runner(void *arg)
 					ctx->dst_buf_offset,
 					burst_size, ctx->sess, ctx->options,
 					ctx->test_vector, iv_offset,
-					&imix_idx, NULL);
+					&imix_idx, &tsc_start);
 
 			tsc_start = rte_rdtsc_precise();
 
