blob: c7c79aac8c82e3931876432c2131d5dfe54ad9be [file] [log] [blame]
Bart De Schuymerff587202005-02-08 20:02:28 +00001/* ebt_mark
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>
11#include <string.h>
Bart De Schuymera501b782002-07-20 16:15:39 +000012#include <getopt.h>
13#include "../include/ebtables_u.h"
14#include <linux/netfilter_bridge/ebt_mark_t.h>
15
Bart De Schuymer9cfd6542002-08-13 16:08:08 +000016static int mark_supplied;
Bart De Schuymera501b782002-07-20 16:15:39 +000017
Bart De Schuymer9cfd6542002-08-13 16:08:08 +000018#define MARK_TARGET '1'
Bart De Schuymera501b782002-07-20 16:15:39 +000019#define MARK_SETMARK '2'
20static struct option opts[] =
21{
Bart De Schuymer9cfd6542002-08-13 16:08:08 +000022 { "mark-target" , required_argument, 0, MARK_TARGET },
Bart De Schuymerc0a330e2004-12-05 21:21:41 +000023 /* an oldtime messup, we should have always used the scheme
24 * <extension-name>-<option> */
Bart De Schuymera501b782002-07-20 16:15:39 +000025 { "set-mark" , required_argument, 0, MARK_SETMARK },
Bart De Schuymerc0a330e2004-12-05 21:21:41 +000026 { "mark-set" , required_argument, 0, MARK_SETMARK },
Bart De Schuymera501b782002-07-20 16:15:39 +000027 { 0 }
28};
29
30static void print_help()
31{
32 printf(
33 "mark target options:\n"
Bart De Schuymerc0a330e2004-12-05 21:21:41 +000034 " --mark-set value : Set nfmark value\n"
Bart De Schuymer9cfd6542002-08-13 16:08:08 +000035 " --mark-target target : ACCEPT, DROP, RETURN or CONTINUE\n");
Bart De Schuymera501b782002-07-20 16:15:39 +000036}
37
38static void init(struct ebt_entry_target *target)
39{
40 struct ebt_mark_t_info *markinfo =
41 (struct ebt_mark_t_info *)target->data;
42
43 markinfo->target = EBT_ACCEPT;
44 markinfo->mark = 0;
Bart De Schuymerb26649e2002-07-25 14:51:54 +000045 mark_supplied = 0;
Bart De Schuymera501b782002-07-20 16:15:39 +000046}
47
Bart De Schuymer9cfd6542002-08-13 16:08:08 +000048#define OPT_MARK_TARGET 0x01
Bart De Schuymera501b782002-07-20 16:15:39 +000049#define OPT_MARK_SETMARK 0x02
50static int parse(int c, char **argv, int argc,
51 const struct ebt_u_entry *entry, unsigned int *flags,
52 struct ebt_entry_target **target)
53{
Bart De Schuymera501b782002-07-20 16:15:39 +000054 struct ebt_mark_t_info *markinfo =
55 (struct ebt_mark_t_info *)(*target)->data;
56 char *end;
57
58 switch (c) {
59 case MARK_TARGET:
Bart De Schuymerff587202005-02-08 20:02:28 +000060 ebt_check_option2(flags, OPT_MARK_TARGET);
Bart De Schuymer9cfd6542002-08-13 16:08:08 +000061 if (FILL_TARGET(optarg, markinfo->target))
Bart De Schuymerff587202005-02-08 20:02:28 +000062 ebt_print_error2("Illegal --mark-target target");
Bart De Schuymera501b782002-07-20 16:15:39 +000063 break;
64 case MARK_SETMARK:
Bart De Schuymerff587202005-02-08 20:02:28 +000065 ebt_check_option2(flags, OPT_MARK_SETMARK);
Bart De Schuymera501b782002-07-20 16:15:39 +000066 markinfo->mark = strtoul(optarg, &end, 0);
67 if (*end != '\0' || end == optarg)
Bart De Schuymerff587202005-02-08 20:02:28 +000068 ebt_print_error2("Bad MARK value '%s'", optarg);
Bart De Schuymerb26649e2002-07-25 14:51:54 +000069 mark_supplied = 1;
Bart De Schuymera501b782002-07-20 16:15:39 +000070 break;
71 default:
72 return 0;
73 }
74 return 1;
75}
76
77static void final_check(const struct ebt_u_entry *entry,
78 const struct ebt_entry_target *target, const char *name,
Bart De Schuymerc9b52932002-08-24 13:26:34 +000079 unsigned int hookmask, unsigned int time)
Bart De Schuymera501b782002-07-20 16:15:39 +000080{
Bart De Schuymerb26649e2002-07-25 14:51:54 +000081 struct ebt_mark_t_info *markinfo =
82 (struct ebt_mark_t_info *)target->data;
83
Bart De Schuymerff587202005-02-08 20:02:28 +000084 if (time == 0 && mark_supplied == 0) {
Bart De Schuymer64182a32004-01-21 20:39:54 +000085 ebt_print_error("No mark value supplied");
Bart De Schuymerff587202005-02-08 20:02:28 +000086 } else if (BASE_CHAIN && markinfo->target == EBT_RETURN)
87 ebt_print_error("--mark-target RETURN not allowed on base chain");
Bart De Schuymera501b782002-07-20 16:15:39 +000088}
89
90static void print(const struct ebt_u_entry *entry,
91 const struct ebt_entry_target *target)
92{
93 struct ebt_mark_t_info *markinfo =
94 (struct ebt_mark_t_info *)target->data;
95
Bart De Schuymerc0a330e2004-12-05 21:21:41 +000096 printf("--mark-set 0x%lx", markinfo->mark);
Bart De Schuymera501b782002-07-20 16:15:39 +000097 if (markinfo->target == EBT_ACCEPT)
98 return;
Bart De Schuymer9cfd6542002-08-13 16:08:08 +000099 printf(" --mark-target %s", TARGET_NAME(markinfo->target));
Bart De Schuymera501b782002-07-20 16:15:39 +0000100}
101
102static int compare(const struct ebt_entry_target *t1,
103 const struct ebt_entry_target *t2)
104{
105 struct ebt_mark_t_info *markinfo1 =
106 (struct ebt_mark_t_info *)t1->data;
107 struct ebt_mark_t_info *markinfo2 =
108 (struct ebt_mark_t_info *)t2->data;
109
Bart De Schuymerb26649e2002-07-25 14:51:54 +0000110 return markinfo1->target == markinfo2->target &&
111 markinfo1->mark == markinfo2->mark;
Bart De Schuymera501b782002-07-20 16:15:39 +0000112}
113
114static struct ebt_u_target mark_target =
115{
Bart De Schuymer7cf1cca2003-08-30 16:20:19 +0000116 .name = EBT_MARK_TARGET,
117 .size = sizeof(struct ebt_mark_t_info),
118 .help = print_help,
119 .init = init,
120 .parse = parse,
121 .final_check = final_check,
122 .print = print,
123 .compare = compare,
124 .extra_ops = opts,
Bart De Schuymera501b782002-07-20 16:15:39 +0000125};
126
Bart De Schuymer64182a32004-01-21 20:39:54 +0000127void _init(void)
Bart De Schuymera501b782002-07-20 16:15:39 +0000128{
Bart De Schuymer8339ff12004-01-14 20:05:27 +0000129 ebt_register_target(&mark_target);
Bart De Schuymera501b782002-07-20 16:15:39 +0000130}