1 /* 2 * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that: (1) source code distributions 7 * retain the above copyright notice and this paragraph in its entirety, (2) 8 * distributions including binary code include the above copyright notice and 9 * this paragraph in its entirety in the documentation or other materials 10 * provided with the distribution, and (3) all advertising materials mentioning 11 * features or use of this software display the following acknowledgement: 12 * ``This product includes software developed by the University of California, 13 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 14 * the University nor the names of its contributors may be used to endorse 15 * or promote products derived from this software without specific prior 16 * written permission. 17 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 18 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 19 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 20 * 21 * $FreeBSD$ 22 * @(#) $Header: /tcpdump/master/libpcap/gencode.h,v 1.47 2000/11/04 10:09:55 guy Exp $ (LBL) 23 */ 24 25 /* Address qualifiers. */ 26 27 #define Q_HOST 1 28 #define Q_NET 2 29 #define Q_PORT 3 30 #define Q_GATEWAY 4 31 #define Q_PROTO 5 32 #define Q_PROTOCHAIN 6 33 34 /* Protocol qualifiers. */ 35 36 #define Q_LINK 1 37 #define Q_IP 2 38 #define Q_ARP 3 39 #define Q_RARP 4 40 #define Q_TCP 5 41 #define Q_UDP 6 42 #define Q_ICMP 7 43 #define Q_IGMP 8 44 #define Q_IGRP 9 45 46 47 #define Q_ATALK 10 48 #define Q_DECNET 11 49 #define Q_LAT 12 50 #define Q_SCA 13 51 #define Q_MOPRC 14 52 #define Q_MOPDL 15 53 54 55 #define Q_IPV6 16 56 #define Q_ICMPV6 17 57 #define Q_AH 18 58 #define Q_ESP 19 59 60 #define Q_PIM 20 61 62 #define Q_AARP 21 63 64 #define Q_ISO 22 65 #define Q_ESIS 23 66 #define Q_ISIS 24 67 #define Q_CLNP 25 68 69 /* Directional qualifiers. */ 70 71 #define Q_SRC 1 72 #define Q_DST 2 73 #define Q_OR 3 74 #define Q_AND 4 75 76 #define Q_DEFAULT 0 77 #define Q_UNDEF 255 78 79 struct slist; 80 81 struct stmt { 82 int code; 83 struct slist *jt; /*only for relative jump in block*/ 84 struct slist *jf; /*only for relative jump in block*/ 85 bpf_int32 k; 86 }; 87 88 struct slist { 89 struct stmt s; 90 struct slist *next; 91 }; 92 93 /* 94 * A bit vector to represent definition sets. We assume TOT_REGISTERS 95 * is smaller than 8*sizeof(atomset). 96 */ 97 typedef bpf_u_int32 atomset; 98 #define ATOMMASK(n) (1 << (n)) 99 #define ATOMELEM(d, n) (d & ATOMMASK(n)) 100 101 /* 102 * An unbounded set. 103 */ 104 typedef bpf_u_int32 *uset; 105 106 /* 107 * Total number of atomic entities, including accumulator (A) and index (X). 108 * We treat all these guys similarly during flow analysis. 109 */ 110 #define N_ATOMS (BPF_MEMWORDS+2) 111 112 struct edge { 113 int id; 114 int code; 115 uset edom; 116 struct block *succ; 117 struct block *pred; 118 struct edge *next; /* link list of incoming edges for a node */ 119 }; 120 121 struct block { 122 int id; 123 struct slist *stmts; /* side effect stmts */ 124 struct stmt s; /* branch stmt */ 125 int mark; 126 int longjt; /* jt branch requires long jump */ 127 int longjf; /* jf branch requires long jump */ 128 int level; 129 int offset; 130 int sense; 131 struct edge et; 132 struct edge ef; 133 struct block *head; 134 struct block *link; /* link field used by optimizer */ 135 uset dom; 136 uset closure; 137 struct edge *in_edges; 138 atomset def, kill; 139 atomset in_use; 140 atomset out_use; 141 int oval; 142 int val[N_ATOMS]; 143 }; 144 145 struct arth { 146 struct block *b; /* protocol checks */ 147 struct slist *s; /* stmt list */ 148 int regno; /* virtual register number of result */ 149 }; 150 151 struct qual { 152 unsigned char addr; 153 unsigned char proto; 154 unsigned char dir; 155 unsigned char pad; 156 }; 157 158 struct arth *gen_loadi(int); 159 struct arth *gen_load(int, struct arth *, int); 160 struct arth *gen_loadlen(void); 161 struct arth *gen_neg(struct arth *); 162 struct arth *gen_arth(int, struct arth *, struct arth *); 163 164 void gen_and(struct block *, struct block *); 165 void gen_or(struct block *, struct block *); 166 void gen_not(struct block *); 167 168 struct block *gen_scode(const char *, struct qual); 169 struct block *gen_ecode(const u_char *, struct qual); 170 struct block *gen_mcode(const char *, const char *, int, struct qual); 171 #ifdef INET6 172 struct block *gen_mcode6(const char *, const char *, int, struct qual); 173 #endif 174 struct block *gen_ncode(const char *, bpf_u_int32, struct qual); 175 struct block *gen_proto_abbrev(int); 176 struct block *gen_relation(int, struct arth *, struct arth *, int); 177 struct block *gen_less(int); 178 struct block *gen_greater(int); 179 struct block *gen_byteop(int, int, int); 180 struct block *gen_broadcast(int); 181 struct block *gen_multicast(int); 182 struct block *gen_inbound(int); 183 184 struct block *gen_vlan(int); 185 186 void bpf_optimize(struct block **); 187 void bpf_error(const char *, ...) 188 #if HAVE___ATTRIBUTE__ 189 __attribute__((noreturn, format (printf, 1, 2))) 190 #endif 191 ; 192 193 void finish_parse(struct block *); 194 char *sdup(const char *); 195 196 struct bpf_insn *icode_to_fcode(struct block *, int *); 197 int pcap_parse(void); 198 void lex_init(char *); 199 void lex_cleanup(void); 200 void sappend(struct slist *, struct slist *); 201 202 /* XXX */ 203 #define JT(b) ((b)->et.succ) 204 #define JF(b) ((b)->ef.succ) 205 206 extern int no_optimize; 207