117683Spst%{
217683Spst/*
339294Sfenner * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
417683Spst *	The Regents of the University of California.  All rights reserved.
517683Spst *
617683Spst * Redistribution and use in source and binary forms, with or without
717683Spst * modification, are permitted provided that: (1) source code distributions
817683Spst * retain the above copyright notice and this paragraph in its entirety, (2)
917683Spst * distributions including binary code include the above copyright notice and
1017683Spst * this paragraph in its entirety in the documentation or other materials
1117683Spst * provided with the distribution, and (3) all advertising materials mentioning
1217683Spst * features or use of this software display the following acknowledgement:
1317683Spst * ``This product includes software developed by the University of California,
1417683Spst * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
1517683Spst * the University nor the names of its contributors may be used to endorse
1617683Spst * or promote products derived from this software without specific prior
1717683Spst * written permission.
1817683Spst * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
1917683Spst * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
2017683Spst * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
2156891Sfenner *
2256891Sfenner * $FreeBSD: releng/10.3/contrib/libpcap/scanner.l 251129 2013-05-30 08:02:00Z delphij $
2317683Spst */
2417683Spst
2517683Spst#ifndef lint
26127667Sbmsstatic const char rcsid[] _U_ =
27214518Srpaulo    "@(#) $Header: /tcpdump/master/libpcap/scanner.l,v 1.112 2008-02-06 10:21:30 guy Exp $ (LBL)";
2817683Spst#endif
2917683Spst
3075110Sfenner#ifdef HAVE_CONFIG_H
3175110Sfenner#include "config.h"
3275110Sfenner#endif
3375110Sfenner
34214518Srpaulo#ifdef WIN32
35214518Srpaulo#include <pcap-stdinc.h>
36214518Srpaulo#else /* WIN32 */
37214518Srpaulo#if HAVE_INTTYPES_H
38214518Srpaulo#include <inttypes.h>
39214518Srpaulo#elif HAVE_STDINT_H
40214518Srpaulo#include <stdint.h>
41214518Srpaulo#endif
42214518Srpaulo#ifdef HAVE_SYS_BITYPES_H
43214518Srpaulo#include <sys/bitypes.h>
44214518Srpaulo#endif
45214518Srpaulo#include <sys/types.h>
46214518Srpaulo#endif /* WIN32 */
47214518Srpaulo
4817683Spst#include <ctype.h>
4956891Sfenner#include <string.h>
5017683Spst
5117683Spst#include "pcap-int.h"
5217683Spst
5317683Spst#include "gencode.h"
5456891Sfenner#ifdef INET6
55127667Sbms#ifdef WIN32
56127667Sbms#include <pcap-stdinc.h>
57127667Sbms
58127667Sbms#ifdef __MINGW32__
59235426Sdelphij#include "ip6_misc.h"
60127667Sbms#endif
61127667Sbms#else /* WIN32 */
62127667Sbms#include <sys/socket.h>	/* for "struct sockaddr" in "struct addrinfo" */
63127667Sbms#include <netdb.h>	/* for "struct addrinfo" */
64127667Sbms#endif /* WIN32 */
65127667Sbms
6675110Sfenner/* Workaround for AIX 4.3 */
6775110Sfenner#if !defined(AI_NUMERICHOST)
6875110Sfenner#define AI_NUMERICHOST 0x04
6975110Sfenner#endif
7056891Sfenner#endif /*INET6*/
71190225Srpaulo#include <pcap/namedb.h>
7217683Spst#include "tokdefs.h"
7317683Spst
7417683Spst#ifdef HAVE_OS_PROTO_H
7517683Spst#include "os-proto.h"
7617683Spst#endif
7717683Spst
7817683Spststatic int stoi(char *);
7917683Spststatic inline int xdtoi(int);
8017683Spst
8117683Spst#ifdef FLEX_SCANNER
82235426Sdelphij#define YY_NO_INPUT
8326178Sfenner#define YY_NO_UNPUT
8475110Sfennerstatic YY_BUFFER_STATE in_buffer;
8517683Spst#else
86214518Srpaulostatic const char *in_buffer;
8775110Sfenner
8817683Spst#undef getc
8917683Spst#define getc(fp)  (*in_buffer == 0 ? EOF : *in_buffer++)
9017683Spst#endif
9117683Spst
9217683Spstextern YYSTYPE yylval;
9317683Spst
9417683Spst%}
9517683Spst
9617683SpstN		([0-9]+|(0X|0x)[0-9A-Fa-f]+)
9717683SpstB		([0-9A-Fa-f][0-9A-Fa-f]?)
98190225SrpauloB2		([0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f])
9956891SfennerW		([0-9A-Fa-f][0-9A-Fa-f]?[0-9A-Fa-f]?[0-9A-Fa-f]?)
10017683Spst
101172680Smlaier%a 18400
102172680Smlaier%o 21500
103172680Smlaier%e 7600
104172680Smlaier%k 4550
105172680Smlaier%p 27600
10675110Sfenner%n 2000
10717683Spst
10856891SfennerV680		{W}:{W}:{W}:{W}:{W}:{W}:{W}:{W}
10956891Sfenner
11056891SfennerV670		::{W}:{W}:{W}:{W}:{W}:{W}:{W}
11156891SfennerV671		{W}::{W}:{W}:{W}:{W}:{W}:{W}
11256891SfennerV672		{W}:{W}::{W}:{W}:{W}:{W}:{W}
11356891SfennerV673		{W}:{W}:{W}::{W}:{W}:{W}:{W}
11456891SfennerV674		{W}:{W}:{W}:{W}::{W}:{W}:{W}
11556891SfennerV675		{W}:{W}:{W}:{W}:{W}::{W}:{W}
11656891SfennerV676		{W}:{W}:{W}:{W}:{W}:{W}::{W}
11756891SfennerV677		{W}:{W}:{W}:{W}:{W}:{W}:{W}::
11856891Sfenner
11956891SfennerV660		::{W}:{W}:{W}:{W}:{W}:{W}
12056891SfennerV661		{W}::{W}:{W}:{W}:{W}:{W}
12156891SfennerV662		{W}:{W}::{W}:{W}:{W}:{W}
12256891SfennerV663		{W}:{W}:{W}::{W}:{W}:{W}
12356891SfennerV664		{W}:{W}:{W}:{W}::{W}:{W}
12456891SfennerV665		{W}:{W}:{W}:{W}:{W}::{W}
12556891SfennerV666		{W}:{W}:{W}:{W}:{W}:{W}::
12656891Sfenner
12756891SfennerV650		::{W}:{W}:{W}:{W}:{W}
12856891SfennerV651		{W}::{W}:{W}:{W}:{W}
12956891SfennerV652		{W}:{W}::{W}:{W}:{W}
13056891SfennerV653		{W}:{W}:{W}::{W}:{W}
13156891SfennerV654		{W}:{W}:{W}:{W}::{W}
13256891SfennerV655		{W}:{W}:{W}:{W}:{W}::
13356891Sfenner
13456891SfennerV640		::{W}:{W}:{W}:{W}
13556891SfennerV641		{W}::{W}:{W}:{W}
13656891SfennerV642		{W}:{W}::{W}:{W}
13756891SfennerV643		{W}:{W}:{W}::{W}
13856891SfennerV644		{W}:{W}:{W}:{W}::
13956891Sfenner
14056891SfennerV630		::{W}:{W}:{W}
14156891SfennerV631		{W}::{W}:{W}
14256891SfennerV632		{W}:{W}::{W}
14356891SfennerV633		{W}:{W}:{W}::
14456891Sfenner
14556891SfennerV620		::{W}:{W}
14656891SfennerV621		{W}::{W}
14756891SfennerV622		{W}:{W}::
14856891Sfenner
14956891SfennerV610		::{W}
15056891SfennerV611		{W}::
15156891Sfenner
15256891SfennerV600		::
15356891Sfenner
15456891SfennerV6604		{W}:{W}:{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
15556891Sfenner
15656891SfennerV6504		::{W}:{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
15756891SfennerV6514		{W}::{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
15856891SfennerV6524		{W}:{W}::{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
15956891SfennerV6534		{W}:{W}:{W}::{W}:{W}:{N}\.{N}\.{N}\.{N}
16056891SfennerV6544		{W}:{W}:{W}:{W}::{W}:{N}\.{N}\.{N}\.{N}
16156891SfennerV6554		{W}:{W}:{W}:{W}:{W}::{N}\.{N}\.{N}\.{N}
16256891Sfenner
16356891SfennerV6404		::{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
16456891SfennerV6414		{W}::{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
16556891SfennerV6424		{W}:{W}::{W}:{W}:{N}\.{N}\.{N}\.{N}
16656891SfennerV6434		{W}:{W}:{W}::{W}:{N}\.{N}\.{N}\.{N}
16756891SfennerV6444		{W}:{W}:{W}:{W}::{N}\.{N}\.{N}\.{N}
16856891Sfenner
16956891SfennerV6304		::{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
17056891SfennerV6314		{W}::{W}:{W}:{N}\.{N}\.{N}\.{N}
17156891SfennerV6324		{W}:{W}::{W}:{N}\.{N}\.{N}\.{N}
17256891SfennerV6334		{W}:{W}:{W}::{N}\.{N}\.{N}\.{N}
17356891Sfenner
17456891SfennerV6204		::{W}:{W}:{N}\.{N}\.{N}\.{N}
17556891SfennerV6214		{W}::{W}:{N}\.{N}\.{N}\.{N}
17656891SfennerV6224		{W}:{W}::{N}\.{N}\.{N}\.{N}
17756891Sfenner
17856891SfennerV6104		::{W}:{N}\.{N}\.{N}\.{N}
17956891SfennerV6114		{W}::{N}\.{N}\.{N}\.{N}
18056891Sfenner
18156891SfennerV6004		::{N}\.{N}\.{N}\.{N}
18256891Sfenner
18356891Sfenner
18456891SfennerV6		({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})
18556891Sfenner
186190225SrpauloMAC		({B}:{B}:{B}:{B}:{B}:{B}|{B}\-{B}\-{B}\-{B}\-{B}\-{B}|{B}\.{B}\.{B}\.{B}\.{B}\.{B}|{B2}\.{B2}\.{B2}|{B2}{3})
187190225Srpaulo
188190225Srpaulo
189190225Srpaulo
19017683Spst%%
19117683Spstdst		return DST;
19217683Spstsrc		return SRC;
19317683Spst
19417683Spstlink|ether|ppp|slip  return LINK;
195127667Sbmsfddi|tr|wlan	return LINK;
19617683Spstarp		return ARP;
19717683Spstrarp		return RARP;
19817683Spstip		return IP;
19998533Sfennersctp		return SCTP;
20017683Spsttcp		return TCP;
20117683Spstudp		return UDP;
20217683Spsticmp		return ICMP;
20317683Spstigmp		return IGMP;
20417683Spstigrp		return IGRP;
20556891Sfennerpim		return PIM;
20698533Sfennervrrp		return VRRP;
207235426Sdelphijcarp		return CARP;
208147897Ssamradio		return RADIO;
20917683Spst
210251129Sdelphijip6		return IPV6;
211251129Sdelphijicmp6		return ICMPV6;
21256891Sfennerah		return AH;
21356891Sfenneresp		return ESP;
21456891Sfenner
21517683Spstatalk		return ATALK;
21675110Sfenneraarp		return AARP;
21717683Spstdecnet		return DECNET;
21817683Spstlat		return LAT;
21917683Spstsca		return SCA;
22017683Spstmoprc		return MOPRC;
22117683Spstmopdl		return MOPDL;
22217683Spst
22317749Spstiso		return ISO;
22417749Spstesis		return ESIS;
22517749Spstes-is		return ESIS;
22617749Spstisis		return ISIS;
22717749Spstis-is		return ISIS;
228127667Sbmsl1              return L1;
229127667Sbmsl2              return L2;
230127667Sbmsiih             return IIH;
231127667Sbmslsp             return LSP;
232127667Sbmssnp             return SNP;
233127667Sbmscsnp            return CSNP;
234127667Sbmspsnp            return PSNP;
235127667Sbms
23675110Sfennerclnp		return CLNP;
23717749Spst
23898533Sfennerstp		return STP;
23998533Sfenner
24098533Sfenneripx		return IPX;
24198533Sfenner
24298533Sfennernetbeui		return NETBEUI;
24398533Sfenner
24417683Spsthost		return HOST;
24517683Spstnet		return NET;
246127667Sbmsmask		return NETMASK;
24717683Spstport		return PORT;
248147897Ssamportrange	return PORTRANGE;
24917683Spstproto		return PROTO;
25056891Sfennerprotochain	{
25156891Sfenner#ifdef NO_PROTOCHAIN
25256891Sfenner		  bpf_error("%s not supported", yytext);
25356891Sfenner#else
25456891Sfenner		  return PROTOCHAIN;
25556891Sfenner#endif
25656891Sfenner		}
25717683Spst
25817683Spstgateway		return GATEWAY;
25917683Spst
260190225Srpaulotype		return TYPE;
261190225Srpaulosubtype		return SUBTYPE;
262190225Srpaulodirection|dir	return DIR;
263190225Srpauloaddress1|addr1	return ADDR1;
264190225Srpauloaddress2|addr2	return ADDR2;
265190225Srpauloaddress3|addr3	return ADDR3;
266190225Srpauloaddress4|addr4	return ADDR4;
267235426Sdelphijra		return RA;
268235426Sdelphijta		return TA;
269190225Srpaulo
27017683Spstless		return LESS;
27117683Spstgreater		return GREATER;
272127667Sbmsbyte		return CBYTE;
27317683Spstbroadcast	return TK_BROADCAST;
27417683Spstmulticast	return TK_MULTICAST;
27517683Spst
27617683Spstand|"&&"	return AND;
27717683Spstor|"||"		return OR;
27817683Spstnot		return '!';
27917683Spst
28017683Spstlen|length	return LEN;
28117683Spstinbound		return INBOUND;
28217683Spstoutbound	return OUTBOUND;
28317683Spst
28475110Sfennervlan		return VLAN;
285146771Ssammpls		return MPLS;
286162015Ssampppoed		return PPPOED;
287162015Ssampppoes		return PPPOES;
28875110Sfenner
289127667Sbmslane		return LANE;
290127667Sbmsllc		return LLC;
291127667Sbmsmetac		return METAC;
292127667Sbmsbcc		return BCC;
293127667Sbmsoam		return OAM;
294127667Sbmsoamf4		return OAMF4;
295127667Sbmsoamf4ec		return OAMF4EC;
296127667Sbmsoamf4sc		return OAMF4SC;
297127667Sbmssc		return SC;
298127667Sbmsilmic		return ILMIC;
299127667Sbmsvpi		return VPI;
300127667Sbmsvci		return VCI;
301127667Sbmsconnectmsg	return CONNECTMSG;
302127667Sbmsmetaconnect	return METACONNECT;
303127667Sbms
304127667Sbmson|ifname	return PF_IFNAME;
305127667Sbmsrset|ruleset	return PF_RSET;
306127667Sbmsrnr|rulenum	return PF_RNR;
307127667Sbmssrnr|subrulenum	return PF_SRNR;
308127667Sbmsreason		return PF_REASON;
309127667Sbmsaction		return PF_ACTION;
310127667Sbms
311172680Smlaierfisu		return FISU;
312172680Smlaierlssu		return LSSU;
313172680Smlaierlsu		return LSSU;
314172680Smlaiermsu		return MSU;
315147897Ssamsio		return SIO;
316147897Ssamopc		return OPC;
317147897Ssamdpc		return DPC;
318147897Ssamsls		return SLS;
319147897Ssam
320127667Sbms[ \r\n\t]		;
32117683Spst[+\-*/:\[\]!<>()&|=]	return yytext[0];
32217683Spst">="			return GEQ;
32317683Spst"<="			return LEQ;
32417683Spst"!="			return NEQ;
32517683Spst"=="			return '=';
32617683Spst"<<"			return LSH;
32717683Spst">>"			return RSH;
32898533Sfenner${B}			{ yylval.e = pcap_ether_aton(((char *)yytext)+1);
32998533Sfenner			  return AID; }
330190225Srpaulo{MAC}			{ yylval.e = pcap_ether_aton((char *)yytext);
331190225Srpaulo			  return EID; }
33217683Spst{N}			{ yylval.i = stoi((char *)yytext); return NUM; }
33317683Spst({N}\.{N})|({N}\.{N}\.{N})|({N}\.{N}\.{N}\.{N})	{
33439294Sfenner			yylval.s = sdup((char *)yytext); return HID; }
33556891Sfenner{V6}			{
33656891Sfenner#ifdef INET6
33756891Sfenner			  struct addrinfo hints, *res;
33856891Sfenner			  memset(&hints, 0, sizeof(hints));
33956891Sfenner			  hints.ai_family = AF_INET6;
34056891Sfenner			  hints.ai_flags = AI_NUMERICHOST;
34156891Sfenner			  if (getaddrinfo(yytext, NULL, &hints, &res))
34256891Sfenner				bpf_error("bogus IPv6 address %s", yytext);
34356891Sfenner			  else {
344214518Srpaulo				freeaddrinfo(res);
345127667Sbms				yylval.s = sdup((char *)yytext); return HID6;
34656891Sfenner			  }
34756891Sfenner#else
34856891Sfenner			  bpf_error("IPv6 address %s not supported", yytext);
34956891Sfenner#endif /*INET6*/
35056891Sfenner			}
35117683Spst{B}:+({B}:+)+		{ bpf_error("bogus ethernet address %s", yytext); }
35298533Sfennericmptype		{ yylval.i = 0; return NUM; }
35398533Sfennericmpcode		{ yylval.i = 1; return NUM; }
35498533Sfennericmp-echoreply		{ yylval.i = 0; return NUM; }
35598533Sfennericmp-unreach		{ yylval.i = 3; return NUM; }
35698533Sfennericmp-sourcequench	{ yylval.i = 4; return NUM; }
35798533Sfennericmp-redirect		{ yylval.i = 5; return NUM; }
35898533Sfennericmp-echo		{ yylval.i = 8; return NUM; }
35998533Sfennericmp-routeradvert	{ yylval.i = 9; return NUM; }
36098533Sfennericmp-routersolicit	{ yylval.i = 10; return NUM; }
36198533Sfennericmp-timxceed		{ yylval.i = 11; return NUM; }
36298533Sfennericmp-paramprob		{ yylval.i = 12; return NUM; }
36398533Sfennericmp-tstamp		{ yylval.i = 13; return NUM; }
36498533Sfennericmp-tstampreply	{ yylval.i = 14; return NUM; }
36598533Sfennericmp-ireq		{ yylval.i = 15; return NUM; }
36698533Sfennericmp-ireqreply		{ yylval.i = 16; return NUM; }
36798533Sfennericmp-maskreq		{ yylval.i = 17; return NUM; }
36898533Sfennericmp-maskreply		{ yylval.i = 18; return NUM; }
36998533Sfennertcpflags		{ yylval.i = 13; return NUM; }
37098533Sfennertcp-fin			{ yylval.i = 0x01; return NUM; }
37198533Sfennertcp-syn			{ yylval.i = 0x02; return NUM; }
37298533Sfennertcp-rst			{ yylval.i = 0x04; return NUM; }
37398533Sfennertcp-push		{ yylval.i = 0x08; return NUM; }
37498533Sfennertcp-ack			{ yylval.i = 0x10; return NUM; }
37598533Sfennertcp-urg			{ yylval.i = 0x20; return NUM; }
376250693Shirentcp-ece			{ yylval.i = 0x40; return NUM; }
377250693Shirentcp-cwr			{ yylval.i = 0x80; return NUM; }
37898533Sfenner[A-Za-z0-9]([-_.A-Za-z0-9]*[.A-Za-z0-9])? {
37939294Sfenner			 yylval.s = sdup((char *)yytext); return ID; }
38017683Spst"\\"[^ !()\n\t]+	{ yylval.s = sdup((char *)yytext + 1); return ID; }
38198533Sfenner[^ \[\]\t\n\-_.A-Za-z0-9!<>()&|=]+ {
38298533Sfenner			bpf_error("illegal token: %s", yytext); }
38317683Spst.			{ bpf_error("illegal char '%c'", *yytext); }
38417683Spst%%
38517683Spstvoid
38617683Spstlex_init(buf)
387172680Smlaier	const char *buf;
38817683Spst{
38975110Sfenner#ifdef FLEX_SCANNER
39075110Sfenner	in_buffer = yy_scan_string(buf);
39175110Sfenner#else
39217683Spst	in_buffer = buf;
39375110Sfenner#endif
39417683Spst}
39517683Spst
39617683Spst/*
39775110Sfenner * Do any cleanup necessary after parsing.
39875110Sfenner */
39975110Sfennervoid
40075110Sfennerlex_cleanup()
40175110Sfenner{
40275110Sfenner#ifdef FLEX_SCANNER
40375110Sfenner	if (in_buffer != NULL)
40475110Sfenner		yy_delete_buffer(in_buffer);
40575110Sfenner	in_buffer = NULL;
40675110Sfenner#endif
40775110Sfenner}
40875110Sfenner
40975110Sfenner/*
41017683Spst * Also define a yywrap.  Note that if we're using flex, it will
41117683Spst * define a macro to map this identifier to pcap_wrap.
41217683Spst */
41317683Spstint
41417683Spstyywrap()
41517683Spst{
41617683Spst	return 1;
41717683Spst}
41817683Spst
41917683Spst/* Hex digit to integer. */
42017683Spststatic inline int
42117683Spstxdtoi(c)
42217683Spst	register int c;
42317683Spst{
42417683Spst	if (isdigit(c))
42517683Spst		return c - '0';
42617683Spst	else if (islower(c))
42717683Spst		return c - 'a' + 10;
42817683Spst	else
42917683Spst		return c - 'A' + 10;
43017683Spst}
43117683Spst
43217683Spst/*
43317683Spst * Convert string to integer.  Just like atoi(), but checks for
43417683Spst * preceding 0x or 0 and uses hex or octal instead of decimal.
43517683Spst */
43617683Spststatic int
43717683Spststoi(s)
43817683Spst	char *s;
43917683Spst{
44017683Spst	int base = 10;
44117683Spst	int n = 0;
44217683Spst
44317683Spst	if (*s == '0') {
44417683Spst		if (s[1] == 'x' || s[1] == 'X') {
44517683Spst			s += 2;
44617683Spst			base = 16;
44717683Spst		}
44817683Spst		else {
44917683Spst			base = 8;
45017683Spst			s += 1;
45117683Spst		}
45217683Spst	}
45317683Spst	while (*s)
45417683Spst		n = n * base + xdtoi(*s++);
45517683Spst
45617683Spst	return n;
45717683Spst}
458