1*8b26181fSAndroid Build Coastguard Worker %top { 2*8b26181fSAndroid Build Coastguard Worker /* Must come first for _LARGE_FILE_API on AIX. */ 3*8b26181fSAndroid Build Coastguard Worker #ifdef HAVE_CONFIG_H 4*8b26181fSAndroid Build Coastguard Worker #include <config.h> 5*8b26181fSAndroid Build Coastguard Worker #endif 6*8b26181fSAndroid Build Coastguard Worker 7*8b26181fSAndroid Build Coastguard Worker /* 8*8b26181fSAndroid Build Coastguard Worker * Must come first to avoid warnings on Windows. 9*8b26181fSAndroid Build Coastguard Worker * 10*8b26181fSAndroid Build Coastguard Worker * Flex-generated scanners may only include <inttypes.h> if __STDC_VERSION__ 11*8b26181fSAndroid Build Coastguard Worker * is defined with a value >= 199901, meaning "full C99", and MSVC may not 12*8b26181fSAndroid Build Coastguard Worker * define it with that value, because it isn't 100% C99-compliant, even 13*8b26181fSAndroid Build Coastguard Worker * though it has an <inttypes.h> capable of defining everything the Flex 14*8b26181fSAndroid Build Coastguard Worker * scanner needs. 15*8b26181fSAndroid Build Coastguard Worker * 16*8b26181fSAndroid Build Coastguard Worker * We, however, will include it if we know we have an MSVC version that has 17*8b26181fSAndroid Build Coastguard Worker * it; this means that we may define the INTn_MAX and UINTn_MAX values in 18*8b26181fSAndroid Build Coastguard Worker * scanner.c, and then include <stdint.h>, which may define them differently 19*8b26181fSAndroid Build Coastguard Worker * (same value, but different string of characters), causing compiler warnings. 20*8b26181fSAndroid Build Coastguard Worker * 21*8b26181fSAndroid Build Coastguard Worker * If we include it here, and they're defined, that'll prevent scanner.c 22*8b26181fSAndroid Build Coastguard Worker * from defining them. So we include <pcap/pcap-inttypes.h>, to get 23*8b26181fSAndroid Build Coastguard Worker * <inttypes.h> if we have it. 24*8b26181fSAndroid Build Coastguard Worker */ 25*8b26181fSAndroid Build Coastguard Worker #include <pcap/pcap-inttypes.h> 26*8b26181fSAndroid Build Coastguard Worker 27*8b26181fSAndroid Build Coastguard Worker /* 28*8b26181fSAndroid Build Coastguard Worker * grammar.h requires gencode.h and sometimes breaks in a polluted namespace 29*8b26181fSAndroid Build Coastguard Worker * (see ftmacros.h), so include it early. 30*8b26181fSAndroid Build Coastguard Worker */ 31*8b26181fSAndroid Build Coastguard Worker #include "gencode.h" 32*8b26181fSAndroid Build Coastguard Worker #include "grammar.h" 33*8b26181fSAndroid Build Coastguard Worker 34*8b26181fSAndroid Build Coastguard Worker #include "diag-control.h" 35*8b26181fSAndroid Build Coastguard Worker } 36*8b26181fSAndroid Build Coastguard Worker 37*8b26181fSAndroid Build Coastguard Worker /* 38*8b26181fSAndroid Build Coastguard Worker * We want a reentrant scanner. 39*8b26181fSAndroid Build Coastguard Worker */ 40*8b26181fSAndroid Build Coastguard Worker %option reentrant 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 %option extra-type="compiler_state_t *" 46*8b26181fSAndroid Build Coastguard Worker 47*8b26181fSAndroid Build Coastguard Worker /* 48*8b26181fSAndroid Build Coastguard Worker * We don't use input, so don't generate code for it. 49*8b26181fSAndroid Build Coastguard Worker */ 50*8b26181fSAndroid Build Coastguard Worker %option noinput 51*8b26181fSAndroid Build Coastguard Worker 52*8b26181fSAndroid Build Coastguard Worker /* 53*8b26181fSAndroid Build Coastguard Worker * We don't use unput, so don't generate code for it. 54*8b26181fSAndroid Build Coastguard Worker */ 55*8b26181fSAndroid Build Coastguard Worker %option nounput 56*8b26181fSAndroid Build Coastguard Worker 57*8b26181fSAndroid Build Coastguard Worker /* 58*8b26181fSAndroid Build Coastguard Worker * We don't read from the terminal. 59*8b26181fSAndroid Build Coastguard Worker */ 60*8b26181fSAndroid Build Coastguard Worker %option never-interactive 61*8b26181fSAndroid Build Coastguard Worker 62*8b26181fSAndroid Build Coastguard Worker /* 63*8b26181fSAndroid Build Coastguard Worker * We want to stop processing when we get to the end of the input. 64*8b26181fSAndroid Build Coastguard Worker */ 65*8b26181fSAndroid Build Coastguard Worker %option noyywrap 66*8b26181fSAndroid Build Coastguard Worker 67*8b26181fSAndroid Build Coastguard Worker /* 68*8b26181fSAndroid Build Coastguard Worker * We want to generate code that can be used by a reentrant parser 69*8b26181fSAndroid Build Coastguard Worker * generated by Bison or Berkeley YACC. 70*8b26181fSAndroid Build Coastguard Worker */ 71*8b26181fSAndroid Build Coastguard Worker %option bison-bridge 72*8b26181fSAndroid Build Coastguard Worker 73*8b26181fSAndroid Build Coastguard Worker %{ 74*8b26181fSAndroid Build Coastguard Worker /* 75*8b26181fSAndroid Build Coastguard Worker * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 76*8b26181fSAndroid Build Coastguard Worker * The Regents of the University of California. All rights reserved. 77*8b26181fSAndroid Build Coastguard Worker * 78*8b26181fSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 79*8b26181fSAndroid Build Coastguard Worker * modification, are permitted provided that: (1) source code distributions 80*8b26181fSAndroid Build Coastguard Worker * retain the above copyright notice and this paragraph in its entirety, (2) 81*8b26181fSAndroid Build Coastguard Worker * distributions including binary code include the above copyright notice and 82*8b26181fSAndroid Build Coastguard Worker * this paragraph in its entirety in the documentation or other materials 83*8b26181fSAndroid Build Coastguard Worker * provided with the distribution, and (3) all advertising materials mentioning 84*8b26181fSAndroid Build Coastguard Worker * features or use of this software display the following acknowledgement: 85*8b26181fSAndroid Build Coastguard Worker * ``This product includes software developed by the University of California, 86*8b26181fSAndroid Build Coastguard Worker * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 87*8b26181fSAndroid Build Coastguard Worker * the University nor the names of its contributors may be used to endorse 88*8b26181fSAndroid Build Coastguard Worker * or promote products derived from this software without specific prior 89*8b26181fSAndroid Build Coastguard Worker * written permission. 90*8b26181fSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 91*8b26181fSAndroid Build Coastguard Worker * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 92*8b26181fSAndroid Build Coastguard Worker * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 93*8b26181fSAndroid Build Coastguard Worker */ 94*8b26181fSAndroid Build Coastguard Worker 95*8b26181fSAndroid Build Coastguard Worker #include <string.h> 96*8b26181fSAndroid Build Coastguard Worker 97*8b26181fSAndroid Build Coastguard Worker #include "pcap-int.h" 98*8b26181fSAndroid Build Coastguard Worker 99*8b26181fSAndroid Build Coastguard Worker /* 100*8b26181fSAndroid Build Coastguard Worker * Earlier versions of Flex don't declare these, so we declare them 101*8b26181fSAndroid Build Coastguard Worker * ourselves to squelch warnings. 102*8b26181fSAndroid Build Coastguard Worker */ 103*8b26181fSAndroid Build Coastguard Worker int pcap_get_column(yyscan_t); 104*8b26181fSAndroid Build Coastguard Worker void pcap_set_column(int, yyscan_t); 105*8b26181fSAndroid Build Coastguard Worker 106*8b26181fSAndroid Build Coastguard Worker #ifdef INET6 107*8b26181fSAndroid Build Coastguard Worker 108*8b26181fSAndroid Build Coastguard Worker #ifdef _WIN32 109*8b26181fSAndroid Build Coastguard Worker #include <winsock2.h> 110*8b26181fSAndroid Build Coastguard Worker #include <ws2tcpip.h> 111*8b26181fSAndroid Build Coastguard Worker /* 112*8b26181fSAndroid Build Coastguard Worker * To quote the MSDN page for getaddrinfo() at 113*8b26181fSAndroid Build Coastguard Worker * 114*8b26181fSAndroid Build Coastguard Worker * https://msdn.microsoft.com/en-us/library/windows/desktop/ms738520(v=vs.85).aspx 115*8b26181fSAndroid Build Coastguard Worker * 116*8b26181fSAndroid Build Coastguard Worker * "Support for getaddrinfo on Windows 2000 and older versions 117*8b26181fSAndroid Build Coastguard Worker * The getaddrinfo function was added to the Ws2_32.dll on Windows XP and 118*8b26181fSAndroid Build Coastguard Worker * later. To execute an application that uses this function on earlier 119*8b26181fSAndroid Build Coastguard Worker * versions of Windows, then you need to include the Ws2tcpip.h and 120*8b26181fSAndroid Build Coastguard Worker * Wspiapi.h files. When the Wspiapi.h include file is added, the 121*8b26181fSAndroid Build Coastguard Worker * getaddrinfo function is defined to the WspiapiGetAddrInfo inline 122*8b26181fSAndroid Build Coastguard Worker * function in the Wspiapi.h file. At runtime, the WspiapiGetAddrInfo 123*8b26181fSAndroid Build Coastguard Worker * function is implemented in such a way that if the Ws2_32.dll or the 124*8b26181fSAndroid Build Coastguard Worker * Wship6.dll (the file containing getaddrinfo in the IPv6 Technology 125*8b26181fSAndroid Build Coastguard Worker * Preview for Windows 2000) does not include getaddrinfo, then a 126*8b26181fSAndroid Build Coastguard Worker * version of getaddrinfo is implemented inline based on code in the 127*8b26181fSAndroid Build Coastguard Worker * Wspiapi.h header file. This inline code will be used on older Windows 128*8b26181fSAndroid Build Coastguard Worker * platforms that do not natively support the getaddrinfo function." 129*8b26181fSAndroid Build Coastguard Worker * 130*8b26181fSAndroid Build Coastguard Worker * We use getaddrinfo(), so we include Wspiapi.h here. 131*8b26181fSAndroid Build Coastguard Worker */ 132*8b26181fSAndroid Build Coastguard Worker #include <wspiapi.h> 133*8b26181fSAndroid Build Coastguard Worker #else /* _WIN32 */ 134*8b26181fSAndroid Build Coastguard Worker #include <sys/socket.h> /* for "struct sockaddr" in "struct addrinfo" */ 135*8b26181fSAndroid Build Coastguard Worker #include <netdb.h> /* for "struct addrinfo" */ 136*8b26181fSAndroid Build Coastguard Worker #endif /* _WIN32 */ 137*8b26181fSAndroid Build Coastguard Worker 138*8b26181fSAndroid Build Coastguard Worker /* Workaround for AIX 4.3 */ 139*8b26181fSAndroid Build Coastguard Worker #if !defined(AI_NUMERICHOST) 140*8b26181fSAndroid Build Coastguard Worker #define AI_NUMERICHOST 0x04 141*8b26181fSAndroid Build Coastguard Worker #endif 142*8b26181fSAndroid Build Coastguard Worker 143*8b26181fSAndroid Build Coastguard Worker #endif /*INET6*/ 144*8b26181fSAndroid Build Coastguard Worker 145*8b26181fSAndroid Build Coastguard Worker #include <pcap/namedb.h> 146*8b26181fSAndroid Build Coastguard Worker #include "grammar.h" 147*8b26181fSAndroid Build Coastguard Worker 148*8b26181fSAndroid Build Coastguard Worker #ifdef HAVE_OS_PROTO_H 149*8b26181fSAndroid Build Coastguard Worker #include "os-proto.h" 150*8b26181fSAndroid Build Coastguard Worker #endif 151*8b26181fSAndroid Build Coastguard Worker 152*8b26181fSAndroid Build Coastguard Worker static int stou(char *, YYSTYPE *, compiler_state_t *); 153*8b26181fSAndroid Build Coastguard Worker 154*8b26181fSAndroid Build Coastguard Worker /* 155*8b26181fSAndroid Build Coastguard Worker * Disable diagnostics in the code generated by Flex. 156*8b26181fSAndroid Build Coastguard Worker */ 157*8b26181fSAndroid Build Coastguard Worker DIAG_OFF_FLEX 158*8b26181fSAndroid Build Coastguard Worker 159*8b26181fSAndroid Build Coastguard Worker %} 160*8b26181fSAndroid Build Coastguard Worker 161*8b26181fSAndroid Build Coastguard Worker N ([0-9]+|(0X|0x)[0-9A-Fa-f]+) 162*8b26181fSAndroid Build Coastguard Worker B ([0-9A-Fa-f][0-9A-Fa-f]?) 163*8b26181fSAndroid Build Coastguard Worker B2 ([0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]) 164*8b26181fSAndroid Build Coastguard Worker W ([0-9A-Fa-f][0-9A-Fa-f]?[0-9A-Fa-f]?[0-9A-Fa-f]?) 165*8b26181fSAndroid Build Coastguard Worker 166*8b26181fSAndroid Build Coastguard Worker %a 18400 167*8b26181fSAndroid Build Coastguard Worker %o 21500 168*8b26181fSAndroid Build Coastguard Worker %e 7600 169*8b26181fSAndroid Build Coastguard Worker %k 4550 170*8b26181fSAndroid Build Coastguard Worker %p 27600 171*8b26181fSAndroid Build Coastguard Worker %n 2000 172*8b26181fSAndroid Build Coastguard Worker 173*8b26181fSAndroid Build Coastguard Worker V680 {W}:{W}:{W}:{W}:{W}:{W}:{W}:{W} 174*8b26181fSAndroid Build Coastguard Worker 175*8b26181fSAndroid Build Coastguard Worker V670 ::{W}:{W}:{W}:{W}:{W}:{W}:{W} 176*8b26181fSAndroid Build Coastguard Worker V671 {W}::{W}:{W}:{W}:{W}:{W}:{W} 177*8b26181fSAndroid Build Coastguard Worker V672 {W}:{W}::{W}:{W}:{W}:{W}:{W} 178*8b26181fSAndroid Build Coastguard Worker V673 {W}:{W}:{W}::{W}:{W}:{W}:{W} 179*8b26181fSAndroid Build Coastguard Worker V674 {W}:{W}:{W}:{W}::{W}:{W}:{W} 180*8b26181fSAndroid Build Coastguard Worker V675 {W}:{W}:{W}:{W}:{W}::{W}:{W} 181*8b26181fSAndroid Build Coastguard Worker V676 {W}:{W}:{W}:{W}:{W}:{W}::{W} 182*8b26181fSAndroid Build Coastguard Worker V677 {W}:{W}:{W}:{W}:{W}:{W}:{W}:: 183*8b26181fSAndroid Build Coastguard Worker 184*8b26181fSAndroid Build Coastguard Worker V660 ::{W}:{W}:{W}:{W}:{W}:{W} 185*8b26181fSAndroid Build Coastguard Worker V661 {W}::{W}:{W}:{W}:{W}:{W} 186*8b26181fSAndroid Build Coastguard Worker V662 {W}:{W}::{W}:{W}:{W}:{W} 187*8b26181fSAndroid Build Coastguard Worker V663 {W}:{W}:{W}::{W}:{W}:{W} 188*8b26181fSAndroid Build Coastguard Worker V664 {W}:{W}:{W}:{W}::{W}:{W} 189*8b26181fSAndroid Build Coastguard Worker V665 {W}:{W}:{W}:{W}:{W}::{W} 190*8b26181fSAndroid Build Coastguard Worker V666 {W}:{W}:{W}:{W}:{W}:{W}:: 191*8b26181fSAndroid Build Coastguard Worker 192*8b26181fSAndroid Build Coastguard Worker V650 ::{W}:{W}:{W}:{W}:{W} 193*8b26181fSAndroid Build Coastguard Worker V651 {W}::{W}:{W}:{W}:{W} 194*8b26181fSAndroid Build Coastguard Worker V652 {W}:{W}::{W}:{W}:{W} 195*8b26181fSAndroid Build Coastguard Worker V653 {W}:{W}:{W}::{W}:{W} 196*8b26181fSAndroid Build Coastguard Worker V654 {W}:{W}:{W}:{W}::{W} 197*8b26181fSAndroid Build Coastguard Worker V655 {W}:{W}:{W}:{W}:{W}:: 198*8b26181fSAndroid Build Coastguard Worker 199*8b26181fSAndroid Build Coastguard Worker V640 ::{W}:{W}:{W}:{W} 200*8b26181fSAndroid Build Coastguard Worker V641 {W}::{W}:{W}:{W} 201*8b26181fSAndroid Build Coastguard Worker V642 {W}:{W}::{W}:{W} 202*8b26181fSAndroid Build Coastguard Worker V643 {W}:{W}:{W}::{W} 203*8b26181fSAndroid Build Coastguard Worker V644 {W}:{W}:{W}:{W}:: 204*8b26181fSAndroid Build Coastguard Worker 205*8b26181fSAndroid Build Coastguard Worker V630 ::{W}:{W}:{W} 206*8b26181fSAndroid Build Coastguard Worker V631 {W}::{W}:{W} 207*8b26181fSAndroid Build Coastguard Worker V632 {W}:{W}::{W} 208*8b26181fSAndroid Build Coastguard Worker V633 {W}:{W}:{W}:: 209*8b26181fSAndroid Build Coastguard Worker 210*8b26181fSAndroid Build Coastguard Worker V620 ::{W}:{W} 211*8b26181fSAndroid Build Coastguard Worker V621 {W}::{W} 212*8b26181fSAndroid Build Coastguard Worker V622 {W}:{W}:: 213*8b26181fSAndroid Build Coastguard Worker 214*8b26181fSAndroid Build Coastguard Worker V610 ::{W} 215*8b26181fSAndroid Build Coastguard Worker V611 {W}:: 216*8b26181fSAndroid Build Coastguard Worker 217*8b26181fSAndroid Build Coastguard Worker V600 :: 218*8b26181fSAndroid Build Coastguard Worker 219*8b26181fSAndroid Build Coastguard Worker V6604 {W}:{W}:{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N} 220*8b26181fSAndroid Build Coastguard Worker 221*8b26181fSAndroid Build Coastguard Worker V6504 ::{W}:{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N} 222*8b26181fSAndroid Build Coastguard Worker V6514 {W}::{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N} 223*8b26181fSAndroid Build Coastguard Worker V6524 {W}:{W}::{W}:{W}:{W}:{N}\.{N}\.{N}\.{N} 224*8b26181fSAndroid Build Coastguard Worker V6534 {W}:{W}:{W}::{W}:{W}:{N}\.{N}\.{N}\.{N} 225*8b26181fSAndroid Build Coastguard Worker V6544 {W}:{W}:{W}:{W}::{W}:{N}\.{N}\.{N}\.{N} 226*8b26181fSAndroid Build Coastguard Worker V6554 {W}:{W}:{W}:{W}:{W}::{N}\.{N}\.{N}\.{N} 227*8b26181fSAndroid Build Coastguard Worker 228*8b26181fSAndroid Build Coastguard Worker V6404 ::{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N} 229*8b26181fSAndroid Build Coastguard Worker V6414 {W}::{W}:{W}:{W}:{N}\.{N}\.{N}\.{N} 230*8b26181fSAndroid Build Coastguard Worker V6424 {W}:{W}::{W}:{W}:{N}\.{N}\.{N}\.{N} 231*8b26181fSAndroid Build Coastguard Worker V6434 {W}:{W}:{W}::{W}:{N}\.{N}\.{N}\.{N} 232*8b26181fSAndroid Build Coastguard Worker V6444 {W}:{W}:{W}:{W}::{N}\.{N}\.{N}\.{N} 233*8b26181fSAndroid Build Coastguard Worker 234*8b26181fSAndroid Build Coastguard Worker V6304 ::{W}:{W}:{W}:{N}\.{N}\.{N}\.{N} 235*8b26181fSAndroid Build Coastguard Worker V6314 {W}::{W}:{W}:{N}\.{N}\.{N}\.{N} 236*8b26181fSAndroid Build Coastguard Worker V6324 {W}:{W}::{W}:{N}\.{N}\.{N}\.{N} 237*8b26181fSAndroid Build Coastguard Worker V6334 {W}:{W}:{W}::{N}\.{N}\.{N}\.{N} 238*8b26181fSAndroid Build Coastguard Worker 239*8b26181fSAndroid Build Coastguard Worker V6204 ::{W}:{W}:{N}\.{N}\.{N}\.{N} 240*8b26181fSAndroid Build Coastguard Worker V6214 {W}::{W}:{N}\.{N}\.{N}\.{N} 241*8b26181fSAndroid Build Coastguard Worker V6224 {W}:{W}::{N}\.{N}\.{N}\.{N} 242*8b26181fSAndroid Build Coastguard Worker 243*8b26181fSAndroid Build Coastguard Worker V6104 ::{W}:{N}\.{N}\.{N}\.{N} 244*8b26181fSAndroid Build Coastguard Worker V6114 {W}::{N}\.{N}\.{N}\.{N} 245*8b26181fSAndroid Build Coastguard Worker 246*8b26181fSAndroid Build Coastguard Worker V6004 ::{N}\.{N}\.{N}\.{N} 247*8b26181fSAndroid Build Coastguard Worker 248*8b26181fSAndroid Build Coastguard Worker 249*8b26181fSAndroid Build Coastguard Worker V6 ({V680}|{V670}|{V671}|{V672}|{V673}|{V674}|{V675}|{V676}|{V677}|{V660}|{V661}|{V662}|{V663}|{V664}|{V665}|{V666}|{V650}|{V651}|{V652}|{V653}|{V654}|{V655}|{V640}|{V641}|{V642}|{V643}|{V644}|{V630}|{V631}|{V632}|{V633}|{V620}|{V621}|{V622}|{V610}|{V611}|{V600}|{V6604}|{V6504}|{V6514}|{V6524}|{V6534}|{V6544}|{V6554}|{V6404}|{V6414}|{V6424}|{V6434}|{V6444}|{V6304}|{V6314}|{V6324}|{V6334}|{V6204}|{V6214}|{V6224}|{V6104}|{V6114}|{V6004}) 250*8b26181fSAndroid Build Coastguard Worker 251*8b26181fSAndroid Build Coastguard Worker MAC ({B}:{B}:{B}:{B}:{B}:{B}|{B}\-{B}\-{B}\-{B}\-{B}\-{B}|{B}\.{B}\.{B}\.{B}\.{B}\.{B}|{B2}\.{B2}\.{B2}|{B2}{3}) 252*8b26181fSAndroid Build Coastguard Worker 253*8b26181fSAndroid Build Coastguard Worker 254*8b26181fSAndroid Build Coastguard Worker 255*8b26181fSAndroid Build Coastguard Worker %% 256*8b26181fSAndroid Build Coastguard Worker dst return DST; 257*8b26181fSAndroid Build Coastguard Worker src return SRC; 258*8b26181fSAndroid Build Coastguard Worker 259*8b26181fSAndroid Build Coastguard Worker link|ether|ppp|slip return LINK; 260*8b26181fSAndroid Build Coastguard Worker fddi|tr|wlan return LINK; 261*8b26181fSAndroid Build Coastguard Worker arp return ARP; 262*8b26181fSAndroid Build Coastguard Worker rarp return RARP; 263*8b26181fSAndroid Build Coastguard Worker ip return IP; 264*8b26181fSAndroid Build Coastguard Worker sctp return SCTP; 265*8b26181fSAndroid Build Coastguard Worker tcp return TCP; 266*8b26181fSAndroid Build Coastguard Worker udp return UDP; 267*8b26181fSAndroid Build Coastguard Worker icmp return ICMP; 268*8b26181fSAndroid Build Coastguard Worker igmp return IGMP; 269*8b26181fSAndroid Build Coastguard Worker igrp return IGRP; 270*8b26181fSAndroid Build Coastguard Worker pim return PIM; 271*8b26181fSAndroid Build Coastguard Worker vrrp return VRRP; 272*8b26181fSAndroid Build Coastguard Worker carp return CARP; 273*8b26181fSAndroid Build Coastguard Worker radio return RADIO; 274*8b26181fSAndroid Build Coastguard Worker 275*8b26181fSAndroid Build Coastguard Worker ip6 return IPV6; 276*8b26181fSAndroid Build Coastguard Worker icmp6 return ICMPV6; 277*8b26181fSAndroid Build Coastguard Worker ah return AH; 278*8b26181fSAndroid Build Coastguard Worker esp return ESP; 279*8b26181fSAndroid Build Coastguard Worker 280*8b26181fSAndroid Build Coastguard Worker atalk return ATALK; 281*8b26181fSAndroid Build Coastguard Worker aarp return AARP; 282*8b26181fSAndroid Build Coastguard Worker decnet return DECNET; 283*8b26181fSAndroid Build Coastguard Worker lat return LAT; 284*8b26181fSAndroid Build Coastguard Worker sca return SCA; 285*8b26181fSAndroid Build Coastguard Worker moprc return MOPRC; 286*8b26181fSAndroid Build Coastguard Worker mopdl return MOPDL; 287*8b26181fSAndroid Build Coastguard Worker 288*8b26181fSAndroid Build Coastguard Worker iso return ISO; 289*8b26181fSAndroid Build Coastguard Worker esis return ESIS; 290*8b26181fSAndroid Build Coastguard Worker es-is return ESIS; 291*8b26181fSAndroid Build Coastguard Worker isis return ISIS; 292*8b26181fSAndroid Build Coastguard Worker is-is return ISIS; 293*8b26181fSAndroid Build Coastguard Worker l1 return L1; 294*8b26181fSAndroid Build Coastguard Worker l2 return L2; 295*8b26181fSAndroid Build Coastguard Worker iih return IIH; 296*8b26181fSAndroid Build Coastguard Worker lsp return LSP; 297*8b26181fSAndroid Build Coastguard Worker snp return SNP; 298*8b26181fSAndroid Build Coastguard Worker csnp return CSNP; 299*8b26181fSAndroid Build Coastguard Worker psnp return PSNP; 300*8b26181fSAndroid Build Coastguard Worker 301*8b26181fSAndroid Build Coastguard Worker clnp return CLNP; 302*8b26181fSAndroid Build Coastguard Worker 303*8b26181fSAndroid Build Coastguard Worker stp return STP; 304*8b26181fSAndroid Build Coastguard Worker 305*8b26181fSAndroid Build Coastguard Worker ipx return IPX; 306*8b26181fSAndroid Build Coastguard Worker 307*8b26181fSAndroid Build Coastguard Worker netbeui return NETBEUI; 308*8b26181fSAndroid Build Coastguard Worker 309*8b26181fSAndroid Build Coastguard Worker host return HOST; 310*8b26181fSAndroid Build Coastguard Worker net return NET; 311*8b26181fSAndroid Build Coastguard Worker mask return NETMASK; 312*8b26181fSAndroid Build Coastguard Worker port return PORT; 313*8b26181fSAndroid Build Coastguard Worker portrange return PORTRANGE; 314*8b26181fSAndroid Build Coastguard Worker proto return PROTO; 315*8b26181fSAndroid Build Coastguard Worker protochain return PROTOCHAIN; 316*8b26181fSAndroid Build Coastguard Worker 317*8b26181fSAndroid Build Coastguard Worker gateway return GATEWAY; 318*8b26181fSAndroid Build Coastguard Worker 319*8b26181fSAndroid Build Coastguard Worker type return TYPE; 320*8b26181fSAndroid Build Coastguard Worker subtype return SUBTYPE; 321*8b26181fSAndroid Build Coastguard Worker direction|dir return DIR; 322*8b26181fSAndroid Build Coastguard Worker address1|addr1 return ADDR1; 323*8b26181fSAndroid Build Coastguard Worker address2|addr2 return ADDR2; 324*8b26181fSAndroid Build Coastguard Worker address3|addr3 return ADDR3; 325*8b26181fSAndroid Build Coastguard Worker address4|addr4 return ADDR4; 326*8b26181fSAndroid Build Coastguard Worker ra return RA; 327*8b26181fSAndroid Build Coastguard Worker ta return TA; 328*8b26181fSAndroid Build Coastguard Worker 329*8b26181fSAndroid Build Coastguard Worker less return LESS; 330*8b26181fSAndroid Build Coastguard Worker greater return GREATER; 331*8b26181fSAndroid Build Coastguard Worker byte return CBYTE; 332*8b26181fSAndroid Build Coastguard Worker broadcast return TK_BROADCAST; 333*8b26181fSAndroid Build Coastguard Worker multicast return TK_MULTICAST; 334*8b26181fSAndroid Build Coastguard Worker 335*8b26181fSAndroid Build Coastguard Worker and|"&&" return AND; 336*8b26181fSAndroid Build Coastguard Worker or|"||" return OR; 337*8b26181fSAndroid Build Coastguard Worker not return '!'; 338*8b26181fSAndroid Build Coastguard Worker 339*8b26181fSAndroid Build Coastguard Worker len|length return LEN; 340*8b26181fSAndroid Build Coastguard Worker inbound return INBOUND; 341*8b26181fSAndroid Build Coastguard Worker outbound return OUTBOUND; 342*8b26181fSAndroid Build Coastguard Worker 343*8b26181fSAndroid Build Coastguard Worker ifindex return IFINDEX; 344*8b26181fSAndroid Build Coastguard Worker 345*8b26181fSAndroid Build Coastguard Worker vlan return VLAN; 346*8b26181fSAndroid Build Coastguard Worker mpls return MPLS; 347*8b26181fSAndroid Build Coastguard Worker pppoed return PPPOED; 348*8b26181fSAndroid Build Coastguard Worker pppoes return PPPOES; 349*8b26181fSAndroid Build Coastguard Worker geneve return GENEVE; 350*8b26181fSAndroid Build Coastguard Worker 351*8b26181fSAndroid Build Coastguard Worker lane return LANE; 352*8b26181fSAndroid Build Coastguard Worker llc return LLC; 353*8b26181fSAndroid Build Coastguard Worker metac return METAC; 354*8b26181fSAndroid Build Coastguard Worker bcc return BCC; 355*8b26181fSAndroid Build Coastguard Worker oam return OAM; 356*8b26181fSAndroid Build Coastguard Worker oamf4 return OAMF4; 357*8b26181fSAndroid Build Coastguard Worker oamf4ec return OAMF4EC; 358*8b26181fSAndroid Build Coastguard Worker oamf4sc return OAMF4SC; 359*8b26181fSAndroid Build Coastguard Worker sc return SC; 360*8b26181fSAndroid Build Coastguard Worker ilmic return ILMIC; 361*8b26181fSAndroid Build Coastguard Worker vpi return VPI; 362*8b26181fSAndroid Build Coastguard Worker vci return VCI; 363*8b26181fSAndroid Build Coastguard Worker connectmsg return CONNECTMSG; 364*8b26181fSAndroid Build Coastguard Worker metaconnect return METACONNECT; 365*8b26181fSAndroid Build Coastguard Worker 366*8b26181fSAndroid Build Coastguard Worker on|ifname return PF_IFNAME; 367*8b26181fSAndroid Build Coastguard Worker rset|ruleset return PF_RSET; 368*8b26181fSAndroid Build Coastguard Worker rnr|rulenum return PF_RNR; 369*8b26181fSAndroid Build Coastguard Worker srnr|subrulenum return PF_SRNR; 370*8b26181fSAndroid Build Coastguard Worker reason return PF_REASON; 371*8b26181fSAndroid Build Coastguard Worker action return PF_ACTION; 372*8b26181fSAndroid Build Coastguard Worker 373*8b26181fSAndroid Build Coastguard Worker fisu return FISU; 374*8b26181fSAndroid Build Coastguard Worker lssu return LSSU; 375*8b26181fSAndroid Build Coastguard Worker lsu return LSSU; 376*8b26181fSAndroid Build Coastguard Worker msu return MSU; 377*8b26181fSAndroid Build Coastguard Worker hfisu return HFISU; 378*8b26181fSAndroid Build Coastguard Worker hlssu return HLSSU; 379*8b26181fSAndroid Build Coastguard Worker hmsu return HMSU; 380*8b26181fSAndroid Build Coastguard Worker sio return SIO; 381*8b26181fSAndroid Build Coastguard Worker opc return OPC; 382*8b26181fSAndroid Build Coastguard Worker dpc return DPC; 383*8b26181fSAndroid Build Coastguard Worker sls return SLS; 384*8b26181fSAndroid Build Coastguard Worker hsio return HSIO; 385*8b26181fSAndroid Build Coastguard Worker hopc return HOPC; 386*8b26181fSAndroid Build Coastguard Worker hdpc return HDPC; 387*8b26181fSAndroid Build Coastguard Worker hsls return HSLS; 388*8b26181fSAndroid Build Coastguard Worker 389*8b26181fSAndroid Build Coastguard Worker [ \r\n\t] ; 390*8b26181fSAndroid Build Coastguard Worker [+\-*/%:\[\]!<>()&|\^=] return yytext[0]; 391*8b26181fSAndroid Build Coastguard Worker ">=" return GEQ; 392*8b26181fSAndroid Build Coastguard Worker "<=" return LEQ; 393*8b26181fSAndroid Build Coastguard Worker "!=" return NEQ; 394*8b26181fSAndroid Build Coastguard Worker "==" return '='; 395*8b26181fSAndroid Build Coastguard Worker "<<" return LSH; 396*8b26181fSAndroid Build Coastguard Worker ">>" return RSH; 397*8b26181fSAndroid Build Coastguard Worker ${B} { yylval->s = sdup(yyextra, yytext); return AID; } 398*8b26181fSAndroid Build Coastguard Worker {MAC} { yylval->s = sdup(yyextra, yytext); return EID; } 399*8b26181fSAndroid Build Coastguard Worker {N} { return stou(yytext, yylval, yyextra); } 400*8b26181fSAndroid Build Coastguard Worker ({N}\.{N})|({N}\.{N}\.{N})|({N}\.{N}\.{N}\.{N}) { 401*8b26181fSAndroid Build Coastguard Worker yylval->s = sdup(yyextra, (char *)yytext); return HID; } 402*8b26181fSAndroid Build Coastguard Worker {V6} { 403*8b26181fSAndroid Build Coastguard Worker #ifdef INET6 404*8b26181fSAndroid Build Coastguard Worker struct addrinfo hints, *res; 405*8b26181fSAndroid Build Coastguard Worker memset(&hints, 0, sizeof(hints)); 406*8b26181fSAndroid Build Coastguard Worker hints.ai_family = AF_INET6; 407*8b26181fSAndroid Build Coastguard Worker hints.ai_flags = AI_NUMERICHOST; 408*8b26181fSAndroid Build Coastguard Worker if (getaddrinfo(yytext, NULL, &hints, &res)) { 409*8b26181fSAndroid Build Coastguard Worker bpf_set_error(yyextra, "bogus IPv6 address %s", yytext); 410*8b26181fSAndroid Build Coastguard Worker yylval->s = NULL; 411*8b26181fSAndroid Build Coastguard Worker } else { 412*8b26181fSAndroid Build Coastguard Worker freeaddrinfo(res); 413*8b26181fSAndroid Build Coastguard Worker yylval->s = sdup(yyextra, (char *)yytext); 414*8b26181fSAndroid Build Coastguard Worker } 415*8b26181fSAndroid Build Coastguard Worker #else 416*8b26181fSAndroid Build Coastguard Worker bpf_set_error(yyextra, "IPv6 address %s not supported", yytext); 417*8b26181fSAndroid Build Coastguard Worker yylval->s = NULL; 418*8b26181fSAndroid Build Coastguard Worker #endif /*INET6*/ 419*8b26181fSAndroid Build Coastguard Worker return HID6; 420*8b26181fSAndroid Build Coastguard Worker } 421*8b26181fSAndroid Build Coastguard Worker {B}:+({B}:+)+ { bpf_set_error(yyextra, "bogus ethernet address %s", yytext); yylval->s = NULL; return EID; } 422*8b26181fSAndroid Build Coastguard Worker icmptype { yylval->h = 0; return NUM; } 423*8b26181fSAndroid Build Coastguard Worker icmpcode { yylval->h = 1; return NUM; } 424*8b26181fSAndroid Build Coastguard Worker icmp-echoreply { yylval->h = 0; return NUM; } 425*8b26181fSAndroid Build Coastguard Worker icmp-unreach { yylval->h = 3; return NUM; } 426*8b26181fSAndroid Build Coastguard Worker icmp-sourcequench { yylval->h = 4; return NUM; } 427*8b26181fSAndroid Build Coastguard Worker icmp-redirect { yylval->h = 5; return NUM; } 428*8b26181fSAndroid Build Coastguard Worker icmp-echo { yylval->h = 8; return NUM; } 429*8b26181fSAndroid Build Coastguard Worker icmp-routeradvert { yylval->h = 9; return NUM; } 430*8b26181fSAndroid Build Coastguard Worker icmp-routersolicit { yylval->h = 10; return NUM; } 431*8b26181fSAndroid Build Coastguard Worker icmp-timxceed { yylval->h = 11; return NUM; } 432*8b26181fSAndroid Build Coastguard Worker icmp-paramprob { yylval->h = 12; return NUM; } 433*8b26181fSAndroid Build Coastguard Worker icmp-tstamp { yylval->h = 13; return NUM; } 434*8b26181fSAndroid Build Coastguard Worker icmp-tstampreply { yylval->h = 14; return NUM; } 435*8b26181fSAndroid Build Coastguard Worker icmp-ireq { yylval->h = 15; return NUM; } 436*8b26181fSAndroid Build Coastguard Worker icmp-ireqreply { yylval->h = 16; return NUM; } 437*8b26181fSAndroid Build Coastguard Worker icmp-maskreq { yylval->h = 17; return NUM; } 438*8b26181fSAndroid Build Coastguard Worker icmp-maskreply { yylval->h = 18; return NUM; } 439*8b26181fSAndroid Build Coastguard Worker 440*8b26181fSAndroid Build Coastguard Worker icmp6type { yylval->h = 0; return NUM; } 441*8b26181fSAndroid Build Coastguard Worker icmp6code { yylval->h = 1; return NUM; } 442*8b26181fSAndroid Build Coastguard Worker 443*8b26181fSAndroid Build Coastguard Worker icmp6-destinationunreach { yylval->h = 1; return NUM; } 444*8b26181fSAndroid Build Coastguard Worker icmp6-packettoobig { yylval->h = 2; return NUM; } 445*8b26181fSAndroid Build Coastguard Worker icmp6-timeexceeded { yylval->h = 3; return NUM; } 446*8b26181fSAndroid Build Coastguard Worker icmp6-parameterproblem { yylval->h = 4; return NUM; } 447*8b26181fSAndroid Build Coastguard Worker icmp6-echo { yylval->h = 128; return NUM; } 448*8b26181fSAndroid Build Coastguard Worker icmp6-echoreply { yylval->h = 129; return NUM; } 449*8b26181fSAndroid Build Coastguard Worker icmp6-multicastlistenerquery { yylval->h = 130; return NUM; } 450*8b26181fSAndroid Build Coastguard Worker icmp6-multicastlistenerreportv1 { yylval->h = 131; return NUM; } 451*8b26181fSAndroid Build Coastguard Worker icmp6-multicastlistenerdone { yylval->h = 132; return NUM; } 452*8b26181fSAndroid Build Coastguard Worker icmp6-routersolicit { yylval->h = 133; return NUM; } 453*8b26181fSAndroid Build Coastguard Worker icmp6-routeradvert { yylval->h = 134; return NUM; } 454*8b26181fSAndroid Build Coastguard Worker icmp6-neighborsolicit { yylval->h = 135; return NUM; } 455*8b26181fSAndroid Build Coastguard Worker icmp6-neighboradvert { yylval->h = 136; return NUM; } 456*8b26181fSAndroid Build Coastguard Worker icmp6-redirect { yylval->h = 137; return NUM; } 457*8b26181fSAndroid Build Coastguard Worker icmp6-routerrenum { yylval->h = 138; return NUM; } 458*8b26181fSAndroid Build Coastguard Worker icmp6-nodeinformationquery { yylval->h = 139; return NUM; } 459*8b26181fSAndroid Build Coastguard Worker icmp6-nodeinformationresponse { yylval->h = 140; return NUM; } 460*8b26181fSAndroid Build Coastguard Worker icmp6-ineighbordiscoverysolicit { yylval->h = 141; return NUM; } 461*8b26181fSAndroid Build Coastguard Worker icmp6-ineighbordiscoveryadvert { yylval->h = 142; return NUM; } 462*8b26181fSAndroid Build Coastguard Worker icmp6-multicastlistenerreportv2 { yylval->h = 143; return NUM; } 463*8b26181fSAndroid Build Coastguard Worker icmp6-homeagentdiscoveryrequest { yylval->h = 144; return NUM; } 464*8b26181fSAndroid Build Coastguard Worker icmp6-homeagentdiscoveryreply { yylval->h = 145; return NUM; } 465*8b26181fSAndroid Build Coastguard Worker icmp6-mobileprefixsolicit { yylval->h = 146; return NUM; } 466*8b26181fSAndroid Build Coastguard Worker icmp6-mobileprefixadvert { yylval->h = 147; return NUM; } 467*8b26181fSAndroid Build Coastguard Worker icmp6-certpathsolicit { yylval->h = 148; return NUM; } 468*8b26181fSAndroid Build Coastguard Worker icmp6-certpathadvert { yylval->h = 149; return NUM; } 469*8b26181fSAndroid Build Coastguard Worker icmp6-multicastrouteradvert { yylval->h = 151; return NUM; } 470*8b26181fSAndroid Build Coastguard Worker icmp6-multicastroutersolicit { yylval->h = 152; return NUM; } 471*8b26181fSAndroid Build Coastguard Worker icmp6-multicastrouterterm { yylval->h = 153; return NUM; } 472*8b26181fSAndroid Build Coastguard Worker 473*8b26181fSAndroid Build Coastguard Worker tcpflags { yylval->h = 13; return NUM; } 474*8b26181fSAndroid Build Coastguard Worker tcp-fin { yylval->h = 0x01; return NUM; } 475*8b26181fSAndroid Build Coastguard Worker tcp-syn { yylval->h = 0x02; return NUM; } 476*8b26181fSAndroid Build Coastguard Worker tcp-rst { yylval->h = 0x04; return NUM; } 477*8b26181fSAndroid Build Coastguard Worker tcp-push { yylval->h = 0x08; return NUM; } 478*8b26181fSAndroid Build Coastguard Worker tcp-ack { yylval->h = 0x10; return NUM; } 479*8b26181fSAndroid Build Coastguard Worker tcp-urg { yylval->h = 0x20; return NUM; } 480*8b26181fSAndroid Build Coastguard Worker tcp-ece { yylval->h = 0x40; return NUM; } 481*8b26181fSAndroid Build Coastguard Worker tcp-cwr { yylval->h = 0x80; return NUM; } 482*8b26181fSAndroid Build Coastguard Worker [A-Za-z0-9]([-_.A-Za-z0-9]*[.A-Za-z0-9])? { 483*8b26181fSAndroid Build Coastguard Worker yylval->s = sdup(yyextra, (char *)yytext); return ID; } 484*8b26181fSAndroid Build Coastguard Worker "\\"[^ !()\n\t]+ { yylval->s = sdup(yyextra, (char *)yytext + 1); return ID; } 485*8b26181fSAndroid Build Coastguard Worker . { return LEX_ERROR; } 486*8b26181fSAndroid Build Coastguard Worker %% 487*8b26181fSAndroid Build Coastguard Worker 488*8b26181fSAndroid Build Coastguard Worker /* 489*8b26181fSAndroid Build Coastguard Worker * Turn diagnostics back on, so we check the code that we've written. 490*8b26181fSAndroid Build Coastguard Worker */ 491*8b26181fSAndroid Build Coastguard Worker DIAG_ON_FLEX 492*8b26181fSAndroid Build Coastguard Worker 493*8b26181fSAndroid Build Coastguard Worker /* 494*8b26181fSAndroid Build Coastguard Worker * Convert string to 32-bit unsigned integer. Just like atoi(), but checks for 495*8b26181fSAndroid Build Coastguard Worker * preceding 0x or 0 and uses hex or octal instead of decimal. 496*8b26181fSAndroid Build Coastguard Worker * 497*8b26181fSAndroid Build Coastguard Worker * On success, sets yylval->h to the value and returns NUM. 498*8b26181fSAndroid Build Coastguard Worker * On failure, sets the BPF error string and returns LEX_ERROR, to force 499*8b26181fSAndroid Build Coastguard Worker * the parse to stop. 500*8b26181fSAndroid Build Coastguard Worker */ 501*8b26181fSAndroid Build Coastguard Worker static int 502*8b26181fSAndroid Build Coastguard Worker stou(char *yytext_arg, YYSTYPE *yylval_arg, compiler_state_t *yyextra_arg) 503*8b26181fSAndroid Build Coastguard Worker { 504*8b26181fSAndroid Build Coastguard Worker bpf_u_int32 n = 0; 505*8b26181fSAndroid Build Coastguard Worker unsigned int digit; 506*8b26181fSAndroid Build Coastguard Worker char *s = yytext_arg; 507*8b26181fSAndroid Build Coastguard Worker 508*8b26181fSAndroid Build Coastguard Worker /* 509*8b26181fSAndroid Build Coastguard Worker * yytext_arg is guaranteed either to be a string of decimal digits 510*8b26181fSAndroid Build Coastguard Worker * or 0[xX] followed by a string of hex digits. 511*8b26181fSAndroid Build Coastguard Worker */ 512*8b26181fSAndroid Build Coastguard Worker if (*s == '0') { 513*8b26181fSAndroid Build Coastguard Worker if (s[1] == 'x' || s[1] == 'X') { 514*8b26181fSAndroid Build Coastguard Worker /* 515*8b26181fSAndroid Build Coastguard Worker * Begins with 0x or 0X, so hex. 516*8b26181fSAndroid Build Coastguard Worker * Guaranteed to be all hex digits following the 517*8b26181fSAndroid Build Coastguard Worker * prefix, so anything that's not 0-9 or a-f is 518*8b26181fSAndroid Build Coastguard Worker * A-F. 519*8b26181fSAndroid Build Coastguard Worker */ 520*8b26181fSAndroid Build Coastguard Worker s += 2; /* skip the prefix */ 521*8b26181fSAndroid Build Coastguard Worker while ((digit = *s++) != '\0') { 522*8b26181fSAndroid Build Coastguard Worker if (digit >= '0' && digit <= '9') 523*8b26181fSAndroid Build Coastguard Worker digit = digit - '0'; 524*8b26181fSAndroid Build Coastguard Worker else if (digit >= 'a' && digit <= 'f') 525*8b26181fSAndroid Build Coastguard Worker digit = digit - 'a' + 10; 526*8b26181fSAndroid Build Coastguard Worker else 527*8b26181fSAndroid Build Coastguard Worker digit = digit - 'A' + 10; 528*8b26181fSAndroid Build Coastguard Worker 529*8b26181fSAndroid Build Coastguard Worker /* 530*8b26181fSAndroid Build Coastguard Worker * Check for overflow. 531*8b26181fSAndroid Build Coastguard Worker */ 532*8b26181fSAndroid Build Coastguard Worker if (n > 0xFFFFFFFU) { 533*8b26181fSAndroid Build Coastguard Worker /* 534*8b26181fSAndroid Build Coastguard Worker * We have more than 28 bits of 535*8b26181fSAndroid Build Coastguard Worker * number, and are about to 536*8b26181fSAndroid Build Coastguard Worker * add 4 more; that won't fit 537*8b26181fSAndroid Build Coastguard Worker * in 32 bits. 538*8b26181fSAndroid Build Coastguard Worker */ 539*8b26181fSAndroid Build Coastguard Worker bpf_set_error(yyextra_arg, 540*8b26181fSAndroid Build Coastguard Worker "number %s overflows 32 bits", 541*8b26181fSAndroid Build Coastguard Worker yytext_arg); 542*8b26181fSAndroid Build Coastguard Worker return LEX_ERROR; 543*8b26181fSAndroid Build Coastguard Worker } 544*8b26181fSAndroid Build Coastguard Worker n = (n << 4) + digit; 545*8b26181fSAndroid Build Coastguard Worker } 546*8b26181fSAndroid Build Coastguard Worker } else { 547*8b26181fSAndroid Build Coastguard Worker /* 548*8b26181fSAndroid Build Coastguard Worker * Begins with 0, but not 0x or 0X, so octal. 549*8b26181fSAndroid Build Coastguard Worker * Guaranteed to be all *decimal* digits following 550*8b26181fSAndroid Build Coastguard Worker * the prefix, so we need to catch 8 and 9 and 551*8b26181fSAndroid Build Coastguard Worker * report an error. 552*8b26181fSAndroid Build Coastguard Worker */ 553*8b26181fSAndroid Build Coastguard Worker s += 1; 554*8b26181fSAndroid Build Coastguard Worker while ((digit = *s++) != '\0') { 555*8b26181fSAndroid Build Coastguard Worker if (digit >= '0' && digit <= '7') 556*8b26181fSAndroid Build Coastguard Worker digit = digit - '0'; 557*8b26181fSAndroid Build Coastguard Worker else { 558*8b26181fSAndroid Build Coastguard Worker bpf_set_error(yyextra_arg, 559*8b26181fSAndroid Build Coastguard Worker "number %s contains non-octal digit", 560*8b26181fSAndroid Build Coastguard Worker yytext_arg); 561*8b26181fSAndroid Build Coastguard Worker return LEX_ERROR; 562*8b26181fSAndroid Build Coastguard Worker } 563*8b26181fSAndroid Build Coastguard Worker if (n > 03777777777U) { 564*8b26181fSAndroid Build Coastguard Worker /* 565*8b26181fSAndroid Build Coastguard Worker * We have more than 29 bits of 566*8b26181fSAndroid Build Coastguard Worker * number, and are about to add 567*8b26181fSAndroid Build Coastguard Worker * 3 more; that won't fit in 568*8b26181fSAndroid Build Coastguard Worker * 32 bits. 569*8b26181fSAndroid Build Coastguard Worker */ 570*8b26181fSAndroid Build Coastguard Worker bpf_set_error(yyextra_arg, 571*8b26181fSAndroid Build Coastguard Worker "number %s overflows 32 bits", 572*8b26181fSAndroid Build Coastguard Worker yytext_arg); 573*8b26181fSAndroid Build Coastguard Worker return LEX_ERROR; 574*8b26181fSAndroid Build Coastguard Worker } 575*8b26181fSAndroid Build Coastguard Worker n = (n << 3) + digit; 576*8b26181fSAndroid Build Coastguard Worker } 577*8b26181fSAndroid Build Coastguard Worker } 578*8b26181fSAndroid Build Coastguard Worker } else { 579*8b26181fSAndroid Build Coastguard Worker /* 580*8b26181fSAndroid Build Coastguard Worker * Decimal. 581*8b26181fSAndroid Build Coastguard Worker */ 582*8b26181fSAndroid Build Coastguard Worker while ((digit = *s++) != '\0') { 583*8b26181fSAndroid Build Coastguard Worker digit = digit - '0'; 584*8b26181fSAndroid Build Coastguard Worker #define CUTOFF_DEC (0xFFFFFFFFU / 10U) 585*8b26181fSAndroid Build Coastguard Worker #define CUTLIM_DEC (0xFFFFFFFFU % 10U) 586*8b26181fSAndroid Build Coastguard Worker if (n > CUTOFF_DEC || 587*8b26181fSAndroid Build Coastguard Worker (n == CUTOFF_DEC && digit > CUTLIM_DEC)) { 588*8b26181fSAndroid Build Coastguard Worker bpf_set_error(yyextra_arg, 589*8b26181fSAndroid Build Coastguard Worker "number %s overflows 32 bits", 590*8b26181fSAndroid Build Coastguard Worker yytext_arg); 591*8b26181fSAndroid Build Coastguard Worker return LEX_ERROR; 592*8b26181fSAndroid Build Coastguard Worker } 593*8b26181fSAndroid Build Coastguard Worker n = (n * 10) + digit; 594*8b26181fSAndroid Build Coastguard Worker } 595*8b26181fSAndroid Build Coastguard Worker } 596*8b26181fSAndroid Build Coastguard Worker 597*8b26181fSAndroid Build Coastguard Worker yylval_arg->h = n; 598*8b26181fSAndroid Build Coastguard Worker return NUM; 599*8b26181fSAndroid Build Coastguard Worker } 600