K2.6 patches and update.
[tomato.git] / release / src / router / iptables / extensions / libipt_macsave.c
blobe10a245f3c646adea0e4d58b845dead80cf9edbf
1 /*
3 macsave match (experimental)
4 Copyright (C) 2006 Jonathan Zarate
6 Licensed under GNU GPL v2 or later.
8 */
9 #include <stdio.h>
10 #include <string.h>
11 #include <stdlib.h>
12 #include <getopt.h>
14 #include <iptables.h>
15 #include <linux/netfilter_ipv4/ipt_macsave.h>
18 static void help(void)
20 printf(
21 "macsave match (experimental) v0.01\n"
22 "Copyright (C) 2006 Jonathan Zarate\n"
23 "Options:\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' },
34 { .name = 0 }
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;
42 char *mac;
43 long n;
44 int i;
46 if (c != '1') return 0;
48 if (*flags) exit_error(PARAMETER_PROBLEM, "Multiple MACs are not supported");
49 *flags = 1;
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];
57 i = 0;
58 while (*mac) {
59 n = strtol(mac, &mac, 16);
60 if ((n < 0) || (n > 255)) break;
61 info->mac[i++] = n;
62 if (i == 6) break;
63 if ((*mac != ':') && (*mac != '-')) exit_error(PARAMETER_PROBLEM, "Invalid MAC address");
64 ++mac;
66 if ((i != 6) || (*mac != 0)) exit_error(PARAMETER_PROBLEM, "Invalid MAC address");
67 return 1;
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)
84 printf("macsave ");
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 = {
95 .name = "macsave",
96 .version = IPTABLES_VERSION,
97 .size = IPT_ALIGN(sizeof(struct ipt_macsave_match_info)),
98 .userspacesize = IPT_ALIGN(sizeof(struct ipt_macsave_match_info)),
99 .help = &help,
100 .init = &init,
101 .parse = &parse,
102 .final_check = &final_check,
103 .print = &print,
104 .save = &save,
105 .extra_opts = opts
108 void _init(void)
110 register_match(&macsave_match);