static int brip_parse(int c, char **argv, int invert, unsigned int *flags, const void *entry, struct xt_entry_match **match) { struct ebt_ip_info *info = (struct ebt_ip_info *)(*match)->data; switch (c) { case IP_SOURCE: if (invert) info->invflags |= EBT_IP_SOURCE; ebt_parse_ip_address(optarg, &info->saddr, &info->smsk); info->bitmask |= EBT_IP_SOURCE; break; case IP_DEST: if (invert) info->invflags |= EBT_IP_DEST; ebt_parse_ip_address(optarg, &info->daddr, &info->dmsk); info->bitmask |= EBT_IP_DEST; break; case IP_SPORT: if (invert) info->invflags |= EBT_IP_SPORT; parse_port_range(NULL, optarg, info->sport); info->bitmask |= EBT_IP_SPORT; break; case IP_DPORT: if (invert) info->invflags |= EBT_IP_DPORT; parse_port_range(NULL, optarg, info->dport); info->bitmask |= EBT_IP_DPORT; break; case IP_EBT_TOS: if (invert) info->invflags |= EBT_IP_TOS; if (!xtables_strtoul(optarg, NULL, (uintmax_t *)&info->tos, 0, 255)) xtables_error(PARAMETER_PROBLEM, "Problem with specified IP tos"); info->bitmask |= EBT_IP_TOS; break; case IP_PROTO: if (invert) info->invflags |= EBT_IP_PROTO; info->protocol = xtables_parse_protocol(optarg); if (info->protocol == -1) xtables_error(PARAMETER_PROBLEM, "Unknown specified IP protocol - %s", optarg); info->bitmask |= EBT_IP_PROTO; break; default: return 0; } *flags |= info->bitmask; return 1; }
static int parse(int c, char **argv, int argc, const struct ebt_u_entry *entry, unsigned int *flags, struct ebt_entry_match **match) { struct ebt_arp_info *arpinfo = (struct ebt_arp_info *)(*match)->data; long int i; char *end; uint32_t *addr; uint32_t *mask; unsigned char *maddr; unsigned char *mmask; switch (c) { case ARP_OPCODE: ebt_check_option2(flags, OPT_OPCODE); if (ebt_check_inverse2(optarg)) arpinfo->invflags |= EBT_ARP_OPCODE; i = strtol(optarg, &end, 10); if (i < 0 || i >= (0x1 << 16) || *end !='\0') { for (i = 0; i < NUMOPCODES; i++) if (!strcasecmp(opcodes[i], optarg)) break; if (i == NUMOPCODES) ebt_print_error2("Problem with specified ARP opcode"); i++; } arpinfo->opcode = htons(i); arpinfo->bitmask |= EBT_ARP_OPCODE; break; case ARP_HTYPE: ebt_check_option2(flags, OPT_HTYPE); if (ebt_check_inverse2(optarg)) arpinfo->invflags |= EBT_ARP_HTYPE; i = strtol(optarg, &end, 10); if (i < 0 || i >= (0x1 << 16) || *end !='\0') { if (!strcasecmp("Ethernet", argv[optind - 1])) i = 1; else ebt_print_error2("Problem with specified ARP hardware type"); } arpinfo->htype = htons(i); arpinfo->bitmask |= EBT_ARP_HTYPE; break; case ARP_PTYPE: { uint16_t proto; ebt_check_option2(flags, OPT_PTYPE); if (ebt_check_inverse2(optarg)) arpinfo->invflags |= EBT_ARP_PTYPE; i = strtol(optarg, &end, 16); if (i < 0 || i >= (0x1 << 16) || *end !='\0') { struct ethertypeent *ent; ent = getethertypebyname(argv[optind - 1]); if (!ent) ebt_print_error2("Problem with specified ARP " "protocol type"); proto = ent->e_ethertype; } else proto = i; arpinfo->ptype = htons(proto); arpinfo->bitmask |= EBT_ARP_PTYPE; break; } case ARP_IP_S: case ARP_IP_D: if (c == ARP_IP_S) { ebt_check_option2(flags, OPT_IP_S); addr = &arpinfo->saddr; mask = &arpinfo->smsk; arpinfo->bitmask |= EBT_ARP_SRC_IP; } else { ebt_check_option2(flags, OPT_IP_D); addr = &arpinfo->daddr; mask = &arpinfo->dmsk; arpinfo->bitmask |= EBT_ARP_DST_IP; } if (ebt_check_inverse2(optarg)) { if (c == ARP_IP_S) arpinfo->invflags |= EBT_ARP_SRC_IP; else arpinfo->invflags |= EBT_ARP_DST_IP; } ebt_parse_ip_address(optarg, addr, mask); break; case ARP_MAC_S: case ARP_MAC_D: if (c == ARP_MAC_S) { ebt_check_option2(flags, OPT_MAC_S); maddr = arpinfo->smaddr; mmask = arpinfo->smmsk; arpinfo->bitmask |= EBT_ARP_SRC_MAC; } else { ebt_check_option2(flags, OPT_MAC_D); maddr = arpinfo->dmaddr; mmask = arpinfo->dmmsk; arpinfo->bitmask |= EBT_ARP_DST_MAC; } if (ebt_check_inverse2(optarg)) { if (c == ARP_MAC_S) arpinfo->invflags |= EBT_ARP_SRC_MAC; else arpinfo->invflags |= EBT_ARP_DST_MAC; } if (ebt_get_mac_and_mask(optarg, maddr, mmask)) ebt_print_error2("Problem with ARP MAC address argument"); break; case ARP_GRAT: ebt_check_option2(flags, OPT_GRAT); arpinfo->bitmask |= EBT_ARP_GRAT; if (ebt_invert) arpinfo->invflags |= EBT_ARP_GRAT; break; default: return 0; } return 1; }
static int parse(int c, char **argv, int argc, const struct ebt_u_entry *entry, unsigned int *flags, struct ebt_entry_match **match) { struct ebt_ip_info *ipinfo = (struct ebt_ip_info *)(*match)->data; char *end; long int i; switch (c) { case IP_SOURCE: ebt_check_option2(flags, OPT_SOURCE); ipinfo->bitmask |= EBT_IP_SOURCE; case IP_DEST: if (c == IP_DEST) { ebt_check_option2(flags, OPT_DEST); ipinfo->bitmask |= EBT_IP_DEST; } if (ebt_check_inverse2(optarg)) { if (c == IP_SOURCE) ipinfo->invflags |= EBT_IP_SOURCE; else ipinfo->invflags |= EBT_IP_DEST; } if (c == IP_SOURCE) ebt_parse_ip_address(optarg, &ipinfo->saddr, &ipinfo->smsk); else ebt_parse_ip_address(optarg, &ipinfo->daddr, &ipinfo->dmsk); break; case IP_SPORT: case IP_DPORT: if (c == IP_SPORT) { ebt_check_option2(flags, OPT_SPORT); ipinfo->bitmask |= EBT_IP_SPORT; if (ebt_check_inverse2(optarg)) ipinfo->invflags |= EBT_IP_SPORT; } else { ebt_check_option2(flags, OPT_DPORT); ipinfo->bitmask |= EBT_IP_DPORT; if (ebt_check_inverse2(optarg)) ipinfo->invflags |= EBT_IP_DPORT; } if (c == IP_SPORT) parse_port_range(NULL, optarg, ipinfo->sport); else parse_port_range(NULL, optarg, ipinfo->dport); break; case IP_myTOS: ebt_check_option2(flags, OPT_TOS); if (ebt_check_inverse2(optarg)) ipinfo->invflags |= EBT_IP_TOS; i = strtol(optarg, &end, 16); if (i < 0 || i > 255 || *end != '\0') ebt_print_error2("Problem with specified IP tos"); ipinfo->tos = i; ipinfo->bitmask |= EBT_IP_TOS; break; case IP_PROTO: ebt_check_option2(flags, OPT_PROTO); if (ebt_check_inverse2(optarg)) ipinfo->invflags |= EBT_IP_PROTO; i = strtoul(optarg, &end, 10); if (*end != '\0') { struct protoent *pe; pe = getprotobyname(optarg); if (pe == NULL) ebt_print_error("Unknown specified IP protocol - %s", argv[optind - 1]); ipinfo->protocol = pe->p_proto; } else { ipinfo->protocol = (unsigned char) i; } ipinfo->bitmask |= EBT_IP_PROTO; break; default: return 0; } return 1; }