Blame bootstrap_ver/extensions/libebt_pkttype.c

Packit Service dd8e2b
/* ebt_pkttype
Packit Service dd8e2b
 *
Packit Service dd8e2b
 * Authors:
Packit Service dd8e2b
 * Bart De Schuymer <bdschuym@pandora.be>
Packit Service dd8e2b
 *
Packit Service dd8e2b
 * April, 2003
Packit Service dd8e2b
 */
Packit Service dd8e2b
Packit Service dd8e2b
#include <stdio.h>
Packit Service dd8e2b
#include <stdlib.h>
Packit Service dd8e2b
#include <string.h>
Packit Service dd8e2b
#include <getopt.h>
Packit Service dd8e2b
#include <netdb.h>
Packit Service dd8e2b
#include <xtables.h>
Packit Service dd8e2b
#include <linux/if_packet.h>
Packit Service dd8e2b
#include <linux/netfilter_bridge/ebt_pkttype.h>
Packit Service dd8e2b
Packit Service dd8e2b
static const char *classes[] = {
Packit Service dd8e2b
	"host",
Packit Service dd8e2b
	"broadcast",
Packit Service dd8e2b
	"multicast",
Packit Service dd8e2b
	"otherhost",
Packit Service dd8e2b
	"outgoing",
Packit Service dd8e2b
	"loopback",
Packit Service dd8e2b
	"fastroute",
Packit Service dd8e2b
};
Packit Service dd8e2b
Packit Service dd8e2b
static const struct option brpkttype_opts[] =
Packit Service dd8e2b
{
Packit Service dd8e2b
	{ "pkttype-type"        , required_argument, 0, '1' },
Packit Service dd8e2b
	{ 0 }
Packit Service dd8e2b
};
Packit Service dd8e2b
Packit Service dd8e2b
static void brpkttype_print_help(void)
Packit Service dd8e2b
{
Packit Service dd8e2b
	printf(
Packit Service dd8e2b
"pkttype options:\n"
Packit Service dd8e2b
"--pkttype-type    [!] type: class the packet belongs to\n"
Packit Service dd8e2b
"Possible values: broadcast, multicast, host, otherhost, or any other byte value (which would be pretty useless).\n");
Packit Service dd8e2b
}
Packit Service dd8e2b
Packit Service dd8e2b
Packit Service dd8e2b
static int brpkttype_parse(int c, char **argv, int invert, unsigned int *flags,
Packit Service dd8e2b
			   const void *entry, struct xt_entry_match **match)
Packit Service dd8e2b
{
Packit Service dd8e2b
	struct ebt_pkttype_info *ptinfo = (struct ebt_pkttype_info *)(*match)->data;
Packit Service dd8e2b
	char *end;
Packit Service dd8e2b
	long int i;
Packit Service dd8e2b
Packit Service dd8e2b
	switch (c) {
Packit Service dd8e2b
	case '1':
Packit Service dd8e2b
		if (invert)
Packit Service dd8e2b
			ptinfo->invert = 1;
Packit Service dd8e2b
		i = strtol(optarg, &end, 16);
Packit Service dd8e2b
		if (*end != '\0') {
Packit Service dd8e2b
			for (i = 0; i < ARRAY_SIZE(classes); i++) {
Packit Service dd8e2b
				if (!strcasecmp(optarg, classes[i]))
Packit Service dd8e2b
					break;
Packit Service dd8e2b
			}
Packit Service dd8e2b
			if (i >= ARRAY_SIZE(classes))
Packit Service dd8e2b
				xtables_error(PARAMETER_PROBLEM, "Could not parse class '%s'", optarg);
Packit Service dd8e2b
		}
Packit Service dd8e2b
		if (i < 0 || i > 255)
Packit Service dd8e2b
			xtables_error(PARAMETER_PROBLEM, "Problem with specified pkttype class");
Packit Service dd8e2b
		ptinfo->pkt_type = (uint8_t)i;
Packit Service dd8e2b
		break;
Packit Service dd8e2b
	default:
Packit Service dd8e2b
		return 0;
Packit Service dd8e2b
	}
Packit Service dd8e2b
	return 1;
Packit Service dd8e2b
}
Packit Service dd8e2b
Packit Service dd8e2b
Packit Service dd8e2b
static void brpkttype_print(const void *ip, const struct xt_entry_match *match, int numeric)
Packit Service dd8e2b
{
Packit Service dd8e2b
	struct ebt_pkttype_info *pt = (struct ebt_pkttype_info *)match->data;
Packit Service dd8e2b
Packit Service dd8e2b
	if (pt->invert)
Packit Service dd8e2b
		printf("! ");
Packit Service dd8e2b
Packit Service dd8e2b
	printf("--pkttype-type ");
Packit Service dd8e2b
Packit Service dd8e2b
	if (pt->pkt_type < ARRAY_SIZE(classes))
Packit Service dd8e2b
		printf("%s ", classes[pt->pkt_type]);
Packit Service dd8e2b
	else
Packit Service dd8e2b
		printf("%d ", pt->pkt_type);
Packit Service dd8e2b
}
Packit Service dd8e2b
Packit Service dd8e2b
static int brpkttype_xlate(struct xt_xlate *xl,
Packit Service dd8e2b
			  const struct xt_xlate_mt_params *params)
Packit Service dd8e2b
{
Packit Service dd8e2b
	const struct ebt_pkttype_info *info = (const void*)params->match->data;
Packit Service dd8e2b
Packit Service dd8e2b
	xt_xlate_add(xl, "meta pkttype %s", info->invert ? "!= " : "");
Packit Service dd8e2b
Packit Service dd8e2b
	if (info->pkt_type < 3)
Packit Service dd8e2b
		xt_xlate_add(xl, "%s ", classes[info->pkt_type]);
Packit Service dd8e2b
	else if (info->pkt_type == 3)
Packit Service dd8e2b
		xt_xlate_add(xl, "other ");
Packit Service dd8e2b
	else
Packit Service dd8e2b
		xt_xlate_add(xl, "%d ", info->pkt_type);
Packit Service dd8e2b
Packit Service dd8e2b
	return 1;
Packit Service dd8e2b
}
Packit Service dd8e2b
Packit Service dd8e2b
static struct xtables_match brpkttype_match = {
Packit Service dd8e2b
	.name		= "pkttype",
Packit Service dd8e2b
	.version	= XTABLES_VERSION,
Packit Service dd8e2b
	.family		= NFPROTO_BRIDGE,
Packit Service dd8e2b
	.size		= XT_ALIGN(sizeof(struct ebt_pkttype_info)),
Packit Service dd8e2b
	.userspacesize	= XT_ALIGN(sizeof(struct ebt_pkttype_info)),
Packit Service dd8e2b
	.help		= brpkttype_print_help,
Packit Service dd8e2b
	.parse		= brpkttype_parse,
Packit Service dd8e2b
	.print		= brpkttype_print,
Packit Service dd8e2b
	.xlate		= brpkttype_xlate,
Packit Service dd8e2b
	.extra_opts	= brpkttype_opts,
Packit Service dd8e2b
};
Packit Service dd8e2b
Packit Service dd8e2b
void _init(void)
Packit Service dd8e2b
{
Packit Service dd8e2b
	xtables_register_match(&brpkttype_match);
Packit Service dd8e2b
}