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; }
static int ila_parse_opt(int argc, char **argv, struct nlmsghdr *n, bool adding) { __u64 locator = 0; __u64 locator_match = 0; int ifindex = 0; bool loc_set = false; bool loc_match_set = false; bool ifindex_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, "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); return 0; }