diff options
Diffstat (limited to 'contrib/libpcap/gencode.h')
-rw-r--r-- | contrib/libpcap/gencode.h | 158 |
1 files changed, 95 insertions, 63 deletions
diff --git a/contrib/libpcap/gencode.h b/contrib/libpcap/gencode.h index e6b3a71ea0db..2b089d21d561 100644 --- a/contrib/libpcap/gencode.h +++ b/contrib/libpcap/gencode.h @@ -161,7 +161,7 @@ #define A_CONNECTACK 44 /* Connect Ack message */ #define A_RELEASE 45 /* Release message */ #define A_RELEASE_DONE 46 /* Release message */ - + /* ATM field types */ #define A_VPI 51 #define A_VCI 52 @@ -281,83 +281,115 @@ struct qual { unsigned char pad; }; -struct arth *gen_loadi(int); -struct arth *gen_load(int, struct arth *, int); -struct arth *gen_loadlen(void); -struct arth *gen_neg(struct arth *); -struct arth *gen_arth(int, struct arth *, struct arth *); +struct _compiler_state; + +typedef struct _compiler_state compiler_state_t; + +struct arth *gen_loadi(compiler_state_t *, int); +struct arth *gen_load(compiler_state_t *, int, struct arth *, int); +struct arth *gen_loadlen(compiler_state_t *); +struct arth *gen_neg(compiler_state_t *, struct arth *); +struct arth *gen_arth(compiler_state_t *, int, struct arth *, struct arth *); void gen_and(struct block *, struct block *); void gen_or(struct block *, struct block *); void gen_not(struct block *); -struct block *gen_scode(const char *, struct qual); -struct block *gen_ecode(const u_char *, struct qual); -struct block *gen_acode(const u_char *, struct qual); -struct block *gen_mcode(const char *, const char *, int, struct qual); +struct block *gen_scode(compiler_state_t *, const char *, struct qual); +struct block *gen_ecode(compiler_state_t *, const u_char *, struct qual); +struct block *gen_acode(compiler_state_t *, const u_char *, struct qual); +struct block *gen_mcode(compiler_state_t *, const char *, const char *, + unsigned int, struct qual); #ifdef INET6 -struct block *gen_mcode6(const char *, const char *, int, struct qual); +struct block *gen_mcode6(compiler_state_t *, const char *, const char *, + unsigned int, struct qual); #endif -struct block *gen_ncode(const char *, bpf_u_int32, struct qual); -struct block *gen_proto_abbrev(int); -struct block *gen_relation(int, struct arth *, struct arth *, int); -struct block *gen_less(int); -struct block *gen_greater(int); -struct block *gen_byteop(int, int, int); -struct block *gen_broadcast(int); -struct block *gen_multicast(int); -struct block *gen_inbound(int); - -struct block *gen_llc(void); -struct block *gen_llc_i(void); -struct block *gen_llc_s(void); -struct block *gen_llc_u(void); -struct block *gen_llc_s_subtype(bpf_u_int32); -struct block *gen_llc_u_subtype(bpf_u_int32); - -struct block *gen_vlan(int); -struct block *gen_mpls(int); - -struct block *gen_pppoed(void); -struct block *gen_pppoes(int); - -struct block *gen_atmfield_code(int atmfield, bpf_int32 jvalue, bpf_u_int32 jtype, int reverse); -struct block *gen_atmtype_abbrev(int type); -struct block *gen_atmmulti_abbrev(int type); - -struct block *gen_mtp2type_abbrev(int type); -struct block *gen_mtp3field_code(int mtp3field, bpf_u_int32 jvalue, bpf_u_int32 jtype, int reverse); - -struct block *gen_pf_ifname(const char *); -struct block *gen_pf_rnr(int); -struct block *gen_pf_srnr(int); -struct block *gen_pf_ruleset(char *); -struct block *gen_pf_reason(int); -struct block *gen_pf_action(int); -struct block *gen_pf_dir(int); - -struct block *gen_p80211_type(int, int); -struct block *gen_p80211_fcdir(int); - -void bpf_optimize(struct block **); -void bpf_error(const char *, ...) +struct block *gen_ncode(compiler_state_t *, const char *, bpf_u_int32, + struct qual); +struct block *gen_proto_abbrev(compiler_state_t *, int); +struct block *gen_relation(compiler_state_t *, int, struct arth *, + struct arth *, int); +struct block *gen_less(compiler_state_t *, int); +struct block *gen_greater(compiler_state_t *, int); +struct block *gen_byteop(compiler_state_t *, int, int, int); +struct block *gen_broadcast(compiler_state_t *, int); +struct block *gen_multicast(compiler_state_t *, int); +struct block *gen_inbound(compiler_state_t *, int); + +struct block *gen_llc(compiler_state_t *); +struct block *gen_llc_i(compiler_state_t *); +struct block *gen_llc_s(compiler_state_t *); +struct block *gen_llc_u(compiler_state_t *); +struct block *gen_llc_s_subtype(compiler_state_t *, bpf_u_int32); +struct block *gen_llc_u_subtype(compiler_state_t *, bpf_u_int32); + +struct block *gen_vlan(compiler_state_t *, int); +struct block *gen_mpls(compiler_state_t *, int); + +struct block *gen_pppoed(compiler_state_t *); +struct block *gen_pppoes(compiler_state_t *, int); + +struct block *gen_geneve(compiler_state_t *, int); + +struct block *gen_atmfield_code(compiler_state_t *, int, bpf_int32, + bpf_u_int32, int); +struct block *gen_atmtype_abbrev(compiler_state_t *, int type); +struct block *gen_atmmulti_abbrev(compiler_state_t *, int type); + +struct block *gen_mtp2type_abbrev(compiler_state_t *, int type); +struct block *gen_mtp3field_code(compiler_state_t *, int, bpf_u_int32, + bpf_u_int32, int); + +struct block *gen_pf_ifname(compiler_state_t *, const char *); +struct block *gen_pf_rnr(compiler_state_t *, int); +struct block *gen_pf_srnr(compiler_state_t *, int); +struct block *gen_pf_ruleset(compiler_state_t *, char *); +struct block *gen_pf_reason(compiler_state_t *, int); +struct block *gen_pf_action(compiler_state_t *, int); + +struct block *gen_p80211_type(compiler_state_t *, int, int); +struct block *gen_p80211_fcdir(compiler_state_t *, int); + +/* + * Representation of a program as a tree of blocks, plus current mark. + * A block is marked if only if its mark equals the current mark. + * Rather than traverse the code array, marking each item, 'cur_mark' + * is incremented. This automatically makes each element unmarked. + */ +#define isMarked(icp, p) ((p)->mark == (icp)->cur_mark) +#define unMarkAll(icp) (icp)->cur_mark += 1 +#define Mark(icp, p) ((p)->mark = (icp)->cur_mark) + +struct icode { + struct block *root; + int cur_mark; +}; + +void bpf_optimize(compiler_state_t *, struct icode *ic); +void bpf_syntax_error(compiler_state_t *, const char *); +void bpf_error(compiler_state_t *, const char *, ...) __attribute__((noreturn)) #ifdef __ATTRIBUTE___FORMAT_OK - __attribute__((format (printf, 1, 2))) + __attribute__((format (printf, 2, 3))) #endif /* __ATTRIBUTE___FORMAT_OK */ ; -void finish_parse(struct block *); -char *sdup(const char *); +void finish_parse(compiler_state_t *, struct block *); +char *sdup(compiler_state_t *, const char *); -struct bpf_insn *icode_to_fcode(struct block *, u_int *); -int pcap_parse(void); -void lex_init(const char *); -void lex_cleanup(void); +struct _opt_state; +typedef struct _opt_state opt_state_t; + +struct bpf_insn *icode_to_fcode(compiler_state_t *, struct icode *, + struct block *, u_int *); void sappend(struct slist *, struct slist *); +/* + * Older versions of Bison don't put this declaration in + * grammar.h. + */ +int pcap_parse(void *, compiler_state_t *); + /* XXX */ #define JT(b) ((b)->et.succ) #define JF(b) ((b)->ef.succ) - -extern int no_optimize; |