I want add keyword to PF's rule. I started with pfctl. Suppose I want
to add keyword "spraychld".
So, I add field to struct pf_rule (as showed in diff below) and tried
to add keyword to pfctl's parse.y processor.
But it won't to compile.
Where I was wrong?
# cd/usr/src/sbin/pfctl
# make clean && make depend && make
rm -f a.out [Ee]rrs mklog core *.core y.tab.h pfctl pfctl.o parse.o
pfctl_parser.o pf_print_state.o pfctl_altq.o pfctl_osfp.o
pfctl_radix.o pfctl_table.o pfctl_qstats.o pfctl_optimize.o
pf_ruleset.o pfctl.ln pfctl_parser.ln pf_print_state.ln pfctl_altq.ln
pfctl_osfp.ln pfctl_radix.ln pfctl_table.ln pfctl_qstats.ln
pfctl_optimize.ln pf_ruleset.ln parse.ln parse.c
yacc parse.y
mv y.tab.c parse.c
mkdep -a -I/usr/src/sbin/pfctl pfctl.c pfctl_parser.c pf_print_state.c
pfctl_altq.c pfctl_osfp.c pfctl_radix.c pfctl_table.c pfctl_qstats.c
pfctl_optimize.c /usr/src/sbin/pfctl/../../sys/net/pf_ruleset.c
parse.c
cc -O2 -pipe -Wall -Wmissing-prototypes -Wno-uninitialized
-Wstrict-prototypes -I/usr/src/sbin/pfctl -c pfctl.c
cc -O2 -pipe -Wall -Wmissing-prototypes -Wno-uninitialized
-Wstrict-prototypes -I/usr/src/sbin/pfctl -c parse.c
parse.y: In function `yyparse':
parse.y:1876: error: structure has no member named `spraychld'
*** Error code 1
Stop in /usr/src/sbin/pfctl (line 92 of /usr/share/mk/sys.mk).
Here is the diff:
Index: sys/net/pfvar.h
===================================================================
RCS file: /cvs/src/sys/net/pfvar.h,v
retrieving revision 1.283
diff -N -u sys/net/pfvar.h
--- sys/net/pfvar.h 16 Feb 2009 00:31:25 -0000 1.283
+++ sys/net/pfvar.h 1 Jun 2009 15:41:13 -0000
@@ -581,6 +581,7 @@
#define PF_STATE_MODULATE 0x2
#define PF_STATE_SYNPROXY 0x3
u_int8_t keep_state;
+ u_int8_t spraychld;
sa_family_t af;
u_int8_t proto;
u_int8_t type;
Index: sbin/pfctl/parse.y
===================================================================
RCS file: /cvs/src/sbin/pfctl/parse.y,v
retrieving revision 1.555
diff -N -u sbin/pfctl/parse.y
--- sbin/pfctl/parse.y 19 Feb 2009 17:08:42 -0000 1.555
+++ sbin/pfctl/parse.y 1 Jun 2009 15:42:25 -0000
@@ -210,6 +210,7 @@
#define FOM_TOS 0x04
#define FOM_KEEP 0x08
#define FOM_SRCTRACK 0x10
+#define FOM_SPRAYCHLD 0x12
struct node_uid *uid;
struct node_gid *gid;
struct {
@@ -225,6 +226,7 @@
int action;
struct node_state_opt *options;
} keep;
+ u_int8_t spraychld;
int fragment;
int allowopts;
char *label;
@@ -432,7 +434,7 @@
%token PASS BLOCK SCRUB RETURN IN OS OUT LOG QUICK ON FROM TO FLAGS
%token RETURNRST RETURNICMP RETURNICMP6 PROTO INET INET6 ALL ANY ICMPTYPE
-%token ICMP6TYPE CODE KEEP MODULATE STATE PORT RDR NAT BINAT ARROW NODF
+%token ICMP6TYPE CODE KEEP MODULATE STATE SPRAYCHLD PORT RDR NAT
BINAT ARROW NODF
%token MINTTL ERROR ALLOWOPTS FASTROUTE FILENAME ROUTETO DUPTO REPLYTO NO LABEL
%token NOROUTE URPFFAILED FRAGMENT USER GROUP MAXMSS MAXIMUM TTL TOS DROP TABLE
%token REASSEMBLE FRAGDROP FRAGCROP ANCHOR NATANCHOR RDRANCHOR BINATANCHOR
@@ -1871,6 +1873,7 @@
r.quick = $3.quick;
r.prob = $9.prob;
r.rtableid = $9.rtableid;
+ r.spraychld = $9.spraychld; /* 1876 line HERE */
r.af = $6;
if ($9.tag)
@@ -2305,6 +2308,14 @@
filter_opts.marker |= FOM_TOS;
filter_opts.tos = $2;
}
+ | SPRAYCHLD {
+ if (filter_opts.marker & FOM_SPRAYCHLD) {
+ yyerror("spraychld cannot be redefined");
+ YYERROR;
+ }
+ filter_opts.marker |= FOM_SPRAYCHLD;
+ filter_opts.spraychld = 1;
+ }
| keep {
if (filter_opts.marker & FOM_KEEP) {
yyerror("modulate or keep cannot be redefined");
@@ -5321,6 +5332,7 @@
{ "sloppy", SLOPPY},
{ "source-hash", SOURCEHASH},
{ "source-track", SOURCETRACK},
+ { "spraychld", SPRAYCHLD},
{ "state", STATE},
{ "state-defaults", STATEDEFAULTS},
{ "state-policy", STATEPOLICY},
--
antonvm