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