From patchwork Tue Jul 30 11:05:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Hurley X-Patchwork-Id: 1138915 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=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="moZriMOL"; 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 45yYr45GQtz9s3Z for ; Tue, 30 Jul 2019 21:15:16 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id D810E2ADD; Tue, 30 Jul 2019 11:13:14 +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 DCD482A31 for ; Tue, 30 Jul 2019 11:06:11 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 20FE0D3 for ; Tue, 30 Jul 2019 11:06:11 +0000 (UTC) Received: by mail-wr1-f67.google.com with SMTP id r1so65277040wrl.7 for ; Tue, 30 Jul 2019 04:06:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=mJ8rNGLg4cSV2Kw8sLp2l4oFSD2XNg6ZcwmjWnNqf70=; b=moZriMOLTFT1YQQ5inkH4A3p1EodhXEI1sxwQR0g8hMd99W9XiBWq1nPoGZf0jLdPS 88SAG9qt/kCZXzEPqG+a08Koa8R+cA0PKnpxMNUWmBTFa5pa/US+ZoTjvEcEC4/96++C WPt3ps6xzHFYZmXQU4sh/w98OkFPo8D+Ir5pNX7lAExlsXeit3/GSU8TmA9tJTZYCc0y eLM0IQBVG0rfvg5ApR/knFSBzbSg6pJgO8gGsofvUTUmleRp8FsZZ1lxwWJutVlA+fg6 qztOLQVieQu30bXPxe+TBJ20ifu8rn6dQPSgAhmumXJj4sN3HPch+UQrz/8H0Llk1RgD 3ISg== 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=mJ8rNGLg4cSV2Kw8sLp2l4oFSD2XNg6ZcwmjWnNqf70=; b=Sz1mqAQBAvAXfG1GHaQrDrmAeI6rquK6mCA0hvUYhaPBkYIQmHuyQ530xeDub4CcPs tHfMHXv/+55utDbcN33jT7i/rT7O0pV0qKT4ZCqMqUURDd306u2kd5dQhs3athfhlPI2 BkG6JGIv5Nd56QGgD3hBl97BF3L95syHAQZuNgUuCwgRUs0I6aE5L690hGq2dTsIUudV Y1jjKRO0YaIX58hacP7q4I+Dj+NuC/qn+NUARPLY/AQ3IJXeZlM3UT7VPQY8dPbEHcus VDmUO+ll6qlTT93FNr/y1n7l6a8l8kI9Nz05JE3q5wsDNoGcv2P3QgeYNIGYNrHUMxBN XHFg== X-Gm-Message-State: APjAAAXU6CBtKiH7c6AH9vXennYoSkiIpRPiIXLbpBnwblePKyUgodUc lHqp3TLryPh8EAPY31De7W6UaHJd6uk= X-Google-Smtp-Source: APXvYqxR6MwZLeSlAHxxH6C1zB3zQ5XUyeE30eHPLcxFZe8pk0cp2YZ8PDHPtCmc7GCCPNy/2wFdYg== X-Received: by 2002:a5d:428a:: with SMTP id k10mr8518336wrq.329.1564484769536; Tue, 30 Jul 2019 04:06:09 -0700 (PDT) Received: from jhurley-Precision-Tower-3420.netronome.com ([80.76.204.157]) by smtp.gmail.com with ESMTPSA id v16sm48958021wrn.28.2019.07.30.04.06.08 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 30 Jul 2019 04:06:08 -0700 (PDT) From: John Hurley To: dev@openvswitch.org Date: Tue, 30 Jul 2019 12:05:17 +0100 Message-Id: <1564484717-18648-5-git-send-email-john.hurley@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1564484717-18648-1-git-send-email-john.hurley@netronome.com> References: <1564484717-18648-1-git-send-email-john.hurley@netronome.com> X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: fbl@sysclose.org, oss-drivers@netronome.com, simon.horman@netronome.com Subject: [ovs-dev] [PATCH OvS 4/4] ovs-tc: offload MPLS set actions to TC datapath 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 Recent modifications to TC allows the modifying of fields within the outermost MPLS header of a packet. OvS datapath rules impliment an MPLS set action by supplying a new MPLS header that should overwrite the current one. Convert the OvS datapath MPLS set action to a TC modify action and allow such rules to be offloaded to a TC datapath. Signed-off-by: John Hurley Reviewed-by: Simon Horman --- lib/netdev-offload-tc.c | 37 +++++++++++++++++++++++++++++++++++++ lib/tc.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ lib/tc.h | 1 + 3 files changed, 86 insertions(+) diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c index 03610d8..6814390 100644 --- a/lib/netdev-offload-tc.c +++ b/lib/netdev-offload-tc.c @@ -665,6 +665,23 @@ parse_tc_flower_to_match(struct tc_flower *flower, push->mpls_lse = mpls_lse; } break; + case TC_ACT_MPLS_SET: { + size_t set_offset = nl_msg_start_nested(buf, + OVS_ACTION_ATTR_SET); + struct ovs_key_mpls *set_mpls; + ovs_be32 mpls_lse = 0; + + flow_set_mpls_lse_label(&mpls_lse, action->mpls.label); + flow_set_mpls_lse_tc(&mpls_lse, action->mpls.tc); + flow_set_mpls_lse_ttl(&mpls_lse, action->mpls.ttl); + flow_set_mpls_lse_bos(&mpls_lse, action->mpls.bos); + + set_mpls = nl_msg_put_unspec_zero(buf, OVS_KEY_ATTR_MPLS, + sizeof *set_mpls); + set_mpls->mpls_lse = mpls_lse; + nl_msg_end_nested(buf, set_offset); + } + break; case TC_ACT_PEDIT: { parse_flower_rewrite_to_netlink_action(buf, flower); } @@ -790,6 +807,22 @@ netdev_tc_flow_dump_next(struct netdev_flow_dump *dump, } static int +parse_mpls_set_action(struct tc_flower *flower, struct tc_action *action, + const struct nlattr *set) +{ + const struct ovs_key_mpls *mpls_set = nl_attr_get(set); + + action->mpls.label = mpls_lse_to_label(mpls_set->mpls_lse); + action->mpls.tc = mpls_lse_to_tc(mpls_set->mpls_lse); + action->mpls.ttl = mpls_lse_to_ttl(mpls_set->mpls_lse); + action->mpls.bos = mpls_lse_to_bos(mpls_set->mpls_lse); + action->type = TC_ACT_MPLS_SET; + flower->action_count++; + + return 0; +} + +static int parse_put_flow_set_masked_action(struct tc_flower *flower, struct tc_action *action, const struct nlattr *set, @@ -870,6 +903,10 @@ parse_put_flow_set_action(struct tc_flower *flower, struct tc_action *action, const struct nlattr *tun_attr; size_t tun_left, tunnel_len; + if (nl_attr_type(set) == OVS_KEY_ATTR_MPLS) { + return parse_mpls_set_action(flower, action, set); + } + if (nl_attr_type(set) != OVS_KEY_ATTR_TUNNEL) { return parse_put_flow_set_masked_action(flower, action, set, set_len, false); diff --git a/lib/tc.c b/lib/tc.c index 71aa55c..316a0ee 100644 --- a/lib/tc.c +++ b/lib/tc.c @@ -1303,6 +1303,25 @@ nl_parse_act_mpls(struct nlattr *options, struct tc_flower *flower) } action->type = TC_ACT_MPLS_PUSH; break; + case TCA_MPLS_ACT_MODIFY: + mpls_label = mpls_attrs[TCA_MPLS_LABEL]; + if (mpls_label) { + action->mpls.label = nl_attr_get_u32(mpls_label); + } + mpls_tc = mpls_attrs[TCA_MPLS_TC]; + if (mpls_tc) { + action->mpls.tc = nl_attr_get_u8(mpls_tc); + } + mpls_ttl = mpls_attrs[TCA_MPLS_TTL]; + if (mpls_ttl) { + action->mpls.ttl = nl_attr_get_u8(mpls_ttl); + } + mpls_bos = mpls_attrs[TCA_MPLS_BOS]; + if (mpls_bos) { + action->mpls.bos = nl_attr_get_u8(mpls_bos); + } + action->type = TC_ACT_MPLS_SET; + break; default: VLOG_ERR_RL(&error_rl, "unknown mpls action: %d, %d", m->action, m->m_action); @@ -1765,6 +1784,27 @@ nl_msg_put_act_push_mpls(struct ofpbuf *request, ovs_be16 proto, } static void +nl_msg_put_act_set_mpls(struct ofpbuf *request, uint32_t label, uint8_t tc, + uint8_t ttl, uint8_t bos) +{ + size_t offset; + + nl_msg_put_string(request, TCA_ACT_KIND, "mpls"); + offset = nl_msg_start_nested(request, TCA_ACT_OPTIONS | NLA_F_NESTED); + { + struct tc_mpls parm = { .action = TC_ACT_PIPE, + .m_action = TCA_MPLS_ACT_MODIFY }; + + nl_msg_put_unspec(request, TCA_MPLS_PARMS, &parm, sizeof parm); + nl_msg_put_u32(request, TCA_MPLS_LABEL, label); + nl_msg_put_u8(request, TCA_MPLS_TC, tc); + nl_msg_put_u8(request, TCA_MPLS_TTL, ttl); + nl_msg_put_u8(request, TCA_MPLS_BOS, bos); + } + nl_msg_end_nested(request, offset); +} + +static void nl_msg_put_act_tunnel_key_release(struct ofpbuf *request) { size_t offset; @@ -2155,6 +2195,14 @@ nl_msg_put_flower_acts(struct ofpbuf *request, struct tc_flower *flower) nl_msg_end_nested(request, act_offset); } break; + case TC_ACT_MPLS_SET: { + act_offset = nl_msg_start_nested(request, act_index++); + nl_msg_put_act_set_mpls(request, action->mpls.label, + action->mpls.tc, action->mpls.ttl, + action->mpls.bos); + nl_msg_end_nested(request, act_offset); + } + break; case TC_ACT_OUTPUT: { ingress = action->out.ingress; ifindex = action->out.ifindex_out; diff --git a/lib/tc.h b/lib/tc.h index a498a84..f421357 100644 --- a/lib/tc.h +++ b/lib/tc.h @@ -155,6 +155,7 @@ enum tc_action_type { TC_ACT_VLAN_PUSH, TC_ACT_MPLS_POP, TC_ACT_MPLS_PUSH, + TC_ACT_MPLS_SET, }; struct tc_action {