xref: /dflybsd-src/contrib/libpcap/scanner.l (revision e75ef36f1332e115895388cede9dfd24ca1a806c)
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