From patchwork Thu Mar 1 21:49:57 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Tu X-Patchwork-Id: 880139 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) 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="qCFWlRjA"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zsmMF0NYhz9s4v for ; Fri, 2 Mar 2018 08:50:33 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1162343AbeCAVua (ORCPT ); Thu, 1 Mar 2018 16:50:30 -0500 Received: from mail-pf0-f194.google.com ([209.85.192.194]:43683 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1162190AbeCAVu0 (ORCPT ); Thu, 1 Mar 2018 16:50:26 -0500 Received: by mail-pf0-f194.google.com with SMTP id j2so906398pff.10 for ; Thu, 01 Mar 2018 13:50:26 -0800 (PST) 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=+cd7pVuAlYyc5KZlKa++o3Q0vlGBiPXQX9t60EJD+oY=; b=qCFWlRjAvyJisqmrYtzYXqjUtlYKIWoPJGRCNTjSiTb7/WcRWJnJm9P+M17fvMLtVX JvQXtekVt/VlzYFC3FrOUiJ0VdBGlmSiUYY/LVsikwLzl+vPPZ89yJrC15TKK0gpq+cJ F+plQncN5p83oMz6Xiz4a5OwSyn6EoQpVlBSK8XjrdhlVBt09vcLBcWf2514aojhd6Nh zmBkcOQsad1TKp4hvpHi3ddx/FoOuktRxg2Q6bqb+axqKwYRLP5iNJvQ5m5PbpMV/OQ5 L2kwWJU9CDaMLCj+e6PT6faHh2JKacD76QV40N3yLy+0m7t8dlR9y1grMpkgZxVQ3POo 1ALQ== 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=+cd7pVuAlYyc5KZlKa++o3Q0vlGBiPXQX9t60EJD+oY=; b=SvtYk1kCbIytpv2Zhak1gY/dF2jTYOo2u6k+WnEhWM+lLz/y+lgDzw3qlqP8CJ6ERA LWfCNt4urZpI9b5tPpVf7JiWQXz9iFFCBqEqMx75W4gnw0Iz0LjgA2vYLXKcKNe1Pp3k 5vl/3KW6Mc9+hbHn9RBihUyDPj4w7/YfV5ZERLsFsVWlU03FRRVnm93k/9Z+lfcoELjG hkOP6okbG+C2oR9js5Sgmk0vM1u5C5zQJGFvh8489TI4jkQ8sDFUU4n5RptOHDOEOV5i O86tH0WJU+DdByLQBDdJa4ahG750h15fPbl6g5tYIEy0wGeJaQQqw0tOQeeTNlRpXcsZ yR4w== X-Gm-Message-State: APf1xPAzGdR3CVOvF7DWC4m//O+wbbmVa1hNTiBGIVFMhVP+wc/eJKKk vRoMctMKTsUroxmm8zwwvchR80Hd X-Google-Smtp-Source: AG47ELv91iSSc8GzMk2UTaN+pZsZyQNh75MkKBgxya6OzpuOnvPCUWBFXjgiHGL1f4bvaCHhsby22Q== X-Received: by 10.99.56.83 with SMTP id h19mr2659066pgn.230.1519941026077; Thu, 01 Mar 2018 13:50:26 -0800 (PST) Received: from sc9-mailhost2.vmware.com ([24.5.191.4]) by smtp.gmail.com with ESMTPSA id l26sm10447074pfj.112.2018.03.01.13.50.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 01 Mar 2018 13:50:25 -0800 (PST) From: William Tu To: netdev@vger.kernel.org Cc: daniel@iogearbox.net, ast@kernel.org Subject: [PATCHv2 net-next 1/2] gre: add sequence number for collect md mode. Date: Thu, 1 Mar 2018 13:49:57 -0800 Message-Id: <1519940998-3885-2-git-send-email-u9012063@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1519940998-3885-1-git-send-email-u9012063@gmail.com> References: <1519940998-3885-1-git-send-email-u9012063@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Currently GRE sequence number can only be used in native tunnel mode. This patch adds sequence number support for gre collect metadata mode. RFC2890 defines GRE sequence number to be specific to the traffic flow identified by the key. However, this patch does not implement per-key seqno. The sequence number is shared in the same tunnel device. That is, different tunnel keys using the same collect_md tunnel share single sequence number. Signed-off-by: William Tu Acked-by: Daniel Borkmann --- include/uapi/linux/bpf.h | 1 + net/core/filter.c | 4 +++- net/ipv4/ip_gre.c | 7 +++++-- net/ipv6/ip6_gre.c | 13 ++++++++----- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index db6bdc375126..2a66769e5875 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -800,6 +800,7 @@ enum bpf_func_id { /* BPF_FUNC_skb_set_tunnel_key flags. */ #define BPF_F_ZERO_CSUM_TX (1ULL << 1) #define BPF_F_DONT_FRAGMENT (1ULL << 2) +#define BPF_F_SEQ_NUMBER (1ULL << 3) /* BPF_FUNC_perf_event_output, BPF_FUNC_perf_event_read and * BPF_FUNC_perf_event_read_value flags. diff --git a/net/core/filter.c b/net/core/filter.c index 0c121adbdbaa..33edfa8372fd 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -2991,7 +2991,7 @@ BPF_CALL_4(bpf_skb_set_tunnel_key, struct sk_buff *, skb, struct ip_tunnel_info *info; if (unlikely(flags & ~(BPF_F_TUNINFO_IPV6 | BPF_F_ZERO_CSUM_TX | - BPF_F_DONT_FRAGMENT))) + BPF_F_DONT_FRAGMENT | BPF_F_SEQ_NUMBER))) return -EINVAL; if (unlikely(size != sizeof(struct bpf_tunnel_key))) { switch (size) { @@ -3025,6 +3025,8 @@ BPF_CALL_4(bpf_skb_set_tunnel_key, struct sk_buff *, skb, info->key.tun_flags |= TUNNEL_DONT_FRAGMENT; if (flags & BPF_F_ZERO_CSUM_TX) info->key.tun_flags &= ~TUNNEL_CSUM; + if (flags & BPF_F_SEQ_NUMBER) + info->key.tun_flags |= TUNNEL_SEQ; info->key.tun_id = cpu_to_be64(from->tunnel_id); info->key.tos = from->tunnel_tos; diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index 0fe1d69b5df4..95fd225f402e 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c @@ -522,6 +522,7 @@ static struct rtable *prepare_fb_xmit(struct sk_buff *skb, static void gre_fb_xmit(struct sk_buff *skb, struct net_device *dev, __be16 proto) { + struct ip_tunnel *tunnel = netdev_priv(dev); struct ip_tunnel_info *tun_info; const struct ip_tunnel_key *key; struct rtable *rt = NULL; @@ -545,9 +546,11 @@ static void gre_fb_xmit(struct sk_buff *skb, struct net_device *dev, if (gre_handle_offloads(skb, !!(tun_info->key.tun_flags & TUNNEL_CSUM))) goto err_free_rt; - flags = tun_info->key.tun_flags & (TUNNEL_CSUM | TUNNEL_KEY); + flags = tun_info->key.tun_flags & + (TUNNEL_CSUM | TUNNEL_KEY | TUNNEL_SEQ); gre_build_header(skb, tunnel_hlen, flags, proto, - tunnel_id_to_key32(tun_info->key.tun_id), 0); + tunnel_id_to_key32(tun_info->key.tun_id), + (flags | TUNNEL_SEQ) ? htonl(tunnel->o_seqno++) : 0); df = key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0; diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c index 4f150a394387..16c5dfcbd195 100644 --- a/net/ipv6/ip6_gre.c +++ b/net/ipv6/ip6_gre.c @@ -695,9 +695,6 @@ static netdev_tx_t __gre6_xmit(struct sk_buff *skb, else fl6->daddr = tunnel->parms.raddr; - if (tunnel->parms.o_flags & TUNNEL_SEQ) - tunnel->o_seqno++; - /* Push GRE header. */ protocol = (dev->type == ARPHRD_ETHER) ? htons(ETH_P_TEB) : proto; @@ -720,14 +717,20 @@ static netdev_tx_t __gre6_xmit(struct sk_buff *skb, fl6->flowi6_uid = sock_net_uid(dev_net(dev), NULL); dsfield = key->tos; - flags = key->tun_flags & (TUNNEL_CSUM | TUNNEL_KEY); + flags = key->tun_flags & + (TUNNEL_CSUM | TUNNEL_KEY | TUNNEL_SEQ); tunnel->tun_hlen = gre_calc_hlen(flags); gre_build_header(skb, tunnel->tun_hlen, flags, protocol, - tunnel_id_to_key32(tun_info->key.tun_id), 0); + tunnel_id_to_key32(tun_info->key.tun_id), + (flags | TUNNEL_SEQ) ? htonl(tunnel->o_seqno++) + : 0); } else { + if (tunnel->parms.o_flags & TUNNEL_SEQ) + tunnel->o_seqno++; + gre_build_header(skb, tunnel->tun_hlen, tunnel->parms.o_flags, protocol, tunnel->parms.o_key, htonl(tunnel->o_seqno));