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