From patchwork Wed May 4 07:36:29 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Horman X-Patchwork-Id: 618298 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3r08xp3DRgz9t5w for ; Wed, 4 May 2016 17:37:02 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b=KRklq5qr; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757347AbcEDHhA (ORCPT ); Wed, 4 May 2016 03:37:00 -0400 Received: from mail-pa0-f46.google.com ([209.85.220.46]:33552 "EHLO mail-pa0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757240AbcEDHg6 (ORCPT ); Wed, 4 May 2016 03:36:58 -0400 Received: by mail-pa0-f46.google.com with SMTP id xk12so21284695pac.0 for ; Wed, 04 May 2016 00:36:58 -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=kdZzzfvpQhZC5WDOwpmAGdorAs9TaP9hAHijyiYPaek=; b=KRklq5qrkAAgythrmzqyIPZQohah5x6IAebTTgRwSBO55xyc8om0owOosqRj4kolwN 74+WqkTAPI/3VkwqgLrlKaTV8Mn2jvBc0j2RUtuKy+XqW7UxRrfeja2k6KNkrr8/EIM+ owamF0shOITeAHCZtb6nnvFHt0SyEe2DprxxO5oZ3fgX4pxpnFZMym1gukQ9P3ddlQLE y1AcuhE8hLkydOZLFo3noqdrgPMJ9dSiztZEU4FjuVqpYrMKrmC9VsQYXiTL6kydfASp b/HWKuiW5XYd9cZJvdnzQAMvjbP+78UZ8R7EyRqGCGwmSzZX9qJMFaU5cyqLKdF48SRa Qxsw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=kdZzzfvpQhZC5WDOwpmAGdorAs9TaP9hAHijyiYPaek=; b=FEsXFS1ARDkvADPCv+SWZ0vinuRyvUMGF1ez717LdQYdd5B2d/9hkLGJSo8fA9eIzq AdA+CUu4i/A/CihbUbWGao7l1R7rm6rT1YxFsXPgMlTzbkJkxYA+UWpN7pbc6l5EvT2/ SGjyeojxrdE2h9+Kkkdb33lYKqiuNx0FWFfF5QlgqE+3Q/EpsMHrzhrIAih8j3cd/O9E DLp7Q4kdhA2PwcgpsrAWRAELaeQdbzPKcW8vdmwrxsFwoE4X/UxOz+C68rKK6+GFCdSO ytuNg6fORIrYghdCiRheDsw5mFWUHvbDQznVpmmiDWVE8OYKLhKh0FhlpABLOMvvv4Lr BYIA== X-Gm-Message-State: AOPr4FVQE9vZkuUWvJhoMZI7qfAjifkZcQclCpndqpoUjmGv1kotBWVc5/VzZLcjbAmBfkRM X-Received: by 10.66.142.232 with SMTP id rz8mr10056086pab.22.1462347417995; Wed, 04 May 2016 00:36:57 -0700 (PDT) Received: from penelope.kanocho.kobe.vergenet.net (121-80-211-180f1.hyg1.eonet.ne.jp. [121.80.211.180]) by smtp.gmail.com with ESMTPSA id 1sm3513717pah.7.2016.05.04.00.36.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 04 May 2016 00:36:56 -0700 (PDT) From: Simon Horman To: netdev@vger.kernel.org, dev@openvswitch.org Cc: Simon Horman Subject: [PATCH v9 net-next 3/7] openvswitch: add support to push and pop mpls for layer3 packets Date: Wed, 4 May 2016 16:36:29 +0900 Message-Id: <1462347393-22354-4-git-send-email-simon.horman@netronome.com> X-Mailer: git-send-email 2.7.0.rc3.207.g0ac5344 In-Reply-To: <1462347393-22354-1-git-send-email-simon.horman@netronome.com> References: <1462347393-22354-1-git-send-email-simon.horman@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Allow push and pop mpls actions to act on layer 3 packets by teaching them not to access non-existent L2 headers of such packets. Signed-off-by: Simon Horman --- v9 * New Patch --- net/openvswitch/actions.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c index 879185fe183f..fe885a89f501 100644 --- a/net/openvswitch/actions.c +++ b/net/openvswitch/actions.c @@ -160,8 +160,10 @@ static int push_mpls(struct sk_buff *skb, struct sw_flow_key *key, skb_postpush_rcsum(skb, new_mpls_lse, MPLS_HLEN); - hdr = eth_hdr(skb); - hdr->h_proto = mpls->mpls_ethertype; + if (skb->mac_len) { + hdr = eth_hdr(skb); + hdr->h_proto = mpls->mpls_ethertype; + } if (!skb->inner_protocol) skb_set_inner_protocol(skb, skb->protocol); @@ -174,7 +176,6 @@ static int push_mpls(struct sk_buff *skb, struct sw_flow_key *key, static int pop_mpls(struct sk_buff *skb, struct sw_flow_key *key, const __be16 ethertype) { - struct ethhdr *hdr; int err; err = skb_ensure_writable(skb, skb->mac_len + MPLS_HLEN); @@ -189,11 +190,16 @@ static int pop_mpls(struct sk_buff *skb, struct sw_flow_key *key, __skb_pull(skb, MPLS_HLEN); skb_reset_mac_header(skb); - /* skb_mpls_header() is used to locate the ethertype - * field correctly in the presence of VLAN tags. - */ - hdr = (struct ethhdr *)(skb_mpls_header(skb) - ETH_HLEN); - hdr->h_proto = ethertype; + if (skb->mac_len) { + /* skb_mpls_header() is used to locate the ethertype + * field correctly in the presence of VLAN tags. + */ + struct ethhdr *hdr; + + hdr = (struct ethhdr *)(skb_mpls_header(skb) - ETH_HLEN); + BUG_ON((unsigned char *)hdr < skb_mac_header(skb)); + hdr->h_proto = ethertype; + } if (eth_p_mpls(skb->protocol)) skb->protocol = ethertype;