From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id EC8D1A0C43; Fri, 8 Oct 2021 21:07:33 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B2E1640696; Fri, 8 Oct 2021 21:07:33 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by mails.dpdk.org (Postfix) with ESMTP id 6FACA4068F for ; Fri, 8 Oct 2021 21:07:32 +0200 (CEST) Received: from pps.filterd (m0045851.ppops.net [127.0.0.1]) by mx0b-0016f401.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 198EFkW9006900; Fri, 8 Oct 2021 12:07:31 -0700 Received: from nam12-bn8-obe.outbound.protection.outlook.com (mail-bn8nam12lp2168.outbound.protection.outlook.com [104.47.55.168]) by mx0b-0016f401.pphosted.com with ESMTP id 3bja9f43p5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 08 Oct 2021 12:07:31 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Yhx7bb0Az08Hf2yhxuZJbD3Af3nvJaAIP3RN9GfK3MGlGR7mEwIp/R97zGvvJaiFVd64nh7G09lWSOWefKfiTBOUhXMWOZji43ELH5iekJGru6Tu6Q9VMXLnYBLbF8YznWzTHHxsy6fcbakMoN6vpRpKYDZt90IH8AHjQUTzAY3SOr00mAx1mRdcZxrVMwCD2G6h9ICaGPTR6mazh6lAPqQhcf9MxCasl09VWbD/wFd2i02O1O5NJHXhr8xA5sogBZnZBRrUBxd4JLB07OPLH5otPLh+gX9PQXib51s/g8WBd0hwl4y5Mc36iBpbH4OQ/3vuqopgfNc6S0t7tC0zSw== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=7SkugQt90FvaW+bOhe82WJixGV8I6KEor0r5rPOpIGw=; b=jNfrk8t6qM8/aeZ6ii/BbEPCsLU9W8ddSamcUv0kOBEI8KnL8FoX/1zFsyLWUuKXs2lhHeIP5y6dzCeWRDC9bm35vdv4tR/VLm1ltdDF9nSvDsLVQrVKt1fcuckhcYZSXyGqu9+C3S4m8Dl2I6Nq/yK3FkPKud/39KLvomS6/wpfSM+4UjNLQJ6f712Ia0ejrKKzCL7m6d73QcQur0mGUpz/ZXgtkhkqclBtsVbSr4gic2/UyCn8cnQq2p2e7+VKu0kmP5zNhcC++OD0ZkrKwa/saYU8PCvyyTLG8AIE7Ojn+lPrbN39TUDfsSsAaNP2eTinHqTj3nACO++zV2TjLg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=marvell.com; dmarc=pass action=none header.from=marvell.com; dkim=pass header.d=marvell.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.onmicrosoft.com; s=selector1-marvell-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=7SkugQt90FvaW+bOhe82WJixGV8I6KEor0r5rPOpIGw=; b=XvCqDOM4tLH/YCCGEgGJvyNFxB8fMdoqeByLqeoGqjQJt9evYUvrPhLHZ0CaTV+DRjnrXQ1iFWN0mG+yDErXqwOhHJiZP0TjVKRqhjDWvOYiRlodRH043jZHaM+a65a+acUrJk2jElkqgbh2XAKNqbPz3KxyQ07r21EYSyDJZIQ= Received: from CO6PR18MB4484.namprd18.prod.outlook.com (2603:10b6:5:359::9) by CO6PR18MB4419.namprd18.prod.outlook.com (2603:10b6:5:35a::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4587.18; Fri, 8 Oct 2021 19:07:29 +0000 Received: from CO6PR18MB4484.namprd18.prod.outlook.com ([fe80::c41e:707:3f91:71b8]) by CO6PR18MB4484.namprd18.prod.outlook.com ([fe80::c41e:707:3f91:71b8%8]) with mapi id 15.20.4587.022; Fri, 8 Oct 2021 19:07:29 +0000 From: Akhil Goyal To: Radu Nicolau CC: "dev@dpdk.org" , "declan.doherty@intel.com" , "hemant.agrawal@oss.nxp.com" Thread-Topic: [EXT] [PATCH v3 8/8] examples/ipsec-secgw: add support for additional algorithms Thread-Index: AQHXtqu42rwZqJ13NU+qJrxOcoZp7avJf9Vg Date: Fri, 8 Oct 2021 19:07:29 +0000 Message-ID: References: <20210903112257.303961-1-radu.nicolau@intel.com> <20211001095202.3343782-1-radu.nicolau@intel.com> <20211001095202.3343782-9-radu.nicolau@intel.com> In-Reply-To: <20211001095202.3343782-9-radu.nicolau@intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 0834ca55-e709-4f2a-5829-08d98a8ee004 x-ms-traffictypediagnostic: CO6PR18MB4419: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:359; x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: jpxw0ntGg2OkHrLvk1ExFM9hKMQFsEiLSN8Lndt5tiwmNY/a+FdQwHMUQZBLzAYa5zRruILyYHFYJ+7ZGS0xRP5dEO02IpU8OCPF1u+qw+zBMZ7zxnOtKEXOt+rw1UiowsvCJl/+M1RUgqQK5CP7qhMe4O7MycX4gLGNZV8cqFwshvyL6erwq7T6EUkGJyIzC/gzb58XfLrcT894wzlC/UypeFG/e8fd/j9K7asXR1/WneTOyzEh3xXNUa4Mc1EjDqfUFLu8TiJfY11HpNLciJyqnqr1oGkGE2KlGUB/qXrH925ZHT+49TvPJqONLz2XDVtSlEiKBtL4VQkWL3kVpb4liErNmOBSczrPtHcVynREC6RVVwyxIwE2igu8FMUiCmFs29LpL6C2B0T6g0M0rurbMFV59l3D62aHChKQUDjTnxr6jKE3uVLnQBvFWfog+oYTn3jWSwcy0HvQRGNN1khq/M2Jum2fOpEEdKgpyUtOzSho4KHKzii5/dxhpw/4f5kSO479agBXpQIXNNX/rZm8Zp6R+xSII0PT4iK9ukYpV+5FhSg3db+oxF1V2ZKpzy+PGyNOKojJOSUlT7ODdhveeKbqiuzL9x3je5B6kGAfUYzATQhGRo+jeBhs+EJfMZ4+C8dphIuHOGl1Or/di4aqjmM1PiRcya/8zw1Bf42BPUma7GToiNshakIbIql9Oq6StLSh+hJgO8ODYG8sOQ== x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:CO6PR18MB4484.namprd18.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(366004)(71200400001)(26005)(508600001)(52536014)(8936002)(55016002)(186003)(8676002)(66946007)(9686003)(7696005)(64756008)(66446008)(55236004)(76116006)(6506007)(316002)(2906002)(66476007)(66556008)(4326008)(54906003)(5660300002)(6916009)(86362001)(33656002)(38070700005)(38100700002)(122000001)(83380400001); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?RMMmnfMRaH4vDRrYjlU1q5Amu+t8SCBAMsT5AmroNVZnNeAUC3Rn0LZEB5yN?= =?us-ascii?Q?F2/fmGZdIzkoHMhHBZ4laGCs04+O98C7/mM+wFeUY6NkGR3fJiBo9oR2Y4nw?= =?us-ascii?Q?oI4a+BpbzfQxCbNC7KG0o4fWrEshUNRlYAa/PWlnD49nIBrMYnXRfuk2oA4/?= =?us-ascii?Q?rtG9+GNDkU9MtxotYLv4ZObcpkwjZAkbZ5WtkfKXpKcRxm1iPVHMibO1qn8b?= =?us-ascii?Q?h8llcGx/cH92YVdpWdJ7cPHdmQCR0oaENSQnYvmn90/F+qiUl7T9iERNnot5?= =?us-ascii?Q?puxPEn1uq/NzKOlEoES9J1UJDfWnP7p3dID9Dga5onTmpGZ5ksJLYhgW/dVs?= =?us-ascii?Q?0QcXY+SRtvhB5cdQTFEs4DeQ9CzRxKWt034zZjS+b0w3PXTiDZP62QmLnU/Y?= =?us-ascii?Q?+e1WOZxoKmQdozHxV7atFXtX8LJzztjkZ3JWc1vrAWF9r6ObH5lZbVh0xM92?= =?us-ascii?Q?twf5ENmAvHRWsT/6Qc8ZMXx5HHifBNu5sqqX+Cr27ko5IfIpI5SzLuxHYztJ?= =?us-ascii?Q?cFnH1WWXTB3UF4K+3iX4o6MZBQsMm6bqJcm9ZJNlvAk4AmyNsF68fcIJy6qn?= =?us-ascii?Q?q+iG3D2x+8oT+gGbHuX+u35NneES7jvmYz3WUHCDRMWNd/qJmInCQJUsQ4XN?= =?us-ascii?Q?luVR/fy0/NczQpHiSbV3tu+7eFVWBVITZoyvYr5aCZ69z0iFZgnAwjmlKN7o?= =?us-ascii?Q?sSTIEi3HA4x6I4qAORSbzVegEMOpIvUsZe9IkHxs2JPveB2SqCXyFS6Skuof?= =?us-ascii?Q?y56So7dD9/vKFywLIpDNssCRBLkuOwIQ0sy8ma13QIWwkdQ8EGL670p5CYb/?= =?us-ascii?Q?nmA3sqyICXtVWAWXw9AX1oVvgC4MKK7kx93QoOwvuSHwx9ID3CYQQH4UJAaA?= =?us-ascii?Q?t26IqAycG9xmUXuyN6pimo6/b0vDUTz0DcHrUhr80NRwD+PSWlF5O5yF4AaQ?= =?us-ascii?Q?3eqQG8yyl8tBprZRy0l0Zf91jUtduNbtCBqWduGW20dyP8mz6BEaY1Kjuv1A?= =?us-ascii?Q?m7ZCDotKNrGF8A7/vXrl8mTTb2uGAsaOCdeq2VIEczTBLXETb4u0Ah42HTAX?= =?us-ascii?Q?s4797EPw35D+EBK5ESXajym5HRnHOScQPf7psjBuaVjdW2qpeSIHiXlPx4f6?= =?us-ascii?Q?9i4bJaXIwIePKc5fOiKDz61bd2pQFvE0lPB3N+1+mM0LB4eqBmFt10t1WMia?= =?us-ascii?Q?xyxZKSCI0v4Q2VIVPzYNajtDTEJGDw3OPOx3S6URmws48vUB7f46p9hJ1nl1?= =?us-ascii?Q?f0oZ2WHy1Ot/q8sW+tskoQIAFRCfCd6pb2Lr55B6JaQFP7LazFc2Zd81Omah?= =?us-ascii?Q?zmEYVFAzTFhf2upRnvAJyIkD?= x-ms-exchange-transport-forked: True Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: marvell.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: CO6PR18MB4484.namprd18.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0834ca55-e709-4f2a-5829-08d98a8ee004 X-MS-Exchange-CrossTenant-originalarrivaltime: 08 Oct 2021 19:07:29.6263 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 70e1fb47-1155-421d-87fc-2e58f638b6e0 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: AmbKsxTYYbcSXXM8KYkE34lRqWHit6xpCiC+3wx02U134uPAbFVHjgUVWH/XBBkOBCbCblj9zjiHw5CKxedOqg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO6PR18MB4419 X-Proofpoint-ORIG-GUID: 7VaeM0LKYMp6FZNRlfpV7UUP4__g5s2r X-Proofpoint-GUID: 7VaeM0LKYMp6FZNRlfpV7UUP4__g5s2r X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.182.1,Aquarius:18.0.790,Hydra:6.0.391,FMLib:17.0.607.475 definitions=2021-10-08_06,2021-10-07_02,2020-04-07_01 Subject: Re: [dpdk-dev] [EXT] [PATCH v3 8/8] examples/ipsec-secgw: add support for additional algorithms X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 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" > Add support for AES-GMAC, AES_CTR, AES_XCBC_MAC, > AES_CCM, CHACHA20_POLY1305 >=20 > Signed-off-by: Declan Doherty > Signed-off-by: Radu Nicolau > --- > examples/ipsec-secgw/ipsec.h | 3 +- > examples/ipsec-secgw/sa.c | 133 ++++++++++++++++++++++++++++++++--- > 2 files changed, 126 insertions(+), 10 deletions(-) >=20 Documentation? Release notes? > diff --git a/examples/ipsec-secgw/ipsec.h b/examples/ipsec-secgw/ipsec.h > index 8a76405ad9..5fa4e62f37 100644 > --- a/examples/ipsec-secgw/ipsec.h > +++ b/examples/ipsec-secgw/ipsec.h > @@ -65,8 +65,7 @@ struct ip_addr { > } ip; > }; >=20 > -#define MAX_KEY_SIZE 36 > - > +#define MAX_KEY_SIZE 96 Max key length defined below is 64, then why 96? > /* > * application wide SA parameters > */ > diff --git a/examples/ipsec-secgw/sa.c b/examples/ipsec-secgw/sa.c > index d52dd94056..08fd1efea8 100644 > --- a/examples/ipsec-secgw/sa.c > +++ b/examples/ipsec-secgw/sa.c > @@ -46,6 +46,7 @@ struct supported_cipher_algo { > struct supported_auth_algo { > const char *keyword; > enum rte_crypto_auth_algorithm algo; > + uint16_t iv_len; > uint16_t digest_len; > uint16_t key_len; > uint8_t key_not_req; > @@ -98,6 +99,20 @@ const struct supported_cipher_algo cipher_algos[] =3D = { > .block_size =3D 4, > .key_len =3D 20 > }, > + { > + .keyword =3D "aes-192-ctr", > + .algo =3D RTE_CRYPTO_CIPHER_AES_CTR, > + .iv_len =3D 16, > + .block_size =3D 16, > + .key_len =3D 28 > + }, > + { > + .keyword =3D "aes-256-ctr", > + .algo =3D RTE_CRYPTO_CIPHER_AES_CTR, > + .iv_len =3D 16, > + .block_size =3D 16, > + .key_len =3D 36 > + }, > { > .keyword =3D "3des-cbc", > .algo =3D RTE_CRYPTO_CIPHER_3DES_CBC, > @@ -126,6 +141,31 @@ const struct supported_auth_algo auth_algos[] =3D { > .algo =3D RTE_CRYPTO_AUTH_SHA256_HMAC, > .digest_len =3D 16, > .key_len =3D 32 > + }, > + { > + .keyword =3D "sha384-hmac", > + .algo =3D RTE_CRYPTO_AUTH_SHA384_HMAC, > + .digest_len =3D 24, > + .key_len =3D 48 > + }, > + { > + .keyword =3D "sha512-hmac", > + .algo =3D RTE_CRYPTO_AUTH_SHA512_HMAC, > + .digest_len =3D 32, > + .key_len =3D 64 > + }, > + { > + .keyword =3D "aes-gmac", > + .algo =3D RTE_CRYPTO_AUTH_AES_GMAC, > + .iv_len =3D 8, > + .digest_len =3D 16, > + .key_len =3D 20 > + }, > + { > + .keyword =3D "aes-xcbc-mac-96", > + .algo =3D RTE_CRYPTO_AUTH_AES_XCBC_MAC, > + .digest_len =3D 12, > + .key_len =3D 16 > } > }; >=20 > @@ -156,6 +196,42 @@ const struct supported_aead_algo aead_algos[] =3D { > .key_len =3D 36, > .digest_len =3D 16, > .aad_len =3D 8, > + }, > + { > + .keyword =3D "aes-128-ccm", > + .algo =3D RTE_CRYPTO_AEAD_AES_CCM, > + .iv_len =3D 8, > + .block_size =3D 4, > + .key_len =3D 20, > + .digest_len =3D 16, > + .aad_len =3D 8, > + }, > + { > + .keyword =3D "aes-192-ccm", > + .algo =3D RTE_CRYPTO_AEAD_AES_CCM, > + .iv_len =3D 8, > + .block_size =3D 4, > + .key_len =3D 28, > + .digest_len =3D 16, > + .aad_len =3D 8, > + }, > + { > + .keyword =3D "aes-256-ccm", > + .algo =3D RTE_CRYPTO_AEAD_AES_CCM, > + .iv_len =3D 8, > + .block_size =3D 4, > + .key_len =3D 36, > + .digest_len =3D 16, > + .aad_len =3D 8, > + }, > + { > + .keyword =3D "chacha20-poly1305", > + .algo =3D RTE_CRYPTO_AEAD_CHACHA20_POLY1305, > + .iv_len =3D 12, > + .block_size =3D 64, > + .key_len =3D 36, > + .digest_len =3D 16, > + .aad_len =3D 8, > } > }; >=20 > @@ -484,6 +560,15 @@ parse_sa_tokens(char **tokens, uint32_t n_tokens, > if (status->status < 0) > return; >=20 > + if (algo->algo =3D=3D RTE_CRYPTO_AUTH_AES_GMAC) { > + key_len -=3D 4; > + rule->auth_key_len =3D key_len; > + rule->iv_len =3D algo->iv_len; > + memcpy(&rule->salt, > + &rule->auth_key[key_len], 4); > + } > + > + Extra line > auth_algo_p =3D 1; > continue; > } > @@ -1181,8 +1266,20 @@ sa_add_rules(struct sa_ctx *sa_ctx, const struct > ipsec_sa entries[], > break; > } >=20 > - if (sa->aead_algo =3D=3D RTE_CRYPTO_AEAD_AES_GCM) { > - iv_length =3D 12; > + > + if (sa->aead_algo =3D=3D RTE_CRYPTO_AEAD_AES_GCM || > + sa->aead_algo =3D=3D RTE_CRYPTO_AEAD_AES_CCM || > + sa->aead_algo =3D=3D > RTE_CRYPTO_AEAD_CHACHA20_POLY1305) { > + > + if (ips->type =3D=3D > + > RTE_SECURITY_ACTION_TYPE_INLINE_CRYPTO) { > + iv_length =3D 8; How is IV length dependent on the action type? It should be same for all modes for a particular algorithm. Right? > + } else { > + if (sa->aead_algo =3D=3D > RTE_CRYPTO_AEAD_AES_CCM) > + iv_length =3D 11; > + else > + iv_length =3D 12; > + } >=20 > sa_ctx->xf[idx].a.type =3D > RTE_CRYPTO_SYM_XFORM_AEAD; > sa_ctx->xf[idx].a.aead.algo =3D sa->aead_algo; > @@ -1206,10 +1303,8 @@ sa_add_rules(struct sa_ctx *sa_ctx, const struct > ipsec_sa entries[], > case RTE_CRYPTO_CIPHER_NULL: > case RTE_CRYPTO_CIPHER_3DES_CBC: > case RTE_CRYPTO_CIPHER_AES_CBC: > - iv_length =3D sa->iv_len; > - break; > case RTE_CRYPTO_CIPHER_AES_CTR: > - iv_length =3D 16; > + iv_length =3D sa->iv_len; > break; > default: > RTE_LOG(ERR, IPSEC_ESP, > @@ -1218,6 +1313,15 @@ sa_add_rules(struct sa_ctx *sa_ctx, const struct > ipsec_sa entries[], > return -EINVAL; > } >=20 > + if (sa->auth_algo =3D=3D RTE_CRYPTO_AUTH_AES_GMAC) > { > + if (ips->type =3D=3D > + > RTE_SECURITY_ACTION_TYPE_INLINE_CRYPTO) { > + iv_length =3D 8; Same comment here. > + } else { > + iv_length =3D 12; > + } > + } > + > if (inbound) { > sa_ctx->xf[idx].b.type =3D > RTE_CRYPTO_SYM_XFORM_CIPHER; > sa_ctx->xf[idx].b.cipher.algo =3D sa- > >cipher_algo; > @@ -1239,6 +1343,9 @@ sa_add_rules(struct sa_ctx *sa_ctx, const struct > ipsec_sa entries[], > sa->digest_len; > sa_ctx->xf[idx].a.auth.op =3D > RTE_CRYPTO_AUTH_OP_VERIFY; > + sa_ctx->xf[idx].a.auth.iv.offset =3D IV_OFFSET; > + sa_ctx->xf[idx].a.auth.iv.length =3D iv_length; > + > } else { /* outbound */ > sa_ctx->xf[idx].a.type =3D > RTE_CRYPTO_SYM_XFORM_CIPHER; > sa_ctx->xf[idx].a.cipher.algo =3D sa- > >cipher_algo; > @@ -1260,11 +1367,21 @@ sa_add_rules(struct sa_ctx *sa_ctx, const struct > ipsec_sa entries[], > sa->digest_len; > sa_ctx->xf[idx].b.auth.op =3D > RTE_CRYPTO_AUTH_OP_GENERATE; > + sa_ctx->xf[idx].b.auth.iv.offset =3D IV_OFFSET; > + sa_ctx->xf[idx].b.auth.iv.length =3D iv_length; > + > } >=20 > - sa_ctx->xf[idx].a.next =3D &sa_ctx->xf[idx].b; > - sa_ctx->xf[idx].b.next =3D NULL; > - sa->xforms =3D &sa_ctx->xf[idx].a; > + if (sa->auth_algo =3D=3D RTE_CRYPTO_AUTH_AES_GMAC) > { > + sa->xforms =3D inbound ? > + &sa_ctx->xf[idx].a : &sa_ctx- > >xf[idx].b; > + sa->xforms->next =3D NULL; > + > + } else { > + sa_ctx->xf[idx].a.next =3D &sa_ctx->xf[idx].b; > + sa_ctx->xf[idx].b.next =3D NULL; > + sa->xforms =3D &sa_ctx->xf[idx].a; > + } > } >=20 > if (ips->type =3D=3D > -- > 2.25.1