3 macsave match (experimental)
4 Copyright (C) 2006 Jonathan Zarate
6 Licensed under GNU GPL v2 or later.
15 #include <linux/netfilter_ipv4/ipt_macsave.h>
18 static void help(void)
21 "macsave match (experimental) v0.01\n"
22 "Copyright (C) 2006 Jonathan Zarate\n"
24 "[!] --mac <mac address>\n");
27 static void init(struct ipt_entry_match
*m
, unsigned int *nfcache
)
29 *nfcache
|= NFC_UNKNOWN
;
32 static struct option opts
[] = {
33 { .name
= "mac", .has_arg
= 1, .flag
= 0, .val
= '1' },
37 static int parse(int c
, char **argv
, int invert
, unsigned int *flags
,
38 const struct ipt_entry
*entry
, unsigned int *nfcache
,
39 struct ipt_entry_match
**match
)
41 struct ipt_macsave_match_info
*info
;
46 if (c
!= '1') return 0;
48 if (*flags
) exit_error(PARAMETER_PROBLEM
, "Multiple MACs are not supported");
51 info
= (struct ipt_macsave_match_info
*)(*match
)->data
;
53 check_inverse(optarg
, &invert
, &optind
, 0);
54 if (invert
) info
->invert
= 1;
56 mac
= argv
[optind
- 1];
59 n
= strtol(mac
, &mac
, 16);
60 if ((n
< 0) || (n
> 255)) break;
63 if ((*mac
!= ':') && (*mac
!= '-')) exit_error(PARAMETER_PROBLEM
, "Invalid MAC address");
66 if ((i
!= 6) || (*mac
!= 0)) exit_error(PARAMETER_PROBLEM
, "Invalid MAC address");
70 static void final_check(unsigned int flags
)
72 if (flags
!= 1) exit_error(PARAMETER_PROBLEM
, "--mac expected");
75 static void print_match(const struct ipt_macsave_match_info
*info
)
77 printf("--mac %02X:%02X:%02X:%02X:%02X:%02X ",
78 info
->mac
[0], info
->mac
[1], info
->mac
[2],
79 info
->mac
[3], info
->mac
[4], info
->mac
[5]);
82 static void print(const struct ipt_ip
*ip
, const struct ipt_entry_match
*match
, int numeric
)
85 print_match((const struct ipt_macsave_match_info
*)match
->data
);
88 static void save(const struct ipt_ip
*ip
, const struct ipt_entry_match
*match
)
90 print_match((const struct ipt_macsave_match_info
*)match
->data
);
94 static struct iptables_match macsave_match
= {
96 .version
= IPTABLES_VERSION
,
97 .size
= IPT_ALIGN(sizeof(struct ipt_macsave_match_info
)),
98 .userspacesize
= IPT_ALIGN(sizeof(struct ipt_macsave_match_info
)),
102 .final_check
= &final_check
,
110 register_match(&macsave_match
);