xref: /minix3/external/bsd/libpcap/dist/scanner.l (revision d56f51ea7d8b9045e5c8e2028422523d3f9a5840)
1*d56f51eaSDavid van Moolenbroek /*	$NetBSD: scanner.l,v 1.8 2015/04/05 22:36:36 christos Exp $	*/
2*d56f51eaSDavid van Moolenbroek 
3*d56f51eaSDavid van Moolenbroek %{
4*d56f51eaSDavid van Moolenbroek /*
5*d56f51eaSDavid van Moolenbroek  * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
6*d56f51eaSDavid van Moolenbroek  *	The Regents of the University of California.  All rights reserved.
7*d56f51eaSDavid van Moolenbroek  *
8*d56f51eaSDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
9*d56f51eaSDavid van Moolenbroek  * modification, are permitted provided that: (1) source code distributions
10*d56f51eaSDavid van Moolenbroek  * retain the above copyright notice and this paragraph in its entirety, (2)
11*d56f51eaSDavid van Moolenbroek  * distributions including binary code include the above copyright notice and
12*d56f51eaSDavid van Moolenbroek  * this paragraph in its entirety in the documentation or other materials
13*d56f51eaSDavid van Moolenbroek  * provided with the distribution, and (3) all advertising materials mentioning
14*d56f51eaSDavid van Moolenbroek  * features or use of this software display the following acknowledgement:
15*d56f51eaSDavid van Moolenbroek  * ``This product includes software developed by the University of California,
16*d56f51eaSDavid van Moolenbroek  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
17*d56f51eaSDavid van Moolenbroek  * the University nor the names of its contributors may be used to endorse
18*d56f51eaSDavid van Moolenbroek  * or promote products derived from this software without specific prior
19*d56f51eaSDavid van Moolenbroek  * written permission.
20*d56f51eaSDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
21*d56f51eaSDavid van Moolenbroek  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
22*d56f51eaSDavid van Moolenbroek  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
23*d56f51eaSDavid van Moolenbroek  */
24*d56f51eaSDavid van Moolenbroek #include <sys/cdefs.h>
25*d56f51eaSDavid van Moolenbroek __RCSID("$NetBSD: scanner.l,v 1.8 2015/04/05 22:36:36 christos Exp $");
26*d56f51eaSDavid van Moolenbroek 
27*d56f51eaSDavid van Moolenbroek #include "config.h"
28*d56f51eaSDavid van Moolenbroek #ifdef WIN32
29*d56f51eaSDavid van Moolenbroek #include <pcap-stdinc.h>
30*d56f51eaSDavid van Moolenbroek #else /* WIN32 */
31*d56f51eaSDavid van Moolenbroek #if HAVE_INTTYPES_H
32*d56f51eaSDavid van Moolenbroek #include <inttypes.h>
33*d56f51eaSDavid van Moolenbroek #elif HAVE_STDINT_H
34*d56f51eaSDavid van Moolenbroek #include <stdint.h>
35*d56f51eaSDavid van Moolenbroek #endif
36*d56f51eaSDavid van Moolenbroek #ifdef HAVE_SYS_BITYPES_H
37*d56f51eaSDavid van Moolenbroek #include <sys/bitypes.h>
38*d56f51eaSDavid van Moolenbroek #endif
39*d56f51eaSDavid van Moolenbroek #include <sys/types.h>
40*d56f51eaSDavid van Moolenbroek #endif /* WIN32 */
41*d56f51eaSDavid van Moolenbroek 
42*d56f51eaSDavid van Moolenbroek #include <ctype.h>
43*d56f51eaSDavid van Moolenbroek #include <string.h>
44*d56f51eaSDavid van Moolenbroek 
45*d56f51eaSDavid van Moolenbroek #include "pcap-int.h"
46*d56f51eaSDavid van Moolenbroek 
47*d56f51eaSDavid van Moolenbroek #include "gencode.h"
48*d56f51eaSDavid van Moolenbroek #ifdef INET6
49*d56f51eaSDavid van Moolenbroek #ifdef WIN32
50*d56f51eaSDavid van Moolenbroek #include <pcap-stdinc.h>
51*d56f51eaSDavid van Moolenbroek 
52*d56f51eaSDavid van Moolenbroek #ifdef __MINGW32__
53*d56f51eaSDavid van Moolenbroek #include "ip6_misc.h"
54*d56f51eaSDavid van Moolenbroek #endif
55*d56f51eaSDavid van Moolenbroek #else /* WIN32 */
56*d56f51eaSDavid van Moolenbroek #include <sys/socket.h>	/* for "struct sockaddr" in "struct addrinfo" */
57*d56f51eaSDavid van Moolenbroek #include <netdb.h>	/* for "struct addrinfo" */
58*d56f51eaSDavid van Moolenbroek #endif /* WIN32 */
59*d56f51eaSDavid van Moolenbroek 
60*d56f51eaSDavid van Moolenbroek /* Workaround for AIX 4.3 */
61*d56f51eaSDavid van Moolenbroek #if !defined(AI_NUMERICHOST)
62*d56f51eaSDavid van Moolenbroek #define AI_NUMERICHOST 0x04
63*d56f51eaSDavid van Moolenbroek #endif
64*d56f51eaSDavid van Moolenbroek #endif /*INET6*/
65*d56f51eaSDavid van Moolenbroek #include <pcap/namedb.h>
66*d56f51eaSDavid van Moolenbroek #include "tokdefs.h"
67*d56f51eaSDavid van Moolenbroek 
68*d56f51eaSDavid van Moolenbroek #ifdef HAVE_OS_PROTO_H
69*d56f51eaSDavid van Moolenbroek #include "os-proto.h"
70*d56f51eaSDavid van Moolenbroek #endif
71*d56f51eaSDavid van Moolenbroek 
72*d56f51eaSDavid van Moolenbroek static int stoi(char *);
73*d56f51eaSDavid van Moolenbroek static inline int xdtoi(int);
74*d56f51eaSDavid van Moolenbroek 
75*d56f51eaSDavid van Moolenbroek #ifdef FLEX_SCANNER
76*d56f51eaSDavid van Moolenbroek #define YY_NO_UNPUT
77*d56f51eaSDavid van Moolenbroek static YY_BUFFER_STATE in_buffer;
78*d56f51eaSDavid van Moolenbroek #else
79*d56f51eaSDavid van Moolenbroek static const char *in_buffer;
80*d56f51eaSDavid van Moolenbroek 
81*d56f51eaSDavid van Moolenbroek #undef getc
82*d56f51eaSDavid van Moolenbroek #define getc(fp)  (*in_buffer == 0 ? EOF : *in_buffer++)
83*d56f51eaSDavid van Moolenbroek #endif
84*d56f51eaSDavid van Moolenbroek 
85*d56f51eaSDavid van Moolenbroek #define yylval pcap_lval
86*d56f51eaSDavid van Moolenbroek extern YYSTYPE yylval;
87*d56f51eaSDavid van Moolenbroek 
88*d56f51eaSDavid van Moolenbroek %}
89*d56f51eaSDavid van Moolenbroek 
90*d56f51eaSDavid van Moolenbroek N		([0-9]+|(0X|0x)[0-9A-Fa-f]+)
91*d56f51eaSDavid van Moolenbroek B		([0-9A-Fa-f][0-9A-Fa-f]?)
92*d56f51eaSDavid van Moolenbroek B2		([0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f])
93*d56f51eaSDavid van Moolenbroek W		([0-9A-Fa-f][0-9A-Fa-f]?[0-9A-Fa-f]?[0-9A-Fa-f]?)
94*d56f51eaSDavid van Moolenbroek 
95*d56f51eaSDavid van Moolenbroek %a 18400
96*d56f51eaSDavid van Moolenbroek %o 21500
97*d56f51eaSDavid van Moolenbroek %e 7600
98*d56f51eaSDavid van Moolenbroek %k 4550
99*d56f51eaSDavid van Moolenbroek %p 27600
100*d56f51eaSDavid van Moolenbroek %n 2000
101*d56f51eaSDavid van Moolenbroek 
102*d56f51eaSDavid van Moolenbroek V680		{W}:{W}:{W}:{W}:{W}:{W}:{W}:{W}
103*d56f51eaSDavid van Moolenbroek 
104*d56f51eaSDavid van Moolenbroek V670		::{W}:{W}:{W}:{W}:{W}:{W}:{W}
105*d56f51eaSDavid van Moolenbroek V671		{W}::{W}:{W}:{W}:{W}:{W}:{W}
106*d56f51eaSDavid van Moolenbroek V672		{W}:{W}::{W}:{W}:{W}:{W}:{W}
107*d56f51eaSDavid van Moolenbroek V673		{W}:{W}:{W}::{W}:{W}:{W}:{W}
108*d56f51eaSDavid van Moolenbroek V674		{W}:{W}:{W}:{W}::{W}:{W}:{W}
109*d56f51eaSDavid van Moolenbroek V675		{W}:{W}:{W}:{W}:{W}::{W}:{W}
110*d56f51eaSDavid van Moolenbroek V676		{W}:{W}:{W}:{W}:{W}:{W}::{W}
111*d56f51eaSDavid van Moolenbroek V677		{W}:{W}:{W}:{W}:{W}:{W}:{W}::
112*d56f51eaSDavid van Moolenbroek 
113*d56f51eaSDavid van Moolenbroek V660		::{W}:{W}:{W}:{W}:{W}:{W}
114*d56f51eaSDavid van Moolenbroek V661		{W}::{W}:{W}:{W}:{W}:{W}
115*d56f51eaSDavid van Moolenbroek V662		{W}:{W}::{W}:{W}:{W}:{W}
116*d56f51eaSDavid van Moolenbroek V663		{W}:{W}:{W}::{W}:{W}:{W}
117*d56f51eaSDavid van Moolenbroek V664		{W}:{W}:{W}:{W}::{W}:{W}
118*d56f51eaSDavid van Moolenbroek V665		{W}:{W}:{W}:{W}:{W}::{W}
119*d56f51eaSDavid van Moolenbroek V666		{W}:{W}:{W}:{W}:{W}:{W}::
120*d56f51eaSDavid van Moolenbroek 
121*d56f51eaSDavid van Moolenbroek V650		::{W}:{W}:{W}:{W}:{W}
122*d56f51eaSDavid van Moolenbroek V651		{W}::{W}:{W}:{W}:{W}
123*d56f51eaSDavid van Moolenbroek V652		{W}:{W}::{W}:{W}:{W}
124*d56f51eaSDavid van Moolenbroek V653		{W}:{W}:{W}::{W}:{W}
125*d56f51eaSDavid van Moolenbroek V654		{W}:{W}:{W}:{W}::{W}
126*d56f51eaSDavid van Moolenbroek V655		{W}:{W}:{W}:{W}:{W}::
127*d56f51eaSDavid van Moolenbroek 
128*d56f51eaSDavid van Moolenbroek V640		::{W}:{W}:{W}:{W}
129*d56f51eaSDavid van Moolenbroek V641		{W}::{W}:{W}:{W}
130*d56f51eaSDavid van Moolenbroek V642		{W}:{W}::{W}:{W}
131*d56f51eaSDavid van Moolenbroek V643		{W}:{W}:{W}::{W}
132*d56f51eaSDavid van Moolenbroek V644		{W}:{W}:{W}:{W}::
133*d56f51eaSDavid van Moolenbroek 
134*d56f51eaSDavid van Moolenbroek V630		::{W}:{W}:{W}
135*d56f51eaSDavid van Moolenbroek V631		{W}::{W}:{W}
136*d56f51eaSDavid van Moolenbroek V632		{W}:{W}::{W}
137*d56f51eaSDavid van Moolenbroek V633		{W}:{W}:{W}::
138*d56f51eaSDavid van Moolenbroek 
139*d56f51eaSDavid van Moolenbroek V620		::{W}:{W}
140*d56f51eaSDavid van Moolenbroek V621		{W}::{W}
141*d56f51eaSDavid van Moolenbroek V622		{W}:{W}::
142*d56f51eaSDavid van Moolenbroek 
143*d56f51eaSDavid van Moolenbroek V610		::{W}
144*d56f51eaSDavid van Moolenbroek V611		{W}::
145*d56f51eaSDavid van Moolenbroek 
146*d56f51eaSDavid van Moolenbroek V600		::
147*d56f51eaSDavid van Moolenbroek 
148*d56f51eaSDavid van Moolenbroek V6604		{W}:{W}:{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
149*d56f51eaSDavid van Moolenbroek 
150*d56f51eaSDavid van Moolenbroek V6504		::{W}:{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
151*d56f51eaSDavid van Moolenbroek V6514		{W}::{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
152*d56f51eaSDavid van Moolenbroek V6524		{W}:{W}::{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
153*d56f51eaSDavid van Moolenbroek V6534		{W}:{W}:{W}::{W}:{W}:{N}\.{N}\.{N}\.{N}
154*d56f51eaSDavid van Moolenbroek V6544		{W}:{W}:{W}:{W}::{W}:{N}\.{N}\.{N}\.{N}
155*d56f51eaSDavid van Moolenbroek V6554		{W}:{W}:{W}:{W}:{W}::{N}\.{N}\.{N}\.{N}
156*d56f51eaSDavid van Moolenbroek 
157*d56f51eaSDavid van Moolenbroek V6404		::{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
158*d56f51eaSDavid van Moolenbroek V6414		{W}::{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
159*d56f51eaSDavid van Moolenbroek V6424		{W}:{W}::{W}:{W}:{N}\.{N}\.{N}\.{N}
160*d56f51eaSDavid van Moolenbroek V6434		{W}:{W}:{W}::{W}:{N}\.{N}\.{N}\.{N}
161*d56f51eaSDavid van Moolenbroek V6444		{W}:{W}:{W}:{W}::{N}\.{N}\.{N}\.{N}
162*d56f51eaSDavid van Moolenbroek 
163*d56f51eaSDavid van Moolenbroek V6304		::{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
164*d56f51eaSDavid van Moolenbroek V6314		{W}::{W}:{W}:{N}\.{N}\.{N}\.{N}
165*d56f51eaSDavid van Moolenbroek V6324		{W}:{W}::{W}:{N}\.{N}\.{N}\.{N}
166*d56f51eaSDavid van Moolenbroek V6334		{W}:{W}:{W}::{N}\.{N}\.{N}\.{N}
167*d56f51eaSDavid van Moolenbroek 
168*d56f51eaSDavid van Moolenbroek V6204		::{W}:{W}:{N}\.{N}\.{N}\.{N}
169*d56f51eaSDavid van Moolenbroek V6214		{W}::{W}:{N}\.{N}\.{N}\.{N}
170*d56f51eaSDavid van Moolenbroek V6224		{W}:{W}::{N}\.{N}\.{N}\.{N}
171*d56f51eaSDavid van Moolenbroek 
172*d56f51eaSDavid van Moolenbroek V6104		::{W}:{N}\.{N}\.{N}\.{N}
173*d56f51eaSDavid van Moolenbroek V6114		{W}::{N}\.{N}\.{N}\.{N}
174*d56f51eaSDavid van Moolenbroek 
175*d56f51eaSDavid van Moolenbroek V6004		::{N}\.{N}\.{N}\.{N}
176*d56f51eaSDavid van Moolenbroek 
177*d56f51eaSDavid van Moolenbroek 
178*d56f51eaSDavid van Moolenbroek 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})
179*d56f51eaSDavid van Moolenbroek 
180*d56f51eaSDavid van Moolenbroek MAC		({B}:{B}:{B}:{B}:{B}:{B}|{B}\-{B}\-{B}\-{B}\-{B}\-{B}|{B}\.{B}\.{B}\.{B}\.{B}\.{B}|{B2}\.{B2}\.{B2}|{B2}{3})
181*d56f51eaSDavid van Moolenbroek 
182*d56f51eaSDavid van Moolenbroek 
183*d56f51eaSDavid van Moolenbroek 
184*d56f51eaSDavid van Moolenbroek %option nounput
185*d56f51eaSDavid van Moolenbroek %option noinput
186*d56f51eaSDavid van Moolenbroek 
187*d56f51eaSDavid van Moolenbroek %%
188*d56f51eaSDavid van Moolenbroek dst		return DST;
189*d56f51eaSDavid van Moolenbroek src		return SRC;
190*d56f51eaSDavid van Moolenbroek 
191*d56f51eaSDavid van Moolenbroek link|ether|ppp|slip  return LINK;
192*d56f51eaSDavid van Moolenbroek fddi|tr|wlan	return LINK;
193*d56f51eaSDavid van Moolenbroek arp		return ARP;
194*d56f51eaSDavid van Moolenbroek rarp		return RARP;
195*d56f51eaSDavid van Moolenbroek ip		return IP;
196*d56f51eaSDavid van Moolenbroek sctp		return SCTP;
197*d56f51eaSDavid van Moolenbroek tcp		return TCP;
198*d56f51eaSDavid van Moolenbroek udp		return UDP;
199*d56f51eaSDavid van Moolenbroek icmp		return ICMP;
200*d56f51eaSDavid van Moolenbroek igmp		return IGMP;
201*d56f51eaSDavid van Moolenbroek igrp		return IGRP;
202*d56f51eaSDavid van Moolenbroek pim		return PIM;
203*d56f51eaSDavid van Moolenbroek vrrp		return VRRP;
204*d56f51eaSDavid van Moolenbroek carp		return CARP;
205*d56f51eaSDavid van Moolenbroek radio		return RADIO;
206*d56f51eaSDavid van Moolenbroek 
207*d56f51eaSDavid van Moolenbroek ip6		return IPV6;
208*d56f51eaSDavid van Moolenbroek icmp6		return ICMPV6;
209*d56f51eaSDavid van Moolenbroek ah		return AH;
210*d56f51eaSDavid van Moolenbroek esp		return ESP;
211*d56f51eaSDavid van Moolenbroek 
212*d56f51eaSDavid van Moolenbroek atalk		return ATALK;
213*d56f51eaSDavid van Moolenbroek aarp		return AARP;
214*d56f51eaSDavid van Moolenbroek decnet		return DECNET;
215*d56f51eaSDavid van Moolenbroek lat		return LAT;
216*d56f51eaSDavid van Moolenbroek sca		return SCA;
217*d56f51eaSDavid van Moolenbroek moprc		return MOPRC;
218*d56f51eaSDavid van Moolenbroek mopdl		return MOPDL;
219*d56f51eaSDavid van Moolenbroek 
220*d56f51eaSDavid van Moolenbroek iso		return ISO;
221*d56f51eaSDavid van Moolenbroek esis		return ESIS;
222*d56f51eaSDavid van Moolenbroek es-is		return ESIS;
223*d56f51eaSDavid van Moolenbroek isis		return ISIS;
224*d56f51eaSDavid van Moolenbroek is-is		return ISIS;
225*d56f51eaSDavid van Moolenbroek l1              return L1;
226*d56f51eaSDavid van Moolenbroek l2              return L2;
227*d56f51eaSDavid van Moolenbroek iih             return IIH;
228*d56f51eaSDavid van Moolenbroek lsp             return LSP;
229*d56f51eaSDavid van Moolenbroek snp             return SNP;
230*d56f51eaSDavid van Moolenbroek csnp            return CSNP;
231*d56f51eaSDavid van Moolenbroek psnp            return PSNP;
232*d56f51eaSDavid van Moolenbroek 
233*d56f51eaSDavid van Moolenbroek clnp		return CLNP;
234*d56f51eaSDavid van Moolenbroek 
235*d56f51eaSDavid van Moolenbroek stp		return STP;
236*d56f51eaSDavid van Moolenbroek 
237*d56f51eaSDavid van Moolenbroek ipx		return IPX;
238*d56f51eaSDavid van Moolenbroek 
239*d56f51eaSDavid van Moolenbroek netbeui		return NETBEUI;
240*d56f51eaSDavid van Moolenbroek 
241*d56f51eaSDavid van Moolenbroek host		return HOST;
242*d56f51eaSDavid van Moolenbroek net		return NET;
243*d56f51eaSDavid van Moolenbroek mask		return NETMASK;
244*d56f51eaSDavid van Moolenbroek port		return PORT;
245*d56f51eaSDavid van Moolenbroek portrange	return PORTRANGE;
246*d56f51eaSDavid van Moolenbroek proto		return PROTO;
247*d56f51eaSDavid van Moolenbroek protochain	{
248*d56f51eaSDavid van Moolenbroek #ifdef NO_PROTOCHAIN
249*d56f51eaSDavid van Moolenbroek 		  bpf_error("%s not supported", yytext);
250*d56f51eaSDavid van Moolenbroek #else
251*d56f51eaSDavid van Moolenbroek 		  return PROTOCHAIN;
252*d56f51eaSDavid van Moolenbroek #endif
253*d56f51eaSDavid van Moolenbroek 		}
254*d56f51eaSDavid van Moolenbroek 
255*d56f51eaSDavid van Moolenbroek gateway		return GATEWAY;
256*d56f51eaSDavid van Moolenbroek 
257*d56f51eaSDavid van Moolenbroek type		return TYPE;
258*d56f51eaSDavid van Moolenbroek subtype		return SUBTYPE;
259*d56f51eaSDavid van Moolenbroek direction|dir	return DIR;
260*d56f51eaSDavid van Moolenbroek address1|addr1	return ADDR1;
261*d56f51eaSDavid van Moolenbroek address2|addr2	return ADDR2;
262*d56f51eaSDavid van Moolenbroek address3|addr3	return ADDR3;
263*d56f51eaSDavid van Moolenbroek address4|addr4	return ADDR4;
264*d56f51eaSDavid van Moolenbroek ra		return RA;
265*d56f51eaSDavid van Moolenbroek ta		return TA;
266*d56f51eaSDavid van Moolenbroek 
267*d56f51eaSDavid van Moolenbroek less		return LESS;
268*d56f51eaSDavid van Moolenbroek greater		return GREATER;
269*d56f51eaSDavid van Moolenbroek byte		return CBYTE;
270*d56f51eaSDavid van Moolenbroek broadcast	return TK_BROADCAST;
271*d56f51eaSDavid van Moolenbroek multicast	return TK_MULTICAST;
272*d56f51eaSDavid van Moolenbroek 
273*d56f51eaSDavid van Moolenbroek and|"&&"	return AND;
274*d56f51eaSDavid van Moolenbroek or|"||"		return OR;
275*d56f51eaSDavid van Moolenbroek not		return '!';
276*d56f51eaSDavid van Moolenbroek 
277*d56f51eaSDavid van Moolenbroek len|length	return LEN;
278*d56f51eaSDavid van Moolenbroek inbound		return INBOUND;
279*d56f51eaSDavid van Moolenbroek outbound	return OUTBOUND;
280*d56f51eaSDavid van Moolenbroek 
281*d56f51eaSDavid van Moolenbroek vlan		return VLAN;
282*d56f51eaSDavid van Moolenbroek mpls		return MPLS;
283*d56f51eaSDavid van Moolenbroek pppoed		return PPPOED;
284*d56f51eaSDavid van Moolenbroek pppoes		return PPPOES;
285*d56f51eaSDavid van Moolenbroek geneve		return GENEVE;
286*d56f51eaSDavid van Moolenbroek 
287*d56f51eaSDavid van Moolenbroek lane		return LANE;
288*d56f51eaSDavid van Moolenbroek llc		return LLC;
289*d56f51eaSDavid van Moolenbroek metac		return METAC;
290*d56f51eaSDavid van Moolenbroek bcc		return BCC;
291*d56f51eaSDavid van Moolenbroek oam		return OAM;
292*d56f51eaSDavid van Moolenbroek oamf4		return OAMF4;
293*d56f51eaSDavid van Moolenbroek oamf4ec		return OAMF4EC;
294*d56f51eaSDavid van Moolenbroek oamf4sc		return OAMF4SC;
295*d56f51eaSDavid van Moolenbroek sc		return SC;
296*d56f51eaSDavid van Moolenbroek ilmic		return ILMIC;
297*d56f51eaSDavid van Moolenbroek vpi		return VPI;
298*d56f51eaSDavid van Moolenbroek vci		return VCI;
299*d56f51eaSDavid van Moolenbroek connectmsg	return CONNECTMSG;
300*d56f51eaSDavid van Moolenbroek metaconnect	return METACONNECT;
301*d56f51eaSDavid van Moolenbroek 
302*d56f51eaSDavid van Moolenbroek on|ifname	return PF_IFNAME;
303*d56f51eaSDavid van Moolenbroek rset|ruleset	return PF_RSET;
304*d56f51eaSDavid van Moolenbroek rnr|rulenum	return PF_RNR;
305*d56f51eaSDavid van Moolenbroek srnr|subrulenum	return PF_SRNR;
306*d56f51eaSDavid van Moolenbroek reason		return PF_REASON;
307*d56f51eaSDavid van Moolenbroek action		return PF_ACTION;
308*d56f51eaSDavid van Moolenbroek 
309*d56f51eaSDavid van Moolenbroek fisu		return FISU;
310*d56f51eaSDavid van Moolenbroek lssu		return LSSU;
311*d56f51eaSDavid van Moolenbroek lsu		return LSSU;
312*d56f51eaSDavid van Moolenbroek msu		return MSU;
313*d56f51eaSDavid van Moolenbroek hfisu		return HFISU;
314*d56f51eaSDavid van Moolenbroek hlssu		return HLSSU;
315*d56f51eaSDavid van Moolenbroek hmsu		return HMSU;
316*d56f51eaSDavid van Moolenbroek sio		return SIO;
317*d56f51eaSDavid van Moolenbroek opc		return OPC;
318*d56f51eaSDavid van Moolenbroek dpc		return DPC;
319*d56f51eaSDavid van Moolenbroek sls		return SLS;
320*d56f51eaSDavid van Moolenbroek hsio		return HSIO;
321*d56f51eaSDavid van Moolenbroek hopc		return HOPC;
322*d56f51eaSDavid van Moolenbroek hdpc		return HDPC;
323*d56f51eaSDavid van Moolenbroek hsls		return HSLS;
324*d56f51eaSDavid van Moolenbroek 
325*d56f51eaSDavid van Moolenbroek [ \r\n\t]		;
326*d56f51eaSDavid van Moolenbroek [+\-*/%:\[\]!<>()&|\^=]	return yytext[0];
327*d56f51eaSDavid van Moolenbroek ">="			return GEQ;
328*d56f51eaSDavid van Moolenbroek "<="			return LEQ;
329*d56f51eaSDavid van Moolenbroek "!="			return NEQ;
330*d56f51eaSDavid van Moolenbroek "=="			return '=';
331*d56f51eaSDavid van Moolenbroek "<<"			return LSH;
332*d56f51eaSDavid van Moolenbroek ">>"			return RSH;
333*d56f51eaSDavid van Moolenbroek ${B}			{ yylval.e = pcap_ether_aton(((char *)yytext)+1);
334*d56f51eaSDavid van Moolenbroek 			  if (yylval.e == NULL)
335*d56f51eaSDavid van Moolenbroek 				bpf_error("malloc");
336*d56f51eaSDavid van Moolenbroek 			  return AID; }
337*d56f51eaSDavid van Moolenbroek {MAC}			{ yylval.e = pcap_ether_aton((char *)yytext);
338*d56f51eaSDavid van Moolenbroek 			  if (yylval.e == NULL)
339*d56f51eaSDavid van Moolenbroek 				bpf_error("malloc");
340*d56f51eaSDavid van Moolenbroek 			  return EID; }
341*d56f51eaSDavid van Moolenbroek {N}			{ yylval.i = stoi((char *)yytext); return NUM; }
342*d56f51eaSDavid van Moolenbroek ({N}\.{N})|({N}\.{N}\.{N})|({N}\.{N}\.{N}\.{N})	{
343*d56f51eaSDavid van Moolenbroek 			yylval.s = sdup((char *)yytext); return HID; }
344*d56f51eaSDavid van Moolenbroek {V6}			{
345*d56f51eaSDavid van Moolenbroek #ifdef INET6
346*d56f51eaSDavid van Moolenbroek 			  struct addrinfo hints, *res;
347*d56f51eaSDavid van Moolenbroek 			  memset(&hints, 0, sizeof(hints));
348*d56f51eaSDavid van Moolenbroek 			  hints.ai_family = AF_INET6;
349*d56f51eaSDavid van Moolenbroek 			  hints.ai_flags = AI_NUMERICHOST;
350*d56f51eaSDavid van Moolenbroek 			  if (getaddrinfo(yytext, NULL, &hints, &res))
351*d56f51eaSDavid van Moolenbroek 				bpf_error("bogus IPv6 address %s", yytext);
352*d56f51eaSDavid van Moolenbroek 			  else {
353*d56f51eaSDavid van Moolenbroek 				freeaddrinfo(res);
354*d56f51eaSDavid van Moolenbroek 				yylval.s = sdup((char *)yytext); return HID6;
355*d56f51eaSDavid van Moolenbroek 			  }
356*d56f51eaSDavid van Moolenbroek #else
357*d56f51eaSDavid van Moolenbroek 			  bpf_error("IPv6 address %s not supported", yytext);
358*d56f51eaSDavid van Moolenbroek #endif /*INET6*/
359*d56f51eaSDavid van Moolenbroek 			}
360*d56f51eaSDavid van Moolenbroek {B}:+({B}:+)+		{ bpf_error("bogus ethernet address %s", yytext); }
361*d56f51eaSDavid van Moolenbroek icmptype		{ yylval.i = 0; return NUM; }
362*d56f51eaSDavid van Moolenbroek icmpcode		{ yylval.i = 1; return NUM; }
363*d56f51eaSDavid van Moolenbroek icmp-echoreply		{ yylval.i = 0; return NUM; }
364*d56f51eaSDavid van Moolenbroek icmp-unreach		{ yylval.i = 3; return NUM; }
365*d56f51eaSDavid van Moolenbroek icmp-sourcequench	{ yylval.i = 4; return NUM; }
366*d56f51eaSDavid van Moolenbroek icmp-redirect		{ yylval.i = 5; return NUM; }
367*d56f51eaSDavid van Moolenbroek icmp-echo		{ yylval.i = 8; return NUM; }
368*d56f51eaSDavid van Moolenbroek icmp-routeradvert	{ yylval.i = 9; return NUM; }
369*d56f51eaSDavid van Moolenbroek icmp-routersolicit	{ yylval.i = 10; return NUM; }
370*d56f51eaSDavid van Moolenbroek icmp-timxceed		{ yylval.i = 11; return NUM; }
371*d56f51eaSDavid van Moolenbroek icmp-paramprob		{ yylval.i = 12; return NUM; }
372*d56f51eaSDavid van Moolenbroek icmp-tstamp		{ yylval.i = 13; return NUM; }
373*d56f51eaSDavid van Moolenbroek icmp-tstampreply	{ yylval.i = 14; return NUM; }
374*d56f51eaSDavid van Moolenbroek icmp-ireq		{ yylval.i = 15; return NUM; }
375*d56f51eaSDavid van Moolenbroek icmp-ireqreply		{ yylval.i = 16; return NUM; }
376*d56f51eaSDavid van Moolenbroek icmp-maskreq		{ yylval.i = 17; return NUM; }
377*d56f51eaSDavid van Moolenbroek icmp-maskreply		{ yylval.i = 18; return NUM; }
378*d56f51eaSDavid van Moolenbroek tcpflags		{ yylval.i = 13; return NUM; }
379*d56f51eaSDavid van Moolenbroek tcp-fin			{ yylval.i = 0x01; return NUM; }
380*d56f51eaSDavid van Moolenbroek tcp-syn			{ yylval.i = 0x02; return NUM; }
381*d56f51eaSDavid van Moolenbroek tcp-rst			{ yylval.i = 0x04; return NUM; }
382*d56f51eaSDavid van Moolenbroek tcp-push		{ yylval.i = 0x08; return NUM; }
383*d56f51eaSDavid van Moolenbroek tcp-ack			{ yylval.i = 0x10; return NUM; }
384*d56f51eaSDavid van Moolenbroek tcp-urg			{ yylval.i = 0x20; return NUM; }
385*d56f51eaSDavid van Moolenbroek [A-Za-z0-9]([-_.A-Za-z0-9]*[.A-Za-z0-9])? {
386*d56f51eaSDavid van Moolenbroek 			 yylval.s = sdup((char *)yytext); return ID; }
387*d56f51eaSDavid van Moolenbroek "\\"[^ !()\n\t]+	{ yylval.s = sdup((char *)yytext + 1); return ID; }
388*d56f51eaSDavid van Moolenbroek [^ \[\]\t\n\-_.A-Za-z0-9!<>()&|=]+ {
389*d56f51eaSDavid van Moolenbroek 			bpf_error("illegal token: %s", yytext); }
390*d56f51eaSDavid van Moolenbroek .			{ bpf_error("illegal char '%c'", *yytext); }
391*d56f51eaSDavid van Moolenbroek %%
392*d56f51eaSDavid van Moolenbroek void
lex_init(buf)393*d56f51eaSDavid van Moolenbroek lex_init(buf)
394*d56f51eaSDavid van Moolenbroek 	const char *buf;
395*d56f51eaSDavid van Moolenbroek {
396*d56f51eaSDavid van Moolenbroek #ifdef FLEX_SCANNER
397*d56f51eaSDavid van Moolenbroek 	in_buffer = yy_scan_string(buf);
398*d56f51eaSDavid van Moolenbroek #else
399*d56f51eaSDavid van Moolenbroek 	in_buffer = buf;
400*d56f51eaSDavid van Moolenbroek #endif
401*d56f51eaSDavid van Moolenbroek }
402*d56f51eaSDavid van Moolenbroek 
403*d56f51eaSDavid van Moolenbroek /*
404*d56f51eaSDavid van Moolenbroek  * Do any cleanup necessary after parsing.
405*d56f51eaSDavid van Moolenbroek  */
406*d56f51eaSDavid van Moolenbroek void
lex_cleanup()407*d56f51eaSDavid van Moolenbroek lex_cleanup()
408*d56f51eaSDavid van Moolenbroek {
409*d56f51eaSDavid van Moolenbroek #ifdef FLEX_SCANNER
410*d56f51eaSDavid van Moolenbroek 	if (in_buffer != NULL)
411*d56f51eaSDavid van Moolenbroek 		yy_delete_buffer(in_buffer);
412*d56f51eaSDavid van Moolenbroek 	in_buffer = NULL;
413*d56f51eaSDavid van Moolenbroek #endif
414*d56f51eaSDavid van Moolenbroek }
415*d56f51eaSDavid van Moolenbroek 
416*d56f51eaSDavid van Moolenbroek /*
417*d56f51eaSDavid van Moolenbroek  * Also define a yywrap.  Note that if we're using flex, it will
418*d56f51eaSDavid van Moolenbroek  * define a macro to map this identifier to pcap_wrap.
419*d56f51eaSDavid van Moolenbroek  */
420*d56f51eaSDavid van Moolenbroek int
yywrap()421*d56f51eaSDavid van Moolenbroek yywrap()
422*d56f51eaSDavid van Moolenbroek {
423*d56f51eaSDavid van Moolenbroek 	return 1;
424*d56f51eaSDavid van Moolenbroek }
425*d56f51eaSDavid van Moolenbroek 
426*d56f51eaSDavid van Moolenbroek /* Hex digit to integer. */
427*d56f51eaSDavid van Moolenbroek static inline int
xdtoi(c)428*d56f51eaSDavid van Moolenbroek xdtoi(c)
429*d56f51eaSDavid van Moolenbroek 	register int c;
430*d56f51eaSDavid van Moolenbroek {
431*d56f51eaSDavid van Moolenbroek 	if (isdigit(c))
432*d56f51eaSDavid van Moolenbroek 		return c - '0';
433*d56f51eaSDavid van Moolenbroek 	else if (islower(c))
434*d56f51eaSDavid van Moolenbroek 		return c - 'a' + 10;
435*d56f51eaSDavid van Moolenbroek 	else
436*d56f51eaSDavid van Moolenbroek 		return c - 'A' + 10;
437*d56f51eaSDavid van Moolenbroek }
438*d56f51eaSDavid van Moolenbroek 
439*d56f51eaSDavid van Moolenbroek /*
440*d56f51eaSDavid van Moolenbroek  * Convert string to integer.  Just like atoi(), but checks for
441*d56f51eaSDavid van Moolenbroek  * preceding 0x or 0 and uses hex or octal instead of decimal.
442*d56f51eaSDavid van Moolenbroek  */
443*d56f51eaSDavid van Moolenbroek static int
stoi(s)444*d56f51eaSDavid van Moolenbroek stoi(s)
445*d56f51eaSDavid van Moolenbroek 	char *s;
446*d56f51eaSDavid van Moolenbroek {
447*d56f51eaSDavid van Moolenbroek 	int base = 10;
448*d56f51eaSDavid van Moolenbroek 	int n = 0;
449*d56f51eaSDavid van Moolenbroek 
450*d56f51eaSDavid van Moolenbroek 	if (*s == '0') {
451*d56f51eaSDavid van Moolenbroek 		if (s[1] == 'x' || s[1] == 'X') {
452*d56f51eaSDavid van Moolenbroek 			s += 2;
453*d56f51eaSDavid van Moolenbroek 			base = 16;
454*d56f51eaSDavid van Moolenbroek 		}
455*d56f51eaSDavid van Moolenbroek 		else {
456*d56f51eaSDavid van Moolenbroek 			base = 8;
457*d56f51eaSDavid van Moolenbroek 			s += 1;
458*d56f51eaSDavid van Moolenbroek 		}
459*d56f51eaSDavid van Moolenbroek 	}
460*d56f51eaSDavid van Moolenbroek 	while (*s)
461*d56f51eaSDavid van Moolenbroek 		n = n * base + xdtoi(*s++);
462*d56f51eaSDavid van Moolenbroek 
463*d56f51eaSDavid van Moolenbroek 	return n;
464*d56f51eaSDavid van Moolenbroek }
465