blob: f171d153448f450b0e8d0291bdd2bf13bf1152bd [file] [log] [blame]
Marc Bouchere6869a82000-03-20 06:03:29 +00001#include <stdio.h>
Marc Bouchere6869a82000-03-20 06:03:29 +00002#if defined(__GLIBC__) && __GLIBC__ == 2
3#include <net/ethernet.h>
4#else
5#include <linux/if_ether.h>
6#endif
Yasuyuki KOZAKAIba2d8912007-07-24 07:09:51 +00007#include <xtables.h>
8#include <linux/netfilter/xt_mac.h>
Marc Bouchere6869a82000-03-20 06:03:29 +00009
Jan Engelhardt7e79d132011-05-07 03:18:11 +020010enum {
11 O_MAC = 0,
12};
13
Jan Engelhardt181dead2007-10-04 16:27:07 +000014static void mac_help(void)
Marc Bouchere6869a82000-03-20 06:03:29 +000015{
16 printf(
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020017"mac match options:\n"
Jan Engelhardt96727922008-08-13 14:42:41 +020018"[!] --mac-source XX:XX:XX:XX:XX:XX\n"
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020019" Match source MAC address\n");
Marc Bouchere6869a82000-03-20 06:03:29 +000020}
21
Jan Engelhardt7e79d132011-05-07 03:18:11 +020022#define s struct xt_mac_info
23static const struct xt_option_entry mac_opts[] = {
24 {.name = "mac-source", .id = O_MAC, .type = XTTYPE_ETHERMAC,
25 .flags = XTOPT_MAND | XTOPT_INVERT | XTOPT_PUT,
26 XTOPT_POINTER(s, srcaddr)},
27 XTOPT_TABLEEND,
Marc Bouchere6869a82000-03-20 06:03:29 +000028};
Jan Engelhardt7e79d132011-05-07 03:18:11 +020029#undef s
Marc Bouchere6869a82000-03-20 06:03:29 +000030
Jan Engelhardt7e79d132011-05-07 03:18:11 +020031static void mac_parse(struct xt_option_call *cb)
Marc Bouchere6869a82000-03-20 06:03:29 +000032{
Jan Engelhardt7e79d132011-05-07 03:18:11 +020033 struct xt_mac_info *macinfo = cb->data;
Marc Bouchere6869a82000-03-20 06:03:29 +000034
Jan Engelhardt7e79d132011-05-07 03:18:11 +020035 xtables_option_parse(cb);
36 if (cb->invert)
37 macinfo->invert = 1;
Marc Bouchere6869a82000-03-20 06:03:29 +000038}
39
Jan Engelhardt7e79d132011-05-07 03:18:11 +020040static void print_mac(const unsigned char *macaddress)
Marc Bouchere6869a82000-03-20 06:03:29 +000041{
42 unsigned int i;
43
Jan Engelhardt73866352010-12-18 02:04:59 +010044 printf(" %02X", macaddress[0]);
Jan Engelhardt7e79d132011-05-07 03:18:11 +020045 for (i = 1; i < ETH_ALEN; ++i)
Marc Bouchere6869a82000-03-20 06:03:29 +000046 printf(":%02X", macaddress[i]);
Marc Bouchere6869a82000-03-20 06:03:29 +000047}
48
Marc Bouchere6869a82000-03-20 06:03:29 +000049static void
Jan Engelhardt181dead2007-10-04 16:27:07 +000050mac_print(const void *ip, const struct xt_entry_match *match, int numeric)
Marc Bouchere6869a82000-03-20 06:03:29 +000051{
Jan Engelhardt161143d2008-09-01 14:18:01 +020052 const struct xt_mac_info *info = (void *)match->data;
Jan Engelhardt73866352010-12-18 02:04:59 +010053 printf(" MAC");
Dave Zambonini78c57fa2003-06-14 14:27:51 +000054
Jan Engelhardt161143d2008-09-01 14:18:01 +020055 if (info->invert)
Jan Engelhardt73866352010-12-18 02:04:59 +010056 printf(" !");
Dave Zambonini78c57fa2003-06-14 14:27:51 +000057
Jan Engelhardt161143d2008-09-01 14:18:01 +020058 print_mac(info->srcaddr);
Marc Bouchere6869a82000-03-20 06:03:29 +000059}
60
Jan Engelhardt181dead2007-10-04 16:27:07 +000061static void mac_save(const void *ip, const struct xt_entry_match *match)
Marc Bouchere6869a82000-03-20 06:03:29 +000062{
Jan Engelhardt161143d2008-09-01 14:18:01 +020063 const struct xt_mac_info *info = (void *)match->data;
64
65 if (info->invert)
Jan Engelhardt73866352010-12-18 02:04:59 +010066 printf(" !");
Dave Zambonini78c57fa2003-06-14 14:27:51 +000067
Jan Engelhardt73866352010-12-18 02:04:59 +010068 printf(" --mac-source");
Jan Engelhardt161143d2008-09-01 14:18:01 +020069 print_mac(info->srcaddr);
Marc Bouchere6869a82000-03-20 06:03:29 +000070}
71
Jan Engelhardt181dead2007-10-04 16:27:07 +000072static struct xtables_match mac_match = {
Jan Engelhardtc5e85732009-06-12 20:55:44 +020073 .family = NFPROTO_UNSPEC,
Yasuyuki KOZAKAIba2d8912007-07-24 07:09:51 +000074 .name = "mac",
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020075 .version = XTABLES_VERSION,
Yasuyuki KOZAKAIba2d8912007-07-24 07:09:51 +000076 .size = XT_ALIGN(sizeof(struct xt_mac_info)),
77 .userspacesize = XT_ALIGN(sizeof(struct xt_mac_info)),
Jan Engelhardt181dead2007-10-04 16:27:07 +000078 .help = mac_help,
Jan Engelhardt7e79d132011-05-07 03:18:11 +020079 .x6_parse = mac_parse,
Jan Engelhardt181dead2007-10-04 16:27:07 +000080 .print = mac_print,
81 .save = mac_save,
Jan Engelhardt7e79d132011-05-07 03:18:11 +020082 .x6_options = mac_opts,
Marc Bouchere6869a82000-03-20 06:03:29 +000083};
84
85void _init(void)
86{
Jan Engelhardt181dead2007-10-04 16:27:07 +000087 xtables_register_match(&mac_match);
Marc Bouchere6869a82000-03-20 06:03:29 +000088}