From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR03-DB5-obe.outbound.protection.outlook.com (mail-eopbgr40068.outbound.protection.outlook.com [40.107.4.68]) by dpdk.org (Postfix) with ESMTP id 7DC987D30 for ; Sat, 20 Jan 2018 22:11:51 +0100 (CET) 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=LKp4jymm5XrCi+9znNC0cOyl1noWnLhtIr3EgLNJptg=; b=dGIYIdN2vhx50457IA3XgAnO1iPc9lLK5qF1eIDT0CLXMPD3e5/fHDohHnxcTi4fwCx+5Ohp7vN+ss/KzclSJ3HqutuJEBR20VsP1wTuFY/hiAe+p+dE576P1dzpdsVoRYCBgiF0BSKkgfwsRN8VPNnCn/2q592Z46cE1ZpLFwc= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=ophirmu@mellanox.com; Received: from mellanox.com (37.142.13.130) by AM0PR0502MB3875.eurprd05.prod.outlook.com (2603:10a6:208:20::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.407.7; Sat, 20 Jan 2018 21:11:49 +0000 From: Ophir Munk To: dev@dpdk.org, Pascal Mazon Cc: Thomas Monjalon , Olga Shern , Ophir Munk Date: Sat, 20 Jan 2018 21:11:33 +0000 Message-Id: <1516482697-8348-3-git-send-email-ophirmu@mellanox.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1516482697-8348-1-git-send-email-ophirmu@mellanox.com> References: <1516282691-29698-1-git-send-email-ophirmu@mellanox.com> <1516482697-8348-1-git-send-email-ophirmu@mellanox.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [37.142.13.130] X-ClientProxiedBy: VI1PR08CA0212.eurprd08.prod.outlook.com (2603:10a6:802:15::21) To AM0PR0502MB3875.eurprd05.prod.outlook.com (2603:10a6:208:20::17) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 43f4ad0a-7f9b-483b-4038-08d5604a6c43 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(48565401081)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:AM0PR0502MB3875; X-Microsoft-Exchange-Diagnostics: 1; AM0PR0502MB3875; 3:WKiTta/6wHpOLYEJFi0QHLrDaB1kRtHP6v5iJaFaGSd8Eubs2KmZyXib9RUydyIi6Iq53MWmOA/bIz2epwDOuRKdZ8HF+7Hqgi3suCI/SstxuLsBNn066S86UB97w8C//r1dz1R/qnE19b9VReEH0IDZLn8l7ysY++IComhRxmB+tXwQCuQwDqf/vS7Bp7e7eBvliqkK2JilYdjGuIlqDAg9FnaK0OLgQL99hetyhzMvYQJHkjFG7vJ29Oi3rcwK; 25:R0cGiQo3nDhd6l1qpQHLjpbSplIRj6DVChaC0KIc1NUKazzmYjIzHKkYvVwnFjSBUl9BmXcSW07cqAhriChK0as3GSVY6w9her21FP+RpCdBwrg4SxA+56QBPMUzkQ3930Il26EWfW5gAkadaY2mQ/B2zoNIZZePYJjUwZIDNMqTDEsbyjK0xbJ2cOOm/PcDU023fn5akcqXyMlDFUQpLaHAlie1+oWSvs5jHYlfuFrRgFbqu7tzpRK7Pv85+h5rLzecF2UubYrbnM4lMDNR8vP+I3hnGcco0ZppD4RExjz5icEuZsbS/VpZyC3U0KVwQVqYLg+dlq6z5YKR8EsCkg==; 31:pOCs4VKu0CeHDKzus3JOiCrIaD6h9aG9hCyc23GUfCgum9NYECAnH1Rcdkd9loS5HVSqgUELW0BoF+5r4/hDOyUghlKM81gzk/qUb8JAnfpEBkkAQqA8Q4q0BRzUs5b+9r+Ez4K9QRWR3vPYgn+xsP+nxEm4BWjLSp0kejC0IwRd+7D149I4LlhRSsYGbqlsFx2nFcQUgJ4ALorHIaOjzZshftIyZ/l+f4KeiUcSVUs= X-MS-TrafficTypeDiagnostic: AM0PR0502MB3875: X-LD-Processed: a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr X-Microsoft-Exchange-Diagnostics: 1; AM0PR0502MB3875; 20:yppySCpNF+HdfocL62ksj8T5FOVvtouYSorOZvzQXzsBoXxjnHvemI7aX9+BZQV2ZhCoOJVimDKNjQlDTV9lEgOTKQyn4H7JBBXN1bqBllW8cP0raPbZt4YCN4NmVUIjkVqjEgc/E6AfVT6tU0BvBtkO7j0/hD/rWoOju19FgzQ2sWLM7M9FctTtL3M3nts/MEr+KC7ypoGnzrb/WNM8afyCNUvP69ORwXpbx2PaAhaoR4mDV4Owx9Hy8MzpiJ5jcnAsFXuO7H+pv4tmvLNiVOLMvjVkbTT39Odh7Akh7tz9UF4P6EiuQtQ6aZed68fxDcUQ+AQ2AkAHflx+wY155ToPU+x9leJfi8joe/N0lcXm/nZcbo2s8D4630maahWg575fYJWl+TJj3BGdTM6lngpcrLGrZegoCvia6H2eCXOdOmh4JSd7SgOMkpfbRcKKkg+U9HgKPf1LyQDuCy+ZhFxNIiV9VnymxKr8Hp9vqp33sxaQT/ObWgiZCHESj0Xe; 4:D3Mpz5XU+qUfAILFtCRMvlpDDBf2OsE2ROrYT7Tr0JBhst1R0w7cXUcgF+h0vh8uvp3C1zFzf1IPfb7IR8FUrt37xFxVUbEiEpZMZ/NENAIX181s5l7kZrR4Q8zcy3hTTgyH9iVlc1/hQQSwXZaw8ntYTynS3uMBQQ4yzptZMeC12EbFHx/G3j3aRb7SLhbbKQXWiWsFC6rydLDS3ZdleC818kfYYq0XIXrhNMt5wGNqHdHVMTaLLC/GZTiZahPk5eZoZpiGSX6n98kh9rF+4g== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(8121501046)(5005006)(3231023)(2400081)(944501161)(93006095)(93001095)(10201501046)(3002001)(6055026)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123564045)(20161123558120)(20161123562045)(6072148)(201708071742011); SRVR:AM0PR0502MB3875; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:AM0PR0502MB3875; X-Forefront-PRVS: 0558D3C5AC X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(39860400002)(366004)(396003)(346002)(39380400002)(376002)(189003)(199004)(25786009)(4326008)(478600001)(7696005)(66066001)(47776003)(107886003)(76176011)(52116002)(51416003)(97736004)(2906002)(21086003)(26005)(316002)(54906003)(86362001)(16586007)(16526018)(8676002)(81166006)(81156014)(5660300001)(50226002)(3846002)(36756003)(69596002)(7736002)(305945005)(386003)(6116002)(6666003)(105586002)(6916009)(4720700003)(50466002)(53936002)(33026002)(68736007)(2950100002)(106356001)(8936002)(48376002)(55016002); DIR:OUT; SFP:1101; SCL:1; SRVR:AM0PR0502MB3875; H:mellanox.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A: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; AM0PR0502MB3875; 23:dNrvEb3FKC1OQI8d7QXuyBDoVvYKWNugYeeXhty?= =?us-ascii?Q?149ZgB2kZI8kzytHzFpFyxmmH/eNazjzGl5KENw1FKe3hFXNQkQr9DWJUEBJ?= =?us-ascii?Q?SBY436qgpeAGFpRlolY69w8Hz0WFWwR075HIwf8PtdyEtjkdI0ycxArX79Dd?= =?us-ascii?Q?ZjLx7b96VIif7zWpZGNBiJvvkQkVgF+/EGXGg2cMxpi6fwXNXwYD8KJSb7JX?= =?us-ascii?Q?b1SBL3l7FjifiFV3zamMsUADF5gD85yxBLAvnwBQWmZN/ZnYKHbMHODhZLmS?= =?us-ascii?Q?5JzxnrkVYL2XXiB1Cjk4OyEwO9xPmHxe0mp5atxyxxFP/QwlV5I7lKXsdTH+?= =?us-ascii?Q?pDmFnyn+hLUDU089EJAAGROwgnHxj0jXbM4drHZtmpCB/SH2cox/Vwdgee3M?= =?us-ascii?Q?BFCfp3pwJlRzsLmGi1gsU48vzkek6KWVrpO8jVz18szO4f+77On/CIkuyXjQ?= =?us-ascii?Q?HgJlFTS5bYVsYWJkHwRVCvLZoJKwarqvrs/Rl4/DhfP4uCPUvHAfrndIC1GP?= =?us-ascii?Q?8nnar0DhXMOfv0NEOCG2nzhpLjw93Gv/gd6w+PauL9oPp7+0pEeItk5h78op?= =?us-ascii?Q?nTIWd4/Jw0RhlCb/0Eo/ErSLejDaXelXe4GRTxnkainmhOyaNejD9cfSncll?= =?us-ascii?Q?jay2q3vyrNvJjukMGoibc4LnZe+gQBAc+7nlCnX/ZnfaqZqmtnWNopIFlOb4?= =?us-ascii?Q?TXqAns2IdSMDqRxdWqjtDMuRFWqc8B91ilw5/LZVbUU+E48OZUdjxXg5F87H?= =?us-ascii?Q?3XfNRU8t2mts1Jq38ZzA3W+Bq3hx3fAs9We5eYroCJvxaNuF1akkf0c65kc7?= =?us-ascii?Q?Z5yCQ2u9urC6oSFk5eEO1bq+GB3+cMju8Unq7li7wgN488WMzZXd8u9QE7zV?= =?us-ascii?Q?ddODhOMY7Pag3tZhHguBg+A+BDXk1V2bKfLpcAhXvni9VfaPZAFuOGyBsE0c?= =?us-ascii?Q?SP0Zrtdl1CeMlUtUiehKmrpy1rvbPfwAenzNIbuzI5heeo9H1ESIjGeNVNni?= =?us-ascii?Q?iGmEYhBk7Q3/1wxtBqyGaNLVXmS0431zEYzE+NP9n54Io44J9TzliRaGxiPj?= =?us-ascii?Q?Yku1d3vsBfmTIjOZ4H8QxAGWaz03eHrVeMyyDh/VUM6cdBPUlVaEoRLk1JCv?= =?us-ascii?Q?hfYy81c4oPJqJJbTM3hQmIdG4UPpRchWZ1lGjH4O9dN29NlmH1a+OknwNGFd?= =?us-ascii?Q?hxHrTsFaBcSxp7bUJTol4C0vq6VbWMA+K+IVU?= X-Microsoft-Exchange-Diagnostics: 1; AM0PR0502MB3875; 6:IJObdjMFZ/9UY+8IljpSXclkHwCmUSjvSIgOEyoc9B/3zh1+SQmqbTxbPYVTcP6YeclFt095IBWvNFdgJFCJArGSpyGKEjk6eD8xDlg1zXO/qWijWavhad3imImwcOZ74n8THXSm125qh+J/Ec71iN6wVepVO8VLRPgaLzIgiqxgHZ035g6zUS/MUK8FfgJMakY/2Ul6uO3e5ppIURu0Fw4LP4QMXysW46vnHorZG1w2XLxX8kth0M1taln7y3itO37GJ7Rny/ryKBdMckreYjX+3Yf8XXVY6I0tOy8Kow0YgKEaaw24NH+HykcYwHlWRuldvuFX8jYlYuiAG4ifXXC1SPx5syPCQIod9bbrhQY=; 5:ECj9uWneTWtYjl2aZ6u7gszlU9V3gro7BY6Aepf3YUI/71v0RkLTCkq5G6V0PqPGwZtXEcoPHnY+jK2BV0t8fcJ8LQssv3ktAnIVDdg46OjZ+BOvxJtmSZOgHIOjpnqrQQoW42kDtm/70ZOo/YCbXwafKczqZAQIL7NTecYs0zc=; 24:Eg0dRsggEh10OKauw71ZvXyuJTgVxhE2whZFqxu4eS3ZuvrrQgU+2LLgUY+bBfPvKvmCpalbpEKRaXMn0aCum2wUq6K+5NP3t63TXWyvF0o=; 7:r7i/7gfbReWWo45fw04A2oCr917uWw+SyxmQw4OEaQ+VFGk78VZdXOIZjdNaLWE0dHj8OCtRlBtXuobiZ4ycn3z9KTi/Ff0F7lh5HF5AGwhuOlfpkf17DnmArhFnGFhgBOfojLVRAYupJHZXlEYHKTEHRt2fpCl9oZTuvNrtmJri17cEXyiHO51v8gNxroIYeZeytOePNLWZlXXgqystBn3dy8p8bWFCti/3aZ6fOsvzB79oOOz1XvN+LchKOYBn SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jan 2018 21:11:49.3611 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 43f4ad0a-7f9b-483b-4038-08d5604a6c43 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR0502MB3875 Subject: [dpdk-dev] [PATCH v6 2/6] net/tap: add eBPF program 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: , X-List-Received-Date: Sat, 20 Jan 2018 21:11:51 -0000 File tap_bpf_program.c was added with two ELF sections corresponding to two BPF programs and one BPF map. Section cls_q - BPF classifier to classify packets to their corresponding queue after an RSS hash was calculated on the packet and saved in skb->cb[1] Section l3_l4 - BPF action to calculate RSS hash on packet layers 3 and 4 This file is not part of DPDK tree compilation. Signed-off-by: Ophir Munk Acked-by: Pascal Mazon --- drivers/net/tap/tap_bpf_program.c | 221 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 drivers/net/tap/tap_bpf_program.c diff --git a/drivers/net/tap/tap_bpf_program.c b/drivers/net/tap/tap_bpf_program.c new file mode 100644 index 0000000..848c50b --- /dev/null +++ b/drivers/net/tap/tap_bpf_program.c @@ -0,0 +1,221 @@ +/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 + * Copyright 2017 Mellanox Technologies, Ltd. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tap_rss.h" + +/** Create IPv4 address */ +#define IPv4(a, b, c, d) ((__u32)(((a) & 0xff) << 24) | \ + (((b) & 0xff) << 16) | \ + (((c) & 0xff) << 8) | \ + ((d) & 0xff)) + +#define PORT(a, b) ((__u16)(((a) & 0xff) << 8) | \ + ((b) & 0xff)) + +/* + * The queue number is offset by 1, to distinguish packets that have + * gone through this rule (skb->cb[1] != 0) from others. + */ +#define QUEUE_OFFSET 1 +#define PIN_GLOBAL_NS 2 + +#define KEY_IDX 0 +#define BPF_MAP_ID_KEY 1 + +struct vlan_hdr { + __be16 proto; + __be16 tci; +}; + +struct bpf_elf_map __attribute__((section("maps"), used)) +map_keys = { + .type = BPF_MAP_TYPE_HASH, + .id = BPF_MAP_ID_KEY, + .size_key = sizeof(__u32), + .size_value = sizeof(struct rss_key), + .max_elem = 256, + .pinning = PIN_GLOBAL_NS, +}; + +__section("cls_q") int +match_q(struct __sk_buff *skb) +{ + __u32 queue = skb->cb[1]; + volatile __u32 q = 0xdeadbeef; + __u32 match_queue = QUEUE_OFFSET + q; + + /* printt("match_q$i() queue = %d\n", queue); */ + + if (queue != match_queue) + return TC_ACT_OK; + return TC_ACT_UNSPEC; +} + + +struct ipv4_l3_l4_tuple { + __u32 src_addr; + __u32 dst_addr; + __u16 dport; + __u16 sport; +} __attribute__((packed)); + +struct ipv6_l3_l4_tuple { + __u8 src_addr[16]; + __u8 dst_addr[16]; + __u16 dport; + __u16 sport; +} __attribute__((packed)); + +static const __u8 def_rss_key[] = { + 0xd1, 0x81, 0xc6, 0x2c, + 0xf7, 0xf4, 0xdb, 0x5b, + 0x19, 0x83, 0xa2, 0xfc, + 0x94, 0x3e, 0x1a, 0xdb, + 0xd9, 0x38, 0x9e, 0x6b, + 0xd1, 0x03, 0x9c, 0x2c, + 0xa7, 0x44, 0x99, 0xad, + 0x59, 0x3d, 0x56, 0xd9, + 0xf3, 0x25, 0x3c, 0x06, + 0x2a, 0xdc, 0x1f, 0xfc, +}; + +static __u32 __attribute__((always_inline)) +rte_softrss_be(const __u32 *input_tuple, const uint8_t *rss_key, + __u8 input_len) +{ + __u32 i, j, hash = 0; +#pragma unroll + for (j = 0; j < input_len; j++) { +#pragma unroll + for (i = 0; i < 32; i++) { + if (input_tuple[j] & (1 << (31 - i))) { + hash ^= ((const __u32 *)def_rss_key)[j] << i | + (__u32)((uint64_t) + (((const __u32 *)def_rss_key)[j + 1]) + >> (32 - i)); + } + } + } + return hash; +} + +static int __attribute__((always_inline)) +rss_l3_l4(struct __sk_buff *skb) +{ + void *data_end = (void *)(long)skb->data_end; + void *data = (void *)(long)skb->data; + __u16 proto = (__u16)skb->protocol; + __u32 key_idx = 0xdeadbeef; + __u32 hash; + struct rss_key *rsskey; + __u64 off = ETH_HLEN; + int j; + __u8 *key = 0; + __u32 len; + __u32 queue = 0; + + rsskey = map_lookup_elem(&map_keys, &key_idx); + if (!rsskey) { + printt("hash(): rss key is not configured\n"); + return TC_ACT_OK; + } + key = (__u8 *)rsskey->key; + + /* Get correct proto for 802.1ad */ + if (skb->vlan_present && skb->vlan_proto == htons(ETH_P_8021AD)) { + if (data + ETH_ALEN * 2 + sizeof(struct vlan_hdr) + + sizeof(proto) > data_end) + return TC_ACT_OK; + proto = *(__u16 *)(data + ETH_ALEN * 2 + + sizeof(struct vlan_hdr)); + off += sizeof(struct vlan_hdr); + } + + if (proto == htons(ETH_P_IP)) { + if (data + off + sizeof(struct iphdr) + sizeof(__u32) + > data_end) + return TC_ACT_OK; + + __u8 *src_dst_addr = data + off + offsetof(struct iphdr, saddr); + __u8 *src_dst_port = data + off + sizeof(struct iphdr); + struct ipv4_l3_l4_tuple v4_tuple = { + .src_addr = IPv4(*(src_dst_addr + 0), + *(src_dst_addr + 1), + *(src_dst_addr + 2), + *(src_dst_addr + 3)), + .dst_addr = IPv4(*(src_dst_addr + 4), + *(src_dst_addr + 5), + *(src_dst_addr + 6), + *(src_dst_addr + 7)), + .sport = PORT(*(src_dst_port + 0), + *(src_dst_port + 1)), + .dport = PORT(*(src_dst_port + 2), + *(src_dst_port + 3)), + }; + __u8 input_len = sizeof(v4_tuple) / sizeof(__u32); + if (rsskey->hash_fields & (1 << HASH_FIELD_IPV4_L3)) + input_len--; + hash = rte_softrss_be((__u32 *)&v4_tuple, key, 3); + } else if (proto == htons(ETH_P_IPV6)) { + if (data + off + sizeof(struct ipv6hdr) + + sizeof(__u32) > data_end) + return TC_ACT_OK; + __u8 *src_dst_addr = data + off + + offsetof(struct ipv6hdr, saddr); + __u8 *src_dst_port = data + off + + sizeof(struct ipv6hdr); + struct ipv6_l3_l4_tuple v6_tuple; + for (j = 0; j < 4; j++) + *((uint32_t *)&v6_tuple.src_addr + j) = + __builtin_bswap32(*((uint32_t *) + src_dst_addr + j)); + for (j = 0; j < 4; j++) + *((uint32_t *)&v6_tuple.dst_addr + j) = + __builtin_bswap32(*((uint32_t *) + src_dst_addr + 4 + j)); + v6_tuple.sport = PORT(*(src_dst_port + 0), + *(src_dst_port + 1)); + v6_tuple.dport = PORT(*(src_dst_port + 2), + *(src_dst_port + 3)); + + __u8 input_len = sizeof(v6_tuple) / sizeof(__u32); + if (rsskey->hash_fields & (1 << HASH_FIELD_IPV6_L3)) + input_len--; + hash = rte_softrss_be((__u32 *)&v6_tuple, key, 9); + } else { + return TC_ACT_PIPE; + } + + queue = rsskey->queues[(hash % rsskey->nb_queues) & + (TAP_MAX_QUEUES - 1)]; + skb->cb[1] = QUEUE_OFFSET + queue; + /* printt(">>>>> rss_l3_l4 hash=0x%x queue=%u\n", hash, queue); */ + + return TC_ACT_RECLASSIFY; +} + +#define RSS(L) \ + __section(#L) int \ + L ## _hash(struct __sk_buff *skb) \ + { \ + return rss_ ## L (skb); \ + } + +RSS(l3_l4) + +BPF_LICENSE("Dual BSD/GPL"); -- 2.7.4