From patchwork Wed Dec 13 01:07:23 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Tu X-Patchwork-Id: 847711 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="WCK7gP2L"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yxJTV090dz9s72 for ; Wed, 13 Dec 2017 12:07:57 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751665AbdLMBHy (ORCPT ); Tue, 12 Dec 2017 20:07:54 -0500 Received: from mail-pg0-f68.google.com ([74.125.83.68]:43231 "EHLO mail-pg0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751499AbdLMBHw (ORCPT ); Tue, 12 Dec 2017 20:07:52 -0500 Received: by mail-pg0-f68.google.com with SMTP id b18so551337pgv.10 for ; Tue, 12 Dec 2017 17:07:52 -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=DBPxD2HEoE8M4YpgJJHkMkjz4aJCq8THDkDlJCu8qL8=; b=WCK7gP2L6p9buyRdzqXsagM2zPwDKyKt2j/q6XXiyiMDA7J0+M15+AantTtBk3Fl8I j98hjKqsv7HRO8aH2+07CBi20eyEui1EOu9mKn0+tVxS4x+xpGKJLkm9dAKDdIJ0gHhj Uh+4DxgJ8OhfcMygCp1jR3jTEtltzBhQTeyrAfS2Wbd5wDrMZnNjO8vLqaAXPQQsaUJ+ uL5tCSEroZdZyq4Wh6nIoHVkuT0lldlrC7i7jgpzFJibD0URxkzyiN9SyOEben0F4HNn xvyXWs6uFTHAKPP4ZqQiys06+mVTguw/E7sJIUhNHU3FMa6jEoNwIbv3RuJAdGQP+B+U 4LQA== 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=DBPxD2HEoE8M4YpgJJHkMkjz4aJCq8THDkDlJCu8qL8=; b=iJ1fx61fRSulTQwvy6DjERt7igRPNiktk9MxeFLmeDo8wpXCyeOFo9baVm5ICPznXd Vlyoxh6nYuoF5Ig3vodTPuRMe8AN5g76Mj7rfyJyFTB68TSDnA8ddwoOFpec4h9XYzld /3jSBQcvxG17DpYRqvscuuEcEgg+lZbQobXvTRIJzyy3yxOi5lGxBWZBsdFLX42nw9il MXQSE3+7VjqVVpPTPRlOwOKsW8a1MXnAwR6xIOXteXxSWD5QhPStdxsttAy3BFO2onpR mIxliUbksUYZ0Wayj+GdR1eXEQ5VTkihNVCy/cGZlZqhMmm/bf/DboedU//NB3UCarUB lruw== X-Gm-Message-State: AKGB3mKjVZ9tGcqotDEhsWAJRalll54XSEYUl8+/FGnKvXp3ibPrMYl5 K1ZqTsptnlqOsCSo7hwck9DpxEtp X-Google-Smtp-Source: ACJfBotwBqCEiwauDXGv6efXQkpTh4NsskDdjnSKixr5dAnM/U8Gz/imox5REIdZjVmSgWpRoi8fqQ== X-Received: by 10.99.176.3 with SMTP id h3mr3776702pgf.207.1513127271358; Tue, 12 Dec 2017 17:07:51 -0800 (PST) Received: from sc9-mailhost3.vmware.com ([208.91.2.1]) by smtp.gmail.com with ESMTPSA id o184sm382486pga.3.2017.12.12.17.07.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 12 Dec 2017 17:07:50 -0800 (PST) From: William Tu To: netdev@vger.kernel.org Cc: Daniel Borkmann Subject: [PATCH v3 iproute2 net-next] gre6: add collect metadata support Date: Tue, 12 Dec 2017 17:07:23 -0800 Message-Id: <1513127243-82244-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. Examples 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 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 | 7 +++++++ 2 files changed, 42 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..4d954b31d438 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,11 @@ 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). +This is also known as collect_metadata mode for tunnels. + .in -8 .TP