1*8b26181fSAndroid Build Coastguard Worker/* 2*8b26181fSAndroid Build Coastguard Worker * We want a reentrant parser. 3*8b26181fSAndroid Build Coastguard Worker */ 4*8b26181fSAndroid Build Coastguard Worker@REENTRANT_PARSER@ 5*8b26181fSAndroid Build Coastguard Worker 6*8b26181fSAndroid Build Coastguard Worker/* 7*8b26181fSAndroid Build Coastguard Worker * We also want a reentrant scanner, so we have to pass the 8*8b26181fSAndroid Build Coastguard Worker * handle for the reentrant scanner to the parser, and the 9*8b26181fSAndroid Build Coastguard Worker * parser has to pass it to the lexical analyzer. 10*8b26181fSAndroid Build Coastguard Worker * 11*8b26181fSAndroid Build Coastguard Worker * We use void * rather than yyscan_t because, at least with some 12*8b26181fSAndroid Build Coastguard Worker * versions of Flex and Bison, if you use yyscan_t in %parse-param and 13*8b26181fSAndroid Build Coastguard Worker * %lex-param, you have to include scanner.h before grammar.h to get 14*8b26181fSAndroid Build Coastguard Worker * yyscan_t declared, and you have to include grammar.h before scanner.h 15*8b26181fSAndroid Build Coastguard Worker * to get YYSTYPE declared. Using void * breaks the cycle; the Flex 16*8b26181fSAndroid Build Coastguard Worker * documentation says yyscan_t is just a void *. 17*8b26181fSAndroid Build Coastguard Worker */ 18*8b26181fSAndroid Build Coastguard Worker%parse-param {void *yyscanner} 19*8b26181fSAndroid Build Coastguard Worker%lex-param {void *yyscanner} 20*8b26181fSAndroid Build Coastguard Worker 21*8b26181fSAndroid Build Coastguard Worker/* 22*8b26181fSAndroid Build Coastguard Worker * According to bison documentation, shift/reduce conflicts are not an issue 23*8b26181fSAndroid Build Coastguard Worker * in most parsers as long as the number does not evolve over time: 24*8b26181fSAndroid Build Coastguard Worker * https://www.gnu.org/software/bison/manual/html_node/Expect-Decl.html 25*8b26181fSAndroid Build Coastguard Worker * So, following the advice use %expect to check the amount of shift/reduce 26*8b26181fSAndroid Build Coastguard Worker * warnings. 27*8b26181fSAndroid Build Coastguard Worker * 28*8b26181fSAndroid Build Coastguard Worker * This doesn't appear to work in Berkeley YACC - 1.9 20170709; it still 29*8b26181fSAndroid Build Coastguard Worker * warns of 38 shift/reduce conflicts. 30*8b26181fSAndroid Build Coastguard Worker * 31*8b26181fSAndroid Build Coastguard Worker * The Berkeley YACC documentation: 32*8b26181fSAndroid Build Coastguard Worker * 33*8b26181fSAndroid Build Coastguard Worker * https://invisible-island.net/byacc/manpage/yacc.html 34*8b26181fSAndroid Build Coastguard Worker * 35*8b26181fSAndroid Build Coastguard Worker * claims that "Bison's support for "%expect" is broken in more than one 36*8b26181fSAndroid Build Coastguard Worker * release.", but doesn't give details. Hopefully, that only means that 37*8b26181fSAndroid Build Coastguard Worker * you get warnings even if you have the expected number of shift/reduce 38*8b26181fSAndroid Build Coastguard Worker * conflicts, not that anything else fails. 39*8b26181fSAndroid Build Coastguard Worker */ 40*8b26181fSAndroid Build Coastguard Worker%expect 38 41*8b26181fSAndroid Build Coastguard Worker 42*8b26181fSAndroid Build Coastguard Worker/* 43*8b26181fSAndroid Build Coastguard Worker * And we need to pass the compiler state to the scanner. 44*8b26181fSAndroid Build Coastguard Worker */ 45*8b26181fSAndroid Build Coastguard Worker%parse-param { compiler_state_t *cstate } 46*8b26181fSAndroid Build Coastguard Worker 47*8b26181fSAndroid Build Coastguard Worker%{ 48*8b26181fSAndroid Build Coastguard Worker/* 49*8b26181fSAndroid Build Coastguard Worker * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996 50*8b26181fSAndroid Build Coastguard Worker * The Regents of the University of California. All rights reserved. 51*8b26181fSAndroid Build Coastguard Worker * 52*8b26181fSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 53*8b26181fSAndroid Build Coastguard Worker * modification, are permitted provided that: (1) source code distributions 54*8b26181fSAndroid Build Coastguard Worker * retain the above copyright notice and this paragraph in its entirety, (2) 55*8b26181fSAndroid Build Coastguard Worker * distributions including binary code include the above copyright notice and 56*8b26181fSAndroid Build Coastguard Worker * this paragraph in its entirety in the documentation or other materials 57*8b26181fSAndroid Build Coastguard Worker * provided with the distribution, and (3) all advertising materials mentioning 58*8b26181fSAndroid Build Coastguard Worker * features or use of this software display the following acknowledgement: 59*8b26181fSAndroid Build Coastguard Worker * ``This product includes software developed by the University of California, 60*8b26181fSAndroid Build Coastguard Worker * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 61*8b26181fSAndroid Build Coastguard Worker * the University nor the names of its contributors may be used to endorse 62*8b26181fSAndroid Build Coastguard Worker * or promote products derived from this software without specific prior 63*8b26181fSAndroid Build Coastguard Worker * written permission. 64*8b26181fSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 65*8b26181fSAndroid Build Coastguard Worker * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 66*8b26181fSAndroid Build Coastguard Worker * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 67*8b26181fSAndroid Build Coastguard Worker * 68*8b26181fSAndroid Build Coastguard Worker */ 69*8b26181fSAndroid Build Coastguard Worker 70*8b26181fSAndroid Build Coastguard Worker#ifdef HAVE_CONFIG_H 71*8b26181fSAndroid Build Coastguard Worker#include <config.h> 72*8b26181fSAndroid Build Coastguard Worker#endif 73*8b26181fSAndroid Build Coastguard Worker 74*8b26181fSAndroid Build Coastguard Worker/* 75*8b26181fSAndroid Build Coastguard Worker * grammar.h requires gencode.h and sometimes breaks in a polluted namespace 76*8b26181fSAndroid Build Coastguard Worker * (see ftmacros.h), so include it early. 77*8b26181fSAndroid Build Coastguard Worker */ 78*8b26181fSAndroid Build Coastguard Worker#include "gencode.h" 79*8b26181fSAndroid Build Coastguard Worker#include "grammar.h" 80*8b26181fSAndroid Build Coastguard Worker 81*8b26181fSAndroid Build Coastguard Worker#include <stdlib.h> 82*8b26181fSAndroid Build Coastguard Worker 83*8b26181fSAndroid Build Coastguard Worker#ifndef _WIN32 84*8b26181fSAndroid Build Coastguard Worker#include <sys/types.h> 85*8b26181fSAndroid Build Coastguard Worker#include <sys/socket.h> 86*8b26181fSAndroid Build Coastguard Worker 87*8b26181fSAndroid Build Coastguard Worker#if __STDC__ 88*8b26181fSAndroid Build Coastguard Workerstruct mbuf; 89*8b26181fSAndroid Build Coastguard Workerstruct rtentry; 90*8b26181fSAndroid Build Coastguard Worker#endif 91*8b26181fSAndroid Build Coastguard Worker 92*8b26181fSAndroid Build Coastguard Worker#include <netinet/in.h> 93*8b26181fSAndroid Build Coastguard Worker#include <arpa/inet.h> 94*8b26181fSAndroid Build Coastguard Worker#endif /* _WIN32 */ 95*8b26181fSAndroid Build Coastguard Worker 96*8b26181fSAndroid Build Coastguard Worker#include <stdio.h> 97*8b26181fSAndroid Build Coastguard Worker 98*8b26181fSAndroid Build Coastguard Worker#include "diag-control.h" 99*8b26181fSAndroid Build Coastguard Worker 100*8b26181fSAndroid Build Coastguard Worker#include "pcap-int.h" 101*8b26181fSAndroid Build Coastguard Worker 102*8b26181fSAndroid Build Coastguard Worker#include "scanner.h" 103*8b26181fSAndroid Build Coastguard Worker 104*8b26181fSAndroid Build Coastguard Worker#include "llc.h" 105*8b26181fSAndroid Build Coastguard Worker#include "ieee80211.h" 106*8b26181fSAndroid Build Coastguard Worker#include "pflog.h" 107*8b26181fSAndroid Build Coastguard Worker#include <pcap/namedb.h> 108*8b26181fSAndroid Build Coastguard Worker 109*8b26181fSAndroid Build Coastguard Worker#ifdef HAVE_OS_PROTO_H 110*8b26181fSAndroid Build Coastguard Worker#include "os-proto.h" 111*8b26181fSAndroid Build Coastguard Worker#endif 112*8b26181fSAndroid Build Coastguard Worker 113*8b26181fSAndroid Build Coastguard Worker#ifdef YYBYACC 114*8b26181fSAndroid Build Coastguard Worker/* 115*8b26181fSAndroid Build Coastguard Worker * Both Berkeley YACC and Bison define yydebug (under whatever name 116*8b26181fSAndroid Build Coastguard Worker * it has) as a global, but Bison does so only if YYDEBUG is defined. 117*8b26181fSAndroid Build Coastguard Worker * Berkeley YACC define it even if YYDEBUG isn't defined; declare it 118*8b26181fSAndroid Build Coastguard Worker * here to suppress a warning. 119*8b26181fSAndroid Build Coastguard Worker */ 120*8b26181fSAndroid Build Coastguard Worker#if !defined(YYDEBUG) 121*8b26181fSAndroid Build Coastguard Workerextern int yydebug; 122*8b26181fSAndroid Build Coastguard Worker#endif 123*8b26181fSAndroid Build Coastguard Worker 124*8b26181fSAndroid Build Coastguard Worker/* 125*8b26181fSAndroid Build Coastguard Worker * In Berkeley YACC, yynerrs (under whatever name it has) is global, 126*8b26181fSAndroid Build Coastguard Worker * even if it's building a reentrant parser. In Bison, it's local 127*8b26181fSAndroid Build Coastguard Worker * in reentrant parsers. 128*8b26181fSAndroid Build Coastguard Worker * 129*8b26181fSAndroid Build Coastguard Worker * Declare it to squelch a warning. 130*8b26181fSAndroid Build Coastguard Worker */ 131*8b26181fSAndroid Build Coastguard Workerextern int yynerrs; 132*8b26181fSAndroid Build Coastguard Worker#endif 133*8b26181fSAndroid Build Coastguard Worker 134*8b26181fSAndroid Build Coastguard Worker#define QSET(q, p, d, a) (q).proto = (unsigned char)(p),\ 135*8b26181fSAndroid Build Coastguard Worker (q).dir = (unsigned char)(d),\ 136*8b26181fSAndroid Build Coastguard Worker (q).addr = (unsigned char)(a) 137*8b26181fSAndroid Build Coastguard Worker 138*8b26181fSAndroid Build Coastguard Workerstruct tok { 139*8b26181fSAndroid Build Coastguard Worker int v; /* value */ 140*8b26181fSAndroid Build Coastguard Worker const char *s; /* string */ 141*8b26181fSAndroid Build Coastguard Worker}; 142*8b26181fSAndroid Build Coastguard Worker 143*8b26181fSAndroid Build Coastguard Workerstatic const struct tok ieee80211_types[] = { 144*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_TYPE_DATA, "data" }, 145*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_TYPE_MGT, "mgt" }, 146*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_TYPE_MGT, "management" }, 147*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_TYPE_CTL, "ctl" }, 148*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_TYPE_CTL, "control" }, 149*8b26181fSAndroid Build Coastguard Worker { 0, NULL } 150*8b26181fSAndroid Build Coastguard Worker}; 151*8b26181fSAndroid Build Coastguard Workerstatic const struct tok ieee80211_mgt_subtypes[] = { 152*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_ASSOC_REQ, "assocreq" }, 153*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_ASSOC_REQ, "assoc-req" }, 154*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_ASSOC_RESP, "assocresp" }, 155*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_ASSOC_RESP, "assoc-resp" }, 156*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_REASSOC_REQ, "reassocreq" }, 157*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_REASSOC_REQ, "reassoc-req" }, 158*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_REASSOC_RESP, "reassocresp" }, 159*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_REASSOC_RESP, "reassoc-resp" }, 160*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_PROBE_REQ, "probereq" }, 161*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_PROBE_REQ, "probe-req" }, 162*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_PROBE_RESP, "proberesp" }, 163*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_PROBE_RESP, "probe-resp" }, 164*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_BEACON, "beacon" }, 165*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_ATIM, "atim" }, 166*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_DISASSOC, "disassoc" }, 167*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_DISASSOC, "disassociation" }, 168*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_AUTH, "auth" }, 169*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_AUTH, "authentication" }, 170*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_DEAUTH, "deauth" }, 171*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_DEAUTH, "deauthentication" }, 172*8b26181fSAndroid Build Coastguard Worker { 0, NULL } 173*8b26181fSAndroid Build Coastguard Worker}; 174*8b26181fSAndroid Build Coastguard Workerstatic const struct tok ieee80211_ctl_subtypes[] = { 175*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_PS_POLL, "ps-poll" }, 176*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_RTS, "rts" }, 177*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_CTS, "cts" }, 178*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_ACK, "ack" }, 179*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_CF_END, "cf-end" }, 180*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_CF_END_ACK, "cf-end-ack" }, 181*8b26181fSAndroid Build Coastguard Worker { 0, NULL } 182*8b26181fSAndroid Build Coastguard Worker}; 183*8b26181fSAndroid Build Coastguard Workerstatic const struct tok ieee80211_data_subtypes[] = { 184*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_DATA, "data" }, 185*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_CF_ACK, "data-cf-ack" }, 186*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_CF_POLL, "data-cf-poll" }, 187*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_CF_ACPL, "data-cf-ack-poll" }, 188*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_NODATA, "null" }, 189*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_NODATA_CF_ACK, "cf-ack" }, 190*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_NODATA_CF_POLL, "cf-poll" }, 191*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_NODATA_CF_ACPL, "cf-ack-poll" }, 192*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_QOS|IEEE80211_FC0_SUBTYPE_DATA, "qos-data" }, 193*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_QOS|IEEE80211_FC0_SUBTYPE_CF_ACK, "qos-data-cf-ack" }, 194*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_QOS|IEEE80211_FC0_SUBTYPE_CF_POLL, "qos-data-cf-poll" }, 195*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_QOS|IEEE80211_FC0_SUBTYPE_CF_ACPL, "qos-data-cf-ack-poll" }, 196*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_QOS|IEEE80211_FC0_SUBTYPE_NODATA, "qos" }, 197*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_QOS|IEEE80211_FC0_SUBTYPE_NODATA_CF_POLL, "qos-cf-poll" }, 198*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_SUBTYPE_QOS|IEEE80211_FC0_SUBTYPE_NODATA_CF_ACPL, "qos-cf-ack-poll" }, 199*8b26181fSAndroid Build Coastguard Worker { 0, NULL } 200*8b26181fSAndroid Build Coastguard Worker}; 201*8b26181fSAndroid Build Coastguard Workerstatic const struct tok llc_s_subtypes[] = { 202*8b26181fSAndroid Build Coastguard Worker { LLC_RR, "rr" }, 203*8b26181fSAndroid Build Coastguard Worker { LLC_RNR, "rnr" }, 204*8b26181fSAndroid Build Coastguard Worker { LLC_REJ, "rej" }, 205*8b26181fSAndroid Build Coastguard Worker { 0, NULL } 206*8b26181fSAndroid Build Coastguard Worker}; 207*8b26181fSAndroid Build Coastguard Workerstatic const struct tok llc_u_subtypes[] = { 208*8b26181fSAndroid Build Coastguard Worker { LLC_UI, "ui" }, 209*8b26181fSAndroid Build Coastguard Worker { LLC_UA, "ua" }, 210*8b26181fSAndroid Build Coastguard Worker { LLC_DISC, "disc" }, 211*8b26181fSAndroid Build Coastguard Worker { LLC_DM, "dm" }, 212*8b26181fSAndroid Build Coastguard Worker { LLC_SABME, "sabme" }, 213*8b26181fSAndroid Build Coastguard Worker { LLC_TEST, "test" }, 214*8b26181fSAndroid Build Coastguard Worker { LLC_XID, "xid" }, 215*8b26181fSAndroid Build Coastguard Worker { LLC_FRMR, "frmr" }, 216*8b26181fSAndroid Build Coastguard Worker { 0, NULL } 217*8b26181fSAndroid Build Coastguard Worker}; 218*8b26181fSAndroid Build Coastguard Workerstruct type2tok { 219*8b26181fSAndroid Build Coastguard Worker int type; 220*8b26181fSAndroid Build Coastguard Worker const struct tok *tok; 221*8b26181fSAndroid Build Coastguard Worker}; 222*8b26181fSAndroid Build Coastguard Workerstatic const struct type2tok ieee80211_type_subtypes[] = { 223*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_TYPE_MGT, ieee80211_mgt_subtypes }, 224*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_TYPE_CTL, ieee80211_ctl_subtypes }, 225*8b26181fSAndroid Build Coastguard Worker { IEEE80211_FC0_TYPE_DATA, ieee80211_data_subtypes }, 226*8b26181fSAndroid Build Coastguard Worker { 0, NULL } 227*8b26181fSAndroid Build Coastguard Worker}; 228*8b26181fSAndroid Build Coastguard Worker 229*8b26181fSAndroid Build Coastguard Workerstatic int 230*8b26181fSAndroid Build Coastguard Workerstr2tok(const char *str, const struct tok *toks) 231*8b26181fSAndroid Build Coastguard Worker{ 232*8b26181fSAndroid Build Coastguard Worker int i; 233*8b26181fSAndroid Build Coastguard Worker 234*8b26181fSAndroid Build Coastguard Worker for (i = 0; toks[i].s != NULL; i++) { 235*8b26181fSAndroid Build Coastguard Worker if (pcap_strcasecmp(toks[i].s, str) == 0) { 236*8b26181fSAndroid Build Coastguard Worker /* 237*8b26181fSAndroid Build Coastguard Worker * Just in case somebody is using this to 238*8b26181fSAndroid Build Coastguard Worker * generate values of -1/0xFFFFFFFF. 239*8b26181fSAndroid Build Coastguard Worker * That won't work, as it's indistinguishable 240*8b26181fSAndroid Build Coastguard Worker * from an error. 241*8b26181fSAndroid Build Coastguard Worker */ 242*8b26181fSAndroid Build Coastguard Worker if (toks[i].v == -1) 243*8b26181fSAndroid Build Coastguard Worker abort(); 244*8b26181fSAndroid Build Coastguard Worker return (toks[i].v); 245*8b26181fSAndroid Build Coastguard Worker } 246*8b26181fSAndroid Build Coastguard Worker } 247*8b26181fSAndroid Build Coastguard Worker return (-1); 248*8b26181fSAndroid Build Coastguard Worker} 249*8b26181fSAndroid Build Coastguard Worker 250*8b26181fSAndroid Build Coastguard Workerstatic const struct qual qerr = { Q_UNDEF, Q_UNDEF, Q_UNDEF, Q_UNDEF }; 251*8b26181fSAndroid Build Coastguard Worker 252*8b26181fSAndroid Build Coastguard Workerstatic void 253*8b26181fSAndroid Build Coastguard Workeryyerror(void *yyscanner _U_, compiler_state_t *cstate, const char *msg) 254*8b26181fSAndroid Build Coastguard Worker{ 255*8b26181fSAndroid Build Coastguard Worker bpf_set_error(cstate, "can't parse filter expression: %s", msg); 256*8b26181fSAndroid Build Coastguard Worker} 257*8b26181fSAndroid Build Coastguard Worker 258*8b26181fSAndroid Build Coastguard Workerstatic const struct tok pflog_reasons[] = { 259*8b26181fSAndroid Build Coastguard Worker { PFRES_MATCH, "match" }, 260*8b26181fSAndroid Build Coastguard Worker { PFRES_BADOFF, "bad-offset" }, 261*8b26181fSAndroid Build Coastguard Worker { PFRES_FRAG, "fragment" }, 262*8b26181fSAndroid Build Coastguard Worker { PFRES_SHORT, "short" }, 263*8b26181fSAndroid Build Coastguard Worker { PFRES_NORM, "normalize" }, 264*8b26181fSAndroid Build Coastguard Worker { PFRES_MEMORY, "memory" }, 265*8b26181fSAndroid Build Coastguard Worker { PFRES_TS, "bad-timestamp" }, 266*8b26181fSAndroid Build Coastguard Worker { PFRES_CONGEST, "congestion" }, 267*8b26181fSAndroid Build Coastguard Worker { PFRES_IPOPTIONS, "ip-option" }, 268*8b26181fSAndroid Build Coastguard Worker { PFRES_PROTCKSUM, "proto-cksum" }, 269*8b26181fSAndroid Build Coastguard Worker { PFRES_BADSTATE, "state-mismatch" }, 270*8b26181fSAndroid Build Coastguard Worker { PFRES_STATEINS, "state-insert" }, 271*8b26181fSAndroid Build Coastguard Worker { PFRES_MAXSTATES, "state-limit" }, 272*8b26181fSAndroid Build Coastguard Worker { PFRES_SRCLIMIT, "src-limit" }, 273*8b26181fSAndroid Build Coastguard Worker { PFRES_SYNPROXY, "synproxy" }, 274*8b26181fSAndroid Build Coastguard Worker#if defined(__FreeBSD__) 275*8b26181fSAndroid Build Coastguard Worker { PFRES_MAPFAILED, "map-failed" }, 276*8b26181fSAndroid Build Coastguard Worker#elif defined(__NetBSD__) 277*8b26181fSAndroid Build Coastguard Worker { PFRES_STATELOCKED, "state-locked" }, 278*8b26181fSAndroid Build Coastguard Worker#elif defined(__OpenBSD__) 279*8b26181fSAndroid Build Coastguard Worker { PFRES_TRANSLATE, "translate" }, 280*8b26181fSAndroid Build Coastguard Worker { PFRES_NOROUTE, "no-route" }, 281*8b26181fSAndroid Build Coastguard Worker#elif defined(__APPLE__) 282*8b26181fSAndroid Build Coastguard Worker { PFRES_DUMMYNET, "dummynet" }, 283*8b26181fSAndroid Build Coastguard Worker#endif 284*8b26181fSAndroid Build Coastguard Worker { 0, NULL } 285*8b26181fSAndroid Build Coastguard Worker}; 286*8b26181fSAndroid Build Coastguard Worker 287*8b26181fSAndroid Build Coastguard Workerstatic int 288*8b26181fSAndroid Build Coastguard Workerpfreason_to_num(compiler_state_t *cstate, const char *reason) 289*8b26181fSAndroid Build Coastguard Worker{ 290*8b26181fSAndroid Build Coastguard Worker int i; 291*8b26181fSAndroid Build Coastguard Worker 292*8b26181fSAndroid Build Coastguard Worker i = str2tok(reason, pflog_reasons); 293*8b26181fSAndroid Build Coastguard Worker if (i == -1) 294*8b26181fSAndroid Build Coastguard Worker bpf_set_error(cstate, "unknown PF reason \"%s\"", reason); 295*8b26181fSAndroid Build Coastguard Worker return (i); 296*8b26181fSAndroid Build Coastguard Worker} 297*8b26181fSAndroid Build Coastguard Worker 298*8b26181fSAndroid Build Coastguard Workerstatic const struct tok pflog_actions[] = { 299*8b26181fSAndroid Build Coastguard Worker { PF_PASS, "pass" }, 300*8b26181fSAndroid Build Coastguard Worker { PF_PASS, "accept" }, /* alias for "pass" */ 301*8b26181fSAndroid Build Coastguard Worker { PF_DROP, "drop" }, 302*8b26181fSAndroid Build Coastguard Worker { PF_DROP, "block" }, /* alias for "drop" */ 303*8b26181fSAndroid Build Coastguard Worker { PF_SCRUB, "scrub" }, 304*8b26181fSAndroid Build Coastguard Worker { PF_NOSCRUB, "noscrub" }, 305*8b26181fSAndroid Build Coastguard Worker { PF_NAT, "nat" }, 306*8b26181fSAndroid Build Coastguard Worker { PF_NONAT, "nonat" }, 307*8b26181fSAndroid Build Coastguard Worker { PF_BINAT, "binat" }, 308*8b26181fSAndroid Build Coastguard Worker { PF_NOBINAT, "nobinat" }, 309*8b26181fSAndroid Build Coastguard Worker { PF_RDR, "rdr" }, 310*8b26181fSAndroid Build Coastguard Worker { PF_NORDR, "nordr" }, 311*8b26181fSAndroid Build Coastguard Worker { PF_SYNPROXY_DROP, "synproxy-drop" }, 312*8b26181fSAndroid Build Coastguard Worker#if defined(__FreeBSD__) 313*8b26181fSAndroid Build Coastguard Worker { PF_DEFER, "defer" }, 314*8b26181fSAndroid Build Coastguard Worker#elif defined(__OpenBSD__) 315*8b26181fSAndroid Build Coastguard Worker { PF_DEFER, "defer" }, 316*8b26181fSAndroid Build Coastguard Worker { PF_MATCH, "match" }, 317*8b26181fSAndroid Build Coastguard Worker { PF_DIVERT, "divert" }, 318*8b26181fSAndroid Build Coastguard Worker { PF_RT, "rt" }, 319*8b26181fSAndroid Build Coastguard Worker { PF_AFRT, "afrt" }, 320*8b26181fSAndroid Build Coastguard Worker#elif defined(__APPLE__) 321*8b26181fSAndroid Build Coastguard Worker { PF_DUMMYNET, "dummynet" }, 322*8b26181fSAndroid Build Coastguard Worker { PF_NODUMMYNET, "nodummynet" }, 323*8b26181fSAndroid Build Coastguard Worker { PF_NAT64, "nat64" }, 324*8b26181fSAndroid Build Coastguard Worker { PF_NONAT64, "nonat64" }, 325*8b26181fSAndroid Build Coastguard Worker#endif 326*8b26181fSAndroid Build Coastguard Worker { 0, NULL }, 327*8b26181fSAndroid Build Coastguard Worker}; 328*8b26181fSAndroid Build Coastguard Worker 329*8b26181fSAndroid Build Coastguard Workerstatic int 330*8b26181fSAndroid Build Coastguard Workerpfaction_to_num(compiler_state_t *cstate, const char *action) 331*8b26181fSAndroid Build Coastguard Worker{ 332*8b26181fSAndroid Build Coastguard Worker int i; 333*8b26181fSAndroid Build Coastguard Worker 334*8b26181fSAndroid Build Coastguard Worker i = str2tok(action, pflog_actions); 335*8b26181fSAndroid Build Coastguard Worker if (i == -1) 336*8b26181fSAndroid Build Coastguard Worker bpf_set_error(cstate, "unknown PF action \"%s\"", action); 337*8b26181fSAndroid Build Coastguard Worker return (i); 338*8b26181fSAndroid Build Coastguard Worker} 339*8b26181fSAndroid Build Coastguard Worker 340*8b26181fSAndroid Build Coastguard Worker/* 341*8b26181fSAndroid Build Coastguard Worker * For calls that might return an "an error occurred" value. 342*8b26181fSAndroid Build Coastguard Worker */ 343*8b26181fSAndroid Build Coastguard Worker#define CHECK_INT_VAL(val) if (val == -1) YYABORT 344*8b26181fSAndroid Build Coastguard Worker#define CHECK_PTR_VAL(val) if (val == NULL) YYABORT 345*8b26181fSAndroid Build Coastguard Worker 346*8b26181fSAndroid Build Coastguard WorkerDIAG_OFF_BISON_BYACC 347*8b26181fSAndroid Build Coastguard Worker%} 348*8b26181fSAndroid Build Coastguard Worker 349*8b26181fSAndroid Build Coastguard Worker%union { 350*8b26181fSAndroid Build Coastguard Worker int i; 351*8b26181fSAndroid Build Coastguard Worker bpf_u_int32 h; 352*8b26181fSAndroid Build Coastguard Worker char *s; 353*8b26181fSAndroid Build Coastguard Worker struct stmt *stmt; 354*8b26181fSAndroid Build Coastguard Worker struct arth *a; 355*8b26181fSAndroid Build Coastguard Worker struct { 356*8b26181fSAndroid Build Coastguard Worker struct qual q; 357*8b26181fSAndroid Build Coastguard Worker int atmfieldtype; 358*8b26181fSAndroid Build Coastguard Worker int mtp3fieldtype; 359*8b26181fSAndroid Build Coastguard Worker struct block *b; 360*8b26181fSAndroid Build Coastguard Worker } blk; 361*8b26181fSAndroid Build Coastguard Worker struct block *rblk; 362*8b26181fSAndroid Build Coastguard Worker} 363*8b26181fSAndroid Build Coastguard Worker 364*8b26181fSAndroid Build Coastguard Worker%type <blk> expr id nid pid term rterm qid 365*8b26181fSAndroid Build Coastguard Worker%type <blk> head 366*8b26181fSAndroid Build Coastguard Worker%type <i> pqual dqual aqual ndaqual 367*8b26181fSAndroid Build Coastguard Worker%type <a> arth narth 368*8b26181fSAndroid Build Coastguard Worker%type <i> byteop pname relop irelop 369*8b26181fSAndroid Build Coastguard Worker%type <h> pnum 370*8b26181fSAndroid Build Coastguard Worker%type <blk> and or paren not null prog 371*8b26181fSAndroid Build Coastguard Worker%type <rblk> other pfvar p80211 pllc 372*8b26181fSAndroid Build Coastguard Worker%type <i> atmtype atmmultitype 373*8b26181fSAndroid Build Coastguard Worker%type <blk> atmfield 374*8b26181fSAndroid Build Coastguard Worker%type <blk> atmfieldvalue atmvalue atmlistvalue 375*8b26181fSAndroid Build Coastguard Worker%type <i> mtp2type 376*8b26181fSAndroid Build Coastguard Worker%type <blk> mtp3field 377*8b26181fSAndroid Build Coastguard Worker%type <blk> mtp3fieldvalue mtp3value mtp3listvalue 378*8b26181fSAndroid Build Coastguard Worker 379*8b26181fSAndroid Build Coastguard Worker 380*8b26181fSAndroid Build Coastguard Worker%token DST SRC HOST GATEWAY 381*8b26181fSAndroid Build Coastguard Worker%token NET NETMASK PORT PORTRANGE LESS GREATER PROTO PROTOCHAIN CBYTE 382*8b26181fSAndroid Build Coastguard Worker%token ARP RARP IP SCTP TCP UDP ICMP IGMP IGRP PIM VRRP CARP 383*8b26181fSAndroid Build Coastguard Worker%token ATALK AARP DECNET LAT SCA MOPRC MOPDL 384*8b26181fSAndroid Build Coastguard Worker%token TK_BROADCAST TK_MULTICAST 385*8b26181fSAndroid Build Coastguard Worker%token NUM INBOUND OUTBOUND 386*8b26181fSAndroid Build Coastguard Worker%token IFINDEX 387*8b26181fSAndroid Build Coastguard Worker%token PF_IFNAME PF_RSET PF_RNR PF_SRNR PF_REASON PF_ACTION 388*8b26181fSAndroid Build Coastguard Worker%token TYPE SUBTYPE DIR ADDR1 ADDR2 ADDR3 ADDR4 RA TA 389*8b26181fSAndroid Build Coastguard Worker%token LINK 390*8b26181fSAndroid Build Coastguard Worker%token GEQ LEQ NEQ 391*8b26181fSAndroid Build Coastguard Worker%token ID EID HID HID6 AID 392*8b26181fSAndroid Build Coastguard Worker%token LSH RSH 393*8b26181fSAndroid Build Coastguard Worker%token LEN 394*8b26181fSAndroid Build Coastguard Worker%token IPV6 ICMPV6 AH ESP 395*8b26181fSAndroid Build Coastguard Worker%token VLAN MPLS 396*8b26181fSAndroid Build Coastguard Worker%token PPPOED PPPOES GENEVE 397*8b26181fSAndroid Build Coastguard Worker%token ISO ESIS CLNP ISIS L1 L2 IIH LSP SNP CSNP PSNP 398*8b26181fSAndroid Build Coastguard Worker%token STP 399*8b26181fSAndroid Build Coastguard Worker%token IPX 400*8b26181fSAndroid Build Coastguard Worker%token NETBEUI 401*8b26181fSAndroid Build Coastguard Worker%token LANE LLC METAC BCC SC ILMIC OAMF4EC OAMF4SC 402*8b26181fSAndroid Build Coastguard Worker%token OAM OAMF4 CONNECTMSG METACONNECT 403*8b26181fSAndroid Build Coastguard Worker%token VPI VCI 404*8b26181fSAndroid Build Coastguard Worker%token RADIO 405*8b26181fSAndroid Build Coastguard Worker%token FISU LSSU MSU HFISU HLSSU HMSU 406*8b26181fSAndroid Build Coastguard Worker%token SIO OPC DPC SLS HSIO HOPC HDPC HSLS 407*8b26181fSAndroid Build Coastguard Worker%token LEX_ERROR 408*8b26181fSAndroid Build Coastguard Worker 409*8b26181fSAndroid Build Coastguard Worker%type <s> ID EID AID 410*8b26181fSAndroid Build Coastguard Worker%type <s> HID HID6 411*8b26181fSAndroid Build Coastguard Worker%type <h> NUM 412*8b26181fSAndroid Build Coastguard Worker%type <i> action reason type subtype type_subtype dir 413*8b26181fSAndroid Build Coastguard Worker 414*8b26181fSAndroid Build Coastguard Worker%left OR AND 415*8b26181fSAndroid Build Coastguard Worker%nonassoc '!' 416*8b26181fSAndroid Build Coastguard Worker%left '|' 417*8b26181fSAndroid Build Coastguard Worker%left '&' 418*8b26181fSAndroid Build Coastguard Worker%left LSH RSH 419*8b26181fSAndroid Build Coastguard Worker%left '+' '-' 420*8b26181fSAndroid Build Coastguard Worker%left '*' '/' 421*8b26181fSAndroid Build Coastguard Worker%nonassoc UMINUS 422*8b26181fSAndroid Build Coastguard Worker%% 423*8b26181fSAndroid Build Coastguard Workerprog: null expr 424*8b26181fSAndroid Build Coastguard Worker{ 425*8b26181fSAndroid Build Coastguard Worker CHECK_INT_VAL(finish_parse(cstate, $2.b)); 426*8b26181fSAndroid Build Coastguard Worker} 427*8b26181fSAndroid Build Coastguard Worker | null 428*8b26181fSAndroid Build Coastguard Worker ; 429*8b26181fSAndroid Build Coastguard Workernull: /* null */ { $$.q = qerr; } 430*8b26181fSAndroid Build Coastguard Worker ; 431*8b26181fSAndroid Build Coastguard Workerexpr: term 432*8b26181fSAndroid Build Coastguard Worker | expr and term { gen_and($1.b, $3.b); $$ = $3; } 433*8b26181fSAndroid Build Coastguard Worker | expr and id { gen_and($1.b, $3.b); $$ = $3; } 434*8b26181fSAndroid Build Coastguard Worker | expr or term { gen_or($1.b, $3.b); $$ = $3; } 435*8b26181fSAndroid Build Coastguard Worker | expr or id { gen_or($1.b, $3.b); $$ = $3; } 436*8b26181fSAndroid Build Coastguard Worker ; 437*8b26181fSAndroid Build Coastguard Workerand: AND { $$ = $<blk>0; } 438*8b26181fSAndroid Build Coastguard Worker ; 439*8b26181fSAndroid Build Coastguard Workeror: OR { $$ = $<blk>0; } 440*8b26181fSAndroid Build Coastguard Worker ; 441*8b26181fSAndroid Build Coastguard Workerid: nid 442*8b26181fSAndroid Build Coastguard Worker | pnum { CHECK_PTR_VAL(($$.b = gen_ncode(cstate, NULL, $1, 443*8b26181fSAndroid Build Coastguard Worker $$.q = $<blk>0.q))); } 444*8b26181fSAndroid Build Coastguard Worker | paren pid ')' { $$ = $2; } 445*8b26181fSAndroid Build Coastguard Worker ; 446*8b26181fSAndroid Build Coastguard Workernid: ID { CHECK_PTR_VAL($1); CHECK_PTR_VAL(($$.b = gen_scode(cstate, $1, $$.q = $<blk>0.q))); } 447*8b26181fSAndroid Build Coastguard Worker | HID '/' NUM { CHECK_PTR_VAL($1); CHECK_PTR_VAL(($$.b = gen_mcode(cstate, $1, NULL, $3, 448*8b26181fSAndroid Build Coastguard Worker $$.q = $<blk>0.q))); } 449*8b26181fSAndroid Build Coastguard Worker | HID NETMASK HID { CHECK_PTR_VAL($1); CHECK_PTR_VAL(($$.b = gen_mcode(cstate, $1, $3, 0, 450*8b26181fSAndroid Build Coastguard Worker $$.q = $<blk>0.q))); } 451*8b26181fSAndroid Build Coastguard Worker | HID { 452*8b26181fSAndroid Build Coastguard Worker CHECK_PTR_VAL($1); 453*8b26181fSAndroid Build Coastguard Worker /* Decide how to parse HID based on proto */ 454*8b26181fSAndroid Build Coastguard Worker $$.q = $<blk>0.q; 455*8b26181fSAndroid Build Coastguard Worker if ($$.q.addr == Q_PORT) { 456*8b26181fSAndroid Build Coastguard Worker bpf_set_error(cstate, "'port' modifier applied to ip host"); 457*8b26181fSAndroid Build Coastguard Worker YYABORT; 458*8b26181fSAndroid Build Coastguard Worker } else if ($$.q.addr == Q_PORTRANGE) { 459*8b26181fSAndroid Build Coastguard Worker bpf_set_error(cstate, "'portrange' modifier applied to ip host"); 460*8b26181fSAndroid Build Coastguard Worker YYABORT; 461*8b26181fSAndroid Build Coastguard Worker } else if ($$.q.addr == Q_PROTO) { 462*8b26181fSAndroid Build Coastguard Worker bpf_set_error(cstate, "'proto' modifier applied to ip host"); 463*8b26181fSAndroid Build Coastguard Worker YYABORT; 464*8b26181fSAndroid Build Coastguard Worker } else if ($$.q.addr == Q_PROTOCHAIN) { 465*8b26181fSAndroid Build Coastguard Worker bpf_set_error(cstate, "'protochain' modifier applied to ip host"); 466*8b26181fSAndroid Build Coastguard Worker YYABORT; 467*8b26181fSAndroid Build Coastguard Worker } 468*8b26181fSAndroid Build Coastguard Worker CHECK_PTR_VAL(($$.b = gen_ncode(cstate, $1, 0, $$.q))); 469*8b26181fSAndroid Build Coastguard Worker } 470*8b26181fSAndroid Build Coastguard Worker | HID6 '/' NUM { 471*8b26181fSAndroid Build Coastguard Worker CHECK_PTR_VAL($1); 472*8b26181fSAndroid Build Coastguard Worker#ifdef INET6 473*8b26181fSAndroid Build Coastguard Worker CHECK_PTR_VAL(($$.b = gen_mcode6(cstate, $1, NULL, $3, 474*8b26181fSAndroid Build Coastguard Worker $$.q = $<blk>0.q))); 475*8b26181fSAndroid Build Coastguard Worker#else 476*8b26181fSAndroid Build Coastguard Worker bpf_set_error(cstate, "'ip6addr/prefixlen' not supported " 477*8b26181fSAndroid Build Coastguard Worker "in this configuration"); 478*8b26181fSAndroid Build Coastguard Worker YYABORT; 479*8b26181fSAndroid Build Coastguard Worker#endif /*INET6*/ 480*8b26181fSAndroid Build Coastguard Worker } 481*8b26181fSAndroid Build Coastguard Worker | HID6 { 482*8b26181fSAndroid Build Coastguard Worker CHECK_PTR_VAL($1); 483*8b26181fSAndroid Build Coastguard Worker#ifdef INET6 484*8b26181fSAndroid Build Coastguard Worker CHECK_PTR_VAL(($$.b = gen_mcode6(cstate, $1, 0, 128, 485*8b26181fSAndroid Build Coastguard Worker $$.q = $<blk>0.q))); 486*8b26181fSAndroid Build Coastguard Worker#else 487*8b26181fSAndroid Build Coastguard Worker bpf_set_error(cstate, "'ip6addr' not supported " 488*8b26181fSAndroid Build Coastguard Worker "in this configuration"); 489*8b26181fSAndroid Build Coastguard Worker YYABORT; 490*8b26181fSAndroid Build Coastguard Worker#endif /*INET6*/ 491*8b26181fSAndroid Build Coastguard Worker } 492*8b26181fSAndroid Build Coastguard Worker | EID { CHECK_PTR_VAL($1); CHECK_PTR_VAL(($$.b = gen_ecode(cstate, $1, $$.q = $<blk>0.q))); } 493*8b26181fSAndroid Build Coastguard Worker | AID { CHECK_PTR_VAL($1); CHECK_PTR_VAL(($$.b = gen_acode(cstate, $1, $$.q = $<blk>0.q))); } 494*8b26181fSAndroid Build Coastguard Worker | not id { gen_not($2.b); $$ = $2; } 495*8b26181fSAndroid Build Coastguard Worker ; 496*8b26181fSAndroid Build Coastguard Workernot: '!' { $$ = $<blk>0; } 497*8b26181fSAndroid Build Coastguard Worker ; 498*8b26181fSAndroid Build Coastguard Workerparen: '(' { $$ = $<blk>0; } 499*8b26181fSAndroid Build Coastguard Worker ; 500*8b26181fSAndroid Build Coastguard Workerpid: nid 501*8b26181fSAndroid Build Coastguard Worker | qid and id { gen_and($1.b, $3.b); $$ = $3; } 502*8b26181fSAndroid Build Coastguard Worker | qid or id { gen_or($1.b, $3.b); $$ = $3; } 503*8b26181fSAndroid Build Coastguard Worker ; 504*8b26181fSAndroid Build Coastguard Workerqid: pnum { CHECK_PTR_VAL(($$.b = gen_ncode(cstate, NULL, $1, 505*8b26181fSAndroid Build Coastguard Worker $$.q = $<blk>0.q))); } 506*8b26181fSAndroid Build Coastguard Worker | pid 507*8b26181fSAndroid Build Coastguard Worker ; 508*8b26181fSAndroid Build Coastguard Workerterm: rterm 509*8b26181fSAndroid Build Coastguard Worker | not term { gen_not($2.b); $$ = $2; } 510*8b26181fSAndroid Build Coastguard Worker ; 511*8b26181fSAndroid Build Coastguard Workerhead: pqual dqual aqual { QSET($$.q, $1, $2, $3); } 512*8b26181fSAndroid Build Coastguard Worker | pqual dqual { QSET($$.q, $1, $2, Q_DEFAULT); } 513*8b26181fSAndroid Build Coastguard Worker | pqual aqual { QSET($$.q, $1, Q_DEFAULT, $2); } 514*8b26181fSAndroid Build Coastguard Worker | pqual PROTO { QSET($$.q, $1, Q_DEFAULT, Q_PROTO); } 515*8b26181fSAndroid Build Coastguard Worker | pqual PROTOCHAIN { 516*8b26181fSAndroid Build Coastguard Worker#ifdef NO_PROTOCHAIN 517*8b26181fSAndroid Build Coastguard Worker bpf_set_error(cstate, "protochain not supported"); 518*8b26181fSAndroid Build Coastguard Worker YYABORT; 519*8b26181fSAndroid Build Coastguard Worker#else 520*8b26181fSAndroid Build Coastguard Worker QSET($$.q, $1, Q_DEFAULT, Q_PROTOCHAIN); 521*8b26181fSAndroid Build Coastguard Worker#endif 522*8b26181fSAndroid Build Coastguard Worker } 523*8b26181fSAndroid Build Coastguard Worker | pqual ndaqual { QSET($$.q, $1, Q_DEFAULT, $2); } 524*8b26181fSAndroid Build Coastguard Worker ; 525*8b26181fSAndroid Build Coastguard Workerrterm: head id { $$ = $2; } 526*8b26181fSAndroid Build Coastguard Worker | paren expr ')' { $$.b = $2.b; $$.q = $1.q; } 527*8b26181fSAndroid Build Coastguard Worker | pname { CHECK_PTR_VAL(($$.b = gen_proto_abbrev(cstate, $1))); $$.q = qerr; } 528*8b26181fSAndroid Build Coastguard Worker | arth relop arth { CHECK_PTR_VAL(($$.b = gen_relation(cstate, $2, $1, $3, 0))); 529*8b26181fSAndroid Build Coastguard Worker $$.q = qerr; } 530*8b26181fSAndroid Build Coastguard Worker | arth irelop arth { CHECK_PTR_VAL(($$.b = gen_relation(cstate, $2, $1, $3, 1))); 531*8b26181fSAndroid Build Coastguard Worker $$.q = qerr; } 532*8b26181fSAndroid Build Coastguard Worker | other { $$.b = $1; $$.q = qerr; } 533*8b26181fSAndroid Build Coastguard Worker | atmtype { CHECK_PTR_VAL(($$.b = gen_atmtype_abbrev(cstate, $1))); $$.q = qerr; } 534*8b26181fSAndroid Build Coastguard Worker | atmmultitype { CHECK_PTR_VAL(($$.b = gen_atmmulti_abbrev(cstate, $1))); $$.q = qerr; } 535*8b26181fSAndroid Build Coastguard Worker | atmfield atmvalue { $$.b = $2.b; $$.q = qerr; } 536*8b26181fSAndroid Build Coastguard Worker | mtp2type { CHECK_PTR_VAL(($$.b = gen_mtp2type_abbrev(cstate, $1))); $$.q = qerr; } 537*8b26181fSAndroid Build Coastguard Worker | mtp3field mtp3value { $$.b = $2.b; $$.q = qerr; } 538*8b26181fSAndroid Build Coastguard Worker ; 539*8b26181fSAndroid Build Coastguard Worker/* protocol level qualifiers */ 540*8b26181fSAndroid Build Coastguard Workerpqual: pname 541*8b26181fSAndroid Build Coastguard Worker | { $$ = Q_DEFAULT; } 542*8b26181fSAndroid Build Coastguard Worker ; 543*8b26181fSAndroid Build Coastguard Worker/* 'direction' qualifiers */ 544*8b26181fSAndroid Build Coastguard Workerdqual: SRC { $$ = Q_SRC; } 545*8b26181fSAndroid Build Coastguard Worker | DST { $$ = Q_DST; } 546*8b26181fSAndroid Build Coastguard Worker | SRC OR DST { $$ = Q_OR; } 547*8b26181fSAndroid Build Coastguard Worker | DST OR SRC { $$ = Q_OR; } 548*8b26181fSAndroid Build Coastguard Worker | SRC AND DST { $$ = Q_AND; } 549*8b26181fSAndroid Build Coastguard Worker | DST AND SRC { $$ = Q_AND; } 550*8b26181fSAndroid Build Coastguard Worker | ADDR1 { $$ = Q_ADDR1; } 551*8b26181fSAndroid Build Coastguard Worker | ADDR2 { $$ = Q_ADDR2; } 552*8b26181fSAndroid Build Coastguard Worker | ADDR3 { $$ = Q_ADDR3; } 553*8b26181fSAndroid Build Coastguard Worker | ADDR4 { $$ = Q_ADDR4; } 554*8b26181fSAndroid Build Coastguard Worker | RA { $$ = Q_RA; } 555*8b26181fSAndroid Build Coastguard Worker | TA { $$ = Q_TA; } 556*8b26181fSAndroid Build Coastguard Worker ; 557*8b26181fSAndroid Build Coastguard Worker/* address type qualifiers */ 558*8b26181fSAndroid Build Coastguard Workeraqual: HOST { $$ = Q_HOST; } 559*8b26181fSAndroid Build Coastguard Worker | NET { $$ = Q_NET; } 560*8b26181fSAndroid Build Coastguard Worker | PORT { $$ = Q_PORT; } 561*8b26181fSAndroid Build Coastguard Worker | PORTRANGE { $$ = Q_PORTRANGE; } 562*8b26181fSAndroid Build Coastguard Worker ; 563*8b26181fSAndroid Build Coastguard Worker/* non-directional address type qualifiers */ 564*8b26181fSAndroid Build Coastguard Workerndaqual: GATEWAY { $$ = Q_GATEWAY; } 565*8b26181fSAndroid Build Coastguard Worker ; 566*8b26181fSAndroid Build Coastguard Workerpname: LINK { $$ = Q_LINK; } 567*8b26181fSAndroid Build Coastguard Worker | IP { $$ = Q_IP; } 568*8b26181fSAndroid Build Coastguard Worker | ARP { $$ = Q_ARP; } 569*8b26181fSAndroid Build Coastguard Worker | RARP { $$ = Q_RARP; } 570*8b26181fSAndroid Build Coastguard Worker | SCTP { $$ = Q_SCTP; } 571*8b26181fSAndroid Build Coastguard Worker | TCP { $$ = Q_TCP; } 572*8b26181fSAndroid Build Coastguard Worker | UDP { $$ = Q_UDP; } 573*8b26181fSAndroid Build Coastguard Worker | ICMP { $$ = Q_ICMP; } 574*8b26181fSAndroid Build Coastguard Worker | IGMP { $$ = Q_IGMP; } 575*8b26181fSAndroid Build Coastguard Worker | IGRP { $$ = Q_IGRP; } 576*8b26181fSAndroid Build Coastguard Worker | PIM { $$ = Q_PIM; } 577*8b26181fSAndroid Build Coastguard Worker | VRRP { $$ = Q_VRRP; } 578*8b26181fSAndroid Build Coastguard Worker | CARP { $$ = Q_CARP; } 579*8b26181fSAndroid Build Coastguard Worker | ATALK { $$ = Q_ATALK; } 580*8b26181fSAndroid Build Coastguard Worker | AARP { $$ = Q_AARP; } 581*8b26181fSAndroid Build Coastguard Worker | DECNET { $$ = Q_DECNET; } 582*8b26181fSAndroid Build Coastguard Worker | LAT { $$ = Q_LAT; } 583*8b26181fSAndroid Build Coastguard Worker | SCA { $$ = Q_SCA; } 584*8b26181fSAndroid Build Coastguard Worker | MOPDL { $$ = Q_MOPDL; } 585*8b26181fSAndroid Build Coastguard Worker | MOPRC { $$ = Q_MOPRC; } 586*8b26181fSAndroid Build Coastguard Worker | IPV6 { $$ = Q_IPV6; } 587*8b26181fSAndroid Build Coastguard Worker | ICMPV6 { $$ = Q_ICMPV6; } 588*8b26181fSAndroid Build Coastguard Worker | AH { $$ = Q_AH; } 589*8b26181fSAndroid Build Coastguard Worker | ESP { $$ = Q_ESP; } 590*8b26181fSAndroid Build Coastguard Worker | ISO { $$ = Q_ISO; } 591*8b26181fSAndroid Build Coastguard Worker | ESIS { $$ = Q_ESIS; } 592*8b26181fSAndroid Build Coastguard Worker | ISIS { $$ = Q_ISIS; } 593*8b26181fSAndroid Build Coastguard Worker | L1 { $$ = Q_ISIS_L1; } 594*8b26181fSAndroid Build Coastguard Worker | L2 { $$ = Q_ISIS_L2; } 595*8b26181fSAndroid Build Coastguard Worker | IIH { $$ = Q_ISIS_IIH; } 596*8b26181fSAndroid Build Coastguard Worker | LSP { $$ = Q_ISIS_LSP; } 597*8b26181fSAndroid Build Coastguard Worker | SNP { $$ = Q_ISIS_SNP; } 598*8b26181fSAndroid Build Coastguard Worker | PSNP { $$ = Q_ISIS_PSNP; } 599*8b26181fSAndroid Build Coastguard Worker | CSNP { $$ = Q_ISIS_CSNP; } 600*8b26181fSAndroid Build Coastguard Worker | CLNP { $$ = Q_CLNP; } 601*8b26181fSAndroid Build Coastguard Worker | STP { $$ = Q_STP; } 602*8b26181fSAndroid Build Coastguard Worker | IPX { $$ = Q_IPX; } 603*8b26181fSAndroid Build Coastguard Worker | NETBEUI { $$ = Q_NETBEUI; } 604*8b26181fSAndroid Build Coastguard Worker | RADIO { $$ = Q_RADIO; } 605*8b26181fSAndroid Build Coastguard Worker ; 606*8b26181fSAndroid Build Coastguard Workerother: pqual TK_BROADCAST { CHECK_PTR_VAL(($$ = gen_broadcast(cstate, $1))); } 607*8b26181fSAndroid Build Coastguard Worker | pqual TK_MULTICAST { CHECK_PTR_VAL(($$ = gen_multicast(cstate, $1))); } 608*8b26181fSAndroid Build Coastguard Worker | LESS NUM { CHECK_PTR_VAL(($$ = gen_less(cstate, $2))); } 609*8b26181fSAndroid Build Coastguard Worker | GREATER NUM { CHECK_PTR_VAL(($$ = gen_greater(cstate, $2))); } 610*8b26181fSAndroid Build Coastguard Worker | CBYTE NUM byteop NUM { CHECK_PTR_VAL(($$ = gen_byteop(cstate, $3, $2, $4))); } 611*8b26181fSAndroid Build Coastguard Worker | INBOUND { CHECK_PTR_VAL(($$ = gen_inbound(cstate, 0))); } 612*8b26181fSAndroid Build Coastguard Worker | OUTBOUND { CHECK_PTR_VAL(($$ = gen_inbound(cstate, 1))); } 613*8b26181fSAndroid Build Coastguard Worker | IFINDEX NUM { CHECK_PTR_VAL(($$ = gen_ifindex(cstate, $2))); } 614*8b26181fSAndroid Build Coastguard Worker | VLAN pnum { CHECK_PTR_VAL(($$ = gen_vlan(cstate, $2, 1))); } 615*8b26181fSAndroid Build Coastguard Worker | VLAN { CHECK_PTR_VAL(($$ = gen_vlan(cstate, 0, 0))); } 616*8b26181fSAndroid Build Coastguard Worker | MPLS pnum { CHECK_PTR_VAL(($$ = gen_mpls(cstate, $2, 1))); } 617*8b26181fSAndroid Build Coastguard Worker | MPLS { CHECK_PTR_VAL(($$ = gen_mpls(cstate, 0, 0))); } 618*8b26181fSAndroid Build Coastguard Worker | PPPOED { CHECK_PTR_VAL(($$ = gen_pppoed(cstate))); } 619*8b26181fSAndroid Build Coastguard Worker | PPPOES pnum { CHECK_PTR_VAL(($$ = gen_pppoes(cstate, $2, 1))); } 620*8b26181fSAndroid Build Coastguard Worker | PPPOES { CHECK_PTR_VAL(($$ = gen_pppoes(cstate, 0, 0))); } 621*8b26181fSAndroid Build Coastguard Worker | GENEVE pnum { CHECK_PTR_VAL(($$ = gen_geneve(cstate, $2, 1))); } 622*8b26181fSAndroid Build Coastguard Worker | GENEVE { CHECK_PTR_VAL(($$ = gen_geneve(cstate, 0, 0))); } 623*8b26181fSAndroid Build Coastguard Worker | pfvar { $$ = $1; } 624*8b26181fSAndroid Build Coastguard Worker | pqual p80211 { $$ = $2; } 625*8b26181fSAndroid Build Coastguard Worker | pllc { $$ = $1; } 626*8b26181fSAndroid Build Coastguard Worker ; 627*8b26181fSAndroid Build Coastguard Worker 628*8b26181fSAndroid Build Coastguard Workerpfvar: PF_IFNAME ID { CHECK_PTR_VAL($2); CHECK_PTR_VAL(($$ = gen_pf_ifname(cstate, $2))); } 629*8b26181fSAndroid Build Coastguard Worker | PF_RSET ID { CHECK_PTR_VAL($2); CHECK_PTR_VAL(($$ = gen_pf_ruleset(cstate, $2))); } 630*8b26181fSAndroid Build Coastguard Worker | PF_RNR NUM { CHECK_PTR_VAL(($$ = gen_pf_rnr(cstate, $2))); } 631*8b26181fSAndroid Build Coastguard Worker | PF_SRNR NUM { CHECK_PTR_VAL(($$ = gen_pf_srnr(cstate, $2))); } 632*8b26181fSAndroid Build Coastguard Worker | PF_REASON reason { CHECK_PTR_VAL(($$ = gen_pf_reason(cstate, $2))); } 633*8b26181fSAndroid Build Coastguard Worker | PF_ACTION action { CHECK_PTR_VAL(($$ = gen_pf_action(cstate, $2))); } 634*8b26181fSAndroid Build Coastguard Worker ; 635*8b26181fSAndroid Build Coastguard Worker 636*8b26181fSAndroid Build Coastguard Workerp80211: TYPE type SUBTYPE subtype 637*8b26181fSAndroid Build Coastguard Worker { CHECK_PTR_VAL(($$ = gen_p80211_type(cstate, $2 | $4, 638*8b26181fSAndroid Build Coastguard Worker IEEE80211_FC0_TYPE_MASK | 639*8b26181fSAndroid Build Coastguard Worker IEEE80211_FC0_SUBTYPE_MASK))); 640*8b26181fSAndroid Build Coastguard Worker } 641*8b26181fSAndroid Build Coastguard Worker | TYPE type { CHECK_PTR_VAL(($$ = gen_p80211_type(cstate, $2, 642*8b26181fSAndroid Build Coastguard Worker IEEE80211_FC0_TYPE_MASK))); 643*8b26181fSAndroid Build Coastguard Worker } 644*8b26181fSAndroid Build Coastguard Worker | SUBTYPE type_subtype { CHECK_PTR_VAL(($$ = gen_p80211_type(cstate, $2, 645*8b26181fSAndroid Build Coastguard Worker IEEE80211_FC0_TYPE_MASK | 646*8b26181fSAndroid Build Coastguard Worker IEEE80211_FC0_SUBTYPE_MASK))); 647*8b26181fSAndroid Build Coastguard Worker } 648*8b26181fSAndroid Build Coastguard Worker | DIR dir { CHECK_PTR_VAL(($$ = gen_p80211_fcdir(cstate, $2))); } 649*8b26181fSAndroid Build Coastguard Worker ; 650*8b26181fSAndroid Build Coastguard Worker 651*8b26181fSAndroid Build Coastguard Workertype: NUM { if (($1 & (~IEEE80211_FC0_TYPE_MASK)) != 0) { 652*8b26181fSAndroid Build Coastguard Worker bpf_set_error(cstate, "invalid 802.11 type value 0x%02x", $1); 653*8b26181fSAndroid Build Coastguard Worker YYABORT; 654*8b26181fSAndroid Build Coastguard Worker } 655*8b26181fSAndroid Build Coastguard Worker $$ = (int)$1; 656*8b26181fSAndroid Build Coastguard Worker } 657*8b26181fSAndroid Build Coastguard Worker | ID { CHECK_PTR_VAL($1); 658*8b26181fSAndroid Build Coastguard Worker $$ = str2tok($1, ieee80211_types); 659*8b26181fSAndroid Build Coastguard Worker if ($$ == -1) { 660*8b26181fSAndroid Build Coastguard Worker bpf_set_error(cstate, "unknown 802.11 type name \"%s\"", $1); 661*8b26181fSAndroid Build Coastguard Worker YYABORT; 662*8b26181fSAndroid Build Coastguard Worker } 663*8b26181fSAndroid Build Coastguard Worker } 664*8b26181fSAndroid Build Coastguard Worker ; 665*8b26181fSAndroid Build Coastguard Worker 666*8b26181fSAndroid Build Coastguard Workersubtype: NUM { if (($1 & (~IEEE80211_FC0_SUBTYPE_MASK)) != 0) { 667*8b26181fSAndroid Build Coastguard Worker bpf_set_error(cstate, "invalid 802.11 subtype value 0x%02x", $1); 668*8b26181fSAndroid Build Coastguard Worker YYABORT; 669*8b26181fSAndroid Build Coastguard Worker } 670*8b26181fSAndroid Build Coastguard Worker $$ = (int)$1; 671*8b26181fSAndroid Build Coastguard Worker } 672*8b26181fSAndroid Build Coastguard Worker | ID { const struct tok *types = NULL; 673*8b26181fSAndroid Build Coastguard Worker int i; 674*8b26181fSAndroid Build Coastguard Worker CHECK_PTR_VAL($1); 675*8b26181fSAndroid Build Coastguard Worker for (i = 0;; i++) { 676*8b26181fSAndroid Build Coastguard Worker if (ieee80211_type_subtypes[i].tok == NULL) { 677*8b26181fSAndroid Build Coastguard Worker /* Ran out of types */ 678*8b26181fSAndroid Build Coastguard Worker bpf_set_error(cstate, "unknown 802.11 type"); 679*8b26181fSAndroid Build Coastguard Worker YYABORT; 680*8b26181fSAndroid Build Coastguard Worker } 681*8b26181fSAndroid Build Coastguard Worker if ($<i>-1 == ieee80211_type_subtypes[i].type) { 682*8b26181fSAndroid Build Coastguard Worker types = ieee80211_type_subtypes[i].tok; 683*8b26181fSAndroid Build Coastguard Worker break; 684*8b26181fSAndroid Build Coastguard Worker } 685*8b26181fSAndroid Build Coastguard Worker } 686*8b26181fSAndroid Build Coastguard Worker 687*8b26181fSAndroid Build Coastguard Worker $$ = str2tok($1, types); 688*8b26181fSAndroid Build Coastguard Worker if ($$ == -1) { 689*8b26181fSAndroid Build Coastguard Worker bpf_set_error(cstate, "unknown 802.11 subtype name \"%s\"", $1); 690*8b26181fSAndroid Build Coastguard Worker YYABORT; 691*8b26181fSAndroid Build Coastguard Worker } 692*8b26181fSAndroid Build Coastguard Worker } 693*8b26181fSAndroid Build Coastguard Worker ; 694*8b26181fSAndroid Build Coastguard Worker 695*8b26181fSAndroid Build Coastguard Workertype_subtype: ID { int i; 696*8b26181fSAndroid Build Coastguard Worker CHECK_PTR_VAL($1); 697*8b26181fSAndroid Build Coastguard Worker for (i = 0;; i++) { 698*8b26181fSAndroid Build Coastguard Worker if (ieee80211_type_subtypes[i].tok == NULL) { 699*8b26181fSAndroid Build Coastguard Worker /* Ran out of types */ 700*8b26181fSAndroid Build Coastguard Worker bpf_set_error(cstate, "unknown 802.11 type name"); 701*8b26181fSAndroid Build Coastguard Worker YYABORT; 702*8b26181fSAndroid Build Coastguard Worker } 703*8b26181fSAndroid Build Coastguard Worker $$ = str2tok($1, ieee80211_type_subtypes[i].tok); 704*8b26181fSAndroid Build Coastguard Worker if ($$ != -1) { 705*8b26181fSAndroid Build Coastguard Worker $$ |= ieee80211_type_subtypes[i].type; 706*8b26181fSAndroid Build Coastguard Worker break; 707*8b26181fSAndroid Build Coastguard Worker } 708*8b26181fSAndroid Build Coastguard Worker } 709*8b26181fSAndroid Build Coastguard Worker } 710*8b26181fSAndroid Build Coastguard Worker ; 711*8b26181fSAndroid Build Coastguard Worker 712*8b26181fSAndroid Build Coastguard Workerpllc: LLC { CHECK_PTR_VAL(($$ = gen_llc(cstate))); } 713*8b26181fSAndroid Build Coastguard Worker | LLC ID { CHECK_PTR_VAL($2); 714*8b26181fSAndroid Build Coastguard Worker if (pcap_strcasecmp($2, "i") == 0) { 715*8b26181fSAndroid Build Coastguard Worker CHECK_PTR_VAL(($$ = gen_llc_i(cstate))); 716*8b26181fSAndroid Build Coastguard Worker } else if (pcap_strcasecmp($2, "s") == 0) { 717*8b26181fSAndroid Build Coastguard Worker CHECK_PTR_VAL(($$ = gen_llc_s(cstate))); 718*8b26181fSAndroid Build Coastguard Worker } else if (pcap_strcasecmp($2, "u") == 0) { 719*8b26181fSAndroid Build Coastguard Worker CHECK_PTR_VAL(($$ = gen_llc_u(cstate))); 720*8b26181fSAndroid Build Coastguard Worker } else { 721*8b26181fSAndroid Build Coastguard Worker int subtype; 722*8b26181fSAndroid Build Coastguard Worker 723*8b26181fSAndroid Build Coastguard Worker subtype = str2tok($2, llc_s_subtypes); 724*8b26181fSAndroid Build Coastguard Worker if (subtype != -1) { 725*8b26181fSAndroid Build Coastguard Worker CHECK_PTR_VAL(($$ = gen_llc_s_subtype(cstate, subtype))); 726*8b26181fSAndroid Build Coastguard Worker } else { 727*8b26181fSAndroid Build Coastguard Worker subtype = str2tok($2, llc_u_subtypes); 728*8b26181fSAndroid Build Coastguard Worker if (subtype == -1) { 729*8b26181fSAndroid Build Coastguard Worker bpf_set_error(cstate, "unknown LLC type name \"%s\"", $2); 730*8b26181fSAndroid Build Coastguard Worker YYABORT; 731*8b26181fSAndroid Build Coastguard Worker } 732*8b26181fSAndroid Build Coastguard Worker CHECK_PTR_VAL(($$ = gen_llc_u_subtype(cstate, subtype))); 733*8b26181fSAndroid Build Coastguard Worker } 734*8b26181fSAndroid Build Coastguard Worker } 735*8b26181fSAndroid Build Coastguard Worker } 736*8b26181fSAndroid Build Coastguard Worker /* sigh, "rnr" is already a keyword for PF */ 737*8b26181fSAndroid Build Coastguard Worker | LLC PF_RNR { CHECK_PTR_VAL(($$ = gen_llc_s_subtype(cstate, LLC_RNR))); } 738*8b26181fSAndroid Build Coastguard Worker ; 739*8b26181fSAndroid Build Coastguard Worker 740*8b26181fSAndroid Build Coastguard Workerdir: NUM { $$ = (int)$1; } 741*8b26181fSAndroid Build Coastguard Worker | ID { CHECK_PTR_VAL($1); 742*8b26181fSAndroid Build Coastguard Worker if (pcap_strcasecmp($1, "nods") == 0) 743*8b26181fSAndroid Build Coastguard Worker $$ = IEEE80211_FC1_DIR_NODS; 744*8b26181fSAndroid Build Coastguard Worker else if (pcap_strcasecmp($1, "tods") == 0) 745*8b26181fSAndroid Build Coastguard Worker $$ = IEEE80211_FC1_DIR_TODS; 746*8b26181fSAndroid Build Coastguard Worker else if (pcap_strcasecmp($1, "fromds") == 0) 747*8b26181fSAndroid Build Coastguard Worker $$ = IEEE80211_FC1_DIR_FROMDS; 748*8b26181fSAndroid Build Coastguard Worker else if (pcap_strcasecmp($1, "dstods") == 0) 749*8b26181fSAndroid Build Coastguard Worker $$ = IEEE80211_FC1_DIR_DSTODS; 750*8b26181fSAndroid Build Coastguard Worker else { 751*8b26181fSAndroid Build Coastguard Worker bpf_set_error(cstate, "unknown 802.11 direction"); 752*8b26181fSAndroid Build Coastguard Worker YYABORT; 753*8b26181fSAndroid Build Coastguard Worker } 754*8b26181fSAndroid Build Coastguard Worker } 755*8b26181fSAndroid Build Coastguard Worker ; 756*8b26181fSAndroid Build Coastguard Worker 757*8b26181fSAndroid Build Coastguard Workerreason: NUM { $$ = $1; } 758*8b26181fSAndroid Build Coastguard Worker | ID { CHECK_PTR_VAL($1); CHECK_INT_VAL(($$ = pfreason_to_num(cstate, $1))); } 759*8b26181fSAndroid Build Coastguard Worker ; 760*8b26181fSAndroid Build Coastguard Worker 761*8b26181fSAndroid Build Coastguard Workeraction: ID { CHECK_PTR_VAL($1); CHECK_INT_VAL(($$ = pfaction_to_num(cstate, $1))); } 762*8b26181fSAndroid Build Coastguard Worker ; 763*8b26181fSAndroid Build Coastguard Worker 764*8b26181fSAndroid Build Coastguard Workerrelop: '>' { $$ = BPF_JGT; } 765*8b26181fSAndroid Build Coastguard Worker | GEQ { $$ = BPF_JGE; } 766*8b26181fSAndroid Build Coastguard Worker | '=' { $$ = BPF_JEQ; } 767*8b26181fSAndroid Build Coastguard Worker ; 768*8b26181fSAndroid Build Coastguard Workerirelop: LEQ { $$ = BPF_JGT; } 769*8b26181fSAndroid Build Coastguard Worker | '<' { $$ = BPF_JGE; } 770*8b26181fSAndroid Build Coastguard Worker | NEQ { $$ = BPF_JEQ; } 771*8b26181fSAndroid Build Coastguard Worker ; 772*8b26181fSAndroid Build Coastguard Workerarth: pnum { CHECK_PTR_VAL(($$ = gen_loadi(cstate, $1))); } 773*8b26181fSAndroid Build Coastguard Worker | narth 774*8b26181fSAndroid Build Coastguard Worker ; 775*8b26181fSAndroid Build Coastguard Workernarth: pname '[' arth ']' { CHECK_PTR_VAL(($$ = gen_load(cstate, $1, $3, 1))); } 776*8b26181fSAndroid Build Coastguard Worker | pname '[' arth ':' NUM ']' { CHECK_PTR_VAL(($$ = gen_load(cstate, $1, $3, $5))); } 777*8b26181fSAndroid Build Coastguard Worker | arth '+' arth { CHECK_PTR_VAL(($$ = gen_arth(cstate, BPF_ADD, $1, $3))); } 778*8b26181fSAndroid Build Coastguard Worker | arth '-' arth { CHECK_PTR_VAL(($$ = gen_arth(cstate, BPF_SUB, $1, $3))); } 779*8b26181fSAndroid Build Coastguard Worker | arth '*' arth { CHECK_PTR_VAL(($$ = gen_arth(cstate, BPF_MUL, $1, $3))); } 780*8b26181fSAndroid Build Coastguard Worker | arth '/' arth { CHECK_PTR_VAL(($$ = gen_arth(cstate, BPF_DIV, $1, $3))); } 781*8b26181fSAndroid Build Coastguard Worker | arth '%' arth { CHECK_PTR_VAL(($$ = gen_arth(cstate, BPF_MOD, $1, $3))); } 782*8b26181fSAndroid Build Coastguard Worker | arth '&' arth { CHECK_PTR_VAL(($$ = gen_arth(cstate, BPF_AND, $1, $3))); } 783*8b26181fSAndroid Build Coastguard Worker | arth '|' arth { CHECK_PTR_VAL(($$ = gen_arth(cstate, BPF_OR, $1, $3))); } 784*8b26181fSAndroid Build Coastguard Worker | arth '^' arth { CHECK_PTR_VAL(($$ = gen_arth(cstate, BPF_XOR, $1, $3))); } 785*8b26181fSAndroid Build Coastguard Worker | arth LSH arth { CHECK_PTR_VAL(($$ = gen_arth(cstate, BPF_LSH, $1, $3))); } 786*8b26181fSAndroid Build Coastguard Worker | arth RSH arth { CHECK_PTR_VAL(($$ = gen_arth(cstate, BPF_RSH, $1, $3))); } 787*8b26181fSAndroid Build Coastguard Worker | '-' arth %prec UMINUS { CHECK_PTR_VAL(($$ = gen_neg(cstate, $2))); } 788*8b26181fSAndroid Build Coastguard Worker | paren narth ')' { $$ = $2; } 789*8b26181fSAndroid Build Coastguard Worker | LEN { CHECK_PTR_VAL(($$ = gen_loadlen(cstate))); } 790*8b26181fSAndroid Build Coastguard Worker ; 791*8b26181fSAndroid Build Coastguard Workerbyteop: '&' { $$ = '&'; } 792*8b26181fSAndroid Build Coastguard Worker | '|' { $$ = '|'; } 793*8b26181fSAndroid Build Coastguard Worker | '<' { $$ = '<'; } 794*8b26181fSAndroid Build Coastguard Worker | '>' { $$ = '>'; } 795*8b26181fSAndroid Build Coastguard Worker | '=' { $$ = '='; } 796*8b26181fSAndroid Build Coastguard Worker ; 797*8b26181fSAndroid Build Coastguard Workerpnum: NUM 798*8b26181fSAndroid Build Coastguard Worker | paren pnum ')' { $$ = $2; } 799*8b26181fSAndroid Build Coastguard Worker ; 800*8b26181fSAndroid Build Coastguard Workeratmtype: LANE { $$ = A_LANE; } 801*8b26181fSAndroid Build Coastguard Worker | METAC { $$ = A_METAC; } 802*8b26181fSAndroid Build Coastguard Worker | BCC { $$ = A_BCC; } 803*8b26181fSAndroid Build Coastguard Worker | OAMF4EC { $$ = A_OAMF4EC; } 804*8b26181fSAndroid Build Coastguard Worker | OAMF4SC { $$ = A_OAMF4SC; } 805*8b26181fSAndroid Build Coastguard Worker | SC { $$ = A_SC; } 806*8b26181fSAndroid Build Coastguard Worker | ILMIC { $$ = A_ILMIC; } 807*8b26181fSAndroid Build Coastguard Worker ; 808*8b26181fSAndroid Build Coastguard Workeratmmultitype: OAM { $$ = A_OAM; } 809*8b26181fSAndroid Build Coastguard Worker | OAMF4 { $$ = A_OAMF4; } 810*8b26181fSAndroid Build Coastguard Worker | CONNECTMSG { $$ = A_CONNECTMSG; } 811*8b26181fSAndroid Build Coastguard Worker | METACONNECT { $$ = A_METACONNECT; } 812*8b26181fSAndroid Build Coastguard Worker ; 813*8b26181fSAndroid Build Coastguard Worker /* ATM field types quantifier */ 814*8b26181fSAndroid Build Coastguard Workeratmfield: VPI { $$.atmfieldtype = A_VPI; } 815*8b26181fSAndroid Build Coastguard Worker | VCI { $$.atmfieldtype = A_VCI; } 816*8b26181fSAndroid Build Coastguard Worker ; 817*8b26181fSAndroid Build Coastguard Workeratmvalue: atmfieldvalue 818*8b26181fSAndroid Build Coastguard Worker | relop NUM { CHECK_PTR_VAL(($$.b = gen_atmfield_code(cstate, $<blk>0.atmfieldtype, $2, $1, 0))); } 819*8b26181fSAndroid Build Coastguard Worker | irelop NUM { CHECK_PTR_VAL(($$.b = gen_atmfield_code(cstate, $<blk>0.atmfieldtype, $2, $1, 1))); } 820*8b26181fSAndroid Build Coastguard Worker | paren atmlistvalue ')' { $$.b = $2.b; $$.q = qerr; } 821*8b26181fSAndroid Build Coastguard Worker ; 822*8b26181fSAndroid Build Coastguard Workeratmfieldvalue: NUM { 823*8b26181fSAndroid Build Coastguard Worker $$.atmfieldtype = $<blk>0.atmfieldtype; 824*8b26181fSAndroid Build Coastguard Worker if ($$.atmfieldtype == A_VPI || 825*8b26181fSAndroid Build Coastguard Worker $$.atmfieldtype == A_VCI) 826*8b26181fSAndroid Build Coastguard Worker CHECK_PTR_VAL(($$.b = gen_atmfield_code(cstate, $$.atmfieldtype, $1, BPF_JEQ, 0))); 827*8b26181fSAndroid Build Coastguard Worker } 828*8b26181fSAndroid Build Coastguard Worker ; 829*8b26181fSAndroid Build Coastguard Workeratmlistvalue: atmfieldvalue 830*8b26181fSAndroid Build Coastguard Worker | atmlistvalue or atmfieldvalue { gen_or($1.b, $3.b); $$ = $3; } 831*8b26181fSAndroid Build Coastguard Worker ; 832*8b26181fSAndroid Build Coastguard Worker /* MTP2 types quantifier */ 833*8b26181fSAndroid Build Coastguard Workermtp2type: FISU { $$ = M_FISU; } 834*8b26181fSAndroid Build Coastguard Worker | LSSU { $$ = M_LSSU; } 835*8b26181fSAndroid Build Coastguard Worker | MSU { $$ = M_MSU; } 836*8b26181fSAndroid Build Coastguard Worker | HFISU { $$ = MH_FISU; } 837*8b26181fSAndroid Build Coastguard Worker | HLSSU { $$ = MH_LSSU; } 838*8b26181fSAndroid Build Coastguard Worker | HMSU { $$ = MH_MSU; } 839*8b26181fSAndroid Build Coastguard Worker ; 840*8b26181fSAndroid Build Coastguard Worker /* MTP3 field types quantifier */ 841*8b26181fSAndroid Build Coastguard Workermtp3field: SIO { $$.mtp3fieldtype = M_SIO; } 842*8b26181fSAndroid Build Coastguard Worker | OPC { $$.mtp3fieldtype = M_OPC; } 843*8b26181fSAndroid Build Coastguard Worker | DPC { $$.mtp3fieldtype = M_DPC; } 844*8b26181fSAndroid Build Coastguard Worker | SLS { $$.mtp3fieldtype = M_SLS; } 845*8b26181fSAndroid Build Coastguard Worker | HSIO { $$.mtp3fieldtype = MH_SIO; } 846*8b26181fSAndroid Build Coastguard Worker | HOPC { $$.mtp3fieldtype = MH_OPC; } 847*8b26181fSAndroid Build Coastguard Worker | HDPC { $$.mtp3fieldtype = MH_DPC; } 848*8b26181fSAndroid Build Coastguard Worker | HSLS { $$.mtp3fieldtype = MH_SLS; } 849*8b26181fSAndroid Build Coastguard Worker ; 850*8b26181fSAndroid Build Coastguard Workermtp3value: mtp3fieldvalue 851*8b26181fSAndroid Build Coastguard Worker | relop NUM { CHECK_PTR_VAL(($$.b = gen_mtp3field_code(cstate, $<blk>0.mtp3fieldtype, $2, $1, 0))); } 852*8b26181fSAndroid Build Coastguard Worker | irelop NUM { CHECK_PTR_VAL(($$.b = gen_mtp3field_code(cstate, $<blk>0.mtp3fieldtype, $2, $1, 1))); } 853*8b26181fSAndroid Build Coastguard Worker | paren mtp3listvalue ')' { $$.b = $2.b; $$.q = qerr; } 854*8b26181fSAndroid Build Coastguard Worker ; 855*8b26181fSAndroid Build Coastguard Workermtp3fieldvalue: NUM { 856*8b26181fSAndroid Build Coastguard Worker $$.mtp3fieldtype = $<blk>0.mtp3fieldtype; 857*8b26181fSAndroid Build Coastguard Worker if ($$.mtp3fieldtype == M_SIO || 858*8b26181fSAndroid Build Coastguard Worker $$.mtp3fieldtype == M_OPC || 859*8b26181fSAndroid Build Coastguard Worker $$.mtp3fieldtype == M_DPC || 860*8b26181fSAndroid Build Coastguard Worker $$.mtp3fieldtype == M_SLS || 861*8b26181fSAndroid Build Coastguard Worker $$.mtp3fieldtype == MH_SIO || 862*8b26181fSAndroid Build Coastguard Worker $$.mtp3fieldtype == MH_OPC || 863*8b26181fSAndroid Build Coastguard Worker $$.mtp3fieldtype == MH_DPC || 864*8b26181fSAndroid Build Coastguard Worker $$.mtp3fieldtype == MH_SLS) 865*8b26181fSAndroid Build Coastguard Worker CHECK_PTR_VAL(($$.b = gen_mtp3field_code(cstate, $$.mtp3fieldtype, $1, BPF_JEQ, 0))); 866*8b26181fSAndroid Build Coastguard Worker } 867*8b26181fSAndroid Build Coastguard Worker ; 868*8b26181fSAndroid Build Coastguard Workermtp3listvalue: mtp3fieldvalue 869*8b26181fSAndroid Build Coastguard Worker | mtp3listvalue or mtp3fieldvalue { gen_or($1.b, $3.b); $$ = $3; } 870*8b26181fSAndroid Build Coastguard Worker ; 871*8b26181fSAndroid Build Coastguard Worker%% 872