From patchwork Sat Jul 14 11:39:00 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Tu X-Patchwork-Id: 943920 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Shq/8nsY"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 41SSWR2rkMz9ryt for ; Sat, 14 Jul 2018 21:44:19 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 79689CCA; Sat, 14 Jul 2018 11:40:06 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id EE469CBD for ; Sat, 14 Jul 2018 11:40:03 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pg1-f194.google.com (mail-pg1-f194.google.com [209.85.215.194]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 6F648794 for ; Sat, 14 Jul 2018 11:40:03 +0000 (UTC) Received: by mail-pg1-f194.google.com with SMTP id m19-v6so5837467pgv.3 for ; Sat, 14 Jul 2018 04:40:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=zlLBhNqaud0RYneEWqdPLbQE3ujc6UJDA2WXeGtoo5U=; b=Shq/8nsYlrGlMh179EnQWO5zXDJTMpX32cwM72OczJa0ZcSt0sKkN02LafadW3RK9Z ftLD77qfSLeEe51C5lHL6MkAZYr6mqITud67RERwsIb1d5Pc+7q6T4e1vGCwl8knEu1J +iSKie6lshaUZ8xz+jI4taBeou3G/2HSz4PViNfRcefOseH5qo66F9KgeCnvKEq1jT37 OurkAJgmhFisHCV1ocKfFjQb0/Ws2hLBNjSCPASPkFO0wwMIySA2A0EDa4KfiXaWYj/2 alNUjt6e8VTpMe93tHEHCatIcYuU7aAtrm2jf/V5x70LMsVPFI28TZJdLz8keFS0s2K6 0O6g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=zlLBhNqaud0RYneEWqdPLbQE3ujc6UJDA2WXeGtoo5U=; b=d4k1eYS+p7l9HdEhsjukKoU+/cigbfG9TSjF2oEpXVeIrxDbD/K+446Mgv8l/fVN0g Pk74FRkr1mmSvlb4XMavxH2Sbc20XszLpv2B7OKq9EZnBgpiQVzdVwe5uV0mLNItSx3h fth0d1hSyIGpdTsfXXsspqD5tZtSl4LFiPmBjKOc4iEKApAYrz6CD3bNyLEd2buXDEXQ 95/cS7vRVGC21YyyjfsE57BeREyrYk9enL0w0JABq5fC6IIvyplZ+yqCa7RF9DxGNkMY f/iuiVQP1Ro6hqX/z+ZUGMCjCV+1yWsBDzLpilhWlw4ekssdvtxFSEUmWNQCDtUY34QN I4VQ== X-Gm-Message-State: AOUpUlH3EBHz6IvSv/GQai40zVzJt9rUWVlNJ9+c+Xi4VEz7xObJ6/S1 jd32LDlhJs3gFSoEhu34cLQNhOd8 X-Google-Smtp-Source: AAOMgpfx5uRwn3jp76kYM5UTrO4l7Mo3UoXFEiADwNnzqDYiy6FBkArXWwH6p5QkIBbGhsV/CdW8MA== X-Received: by 2002:a62:170c:: with SMTP id 12-v6mr10768278pfx.139.1531568402836; Sat, 14 Jul 2018 04:40:02 -0700 (PDT) Received: from sc9-mailhost3.vmware.com (c-73-231-16-221.hsd1.ca.comcast.net. [73.231.16.221]) by smtp.gmail.com with ESMTPSA id m21-v6sm35825267pgv.27.2018.07.14.04.40.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 14 Jul 2018 04:40:02 -0700 (PDT) From: William Tu To: dev@openvswitch.org, iovisor-dev@lists.iovisor.org Date: Sat, 14 Jul 2018 04:39:00 -0700 Message-Id: <1531568345-80246-9-git-send-email-u9012063@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1531568345-80246-1-git-send-email-u9012063@gmail.com> References: <1531568345-80246-1-git-send-email-u9012063@gmail.com> X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [RFC PATCHv2 08/13] vswitch/bridge.c: add bpf datapath initialization. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org The patch initializes the bpf datapath when bridge starts. The check_support could be avoided since we know what datapath bpf program supports what feature. Signed-off-by: Joe Stringer Signed-off-by: William Tu Signed-off-by: Yifeng Sun Co-authored-by: William Tu Co-authored-by: Yifeng Sun --- lib/packets.h | 6 ++++- ofproto/ofproto-dpif.c | 69 ++++++++++++++++++++++++++++++++++---------------- vswitchd/bridge.c | 21 +++++++++++++++ 3 files changed, 73 insertions(+), 23 deletions(-) diff --git a/lib/packets.h b/lib/packets.h index 9a71aa3abbdb..2379c8f6d19d 100644 --- a/lib/packets.h +++ b/lib/packets.h @@ -47,7 +47,8 @@ static inline bool ipv6_addr_is_set(const struct in6_addr *addr); static inline bool flow_tnl_dst_is_set(const struct flow_tnl *tnl) { - return tnl->ip_dst || ipv6_addr_is_set(&tnl->ipv6_dst); + return tnl->ip_dst || ipv6_addr_is_set(&tnl->ipv6_dst) || + tnl->ip_src || ipv6_addr_is_set(&tnl->ipv6_src); } struct in6_addr flow_tnl_dst(const struct flow_tnl *tnl); @@ -154,7 +155,10 @@ pkt_metadata_init(struct pkt_metadata *md, odp_port_t port) * we can just zero out ip_dst and the rest of the data will never be * looked at. */ md->tunnel.ip_dst = 0; + md->tunnel.ip_src = 0; md->tunnel.ipv6_dst = in6addr_any; + md->tunnel.ipv6_src = in6addr_any; + md->in_port.odp_port = port; } diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 3365d4185926..115c138505ac 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -1338,28 +1338,53 @@ CHECK_FEATURE__(ct_orig_tuple6, ct_orig_tuple6, ct_nw_proto, 1, ETH_TYPE_IPV6) static void check_support(struct dpif_backer *backer) { - /* Actions. */ - backer->rt_support.odp.recirc = check_recirc(backer); - backer->rt_support.odp.max_vlan_headers = check_max_vlan_headers(backer); - backer->rt_support.odp.max_mpls_depth = check_max_mpls_depth(backer); - backer->rt_support.masked_set_action = check_masked_set_action(backer); - backer->rt_support.trunc = check_trunc_action(backer); - backer->rt_support.ufid = check_ufid(backer); - backer->rt_support.tnl_push_pop = dpif_supports_tnl_push_pop(backer->dpif); - backer->rt_support.clone = check_clone(backer); - backer->rt_support.sample_nesting = check_max_sample_nesting(backer); - backer->rt_support.ct_eventmask = check_ct_eventmask(backer); - backer->rt_support.ct_clear = check_ct_clear(backer); - - /* Flow fields. */ - backer->rt_support.odp.ct_state = check_ct_state(backer); - backer->rt_support.odp.ct_zone = check_ct_zone(backer); - backer->rt_support.odp.ct_mark = check_ct_mark(backer); - backer->rt_support.odp.ct_label = check_ct_label(backer); - - backer->rt_support.odp.ct_state_nat = check_ct_state_nat(backer); - backer->rt_support.odp.ct_orig_tuple = check_ct_orig_tuple(backer); - backer->rt_support.odp.ct_orig_tuple6 = check_ct_orig_tuple6(backer); + if (!strcmp(backer->type, "bpf")) { + /* Actions. */ + backer->rt_support.odp.recirc = check_recirc(backer); + backer->rt_support.odp.max_vlan_headers = check_max_vlan_headers(backer); + backer->rt_support.odp.max_mpls_depth = check_max_mpls_depth(backer); + backer->rt_support.masked_set_action = check_masked_set_action(backer); + backer->rt_support.trunc = check_trunc_action(backer); + backer->rt_support.ufid = check_ufid(backer); + backer->rt_support.tnl_push_pop = dpif_supports_tnl_push_pop(backer->dpif); + backer->rt_support.clone = check_clone(backer); + backer->rt_support.sample_nesting = check_max_sample_nesting(backer); + backer->rt_support.ct_eventmask = false; + backer->rt_support.ct_clear = false; + + /* Flow fields. */ + backer->rt_support.odp.ct_state = false; + backer->rt_support.odp.ct_zone = false; + backer->rt_support.odp.ct_mark = false; + backer->rt_support.odp.ct_label = false; + + backer->rt_support.odp.ct_state_nat = false; + backer->rt_support.odp.ct_orig_tuple = false; + backer->rt_support.odp.ct_orig_tuple6 = false; + } else { + /* Actions. */ + backer->rt_support.odp.recirc = check_recirc(backer); + backer->rt_support.odp.max_vlan_headers = check_max_vlan_headers(backer); + backer->rt_support.odp.max_mpls_depth = check_max_mpls_depth(backer); + backer->rt_support.masked_set_action = check_masked_set_action(backer); + backer->rt_support.trunc = check_trunc_action(backer); + backer->rt_support.ufid = check_ufid(backer); + backer->rt_support.tnl_push_pop = dpif_supports_tnl_push_pop(backer->dpif); + backer->rt_support.clone = check_clone(backer); + backer->rt_support.sample_nesting = check_max_sample_nesting(backer); + backer->rt_support.ct_eventmask = check_ct_eventmask(backer); + backer->rt_support.ct_clear = check_ct_clear(backer); + + /* Flow fields. */ + backer->rt_support.odp.ct_state = check_ct_state(backer); + backer->rt_support.odp.ct_zone = check_ct_zone(backer); + backer->rt_support.odp.ct_mark = check_ct_mark(backer); + backer->rt_support.odp.ct_label = check_ct_label(backer); + + backer->rt_support.odp.ct_state_nat = check_ct_state_nat(backer); + backer->rt_support.odp.ct_orig_tuple = check_ct_orig_tuple(backer); + backer->rt_support.odp.ct_orig_tuple6 = check_ct_orig_tuple6(backer); + } } static int diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index f44f950a4fce..ca6d73810420 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -20,6 +20,7 @@ #include #include "async-append.h" +#include "bpf.h" #include "bfd.h" #include "bitmap.h" #include "cfm.h" @@ -508,6 +509,25 @@ bridge_exit(bool delete_datapath) ovsdb_idl_destroy(idl); } +static int +init_ebpf(const struct ovsrec_open_vswitch *ovs_cfg OVS_UNUSED) +{ + static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER; + static int error = 0; + + if (ovsthread_once_start(&once)) { + char *bpf_elf = xasprintf("%s/bpf/datapath.o", ovs_pkgdatadir()); + + error = bpf_init(); + if (!error) { + error = bpf_load(bpf_elf); + } + free(bpf_elf); + ovsthread_once_done(&once); + } + return error; +} + /* Looks at the list of managers in 'ovs_cfg' and extracts their remote IP * addresses and ports into '*managersp' and '*n_managersp'. The caller is * responsible for freeing '*managersp' (with free()). @@ -2979,6 +2999,7 @@ bridge_run(void) if (cfg) { netdev_set_flow_api_enabled(&cfg->other_config); dpdk_init(&cfg->other_config); + init_ebpf(cfg); } /* Initialize the ofproto library. This only needs to run once, but