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)); From patchwork Thu Mar 1 21:49:58 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Tu X-Patchwork-Id: 880141 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="cAWIbbYd"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zsmMc2xnyz9s4v for ; Fri, 2 Mar 2018 08:50:52 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1162347AbeCAVuu (ORCPT ); Thu, 1 Mar 2018 16:50:50 -0500 Received: from mail-pg0-f65.google.com ([74.125.83.65]:43798 "EHLO mail-pg0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1162201AbeCAVu2 (ORCPT ); Thu, 1 Mar 2018 16:50:28 -0500 Received: by mail-pg0-f65.google.com with SMTP id e9so2876173pgs.10 for ; Thu, 01 Mar 2018 13:50:27 -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=ZONcUrykjJiydKh0Gx3ZRgGMd1F2DR1MvgOy1RbnDNA=; b=cAWIbbYdukMijO3vRn7YZMAW8qDnlFBNFN+tYyFly5JoIi0K5goGfeBNZPc/dGFySp uxr9XzGwzXRmirnz8dDlo0yiON3+1YDczLX5eMOKN1rQAEEKcdbcGnQ/pvM9KsYh4Vnb u/6PtN+ZZQ7oDwWa1F8u2qDWzw1TGGgmkEyV7MXC5Lf8YELnEDR9KAShJ+53yOHZZuIY pU/JBG1M4YzdMM9NiFU1ZVUGUtacB23FXDLNO07JCPNaA5XZMfFcbe6D4Z2SKWs3HQxv iDAzLXgT6EwFJlXidM2IMPZqIugNmqc3OfSdQJLqZ08e8W8CG4eeapAJA/TkUPiJTryp BXJg== 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=ZONcUrykjJiydKh0Gx3ZRgGMd1F2DR1MvgOy1RbnDNA=; b=t2ObNe26iPKpR9VTkxeyKYYCwU//KrmKgRs7T9AmdPLwijeKCb6B3FGP75p+fU+tlp +GdEXznNF+16jKjU9EE31nPrr8VGVxjRP7VtFR22npmkTAEpIZKGIOTYlB8DpkgeGsvm ZTiQUFt+4nFg+J0DaEU3NY3EifjyVRSaTat3avXIRM+Ez6OEjDv6A9Vhkxaq/rKZzmgn enY+r2lKmQqx52+vMsVWoE+N8cYEBkYh7PhOhM84qR8K1VYPYAHtyQtfBEysotgvoBft djdBRzoZtER2T/0kwTezbsjQp2XXkcFpeLy72fbrwj+XyQnAfEPjJc2HJgDUsuahNGUw ojSA== X-Gm-Message-State: APf1xPB75zPiX0pVobgS3o7KGo7cNigVMS4mko9SITkTm8tmTmrUeLhQ XFeCQtNBBfuVEuHn5H/Zs2ucvFoG X-Google-Smtp-Source: AG47ELvoKySzI3Fc0urdWDwe7wxYTBE8WHjz6s3abay1oOz2voKz2byqB1TXBWRlATLELIW2dWh+qA== X-Received: by 10.99.114.86 with SMTP id c22mr2653003pgn.162.1519941027331; Thu, 01 Mar 2018 13:50:27 -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.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 01 Mar 2018 13:50:26 -0800 (PST) From: William Tu To: netdev@vger.kernel.org Cc: daniel@iogearbox.net, ast@kernel.org Subject: [PATCHv2 net-next 2/2] samples/bpf: add gre sequence number test. Date: Thu, 1 Mar 2018 13:49:58 -0800 Message-Id: <1519940998-3885-3-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 The patch adds tests for GRE sequence number support for metadata mode tunnel. Signed-off-by: William Tu Acked-by: Daniel Borkmann --- samples/bpf/tcbpf2_kern.c | 6 ++++-- samples/bpf/test_tunnel_bpf.sh | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/samples/bpf/tcbpf2_kern.c b/samples/bpf/tcbpf2_kern.c index efdc16d195ff..9a8db7bd6db4 100644 --- a/samples/bpf/tcbpf2_kern.c +++ b/samples/bpf/tcbpf2_kern.c @@ -52,7 +52,8 @@ int _gre_set_tunnel(struct __sk_buff *skb) key.tunnel_tos = 0; key.tunnel_ttl = 64; - ret = bpf_skb_set_tunnel_key(skb, &key, sizeof(key), BPF_F_ZERO_CSUM_TX); + ret = bpf_skb_set_tunnel_key(skb, &key, sizeof(key), + BPF_F_ZERO_CSUM_TX | BPF_F_SEQ_NUMBER); if (ret < 0) { ERROR(ret); return TC_ACT_SHOT; @@ -92,7 +93,8 @@ int _ip6gretap_set_tunnel(struct __sk_buff *skb) key.tunnel_label = 0xabcde; ret = bpf_skb_set_tunnel_key(skb, &key, sizeof(key), - BPF_F_TUNINFO_IPV6 | BPF_F_ZERO_CSUM_TX); + BPF_F_TUNINFO_IPV6 | BPF_F_ZERO_CSUM_TX | + BPF_F_SEQ_NUMBER); if (ret < 0) { ERROR(ret); return TC_ACT_SHOT; diff --git a/samples/bpf/test_tunnel_bpf.sh b/samples/bpf/test_tunnel_bpf.sh index 43ce049996ee..c265863ccdf9 100755 --- a/samples/bpf/test_tunnel_bpf.sh +++ b/samples/bpf/test_tunnel_bpf.sh @@ -23,7 +23,8 @@ function config_device { function add_gre_tunnel { # in namespace ip netns exec at_ns0 \ - ip link add dev $DEV_NS type $TYPE key 2 local 172.16.1.100 remote 172.16.1.200 + ip link add dev $DEV_NS type $TYPE seq key 2 \ + local 172.16.1.100 remote 172.16.1.200 ip netns exec at_ns0 ip link set dev $DEV_NS up ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24 @@ -43,7 +44,7 @@ function add_ip6gretap_tunnel { # in namespace ip netns exec at_ns0 \ - ip link add dev $DEV_NS type $TYPE flowlabel 0xbcdef key 2 \ + ip link add dev $DEV_NS type $TYPE seq flowlabel 0xbcdef key 2 \ local ::11 remote ::22 ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24