From patchwork Wed Dec 13 02:22:52 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Tu X-Patchwork-Id: 847715 X-Patchwork-Delegate: shemminger@vyatta.com 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; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Ejn+/7pT"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yxL8G6mHhz9t2Z for ; Wed, 13 Dec 2017 13:23:10 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753789AbdLMCXI (ORCPT ); Tue, 12 Dec 2017 21:23:08 -0500 Received: from mail-pg0-f68.google.com ([74.125.83.68]:39618 "EHLO mail-pg0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753771AbdLMCXC (ORCPT ); Tue, 12 Dec 2017 21:23:02 -0500 Received: by mail-pg0-f68.google.com with SMTP id w7so636752pgv.6 for ; Tue, 12 Dec 2017 18:23:02 -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; bh=qq2kIKUIeyRsYQFGLMK8zFVqnAZVyWTHvw1R7CXmlqU=; b=Ejn+/7pT9nhthoa4l5ZH7IWRX+HNzeJQAHo7RtsrhF6w78G8GsmXHHJ8YdaViYIgWg gmrw/bQVhy9K9FrBiRydyMe/KhFdYnU3t/X9BXNNKD+NvWFBIjxpJWwLxUSXahK9Otdj QPU1ApRwxAyEtPQvYRYTUlvE49aiLUdTosTChtGngf4RVCvyw+ycith569wI9lVltOkE 8iC2o59S5Z58RaoIMkgWs2jD2+e4RpPvWlcV9cvkZswY2f+1/D3q2TQ2iFauEPmoqfyM SU4ud8tBN8SQS9ydmbGqJKn2IvSAZ1w0ZL52BAuk/6WBHcaVFa68616mrZDjfTlOC2Q8 sA9w== 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=qq2kIKUIeyRsYQFGLMK8zFVqnAZVyWTHvw1R7CXmlqU=; b=VAAOMlUoggZarv7HPn0c2B72E96EEO795wnuFz5OO1zwUA8qZYYysxhopljH9uuCjg q5V9mNVHeX0+s4mZ1WYnvPljfUHy6iQ4Q+LyQ6KcOrahExoGZ6hNyM4U8HNJA69qRhg6 o0j7ysOttiBTrjnuxIk2mEezrt9aJEzneunjSSMQLUdduLuagrkBljnty1KHPFX0+XDN nRx5GG7GAXYuuDh/85OiqbRsCrZkvcLrVWnh0itZbG2fq38XGmWCfYxRb0+56u+35whV rg5D/oOnZP7KUvrt5ogRgQploG2rqKVXok4SGq92DjB6+7xcCDFL1tOdGDQsSUHfK63c yWOA== X-Gm-Message-State: AKGB3mLyQ/sOylVv4zH2908UqeAM68puqxRfb8l6ccyzdqOGMH3wS232 haoWtVSz2PJMNRE3Z1xBmjZzdOuK X-Google-Smtp-Source: ACJfBosqCDvNjkxAHlLxJIZuYQgDj4g+snsEm0Ox3XalRrfKtsGpX+0Ky3rra9fKSqTHwYn3jWGVBQ== X-Received: by 10.99.95.133 with SMTP id t127mr3852724pgb.368.1513131781704; Tue, 12 Dec 2017 18:23:01 -0800 (PST) Received: from sc9-mailhost1.vmware.com ([208.91.2.1]) by smtp.gmail.com with ESMTPSA id l5sm478574pgo.24.2017.12.12.18.23.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 12 Dec 2017 18:23:00 -0800 (PST) From: William Tu To: netdev@vger.kernel.org Cc: Daniel Borkmann Subject: [PATCH v4 iproute2 net-next] gre6: add collect metadata support Date: Tue, 12 Dec 2017 18:22:52 -0800 Message-Id: <1513131772-87005-1-git-send-email-u9012063@gmail.com> X-Mailer: git-send-email 2.7.4 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The patch adds 'external' option to support collect metadata gre6 tunnel. The 'external' keyword is already used to set the device into collect metadata mode such as vxlan, geneve, ipip, etc. This patch extends support for ipv6 gre and gretap. Example of L3 and L2 gre device: bash:~# ip link add dev ip6gre123 type ip6gre external bash:~# ip link add dev ip6gretap123 type ip6gretap external Signed-off-by: William Tu Cc: Daniel Borkmann --- change in v4: - rephrase and add excluded options when 'external' is used. change in v3: - explain a little more on man page about 'external' change in v2: - remove "noexternal" in man page --- ip/link_gre6.c | 55 ++++++++++++++++++++++++++++++++------------------- man/man8/ip-link.8.in | 17 ++++++++++++++++ 2 files changed, 52 insertions(+), 20 deletions(-) diff --git a/ip/link_gre6.c b/ip/link_gre6.c index 0a82eaecf2cd..2cb46ca116d0 100644 --- a/ip/link_gre6.c +++ b/ip/link_gre6.c @@ -105,6 +105,7 @@ static int gre_parse_opt(struct link_util *lu, int argc, char **argv, __u16 encapflags = TUNNEL_ENCAP_FLAG_CSUM6; __u16 encapsport = 0; __u16 encapdport = 0; + __u8 metadata = 0; int len; __u32 fwmark = 0; __u32 erspan_idx = 0; @@ -178,6 +179,9 @@ get_failed: if (greinfo[IFLA_GRE_ENCAP_SPORT]) encapsport = rta_getattr_u16(greinfo[IFLA_GRE_ENCAP_SPORT]); + if (greinfo[IFLA_GRE_COLLECT_METADATA]) + metadata = 1; + if (greinfo[IFLA_GRE_ENCAP_DPORT]) encapdport = rta_getattr_u16(greinfo[IFLA_GRE_ENCAP_DPORT]); @@ -355,6 +359,8 @@ get_failed: encapflags |= TUNNEL_ENCAP_FLAG_REMCSUM; } else if (strcmp(*argv, "noencap-remcsum") == 0) { encapflags &= ~TUNNEL_ENCAP_FLAG_REMCSUM; + } else if (strcmp(*argv, "external") == 0) { + metadata = 1; } else if (strcmp(*argv, "fwmark") == 0) { NEXT_ARG(); if (strcmp(*argv, "inherit") == 0) { @@ -388,26 +394,30 @@ get_failed: argc--; argv++; } - addattr32(n, 1024, IFLA_GRE_IKEY, ikey); - addattr32(n, 1024, IFLA_GRE_OKEY, okey); - addattr_l(n, 1024, IFLA_GRE_IFLAGS, &iflags, 2); - addattr_l(n, 1024, IFLA_GRE_OFLAGS, &oflags, 2); - addattr_l(n, 1024, IFLA_GRE_LOCAL, &laddr, sizeof(laddr)); - addattr_l(n, 1024, IFLA_GRE_REMOTE, &raddr, sizeof(raddr)); - if (link) - addattr32(n, 1024, IFLA_GRE_LINK, link); - addattr_l(n, 1024, IFLA_GRE_TTL, &hop_limit, 1); - addattr_l(n, 1024, IFLA_GRE_ENCAP_LIMIT, &encap_limit, 1); - addattr_l(n, 1024, IFLA_GRE_FLOWINFO, &flowinfo, 4); - addattr32(n, 1024, IFLA_GRE_FLAGS, flags); - addattr32(n, 1024, IFLA_GRE_FWMARK, fwmark); - if (erspan_idx != 0) - addattr32(n, 1024, IFLA_GRE_ERSPAN_INDEX, erspan_idx); - - addattr16(n, 1024, IFLA_GRE_ENCAP_TYPE, encaptype); - addattr16(n, 1024, IFLA_GRE_ENCAP_FLAGS, encapflags); - addattr16(n, 1024, IFLA_GRE_ENCAP_SPORT, htons(encapsport)); - addattr16(n, 1024, IFLA_GRE_ENCAP_DPORT, htons(encapdport)); + if (!metadata) { + addattr32(n, 1024, IFLA_GRE_IKEY, ikey); + addattr32(n, 1024, IFLA_GRE_OKEY, okey); + addattr_l(n, 1024, IFLA_GRE_IFLAGS, &iflags, 2); + addattr_l(n, 1024, IFLA_GRE_OFLAGS, &oflags, 2); + addattr_l(n, 1024, IFLA_GRE_LOCAL, &laddr, sizeof(laddr)); + addattr_l(n, 1024, IFLA_GRE_REMOTE, &raddr, sizeof(raddr)); + if (link) + addattr32(n, 1024, IFLA_GRE_LINK, link); + addattr_l(n, 1024, IFLA_GRE_TTL, &hop_limit, 1); + addattr_l(n, 1024, IFLA_GRE_ENCAP_LIMIT, &encap_limit, 1); + addattr_l(n, 1024, IFLA_GRE_FLOWINFO, &flowinfo, 4); + addattr32(n, 1024, IFLA_GRE_FLAGS, flags); + addattr32(n, 1024, IFLA_GRE_FWMARK, fwmark); + if (erspan_idx != 0) + addattr32(n, 1024, IFLA_GRE_ERSPAN_INDEX, erspan_idx); + + addattr16(n, 1024, IFLA_GRE_ENCAP_TYPE, encaptype); + addattr16(n, 1024, IFLA_GRE_ENCAP_FLAGS, encapflags); + addattr16(n, 1024, IFLA_GRE_ENCAP_SPORT, htons(encapsport)); + addattr16(n, 1024, IFLA_GRE_ENCAP_DPORT, htons(encapdport)); + } else { + addattr_l(n, 1024, IFLA_GRE_COLLECT_METADATA, NULL, 0); + } return 0; } @@ -426,6 +436,11 @@ static void gre_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) if (!tb) return; + if (tb[IFLA_GRE_COLLECT_METADATA]) { + print_bool(PRINT_ANY, "collect_metadata", "external", true); + return; + } + if (tb[IFLA_GRE_FLAGS]) flags = rta_getattr_u32(tb[IFLA_GRE_FLAGS]); diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in index 0db2582e19f7..7b14b18a8dbf 100644 --- a/man/man8/ip-link.8.in +++ b/man/man8/ip-link.8.in @@ -768,6 +768,8 @@ the following additional arguments are supported: .BI "dscp inherit" ] [ .BI dev " PHYS_DEV " +] [ +.RB external ] .in +8 @@ -846,6 +848,21 @@ or .IR 00 ".." ff when tunneling non-IP packets. The default value is 00. +.sp +.RB external +- make this tunnel externally controlled (or not, which is the default). +In the kernel, this is referred to as collect metadata mode. This flag is +mutually exclusive with the +.BR remote , +.BR local , +.BR seq , +.BR key, +.BR csum, +.BR hoplimit, +.BR encaplimit, +.BR flowlabel " and " tclass +options. + .in -8 .TP