197a9217aSAntonio Huete Jimenez %top { 297a9217aSAntonio Huete Jimenez /* Must come first for _LARGE_FILE_API on AIX. */ 397a9217aSAntonio Huete Jimenez #ifdef HAVE_CONFIG_H 43a289941SAaron LI #include <config.h> 597a9217aSAntonio Huete Jimenez #endif 63a289941SAaron LI 73a289941SAaron LI /* 83a289941SAaron LI * Must come first to avoid warnings on Windows. 93a289941SAaron LI * 103a289941SAaron LI * Flex-generated scanners may only include <inttypes.h> if __STDC_VERSION__ 113a289941SAaron LI * is defined with a value >= 199901, meaning "full C99", and MSVC may not 123a289941SAaron LI * define it with that value, because it isn't 100% C99-compliant, even 133a289941SAaron LI * though it has an <inttypes.h> capable of defining everything the Flex 143a289941SAaron LI * scanner needs. 153a289941SAaron LI * 163a289941SAaron LI * We, however, will include it if we know we have an MSVC version that has 173a289941SAaron LI * it; this means that we may define the INTn_MAX and UINTn_MAX values in 183a289941SAaron LI * scanner.c, and then include <stdint.h>, which may define them differently 193a289941SAaron LI * (same value, but different string of characters), causing compiler warnings. 203a289941SAaron LI * 213a289941SAaron LI * If we include it here, and they're defined, that'll prevent scanner.c 223a289941SAaron LI * from defining them. So we include <pcap/pcap-inttypes.h>, to get 233a289941SAaron LI * <inttypes.h> if we have it. 243a289941SAaron LI */ 253a289941SAaron LI #include <pcap/pcap-inttypes.h> 263a289941SAaron LI 273a289941SAaron LI #include "diag-control.h" 2897a9217aSAntonio Huete Jimenez } 2997a9217aSAntonio Huete Jimenez 3097a9217aSAntonio Huete Jimenez /* 3197a9217aSAntonio Huete Jimenez * We want a reentrant scanner. 3297a9217aSAntonio Huete Jimenez */ 3397a9217aSAntonio Huete Jimenez %option reentrant 3497a9217aSAntonio Huete Jimenez 3597a9217aSAntonio Huete Jimenez /* 3697a9217aSAntonio Huete Jimenez * And we need to pass the compiler state to the scanner. 3797a9217aSAntonio Huete Jimenez */ 3897a9217aSAntonio Huete Jimenez %option extra-type="compiler_state_t *" 3997a9217aSAntonio Huete Jimenez 4097a9217aSAntonio Huete Jimenez /* 4197a9217aSAntonio Huete Jimenez * We don't use input, so don't generate code for it. 4297a9217aSAntonio Huete Jimenez */ 4397a9217aSAntonio Huete Jimenez %option noinput 4497a9217aSAntonio Huete Jimenez 4597a9217aSAntonio Huete Jimenez /* 4697a9217aSAntonio Huete Jimenez * We don't use unput, so don't generate code for it. 4797a9217aSAntonio Huete Jimenez */ 4897a9217aSAntonio Huete Jimenez %option nounput 4997a9217aSAntonio Huete Jimenez 5097a9217aSAntonio Huete Jimenez /* 5197a9217aSAntonio Huete Jimenez * We don't read from the terminal. 5297a9217aSAntonio Huete Jimenez */ 5397a9217aSAntonio Huete Jimenez %option never-interactive 5497a9217aSAntonio Huete Jimenez 5597a9217aSAntonio Huete Jimenez /* 5697a9217aSAntonio Huete Jimenez * We want to stop processing when we get to the end of the input. 5797a9217aSAntonio Huete Jimenez */ 5897a9217aSAntonio Huete Jimenez %option noyywrap 5997a9217aSAntonio Huete Jimenez 6097a9217aSAntonio Huete Jimenez /* 6197a9217aSAntonio Huete Jimenez * We want to generate code that can be used by a reentrant parser 6297a9217aSAntonio Huete Jimenez * generated by Bison or Berkeley YACC. 6397a9217aSAntonio Huete Jimenez */ 6497a9217aSAntonio Huete Jimenez %option bison-bridge 6597a9217aSAntonio Huete Jimenez 661077d0bdSPeter Avalos %{ 671077d0bdSPeter Avalos /* 681077d0bdSPeter Avalos * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 691077d0bdSPeter Avalos * The Regents of the University of California. All rights reserved. 701077d0bdSPeter Avalos * 711077d0bdSPeter Avalos * Redistribution and use in source and binary forms, with or without 721077d0bdSPeter Avalos * modification, are permitted provided that: (1) source code distributions 731077d0bdSPeter Avalos * retain the above copyright notice and this paragraph in its entirety, (2) 741077d0bdSPeter Avalos * distributions including binary code include the above copyright notice and 751077d0bdSPeter Avalos * this paragraph in its entirety in the documentation or other materials 761077d0bdSPeter Avalos * provided with the distribution, and (3) all advertising materials mentioning 771077d0bdSPeter Avalos * features or use of this software display the following acknowledgement: 781077d0bdSPeter Avalos * ``This product includes software developed by the University of California, 791077d0bdSPeter Avalos * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 801077d0bdSPeter Avalos * the University nor the names of its contributors may be used to endorse 811077d0bdSPeter Avalos * or promote products derived from this software without specific prior 821077d0bdSPeter Avalos * written permission. 831077d0bdSPeter Avalos * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 841077d0bdSPeter Avalos * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 851077d0bdSPeter Avalos * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 861077d0bdSPeter Avalos */ 871077d0bdSPeter Avalos 881077d0bdSPeter Avalos #include <string.h> 891077d0bdSPeter Avalos 901077d0bdSPeter Avalos #include "pcap-int.h" 911077d0bdSPeter Avalos 921077d0bdSPeter Avalos #include "gencode.h" 931077d0bdSPeter Avalos 9497a9217aSAntonio Huete Jimenez #include "grammar.h" 9597a9217aSAntonio Huete Jimenez 9697a9217aSAntonio Huete Jimenez /* 9797a9217aSAntonio Huete Jimenez * Earlier versions of Flex don't declare these, so we declare them 9897a9217aSAntonio Huete Jimenez * ourselves to squelch warnings. 9997a9217aSAntonio Huete Jimenez */ 10097a9217aSAntonio Huete Jimenez int pcap_get_column(yyscan_t); 10197a9217aSAntonio Huete Jimenez void pcap_set_column(int, yyscan_t); 10297a9217aSAntonio Huete Jimenez 10397a9217aSAntonio Huete Jimenez #ifdef INET6 10497a9217aSAntonio Huete Jimenez 10597a9217aSAntonio Huete Jimenez #ifdef _WIN32 1063a289941SAaron LI #include <winsock2.h> 1073a289941SAaron LI #include <ws2tcpip.h> 10897a9217aSAntonio Huete Jimenez /* 10997a9217aSAntonio Huete Jimenez * To quote the MSDN page for getaddrinfo() at 11097a9217aSAntonio Huete Jimenez * 11197a9217aSAntonio Huete Jimenez * https://msdn.microsoft.com/en-us/library/windows/desktop/ms738520(v=vs.85).aspx 11297a9217aSAntonio Huete Jimenez * 11397a9217aSAntonio Huete Jimenez * "Support for getaddrinfo on Windows 2000 and older versions 11497a9217aSAntonio Huete Jimenez * The getaddrinfo function was added to the Ws2_32.dll on Windows XP and 11597a9217aSAntonio Huete Jimenez * later. To execute an application that uses this function on earlier 11697a9217aSAntonio Huete Jimenez * versions of Windows, then you need to include the Ws2tcpip.h and 11797a9217aSAntonio Huete Jimenez * Wspiapi.h files. When the Wspiapi.h include file is added, the 11897a9217aSAntonio Huete Jimenez * getaddrinfo function is defined to the WspiapiGetAddrInfo inline 11997a9217aSAntonio Huete Jimenez * function in the Wspiapi.h file. At runtime, the WspiapiGetAddrInfo 12097a9217aSAntonio Huete Jimenez * function is implemented in such a way that if the Ws2_32.dll or the 12197a9217aSAntonio Huete Jimenez * Wship6.dll (the file containing getaddrinfo in the IPv6 Technology 12297a9217aSAntonio Huete Jimenez * Preview for Windows 2000) does not include getaddrinfo, then a 12397a9217aSAntonio Huete Jimenez * version of getaddrinfo is implemented inline based on code in the 12497a9217aSAntonio Huete Jimenez * Wspiapi.h header file. This inline code will be used on older Windows 12597a9217aSAntonio Huete Jimenez * platforms that do not natively support the getaddrinfo function." 12697a9217aSAntonio Huete Jimenez * 1273a289941SAaron LI * We use getaddrinfo(), so we include Wspiapi.h here. 12897a9217aSAntonio Huete Jimenez */ 1293a289941SAaron LI #include <wspiapi.h> 13097a9217aSAntonio Huete Jimenez #else /* _WIN32 */ 1311077d0bdSPeter Avalos #include <sys/socket.h> /* for "struct sockaddr" in "struct addrinfo" */ 1321077d0bdSPeter Avalos #include <netdb.h> /* for "struct addrinfo" */ 13397a9217aSAntonio Huete Jimenez #endif /* _WIN32 */ 1341077d0bdSPeter Avalos 1351077d0bdSPeter Avalos /* Workaround for AIX 4.3 */ 1361077d0bdSPeter Avalos #if !defined(AI_NUMERICHOST) 1371077d0bdSPeter Avalos #define AI_NUMERICHOST 0x04 1381077d0bdSPeter Avalos #endif 13997a9217aSAntonio Huete Jimenez 1401077d0bdSPeter Avalos #endif /*INET6*/ 14197a9217aSAntonio Huete Jimenez 142de0d3203SPeter Avalos #include <pcap/namedb.h> 14397a9217aSAntonio Huete Jimenez #include "grammar.h" 1441077d0bdSPeter Avalos 1451077d0bdSPeter Avalos #ifdef HAVE_OS_PROTO_H 1461077d0bdSPeter Avalos #include "os-proto.h" 1471077d0bdSPeter Avalos #endif 1481077d0bdSPeter Avalos 149*ea16f64eSAntonio Huete Jimenez static int stou(char *, YYSTYPE *, compiler_state_t *); 1501077d0bdSPeter Avalos 1513a289941SAaron LI /* 1523a289941SAaron LI * Disable diagnostics in the code generated by Flex. 1533a289941SAaron LI */ 1543a289941SAaron LI DIAG_OFF_FLEX 1553a289941SAaron LI 1561077d0bdSPeter Avalos %} 1571077d0bdSPeter Avalos 1581077d0bdSPeter Avalos N ([0-9]+|(0X|0x)[0-9A-Fa-f]+) 1591077d0bdSPeter Avalos B ([0-9A-Fa-f][0-9A-Fa-f]?) 160de0d3203SPeter Avalos B2 ([0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]) 1611077d0bdSPeter Avalos W ([0-9A-Fa-f][0-9A-Fa-f]?[0-9A-Fa-f]?[0-9A-Fa-f]?) 1621077d0bdSPeter Avalos 1631077d0bdSPeter Avalos %a 18400 1641077d0bdSPeter Avalos %o 21500 1651077d0bdSPeter Avalos %e 7600 1661077d0bdSPeter Avalos %k 4550 1671077d0bdSPeter Avalos %p 27600 1681077d0bdSPeter Avalos %n 2000 1691077d0bdSPeter Avalos 1701077d0bdSPeter Avalos V680 {W}:{W}:{W}:{W}:{W}:{W}:{W}:{W} 1711077d0bdSPeter Avalos 1721077d0bdSPeter Avalos V670 ::{W}:{W}:{W}:{W}:{W}:{W}:{W} 1731077d0bdSPeter Avalos V671 {W}::{W}:{W}:{W}:{W}:{W}:{W} 1741077d0bdSPeter Avalos V672 {W}:{W}::{W}:{W}:{W}:{W}:{W} 1751077d0bdSPeter Avalos V673 {W}:{W}:{W}::{W}:{W}:{W}:{W} 1761077d0bdSPeter Avalos V674 {W}:{W}:{W}:{W}::{W}:{W}:{W} 1771077d0bdSPeter Avalos V675 {W}:{W}:{W}:{W}:{W}::{W}:{W} 1781077d0bdSPeter Avalos V676 {W}:{W}:{W}:{W}:{W}:{W}::{W} 1791077d0bdSPeter Avalos V677 {W}:{W}:{W}:{W}:{W}:{W}:{W}:: 1801077d0bdSPeter Avalos 1811077d0bdSPeter Avalos V660 ::{W}:{W}:{W}:{W}:{W}:{W} 1821077d0bdSPeter Avalos V661 {W}::{W}:{W}:{W}:{W}:{W} 1831077d0bdSPeter Avalos V662 {W}:{W}::{W}:{W}:{W}:{W} 1841077d0bdSPeter Avalos V663 {W}:{W}:{W}::{W}:{W}:{W} 1851077d0bdSPeter Avalos V664 {W}:{W}:{W}:{W}::{W}:{W} 1861077d0bdSPeter Avalos V665 {W}:{W}:{W}:{W}:{W}::{W} 1871077d0bdSPeter Avalos V666 {W}:{W}:{W}:{W}:{W}:{W}:: 1881077d0bdSPeter Avalos 1891077d0bdSPeter Avalos V650 ::{W}:{W}:{W}:{W}:{W} 1901077d0bdSPeter Avalos V651 {W}::{W}:{W}:{W}:{W} 1911077d0bdSPeter Avalos V652 {W}:{W}::{W}:{W}:{W} 1921077d0bdSPeter Avalos V653 {W}:{W}:{W}::{W}:{W} 1931077d0bdSPeter Avalos V654 {W}:{W}:{W}:{W}::{W} 1941077d0bdSPeter Avalos V655 {W}:{W}:{W}:{W}:{W}:: 1951077d0bdSPeter Avalos 1961077d0bdSPeter Avalos V640 ::{W}:{W}:{W}:{W} 1971077d0bdSPeter Avalos V641 {W}::{W}:{W}:{W} 1981077d0bdSPeter Avalos V642 {W}:{W}::{W}:{W} 1991077d0bdSPeter Avalos V643 {W}:{W}:{W}::{W} 2001077d0bdSPeter Avalos V644 {W}:{W}:{W}:{W}:: 2011077d0bdSPeter Avalos 2021077d0bdSPeter Avalos V630 ::{W}:{W}:{W} 2031077d0bdSPeter Avalos V631 {W}::{W}:{W} 2041077d0bdSPeter Avalos V632 {W}:{W}::{W} 2051077d0bdSPeter Avalos V633 {W}:{W}:{W}:: 2061077d0bdSPeter Avalos 2071077d0bdSPeter Avalos V620 ::{W}:{W} 2081077d0bdSPeter Avalos V621 {W}::{W} 2091077d0bdSPeter Avalos V622 {W}:{W}:: 2101077d0bdSPeter Avalos 2111077d0bdSPeter Avalos V610 ::{W} 2121077d0bdSPeter Avalos V611 {W}:: 2131077d0bdSPeter Avalos 2141077d0bdSPeter Avalos V600 :: 2151077d0bdSPeter Avalos 2161077d0bdSPeter Avalos V6604 {W}:{W}:{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N} 2171077d0bdSPeter Avalos 2181077d0bdSPeter Avalos V6504 ::{W}:{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N} 2191077d0bdSPeter Avalos V6514 {W}::{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N} 2201077d0bdSPeter Avalos V6524 {W}:{W}::{W}:{W}:{W}:{N}\.{N}\.{N}\.{N} 2211077d0bdSPeter Avalos V6534 {W}:{W}:{W}::{W}:{W}:{N}\.{N}\.{N}\.{N} 2221077d0bdSPeter Avalos V6544 {W}:{W}:{W}:{W}::{W}:{N}\.{N}\.{N}\.{N} 2231077d0bdSPeter Avalos V6554 {W}:{W}:{W}:{W}:{W}::{N}\.{N}\.{N}\.{N} 2241077d0bdSPeter Avalos 2251077d0bdSPeter Avalos V6404 ::{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N} 2261077d0bdSPeter Avalos V6414 {W}::{W}:{W}:{W}:{N}\.{N}\.{N}\.{N} 2271077d0bdSPeter Avalos V6424 {W}:{W}::{W}:{W}:{N}\.{N}\.{N}\.{N} 2281077d0bdSPeter Avalos V6434 {W}:{W}:{W}::{W}:{N}\.{N}\.{N}\.{N} 2291077d0bdSPeter Avalos V6444 {W}:{W}:{W}:{W}::{N}\.{N}\.{N}\.{N} 2301077d0bdSPeter Avalos 2311077d0bdSPeter Avalos V6304 ::{W}:{W}:{W}:{N}\.{N}\.{N}\.{N} 2321077d0bdSPeter Avalos V6314 {W}::{W}:{W}:{N}\.{N}\.{N}\.{N} 2331077d0bdSPeter Avalos V6324 {W}:{W}::{W}:{N}\.{N}\.{N}\.{N} 2341077d0bdSPeter Avalos V6334 {W}:{W}:{W}::{N}\.{N}\.{N}\.{N} 2351077d0bdSPeter Avalos 2361077d0bdSPeter Avalos V6204 ::{W}:{W}:{N}\.{N}\.{N}\.{N} 2371077d0bdSPeter Avalos V6214 {W}::{W}:{N}\.{N}\.{N}\.{N} 2381077d0bdSPeter Avalos V6224 {W}:{W}::{N}\.{N}\.{N}\.{N} 2391077d0bdSPeter Avalos 2401077d0bdSPeter Avalos V6104 ::{W}:{N}\.{N}\.{N}\.{N} 2411077d0bdSPeter Avalos V6114 {W}::{N}\.{N}\.{N}\.{N} 2421077d0bdSPeter Avalos 2431077d0bdSPeter Avalos V6004 ::{N}\.{N}\.{N}\.{N} 2441077d0bdSPeter Avalos 2451077d0bdSPeter Avalos 2461077d0bdSPeter Avalos 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}) 2471077d0bdSPeter Avalos 248de0d3203SPeter Avalos MAC ({B}:{B}:{B}:{B}:{B}:{B}|{B}\-{B}\-{B}\-{B}\-{B}\-{B}|{B}\.{B}\.{B}\.{B}\.{B}\.{B}|{B2}\.{B2}\.{B2}|{B2}{3}) 249de0d3203SPeter Avalos 250de0d3203SPeter Avalos 251de0d3203SPeter Avalos 2521077d0bdSPeter Avalos %% 2531077d0bdSPeter Avalos dst return DST; 2541077d0bdSPeter Avalos src return SRC; 2551077d0bdSPeter Avalos 2561077d0bdSPeter Avalos link|ether|ppp|slip return LINK; 2571077d0bdSPeter Avalos fddi|tr|wlan return LINK; 2581077d0bdSPeter Avalos arp return ARP; 2591077d0bdSPeter Avalos rarp return RARP; 2601077d0bdSPeter Avalos ip return IP; 2611077d0bdSPeter Avalos sctp return SCTP; 2621077d0bdSPeter Avalos tcp return TCP; 2631077d0bdSPeter Avalos udp return UDP; 2641077d0bdSPeter Avalos icmp return ICMP; 2651077d0bdSPeter Avalos igmp return IGMP; 2661077d0bdSPeter Avalos igrp return IGRP; 2671077d0bdSPeter Avalos pim return PIM; 2681077d0bdSPeter Avalos vrrp return VRRP; 269a85e14b0SPeter Avalos carp return CARP; 2701077d0bdSPeter Avalos radio return RADIO; 2711077d0bdSPeter Avalos 2720e381983SMatthew Dillon ip6 return IPV6; 2730e381983SMatthew Dillon icmp6 return ICMPV6; 2741077d0bdSPeter Avalos ah return AH; 2751077d0bdSPeter Avalos esp return ESP; 2761077d0bdSPeter Avalos 2771077d0bdSPeter Avalos atalk return ATALK; 2781077d0bdSPeter Avalos aarp return AARP; 2791077d0bdSPeter Avalos decnet return DECNET; 2801077d0bdSPeter Avalos lat return LAT; 2811077d0bdSPeter Avalos sca return SCA; 2821077d0bdSPeter Avalos moprc return MOPRC; 2831077d0bdSPeter Avalos mopdl return MOPDL; 2841077d0bdSPeter Avalos 2851077d0bdSPeter Avalos iso return ISO; 2861077d0bdSPeter Avalos esis return ESIS; 2871077d0bdSPeter Avalos es-is return ESIS; 2881077d0bdSPeter Avalos isis return ISIS; 2891077d0bdSPeter Avalos is-is return ISIS; 2901077d0bdSPeter Avalos l1 return L1; 2911077d0bdSPeter Avalos l2 return L2; 2921077d0bdSPeter Avalos iih return IIH; 2931077d0bdSPeter Avalos lsp return LSP; 2941077d0bdSPeter Avalos snp return SNP; 2951077d0bdSPeter Avalos csnp return CSNP; 2961077d0bdSPeter Avalos psnp return PSNP; 2971077d0bdSPeter Avalos 2981077d0bdSPeter Avalos clnp return CLNP; 2991077d0bdSPeter Avalos 3001077d0bdSPeter Avalos stp return STP; 3011077d0bdSPeter Avalos 3021077d0bdSPeter Avalos ipx return IPX; 3031077d0bdSPeter Avalos 3041077d0bdSPeter Avalos netbeui return NETBEUI; 3051077d0bdSPeter Avalos 3061077d0bdSPeter Avalos host return HOST; 3071077d0bdSPeter Avalos net return NET; 3081077d0bdSPeter Avalos mask return NETMASK; 3091077d0bdSPeter Avalos port return PORT; 3101077d0bdSPeter Avalos portrange return PORTRANGE; 3111077d0bdSPeter Avalos proto return PROTO; 3123a289941SAaron LI protochain return PROTOCHAIN; 3131077d0bdSPeter Avalos 3141077d0bdSPeter Avalos gateway return GATEWAY; 3151077d0bdSPeter Avalos 316de0d3203SPeter Avalos type return TYPE; 317de0d3203SPeter Avalos subtype return SUBTYPE; 318de0d3203SPeter Avalos direction|dir return DIR; 319de0d3203SPeter Avalos address1|addr1 return ADDR1; 320de0d3203SPeter Avalos address2|addr2 return ADDR2; 321de0d3203SPeter Avalos address3|addr3 return ADDR3; 322de0d3203SPeter Avalos address4|addr4 return ADDR4; 323a85e14b0SPeter Avalos ra return RA; 324a85e14b0SPeter Avalos ta return TA; 325de0d3203SPeter Avalos 3261077d0bdSPeter Avalos less return LESS; 3271077d0bdSPeter Avalos greater return GREATER; 3281077d0bdSPeter Avalos byte return CBYTE; 3291077d0bdSPeter Avalos broadcast return TK_BROADCAST; 3301077d0bdSPeter Avalos multicast return TK_MULTICAST; 3311077d0bdSPeter Avalos 3321077d0bdSPeter Avalos and|"&&" return AND; 3331077d0bdSPeter Avalos or|"||" return OR; 3341077d0bdSPeter Avalos not return '!'; 3351077d0bdSPeter Avalos 3361077d0bdSPeter Avalos len|length return LEN; 3371077d0bdSPeter Avalos inbound return INBOUND; 3381077d0bdSPeter Avalos outbound return OUTBOUND; 3391077d0bdSPeter Avalos 340*ea16f64eSAntonio Huete Jimenez ifindex return IFINDEX; 341*ea16f64eSAntonio Huete Jimenez 3421077d0bdSPeter Avalos vlan return VLAN; 3431077d0bdSPeter Avalos mpls return MPLS; 3441077d0bdSPeter Avalos pppoed return PPPOED; 3451077d0bdSPeter Avalos pppoes return PPPOES; 34697a9217aSAntonio Huete Jimenez geneve return GENEVE; 3471077d0bdSPeter Avalos 3481077d0bdSPeter Avalos lane return LANE; 3491077d0bdSPeter Avalos llc return LLC; 3501077d0bdSPeter Avalos metac return METAC; 3511077d0bdSPeter Avalos bcc return BCC; 3521077d0bdSPeter Avalos oam return OAM; 3531077d0bdSPeter Avalos oamf4 return OAMF4; 3541077d0bdSPeter Avalos oamf4ec return OAMF4EC; 3551077d0bdSPeter Avalos oamf4sc return OAMF4SC; 3561077d0bdSPeter Avalos sc return SC; 3571077d0bdSPeter Avalos ilmic return ILMIC; 3581077d0bdSPeter Avalos vpi return VPI; 3591077d0bdSPeter Avalos vci return VCI; 3601077d0bdSPeter Avalos connectmsg return CONNECTMSG; 3611077d0bdSPeter Avalos metaconnect return METACONNECT; 3621077d0bdSPeter Avalos 3631077d0bdSPeter Avalos on|ifname return PF_IFNAME; 3641077d0bdSPeter Avalos rset|ruleset return PF_RSET; 3651077d0bdSPeter Avalos rnr|rulenum return PF_RNR; 3661077d0bdSPeter Avalos srnr|subrulenum return PF_SRNR; 3671077d0bdSPeter Avalos reason return PF_REASON; 3681077d0bdSPeter Avalos action return PF_ACTION; 3691077d0bdSPeter Avalos 3701077d0bdSPeter Avalos fisu return FISU; 3711077d0bdSPeter Avalos lssu return LSSU; 3721077d0bdSPeter Avalos lsu return LSSU; 3731077d0bdSPeter Avalos msu return MSU; 37497a9217aSAntonio Huete Jimenez hfisu return HFISU; 37597a9217aSAntonio Huete Jimenez hlssu return HLSSU; 37697a9217aSAntonio Huete Jimenez hmsu return HMSU; 3771077d0bdSPeter Avalos sio return SIO; 3781077d0bdSPeter Avalos opc return OPC; 3791077d0bdSPeter Avalos dpc return DPC; 3801077d0bdSPeter Avalos sls return SLS; 38197a9217aSAntonio Huete Jimenez hsio return HSIO; 38297a9217aSAntonio Huete Jimenez hopc return HOPC; 38397a9217aSAntonio Huete Jimenez hdpc return HDPC; 38497a9217aSAntonio Huete Jimenez hsls return HSLS; 3851077d0bdSPeter Avalos 3861077d0bdSPeter Avalos [ \r\n\t] ; 38797a9217aSAntonio Huete Jimenez [+\-*/%:\[\]!<>()&|\^=] return yytext[0]; 3881077d0bdSPeter Avalos ">=" return GEQ; 3891077d0bdSPeter Avalos "<=" return LEQ; 3901077d0bdSPeter Avalos "!=" return NEQ; 3911077d0bdSPeter Avalos "==" return '='; 3921077d0bdSPeter Avalos "<<" return LSH; 3931077d0bdSPeter Avalos ">>" return RSH; 3943a289941SAaron LI ${B} { yylval->s = sdup(yyextra, yytext); return AID; } 3953a289941SAaron LI {MAC} { yylval->s = sdup(yyextra, yytext); return EID; } 396*ea16f64eSAntonio Huete Jimenez {N} { return stou(yytext, yylval, yyextra); } 3971077d0bdSPeter Avalos ({N}\.{N})|({N}\.{N}\.{N})|({N}\.{N}\.{N}\.{N}) { 39897a9217aSAntonio Huete Jimenez yylval->s = sdup(yyextra, (char *)yytext); return HID; } 3991077d0bdSPeter Avalos {V6} { 4001077d0bdSPeter Avalos #ifdef INET6 4011077d0bdSPeter Avalos struct addrinfo hints, *res; 4021077d0bdSPeter Avalos memset(&hints, 0, sizeof(hints)); 4031077d0bdSPeter Avalos hints.ai_family = AF_INET6; 4041077d0bdSPeter Avalos hints.ai_flags = AI_NUMERICHOST; 4053a289941SAaron LI if (getaddrinfo(yytext, NULL, &hints, &res)) { 4063a289941SAaron LI bpf_set_error(yyextra, "bogus IPv6 address %s", yytext); 4073a289941SAaron LI yylval->s = NULL; 4083a289941SAaron LI } else { 409a85e14b0SPeter Avalos freeaddrinfo(res); 4103a289941SAaron LI yylval->s = sdup(yyextra, (char *)yytext); 4111077d0bdSPeter Avalos } 4121077d0bdSPeter Avalos #else 4133a289941SAaron LI bpf_set_error(yyextra, "IPv6 address %s not supported", yytext); 4143a289941SAaron LI yylval->s = NULL; 4151077d0bdSPeter Avalos #endif /*INET6*/ 4163a289941SAaron LI return HID6; 4171077d0bdSPeter Avalos } 4183a289941SAaron LI {B}:+({B}:+)+ { bpf_set_error(yyextra, "bogus ethernet address %s", yytext); yylval->s = NULL; return EID; } 419*ea16f64eSAntonio Huete Jimenez icmptype { yylval->h = 0; return NUM; } 420*ea16f64eSAntonio Huete Jimenez icmpcode { yylval->h = 1; return NUM; } 421*ea16f64eSAntonio Huete Jimenez icmp-echoreply { yylval->h = 0; return NUM; } 422*ea16f64eSAntonio Huete Jimenez icmp-unreach { yylval->h = 3; return NUM; } 423*ea16f64eSAntonio Huete Jimenez icmp-sourcequench { yylval->h = 4; return NUM; } 424*ea16f64eSAntonio Huete Jimenez icmp-redirect { yylval->h = 5; return NUM; } 425*ea16f64eSAntonio Huete Jimenez icmp-echo { yylval->h = 8; return NUM; } 426*ea16f64eSAntonio Huete Jimenez icmp-routeradvert { yylval->h = 9; return NUM; } 427*ea16f64eSAntonio Huete Jimenez icmp-routersolicit { yylval->h = 10; return NUM; } 428*ea16f64eSAntonio Huete Jimenez icmp-timxceed { yylval->h = 11; return NUM; } 429*ea16f64eSAntonio Huete Jimenez icmp-paramprob { yylval->h = 12; return NUM; } 430*ea16f64eSAntonio Huete Jimenez icmp-tstamp { yylval->h = 13; return NUM; } 431*ea16f64eSAntonio Huete Jimenez icmp-tstampreply { yylval->h = 14; return NUM; } 432*ea16f64eSAntonio Huete Jimenez icmp-ireq { yylval->h = 15; return NUM; } 433*ea16f64eSAntonio Huete Jimenez icmp-ireqreply { yylval->h = 16; return NUM; } 434*ea16f64eSAntonio Huete Jimenez icmp-maskreq { yylval->h = 17; return NUM; } 435*ea16f64eSAntonio Huete Jimenez icmp-maskreply { yylval->h = 18; return NUM; } 4363a289941SAaron LI 437*ea16f64eSAntonio Huete Jimenez icmp6type { yylval->h = 0; return NUM; } 438*ea16f64eSAntonio Huete Jimenez icmp6code { yylval->h = 1; return NUM; } 4393a289941SAaron LI 440*ea16f64eSAntonio Huete Jimenez icmp6-destinationunreach { yylval->h = 1; return NUM; } 441*ea16f64eSAntonio Huete Jimenez icmp6-packettoobig { yylval->h = 2; return NUM; } 442*ea16f64eSAntonio Huete Jimenez icmp6-timeexceeded { yylval->h = 3; return NUM; } 443*ea16f64eSAntonio Huete Jimenez icmp6-parameterproblem { yylval->h = 4; return NUM; } 444*ea16f64eSAntonio Huete Jimenez icmp6-echo { yylval->h = 128; return NUM; } 445*ea16f64eSAntonio Huete Jimenez icmp6-echoreply { yylval->h = 129; return NUM; } 446*ea16f64eSAntonio Huete Jimenez icmp6-multicastlistenerquery { yylval->h = 130; return NUM; } 447*ea16f64eSAntonio Huete Jimenez icmp6-multicastlistenerreportv1 { yylval->h = 131; return NUM; } 448*ea16f64eSAntonio Huete Jimenez icmp6-multicastlistenerdone { yylval->h = 132; return NUM; } 449*ea16f64eSAntonio Huete Jimenez icmp6-routersolicit { yylval->h = 133; return NUM; } 450*ea16f64eSAntonio Huete Jimenez icmp6-routeradvert { yylval->h = 134; return NUM; } 451*ea16f64eSAntonio Huete Jimenez icmp6-neighborsolicit { yylval->h = 135; return NUM; } 452*ea16f64eSAntonio Huete Jimenez icmp6-neighboradvert { yylval->h = 136; return NUM; } 453*ea16f64eSAntonio Huete Jimenez icmp6-redirect { yylval->h = 137; return NUM; } 454*ea16f64eSAntonio Huete Jimenez icmp6-routerrenum { yylval->h = 138; return NUM; } 455*ea16f64eSAntonio Huete Jimenez icmp6-nodeinformationquery { yylval->h = 139; return NUM; } 456*ea16f64eSAntonio Huete Jimenez icmp6-nodeinformationresponse { yylval->h = 140; return NUM; } 457*ea16f64eSAntonio Huete Jimenez icmp6-ineighbordiscoverysolicit { yylval->h = 141; return NUM; } 458*ea16f64eSAntonio Huete Jimenez icmp6-ineighbordiscoveryadvert { yylval->h = 142; return NUM; } 459*ea16f64eSAntonio Huete Jimenez icmp6-multicastlistenerreportv2 { yylval->h = 143; return NUM; } 460*ea16f64eSAntonio Huete Jimenez icmp6-homeagentdiscoveryrequest { yylval->h = 144; return NUM; } 461*ea16f64eSAntonio Huete Jimenez icmp6-homeagentdiscoveryreply { yylval->h = 145; return NUM; } 462*ea16f64eSAntonio Huete Jimenez icmp6-mobileprefixsolicit { yylval->h = 146; return NUM; } 463*ea16f64eSAntonio Huete Jimenez icmp6-mobileprefixadvert { yylval->h = 147; return NUM; } 464*ea16f64eSAntonio Huete Jimenez icmp6-certpathsolicit { yylval->h = 148; return NUM; } 465*ea16f64eSAntonio Huete Jimenez icmp6-certpathadvert { yylval->h = 149; return NUM; } 466*ea16f64eSAntonio Huete Jimenez icmp6-multicastrouteradvert { yylval->h = 151; return NUM; } 467*ea16f64eSAntonio Huete Jimenez icmp6-multicastroutersolicit { yylval->h = 152; return NUM; } 468*ea16f64eSAntonio Huete Jimenez icmp6-multicastrouterterm { yylval->h = 153; return NUM; } 4693a289941SAaron LI 470*ea16f64eSAntonio Huete Jimenez tcpflags { yylval->h = 13; return NUM; } 471*ea16f64eSAntonio Huete Jimenez tcp-fin { yylval->h = 0x01; return NUM; } 472*ea16f64eSAntonio Huete Jimenez tcp-syn { yylval->h = 0x02; return NUM; } 473*ea16f64eSAntonio Huete Jimenez tcp-rst { yylval->h = 0x04; return NUM; } 474*ea16f64eSAntonio Huete Jimenez tcp-push { yylval->h = 0x08; return NUM; } 475*ea16f64eSAntonio Huete Jimenez tcp-ack { yylval->h = 0x10; return NUM; } 476*ea16f64eSAntonio Huete Jimenez tcp-urg { yylval->h = 0x20; return NUM; } 477*ea16f64eSAntonio Huete Jimenez tcp-ece { yylval->h = 0x40; return NUM; } 478*ea16f64eSAntonio Huete Jimenez tcp-cwr { yylval->h = 0x80; return NUM; } 4791077d0bdSPeter Avalos [A-Za-z0-9]([-_.A-Za-z0-9]*[.A-Za-z0-9])? { 48097a9217aSAntonio Huete Jimenez yylval->s = sdup(yyextra, (char *)yytext); return ID; } 48197a9217aSAntonio Huete Jimenez "\\"[^ !()\n\t]+ { yylval->s = sdup(yyextra, (char *)yytext + 1); return ID; } 4823a289941SAaron LI . { return LEX_ERROR; } 4831077d0bdSPeter Avalos %% 4841077d0bdSPeter Avalos 4853a289941SAaron LI /* 4863a289941SAaron LI * Turn diagnostics back on, so we check the code that we've written. 4873a289941SAaron LI */ 4883a289941SAaron LI DIAG_ON_FLEX 4893a289941SAaron LI 4901077d0bdSPeter Avalos /* 491*ea16f64eSAntonio Huete Jimenez * Convert string to 32-bit unsigned integer. Just like atoi(), but checks for 4921077d0bdSPeter Avalos * preceding 0x or 0 and uses hex or octal instead of decimal. 493*ea16f64eSAntonio Huete Jimenez * 494*ea16f64eSAntonio Huete Jimenez * On success, sets yylval->h to the value and returns NUM. 495*ea16f64eSAntonio Huete Jimenez * On failure, sets the BPF error string and returns LEX_ERROR, to force 496*ea16f64eSAntonio Huete Jimenez * the parse to stop. 4971077d0bdSPeter Avalos */ 4981077d0bdSPeter Avalos static int 499*ea16f64eSAntonio Huete Jimenez stou(char *yytext_arg, YYSTYPE *yylval_arg, compiler_state_t *yyextra_arg) 5001077d0bdSPeter Avalos { 501*ea16f64eSAntonio Huete Jimenez bpf_u_int32 n = 0; 502*ea16f64eSAntonio Huete Jimenez unsigned int digit; 503*ea16f64eSAntonio Huete Jimenez char *s = yytext_arg; 5041077d0bdSPeter Avalos 505*ea16f64eSAntonio Huete Jimenez /* 506*ea16f64eSAntonio Huete Jimenez * yytext_arg is guaranteed either to be a string of decimal digits 507*ea16f64eSAntonio Huete Jimenez * or 0[xX] followed by a string of hex digits. 508*ea16f64eSAntonio Huete Jimenez */ 5091077d0bdSPeter Avalos if (*s == '0') { 5101077d0bdSPeter Avalos if (s[1] == 'x' || s[1] == 'X') { 511*ea16f64eSAntonio Huete Jimenez /* 512*ea16f64eSAntonio Huete Jimenez * Begins with 0x or 0X, so hex. 513*ea16f64eSAntonio Huete Jimenez * Guaranteed to be all hex digits following the 514*ea16f64eSAntonio Huete Jimenez * prefix, so anything that's not 0-9 or a-f is 515*ea16f64eSAntonio Huete Jimenez * A-F. 516*ea16f64eSAntonio Huete Jimenez */ 517*ea16f64eSAntonio Huete Jimenez s += 2; /* skip the prefix */ 518*ea16f64eSAntonio Huete Jimenez while ((digit = *s++) != '\0') { 519*ea16f64eSAntonio Huete Jimenez if (digit >= '0' && digit <= '9') 520*ea16f64eSAntonio Huete Jimenez digit = digit - '0'; 521*ea16f64eSAntonio Huete Jimenez else if (digit >= 'a' && digit <= 'f') 522*ea16f64eSAntonio Huete Jimenez digit = digit - 'a' + 10; 523*ea16f64eSAntonio Huete Jimenez else 524*ea16f64eSAntonio Huete Jimenez digit = digit - 'A' + 10; 5251077d0bdSPeter Avalos 526*ea16f64eSAntonio Huete Jimenez /* 527*ea16f64eSAntonio Huete Jimenez * Check for overflow. 528*ea16f64eSAntonio Huete Jimenez */ 529*ea16f64eSAntonio Huete Jimenez if (n > 0xFFFFFFFU) { 530*ea16f64eSAntonio Huete Jimenez /* 531*ea16f64eSAntonio Huete Jimenez * We have more than 28 bits of 532*ea16f64eSAntonio Huete Jimenez * number, and are about to 533*ea16f64eSAntonio Huete Jimenez * add 4 more; that won't fit 534*ea16f64eSAntonio Huete Jimenez * in 32 bits. 535*ea16f64eSAntonio Huete Jimenez */ 536*ea16f64eSAntonio Huete Jimenez bpf_set_error(yyextra_arg, 537*ea16f64eSAntonio Huete Jimenez "number %s overflows 32 bits", 538*ea16f64eSAntonio Huete Jimenez yytext_arg); 539*ea16f64eSAntonio Huete Jimenez return LEX_ERROR; 540*ea16f64eSAntonio Huete Jimenez } 541*ea16f64eSAntonio Huete Jimenez n = (n << 4) + digit; 542*ea16f64eSAntonio Huete Jimenez } 543*ea16f64eSAntonio Huete Jimenez } else { 544*ea16f64eSAntonio Huete Jimenez /* 545*ea16f64eSAntonio Huete Jimenez * Begins with 0, but not 0x or 0X, so octal. 546*ea16f64eSAntonio Huete Jimenez * Guaranteed to be all *decimal* digits following 547*ea16f64eSAntonio Huete Jimenez * the prefix, so we need to catch 8 and 9 and 548*ea16f64eSAntonio Huete Jimenez * report an error. 549*ea16f64eSAntonio Huete Jimenez */ 550*ea16f64eSAntonio Huete Jimenez s += 1; 551*ea16f64eSAntonio Huete Jimenez while ((digit = *s++) != '\0') { 552*ea16f64eSAntonio Huete Jimenez if (digit >= '0' && digit <= '7') 553*ea16f64eSAntonio Huete Jimenez digit = digit - '0'; 554*ea16f64eSAntonio Huete Jimenez else { 555*ea16f64eSAntonio Huete Jimenez bpf_set_error(yyextra_arg, 556*ea16f64eSAntonio Huete Jimenez "number %s contains non-octal digit", 557*ea16f64eSAntonio Huete Jimenez yytext_arg); 558*ea16f64eSAntonio Huete Jimenez return LEX_ERROR; 559*ea16f64eSAntonio Huete Jimenez } 560*ea16f64eSAntonio Huete Jimenez if (n > 03777777777U) { 561*ea16f64eSAntonio Huete Jimenez /* 562*ea16f64eSAntonio Huete Jimenez * We have more than 29 bits of 563*ea16f64eSAntonio Huete Jimenez * number, and are about to add 564*ea16f64eSAntonio Huete Jimenez * 3 more; that won't fit in 565*ea16f64eSAntonio Huete Jimenez * 32 bits. 566*ea16f64eSAntonio Huete Jimenez */ 567*ea16f64eSAntonio Huete Jimenez bpf_set_error(yyextra_arg, 568*ea16f64eSAntonio Huete Jimenez "number %s overflows 32 bits", 569*ea16f64eSAntonio Huete Jimenez yytext_arg); 570*ea16f64eSAntonio Huete Jimenez return LEX_ERROR; 571*ea16f64eSAntonio Huete Jimenez } 572*ea16f64eSAntonio Huete Jimenez n = (n << 3) + digit; 573*ea16f64eSAntonio Huete Jimenez } 574*ea16f64eSAntonio Huete Jimenez } 575*ea16f64eSAntonio Huete Jimenez } else { 576*ea16f64eSAntonio Huete Jimenez /* 577*ea16f64eSAntonio Huete Jimenez * Decimal. 578*ea16f64eSAntonio Huete Jimenez */ 579*ea16f64eSAntonio Huete Jimenez while ((digit = *s++) != '\0') { 580*ea16f64eSAntonio Huete Jimenez digit = digit - '0'; 581*ea16f64eSAntonio Huete Jimenez #define CUTOFF_DEC (0xFFFFFFFFU / 10U) 582*ea16f64eSAntonio Huete Jimenez #define CUTLIM_DEC (0xFFFFFFFFU % 10U) 583*ea16f64eSAntonio Huete Jimenez if (n > CUTOFF_DEC || 584*ea16f64eSAntonio Huete Jimenez (n == CUTOFF_DEC && digit > CUTLIM_DEC)) { 585*ea16f64eSAntonio Huete Jimenez bpf_set_error(yyextra_arg, 586*ea16f64eSAntonio Huete Jimenez "number %s overflows 32 bits", 587*ea16f64eSAntonio Huete Jimenez yytext_arg); 588*ea16f64eSAntonio Huete Jimenez return LEX_ERROR; 589*ea16f64eSAntonio Huete Jimenez } 590*ea16f64eSAntonio Huete Jimenez n = (n * 10) + digit; 591*ea16f64eSAntonio Huete Jimenez } 592*ea16f64eSAntonio Huete Jimenez } 593*ea16f64eSAntonio Huete Jimenez 594*ea16f64eSAntonio Huete Jimenez yylval_arg->h = n; 595*ea16f64eSAntonio Huete Jimenez return NUM; 5961077d0bdSPeter Avalos } 597