123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- #include <stdio.h>
- #include <xtables.h>
- #include <linux/netfilter/xt_physdev.h>
- enum {
- O_PHYSDEV_IN = 0,
- O_PHYSDEV_OUT,
- O_PHYSDEV_IS_IN,
- O_PHYSDEV_IS_OUT,
- O_PHYSDEV_IS_BRIDGED,
- };
- static void physdev_help(void)
- {
- printf(
- "physdev match options:\n"
- " [!] --physdev-in inputname[+] bridge port name ([+] for wildcard)\n"
- " [!] --physdev-out outputname[+] bridge port name ([+] for wildcard)\n"
- " [!] --physdev-is-in arrived on a bridge device\n"
- " [!] --physdev-is-out will leave on a bridge device\n"
- " [!] --physdev-is-bridged it's a bridged packet\n");
- }
- #define s struct xt_physdev_info
- static const struct xt_option_entry physdev_opts[] = {
- {.name = "physdev-in", .id = O_PHYSDEV_IN, .type = XTTYPE_STRING,
- .flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, physindev)},
- {.name = "physdev-out", .id = O_PHYSDEV_OUT, .type = XTTYPE_STRING,
- .flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, physoutdev)},
- {.name = "physdev-is-in", .id = O_PHYSDEV_IS_IN, .type = XTTYPE_NONE,
- .flags = XTOPT_INVERT},
- {.name = "physdev-is-out", .id = O_PHYSDEV_IS_OUT,
- .type = XTTYPE_NONE, .flags = XTOPT_INVERT},
- {.name = "physdev-is-bridged", .id = O_PHYSDEV_IS_BRIDGED,
- .type = XTTYPE_NONE, .flags = XTOPT_INVERT},
- XTOPT_TABLEEND,
- };
- #undef s
- static void physdev_parse(struct xt_option_call *cb)
- {
- struct xt_physdev_info *info = cb->data;
- xtables_option_parse(cb);
- switch (cb->entry->id) {
- case O_PHYSDEV_IN:
- xtables_parse_interface(cb->arg, info->physindev,
- (unsigned char *)info->in_mask);
- if (cb->invert)
- info->invert |= XT_PHYSDEV_OP_IN;
- info->bitmask |= XT_PHYSDEV_OP_IN;
- break;
- case O_PHYSDEV_OUT:
- xtables_parse_interface(cb->arg, info->physoutdev,
- (unsigned char *)info->out_mask);
- if (cb->invert)
- info->invert |= XT_PHYSDEV_OP_OUT;
- info->bitmask |= XT_PHYSDEV_OP_OUT;
- break;
- case O_PHYSDEV_IS_IN:
- info->bitmask |= XT_PHYSDEV_OP_ISIN;
- if (cb->invert)
- info->invert |= XT_PHYSDEV_OP_ISIN;
- break;
- case O_PHYSDEV_IS_OUT:
- info->bitmask |= XT_PHYSDEV_OP_ISOUT;
- if (cb->invert)
- info->invert |= XT_PHYSDEV_OP_ISOUT;
- break;
- case O_PHYSDEV_IS_BRIDGED:
- if (cb->invert)
- info->invert |= XT_PHYSDEV_OP_BRIDGED;
- info->bitmask |= XT_PHYSDEV_OP_BRIDGED;
- break;
- }
- }
- static void physdev_check(struct xt_fcheck_call *cb)
- {
- if (cb->xflags == 0)
- xtables_error(PARAMETER_PROBLEM, "PHYSDEV: no physdev option specified");
- }
- static void
- physdev_print(const void *ip, const struct xt_entry_match *match, int numeric)
- {
- const struct xt_physdev_info *info = (const void *)match->data;
- printf(" PHYSDEV match");
- if (info->bitmask & XT_PHYSDEV_OP_ISIN)
- printf("%s --physdev-is-in",
- info->invert & XT_PHYSDEV_OP_ISIN ? " !":"");
- if (info->bitmask & XT_PHYSDEV_OP_IN)
- printf("%s --physdev-in %s",
- (info->invert & XT_PHYSDEV_OP_IN) ? " !":"", info->physindev);
- if (info->bitmask & XT_PHYSDEV_OP_ISOUT)
- printf("%s --physdev-is-out",
- info->invert & XT_PHYSDEV_OP_ISOUT ? " !":"");
- if (info->bitmask & XT_PHYSDEV_OP_OUT)
- printf("%s --physdev-out %s",
- (info->invert & XT_PHYSDEV_OP_OUT) ? " !":"", info->physoutdev);
- if (info->bitmask & XT_PHYSDEV_OP_BRIDGED)
- printf("%s --physdev-is-bridged",
- info->invert & XT_PHYSDEV_OP_BRIDGED ? " !":"");
- }
- static void physdev_save(const void *ip, const struct xt_entry_match *match)
- {
- const struct xt_physdev_info *info = (const void *)match->data;
- if (info->bitmask & XT_PHYSDEV_OP_ISIN)
- printf("%s --physdev-is-in",
- (info->invert & XT_PHYSDEV_OP_ISIN) ? " !" : "");
- if (info->bitmask & XT_PHYSDEV_OP_IN)
- printf("%s --physdev-in %s",
- (info->invert & XT_PHYSDEV_OP_IN) ? " !" : "",
- info->physindev);
- if (info->bitmask & XT_PHYSDEV_OP_ISOUT)
- printf("%s --physdev-is-out",
- (info->invert & XT_PHYSDEV_OP_ISOUT) ? " !" : "");
- if (info->bitmask & XT_PHYSDEV_OP_OUT)
- printf("%s --physdev-out %s",
- (info->invert & XT_PHYSDEV_OP_OUT) ? " !" : "",
- info->physoutdev);
- if (info->bitmask & XT_PHYSDEV_OP_BRIDGED)
- printf("%s --physdev-is-bridged",
- (info->invert & XT_PHYSDEV_OP_BRIDGED) ? " !" : "");
- }
- static struct xtables_match physdev_match = {
- .family = NFPROTO_UNSPEC,
- .name = "physdev",
- .version = XTABLES_VERSION,
- .size = XT_ALIGN(sizeof(struct xt_physdev_info)),
- .userspacesize = XT_ALIGN(sizeof(struct xt_physdev_info)),
- .help = physdev_help,
- .print = physdev_print,
- .save = physdev_save,
- .x6_parse = physdev_parse,
- .x6_fcheck = physdev_check,
- .x6_options = physdev_opts,
- };
- void _init(void)
- {
- xtables_register_match(&physdev_match);
- }
|