From patchwork Sun Jul 2 07:29:26 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Kalderon, Michal" X-Patchwork-Id: 9821069 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id BFE2E6035F for ; Sun, 2 Jul 2017 07:33:22 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AA9E32837E for ; Sun, 2 Jul 2017 07:33:22 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9E4C4283BB; Sun, 2 Jul 2017 07:33:22 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6E54B2821F for ; Sun, 2 Jul 2017 07:33:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751713AbdGBHdU (ORCPT ); Sun, 2 Jul 2017 03:33:20 -0400 Received: from mail-dm3nam03on0066.outbound.protection.outlook.com ([104.47.41.66]:8533 "EHLO NAM03-DM3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751635AbdGBHdR (ORCPT ); Sun, 2 Jul 2017 03:33:17 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=25ls+PENFSn5bm+652puYGir55H++0a9/zL7N9LfSXU=; b=Lf3QoWM1WaxvgqtJyVV6aAOEgMn0AteTaCKioJ+qX5QznZ01vdHaUC6A9Mk47vYwkyaetQMYvENga4zzlNyp8jfmE47O+WGLseRJ+hp3DS5Yyf/K4J18yrPC5hxK3GLG9HMeLAf3Zifn64TyhZfxnURQa1IjW2+60CAowuIVA0w= Received: from CO2PR07CA0075.namprd07.prod.outlook.com (10.174.192.43) by SN1PR07MB1535.namprd07.prod.outlook.com (10.161.223.19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1220.11; Sun, 2 Jul 2017 07:33:14 +0000 Received: from BN1AFFO11FD037.protection.gbl (2a01:111:f400:7c10::107) by CO2PR07CA0075.outlook.office365.com (2603:10b6:100::43) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1220.11 via Frontend Transport; Sun, 2 Jul 2017 07:33:14 +0000 Authentication-Results: spf=none (sender IP is 50.232.66.26) smtp.mailfrom=cavium.com; vger.kernel.org; dkim=none (message not signed) header.d=none; vger.kernel.org; dmarc=none action=none header.from=cavium.com; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) Received: from CAEXCH02.caveonetworks.com (50.232.66.26) by BN1AFFO11FD037.mail.protection.outlook.com (10.58.52.241) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.1.1199.9 via Frontend Transport; Sun, 2 Jul 2017 07:33:13 +0000 Received: from lb-tlvb-michal.il.qlogic.com.com (10.185.6.89) by CAEXCH02.caveonetworks.com (10.17.4.29) with Microsoft SMTP Server id 14.2.347.0; Sun, 2 Jul 2017 00:33:10 -0700 From: Michal Kalderon To: , , , , , , , CC: Michal Kalderon , Yuval Mintz , Ariel Elior Subject: [PATCH net-next 06/12] qed: iWARP CM add listener functions and initial SYN processing Date: Sun, 2 Jul 2017 10:29:26 +0300 Message-ID: <1498980572-29519-7-git-send-email-Michal.Kalderon@cavium.com> X-Mailer: git-send-email 1.9.3 In-Reply-To: <1498980572-29519-1-git-send-email-Michal.Kalderon@cavium.com> References: <1498980572-29519-1-git-send-email-Michal.Kalderon@cavium.com> MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:50.232.66.26; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(39850400002)(39410400002)(39450400003)(39400400002)(39840400002)(2980300002)(428002)(189002)(199003)(9170700003)(2201001)(104016004)(86362001)(5003940100001)(54906002)(189998001)(72206003)(305945005)(105586002)(106466001)(5660300001)(356003)(2950100002)(50226002)(4326008)(38730400002)(2906002)(107886003)(478600001)(77096006)(626005)(6666003)(50466002)(47776003)(101416001)(8676002)(36756003)(8936002)(76176999)(50986999)(81166006); DIR:OUT; SFP:1101; SCL:1; SRVR:SN1PR07MB1535; H:CAEXCH02.caveonetworks.com; FPR:; SPF:None; MLV:sfv; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1AFFO11FD037; 1:XOb0FgUm+eWFS6smcA+SMEcCzw5gfL8sd/5vZ4dgV9H0QMeDo6XggF79LVVP9wveGnQOIj6Epz//16qj4dhsurwVWIcBFLC3SGKikO8sYVINNOpSmYfSUt5IlWML7kOdDGpcyedjRYY3tnFD3Pq0r4YwT+ES3JiDcR2J678zkoBxxRK4LiMGXxIsbMWzIZWgPy6SubJuLkPc98EmB/9OiSW1ozYpbEl2Q3/ESmL8W3VUkwJD7gnSmnPw9iaU/zJ6PwrtrafLsWmktyDxCZ2kkeiVWp1oal/ysDGcnRgjlw8czZgSeAUW7gIqTPpXkRhikQz6gmh3R5R9t2+NKy7ZBr1YaJSzAzVsf12fSkV4ttBOCE6taLME4ykT8CWrEVyswue2q4/sQtNO+fgXclLynaIFtmK8t/oi6KriTvkaVN2P3oVLgCHK3Ibqa/JjW2PQ688Jsj9SAYYiVA8I6xaiMC5EfdJ4edpBZVC6953THMz87llp9lGvzC8E87Gyv7lEkAz0Sq4KhKPeJRtPcHPmRf721WYmKRCsux1V//tayzopzW1VQYSe/mdRmuN2ZKpNhTjcXGdfBA8hG9hwrD/mCxF4oSf82cDfSG+ieCMTCbmC7O56IOL3FsdvtOMjYt+O7LhPveN1i6a4jCpLt5alZy6F/9Rtbg/X6VzOGI0X2R5LxQWrUmqlwyDIkJsKJrzQhD5l9rVtkQJRi8FkrZbU0mqZBSjUGYy8T+t+oQYH2epnwGBHpi/hEM9y1/qrJ0t65vV2h/pJdP8pJ8/bZRNzkbzjZ7K/Yff1WLP5Wrpxdx4IxtuA9TTVLrd576rcmKoKnyFt5vg+RRh75UrgKJwevIvgEmT7U5dv8+cPg4s6GNg= X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 5f17054e-35f0-4efc-c90f-08d4c11c9920 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254075)(300000503095)(300135400095)(2017052603031)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:SN1PR07MB1535; X-Microsoft-Exchange-Diagnostics: 1; SN1PR07MB1535; 3:DviARYzOu35uXu5RwUF9b75DuoM4CSszdr3WhQS5J4M7PvR4xD+mCcLi33rmZH7jTSApyf/V9tky7qu6uFdmSo3AQXNqW8+YJHcebZZxydt8ycNRMK8EmgJB5/CNZkBXhDqZtqTzvj/pMviKObnEZR7360JVS6PB6tb4S+QnzFwCmwyHtbGtWmNJtCTaE1Om8cbU7N03Rc0esFkAw4bprOccxrgzetkwJps0gqg86n8/3LeccVAnFJTnjZI8EVa9ouyWvZtaguKwCW61qHs1l/0W52b/TcTppkdTcRYiCfz9OIKqAbTA5sC5uW1S6ENcoYsjUUXPu+snUHzvTibMTA1CeGNU/buLPCKBCK1FXFdFa+6JMgLzrdMlTtmt0S2TYc9D4TDCnKoIP5H1T487/TQzQAU4uHBv0GNmio4qFzCv9B+s8+rlNs3JbnTf/Q/fBYE6XIilurVdkOQPmI2RisG1qEHoYxL02Rn8HWtj/Xwb1Tm/1OPL/pyUsmqDqLhW8EisdjOInWqyCw9XONnOVpWctT0qC4MuPG/UbcQzb8L7ugWblaO6sjt/Un8UusX1zZrYSaFPjykQyVZJUI49NiQzxtupUypCfYkFbuOjVNRM7Yk2WagpVcl6gSLr7g7LB/2SeLcB0syuShw+XYBuQitm0CqpHE1c8L5Oe8/kgXR3k2Vs1vdVdAil6ctcSIl6onE60vJ7R/JrAnlCjty30i7Oxh03y90I3c3dTMNEI2Uer4bzcI0o/ziDagRTvdGYNB6OK/V1TGeQHHA3pRbJq9qh87WyQM7XAZjXAWotWg0CG9HlBSqSGf3EOA8LYsSNN852Pj/yHpFzg2stSM+P1KIrQHxvfXy1og/vlESWUQOxBTgOO/08g6z9gNjtiIkz+qEDJrzy3tsVGVIgq2MOtWXHmjGDX3pdZCsX0+Jsru itm9bUI1BIY0TUFlRMjrqJ X-MS-TrafficTypeDiagnostic: SN1PR07MB1535: X-Microsoft-Exchange-Diagnostics: 1; SN1PR07MB1535; 25:WVAbMVc6dpsLbj2kkA680o2zv8eeQFqDzdMu5eGXpmaAFnxmPPibFsaaVApO5d9JeYkbmIPjd3Hxqs1UgzW93+/xT7jSNPKwrE1C32psK/BavHWjbBrWb3PXeEal7GPn3jMZDVYmjuqO9p/+rNG22F6LlwJYmtovXZIN9ihN2im7HRuygPpxQa/aWFk0Rg3hx66NXYNDdPS6f/YW2N+/iBPmwuQDC7sek7lL7t2pyDwoECTayP0F2vLYwqyy5nqlSZr+E59OE0kVTZhfR3SGAwAM8eF1uSnVV2q99N2qbStG4ZBC0gqq1DGMDCnoo8bJED5mHueqMuxzGB22XN0J0Ocbck/cJ0rs0Hs5rhO67kMIV66i/fsUbW5W14YbwtBkrIb7abE9zVhl/eFUeXV4wSHiln8N82fh9DG/fZtp0VrTAH7Dzxsckjcsl6j5jxJzhd3lhXUGiXMheuquMX3sCZcRG7p5hnLnOfdvrs4+HNSw3nhklxSguQkmcvcL6x3lC2LMKm/ZCvDq2C2XSFcq1FmnWYRCO1mCzrTq2u5C8Kq3FaRLkGxBBzo2Bhc6U+O9fxDV5ordFuntPCx9KIl5By9TiKFHdA4LeYdNZ3wrI72ruSyhWN9A6VAN1PcqrUxLB5ExWJrERFIoD/uuxSFLP25UgJhzfE90VIXVZrN4r4+HAO0GuO8i4X9MP3dKyCXSygDZI8XEmJR2TL9KPIFal4g+dHQO+YjgqYM77QVPzDKr/qDNz6Y9bu/8osi6UN+5XYwPMYKTqxm1GpAQkwOSboU1m62fkUNaziYQWOvhlYi3kknSAErR0TlcSzI/8a8c7WrHpnFlK4hA0HV7Z0MKrsrmKCWEh505SfYjMP6vt6jwAs6UVp0hjRB8efjRHy3da38AVYRTldDxN01yOVIADSyPcKneR8ipgJbgWM0bR WE= X-Microsoft-Exchange-Diagnostics: 1; SN1PR07MB1535; 31:avssfIpCLKfqvjYFyu83whBC2Jk4vI3i4XNkmSpl7AaaiQi7ukNFiyDDULs/71afuB410MAZIhCCt6tQiJWm+HqSgJ6h8OAn+i2ZGLwi9tM7bDreGeyarQ/rSVv6RQe0KL6+sIdRktDz+6xufuAjTKsgFhFq0sZGhyTQ5WzhpwP/6nrdnK29CvMqkwE0hoTYsUEyjp4jwaZHhbafQBTkQ9gvy7LdYoXtb+qCHKAuBvuDCgxAtw4p2xmB9HE2POpfDFyulCEBfDXVZzuhNjpB47PxbBMnwCYkOlYtC+QbDkHYHRkY6iwki61ghveik5aD4X1ES3XaGGW+n7ZZ5dcN9z5HdyA9VpKy9Xnq5DQrEX915Uw9hZBCEKgw2e2Oh+xDLvnIecxAbQLvEp8AAIq10ms0FuzsrFqvuczwwgREPYYRLY+3qUl48iuRVxjsDYIa0XUbT55Eh468FJTRZYTXsi5r/yG5bXgufXrdsS5H1AXA3rv51AyOqQgIH3hWTnvYwksvtcD9njOFAbEAGdRVPBC9p/s410Xtf7lw+jBvnC6pzNx4e/lqGdAdmMArhegowW28JA1A6Shza7cXR2QSxyM5HQklgcpJPKK0S3XQkDC9h5HKJWm1yruZwL5FRcR/J8xkN+ITQB+JwW1B7el9mRokffMD7TTJ3sJVVlpzOtgPiYFG9sOp4tKu21ylCBYtZG91aZdiAVhMNqweTB17DQ== X-Microsoft-Exchange-Diagnostics: 1; SN1PR07MB1535; 20:VGHtycUZBo4MJsJvHQD7WX27gY7Mgg10cB6sVGORl1s+UsuPS5BLYrYReBXtGF/YgDUhW8PaorVE9DUbYq6GuTt8Dz1CKjOK0KPwlTSR0zSph5Vh3tFr6+QXkQa1TVkCHcnQwkjhVeaMAFWDA9/XTr0t3lpmVYa3eA6riqHbOe8a1+AF+df/SjgrbRqE9hAdychNw9ldgLJ7AF5mRPwI9wf+WLgHCBP4bjlpSOa4/tZ8yKryw0hhmpqcn/tBQxw+s0eRQ51Tp/PpEh5dyb8zH1n782BV3yo+B/EBgkytqM9wbj24+SbuIvI3qXTRcRk3KveRRdw0uMJUvP18tR5LRaDoimrxXJb/O2AASlf4rOWeHC5YQzAteywYl4QbUXRTktrpxLnlhz0TkaBpOCJ2DHUVzjwPLCT/k2J28032rD5geF5PycffSS8JEPYZlnI09TB+oily34lZSMpp1ytZGn/lsdTJ9eZI/OdRfxQsK00sEHniY4QBc2IgY6ch8+vN X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(236129657087228); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(8121501046)(5005006)(13016025)(13018025)(3002001)(93006095)(93001095)(100000703101)(100105400095)(10201501046)(6041248)(20161123562025)(20161123558100)(20161123560025)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123555025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:SN1PR07MB1535; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:SN1PR07MB1535; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN1PR07MB1535; 4:L/v0FxKq8zwq54+rTv7BBbLpmpmdnP9F6/NAbUWK9C?= =?us-ascii?Q?xhx9SNhDownY3Tqzug0JuU8w0jz+trCTriNGgHR+wyxao/C3uzxXDgnlEoRo?= =?us-ascii?Q?X2o7Vk65tJULLA2J7x+uuvNHRV4Q+vIIdkylKSJLl7oVZqYyEKWWIBOa0Vsm?= =?us-ascii?Q?wp9Bz3O+wOuaHuoFn1hq3UeaNUzOfGNmzz0cQUDS0RAtBvPMMDaSNNAEZrAM?= =?us-ascii?Q?y2pWplGJxJMkR8B77gkix7AakGkJRpwfAbEXj4I1soBRX7A+5Ij6SGqfmJLQ?= =?us-ascii?Q?LSx2TX2X3MwSBkEnwyDFfYI44hyRnPbOVmh8g5yOIXbhsx5vL4VQIvUhULx4?= =?us-ascii?Q?RtIe+hI1ITnkJbgbj908K+lwlYo9P6TEzDaqvUFFIMAflsozN0YwcLpHIItz?= =?us-ascii?Q?dsk1GpPik4yhvqs7ycjrmzoRhYRCM6rxeSn0mP+xzNPzKXuGg6aof9zj40GQ?= =?us-ascii?Q?j3DbWzp8iSJeudbwKqoLn1Ajygd9X7EIQ/iz7i8LRLK2oLSmwHIrswY0LB5L?= =?us-ascii?Q?woKJjeCOwnsI2QklUNvb3eX5lo21TZCoj4ez5+T4JVBf7ITZOzKz0NcNI2+7?= =?us-ascii?Q?xmKQ/r1rO6nsaUagoHk54pDgAKJF+h4euR5KMbOqFGjGiXWQ7uuJ1bFxHcEw?= =?us-ascii?Q?RLadkuv62U9pNXux8OghSCeN+KX/88kp5MfLq/jPqTg/Qqyqi5c+YerqPHeu?= =?us-ascii?Q?Dklsb+bLxf3u5vML1fyi4y/kv+av1fBcgpThGCnCad6DOpoB3ZAOYopm1X1V?= =?us-ascii?Q?jnLJfexHLku4KQGOrftcgAEXZSPXUbwPzTYnUAy0yV9vNHa5QECov2rEeLRM?= =?us-ascii?Q?2x+E4VerWs3maXNchh9oRupQ9Pj/B6nsx+HiuS4LvvcXaN6iuvWwyMwEGNOi?= =?us-ascii?Q?EoHJBv6Cy2knqHYGgqs4Z0S6sI5cEkN9hgpCJWsK7mDkarnDfWfg52xaspjN?= =?us-ascii?Q?2b4glzjZCod1ecX2xQUaoN5QWOuZF7OEBp49TN0I4vkRU2iU30pHGMhjplW/?= =?us-ascii?Q?Xa0h0RJs7fqvgn2DgjZZHsBbacI0a29Cg2eYY0WvaoOmaSrWz9paG2g9ZCNv?= =?us-ascii?Q?5YHaGBPzYedxoStU2Q54hsICsRBNyFi2XwY/AhwnWWN+LoIQ/mSODt21yglm?= =?us-ascii?Q?bsCRHVAWTAWeSxlriqeJbumW8VTv3CgsGHa+SJi/gsm3h5lnHqinocDiUeFQ?= =?us-ascii?Q?PI0Fz1pbK2GWVDMJ5Zqri+60wZS7/UhQ8x5LRT8ZAowaYeVvqrskZ/kQ=3D?= =?us-ascii?Q?=3D?= X-Forefront-PRVS: 03569407CC X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN1PR07MB1535; 23:QT50Wau/iEQldTpP+tnilB578iVfGtWmGFdHKSn4w?= =?us-ascii?Q?HA0nEBp1k+fxjQKFslon01yhB7/6fs+wF/XZIakSJH2/970fTnKyS/FFthIA?= =?us-ascii?Q?DiCHsLxyG8HcpVajG4spDJBrDQk74j1+aDv+MONaI8CRvXvP0tnPo3Kd5O/S?= =?us-ascii?Q?D5NMEWHahEuwLHtETx/S0ysEswBX/u4uvTDAGAIbRPvPjG+Lgvn99z2hk2Lc?= =?us-ascii?Q?+cs7+X8cwU4FalQF9jBlBVCk7dd/RzrxWzU+ji12Db0pZ/cIFvJFJkK98LsU?= =?us-ascii?Q?owzf+5gFWnwwJcS1pJJvHrqd5ACCbuQrG6qPv/Z98qgKtuN4iR9J73LjCk59?= =?us-ascii?Q?Kpp1/sxgKAsZKGKtEV/pgDR8c3AYuFxBXEXTwSGvHISzFqplFVH3+dZsAlv4?= =?us-ascii?Q?PADl9GVJzS09AXJVt2+vt2CTJxXPBj8XndiuBtCKoAuwAZcSkewQlZORI7mF?= =?us-ascii?Q?qcba8r1CvcA3pYC5+5c+G63A34ZDtXVLX/mEPAwIMptypfkPR9GwLiImyH66?= =?us-ascii?Q?Yx+EZkLPnxVkeO6WMW07OWRg3lqWXCeU11sG4oprU+HQzrOm16MlJ84yX6kD?= =?us-ascii?Q?ryM12PrA/sIRLimQXq2fuBZSvIVIfDqWDbVnpL9F+N8dsm7jJLxO9mqPnGnc?= =?us-ascii?Q?gNRQEnoy0DEgPybSE6VyeLWZfFWDdvm45zBSmb4ZnbaPF/OKdIX3BV/Rmu+1?= =?us-ascii?Q?bJXnu0+bLk6ar0MUuVPg7qo66MQjEGugylNzVjOmG+fzj1st9ZIZn5pgWnso?= =?us-ascii?Q?8c4GBbcIM4XQlQoLunzYGErUmbjWPhBULau7NttRwDjruAcfAPfKM5PnAxV7?= =?us-ascii?Q?BOWosAnXODUdxGXgpgiz5exEGSxmib6EfXvN4HtYkckE8tAK+UM8rHez4dAO?= =?us-ascii?Q?bThti+Mgj6LF/0O+JNiPhw1TYlWjTmbCVH+j6MLcdDrsuKEE/qDcoa9oz0yT?= =?us-ascii?Q?e74qR8ZuJtuP/TU46xQ4yVkBYA7IAQ/yN/F65IMT6wPHktJDKEEvS8vApNEC?= =?us-ascii?Q?ng+UmRTozE/kekyGgXXLqvdjIjRi4TW8APXKO3KHcyEpUieby5FSyq5mmnE6?= =?us-ascii?Q?b306yE=3D?= X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN1PR07MB1535; 6:gdkeJUH1ubC3ICQi/UJRKjMpUwQ68gsNcZT2HFxPyY?= =?us-ascii?Q?GgwxP7doUyLE+F1q6s5oJf42CoLINLXO9kXvuNtcMjx8Vjz+74JKUI0NYOUX?= =?us-ascii?Q?BMBB7LhiiTu4jlX1thOIZZQPPc3rKSlaD6YkuUT9j6kSHMDUtbJ1kaDm0UmM?= =?us-ascii?Q?nTJ03bUQkbBi+DWXPiFBg2tI1qYRohm4OA1YiNB+LN6Ni9wgTP2MsDz8Ocwn?= =?us-ascii?Q?tLuuUQ9xde7jfqghzY23VMgT+x8jLc5E41r21P9PvKiumv50CG5OmxsOib4s?= =?us-ascii?Q?ieE46eJtuoHxAiKwAbeAu3fATQ1Cg2jn6AWqJ5Bcnqdhs4J2nhfZ64imu8U6?= =?us-ascii?Q?MBB01VBhBjy1nX/US5Juadpm4Y5YN4Xg/cKJf3Df5+9U7+jq+KCButIo4EKH?= =?us-ascii?Q?7So3PzhjtO/8bG/R4DbxWICrGjRI/PR0+iEAAJdnYMP+NAR6yIJht9dc8RWo?= =?us-ascii?Q?r6TzCcYCvPQioxbXWAtsneM2DjyFVCOVxfAjt7Iyk5NZ/kVLjMTksCByVekr?= =?us-ascii?Q?plxUqiaYW29mJEuu7xGorK7L2RKJmq6wqVexGZBGczttB/XgPvFZ8clgPwN4?= =?us-ascii?Q?iX2el///CuzzMs5/YvNHTGsljQKf0hLgfeRSHpszoaTVB6Dmg3f/P7Z6UpYH?= =?us-ascii?Q?tgK3pcM+awQc1d8vpC/BQusf6vCLPqOBqsUhUjLhnVI4ZK0JWpYTyWlni57W?= =?us-ascii?Q?OSjob6KLlfzwukqj7I4LN/pLRx+4+XJfgn8WwxRuZ8FifTT8JcJgdNnIFkuY?= =?us-ascii?Q?uzx8g+LKfj0LLDfsthAKsPtFKaxqiQY1D+lHr8heChFjYaHf23i01NmZNeNB?= =?us-ascii?Q?++9pnULqpMSaM/dEiK/mgTDKkRrxwo+iIPP8WG0ErI+yi/T+ZZByPtPBMsBY?= =?us-ascii?Q?HKkwBv8tdgrUD2E1CBcA3t9l+fvQ8HAQe5ddOY16u3MezJ5ED+EBLfLMKDL6?= =?us-ascii?Q?0sRMIygjRARnsj65+Tq1Mjqll2z5mVqD/PlsvRBBW0iU/Qr18xeUaQ82zwMu?= =?us-ascii?Q?Y=3D?= X-Microsoft-Exchange-Diagnostics: 1; SN1PR07MB1535; 5:3OdMYC596/z86mKp5cJSrFmyUEctcHFNFU2sGuBBWqUf4oWLXHXLNj0NpHW3SDuJoNyKuBsXZ2EkyV3kLYNVekf28jx8zx1VAcZ7vZCCLXTyFDmXGIwawM5U1VqpLiTYIv7yLRPOro4QnVyoNz4SV1VRBsnnk2wIWsHr4Aa1eUsuo9LWezekLsvLBYpSaQcuexfVzBy5gr0hJb5m0krqHewsYf5jUVr8MfHw/9cszGSC8+uGQJ5fieyMP8TqGyWAyaQysM/55DhmB6CMkU3jbT4VMJVxJVJ3+kqjyhtX3TXMgwIz0L3Tg8eyhZW9TE9PclNoRAdlOp7ptxPMTZHwUCZgjmlC1cyw1bBCFDf7mWJtC8vL61U+MBuDO8s5TlIN6e0WBxJxvzv0ocKCs1Ht3qYK4bAV9jpMeETBMvL4ISEPYX3ynFkoXIFdqMnj3u7abvQUhRckYxfgwvgF+i9BEA21u9ahstd8YScmjRg0a6wcittEuVuvkdyKpyqHyGKm; 24:eaBIba278Jvwmc/x3laGQkI7c9ZUGh1X5iYDADxL9nFyId/FifLC63SOG1xsEQtnCO1kmLb5mW+O/Lb+r9Er3CG1HHoHFHuaNz3pFyfbJzE= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; SN1PR07MB1535; 7:xEuBkHiT57J6g5aFe9W6Vn9ziZIcMevCL3/OMCWYBJ8M1DiKw5TNSklucrWRM7vM3B10N1Kh0E0i1rjpmg6P3Z5bvYX/YKCe5nJtZvEUkehLWEMlWTYwmi4mMZQL4HWJC6Q0yQTHx99xTxtlVaS6F6+uT6H0wgAUQ1OiPX0ogGZOrS/o+purJUOfRF00kA1XUQU+15zmBPMqB3kJ05ki3FucoHe2CP6TKED49NeOQ97FcV6E33kSs8hL20mNAMl3HeVts94VB3KEEcVrvM3lVG/9hcQ7J9P1Ex51QGb2XzomQxVOo7icIpV4Z8FTVvFOL7UXQTnrq7p4BiipAKr7BkG9FdJKC0C6P81WuKCrWayhDrEfJwsTj+vNhepV8eU6K2s7Y4fHeZvBbLMFde9TDJqd2g4F3kAMeIsr8TvVXoPqygyMBIACk+95K41pDxfs+y8gAVWJAp3H/c1cgSAkDYgWyFSH5rvNW/RClP+R8znrk8uqcWpAh/2BKL4yUT1dotMlMv9XFWN7uH9CrVUTEBdtAS3K1bv1j/LZwghFt6T9oIXT0AgQuLCuT4feOJ2CIubdlqMZEBAw0uNFA9tY9SIb4TD61NgzhjSlHUi0rfvdiWdePRj2ZHMbCInEYjZPfN1MEyXgx1Pwmga8lc0/54zplOfB7di59uZuqAHNCyVFOEyz+UsrYb+RPo8Tt1oh1qza+r7qOA39XPk8A1h6YpJyuhkzB7XV7gqCNul4oP4E1a0jxR85Dw7x9iqZvLn5hYuk6TPhtpLzdnhfZ8uo34T4iu89TZ8dQtrKj/KEz0s= X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Jul 2017 07:33:13.4958 (UTC) X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=711e4ccf-2e9b-4bcf-a551-4094005b6194; Ip=[50.232.66.26]; Helo=[CAEXCH02.caveonetworks.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR07MB1535 Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch adds the ability to add and remove listeners and identify whether the SYN packet received is intended for iWARP or not. If a listener is not found the SYN packet is posted back to the chip. Signed-off-by: Michal Kalderon Signed-off-by: Yuval Mintz Signed-off-by: Ariel Elior --- drivers/net/ethernet/qlogic/qed/qed_iwarp.c | 269 +++++++++++++++++++++++++++- drivers/net/ethernet/qlogic/qed/qed_iwarp.h | 23 +++ drivers/net/ethernet/qlogic/qed/qed_rdma.c | 2 + include/linux/qed/qed_rdma_if.h | 52 ++++++ 4 files changed, 343 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/qlogic/qed/qed_iwarp.c b/drivers/net/ethernet/qlogic/qed/qed_iwarp.c index f3b4b32..2bab57c 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_iwarp.c +++ b/drivers/net/ethernet/qlogic/qed/qed_iwarp.c @@ -31,6 +31,10 @@ */ #include #include +#include +#include +#include +#include #include "qed_cxt.h" #include "qed_hw.h" #include "qed_ll2.h" @@ -477,6 +481,31 @@ void qed_iwarp_resc_free(struct qed_hwfn *p_hwfn) { } +static void +qed_iwarp_print_cm_info(struct qed_hwfn *p_hwfn, + struct qed_iwarp_cm_info *cm_info) +{ + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "ip_version = %d\n", + cm_info->ip_version); + + if (cm_info->ip_version == QED_TCP_IPV4) + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, + "remote_ip %pI4h:%x, local_ip %pI4h:%x vlan=%x\n", + cm_info->remote_ip, cm_info->remote_port, + cm_info->local_ip, cm_info->local_port, + cm_info->vlan); + else + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, + "remote_ip %pI6h:%x, local_ip %pI6h:%x vlan=%x\n", + cm_info->remote_ip, cm_info->remote_port, + cm_info->local_ip, cm_info->local_port, + cm_info->vlan); + + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, + "private_data_len = %x ord = %d, ird = %d\n", + cm_info->private_data_len, cm_info->ord, cm_info->ird); +} + static int qed_iwarp_ll2_post_rx(struct qed_hwfn *p_hwfn, struct qed_iwarp_ll2_buff *buf, u8 handle) @@ -497,11 +526,147 @@ void qed_iwarp_resc_free(struct qed_hwfn *p_hwfn) return rc; } +static struct qed_iwarp_listener * +qed_iwarp_get_listener(struct qed_hwfn *p_hwfn, + struct qed_iwarp_cm_info *cm_info) +{ + struct qed_iwarp_listener *listener = NULL; + static const u32 ip_zero[4] = { 0, 0, 0, 0 }; + bool found = false; + + qed_iwarp_print_cm_info(p_hwfn, cm_info); + + list_for_each_entry(listener, + &p_hwfn->p_rdma_info->iwarp.listen_list, + list_entry) { + if (listener->port == cm_info->local_port) { + if (!memcmp(listener->ip_addr, + ip_zero, sizeof(ip_zero))) { + found = true; + break; + } + + if (!memcmp(listener->ip_addr, + cm_info->local_ip, + sizeof(cm_info->local_ip)) && + (listener->vlan == cm_info->vlan)) { + found = true; + break; + } + } + } + + if (found) { + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "listener found = %p\n", + listener); + return listener; + } + + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "listener not found\n"); + return NULL; +} + +static int +qed_iwarp_parse_rx_pkt(struct qed_hwfn *p_hwfn, + struct qed_iwarp_cm_info *cm_info, + void *buf, + u8 *remote_mac_addr, + u8 *local_mac_addr, + int *payload_len, int *tcp_start_offset) +{ + struct vlan_ethhdr *vethh; + bool vlan_valid = false; + struct ipv6hdr *ip6h; + struct ethhdr *ethh; + struct tcphdr *tcph; + struct iphdr *iph; + int eth_hlen; + int ip_hlen; + int eth_type; + int i; + + ethh = buf; + eth_type = ntohs(ethh->h_proto); + if (eth_type == ETH_P_8021Q) { + vlan_valid = true; + vethh = (struct vlan_ethhdr *)ethh; + cm_info->vlan = ntohs(vethh->h_vlan_TCI) & VLAN_VID_MASK; + eth_type = ntohs(vethh->h_vlan_encapsulated_proto); + } + + eth_hlen = ETH_HLEN + (vlan_valid ? sizeof(u32) : 0); + + memcpy(remote_mac_addr, ethh->h_source, ETH_ALEN); + + memcpy(local_mac_addr, ethh->h_dest, ETH_ALEN); + + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "eth_type =%d source mac: %pM\n", + eth_type, ethh->h_source); + + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "eth_hlen=%d destination mac: %pM\n", + eth_hlen, ethh->h_dest); + + iph = (struct iphdr *)((u8 *)(ethh) + eth_hlen); + + if (eth_type == ETH_P_IP) { + cm_info->local_ip[0] = ntohl(iph->daddr); + cm_info->remote_ip[0] = ntohl(iph->saddr); + cm_info->ip_version = TCP_IPV4; + + ip_hlen = (iph->ihl) * sizeof(u32); + *payload_len = ntohs(iph->tot_len) - ip_hlen; + } else if (eth_type == ETH_P_IPV6) { + ip6h = (struct ipv6hdr *)iph; + for (i = 0; i < 4; i++) { + cm_info->local_ip[i] = + ntohl(ip6h->daddr.in6_u.u6_addr32[i]); + cm_info->remote_ip[i] = + ntohl(ip6h->saddr.in6_u.u6_addr32[i]); + } + cm_info->ip_version = TCP_IPV6; + + ip_hlen = sizeof(*ip6h); + *payload_len = ntohs(ip6h->payload_len); + } else { + DP_NOTICE(p_hwfn, "Unexpected ethertype on ll2 %x\n", eth_type); + return -EINVAL; + } + + tcph = (struct tcphdr *)((u8 *)iph + ip_hlen); + + if (!tcph->syn) { + DP_NOTICE(p_hwfn, + "Only SYN type packet expected on this ll2 conn, iph->ihl=%d source=%d dest=%d\n", + iph->ihl, tcph->source, tcph->dest); + return -EINVAL; + } + + cm_info->local_port = ntohs(tcph->dest); + cm_info->remote_port = ntohs(tcph->source); + + qed_iwarp_print_cm_info(p_hwfn, cm_info); + + *tcp_start_offset = eth_hlen + ip_hlen; + + return 0; +} + static void qed_iwarp_ll2_comp_syn_pkt(void *cxt, struct qed_ll2_comp_rx_data *data) { struct qed_iwarp_ll2_buff *buf = data->cookie; + struct qed_iwarp_listener *listener; + struct qed_ll2_tx_pkt_info tx_pkt; + struct qed_iwarp_cm_info cm_info; struct qed_hwfn *p_hwfn = cxt; + u8 remote_mac_addr[ETH_ALEN]; + u8 local_mac_addr[ETH_ALEN]; + int tcp_start_offset; + u8 ll2_syn_handle; + int payload_len; + int rc; + + memset(&cm_info, 0, sizeof(cm_info)); if (GET_FIELD(data->parse_flags, PARSING_AND_ERR_FLAGS_L4CHKSMWASCALCULATED) && @@ -510,11 +675,52 @@ void qed_iwarp_resc_free(struct qed_hwfn *p_hwfn) goto err; } - /* Process SYN packet - added later on in series */ + rc = qed_iwarp_parse_rx_pkt(p_hwfn, &cm_info, (u8 *)(buf->data) + + data->u.placement_offset, remote_mac_addr, + local_mac_addr, &payload_len, + &tcp_start_offset); + if (rc) + goto err; + /* Check if there is a listener for this 4-tuple+vlan */ + ll2_syn_handle = p_hwfn->p_rdma_info->iwarp.ll2_syn_handle; + listener = qed_iwarp_get_listener(p_hwfn, &cm_info); + if (!listener) { + DP_VERBOSE(p_hwfn, + QED_MSG_RDMA, + "SYN received on tuple not listened on parse_flags=%d packet len=%d\n", + data->parse_flags, data->length.packet_length); + + memset(&tx_pkt, 0, sizeof(tx_pkt)); + tx_pkt.num_of_bds = 1; + tx_pkt.vlan = data->vlan; + + if (GET_FIELD(data->parse_flags, + PARSING_AND_ERR_FLAGS_TAG8021QEXIST)) + SET_FIELD(tx_pkt.bd_flags, + CORE_TX_BD_DATA_VLAN_INSERTION, 1); + + tx_pkt.l4_hdr_offset_w = (data->length.packet_length) >> 2; + tx_pkt.tx_dest = QED_LL2_TX_DEST_LB; + tx_pkt.first_frag = buf->data_phys_addr + + data->u.placement_offset; + tx_pkt.first_frag_len = data->length.packet_length; + tx_pkt.cookie = buf; + + rc = qed_ll2_prepare_tx_packet(p_hwfn, ll2_syn_handle, + &tx_pkt, true); + + if (rc) { + DP_NOTICE(p_hwfn, + "Can't post SYN back to chip rc=%d\n", rc); + goto err; + } + return; + } + + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Received syn on listening port\n"); err: - qed_iwarp_ll2_post_rx(p_hwfn, buf, - p_hwfn->p_rdma_info->iwarp.ll2_syn_handle); + qed_iwarp_ll2_post_rx(p_hwfn, buf, ll2_syn_handle); } static void qed_iwarp_ll2_rel_rx_pkt(void *cxt, u8 connection_handle, @@ -700,6 +906,7 @@ int qed_iwarp_setup(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, iwarp_info->peer2peer = QED_IWARP_PARAM_P2P; spin_lock_init(&p_hwfn->p_rdma_info->iwarp.qp_lock); + INIT_LIST_HEAD(&p_hwfn->p_rdma_info->iwarp.listen_list); qed_spq_register_async_cb(p_hwfn, PROTOCOLID_IWARP, qed_iwarp_async_event); @@ -728,6 +935,62 @@ static int qed_iwarp_async_event(struct qed_hwfn *p_hwfn, return 0; } +int +qed_iwarp_create_listen(void *rdma_cxt, + struct qed_iwarp_listen_in *iparams, + struct qed_iwarp_listen_out *oparams) +{ + struct qed_hwfn *p_hwfn = rdma_cxt; + struct qed_iwarp_listener *listener; + + listener = kzalloc(sizeof(*listener), GFP_KERNEL); + if (!listener) + return -ENOMEM; + + listener->ip_version = iparams->ip_version; + memcpy(listener->ip_addr, iparams->ip_addr, sizeof(listener->ip_addr)); + listener->port = iparams->port; + listener->vlan = iparams->vlan; + + listener->event_cb = iparams->event_cb; + listener->cb_context = iparams->cb_context; + listener->max_backlog = iparams->max_backlog; + oparams->handle = listener; + + spin_lock_bh(&p_hwfn->p_rdma_info->iwarp.iw_lock); + list_add_tail(&listener->list_entry, + &p_hwfn->p_rdma_info->iwarp.listen_list); + spin_unlock_bh(&p_hwfn->p_rdma_info->iwarp.iw_lock); + + DP_VERBOSE(p_hwfn, + QED_MSG_RDMA, + "callback=%p handle=%p ip=%x:%x:%x:%x port=0x%x vlan=0x%x\n", + listener->event_cb, + listener, + listener->ip_addr[0], + listener->ip_addr[1], + listener->ip_addr[2], + listener->ip_addr[3], listener->port, listener->vlan); + + return 0; +} + +int qed_iwarp_destroy_listen(void *rdma_cxt, void *handle) +{ + struct qed_iwarp_listener *listener = handle; + struct qed_hwfn *p_hwfn = rdma_cxt; + + DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "handle=%p\n", handle); + + spin_lock_bh(&p_hwfn->p_rdma_info->iwarp.iw_lock); + list_del(&listener->list_entry); + spin_unlock_bh(&p_hwfn->p_rdma_info->iwarp.iw_lock); + + kfree(listener); + + return 0; +} + void qed_iwarp_query_qp(struct qed_rdma_qp *qp, struct qed_rdma_query_qp_out_params *out_params) diff --git a/drivers/net/ethernet/qlogic/qed/qed_iwarp.h b/drivers/net/ethernet/qlogic/qed/qed_iwarp.h index 068b859..29005ac 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_iwarp.h +++ b/drivers/net/ethernet/qlogic/qed/qed_iwarp.h @@ -54,6 +54,7 @@ struct qed_iwarp_ll2_buff { }; struct qed_iwarp_info { + struct list_head listen_list; /* qed_iwarp_listener */ spinlock_t iw_lock; /* for iwarp resources */ spinlock_t qp_lock; /* for teardown races */ u32 rcv_wnd_scale; @@ -67,6 +68,21 @@ struct qed_iwarp_info { enum mpa_rtr_type rtr_type; }; +struct qed_iwarp_listener { + struct list_head list_entry; + + /* The event_cb function is called for connection requests. + * The cb_context is passed to the event_cb function. + */ + iwarp_event_handler event_cb; + void *cb_context; + u32 max_backlog; + u32 ip_addr[4]; + u16 port; + u16 vlan; + u8 ip_version; +}; + int qed_iwarp_alloc(struct qed_hwfn *p_hwfn); int qed_iwarp_setup(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, @@ -94,4 +110,11 @@ int qed_iwarp_modify_qp(struct qed_hwfn *p_hwfn, struct qed_rdma_qp *qp, void qed_iwarp_query_qp(struct qed_rdma_qp *qp, struct qed_rdma_query_qp_out_params *out_params); +int +qed_iwarp_create_listen(void *rdma_cxt, + struct qed_iwarp_listen_in *iparams, + struct qed_iwarp_listen_out *oparams); + +int qed_iwarp_destroy_listen(void *rdma_cxt, void *handle); + #endif diff --git a/drivers/net/ethernet/qlogic/qed/qed_rdma.c b/drivers/net/ethernet/qlogic/qed/qed_rdma.c index ee6887f..29de915 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_rdma.c +++ b/drivers/net/ethernet/qlogic/qed/qed_rdma.c @@ -1772,6 +1772,8 @@ static int qed_roce_ll2_set_mac_filter(struct qed_dev *cdev, .ll2_set_fragment_of_tx_packet = &qed_ll2_set_fragment_of_tx_packet, .ll2_set_mac_filter = &qed_roce_ll2_set_mac_filter, .ll2_get_stats = &qed_ll2_get_stats, + .iwarp_create_listen = &qed_iwarp_create_listen, + .iwarp_destroy_listen = &qed_iwarp_destroy_listen, }; const struct qed_rdma_ops *qed_get_rdma_ops(void) diff --git a/include/linux/qed/qed_rdma_if.h b/include/linux/qed/qed_rdma_if.h index 5b4bb09..28df568 100644 --- a/include/linux/qed/qed_rdma_if.h +++ b/include/linux/qed/qed_rdma_if.h @@ -470,6 +470,52 @@ struct qed_rdma_counters_out_params { #define QED_ROCE_TX_HEAD_FAILURE (1) #define QED_ROCE_TX_FRAG_FAILURE (2) +enum qed_iwarp_event_type { + QED_IWARP_EVENT_MPA_REQUEST, /* Passive side request received */ +}; + +enum qed_tcp_ip_version { + QED_TCP_IPV4, + QED_TCP_IPV6, +}; + +struct qed_iwarp_cm_info { + enum qed_tcp_ip_version ip_version; + u32 remote_ip[4]; + u32 local_ip[4]; + u16 remote_port; + u16 local_port; + u16 vlan; + u8 ord; + u8 ird; + u16 private_data_len; + const void *private_data; +}; + +struct qed_iwarp_cm_event_params { + enum qed_iwarp_event_type event; + const struct qed_iwarp_cm_info *cm_info; + void *ep_context; /* To be passed to accept call */ + int status; +}; + +typedef int (*iwarp_event_handler) (void *context, + struct qed_iwarp_cm_event_params *event); + +struct qed_iwarp_listen_in { + iwarp_event_handler event_cb; + void *cb_context; /* passed to event_cb */ + u32 max_backlog; + enum qed_tcp_ip_version ip_version; + u32 ip_addr[4]; + u16 port; + u16 vlan; +}; + +struct qed_iwarp_listen_out { + void *handle; +}; + struct qed_roce_ll2_header { void *vaddr; dma_addr_t baddr; @@ -576,6 +622,12 @@ struct qed_rdma_ops { int (*ll2_set_mac_filter)(struct qed_dev *cdev, u8 *old_mac_address, u8 *new_mac_address); + int (*iwarp_create_listen)(void *rdma_cxt, + struct qed_iwarp_listen_in *iparams, + struct qed_iwarp_listen_out *oparams); + + int (*iwarp_destroy_listen)(void *rdma_cxt, void *handle); + }; const struct qed_rdma_ops *qed_get_rdma_ops(void);