Add unit test for IPsec stateless processing.

Signed-off-by: Aakash Sasidharan <asasidha...@marvell.com>
---
 app/test/test_ipsec.c | 111 +++++++++++++++++++++++++++++++++++++-----
 1 file changed, 98 insertions(+), 13 deletions(-)

diff --git a/app/test/test_ipsec.c b/app/test/test_ipsec.c
index 6cb1bac1e7..f65b3eedc5 100644
--- a/app/test/test_ipsec.c
+++ b/app/test/test_ipsec.c
@@ -53,6 +53,7 @@ test_ipsec(void)
 #define BURST_SIZE             32
 #define REORDER_PKTS   1
 #define DEQUEUE_COUNT  1000
+#define SQN_START              255
 
 struct user_params {
        enum rte_crypto_sym_xform_type auth;
@@ -82,6 +83,7 @@ struct ipsec_unitest_params {
 
        struct rte_security_ipsec_xform ipsec_xform;
 
+       struct rte_ipsec_state ipsec_state;
        struct rte_ipsec_sa_prm sa_prm;
        struct rte_ipsec_session ss[MAX_NB_SAS];
 
@@ -91,6 +93,7 @@ struct ipsec_unitest_params {
                *testbuf[BURST_SIZE];
 
        uint16_t pkt_index;
+       bool is_stateless;
 };
 
 struct ipsec_test_cfg {
@@ -773,8 +776,13 @@ crypto_ipsec(uint16_t num_pkts)
        struct rte_ipsec_group grp[1];
 
        /* call crypto prepare */
-       k = rte_ipsec_pkt_crypto_prepare(&ut_params->ss[0], ut_params->ibuf,
-               ut_params->cop, num_pkts);
+       if (ut_params->is_stateless && (ut_params->ipsec_state.sqn != 0))
+               k = rte_ipsec_pkt_crypto_prepare_stateless(&ut_params->ss[0],
+                       ut_params->ibuf, ut_params->cop, num_pkts, 
&ut_params->ipsec_state);
+       else
+               k = rte_ipsec_pkt_crypto_prepare(&ut_params->ss[0], 
ut_params->ibuf,
+                       ut_params->cop, num_pkts);
+
        if (k != num_pkts) {
                RTE_LOG(ERR, USER1, "rte_ipsec_pkt_crypto_prepare fail\n");
                return TEST_FAILED;
@@ -1322,7 +1330,28 @@ crypto_outb_burst_null_null_check(struct 
ipsec_unitest_params *ut_params,
 }
 
 static int
-test_ipsec_crypto_outb_burst_null_null(int i)
+test_ipsec_verify_sqn(struct ipsec_unitest_params *ut_params,
+               uint16_t num_pkts, uint32_t sqn_start)
+{
+       struct rte_esp_hdr esph;
+       uint8_t *obuf_data;
+       uint32_t sqn;
+       uint16_t j;
+
+       for (j = 0; j < num_pkts; j++) {
+               obuf_data = rte_pktmbuf_mtod(ut_params->obuf[j], void *);
+
+               memcpy(&esph, obuf_data + sizeof(ipv4_outer), sizeof(esph));
+               sqn = rte_be_to_cpu_32(esph.seq);
+               TEST_ASSERT_EQUAL(sqn, sqn_start + j,
+                       "Invalid sequence number in packet %u\n", j);
+       }
+
+       return 0;
+}
+
+static int
+test_ipsec_crypto_outb_single_burst_null_null(int i, uint32_t sqn_start)
 {
        struct ipsec_testsuite_params *ts_params = &testsuite_params;
        struct ipsec_unitest_params *ut_params = &unittest_params;
@@ -1330,15 +1359,6 @@ test_ipsec_crypto_outb_burst_null_null(int i)
        uint16_t j;
        int32_t rc;
 
-       /* create rte_ipsec_sa*/
-       rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
-                       test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
-       if (rc != 0) {
-               RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
-               return rc;
-       }
-
-       /* Generate input mbuf data */
        for (j = 0; j < num_pkts && rc == 0; j++) {
                ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool,
                        null_plain_data, sizeof(null_plain_data),
@@ -1351,7 +1371,7 @@ test_ipsec_crypto_outb_burst_null_null(int i)
                        ut_params->testbuf[j] = setup_test_string_tunneled(
                                        ts_params->mbuf_pool,
                                        null_plain_data, test_cfg[i].pkt_sz,
-                                       OUTBOUND_SPI, j + 1);
+                                       OUTBOUND_SPI, j + sqn_start);
                        if (ut_params->testbuf[j] == NULL)
                                rc = TEST_FAILED;
                }
@@ -1374,10 +1394,73 @@ test_ipsec_crypto_outb_burst_null_null(int i)
        if (rc == TEST_FAILED)
                test_ipsec_dump_buffers(ut_params, i);
 
+       test_ipsec_verify_sqn(ut_params, num_pkts, sqn_start);
+
+       return rc;
+}
+
+static int
+test_ipsec_crypto_outb_burst_null_null(int i)
+{
+       struct ipsec_unitest_params *ut_params = &unittest_params;
+       uint32_t sqn_start;
+       int32_t rc;
+
+       /* create rte_ipsec_sa*/
+       rc = create_sa(RTE_SECURITY_ACTION_TYPE_NONE,
+                       test_cfg[i].replay_win_sz, test_cfg[i].flags, 0);
+       if (rc != 0) {
+               RTE_LOG(ERR, USER1, "create_sa failed, cfg %d\n", i);
+               return rc;
+       }
+
+       /* Generate input mbuf data and test normal IPsec processing */
+       sqn_start = 1;
+       rc = test_ipsec_crypto_outb_single_burst_null_null(i, sqn_start);
+       if (rc != 0) {
+               RTE_LOG(ERR, USER1, "burst failed, cfg %d\n", i);
+               return rc;
+       }
+
+       if (ut_params->is_stateless) {
+
+               /* Generate input mbuf data for stateless IPsec processing. */
+               sqn_start = ut_params->ipsec_state.sqn = SQN_START;
+               rc = test_ipsec_crypto_outb_single_burst_null_null(i, 
sqn_start);
+               if (rc != 0) {
+                       RTE_LOG(ERR, USER1, "stateless burst failed, cfg %d\n", 
i);
+                       return rc;
+               }
+       }
+
        destroy_sa(0);
        return rc;
 }
 
+static int
+test_ipsec_crypto_outb_burst_stateless_null_null_wrapper(void)
+{
+       struct ipsec_unitest_params *ut_params = &unittest_params;
+       int rc = 0;
+       int i;
+
+       ut_params->ipsec_xform.spi = OUTBOUND_SPI;
+       ut_params->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS;
+       ut_params->ipsec_xform.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP;
+       ut_params->ipsec_xform.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL;
+       ut_params->ipsec_xform.tunnel.type = RTE_SECURITY_IPSEC_TUNNEL_IPV4;
+       ut_params->is_stateless = true;
+
+       for (i = 0; i < num_cfg && rc == 0; i++) {
+               ut_params->ipsec_xform.options.esn = test_cfg[i].esn;
+               ut_params->ipsec_state.sqn = 0;
+               rc = test_ipsec_crypto_outb_burst_null_null(i);
+
+       }
+
+       return rc;
+}
+
 static int
 test_ipsec_crypto_outb_burst_null_null_wrapper(void)
 {
@@ -2496,6 +2579,8 @@ static struct unit_test_suite ipsec_testsuite  = {
                        test_ipsec_crypto_inb_burst_null_null_wrapper),
                TEST_CASE_ST(ut_setup_ipsec, ut_teardown_ipsec,
                        test_ipsec_crypto_outb_burst_null_null_wrapper),
+               TEST_CASE_ST(ut_setup_ipsec, ut_teardown_ipsec,
+                       
test_ipsec_crypto_outb_burst_stateless_null_null_wrapper),
                TEST_CASE_ST(ut_setup_ipsec, ut_teardown_ipsec,
                        test_ipsec_inline_crypto_inb_burst_null_null_wrapper),
                TEST_CASE_ST(ut_setup_ipsec, ut_teardown_ipsec,
-- 
2.25.1

Reply via email to