static int parse_encap_ila(struct rtattr *rta, size_t len, int *argcp, char ***argvp) { __u64 locator; int argc = *argcp; char **argv = *argvp; if (get_addr64(&locator, *argv) < 0) { fprintf(stderr, "Bad locator: %s\n", *argv); exit(1); } argc--; argv++; rta_addattr64(rta, 1024, ILA_ATTR_LOCATOR, locator); while (argc > 0) { if (strcmp(*argv, "csum-mode") == 0) { __u8 csum_mode; NEXT_ARG(); csum_mode = ila_csum_name2mode(*argv); if (csum_mode < 0) invarg("\"csum-mode\" value is invalid\n", *argv); rta_addattr8(rta, 1024, ILA_ATTR_CSUM_MODE, csum_mode); argc--; argv++; } else { break; } } /* argv is currently the first unparsed argument, * but the lwt_parse_encap() caller will move to the next, * so step back */ *argcp = argc + 1; *argvp = argv - 1; return 0; }
static int ila_parse_opt(int argc, char **argv, struct nlmsghdr *n, bool adding) { __u64 locator = 0; __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")) { NEXT_ARG(); if (get_addr64(&locator, *argv) < 0) { fprintf(stderr, "Bad locator: %s\n", *argv); return -1; } loc_set = true; } else if (!matches(*argv, "loc_match")) { NEXT_ARG(); if (get_addr64(&locator_match, *argv) < 0) { fprintf(stderr, "Bad locator to match: %s\n", *argv); return -1; } loc_match_set = true; } else if (!matches(*argv, "csum-mode")) { NEXT_ARG(); csum_mode = ila_csum_name2mode(*argv); if (csum_mode < 0) { fprintf(stderr, "Bad csum-mode: %s\n", *argv); 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(); ifindex = ll_name_to_index(*argv); if (ifindex == 0) { fprintf(stderr, "No such interface: %s\n", *argv); return -1; } ifindex_set = true; } else { usage(); return -1; } argc--, argv++; } if (adding) { if (!loc_set) { fprintf(stderr, "ila: missing locator\n"); return -1; } if (!loc_match_set) { fprintf(stderr, "ila: missing locator0match\n"); return -1; } } if (loc_match_set) addattr64(n, 1024, ILA_ATTR_LOCATOR_MATCH, locator_match); if (loc_set) addattr64(n, 1024, ILA_ATTR_LOCATOR, locator); if (ifindex_set) addattr32(n, 1024, ILA_ATTR_IFINDEX, ifindex); 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; }