static int parse_d(int c, char **argv, int argc, const struct ebt_u_entry *entry, unsigned int *flags, struct ebt_entry_target **target) { struct ebt_nat_info *natinfo = (struct ebt_nat_info *)(*target)->data; struct ether_addr *addr; switch (c) { case NAT_D: check_option(flags, OPT_DNAT); to_dest_supplied = 1; if (!(addr = ether_aton(optarg))) print_error("Problem with specified " "--to-destination mac"); memcpy(natinfo->mac, addr, ETH_ALEN); break; case NAT_D_TARGET: check_option(flags, OPT_DNAT_TARGET); if (FILL_TARGET(optarg, natinfo->target)) print_error("Illegal --dnat-target target"); 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_target **target) { struct ebt_arpreply_info *replyinfo = (struct ebt_arpreply_info *)(*target)->data; struct ether_addr *addr; switch (c) { case REPLY_MAC: ebt_check_option2(flags, OPT_REPLY_MAC); if (!(addr = ether_aton(optarg))) ebt_print_error2("Problem with specified --arpreply-mac mac"); memcpy(replyinfo->mac, addr, ETH_ALEN); mac_supplied = 1; break; case REPLY_TARGET: ebt_check_option2(flags, OPT_REPLY_TARGET); if (FILL_TARGET(optarg, replyinfo->target)) ebt_print_error2("Illegal --arpreply-target target"); break; default: return 0; } return 1; }
static int parse_s(int c, char **argv, int argc, const struct ebt_u_entry *entry, unsigned int *flags, struct ebt_entry_target **target) { struct ebt_nat_info *natinfo = (struct ebt_nat_info *)(*target)->data; struct ether_addr *addr; switch (c) { case NAT_S: ebt_check_option2(flags, OPT_SNAT); to_source_supplied = 1; if (!(addr = ether_aton(optarg))) ebt_print_error2("Problem with specified --to-source mac"); memcpy(natinfo->mac, addr, ETH_ALEN); break; case NAT_S_TARGET: { int tmp; ebt_check_option2(flags, OPT_SNAT_TARGET); if (FILL_TARGET(optarg, tmp)) ebt_print_error2("Illegal --snat-target target"); natinfo->target = (natinfo->target & ~EBT_VERDICT_BITS) | (tmp & EBT_VERDICT_BITS); } break; case NAT_S_ARP: ebt_check_option2(flags, OPT_SNAT_ARP); natinfo->target ^= NAT_ARP_BIT; 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_target **target) { struct ebt_mark_t_info *markinfo = (struct ebt_mark_t_info *)(*target)->data; char *end; switch (c) { case MARK_TARGET: { int tmp; ebt_check_option2(flags, OPT_MARK_TARGET); if (FILL_TARGET(optarg, tmp)) ebt_print_error2("Illegal --mark-target target"); /* the 4 lsb are left to designate the target */ markinfo->target = (markinfo->target & ~EBT_VERDICT_BITS) | (tmp & EBT_VERDICT_BITS); } return 1; case MARK_SETMARK: ebt_check_option2(flags, OPT_MARK_SETMARK); if (*flags & (OPT_MARK_ORMARK|OPT_MARK_ANDMARK|OPT_MARK_XORMARK)) ebt_print_error2("--mark-set cannot be used together with specific --mark option"); break; case MARK_ORMARK: ebt_check_option2(flags, OPT_MARK_ORMARK); if (*flags & (OPT_MARK_SETMARK|OPT_MARK_ANDMARK|OPT_MARK_XORMARK)) ebt_print_error2("--mark-or cannot be used together with specific --mark option"); markinfo->target = (markinfo->target & EBT_VERDICT_BITS) | MARK_OR_VALUE; break; case MARK_ANDMARK: ebt_check_option2(flags, OPT_MARK_ANDMARK); if (*flags & (OPT_MARK_SETMARK|OPT_MARK_ORMARK|OPT_MARK_XORMARK)) ebt_print_error2("--mark-and cannot be used together with specific --mark option"); markinfo->target = (markinfo->target & EBT_VERDICT_BITS) | MARK_AND_VALUE; break; case MARK_XORMARK: ebt_check_option2(flags, OPT_MARK_XORMARK); if (*flags & (OPT_MARK_SETMARK|OPT_MARK_ANDMARK|OPT_MARK_ORMARK)) ebt_print_error2("--mark-xor cannot be used together with specific --mark option"); markinfo->target = (markinfo->target & EBT_VERDICT_BITS) | MARK_XOR_VALUE; break; default: return 0; } /* mutual code */ markinfo->mark = strtoul(optarg, &end, 0); if (*end != '\0' || end == optarg) ebt_print_error2("Bad MARK value '%s'", optarg); mark_supplied = 1; return 1; }
static int parse_v(int c, char **argv, int argc, const struct ebt_u_entry *entry, unsigned int *flags, struct ebt_entry_target **target) { struct ebt_nat_info *natinfo = (struct ebt_nat_info *)(*target)->data; uint16_t vid, qos; switch (c) { case NAT_V: check_option(flags, OPT_VNAT); check_option(flags, OPT_VNAT_STRIP); to_vlan_supplied = 1; if (sscanf(optarg, "%hu", &vid) != 1 || vid > 4094) print_error("Problem with specified " "vlan id, must be between 0 and 4094"); natinfo->vid = vid; break; case NAT_V_TARGET: check_option(flags, OPT_VNAT_TARGET); if (FILL_TARGET(optarg, natinfo->target)) print_error("Illegal --vnat-target target"); break; case NAT_V_STRIP: check_option(flags, OPT_VNAT); check_option(flags, OPT_VNAT_STRIP); strip_tag_supplied = 1; natinfo->vid = -1; case NAT_V_QOS: check_option(flags, OPT_VNAT_QOS); vlan_qos_supplied = 1; if (sscanf(optarg, "%hu", &qos) != 1 || vid > 7) print_error("Problem with specified " "vlan qos, must be between 0 and 7"); natinfo->qos = qos; break; default: return 0; } return 1; }
static int parse_arpnat(int c, char **argv, int argc, const struct ebt_u_entry *entry, unsigned int *flags, struct ebt_entry_target **target) { struct ebt_nat_info *natinfo = (struct ebt_nat_info *)(*target)->data; switch (c) { case NAT_ARP_TARGET: ebt_check_option2(flags, OPT_ARPNAT_TARGET); if (FILL_TARGET(optarg, natinfo->target)) ebt_print_error2("Illegal --arpnat-target target"); 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_target **target) { struct ebt_ftos_t_info *ftosinfo = (struct ebt_ftos_t_info *)(*target)->data; char *end; switch (c) { case FTOS_TRGT: check_option(flags, FTOS_TRGT); if (FILL_TARGET(optarg, ftosinfo->target)) print_error("Illegal --ftos-target target"); break; case FTOS_SET: check_option(flags, FTOS_SET); ftosinfo->ftos = (u_int8_t)strtoul(optarg, &end, 0); ftosinfo->ftos_set = OPT_FTOS_SETFTOS; if (*end != '\0' || end == optarg) print_error("Bad FTOS value '%s'", optarg); ftos_supplied = 1; break; case FTOS_WMM: check_option(flags, OPT_FTOS_SETFTOS); ftosinfo->ftos_set = FTOS_WMM; //printf("LEON DEBUG: wmm-ftos..........\n"); ftos_supplied = 1; break; case FTOS_8021Q: check_option(flags, OPT_FTOS_8021QFTOS); ftosinfo->ftos_set = FTOS_8021Q; //printf("LEON DEBUG: 8021q-ftos..........\n"); ftos_supplied = 1; break; default: return 0; } return 1; }