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 * @(#) $Header: gencode.h,v 1.36 96/07/17 00:11:34 leres Exp $ (LBL) 22 */ 23 24 /*XXX*/ 25 #include "gnuc.h" 26 27 /* Address qualifiers. */ 28 29 #define Q_HOST 1 30 #define Q_NET 2 31 #define Q_PORT 3 32 #define Q_GATEWAY 4 33 #define Q_PROTO 5 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 #define Q_ISO 16 55 #define Q_ESIS 17 56 #define Q_ISIS 18 57 58 /* Directional qualifiers. */ 59 60 #define Q_SRC 1 61 #define Q_DST 2 62 #define Q_OR 3 63 #define Q_AND 4 64 65 #define Q_DEFAULT 0 66 #define Q_UNDEF 255 67 68 struct stmt { 69 int code; 70 bpf_int32 k; 71 }; 72 73 struct slist { 74 struct stmt s; 75 struct slist *next; 76 }; 77 78 /* 79 * A bit vector to represent definition sets. We assume TOT_REGISTERS 80 * is smaller than 8*sizeof(atomset). 81 */ 82 typedef bpf_u_int32 atomset; 83 #define ATOMMASK(n) (1 << (n)) 84 #define ATOMELEM(d, n) (d & ATOMMASK(n)) 85 86 /* 87 * An unbounded set. 88 */ 89 typedef bpf_u_int32 *uset; 90 91 /* 92 * Total number of atomic entities, including accumulator (A) and index (X). 93 * We treat all these guys similarly during flow analysis. 94 */ 95 #define N_ATOMS (BPF_MEMWORDS+2) 96 97 struct edge { 98 int id; 99 int code; 100 uset edom; 101 struct block *succ; 102 struct block *pred; 103 struct edge *next; /* link list of incoming edges for a node */ 104 }; 105 106 struct block { 107 int id; 108 struct slist *stmts; /* side effect stmts */ 109 struct stmt s; /* branch stmt */ 110 int mark; 111 int longjt; /* jt branch requires long jump */ 112 int longjf; /* jf branch requires long jump */ 113 int level; 114 int offset; 115 int sense; 116 struct edge et; 117 struct edge ef; 118 struct block *head; 119 struct block *link; /* link field used by optimizer */ 120 uset dom; 121 uset closure; 122 struct edge *in_edges; 123 atomset def, kill; 124 atomset in_use; 125 atomset out_use; 126 int oval; 127 int val[N_ATOMS]; 128 }; 129 130 struct arth { 131 struct block *b; /* protocol checks */ 132 struct slist *s; /* stmt list */ 133 int regno; /* virtual register number of result */ 134 }; 135 136 struct qual { 137 unsigned char addr; 138 unsigned char proto; 139 unsigned char dir; 140 unsigned char pad; 141 }; 142 143 struct arth *gen_loadi(int); 144 struct arth *gen_load(int, struct arth *, int); 145 struct arth *gen_loadlen(void); 146 struct arth *gen_neg(struct arth *); 147 struct arth *gen_arth(int, struct arth *, struct arth *); 148 149 void gen_and(struct block *, struct block *); 150 void gen_or(struct block *, struct block *); 151 void gen_not(struct block *); 152 153 struct block *gen_scode(const char *, struct qual); 154 struct block *gen_ecode(const u_char *, struct qual); 155 struct block *gen_mcode(const char *, const char *, int, struct qual); 156 struct block *gen_ncode(const char *, bpf_u_int32, struct qual); 157 struct block *gen_proto_abbrev(int); 158 struct block *gen_relation(int, struct arth *, struct arth *, int); 159 struct block *gen_less(int); 160 struct block *gen_greater(int); 161 struct block *gen_byteop(int, int, int); 162 struct block *gen_broadcast(int); 163 struct block *gen_multicast(int); 164 struct block *gen_inbound(int); 165 166 void bpf_optimize(struct block **); 167 #if __STDC__ 168 __dead void bpf_error(const char *, ...) 169 __attribute__((volatile, format (printf, 1, 2))); 170 #endif 171 172 void finish_parse(struct block *); 173 char *sdup(const char *); 174 175 struct bpf_insn *icode_to_fcode(struct block *, int *); 176 int pcap_parse(void); 177 void lex_init(char *); 178 void sappend(struct slist *, struct slist *); 179 180 /* XXX */ 181 #define JT(b) ((b)->et.succ) 182 #define JF(b) ((b)->ef.succ) 183