From patchwork Thu Dec 12 14:34:27 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Varghese X-Patchwork-Id: 1208544 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="VwwbhCnM"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 47Ybsm4XJCz9sPh for ; Fri, 13 Dec 2019 01:34:36 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729756AbfLLOef (ORCPT ); Thu, 12 Dec 2019 09:34:35 -0500 Received: from mail-pf1-f193.google.com ([209.85.210.193]:32845 "EHLO mail-pf1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729732AbfLLOee (ORCPT ); Thu, 12 Dec 2019 09:34:34 -0500 Received: by mail-pf1-f193.google.com with SMTP id y206so863963pfb.0 for ; Thu, 12 Dec 2019 06:34:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=bzIfo5QToARCZWLeqG3x/wMqUmg7NXaLyDxKE0gqU2E=; b=VwwbhCnMKjrkX0rSDf4zth6X6KeM3aDp3In1VIxvguObhnvih6HoCr92XASAZaME1x 3jHOCcBkSCmiXku6CClRAJSoNrnuT1TfAHT5616k0tOl5q9Fy90lin6NX2007hbh0kHE A2h9PDxQ4aLfUnkItadB9jiDwbG5oOor22Oto8Sh4F2zqeWwMvkQ1H8QhitPSkvg3IpN fQr+VkY08CeZ5MV1df3jK77q5Ddv5pc62H1RhY5D73dktRqBgDPWVACtljVNFUXd8JAz ZJGHUV/5Q0ZeH/ysdQaqgVMGZ/8elQLfpAVggG+iB/fmyUiZSY8FhmrguKbn6GMKmSFe 0HrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=bzIfo5QToARCZWLeqG3x/wMqUmg7NXaLyDxKE0gqU2E=; b=F9tvk7ijS6K5FKx7m1A+Kk9BoctAPLJoppoLOZaHOq/g1NJb0MpQkkZQFNihf7Ffct RW7kaxqGNYx5LamQmch0rm755U+5YVtZCkMTE666/UaKfsNs0ANcyt44hQnWp8wDgXHu wyDJ0Zqc2MYnzzW1Cb+JUbxG6PPDVVQ/JSBSYEq7l52Jmoj/8+HXgJDjZAJOmod45BAi ve0Ye78h26P5kI3LvvgtNkMDQnTvLUFeilToUnW7pM6uk7/Xqthd6h4d4LyHYtQzFPQG aDQ2gRe6Cq+5AwfI7s26v7f2Hztt0CRKqnmAr4DIU/BJwSAN1MonJJ3syzyGLaWDnznU rzpQ== X-Gm-Message-State: APjAAAUjSasfmWlp1rURThn3T3a+5ruV9QMgJ9wH3vcDaONsO87A/8By idvGvRh7HU6XXq97hFy43Gw6hHS+ X-Google-Smtp-Source: APXvYqyu/6YSf/eUPXGZkv3H75n80k279XguW3EG1b/Md8tXNF9e5NgZUKrpKu1DldiJ0E7Jmf9a8g== X-Received: by 2002:a63:4664:: with SMTP id v36mr10545724pgk.147.1576161273822; Thu, 12 Dec 2019 06:34:33 -0800 (PST) Received: from martin-VirtualBox.dlink.router ([122.182.209.142]) by smtp.gmail.com with ESMTPSA id o1sm1242832pje.7.2019.12.12.06.34.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 12 Dec 2019 06:34:33 -0800 (PST) From: Martin Varghese To: netdev@vger.kernel.org, davem@davemloft.net, pshelar@ovn.org, scott.drennan@nokia.com, jbenc@redhat.com, martin.varghese@nokia.com Subject: [PATCH net-next v2 1/3] net: skb_mpls_push() modified to allow MPLS header push at start of packet. Date: Thu, 12 Dec 2019 20:04:27 +0530 Message-Id: <5dbc2dbc222ff778861ef08b4e0a68a49a7afeb1.1576157907.git.martin.varghese@nokia.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: References: Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Martin Varghese The existing skb_mpls_push() implementation always inserts mpls header after the mac header. L2 VPN use cases requires MPLS header to be inserted before the ethernet header as the ethernet packet gets tunnelled inside MPLS header in those cases. Signed-off-by: Martin Varghese --- Changes in v2: - Fixed comments section of skb_mpls_push(). - Added skb_reset_mac_len() in skb_mpls_push(). The mac len changes when MPLS header in inserted at the start of the packet. net/core/skbuff.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 973a71f..d90c827 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -5472,12 +5472,15 @@ static void skb_mod_eth_type(struct sk_buff *skb, struct ethhdr *hdr, } /** - * skb_mpls_push() - push a new MPLS header after the mac header + * skb_mpls_push() - push a new MPLS header after mac_len bytes from start of + * the packet * * @skb: buffer * @mpls_lse: MPLS label stack entry to push * @mpls_proto: ethertype of the new MPLS header (expects 0x8847 or 0x8848) * @mac_len: length of the MAC header + * @ethernet: flag to indicate if the resulting packet after skb_mpls_push is + * ethernet * * Expects skb->data at mac header. * @@ -5501,7 +5504,7 @@ int skb_mpls_push(struct sk_buff *skb, __be32 mpls_lse, __be16 mpls_proto, return err; if (!skb->inner_protocol) { - skb_set_inner_network_header(skb, mac_len); + skb_set_inner_network_header(skb, skb_network_offset(skb)); skb_set_inner_protocol(skb, skb->protocol); } @@ -5510,6 +5513,7 @@ int skb_mpls_push(struct sk_buff *skb, __be32 mpls_lse, __be16 mpls_proto, mac_len); skb_reset_mac_header(skb); skb_set_network_header(skb, mac_len); + skb_reset_mac_len(skb); lse = mpls_hdr(skb); lse->label_stack_entry = mpls_lse; From patchwork Thu Dec 12 14:34:52 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Varghese X-Patchwork-Id: 1208545 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="ZU1mzT1a"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 47YbtG6RvSz9sPh for ; Fri, 13 Dec 2019 01:35:02 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729781AbfLLOfB (ORCPT ); Thu, 12 Dec 2019 09:35:01 -0500 Received: from mail-pj1-f67.google.com ([209.85.216.67]:36179 "EHLO mail-pj1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729603AbfLLOfB (ORCPT ); Thu, 12 Dec 2019 09:35:01 -0500 Received: by mail-pj1-f67.google.com with SMTP id n96so1116644pjc.3 for ; Thu, 12 Dec 2019 06:35:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=b3hiJ3A3rMjBROFjEn7dlrVf4haGfG2YX4vYzJvUu0g=; b=ZU1mzT1a6j1q1Thw9Us8eq7wVAZfGe8Ee1pajQtvhwQz6RBYAf7qaYRvDYVYgKRgdb UnR2lzVLud3j17ipek0FwRbr0zX3DKC0V0QHzGAZg12znXWomPRWsGgH5f9rtW3Fh/I3 7KUSkO324M5jyTeOnqojmlncRFLGUj9LuUFsWKtyjMbCDwm3xegELFZJLLrDGorwUbrT e9UW3s5Rp4+DvWe+oDFcjJ2JLXdH02GdQ0VHWnF7g78fAygak60ANLlp7pfCKgj4byZU sJiF2TwXUAIK/5dqpq9AiWXap4iO26wUS8czLd1FK1MctBS8WGq5g2eHMvute9DhuCj8 /o2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=b3hiJ3A3rMjBROFjEn7dlrVf4haGfG2YX4vYzJvUu0g=; b=fGQE7YpQJSdLXFF8ZTBK+UIE072S0CuyUkg1zXNSqL4oUCzooIm/YFKGBW38IyI9cB NEKBbTuLmzV2kPiG0UDPy4ZEV3yAuPgiZC2p1Kg4dX6l8glZ/6jN6gDtxykNWoeTxZgS UtEqixU4d+swedEQ0+N8l2JA4YqicO2Jl8ZrSsm6WO5Kq/2K0UKcdgoSe3FAF4byqYqi e90lr56fS0cayCEuOJIBS9G+VOTABJFMbr3ID8d9uNvbDil387nKrhiXkUTWstNi1v4M Cz+qtGmHQBSKVCmxbwZ8aOYH2vY62dTGx9+mGHD0Q6NM8XIvHwbWDHD/AZz+CqHaDBeX 8Nmw== X-Gm-Message-State: APjAAAURlEKn4/5OhTFhuu+I2A4nQF/KHCdidDr8D3R6YCFkLMbAJv4z Eyz3r/A6ryHDk3TU5fWmAACYwcI3 X-Google-Smtp-Source: APXvYqygbe2VJcdjxVn2U1OOmHggeaQ7So/egx/FPbk/vwvba6aW6ohtVTc7RAE8ReXPmWBl6m6XVw== X-Received: by 2002:aa7:8f3d:: with SMTP id y29mr10317055pfr.183.1576161299421; Thu, 12 Dec 2019 06:34:59 -0800 (PST) Received: from martin-VirtualBox.dlink.router ([122.182.209.142]) by smtp.gmail.com with ESMTPSA id z29sm7475473pge.21.2019.12.12.06.34.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 12 Dec 2019 06:34:58 -0800 (PST) From: Martin Varghese To: netdev@vger.kernel.org, davem@davemloft.net, pshelar@ovn.org, scott.drennan@nokia.com, jbenc@redhat.com, martin.varghese@nokia.com Subject: [PATCH net-next v2 2/3] net: Rephrased comments section of skb_mpls_pop() Date: Thu, 12 Dec 2019 20:04:52 +0530 Message-Id: X-Mailer: git-send-email 1.9.1 In-Reply-To: References: Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Martin Varghese Rephrased comments section of skb_mpls_pop() to align it with comments section of skb_mpls_push(). Signed-off-by: Martin Varghese --- net/core/skbuff.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/core/skbuff.c b/net/core/skbuff.c index d90c827..44b0894 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -5533,7 +5533,7 @@ int skb_mpls_push(struct sk_buff *skb, __be32 mpls_lse, __be16 mpls_proto, * @skb: buffer * @next_proto: ethertype of header after popped MPLS header * @mac_len: length of the MAC header - * @ethernet: flag to indicate if ethernet header is present in packet + * @ethernet: flag to indicate if the packet is ethernet * * Expects skb->data at mac header. * From patchwork Thu Dec 12 14:35:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Varghese X-Patchwork-Id: 1208546 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="KO2nsRaR"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 47Ybth5Zm6z9sPh for ; Fri, 13 Dec 2019 01:35:24 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729783AbfLLOfX (ORCPT ); Thu, 12 Dec 2019 09:35:23 -0500 Received: from mail-pl1-f193.google.com ([209.85.214.193]:34025 "EHLO mail-pl1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729603AbfLLOfX (ORCPT ); Thu, 12 Dec 2019 09:35:23 -0500 Received: by mail-pl1-f193.google.com with SMTP id x17so682156pln.1 for ; Thu, 12 Dec 2019 06:35:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=o5Rn1ETBXxi4OF0erG0H313y1J32intQWjv/Yi621dI=; b=KO2nsRaRL1Ij+8LEMLL64qjezrZKHt6YQPQQ3cDdkE6hS60vNLhXQR83frXldLG5qa smSGOImCUa83M84UWA1fMj2eiFsPCEgAJc7egGuS7Pu3WJ8x8ut258qsueKVQuVQBV08 2iUTIIhDXU77jpt3T6f23ZbJGsMLKndniRA22/3vEcU2/np7NfgmZZ2oXbH3F9QNAK23 vBOdaUjFZJKcBcdzf7trgUgub586/Yd2gQlJJIZO3lWGHjz0HNrpzcGMVMJev0dSclw4 VyfYptwIMio+PePqZkB6NtKGAr1j4M9TWev/TCX93EwjyhJRwMmy50yZ5YwU+ePfSDlH rpCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=o5Rn1ETBXxi4OF0erG0H313y1J32intQWjv/Yi621dI=; b=OcAqJiWDfmahKrxr6l39HG4BXYBICzyzX0szJiykbnQ4pXAoxGXbwcmn9rQK+OhtbN 4pQvoYPMQdKZSKEIxpxRaSHaehA/auZUJASwCXPIf9GLNAbkfn4qS1jKLJMCZQYn4IZJ kWMD3ovDygscLNIf3Im2rFpUeVHNLO3QkVoB/kDJ4zr1R8FTXjTPMaZJaQPXdQF3R0rM FhUQe9oi0MHukVjqoiof9QAQ4dZ/pAAqljnjyRsttKYOD6oaR37k0woGdrwjq+34FyED mlsDz8lHP7PAk0CCM5qeTRdDLINs/2UUcTzPsRxBvMQkonj66wJfcuLlYSw6Dy+CYZUx hI/g== X-Gm-Message-State: APjAAAUNvfkEpd3jqU4pza+NKLIhq57QEh+ddPYX4TkYArryhdNPmrg8 lE4HQNuZ/MKXFm69huBSR7lecDOc X-Google-Smtp-Source: APXvYqwF+2u0RrgM2HYpcj7Y5hqjQdj7V9x1O1TT/2jqYUm6fbCJdUhD1NrmtD3WOsvzHacnnSwAWQ== X-Received: by 2002:a17:902:bb98:: with SMTP id m24mr9826188pls.260.1576161322256; Thu, 12 Dec 2019 06:35:22 -0800 (PST) Received: from martin-VirtualBox.dlink.router ([122.182.209.142]) by smtp.gmail.com with ESMTPSA id f34sm7347402pgl.54.2019.12.12.06.35.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 12 Dec 2019 06:35:21 -0800 (PST) From: Martin Varghese To: netdev@vger.kernel.org, davem@davemloft.net, pshelar@ovn.org, scott.drennan@nokia.com, jbenc@redhat.com, martin.varghese@nokia.com Subject: [PATCH net-next v2 3/3] openvswitch: New MPLS actions for layer 2 tunnelling Date: Thu, 12 Dec 2019 20:05:16 +0530 Message-Id: <20aaa5257be38bb50e04b1e596ad05b7deea5ddc.1576157907.git.martin.varghese@nokia.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: References: Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Martin Varghese The existing PUSH MPLS action inserts MPLS header between ethernet header and the IP header. Though this behaviour is fine for L3 VPN where an IP packet is encapsulated inside a MPLS tunnel, it does not suffice the L2 VPN (l2 tunnelling) requirements. In L2 VPN the MPLS header should encapsulate the ethernet packet. The new mpls action PTAP_PUSH_MPLS inserts MPLS header at specified offset from the start of packet. A special handling is added for ethertype 0 in the existing POP MPLS action. Value 0 in ethertype indicates the tunnelled packet is ethernet. Signed-off-by: Martin Varghese --- include/uapi/linux/openvswitch.h | 21 ++++++++++++++++++++- net/openvswitch/actions.c | 26 ++++++++++++++++++++------ net/openvswitch/flow_netlink.c | 15 +++++++++++++++ 3 files changed, 55 insertions(+), 7 deletions(-) diff --git a/include/uapi/linux/openvswitch.h b/include/uapi/linux/openvswitch.h index a87b44c..aaf7d3a 100644 --- a/include/uapi/linux/openvswitch.h +++ b/include/uapi/linux/openvswitch.h @@ -673,6 +673,23 @@ struct ovs_action_push_mpls { }; /** + * struct ovs_action_ptap_push_mpls - %OVS_ACTION_ATTR_PTAP_PUSH_MPLS action + * argument. + * @mpls_lse: MPLS label stack entry to push. + * @mpls_ethertype: Ethertype to set in the encapsulating ethernet frame. + * @mac_len: Offset from start of packet at which MPLS header is pushed. + * + * The only values @mpls_ethertype should ever be given are %ETH_P_MPLS_UC and + * %ETH_P_MPLS_MC, indicating MPLS unicast or multicast. Other are rejected. + */ +struct ovs_action_ptap_push_mpls { + __be32 mpls_lse; + __be16 mpls_ethertype; /* Either %ETH_P_MPLS_UC or %ETH_P_MPLS_MC */ + __u16 mac_len; +}; + + +/** * struct ovs_action_push_vlan - %OVS_ACTION_ATTR_PUSH_VLAN action argument. * @vlan_tpid: Tag protocol identifier (TPID) to push. * @vlan_tci: Tag control identifier (TCI) to push. The CFI bit must be set @@ -892,7 +909,8 @@ struct check_pkt_len_arg { * @OVS_ACTION_ATTR_CHECK_PKT_LEN: Check the packet length and execute a set * of actions if greater than the specified packet length, else execute * another set of actions. - * + * @OVS_ACTION_ATTR_PUSH_MPLS: Push a new MPLS label stack entry at specified + * offset from start of packet. * Only a single header can be set with a single %OVS_ACTION_ATTR_SET. Not all * fields within a header are modifiable, e.g. the IPv4 protocol and fragment * type may not be changed. @@ -927,6 +945,7 @@ enum ovs_action_attr { OVS_ACTION_ATTR_METER, /* u32 meter ID. */ OVS_ACTION_ATTR_CLONE, /* Nested OVS_CLONE_ATTR_*. */ OVS_ACTION_ATTR_CHECK_PKT_LEN, /* Nested OVS_CHECK_PKT_LEN_ATTR_*. */ + OVS_ACTION_ATTR_PTAP_PUSH_MPLS, /* struct ovs_action_push_mpls. */ __OVS_ACTION_ATTR_MAX, /* Nothing past this will be accepted * from userspace. */ diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c index 4c83954..00e4517 100644 --- a/net/openvswitch/actions.c +++ b/net/openvswitch/actions.c @@ -161,16 +161,17 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb, const struct nlattr *attr, int len); static int push_mpls(struct sk_buff *skb, struct sw_flow_key *key, - const struct ovs_action_push_mpls *mpls) + __be32 mpls_lse, __be16 mpls_ethertype, __u16 mac_len) { int err; - err = skb_mpls_push(skb, mpls->mpls_lse, mpls->mpls_ethertype, - skb->mac_len, - ovs_key_mac_proto(key) == MAC_PROTO_ETHERNET); + err = skb_mpls_push(skb, mpls_lse, mpls_ethertype, mac_len, !!mac_len); if (err) return err; + if (!mac_len) + key->mac_proto = MAC_PROTO_NONE; + invalidate_flow_key(key); return 0; } @@ -185,6 +186,9 @@ static int pop_mpls(struct sk_buff *skb, struct sw_flow_key *key, if (err) return err; + if (!skb->mac_len && !ethertype) + key->mac_proto = MAC_PROTO_ETHERNET; + invalidate_flow_key(key); return 0; } @@ -1229,10 +1233,20 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb, execute_hash(skb, key, a); break; - case OVS_ACTION_ATTR_PUSH_MPLS: - err = push_mpls(skb, key, nla_data(a)); + case OVS_ACTION_ATTR_PUSH_MPLS: { + struct ovs_action_push_mpls *mpls = nla_data(a); + + err = push_mpls(skb, key, mpls->mpls_lse, + mpls->mpls_ethertype, skb->mac_len); break; + } + case OVS_ACTION_ATTR_PTAP_PUSH_MPLS: { + struct ovs_action_ptap_push_mpls *mpls = nla_data(a); + err = push_mpls(skb, key, mpls->mpls_lse, + mpls->mpls_ethertype, mpls->mac_len); + break; + } case OVS_ACTION_ATTR_POP_MPLS: err = pop_mpls(skb, key, nla_get_be16(a)); break; diff --git a/net/openvswitch/flow_netlink.c b/net/openvswitch/flow_netlink.c index 65c2e34..b7c80fd 100644 --- a/net/openvswitch/flow_netlink.c +++ b/net/openvswitch/flow_netlink.c @@ -79,6 +79,7 @@ static bool actions_may_change_flow(const struct nlattr *actions) case OVS_ACTION_ATTR_SET_MASKED: case OVS_ACTION_ATTR_METER: case OVS_ACTION_ATTR_CHECK_PKT_LEN: + case OVS_ACTION_ATTR_PTAP_PUSH_MPLS: default: return true; } @@ -3005,6 +3006,7 @@ static int __ovs_nla_copy_actions(struct net *net, const struct nlattr *attr, [OVS_ACTION_ATTR_METER] = sizeof(u32), [OVS_ACTION_ATTR_CLONE] = (u32)-1, [OVS_ACTION_ATTR_CHECK_PKT_LEN] = (u32)-1, + [OVS_ACTION_ATTR_PTAP_PUSH_MPLS] = sizeof(struct ovs_action_ptap_push_mpls), }; const struct ovs_action_push_vlan *vlan; int type = nla_type(a); @@ -3072,6 +3074,19 @@ static int __ovs_nla_copy_actions(struct net *net, const struct nlattr *attr, case OVS_ACTION_ATTR_RECIRC: break; + case OVS_ACTION_ATTR_PTAP_PUSH_MPLS: { + const struct ovs_action_push_mpls *mpls = nla_data(a); + + eth_type = mpls->mpls_ethertype; + if (mac_proto != MAC_PROTO_NONE) { + mpls_label_count = 1; + mac_proto = MAC_PROTO_NONE; + } else { + mpls_label_count++; + } + break; + } + case OVS_ACTION_ATTR_PUSH_MPLS: { const struct ovs_action_push_mpls *mpls = nla_data(a);