From patchwork Sun Sep 2 13:07:49 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pieter Jansen van Vuuren X-Patchwork-Id: 965093 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="LuliMf+K"; 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 423D1w75nHz9sPL for ; Sun, 2 Sep 2018 23:08:52 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 5237FC0C; Sun, 2 Sep 2018 13:07:58 +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 384EEC0C for ; Sun, 2 Sep 2018 13:07:57 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-qk1-f181.google.com (mail-qk1-f181.google.com [209.85.222.181]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 945A57CB for ; Sun, 2 Sep 2018 13:07:56 +0000 (UTC) Received: by mail-qk1-f181.google.com with SMTP id j7-v6so4178381qkd.13 for ; Sun, 02 Sep 2018 06:07:56 -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; bh=otFQ5YZcyW9UnJp2HUrOkxW/lCl85SZBLblonVbd6pY=; b=LuliMf+KIIs+Z5o9+isDdOIvfnQcxWj5foc+UNaczh2RWERBosLRasJDtGzFacD6tK zpY3WJEAg70O7z2eAL87aFFr0ynGQaB5Yc6REprWTjbzIL3lrFlW50Bkr6i9zY+1k+z1 BtHH21/bx/IgAiY0/hJRa4Mrj02AMOziUg6/iWhZ6qSrbSdrrXqyolNloI9uZCV1JKHg 0VRhDTdL5D5ZDbggwq8dNmPKDWRc1lYzafU4OAh4dy07CviORWdG3ijzL+XPKMIDIYpa /Kssfem2eTSQ/l/80iJ6ybkBGk7NKGTthEk/YhOFd7bTbjSyQyfpkZ/Ff5eBBRe+8szJ Eypw== 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; bh=otFQ5YZcyW9UnJp2HUrOkxW/lCl85SZBLblonVbd6pY=; b=U6m7teDHPuE0ukq88Sh9x0vSYRSxZPMca6gJ7exxEp3LcaEsCOxS6RpXy19ilmnuQq obnb8MPfwRN+hVNJYlKHzxEzYu4WT5eDk59BoIvqVCi1UYCXaXKCCJO5M6y/UYFg/D9t ltjS3F8K2dD759ru0LkNE4jAICoJuWHkFwWOPKnVkRFmL346Me+A+f9NRu1uJ2EmOVTy //hTm3ESEulkar/3Nq0HUIkhyY6dVAn+og663sbsoOvalDfjRV+MUEnbu6qsVBTOVAaj O3mqDSHHy+KOpqhmBw8ALLv2ERc0EptnoKYK1Vf0IUIJehBkk8dsOB0TL+nStzTa6+GS 3tpQ== X-Gm-Message-State: APzg51CChMQ2sypgKYZHz/CTP3FJ2w8LJ7ks3WwDr//c5hPj6++uSCg0 ydNVSC4yiz//wv0/zCwXPbsP0dzlBXw= X-Google-Smtp-Source: ANB0VdY4eeY3h/wL9ZgvSJnxZgV5EBy+fWfw1NcTuL8+oL4WMPbLngA5RMUpPAlijEYfhsAU4ghC3w== X-Received: by 2002:a37:b286:: with SMTP id b128-v6mr21872393qkf.158.1535893675580; Sun, 02 Sep 2018 06:07:55 -0700 (PDT) Received: from pieter-Netronome.netronome.com (host81-150-168-85.in-addr.btopenworld.com. [81.150.168.85]) by smtp.gmail.com with ESMTPSA id p30-v6sm2543100qta.4.2018.09.02.06.07.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 02 Sep 2018 06:07:55 -0700 (PDT) From: Pieter Jansen van Vuuren To: dev@openvswitch.org Date: Sun, 2 Sep 2018 14:07:49 +0100 Message-Id: <1535893669-12143-1-git-send-email-pieter.jansenvanvuuren@netronome.com> X-Mailer: git-send-email 1.9.1 X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: simon.horman@netronome.com, Pieter Jansen van Vuuren Subject: [ovs-dev] [PATCH v2] lib/tc: add single mpls match offload support 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 Add TC offload support for classifying single MPLS tagged traffic. Signed-off-by: Pieter Jansen van Vuuren Reviewed-by: Simon Horman Reviewed-by: John Hurley --- lib/netdev-tc-offloads.c | 14 ++++++-- lib/tc.c | 69 ++++++++++++++++++++++++++++++++++++++++ lib/tc.h | 1 + 3 files changed, 82 insertions(+), 2 deletions(-) diff --git a/lib/netdev-tc-offloads.c b/lib/netdev-tc-offloads.c index 7bc745e95..a12bc4c39 100644 --- a/lib/netdev-tc-offloads.c +++ b/lib/netdev-tc-offloads.c @@ -446,6 +446,10 @@ parse_tc_flower_to_match(struct tc_flower *flower, match_set_dl_type(match, key->encap_eth_type[0]); } flow_fix_vlan_tpid(&match->flow); + } else if (eth_type_mpls(key->eth_type)) { + match->flow.mpls_lse[0] = key->mpls_lse & mask->mpls_lse; + match->wc.masks.mpls_lse[0] = mask->mpls_lse; + match_set_dl_type(match, key->encap_eth_type[0]); } else { match_set_dl_type(match, key->eth_type); } @@ -875,9 +879,9 @@ test_key_and_mask(struct match *match) return EOPNOTSUPP; } - for (int i = 0; i < FLOW_MAX_MPLS_LABELS; i++) { + for (int i = 1; i < FLOW_MAX_MPLS_LABELS; i++) { if (mask->mpls_lse[i]) { - VLOG_DBG_RL(&rl, "offloading attribute mpls_lse isn't supported"); + VLOG_DBG_RL(&rl, "offloading multiple mpls_lses isn't supported"); return EOPNOTSUPP; } } @@ -979,6 +983,12 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, flower.key.eth_type = key->dl_type; flower.mask.eth_type = mask->dl_type; + if (mask->mpls_lse[0]) { + flower.key.mpls_lse = key->mpls_lse[0]; + flower.mask.mpls_lse = mask->mpls_lse[0]; + flower.key.encap_eth_type[0] = flower.key.eth_type; + } + mask->mpls_lse[0] = 0; if (mask->vlans[0].tci) { ovs_be16 vid_mask = mask->vlans[0].tci & htons(VLAN_VID_MASK); diff --git a/lib/tc.c b/lib/tc.c index bbc382326..ede683c4e 100644 --- a/lib/tc.c +++ b/lib/tc.c @@ -272,6 +272,10 @@ static const struct nl_policy tca_flower_policy[] = { [TCA_FLOWER_KEY_SCTP_DST] = { .type = NL_A_U16, .optional = true, }, [TCA_FLOWER_KEY_SCTP_SRC_MASK] = { .type = NL_A_U16, .optional = true, }, [TCA_FLOWER_KEY_SCTP_DST_MASK] = { .type = NL_A_U16, .optional = true, }, + [TCA_FLOWER_KEY_MPLS_TTL] = { .type = NL_A_U8, .optional = true, }, + [TCA_FLOWER_KEY_MPLS_TC] = { .type = NL_A_U8, .optional = true, }, + [TCA_FLOWER_KEY_MPLS_BOS] = { .type = NL_A_U8, .optional = true, }, + [TCA_FLOWER_KEY_MPLS_LABEL] = { .type = NL_A_U32, .optional = true, }, [TCA_FLOWER_KEY_VLAN_ID] = { .type = NL_A_U16, .optional = true, }, [TCA_FLOWER_KEY_VLAN_PRIO] = { .type = NL_A_U8, .optional = true, }, [TCA_FLOWER_KEY_VLAN_ETH_TYPE] = { .type = NL_A_U16, .optional = true, }, @@ -344,6 +348,46 @@ nl_parse_flower_eth(struct nlattr **attrs, struct tc_flower *flower) } } +static void +nl_parse_flower_mpls(struct nlattr **attrs, struct tc_flower *flower) +{ + uint8_t ttl, tc, bos; + uint32_t label; + + if (!eth_type_mpls(flower->key.eth_type)) { + return; + } + + flower->key.encap_eth_type[0] = + nl_attr_get_be16(attrs[TCA_FLOWER_KEY_ETH_TYPE]); + flower->key.mpls_lse = 0; + flower->mask.mpls_lse = 0; + + if (attrs[TCA_FLOWER_KEY_MPLS_TTL]) { + ttl = nl_attr_get_u8(attrs[TCA_FLOWER_KEY_MPLS_TTL]); + set_mpls_lse_ttl(&flower->key.mpls_lse, ttl); + set_mpls_lse_ttl(&flower->mask.mpls_lse, 0xff); + } + + if (attrs[TCA_FLOWER_KEY_MPLS_BOS]) { + bos = nl_attr_get_u8(attrs[TCA_FLOWER_KEY_MPLS_BOS]); + set_mpls_lse_bos(&flower->key.mpls_lse, bos); + set_mpls_lse_ttl(&flower->mask.mpls_lse, 0xff); + } + + if (attrs[TCA_FLOWER_KEY_MPLS_TC]) { + tc = nl_attr_get_u8(attrs[TCA_FLOWER_KEY_MPLS_TC]); + set_mpls_lse_tc(&flower->key.mpls_lse, tc); + set_mpls_lse_tc(&flower->mask.mpls_lse, 0xff); + } + + if (attrs[TCA_FLOWER_KEY_MPLS_LABEL]) { + label = nl_attr_get_u32(attrs[TCA_FLOWER_KEY_MPLS_LABEL]); + set_mpls_lse_label(&flower->key.mpls_lse, htonl(label)); + set_mpls_lse_label(&flower->mask.mpls_lse, OVS_BE32_MAX); + } +} + static void nl_parse_flower_vlan(struct nlattr **attrs, struct tc_flower *flower) { @@ -1035,6 +1079,7 @@ nl_parse_flower_options(struct nlattr *nl_options, struct tc_flower *flower) } nl_parse_flower_eth(attrs, flower); + nl_parse_flower_mpls(attrs, flower); nl_parse_flower_vlan(attrs, flower); nl_parse_flower_ip(attrs, flower); nl_parse_flower_tunnel(attrs, flower); @@ -1652,6 +1697,7 @@ nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower) uint16_t host_eth_type = ntohs(flower->key.eth_type); bool is_vlan = eth_type_vlan(flower->key.eth_type); bool is_qinq = is_vlan && eth_type_vlan(flower->key.encap_eth_type[0]); + bool is_mpls = eth_type_mpls(flower->key.eth_type); int err; /* need to parse acts first as some acts require changing the matching @@ -1669,6 +1715,10 @@ nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower) } } + if (is_mpls) { + host_eth_type = ntohs(flower->key.encap_eth_type[0]); + } + FLOWER_PUT_MASKED_VALUE(dst_mac, TCA_FLOWER_KEY_ETH_DST); FLOWER_PUT_MASKED_VALUE(src_mac, TCA_FLOWER_KEY_ETH_SRC); @@ -1711,6 +1761,25 @@ nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower) nl_msg_put_be16(request, TCA_FLOWER_KEY_ETH_TYPE, flower->key.eth_type); + if (is_mpls) { + if (mpls_lse_to_ttl(flower->mask.mpls_lse)) { + nl_msg_put_u8(request, TCA_FLOWER_KEY_MPLS_TTL, + mpls_lse_to_ttl(flower->key.mpls_lse)); + } + if (mpls_lse_to_tc(flower->mask.mpls_lse)) { + nl_msg_put_u8(request, TCA_FLOWER_KEY_MPLS_TC, + mpls_lse_to_tc(flower->key.mpls_lse)); + } + if (mpls_lse_to_bos(flower->mask.mpls_lse)) { + nl_msg_put_u8(request, TCA_FLOWER_KEY_MPLS_BOS, + mpls_lse_to_bos(flower->key.mpls_lse)); + } + if (mpls_lse_to_label(flower->mask.mpls_lse)) { + nl_msg_put_u32(request, TCA_FLOWER_KEY_MPLS_LABEL, + mpls_lse_to_label(flower->key.mpls_lse)); + } + } + if (is_vlan) { if (flower->key.vlan_id[0] || flower->key.vlan_prio[0]) { nl_msg_put_u16(request, TCA_FLOWER_KEY_VLAN_ID, diff --git a/lib/tc.h b/lib/tc.h index aa8805df2..036aba245 100644 --- a/lib/tc.h +++ b/lib/tc.h @@ -78,6 +78,7 @@ struct tc_flower_key { struct eth_addr dst_mac; struct eth_addr src_mac; + ovs_be32 mpls_lse; ovs_be16 tcp_src; ovs_be16 tcp_dst; ovs_be16 tcp_flags;