X-Git-Url: https://git.tcpdump.org/libpcap/blobdiff_plain/24dcde9062f83c82a24de833e673206319384f4b..refs/heads/master:/gencode.h diff --git a/gencode.h b/gencode.h index 2b089d21..3d17147b 100644 --- a/gencode.h +++ b/gencode.h @@ -19,6 +19,20 @@ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ +#ifndef gencode_h +#define gencode_h + +#include "pcap/funcattrs.h" +/* + * pcap/bpf.h (a public header) needs u_char, u_short and u_int, which can be + * made available via either pcap-types.h (a private header) or pcap/pcap.h + * (a public header), none of which pcap/bpf.h includes. Include the private + * header to keep things simple, this way this private header should compile + * even if included early from another file. + */ +#include "pcap-types.h" +#include "pcap/bpf.h" /* bpf_u_int32 and BPF_MEMWORDS */ + /* * ATM support: * @@ -53,10 +67,6 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#ifndef HAVE___ATTRIBUTE__ -#define __attribute__(x) -#endif /* HAVE___ATTRIBUTE__ */ - /* Address qualifiers. */ #define Q_HOST 1 @@ -115,16 +125,14 @@ #define Q_ISIS_L2 32 /* PDU types */ #define Q_ISIS_IIH 33 -#define Q_ISIS_LAN_IIH 34 -#define Q_ISIS_PTP_IIH 35 -#define Q_ISIS_SNP 36 -#define Q_ISIS_CSNP 37 -#define Q_ISIS_PSNP 38 -#define Q_ISIS_LSP 39 +#define Q_ISIS_SNP 34 +#define Q_ISIS_CSNP 35 +#define Q_ISIS_PSNP 36 +#define Q_ISIS_LSP 37 -#define Q_RADIO 40 +#define Q_RADIO 38 -#define Q_CARP 41 +#define Q_CARP 39 /* Directional qualifiers. */ @@ -152,22 +160,10 @@ #define A_OAM 28 /* OAM cells : F4 only */ #define A_OAMF4 29 /* OAM F4 cells: Segment + End-to-end */ #define A_LANE 30 /* LANE traffic */ -#define A_LLC 31 /* LLC-encapsulated traffic */ - -/* Based on Q.2931 signalling protocol */ -#define A_SETUP 41 /* Setup message */ -#define A_CALLPROCEED 42 /* Call proceeding message */ -#define A_CONNECT 43 /* Connect message */ -#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 -#define A_PROTOTYPE 53 -#define A_MSGTYPE 54 -#define A_CALLREFTYPE 55 #define A_CONNECTMSG 70 /* returns Q.2931 signalling messages for establishing and destroying switched @@ -204,11 +200,14 @@ struct slist; +/* + * A single statement, corresponding to an instruction in a block. + */ struct stmt { - int code; - struct slist *jt; /*only for relative jump in block*/ - struct slist *jf; /*only for relative jump in block*/ - bpf_int32 k; + int code; /* opcode */ + struct slist *jt; /* only for relative jump in block */ + struct slist *jf; /* only for relative jump in block */ + bpf_u_int32 k; /* k field */ }; struct slist { @@ -235,17 +234,27 @@ typedef bpf_u_int32 *uset; */ #define N_ATOMS (BPF_MEMWORDS+2) +/* + * Control flow graph of a program. + * This corresponds to an edge in the CFG. + * It's a directed graph, so an edge has a predecessor and a successor. + */ struct edge { - int id; - int code; + u_int id; + int code; /* opcode for branch corresponding to this edge */ uset edom; - struct block *succ; - struct block *pred; + struct block *succ; /* successor vertex */ + struct block *pred; /* predecessor vertex */ struct edge *next; /* link list of incoming edges for a node */ }; +/* + * A block is a vertex in the CFG. + * It has a list of statements, with the final statement being a + * branch to successor blocks. + */ struct block { - int id; + u_int id; struct slist *stmts; /* side effect stmts */ struct stmt s; /* branch stmt */ int mark; @@ -254,20 +263,25 @@ struct block { int level; int offset; int sense; - struct edge et; - struct edge ef; + struct edge et; /* edge corresponding to the jt branch */ + struct edge ef; /* edge corresponding to the jf branch */ struct block *head; struct block *link; /* link field used by optimizer */ uset dom; uset closure; - struct edge *in_edges; + struct edge *in_edges; /* first edge in the set (linked list) of edges with this as a successor */ atomset def, kill; atomset in_use; atomset out_use; - int oval; - int val[N_ATOMS]; + int oval; /* value ID for value tested in branch stmt */ + bpf_u_int32 val[N_ATOMS]; }; +/* + * A value of 0 for val[i] means the value is unknown. + */ +#define VAL_UNKNOWN 0 + struct arth { struct block *b; /* protocol checks */ struct slist *s; /* stmt list */ @@ -285,8 +299,8 @@ 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_loadi(compiler_state_t *, bpf_u_int32); +struct arth *gen_load(compiler_state_t *, int, struct arth *, bpf_u_int32); 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 *); @@ -296,14 +310,12 @@ void gen_or(struct block *, struct block *); void gen_not(struct block *); 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_ecode(compiler_state_t *, const char *, struct qual); +struct block *gen_acode(compiler_state_t *, const char *, struct qual); struct block *gen_mcode(compiler_state_t *, const char *, const char *, - unsigned int, struct qual); -#ifdef INET6 -struct block *gen_mcode6(compiler_state_t *, const char *, const char *, - unsigned int, struct qual); -#endif + bpf_u_int32, struct qual); +struct block *gen_mcode6(compiler_state_t *, const char *, bpf_u_int32, + struct qual); struct block *gen_ncode(compiler_state_t *, const char *, bpf_u_int32, struct qual); struct block *gen_proto_abbrev(compiler_state_t *, int); @@ -311,10 +323,11 @@ 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_byteop(compiler_state_t *, int, int, bpf_u_int32); 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_ifindex(compiler_state_t *, int); +struct block *gen_inbound_outbound(compiler_state_t *, const int); struct block *gen_llc(compiler_state_t *); struct block *gen_llc_i(compiler_state_t *); @@ -323,22 +336,23 @@ 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_vlan(compiler_state_t *, bpf_u_int32, int); +struct block *gen_mpls(compiler_state_t *, bpf_u_int32, int); struct block *gen_pppoed(compiler_state_t *); -struct block *gen_pppoes(compiler_state_t *, int); +struct block *gen_pppoes(compiler_state_t *, bpf_u_int32, int); -struct block *gen_geneve(compiler_state_t *, int); +struct block *gen_geneve(compiler_state_t *, bpf_u_int32, int); +struct block *gen_vxlan(compiler_state_t *, bpf_u_int32, 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_atmfield_code(compiler_state_t *, int, bpf_u_int32, + int, int); +struct block *gen_atmtype_abbrev(compiler_state_t *, int); +struct block *gen_atmmulti_abbrev(compiler_state_t *, int); -struct block *gen_mtp2type_abbrev(compiler_state_t *, int type); +struct block *gen_mtp2type_abbrev(compiler_state_t *, int); struct block *gen_mtp3field_code(compiler_state_t *, int, bpf_u_int32, - bpf_u_int32, int); + int, int); struct block *gen_pf_ifname(compiler_state_t *, const char *); struct block *gen_pf_rnr(compiler_state_t *, int); @@ -347,8 +361,8 @@ 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); +struct block *gen_p80211_type(compiler_state_t *, bpf_u_int32, bpf_u_int32); +struct block *gen_p80211_fcdir(compiler_state_t *, bpf_u_int32); /* * Representation of a program as a tree of blocks, plus current mark. @@ -365,23 +379,15 @@ struct icode { 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, 2, 3))) -#endif /* __ATTRIBUTE___FORMAT_OK */ - ; +int bpf_optimize(struct icode *, char *); +void bpf_set_error(compiler_state_t *, const char *, ...) + PCAP_PRINTFLIKE(2, 3); -void finish_parse(compiler_state_t *, struct block *); +int finish_parse(compiler_state_t *, struct block *); char *sdup(compiler_state_t *, const char *); -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 *); +struct bpf_insn *icode_to_fcode(struct icode *, struct block *, u_int *, + char *); void sappend(struct slist *, struct slist *); /* @@ -393,3 +399,5 @@ int pcap_parse(void *, compiler_state_t *); /* XXX */ #define JT(b) ((b)->et.succ) #define JF(b) ((b)->ef.succ) + +#endif /* gencode_h */