|
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 |
}
|