ila: support for configuring identifier and hook types

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 <tom@quantonium.net>
This commit is contained in:
Tom Herbert 2017-11-22 12:05:36 -08:00 committed by Stephen Hemminger
parent 1177552398
commit 86905c8f05
2 changed files with 179 additions and 3 deletions

View File

@ -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,12 +196,19 @@ 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, "-");
@ -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;
}

View File

@ -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)
@ -776,6 +853,34 @@ static int parse_encap_ila(struct rtattr *rta, size_t len,
rta_addattr8(rta, 1024, ILA_ATTR_CSUM_MODE,
(__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;