From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 6FBE4A0565; Tue, 10 Mar 2020 12:41:09 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 6F3302BE6; Tue, 10 Mar 2020 12:41:08 +0100 (CET) Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by dpdk.org (Postfix) with ESMTP id C327423D for ; Tue, 10 Mar 2020 12:41:06 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga106.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Mar 2020 04:41:05 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,536,1574150400"; d="scan'208";a="289012010" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by FMSMGA003.fm.intel.com with ESMTP; 10 Mar 2020 04:41:04 -0700 Received: from fmsmsx122.amr.corp.intel.com (10.18.125.37) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 10 Mar 2020 04:41:04 -0700 Received: from FMSEDG001.ED.cps.intel.com (10.1.192.133) by fmsmsx122.amr.corp.intel.com (10.18.125.37) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 10 Mar 2020 04:41:04 -0700 Received: from NAM12-MW2-obe.outbound.protection.outlook.com (104.47.66.49) by edgegateway.intel.com (192.55.55.68) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 10 Mar 2020 04:41:02 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=b8yqWTFHclu7d2twDZlaHwP+o0+t5uDGAk9YUtRbjjH2/6ccdVEqkk7ixhE5/JWH4eXJa2R8aGrEOEqfPXlT+6DY5z2+R3MQLYkmFxcfZZTG1yHu70bPpNlPb8poKF1m39l7FSoGM4L/Z99GKNUWbmDBoN7goXrwSz4woDYc+abVsHZ6RsdFfzlK3wRGLqM/wUpp+whSeTCem/BUMnAWYXLhQ6Fp8cHETbDVOCviad2xYngY73RfcMIhBWLT+ncLgYkFJQ2ffrHkhZ3orEkAYjG/8aOJZLajOtD9YuiKbrGTUaZgrXHQ6RkBy4+gniwqWapB2mxKrEE18yQT3LsDEA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=q4yWeEQtytxH5hVAvcW94oiE/voN0ULNft+w1jFCXe8=; b=biprZQn8x+/ciP2AFlBCwiu7Gh6FmyGPvPS+MAzriY9NfqWMpbuM9XcagsJxHDXSXNab40AJqhJvefv65InEoP/Vg64OLsIq6vvCnSgNjB6UiliRmiC+b2ItycfBrEIjaXNwCqMJrpU0HgFJMiPpUJOgr6OpOLHl90zD7Eb1pRbAKCeZmtZaMH6wpYPlWQogBgta2w/4YrpsiH1bxqniRtfsnEQj7h6qBBbQdeSv+QBgoiGZVmKmrIH5mpG7s6um9u7bDWdx70d+Noo/uKDcNiWgYlbxufL2x8g7Zx8uBYscpGxErzMIu6dQ91MPSPn75lechzqLTDk0iSMI/NoiqQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=q4yWeEQtytxH5hVAvcW94oiE/voN0ULNft+w1jFCXe8=; b=ZkmHOUZT/Yi2L71HyrlVJT6u813WYSawmrzFL8C+HL61WmkHSZNBpWRUpWLbVJFXJI37UJOD5yg4CuFWeIiitR30TuTG/UI82KqBraicvfmXpiB2w/6hblkETFLmdJw3rObrBl7EbDY/qCQ0lsk82DLkWi0LX4wSEk8Sjt1w/Ng= Received: from BN7PR11MB2531.namprd11.prod.outlook.com (2603:10b6:406:ba::22) by BN7PR11MB2692.namprd11.prod.outlook.com (2603:10b6:406:aa::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2793.17; Tue, 10 Mar 2020 11:41:01 +0000 Received: from BN7PR11MB2531.namprd11.prod.outlook.com ([fe80::6c63:49a2:665:cd8c]) by BN7PR11MB2531.namprd11.prod.outlook.com ([fe80::6c63:49a2:665:cd8c%6]) with mapi id 15.20.2793.018; Tue, 10 Mar 2020 11:41:01 +0000 From: "Shetty, Praveen" To: Anoob Joseph , "dev@dpdk.org" , "Doherty, Declan" , "Iremonger, Bernard" , "Ananyev, Konstantin" Thread-Topic: [dpdk-dev] [PATCH v1] examples/ipsec-secgw: load/unload esp-ah DDP file Thread-Index: AQHV83wJnT6l4Hd6UkCG97AwuhuHM6g7VQWAgAZN/WA= Date: Tue, 10 Mar 2020 11:41:00 +0000 Message-ID: References: <20200306055609.11734-1-praveen.shetty@intel.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiMTQyNzVhYzgtZWZiZi00NGM5LTk0NzQtOGI5MDY5NzYzOWNhIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoieXplWE1ZdEhqdTliNk8xaWdTcHEzVk94cUE2dDBmUnVoa3NGN25cL3NibDh4c3U3aTJIZkY1NVF2MEZncmJkSE0ifQ== dlp-product: dlpe-windows dlp-reaction: no-action dlp-version: 11.2.0.6 x-ctpclassification: CTP_NT authentication-results: spf=none (sender IP is ) smtp.mailfrom=praveen.shetty@intel.com; x-originating-ip: [192.55.79.110] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: fe4f6b72-74df-4aa1-d6c2-08d7c4e7e86a x-ms-traffictypediagnostic: BN7PR11MB2692: x-ld-processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:226; x-forefront-prvs: 033857D0BD x-forefront-antispam-report: SFV:NSPM; SFS:(10019020)(376002)(39860400002)(366004)(396003)(346002)(136003)(189003)(199004)(81156014)(5660300002)(81166006)(6636002)(86362001)(52536014)(8936002)(66946007)(66556008)(66446008)(64756008)(66476007)(76116006)(7696005)(71200400001)(6506007)(186003)(33656002)(2906002)(53546011)(110136005)(9686003)(55016002)(26005)(478600001)(316002)(30864003); DIR:OUT; SFP:1102; SCL:1; SRVR:BN7PR11MB2692; H:BN7PR11MB2531.namprd11.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: zsrrPtBEOkdOo1V0ED7I6+dyRv8htIy9b5BnNlZzaEfeX+gFuuISbiC5FRJzL/TeSXVcTOMDegnrZl8TmO9c53mJ5J10c5n6Mfy5jB5cbaavPnmAD9DdEytHjNKwGRtSGkBIYI+lWYEoJPSiVWE521XqP1JyP7v3nNz+g+cav/Hm2Yx3HgqgfKHAxgCJPWQd6jSYbK8hwIE4tDHFeeGL/tkhYajUNVBRv88DTxsgmQLcWKU8yTZMP83oh2Eye0095o7GyNqVoE3DTDOlqZ4KZx0im6mfdwbf/9Qp7hbGJOcXbObcXwPPcd1hLk/SKVJjgD1A4E0GCSmL0RV83eIilGeHHZeZJmsquvwOet675pKyDFXayiuSU5LoMGBdJ19fa18scH3dKlCdZoiNTdeVi/9jWckT4ZHAhhCouH6acD363aKtI9sqe+SGhtIWvRUC x-ms-exchange-antispam-messagedata: xVHoAo6J9+ZqQJJkmJaKcPXlPkh4y7nnDcEH4UGllgaKPOJZOhehmP4MkC0ZEQ2UBGnaBEvOoTMXQcO3VuWE3SrsahTdKeUKW3+D9fwVZcxGy9OTaCJimAaFo0eEE6VS9i7JeLTy/2X17incdynXxw== Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-MS-Exchange-CrossTenant-Network-Message-Id: fe4f6b72-74df-4aa1-d6c2-08d7c4e7e86a X-MS-Exchange-CrossTenant-originalarrivaltime: 10 Mar 2020 11:41:00.6073 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: K94sx/HZ3x6WNMrZLf193Sj638Oeq60AaIcPMTgkCo16kFs2IT7ZU0lhuJe3qAzUet6oYvLyh4yS+Lguyj+SPoB3O+CZwICNd7ukU3ILBlo= X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN7PR11MB2692 X-OriginatorOrg: intel.com Subject: Re: [dpdk-dev] [PATCH v1] examples/ipsec-secgw: load/unload esp-ah DDP file X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Hi Anoob, Thanks for the review. Please see my response inline. Regards, Praveen -----Original Message----- From: Anoob Joseph =20 Sent: Friday, March 6, 2020 3:30 PM To: Shetty, Praveen ; dev@dpdk.org; Doherty, Decl= an ; Iremonger, Bernard ; Ananyev, Konstantin Subject: RE: [dpdk-dev] [PATCH v1] examples/ipsec-secgw: load/unload esp-ah= DDP file Hi Praveen, Please see inline. Thanks, Anoob > -----Original Message----- > From: dev On Behalf Of Praveen Shetty > Sent: Friday, March 6, 2020 11:26 AM > To: dev@dpdk.org; declan.doherty@intel.com;=20 > bernard.iremonger@intel.com; konstantin.ananyev@intel.com > Subject: [dpdk-dev] [PATCH v1] examples/ipsec-secgw: load/unload=20 > esp-ah DDP file >=20 > Modified Secuirty gateway application to support load/unload esp-ah=20 > ddp package on i40e NIC from ipsec-secgw application. >=20 > Signed-off-by: Praveen Shetty > --- > examples/ipsec-secgw/ipsec-secgw.c | 67 +++++++++++- > examples/ipsec-secgw/ipsec.c | 158 > +++++++++++++++++++++++++++++ > examples/ipsec-secgw/ipsec.h | 6 +- > 3 files changed, 228 insertions(+), 3 deletions(-) >=20 > diff --git a/examples/ipsec-secgw/ipsec-secgw.c b/examples/ipsec-=20 > secgw/ipsec-secgw.c index 4799bc90c..214b8a625 100644 > --- a/examples/ipsec-secgw/ipsec-secgw.c > +++ b/examples/ipsec-secgw/ipsec-secgw.c > @@ -198,7 +198,10 @@ struct app_sa_prm app_sa_prm =3D { > .cache_sz =3D SA_CACHE_SZ > }; > static const char *cfgfile; > - > +static const char *ddp_file; > +static const char *ddp_bkp_file; > +static uint16_t fdir_portid; > +static int16_t ddp_unload_flag; > struct lcore_rx_queue { > uint16_t port_id; > uint8_t queue_id; > @@ -1286,6 +1289,8 @@ print_usage(const char *prgname) > " [-e]" > " [-a]" > " [-c]" > + " [-L (portid,ddp_file_path,ddp_backup_file_path)]" > + " [-U (portid,ddp_backup_file_path)]" [Anoob] This is applicable only to i40e NIC, right? Probably mention that. [Praveen Shetty] Yes. We will do this in V2. =20 > " -f CONFIG_FILE" > " --config (port,queue,lcore)[,(port,queue,lcore)]" > " [--single-sa SAIDX]" > @@ -1307,6 +1312,8 @@ print_usage(const char *prgname) > " -a enables SA SQN atomic behaviour\n" > " -c specifies inbound SAD cache size,\n" > " zero value disables the cache (default value: 128)\n" > + " -L To load ddp profile on NIC\n" > + " -U To unload ddp profile from NIC\n" > " -f CONFIG_FILE: Configuration file\n" > " --config (port,queue,lcore): Rx queue configuration\n" > " --single-sa SAIDX: Use single SA index for outbound traffic,\n" > @@ -1379,6 +1386,33 @@ parse_decimal(const char *str) > return num; > } >=20 > +static int32_t > +parse_ddp_load_args(char *str) > +{ > + int16_t num_args =3D 0; > + char *file_fld[3]; > + num_args =3D rte_strsplit(str, strlen(str), file_fld, 3, ','); > + if (num_args !=3D 3) > + return -1; > + fdir_portid =3D atoi(file_fld[0]); > + ddp_file =3D file_fld[1]; > + ddp_bkp_file =3D file_fld[2]; > + return 0; > +} > + > +static int32_t > +parse_ddp_unload_args(char *str) > +{ > + int16_t num_args =3D 0; > + char *file_fld[2]; > + num_args =3D rte_strsplit(str, strlen(str), file_fld, 2, ','); > + if (num_args !=3D 2) > + return -1; > + fdir_portid =3D atoi(file_fld[0]); > + ddp_bkp_file =3D file_fld[1]; > + return 0; > +} > + > static int32_t > parse_config(const char *q_arg) > { > @@ -1459,7 +1493,7 @@ parse_args(int32_t argc, char **argv) >=20 > argvopt =3D argv; >=20 > - while ((opt =3D getopt_long(argc, argvopt, "aelp:Pu:f:j:w:c:", > + while ((opt =3D getopt_long(argc, argvopt, "aelp:Pu:L:U:f:j:w:c:", > lgopts, &option_index)) !=3D EOF) { >=20 > switch (opt) { > @@ -1483,6 +1517,25 @@ parse_args(int32_t argc, char **argv) > return -1; > } > break; > + case 'L': > + printf("Loading ddp package selected\n"); > + ret =3D parse_ddp_load_args(optarg); > + if (ret < 0) { > + printf("Invalid ddp load args: %s\n", optarg); > + print_usage(prgname); > + return -1; > + } > + break; > + case 'U': > + printf("Unloading ddp package selected\n"); > + ret =3D parse_ddp_unload_args(optarg); > + if (ret < 0) { > + printf("Invalid ddp unload args: %s\n", > optarg); > + print_usage(prgname); > + return -1; > + } > + ddp_unload_flag =3D 1; > + break; > case 'f': > if (f_present =3D=3D 1) { > printf("\"-f\" option present more than " > @@ -2505,6 +2558,16 @@ main(int32_t argc, char **argv) > sa_check_offloads(portid, &req_rx_offloads, &req_tx_offloads); > port_init(portid, req_rx_offloads, req_tx_offloads); > } [Anoob] Following checks are not valid for non i40e PMDs, right? Is there a= capability we can check before doing the below? [Praveen Shetty] Yes, that's true. We can skip this for non i40e PMD by a= dding #ifdef RTE_LIBRTE_I40E_PMD before the following checks. We will do t= his in V2.=20 =20 > + if (ddp_file !=3D NULL && ddp_bkp_file !=3D NULL) { > + ret =3D load_ddp_esp_package(fdir_portid, ddp_file, > ddp_bkp_file); > + if (ret < 0) > + printf("loading ddp package failed\n"); > + } > + if (ddp_unload_flag && ddp_bkp_file !=3D NULL) { > + ret =3D unload_ddp_esp_package(fdir_portid, ddp_bkp_file); > + if (ret < 0) > + printf("unloading ddp package failed\n"); > + } >=20 > cryptodevs_init(); >=20 > diff --git a/examples/ipsec-secgw/ipsec.c=20 > b/examples/ipsec-secgw/ipsec.c index 6e8120702..3840a0848 100644 > --- a/examples/ipsec-secgw/ipsec.c > +++ b/examples/ipsec-secgw/ipsec.c > @@ -4,6 +4,9 @@ > #include > #include > #include > +#include > +#include > +#include >=20 > #include > #include > @@ -14,6 +17,9 @@ > #include > #include > #include > +#ifdef RTE_LIBRTE_I40E_PMD > +#include > +#endif >=20 > #include "ipsec.h" > #include "esp.h" > @@ -155,6 +161,158 @@ create_lookaside_session(struct ipsec_ctx=20 > *ipsec_ctx, struct ipsec_sa *sa, > return 0; > } >=20 > +static int > +close_file(uint8_t *buf) > +{ > + if (buf) { > + free((void *)buf); > + return 0; > + } > + > + return -1; > +} > + > +static uint8_t * > +open_file(const char *file_path, uint32_t *size) { > + int fd =3D open(file_path, O_RDONLY); > + off_t pkg_size; > + uint8_t *buf =3D NULL; > + int ret =3D 0; > + struct stat st_buf; > + > + if (size) > + *size =3D 0; > + > + if (fd =3D=3D -1) { > + printf("%s: Failed to open %s\n", __func__, file_path); > + return buf; > + } > + > + if ((fstat(fd, &st_buf) !=3D 0) || (!S_ISREG(st_buf.st_mode))) { > + close(fd); > + printf("%s: File operations failed\n", __func__); > + return buf; > + } > + > + pkg_size =3D st_buf.st_size; > + if (pkg_size < 0) { > + close(fd); > + printf("%s: File operations failed\n", __func__); > + return buf; > + } > + > + buf =3D (uint8_t *)malloc(pkg_size); [Anoob] The cast is not required. [Praveen Shetty] We will fix this in V2. > + if (!buf) { > + close(fd); > + printf("%s: Failed to malloc memory\n", __func__); > + return buf; > + } > + > + ret =3D read(fd, buf, pkg_size); > + if (ret < 0) { > + close(fd); > + printf("%s: File read operation failed\n", __func__); > + close_file(buf); [Anoob] close_file() just frees the buffer and returns 0 is the buffer is n= ot NULL, and returns -1 if NULL. Do we need a separate function just for th= at? Also, the return value of close_file is ignored in all cases. [Praveen Shetty] Yes, We will address this in V2. =20 > + return NULL; > + } > + > + if (size) > + *size =3D pkg_size; > + > + close(fd); > + > + return buf; > +} > + > +static int > +save_file(const char *file_path, uint8_t *buf, uint32_t size) { > + FILE *fh =3D fopen(file_path, "wb"); > + > + if (fh =3D=3D NULL) { > + printf("%s: Failed to open %s\n", __func__, file_path); > + return -1; > + } > + > + if (fwrite(buf, 1, size, fh) !=3D size) { > + fclose(fh); > + printf("%s: File write operation failed\n", __func__); > + return -1; > + } > + > + fclose(fh); > + > + return 0; > +} > + > +/* Load dynamic device personalization profile */ int=20 > +load_ddp_esp_package(uint16_t fdir_portid, const char *ddp_file, > + const char *ddp_bkp_file) > +{ > + uint8_t *buff; > + uint32_t size; > + int ret =3D -ENOTSUP; > + > + buff =3D open_file(ddp_file, &size); > + if (!buff) > + return -1; > + > +#ifdef RTE_LIBRTE_I40E_PMD > + ret =3D rte_pmd_i40e_process_ddp_package(fdir_portid, > + buff, size, > + > RTE_PMD_I40E_PKG_OP_WR_ADD); #endif > + [Anoob] Rather than calling PMD specific functions from all applications, i= t might be better to introduce the same via 'devargs' to the PMD. [Praveen Shetty] We will investigate further on this. > + if (ret =3D=3D -EEXIST) > + printf("Profile has already existed.\n"); > + else if (ret < 0) { [Anoob] When i40e is not enabled (using RTE_LIBRTE_I40E_PMD), the error mes= sage would be "Failed to load profile", though the right reason is feature = being not supported. [Praveen Shetty] In V2 the following code will be executed only when i40e = is enabled. In that case error message can be intact. =20 =20 > + printf("Failed to load profile.\n"); > + close_file(buff); > + return -1; > + } else > + printf("loading ddp profile success\n"); > + if (ddp_bkp_file !=3D NULL) > + save_file(ddp_bkp_file, buff, size); > + > + close_file(buff); > + return 0; > +} > + > +/* Unload dynamic device personalization profile */ int=20 > +unload_ddp_esp_package(uint16_t fdir_portid, const char=20 > +*ddp_bkp_file) { > + > + uint8_t *buff; > + uint32_t size; > + int ret =3D -ENOTSUP; > + > + buff =3D open_file(ddp_bkp_file, &size); > + if (!buff) > + return -1; > + > +#ifdef RTE_LIBRTE_I40E_PMD > + ret =3D rte_pmd_i40e_process_ddp_package(fdir_portid, > + buff, size, > + > RTE_PMD_I40E_PKG_OP_WR_DEL); #endif > + > + if (ret =3D=3D -EACCES) { > + printf("Profile does not exist.\n"); > + close_file(buff); > + return -1; > + } else if (ret < 0) { > + printf("Failed to delete profile.\n"); > + close_file(buff); > + return -1; > + } else > + printf("ddp profile deleted successfully\n"); > + close_file(buff); > + return 0; > +} > + [Anoob] All the above functions are just about loading the ddp package. May= be we can move all that into a new file. [Praveen Shetty ] Yes we can do this. We will address this in V2. =20 > int > create_inline_session(struct socket_ctx *skt_ctx, struct ipsec_sa *sa, > struct rte_ipsec_session *ips) > diff --git a/examples/ipsec-secgw/ipsec.h=20 > b/examples/ipsec-secgw/ipsec.h index 4f2fd6184..73eec47ab 100644 > --- a/examples/ipsec-secgw/ipsec.h > +++ b/examples/ipsec-secgw/ipsec.h > @@ -383,5 +383,9 @@ create_lookaside_session(struct ipsec_ctx=20 > *ipsec_ctx, struct ipsec_sa *sa, int create_inline_session(struct=20 > socket_ctx *skt_ctx, struct ipsec_sa *sa, > struct rte_ipsec_session *ips); > - > +int > +load_ddp_esp_package(uint16_t fdir_portid, const char *ddp_file, > + const char *ddp_bkp_file); > +int > +unload_ddp_esp_package(uint16_t fdir_portid, const char=20 > +*ddp_bkp_file); > #endif /* __IPSEC_H__ */ > -- > 2.17.1