From patchwork Wed Nov 22 20:05:36 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Herbert X-Patchwork-Id: 840508 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=quantonium-net.20150623.gappssmtp.com header.i=@quantonium-net.20150623.gappssmtp.com header.b="uQVYdEer"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yhtl31pRXz9s71 for ; Thu, 23 Nov 2017 07:06:39 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751658AbdKVUGb (ORCPT ); Wed, 22 Nov 2017 15:06:31 -0500 Received: from mail-pl0-f67.google.com ([209.85.160.67]:45636 "EHLO mail-pl0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751611AbdKVUG1 (ORCPT ); Wed, 22 Nov 2017 15:06:27 -0500 Received: by mail-pl0-f67.google.com with SMTP id f6so1346185pln.12 for ; Wed, 22 Nov 2017 12:06:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quantonium-net.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=E6HtmFLKvWk5NHiud/rP58x4Ubj1TFdviLgfnFlIRDc=; b=uQVYdEerMMSqIv7CoWpipnBLONcFbfYsVaaHb6ttJJ/jgOJJ78cf0OiaWn/o7pg9Cm H+YnHpLsyytLn3kcVzQN6M6/xvxlUs8Ajwcn9TJGSFMk9UH0Ir3VYLlk1CdRAxMYiGn1 2vOWUZGRJBWZTGT692fdettMixuHSA2D8LElvbGZ7bKEDwdWSrGS0MMCden5LRArxAeo f+8AeHTOTexvrz5r9Ca+fIUJrVbi0VfCHLf7Zqi43QXtM4hNwPO7AFZtHnbYDlU6z/Sl KpLsX1LoChpJOy+joysG5wXEZwC4UfpvnYwAiFAv0GwoVPSlIyx2f4GzwfvX8UT7OtHO K/dA== 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=E6HtmFLKvWk5NHiud/rP58x4Ubj1TFdviLgfnFlIRDc=; b=HPUPqFNfqj03q1ZmIp6zgxVhzlJSGBuoe/j+S9a/sLsWHCFlGR17nVk9DrUChEux8J GAqnINpF/ZjlgFOKgxeQEDFygejuLy/vUqtpPuYnXBL+x6Rid8FULID2k2O0TfdS0Ela rP7NVyhLHptclta6UOsfYQJB6shC5PUQ08cBlGjtkvXxVPKuzA9IgJowfAd6ddmsa0x7 lHDf5dYt0gkhhONww6ooZJUr1lX69jT791+rtY4C8ODBUqPqMrd8a5Dp8c0GS9cc77fq ElFKFXXPhh+yEQQB9dDFCLQv70imRXLHsZGBQZui1XH7QIeXFUxu4gOjcyK39MPVNRd/ QUAQ== X-Gm-Message-State: AJaThX62g/7yggtXefnCLrStecYeb269fVhgcL3ep63iQ/hEskY8Q7lM miMSdXScy97lQhh9A9T/gXkhbg== X-Google-Smtp-Source: AGs4zMZxfSuezskjYwZMFCavjWeO5NF6TjPungXtRHnNhJ+HYdLev6FnG/3+q8wnhjwqJcFPICjG6g== X-Received: by 10.159.229.136 with SMTP id az8mr22620913plb.59.1511381186552; Wed, 22 Nov 2017 12:06:26 -0800 (PST) Received: from localhost.localdomain (c-73-162-13-107.hsd1.ca.comcast.net. [73.162.13.107]) by smtp.gmail.com with ESMTPSA id e8sm30511348pfk.6.2017.11.22.12.06.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 22 Nov 2017 12:06:25 -0800 (PST) From: Tom Herbert To: stephen@networkplumber.org Cc: netdev@vger.kernel.org, rohit@quantonium.net, Tom Herbert Subject: [PATCH iproute 4/5] ila: support for configuring identifier and hook types Date: Wed, 22 Nov 2017 12:05:36 -0800 Message-Id: <20171122200537.26703-5-tom@quantonium.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171122200537.26703-1-tom@quantonium.net> References: <20171122200537.26703-1-tom@quantonium.net> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Expose identifier type and hook types in ILA configuraiton and reporting. This adds support in both ip ila ILA LWT. Signed-off-by: Tom Herbert --- ip/ipila.c | 75 ++++++++++++++++++++++++++++++++++- ip/iproute_lwtunnel.c | 107 +++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 179 insertions(+), 3 deletions(-) diff --git a/ip/ipila.c b/ip/ipila.c index 0b706f0b..c7a8ede8 100644 --- a/ip/ipila.c +++ b/ip/ipila.c @@ -28,7 +28,8 @@ static void usage(void) fprintf(stderr, "Usage: ip ila add loc_match LOCATOR_MATCH " "loc LOCATOR [ dev DEV ] " "[ csum-mode { adj-transport | neutral-map | " - "neutral-map-auto | no-action } ]\n"); + "neutral-map-auto | no-action } ] " + "[ ident-type { luid | use-format } ]\n"); fprintf(stderr, " ip ila del loc_match LOCATOR_MATCH " "[ loc LOCATOR ] [ dev DEV ]\n"); fprintf(stderr, " ip ila list\n"); @@ -74,6 +75,54 @@ static int ila_csum_name2mode(char *name) return ILA_CSUM_NEUTRAL_MAP; else if (strcmp(name, "neutral-map-auto") == 0) return ILA_CSUM_NEUTRAL_MAP_AUTO; + else if (strcmp(name, "no-action") == 0) + return ILA_CSUM_NO_ACTION; + else if (strcmp(name, "neutral-map-auto") == 0) + return ILA_CSUM_NEUTRAL_MAP_AUTO; + else + return -1; +} + +static char *ila_ident_type2name(__u8 ident_type) +{ + switch (ident_type) { + case ILA_ATYPE_IID: + return "iid"; + case ILA_ATYPE_LUID: + return "luid"; + case ILA_ATYPE_VIRT_V4: + return "virt-v4"; + case ILA_ATYPE_VIRT_UNI_V6: + return "virt-uni-v6"; + case ILA_ATYPE_VIRT_MULTI_V6: + return "virt-multi-v6"; + case ILA_ATYPE_NONLOCAL_ADDR: + return "nonlocal-addr"; + case ILA_ATYPE_USE_FORMAT: + return "use-format"; + default: + return "unknown"; + } +} + +static int ila_ident_name2type(char *name) +{ + if (!strcmp(name, "luid")) + return ILA_ATYPE_LUID; + else if (!strcmp(name, "use-format")) + return ILA_ATYPE_USE_FORMAT; +#if 0 /* No kernel support for configuring these yet */ + else if (!strcmp(name, "iid")) + return ILA_ATYPE_IID; + else if (!strcmp(name, "virt-v4")) + return ILA_ATYPE_VIRT_V4; + else if (!strcmp(name, "virt-uni-v6")) + return ILA_ATYPE_VIRT_UNI_V6; + else if (!strcmp(name, "virt-multi-v6")) + return ILA_ATYPE_VIRT_MULTI_V6; + else if (!strcmp(name, "nonlocal-addr")) + return ILA_ATYPE_NONLOCAL_ADDR; +#endif else return -1; } @@ -147,13 +196,20 @@ static int print_ila_mapping(const struct sockaddr_nl *who, ll_index_to_name(rta_getattr_u32( tb[ILA_ATTR_IFINDEX]))); else - fprintf(fp, "%-16s", "-"); + fprintf(fp, "%-10s ", "-"); if (tb[ILA_ATTR_CSUM_MODE]) fprintf(fp, "%s", ila_csum_mode2name(rta_getattr_u8( tb[ILA_ATTR_CSUM_MODE]))); else + fprintf(fp, "%-10s ", "-"); + + if (tb[ILA_ATTR_IDENT_TYPE]) + fprintf(fp, "%s", + ila_ident_type2name(rta_getattr_u8( + tb[ILA_ATTR_IDENT_TYPE]))); + else fprintf(fp, "-"); fprintf(fp, "\n"); @@ -193,10 +249,12 @@ static int ila_parse_opt(int argc, char **argv, struct nlmsghdr *n, __u64 locator_match = 0; int ifindex = 0; int csum_mode = 0; + int ident_type = 0; bool loc_set = false; bool loc_match_set = false; bool ifindex_set = false; bool csum_mode_set = false; + bool ident_type_set = false; while (argc > 0) { if (!matches(*argv, "loc")) { @@ -226,6 +284,16 @@ static int ila_parse_opt(int argc, char **argv, struct nlmsghdr *n, return -1; } csum_mode_set = true; + } else if (!matches(*argv, "ident-type")) { + NEXT_ARG(); + + ident_type = ila_ident_name2type(*argv); + if (ident_type < 0) { + fprintf(stderr, "Bad ident-type: %s\n", + *argv); + return -1; + } + ident_type_set = true; } else if (!matches(*argv, "dev")) { NEXT_ARG(); @@ -266,6 +334,9 @@ static int ila_parse_opt(int argc, char **argv, struct nlmsghdr *n, if (csum_mode_set) addattr8(n, 1024, ILA_ATTR_CSUM_MODE, csum_mode); + if (ident_type_set) + addattr8(n, 1024, ILA_ATTR_IDENT_TYPE, ident_type); + return 0; } diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c index ebedd94a..e57cc9f3 100644 --- a/ip/iproute_lwtunnel.c +++ b/ip/iproute_lwtunnel.c @@ -309,6 +309,72 @@ static int ila_csum_name2mode(char *name) return -1; } +static char *ila_ident_type2name(__u8 ident_type) +{ + switch (ident_type) { + case ILA_ATYPE_IID: + return "iid"; + case ILA_ATYPE_LUID: + return "luid"; + case ILA_ATYPE_VIRT_V4: + return "virt-v4"; + case ILA_ATYPE_VIRT_UNI_V6: + return "virt-uni-v6"; + case ILA_ATYPE_VIRT_MULTI_V6: + return "virt-multi-v6"; + case ILA_ATYPE_NONLOCAL_ADDR: + return "nonlocal-addr"; + case ILA_ATYPE_USE_FORMAT: + return "use-format"; + default: + return "unknown"; + } +} + +static int ila_ident_name2type(char *name) +{ + if (!strcmp(name, "luid")) + return ILA_ATYPE_LUID; + else if (!strcmp(name, "use-format")) + return ILA_ATYPE_USE_FORMAT; +#if 0 /* No kernel support for configuring these yet */ + else if (!strcmp(name, "iid")) + return ILA_ATYPE_IID; + else if (!strcmp(name, "virt-v4")) + return ILA_ATYPE_VIRT_V4; + else if (!strcmp(name, "virt-uni-v6")) + return ILA_ATYPE_VIRT_UNI_V6; + else if (!strcmp(name, "virt-multi-v6")) + return ILA_ATYPE_VIRT_MULTI_V6; + else if (!strcmp(name, "nonlocal-addr")) + return ILA_ATYPE_NONLOCAL_ADDR; +#endif + else + return -1; +} + +static char *ila_hook_type2name(__u8 hook_type) +{ + switch (hook_type) { + case ILA_HOOK_ROUTE_OUTPUT: + return "output"; + case ILA_HOOK_ROUTE_INPUT: + return "input"; + default: + return "unknown"; + } +} + +static int ila_hook_name2type(char *name) +{ + if (!strcmp(name, "output")) + return ILA_HOOK_ROUTE_OUTPUT; + else if (!strcmp(name, "input")) + return ILA_HOOK_ROUTE_INPUT; + else + return -1; +} + static void print_encap_ila(FILE *fp, struct rtattr *encap) { struct rtattr *tb[ILA_ATTR_MAX+1]; @@ -325,7 +391,18 @@ static void print_encap_ila(FILE *fp, struct rtattr *encap) if (tb[ILA_ATTR_CSUM_MODE]) fprintf(fp, " csum-mode %s ", - ila_csum_mode2name(rta_getattr_u8(tb[ILA_ATTR_CSUM_MODE]))); + ila_csum_mode2name(rta_getattr_u8( + tb[ILA_ATTR_CSUM_MODE]))); + + if (tb[ILA_ATTR_IDENT_TYPE]) + fprintf(fp, " ident-type %s ", + ila_ident_type2name(rta_getattr_u8( + tb[ILA_ATTR_IDENT_TYPE]))); + + if (tb[ILA_ATTR_HOOK_TYPE]) + fprintf(fp, " hook-type %s ", + ila_hook_type2name(rta_getattr_u8( + tb[ILA_ATTR_HOOK_TYPE]))); } static void print_encap_ip6(FILE *fp, struct rtattr *encap) @@ -777,6 +854,34 @@ static int parse_encap_ila(struct rtattr *rta, size_t len, (__u8)csum_mode); argc--; argv++; + } else if (strcmp(*argv, "ident-type") == 0) { + int ident_type; + + NEXT_ARG(); + + ident_type = ila_ident_name2type(*argv); + if (ident_type < 0) + invarg("\"ident-type\" value is invalid\n", + *argv); + + rta_addattr8(rta, 1024, ILA_ATTR_IDENT_TYPE, + (__u8)ident_type); + + argc--; argv++; + } else if (strcmp(*argv, "hook-type") == 0) { + int hook_type; + + NEXT_ARG(); + + hook_type = ila_hook_name2type(*argv); + if (hook_type < 0) + invarg("\"hook-type\" value is invalid\n", + *argv); + + rta_addattr8(rta, 1024, ILA_ATTR_HOOK_TYPE, + (__u8)hook_type); + + argc--; argv++; } else { break; }