Blame extensions/libebt_pkttype.c

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