From patchwork Wed Sep 21 12:54:13 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yotam Gigi X-Patchwork-Id: 672967 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3sfQ2c5d7Xz9sCp for ; Thu, 22 Sep 2016 02:25:12 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=Mellanox.com header.i=@Mellanox.com header.b=qgqU+bc1; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758017AbcIUQZI (ORCPT ); Wed, 21 Sep 2016 12:25:08 -0400 Received: from mail-db5eur01on0068.outbound.protection.outlook.com ([104.47.2.68]:45568 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752360AbcIUQZG (ORCPT ); Wed, 21 Sep 2016 12:25:06 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=7/f5zYOR2FYaT6aj1s8GGMaV6i0xWfPSzu9REGeFCUw=; b=qgqU+bc122NNHDtukRuBTNMbtwxKBPE5vkXJYk+zi1mXYc3sir2IO6XjEduLl5g9kADHpufEfUBvilVp9UAflav7bsuq/+WDn36NQeaN0jexSKm/EyxhLvoJAgvBQBLjk+PiGmy06KlwycLYTpGlbdfQ8fZIchISB+zXdloKOow= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=yotamg@mellanox.com; Received: from dev-r-vrt-155.mtr.labs.mlnx (193.47.165.251) by AM3PR05MB0760.eurprd05.prod.outlook.com (2a01:111:e400:8849::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.639.5; Wed, 21 Sep 2016 12:52:08 +0000 From: Yotam Gigi To: , , CC: Yotam Gigi Subject: [PATCH net] act_ife: Add support for machines with hard_header_len != mac_len Date: Wed, 21 Sep 2016 15:54:13 +0300 Message-ID: <1474462453-37668-1-git-send-email-yotamg@mellanox.com> X-Mailer: git-send-email 2.4.3 MIME-Version: 1.0 X-Originating-IP: [193.47.165.251] X-ClientProxiedBy: AM4PR01CA0020.eurprd01.prod.exchangelabs.com (2a01:111:e400:59dd::30) To AM3PR05MB0760.eurprd05.prod.outlook.com (2a01:111:e400:8849::16) X-MS-Office365-Filtering-Correlation-Id: c0e78b8c-38c1-4704-afd6-08d3e21e1980 X-Microsoft-Exchange-Diagnostics: 1; AM3PR05MB0760; 2:WzKLl+LG//dBDWc1KU50brO2kdYGSJGd0mbXSAfznKACu0lzpLL1kCGvVnpyyXz9gsVyLMpL+m9yvXU+T9QgOeoSyusI7fb+Dvfvzn1ZTM5LoKg/B6uqkfDtmril0qEKVpZZ9SdH4OCebnIU+eXDEMc7kOuHdVXWHjCQ56DCo15nPDmWeUSEJfPS6pwkkmy7; 3:4MhxLXYfHa152dZUzFf8/8zfTFJ719jHSRMU5MQKFrS7n6nkzBLytB+ky7XF0dkSj0j8Cm3NdZ8JOb50T8WYMVzVuFpbpwMe986FUPzw2Skl8mKQXCuaA4X7B83uowG3; 25:qjpGp/WAucTLCqxx3x8ENmhxhaEMgsATrfdvlo531pXwtbx+4XEYHUffzRUFGbVlQUzn1EeEj3dR+eQdNQk8rGulcqMSDJytl7jo+9Jn93wil5dTtUdS545J1blnoe2ZLL5XQIipgE2dF0EQaiSW3hKQC4hLLHQ6d9c2ZK4FCXyF7AoAIcPsNbztpaZZ9k7ZbW9SLq5X/cHpgvuOyzK77qK0VTUnUa5ra8CW7Mz0tDGJLTP55jxUsNgYqRqUehPyoV/8iHjxDDM2qupZMShHW1NGRVoiYjvoUUDw5wgQJgvT39W1AXZRCp7NV3XR0/+eIJT5H2L/oF5j8mohKJOSuTd9k/rX05yGdz5BiwpvwAduh6dPyvbDRg4aLaUO7eppMHeMPX2jvsP34WFp/NwgZL4LCn/xwbxWhbwRgKfDOa4= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:AM3PR05MB0760; X-Microsoft-Exchange-Diagnostics: 1; AM3PR05MB0760; 31:VSpKb8hw31wBI2zb00rz33eeIORCZtMNXZEl/wEMQcnzT7lOkaex/N5ynXirj6q4fZI20GrHMXv2k9AHxAzrhgocshhLajVWBBGjW6BDKyKqTeknKGY0sI4MrkwFwcfiZa24Led9eb016bn7vfhWQ7TqELDuN9AKU9YdiBzo9nGTiQpZI7NC4qJ6mrEb+pdBybWmtTVphaxosHe/WraOJjmm1nfwL4jItwxZ0tkQ8hs=; 20:t2f+R/xd0/n+XsjslpKzDafD5XAM9UYM/sQ4aqLo1/Dq/pqXBOuiKfUTXLgM7CWWfiYurTUcqqqbJqqHkk0Jk9vr2iMkZkqHpgiV2Nad12LtckWVbnBq9pUfXNIXKagjHi+eSy0mucVYfnHRKc/EuFF3A93cHERnQrGSaFWkBt9XA/jbwz3maEfMmUxMr4wJklcKT8Ii62bQpKe/kPaf8VSoUFSTE+JgRSVDhQdXSAjZX0131VUVU4BSu0mYrjgVBE9bKYz7SZWgWyy4J0h49C48+DRQ+s/FDdOyMvIapnbbbwfNOZHZUFQM9QwvFlZppI8UKLXecx1glKidMPVCTMHfQtRml7fdX/JUgq7PRaZB5BpNxWqzi11Vka6T40f6y6/b4rLTRt3QhCyajjXX8apnLm8h9/SZ20CttjEXompRYme+jucJB/ApFsfUqwt+9chc5xjR/CeghxG5Zw8og5I999dVuqdztcnbVPZFEiwCfRpDNgI4TxofCssCK0F/ X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040176)(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001)(6055026); SRVR:AM3PR05MB0760; BCL:0; PCL:0; RULEID:; SRVR:AM3PR05MB0760; X-Microsoft-Exchange-Diagnostics: 1; AM3PR05MB0760; 4:IWqVByGmMXA+GQT9QoUs9uAQOBFIeL+1rzSdut7GRHQP81KXKChJ+92+V8IaF77tYtClewcidimsMTuZgwQIzuBWc/pXO0vuK9N0ON+PogIWCAsZJW69NGEnIuBQxQ5sENohoq6KiFOLlqGV7XwtH/z9khmHSX0uIcec9srasp/bIXXhQxh8nbV5FiK7+YIEfYLk5QTe7lXPU3piaZTSY0tLha6dK7FulokXnUp8iB/Mc8+aqVfUV3oMFN8lRKKR5PPUt6BJMZ/OaXJxrIwzT2mbRUBU/dtS1H5zd5jeOxFfTkkDkJZxXy9sdPoXfTBcLNRM+3eOFhhNzb1SFFN9QcUvqKX6CIQTLyeDYv1yM+1wtv0K64fDdjRbZDNzuFU9nxgWAkGfhXGWcMQQWEjZTQ== X-Forefront-PRVS: 007271867D X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6009001)(7916002)(43544003)(199003)(189002)(4326007)(4001430100002)(2906002)(33646002)(48376002)(5660300001)(47776003)(81156014)(81166006)(50466002)(8676002)(66066001)(7736002)(42186005)(36756003)(2201001)(105586002)(86362001)(586003)(107886002)(7846002)(575784001)(92566002)(305945005)(19580395003)(101416001)(6116002)(5003940100001)(68736007)(3846002)(50226002)(19580405001)(97736004)(5001770100001)(229853001)(106356001)(50986999)(189998001); DIR:OUT; SFP:1101; SCL:1; SRVR:AM3PR05MB0760; H:dev-r-vrt-155.mtr.labs.mlnx; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; AM3PR05MB0760; 23:E5dJUnecKV43/1rZm/lMyQkc442ADVhsugyWOPvEC?= =?us-ascii?Q?oHMkiAx+ESWCzZiC1Ufu00QlGGsFhDpGvEOPAMlvCjcTa7mr4ik3AzJlqe2R?= =?us-ascii?Q?vE4n1T+Inq3MANl9H87vb8VQs7t9P8kt8kdxt6kmn+VweExOvoZrqm1evaiJ?= =?us-ascii?Q?JW2DN40NykoemtsqdJ/iEInN45rQ2s9I51fhP9IEj4iGDO/B13DyORCYkOP0?= =?us-ascii?Q?/fbKWxNK5ulcXbvgXZi4ivUYMevs7RPL1S0k9JLpjWPWwWqOwMtz5Gs35L4M?= =?us-ascii?Q?0nYuK9b/odsHee/cz3IoTOVGnBEX6JWUQ9XaAU121WzhlMSNNT6JSQxWAMnD?= =?us-ascii?Q?nI9fZYVNtCihNDu/Z6ivlKVfZJgXWVNp2Kp4RjYsK6xp1Ni1oJVgitQoYFkr?= =?us-ascii?Q?6t0suZ986O7kWeIhalbAwde0g2GM0VTi24cchXKoYFYVT0nM3QQAdVR+WiNf?= =?us-ascii?Q?KxpzDTz0XhCzjGlP9oaGKh+I2AUd+4/52FHYPLb12euDe0PR1EK8oFAO/n3m?= =?us-ascii?Q?Anp6+m7hF0VaZlOGfZ4zQ0hS1pt1CAjOPrehWOs3+oBuKDV0YvCvFYsUt23h?= =?us-ascii?Q?EFroDYzpNKB0ilHLntNGyXJc1jeDTklN54Yuci7nCC1nlx180G7oTcJvUH+3?= =?us-ascii?Q?YOuUsiSifWwdHSfJUyfsGI48oKGbvi1/6dRxCCWSveUMD//Ve1mK37YgvHNk?= =?us-ascii?Q?y90CC/FM8mbQGfOFD0+I/QUEYfVTRkZEt5d1pNi86qZAhYR+pzCk9PSkbcIB?= =?us-ascii?Q?ijJNjGl0Y9RgPlfBl4FVS5WWeLm1dnhB6QRFGyUeQfjsQkOOWwclCUnSF7bK?= =?us-ascii?Q?BcpAP6BMGQdiXOUM2MWKWLAbyDWVlm6WUfJHuLrcj5JFdyNy03cfXJUmDWvx?= =?us-ascii?Q?ijD6proh9zooC5wc0K1zhH+uf1bB8x+zwt38vFosHnQw19uAZANqphNW7xe0?= =?us-ascii?Q?T60BWoQPyXxVpAN6RjIFzMU9zV4HAAApRXggnUAIzDGWucR0T7TVZcn3kXvw?= =?us-ascii?Q?j+2/aDSpsgi1HazRMcJ5Hu0coB9T8xe20ke2ELCwKyXa13SmYJjFKQizt8ZY?= =?us-ascii?Q?9TkMW3Hi43UhgcuoI2A6IwtAfRqV3BQyx+tRG2is16YnkJA3fDgahr0ExeFd?= =?us-ascii?Q?k/slYT2EsgI5q1cSuM5AsQCz5Twjx8s?= X-Microsoft-Exchange-Diagnostics: 1; AM3PR05MB0760; 6:qezmUzQEyIl3zLRrNS9RbsvmW3tUXORk/v8Yty4vZdVbYzpwryb02oF7QMO99sbvMKMKfpIu1QEOdAMr8a/MxU+WjqluEUVR1jlKbjYLEoRFWEWgdT+kzufU0ez9N5EvoJQgTuBSV7wLpqzMq+EpjdXI4s9ilvbMK6jlP77hsZQcSF6u8+oEfyaBu03qAwo6cV665DY7kfRO7K4n1oJIWb5D7betR1IIHd4MNCpDfKNud9D7QjU4jigprRuevzeEqb2qUV42UlJ/VRWSBCvqCxWthMB9UI13i1KPqz1uELwn+HQN2mBC62I77uX9u+vzifSh7h4P/DoaKFwvewqV3Q==; 5:enqLGt+oSKSqHRZdhvgCnzNZX5cu28d00687NA4IKiG9qBmnjL4tAXqB5giMDywbZI58TFhCXt35xfNY9nCBHrCbStZKAX+4YGvOzyyhGF0V+FK/3epxxVOyeUvjrbUsSFvWwRYs54U9xrx5iS8uoQ==; 24:FgL43c+WCucw9TLZskahXqKc2R1uanoqNhAqHkSesSQrK9wonSkJJ0Vm4ma2o/U/8keS6iaPkbKYLFOuJecR+vSyTX5cNvYPLeJjyy3Pyi0=; 7:99Ecv+rnCpfB4dssdwzBkE5eH+YqdMxT/eF0jEoo/jlc3UFUKkw9hF6ZcJVlGvrcMdTDjtLSoegMtIiwbXozvByHFhzmK2cN7kd9py+ZzmfiIhV9VivlN+g7TVu25x/tzQ5++aJyXag5JOCh5g4fhm12LELCD92JZzMgH3rRGBgF8l1kIJQtHhn5gGbzgK3R4DuQ7h9TtsNE+C/MLeDzS0ATB5u87H/We7NorMpgRgG+7tKBxCDdKK0xOePXPcw6WRvcNHhGHCG1laWdhC7b2Or5ceTKHKHltIMWkxgv/n8JpPL7Kmr2Na6xP/GsQ51e SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Sep 2016 12:52:08.9688 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM3PR05MB0760 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Without that fix, the following could occur: - On encode ingress, the total amount of skb_pushes (in lines 751 and 753) was more than specified in cow. - On machines with hard_header_len > mac_len, the packet format was not according to the ife specifications, as the place reserved at the beginning of the packet is for hard_header_len, but only mac_len bytes get initialized in it. Acting upon simple ping packet, The following tc commands: tc qdisc add dev sw1p5 handle 1: root prio tc filter add dev sw1p5 parent 1: protocol ip \ matchall skip_hw \ action ife encode type 0xdead use mark 0x12 when netdev sw1p5 has hard_header_len of 30, created the following packet: 0x0000: e41d 2da5 f1d3 e41d 2d46 ffb5 dead 0000 ..-.....-F...... 0x0010: 0000 0000 0000 0000 0000 0000 0000 000a ................ 0x0020: 0001 0004 0000 0012 e41d 2da5 f1d3 e41d ..........-..... 0x0031: 2d46 ffb5 0800 4500 0054 55e9 4000 4001 -F....E..TU.@.@. 0x0040: ceba 0b00 0005 0b00 0001 0800 d2ea 63b7 ..............c. 0x0050: 0002 a360 e257 0000 0000 7ad0 0200 0000 ...`.W....z..... 0x0060: 0000 1011 1213 1415 1617 1819 1a1b 1c1d ................ 0x0070: 1e1f 2021 2223 2425 2627 2829 2a2b 2c2d ...!"#$%&'()*+,- 0x0080: 2e2f 3031 3233 3435 3637 ./01234567 and it can be seen that bytes 0x0e to 0x01e are not initialized and contain random memory data, where bytes 0x01e to 0x028 contain the ife header. To fix those problems, add the total_push and reserve variables, which indicates the exact amount of pushes needed and the exact amount of headroom the packet should have. Thus, it is possible to take care of the cases: - on ingress, the mac header must be pushed back as the ingress parser already parses the mac header and pulls it - on egress, the code should reserve hard_header_len space extra in headroom for driver to put the rest of the headers Fixes: ef6980b6becb ("net sched: introduce IFE action") Signed-off-by: Yotam Gigi Signed-off-by: Jamal Hadi Salim --- net/sched/act_ife.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/net/sched/act_ife.c b/net/sched/act_ife.c index e87cd81..27b19ca 100644 --- a/net/sched/act_ife.c +++ b/net/sched/act_ife.c @@ -708,11 +708,13 @@ static int tcf_ife_encode(struct sk_buff *skb, const struct tc_action *a, where ORIGDATA = original ethernet header ... */ u16 metalen = ife_get_sz(skb, ife); - int hdrm = metalen + skb->dev->hard_header_len + IFE_METAHDRLEN; - unsigned int skboff = skb->dev->hard_header_len; u32 at = G_TC_AT(skb->tc_verd); - int new_len = skb->len + hdrm; bool exceed_mtu = false; + unsigned int skboff; + int total_push; + int reserve; + int new_len; + int hdrm; int err; if (at & AT_EGRESS) { @@ -724,6 +726,22 @@ static int tcf_ife_encode(struct sk_buff *skb, const struct tc_action *a, bstats_update(&ife->tcf_bstats, skb); tcf_lastuse_update(&ife->tcf_tm); + if (at & AT_EGRESS) { + /* on egress, reserve space for hard_header_len instead of + * mac_len + */ + skb_reset_mac_len(skb); + hdrm = metalen + skb->mac_len + IFE_METAHDRLEN; + total_push = hdrm; + reserve = metalen + skb->dev->hard_header_len + IFE_METAHDRLEN; + } else { + /* on ingress, push mac_len as it already get parsed from tc */ + hdrm = metalen + skb->mac_len + IFE_METAHDRLEN; + total_push = hdrm + skb->mac_len; + reserve = total_push; + } + new_len = skb->len + hdrm; + if (!metalen) { /* no metadata to send */ /* abuse overlimits to count when we allow packet * with no metadata @@ -742,19 +760,17 @@ static int tcf_ife_encode(struct sk_buff *skb, const struct tc_action *a, iethh = eth_hdr(skb); - err = skb_cow_head(skb, hdrm); + err = skb_cow_head(skb, reserve); if (unlikely(err)) { ife->tcf_qstats.drops++; spin_unlock(&ife->tcf_lock); return TC_ACT_SHOT; } - if (!(at & AT_EGRESS)) - skb_push(skb, skb->dev->hard_header_len); - - __skb_push(skb, hdrm); + __skb_push(skb, total_push); memcpy(skb->data, iethh, skb->mac_len); skb_reset_mac_header(skb); + skboff += skb->mac_len; oethh = eth_hdr(skb); /*total metadata length */ @@ -792,7 +808,7 @@ static int tcf_ife_encode(struct sk_buff *skb, const struct tc_action *a, oethh->h_proto = htons(ife->eth_type); if (!(at & AT_EGRESS)) - skb_pull(skb, skb->dev->hard_header_len); + skb_pull(skb, skb->mac_len); spin_unlock(&ife->tcf_lock);