Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}
Пример #5
0
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;
}
Пример #6
0
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;
}
Пример #7
0
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;
}