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