From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-ve1eur01on0044.outbound.protection.outlook.com [104.47.1.44]) by dpdk.org (Postfix) with ESMTP id 61A7B1B2A5 for ; Thu, 11 Jan 2018 18:46:14 +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=e2btpvvg9nJqbTiNU9eKFVBZ9m1mBCBYxNNlR2nNZI8=; b=LOZQRHeQJhwGyeOzlULMj8xSa12+1p52U3egs6Z6fkaRG7Q4Q9O1fxqCSTzU1r/pRg3ksNB7x/tL73UjKsed50ZAYoXc9lqRxavpfdmSpQcZI3hsf7MYvOX/sKxRmWGKOpGt3tAisefugAVqEvES/hgg0is6Zoa4+fvUvtxXVrc= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=ophirmu@mellanox.com; Received: from mellanox.com (37.142.13.130) by VI1PR0502MB3885.eurprd05.prod.outlook.com (2603:10a6:803:c::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.386.5; Thu, 11 Jan 2018 17:46:12 +0000 From: Ophir Munk To: dev@dpdk.org, Pascal Mazon Cc: Thomas Monjalon , Olga Shern , Ophir Munk Date: Thu, 11 Jan 2018 17:45:49 +0000 Message-Id: <1515692751-25257-4-git-send-email-ophirmu@mellanox.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1515692751-25257-1-git-send-email-ophirmu@mellanox.com> References: <1515567969-27946-1-git-send-email-ophirmu@mellanox.com> <1515692751-25257-1-git-send-email-ophirmu@mellanox.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [37.142.13.130] X-ClientProxiedBy: HE1PR07CA0002.eurprd07.prod.outlook.com (2603:10a6:7:67::12) To VI1PR0502MB3885.eurprd05.prod.outlook.com (2603:10a6:803:c::10) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: c2b5759b-0ca6-4640-afa0-08d5591b350c X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020069)(4652020)(48565401081)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0502MB3885; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0502MB3885; 3:exOROOql0+7PSB7b6gQPcQjSO84NsGhRlcSZQGIRnaPcFTSZi9RadHXvLkxy5WMXmKWUJjijq8JIJBJKc0c1CTUe2mTU7cpoq/iSE58xnAx4JR5PdXfpK+vhLO5y0bLJaoPCHr3EAqJT1ZflD7eCIF9Xqt1EIWvpc1SOpGVuKaikRCD0mWCemAGrkl/huvywzpOmVGSkZThRrPZus1S3qc0aH9WyT82UKRAaJES/V0GPB7gWkYb7F9rqPE6UdNcs; 25:DKmhGVFQfK7/MilB25vU4LSqxfCERXmA9F28NIKB3VlfLNTDuqCOYV1rRDV1tbZ64ep3Gig7hSE6mYDqEF+cMCFJCyXp2mCpGJ01p7R7Yn6zi5wtyK4Pru3f3GBDVfOnq7bRdaPHoqnvaxdkmDj5WJeep7QWRU3gOI0uf8WhZpaaYEGr49PDobg7ngW6q6BeS/ohXh78EWR/g8YnVROUyQGaSkdQyNijS/sv+MkiWG6YoINfvVBRB6wKV6lG6V7uCUvpln4+dgFWKjozRH7mN1onKzws5rAXmaRHphuyfL/F0ytMFC4yTLDt7VkSZAhOauwfO2QDXYaCupl+rQqhvw==; 31:Jw4JnPvJCIYtS58GdHeE45F47wDzCbR4yhGLGkoLVy3inE1aZ7LV2CUGmzGAPCYoIwT8tGWy403uM7FiJtTbxjBWiK9OY6zUa/ZTakLEHX8ffUngJzevZ3SuMkjTLfGoIaAcRqW2QOJQlrNc/D880004WENt5gfuLZtwDaXjGIsV0he98RP6HuZhIVJujoaEajoWZZQZNnf7BIe94t0cNaFJpbPR2KNsWGMaYFooHg0= X-MS-TrafficTypeDiagnostic: VI1PR0502MB3885: X-LD-Processed: a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr X-Microsoft-Exchange-Diagnostics: 1; VI1PR0502MB3885; 20:Ok3qrfPWGeRuIuP9dfHfAwBfrem8VVx+X7VO6Oq+GfT66XD6twFxA7pkK+C6tse7f3qUdn3566OHU1O8g3TuHHXcdIuLn6CtzwuB3PVYa/+DSFtryci5VL7rD0DuRDXNHg8EWzK88mfuLUE2yuy9BB05cw5br7nKSc1eH8hg/hNxVZM/L8Yr4jOYfC2WSo7a/nBDD8CIFANe7L4unM8SP0RrRWAHhS7091t9RmgCCFdcazjXaQcycFSxjjft5ilnkreTpc66ZCYBr59t+SNvkxqvNaFvUh+JN9WYtST/2F4hl1jb1RtB6rXfbybaOREWpJTPBHeFASfMJrlYkRc1t+mwTWGINhcImmFifMJkPXjfV1uSD19ktqS0l/f7Wy06X3qdLiudvXIzUqk9OmeaGzSjfNxmxBHuzb+DnnZbhT8QgdK6B30wEgxVbEhSidp+F5jpOHj7eY8m94cTB57HAjz4khVAzdnw+RQ02K2dXdpIGzHAqZwMswt9nxquV7ak; 4:aKlcdMHM5yH6mCZ2YePEydzUItSorXU/ZjF7heRZqAwT/cyoMLgbJuHeRxeDP4ec5GvTHTusvhUxT3ZpAu2xW+tcbInGK0hG89uNCST+DCTTre8soHop5Zru4mSDG+94o7KkLoDPyNC2Wgh74RY+PoynsmmLozR3thC1uj/CoPRoaVCXjmXjWNGNWMh/Qi/y6xnG6f7HItSv93KhsyaQI54tDOQNrBQ9POPscZoWCCZjfMu8PjXU1tkOkCnSy4uJ01boYRuiDnlxiG3oYgmXew== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040470)(2401047)(5005006)(8121501046)(10201501046)(3002001)(3231023)(944501134)(93006095)(93001095)(6055026)(6041268)(20161123564045)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0502MB3885; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:VI1PR0502MB3885; X-Forefront-PRVS: 0549E6FD50 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(39860400002)(376002)(366004)(396003)(39380400002)(346002)(199004)(189003)(316002)(68736007)(16526018)(97736004)(69596002)(21086003)(16586007)(8676002)(8936002)(81166006)(81156014)(54906003)(50226002)(2906002)(66066001)(3846002)(6116002)(478600001)(47776003)(86362001)(5660300001)(51416003)(52116002)(50466002)(7736002)(305945005)(25786009)(36756003)(7696005)(106356001)(105586002)(386003)(33026002)(53936002)(2950100002)(55016002)(4326008)(4720700003)(107886003)(6666003)(76176011)(48376002)(6916009); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR0502MB3885; H:mellanox.com; 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; VI1PR0502MB3885; 23:3tBfpVrsdhOCbSai3b2T4DmhGxXkG3jC/hNnH7r?= =?us-ascii?Q?SKBGwCtW35Iepr3n9HhdIzBASvgapY7RGDiD+xwj6p9NEvlMNvbNKNllNfSL?= =?us-ascii?Q?A45+vQPmQ1HEq4Fx9b9f39HB+CHF4eI8UqCFAh5QPZNqjXNkEzSD6VM7J7Bh?= =?us-ascii?Q?bttFHJGABEdty04w9NXkwEKlXlnehlrr+/n77OcCD+NjBcX2QM5LSIHH5Kal?= =?us-ascii?Q?2f5olzpKFohHPNYTAPcStP9tfzanaxeVY/xMP3a+GwNeITGHbBe6mcRM9d86?= =?us-ascii?Q?RF9wB+CSRJV4AD4za/JZTRp+gAfb480RvB63d5c1twQ/k8sGiNdmlr7pT/ra?= =?us-ascii?Q?wEAFniGE/xmFtF3M1a0r0a4O7EhRzFQIIlfudVmDVqOkk6P2QX2RF5mcbGAq?= =?us-ascii?Q?WIJMBbNtxKhPJgU7ICKuevGZ+HxpkvEMMZ2a8j/MMrptHzJtOQv1xvKuxpRk?= =?us-ascii?Q?XGU28cz8Uj96qqCYRpH7s+xLPEMF/46EFdl2g+0PCfNJ2eLmbnbMifwzP+dd?= =?us-ascii?Q?aBHAKEWE+vxyR0HXXcdyA3NBT1YTEWOe528EofZlhjdrqvXzocpqms4Y8gef?= =?us-ascii?Q?26DNwQxjruw7tQ/l7w4bxBHlC+O2fChUTs7njhPJrymQligqA6m948h3jiw9?= =?us-ascii?Q?3/ru9ZqzHym4CIVmzR2JJ0kfBuAjHkHtnYy1+wq4JppyF6qLWKvZYcBoCHbf?= =?us-ascii?Q?0JvDWBJpjKbLSqNMZ6TLygFs8zOhJqfuGJadVZ6bd6poZzcN9dbm2ymz2zQC?= =?us-ascii?Q?5TXXOHdRsk0TmaZM4GcK/Cyu+MfncDsjl57Du/Tsb//W2zqwd4/IbjVb8wrM?= =?us-ascii?Q?WTel3b897MV7lZXvA6URzTzSjC8UEqWuOHOwXCpYqqTle+k/CpIMtD9+uLpK?= =?us-ascii?Q?EfmpInefA3b0tC4plgY97i+KiBZ8jyyDmHhYSHB8w1sgMi1FzFhwX8jcfqXl?= =?us-ascii?Q?gnGi9unmvnnTx+egua3lIzZVaYqbEANoWPTznaVNwUrselF/tml1SRuUhkpT?= =?us-ascii?Q?RSZV9cnACGrPu2/Gh59I9DNb4dSoMCPK2O64Ei3z/gGTFcGMAoEohEfEePQm?= =?us-ascii?Q?I56dMbUc7CureA7oA/UpBZCLn0kAZ3CdUGpvAZP4eVdmwVtR59Sxy9rvHfsv?= =?us-ascii?Q?6fOvHfsAiN5RyItZv4s6mFkh+Lml0rh9QCtz3C+HZgW2PzAWt8qMjHXQhwj8?= =?us-ascii?Q?+Wdv0k6LyiMWFN4c=3D?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0502MB3885; 6:+ae2ROJQNG5Qhn9odZS8vVtn/4L19oPwPobWSVeBtxYwjjB91KeREa2ZSaohBogoxKvGkEb5KHzeq4kqcal1gf/uPZF8utcraYqXOilK0xt4QsjxaH2BCI7FGhrcPiXAJlb6TMlRpSmQKAmVrbndnkgfr4ciCp1rCUsrNH8jx8y+C7jl/m0DPdNyxBAV65lV+bg0Hf3jLy8MwDuKbU2JqAGCs5SwL/gFdSRJqYGFwqwoV/XQ+WciRD+3lzLvrmcBGJvj0kMw4llLFdhzf+C9JNC98OjmvP2Vkuq6RJYGfC+9BbT0OQ3Sy4Tb1iA5l1RKH/M+ZXLLAmGfiPDjpu8/KFdvLmvwnzq25+PYLTQJv9U=; 5:8Dhz5IpF8dBINjn1FOLUL0a1J0yvVMDZv5BXpOHB0ufD8NiocbBduToVJwUk9GFDm2TnbcwBM6mjlexrtVlCQyVhiEg/UE+WcIEFo6IptP9csGH3D5f0ebuM2BGPHvbYrV+FjtTMqNDuWtV8D7r2gwXf1UuZ2U0Ja6vmPLDZ7Pw=; 24:wAD2p2NV3XQyvTJYkNjR/AEMps9eXwiqyBmxZU6Z6PMXWZosMG2SI8kWGzep5U+oXx6XMXm4JnTJ5xvdt42Sltp7SKbqT35nDeVXM7B03Z8=; 7:QxwoadoM+SYcy3YwdMFdTKK4aziv3K8389oQsifw1tc+qBQlncImCqGVNLGwP586t3vOUfK4IjgukqLlkuUKNifmr+mcHnV9hgyA+3L9R9Po358lTy3hD5fE9nMyw4y9wp8frEW4b+gymwy/bIICWvfSq4VD/LAlRZNOAYTdy1bp2NDCQEor3Nv3l27duWUer4g17VR+pZ0HDB05kXdC/RYRlj2QcgyzaJ1phOefW36VzDtC6905EXSfdryk2Iv7 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Jan 2018 17:46:12.1337 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: c2b5759b-0ca6-4640-afa0-08d5591b350c X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0502MB3885 Subject: [dpdk-dev] [PATCH v4 3/5] 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: Thu, 11 Jan 2018 17:46:14 -0000 File tap_bpf_program.c was added with two ELF sections corresponding to two BPF programs and one BPF map. It is the C source file used to generate the eBPF bytes code (see "net/tap: add eBPF bytes code"). 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 --- 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