blob: 2a259b04368d0788361df002775b16353aa3e08a [file] [log] [blame]
Bart De Schuymerff587202005-02-08 20:02:28 +00001/* ebt_mark_m
2 *
3 * Authors:
4 * Bart De Schuymer <bdschuym@pandora.be>
5 *
6 * July, 2002
7 */
8
Bart De Schuymera501b782002-07-20 16:15:39 +00009#include <stdio.h>
10#include <stdlib.h>
Bart De Schuymera501b782002-07-20 16:15:39 +000011#include <string.h>
12#include <getopt.h>
13#include "../include/ebtables_u.h"
14#include <linux/netfilter_bridge/ebt_mark_m.h>
15
16#define MARK '1'
17
18static struct option opts[] =
19{
Bart De Schuymer9895a8e2003-01-11 10:14:24 +000020 { "mark", required_argument, 0, MARK },
Bart De Schuymera501b782002-07-20 16:15:39 +000021 { 0 }
22};
23
24static void print_help()
25{
26 printf(
27"mark option:\n"
Bart De Schuymer22682502002-07-21 15:18:30 +000028"--mark [!] [value][/mask]: Match nfmask value (see man page)\n");
Bart De Schuymera501b782002-07-20 16:15:39 +000029}
30
31static void init(struct ebt_entry_match *match)
32{
33 struct ebt_mark_m_info *markinfo = (struct ebt_mark_m_info *)match->data;
34
Bart De Schuymer9cfd6542002-08-13 16:08:08 +000035 markinfo->mark = 0;
36 markinfo->mask = 0;
37 markinfo->invert = 0;
Bart De Schuymer22682502002-07-21 15:18:30 +000038 markinfo->bitmask = 0;
Bart De Schuymera501b782002-07-20 16:15:39 +000039}
40
41#define OPT_MARK 0x01
42static int parse(int c, char **argv, int argc, const struct ebt_u_entry *entry,
43 unsigned int *flags, struct ebt_entry_match **match)
44{
45 struct ebt_mark_m_info *markinfo = (struct ebt_mark_m_info *)
46 (*match)->data;
47 char *end;
48
49 switch (c) {
50 case MARK:
Bart De Schuymerff587202005-02-08 20:02:28 +000051 ebt_check_option2(flags, MARK);
52 if (ebt_check_inverse2(optarg))
Bart De Schuymera501b782002-07-20 16:15:39 +000053 markinfo->invert = 1;
Bart De Schuymerff587202005-02-08 20:02:28 +000054 markinfo->mark = strtoul(optarg, &end, 0);
Bart De Schuymer22682502002-07-21 15:18:30 +000055 markinfo->bitmask = EBT_MARK_AND;
56 if (*end == '/') {
Bart De Schuymerff587202005-02-08 20:02:28 +000057 if (end == optarg)
Bart De Schuymer22682502002-07-21 15:18:30 +000058 markinfo->bitmask = EBT_MARK_OR;
Bart De Schuymera501b782002-07-20 16:15:39 +000059 markinfo->mask = strtoul(end+1, &end, 0);
Bart De Schuymer22682502002-07-21 15:18:30 +000060 } else
Bart De Schuymera501b782002-07-20 16:15:39 +000061 markinfo->mask = 0xffffffff;
Bart De Schuymerff587202005-02-08 20:02:28 +000062 if ( *end != '\0' || end == optarg)
63 ebt_print_error2("Bad mark value '%s'", optarg);
Bart De Schuymera501b782002-07-20 16:15:39 +000064 break;
65 default:
66 return 0;
67 }
68 return 1;
69}
70
71static void final_check(const struct ebt_u_entry *entry,
72 const struct ebt_entry_match *match, const char *name,
Bart De Schuymerc9b52932002-08-24 13:26:34 +000073 unsigned int hookmask, unsigned int time)
Bart De Schuymera501b782002-07-20 16:15:39 +000074{
75}
76
77static void print(const struct ebt_u_entry *entry,
78 const struct ebt_entry_match *match)
79{
80 struct ebt_mark_m_info *markinfo =
81 (struct ebt_mark_m_info *)match->data;
82
83 printf("--mark ");
84 if (markinfo->invert)
85 printf("! ");
Bart De Schuymer22682502002-07-21 15:18:30 +000086 if (markinfo->bitmask == EBT_MARK_OR)
87 printf("/0x%lx ", markinfo->mask);
88 else if(markinfo->mask != 0xffffffff)
Bart De Schuymera501b782002-07-20 16:15:39 +000089 printf("0x%lx/0x%lx ", markinfo->mark, markinfo->mask);
90 else
91 printf("0x%lx ", markinfo->mark);
92}
93
94static int compare(const struct ebt_entry_match *m1,
95 const struct ebt_entry_match *m2)
96{
97 struct ebt_mark_m_info *markinfo1 = (struct ebt_mark_m_info *)m1->data;
98 struct ebt_mark_m_info *markinfo2 = (struct ebt_mark_m_info *)m2->data;
99
100 if (markinfo1->invert != markinfo2->invert)
101 return 0;
102 if (markinfo1->mark != markinfo2->mark)
103 return 0;
104 if (markinfo1->mask != markinfo2->mask)
105 return 0;
Bart De Schuymer22682502002-07-21 15:18:30 +0000106 if (markinfo1->bitmask != markinfo2->bitmask)
107 return 0;
Bart De Schuymera501b782002-07-20 16:15:39 +0000108 return 1;
109}
110
111static struct ebt_u_match mark_match =
112{
Bart De Schuymerfbdebad2008-02-03 19:58:44 +0000113 .name = "mark_m",
Bart De Schuymer7cf1cca2003-08-30 16:20:19 +0000114 .size = sizeof(struct ebt_mark_m_info),
115 .help = print_help,
116 .init = init,
117 .parse = parse,
118 .final_check = final_check,
119 .print = print,
120 .compare = compare,
121 .extra_ops = opts,
Bart De Schuymera501b782002-07-20 16:15:39 +0000122};
123
Bart De Schuymer64182a32004-01-21 20:39:54 +0000124void _init(void)
Bart De Schuymera501b782002-07-20 16:15:39 +0000125{
Bart De Schuymer8339ff12004-01-14 20:05:27 +0000126 ebt_register_match(&mark_match);
Bart De Schuymera501b782002-07-20 16:15:39 +0000127}