]> The Tcpdump Group git mirrors - libpcap/blobdiff - scanner.l
Support OpenBSD's "addr1", "addr2", "addr3", and "addr4" link-layer
[libpcap] / scanner.l
index 89403455241e78ff30995053a9a883604ccaea03..1231eaa1a2f4c83360570ec56550d9271304d8a0 100644 (file)
--- a/scanner.l
+++ b/scanner.l
  */
 
 #ifndef lint
-static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/libpcap/scanner.l,v 1.56.1.1 1999-10-07 23:46:40 mcr Exp $ (LBL)";
+static const char rcsid[] _U_ =
+    "@(#) $Header: /tcpdump/master/libpcap/scanner.l,v 1.110.2.1 2007-11-18 02:04:55 guy Exp $ (LBL)";
 #endif
 
-#include <sys/types.h>
-#include <sys/time.h>
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
 
 #include <ctype.h>
-#include <unistd.h>
+#include <string.h>
 
 #include "pcap-int.h"
 
 #include "gencode.h"
-#include <pcap-namedb.h>
+#ifdef INET6
+#ifdef WIN32
+#include <pcap-stdinc.h>
+
+#ifdef __MINGW32__
+#include "IP6_misc.h"
+#endif
+#else /* WIN32 */
+#include <sys/socket.h>        /* for "struct sockaddr" in "struct addrinfo" */
+#include <netdb.h>     /* for "struct addrinfo" */
+#endif /* WIN32 */
+
+/* Workaround for AIX 4.3 */
+#if !defined(AI_NUMERICHOST)
+#define AI_NUMERICHOST 0x04
+#endif
+#endif /*INET6*/
+#include <pcap/namedb.h>
 #include "tokdefs.h"
 
-#include "gnuc.h"
 #ifdef HAVE_OS_PROTO_H
 #include "os-proto.h"
 #endif
@@ -47,22 +64,10 @@ static inline int xdtoi(int);
 
 #ifdef FLEX_SCANNER
 #define YY_NO_UNPUT
-#undef YY_INPUT
-#define YY_INPUT(buf, result, max)\
- {\
-       char *src = in_buffer;\
-       int i;\
-\
-       if (*src == 0)\
-               result = YY_NULL;\
-       else {\
-               for (i = 0; *src && i < max; ++i)\
-                       buf[i] = *src++;\
-               in_buffer += i;\
-               result = i;\
-       }\
- }
+static YY_BUFFER_STATE in_buffer;
 #else
+static char *in_buffer;
+
 #undef getc
 #define getc(fp)  (*in_buffer == 0 ? EOF : *in_buffer++)
 #endif
@@ -70,48 +75,189 @@ static inline int xdtoi(int);
 #define yylval pcap_lval
 extern YYSTYPE yylval;
 
-static char *in_buffer;
-
 %}
 
 N              ([0-9]+|(0X|0x)[0-9A-Fa-f]+)
 B              ([0-9A-Fa-f][0-9A-Fa-f]?)
+W              ([0-9A-Fa-f][0-9A-Fa-f]?[0-9A-Fa-f]?[0-9A-Fa-f]?)
+
+%a 18400
+%o 21500
+%e 7600
+%k 4550
+%p 27600
+%n 2000
+
+V680           {W}:{W}:{W}:{W}:{W}:{W}:{W}:{W}
+
+V670           ::{W}:{W}:{W}:{W}:{W}:{W}:{W}
+V671           {W}::{W}:{W}:{W}:{W}:{W}:{W}
+V672           {W}:{W}::{W}:{W}:{W}:{W}:{W}
+V673           {W}:{W}:{W}::{W}:{W}:{W}:{W}
+V674           {W}:{W}:{W}:{W}::{W}:{W}:{W}
+V675           {W}:{W}:{W}:{W}:{W}::{W}:{W}
+V676           {W}:{W}:{W}:{W}:{W}:{W}::{W}
+V677           {W}:{W}:{W}:{W}:{W}:{W}:{W}::
+
+V660           ::{W}:{W}:{W}:{W}:{W}:{W}
+V661           {W}::{W}:{W}:{W}:{W}:{W}
+V662           {W}:{W}::{W}:{W}:{W}:{W}
+V663           {W}:{W}:{W}::{W}:{W}:{W}
+V664           {W}:{W}:{W}:{W}::{W}:{W}
+V665           {W}:{W}:{W}:{W}:{W}::{W}
+V666           {W}:{W}:{W}:{W}:{W}:{W}::
+
+V650           ::{W}:{W}:{W}:{W}:{W}
+V651           {W}::{W}:{W}:{W}:{W}
+V652           {W}:{W}::{W}:{W}:{W}
+V653           {W}:{W}:{W}::{W}:{W}
+V654           {W}:{W}:{W}:{W}::{W}
+V655           {W}:{W}:{W}:{W}:{W}::
+
+V640           ::{W}:{W}:{W}:{W}
+V641           {W}::{W}:{W}:{W}
+V642           {W}:{W}::{W}:{W}
+V643           {W}:{W}:{W}::{W}
+V644           {W}:{W}:{W}:{W}::
 
-%a 3000
+V630           ::{W}:{W}:{W}
+V631           {W}::{W}:{W}
+V632           {W}:{W}::{W}
+V633           {W}:{W}:{W}::
+
+V620           ::{W}:{W}
+V621           {W}::{W}
+V622           {W}:{W}::
+
+V610           ::{W}
+V611           {W}::
+
+V600           ::
+
+V6604          {W}:{W}:{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
+
+V6504          ::{W}:{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
+V6514          {W}::{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
+V6524          {W}:{W}::{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
+V6534          {W}:{W}:{W}::{W}:{W}:{N}\.{N}\.{N}\.{N}
+V6544          {W}:{W}:{W}:{W}::{W}:{N}\.{N}\.{N}\.{N}
+V6554          {W}:{W}:{W}:{W}:{W}::{N}\.{N}\.{N}\.{N}
+
+V6404          ::{W}:{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
+V6414          {W}::{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
+V6424          {W}:{W}::{W}:{W}:{N}\.{N}\.{N}\.{N}
+V6434          {W}:{W}:{W}::{W}:{N}\.{N}\.{N}\.{N}
+V6444          {W}:{W}:{W}:{W}::{N}\.{N}\.{N}\.{N}
+
+V6304          ::{W}:{W}:{W}:{N}\.{N}\.{N}\.{N}
+V6314          {W}::{W}:{W}:{N}\.{N}\.{N}\.{N}
+V6324          {W}:{W}::{W}:{N}\.{N}\.{N}\.{N}
+V6334          {W}:{W}:{W}::{N}\.{N}\.{N}\.{N}
+
+V6204          ::{W}:{W}:{N}\.{N}\.{N}\.{N}
+V6214          {W}::{W}:{N}\.{N}\.{N}\.{N}
+V6224          {W}:{W}::{N}\.{N}\.{N}\.{N}
+
+V6104          ::{W}:{N}\.{N}\.{N}\.{N}
+V6114          {W}::{N}\.{N}\.{N}\.{N}
+
+V6004          ::{N}\.{N}\.{N}\.{N}
+
+
+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})
 
 %%
 dst            return DST;
 src            return SRC;
 
 link|ether|ppp|slip  return LINK;
-fddi           return LINK;
+fddi|tr|wlan   return LINK;
 arp            return ARP;
 rarp           return RARP;
 ip             return IP;
+sctp           return SCTP;
 tcp            return TCP;
 udp            return UDP;
 icmp           return ICMP;
 igmp           return IGMP;
 igrp           return IGRP;
+pim            return PIM;
+vrrp           return VRRP;
+radio          return RADIO;
+
+ip6            {
+#ifdef INET6
+               return IPV6;
+#else
+               bpf_error("%s not supported", yytext);
+#endif
+               }
+icmp6          {
+#ifdef INET6
+               return ICMPV6;
+#else
+               bpf_error("%s not supported", yytext);
+#endif
+               }
+ah             return AH;
+esp            return ESP;
 
 atalk          return ATALK;
+aarp           return AARP;
 decnet         return DECNET;
 lat            return LAT;
 sca            return SCA;
 moprc          return MOPRC;
 mopdl          return MOPDL;
 
+iso            return ISO;
+esis           return ESIS;
+es-is          return ESIS;
+isis           return ISIS;
+is-is          return ISIS;
+l1              return L1;
+l2              return L2;
+iih             return IIH;
+lsp             return LSP;
+snp             return SNP;
+csnp            return CSNP;
+psnp            return PSNP;
+
+clnp           return CLNP;
+
+stp            return STP;
+
+ipx            return IPX;
+
+netbeui                return NETBEUI;
+
 host           return HOST;
 net            return NET;
-mask           return MASK;
+mask           return NETMASK;
 port           return PORT;
+portrange      return PORTRANGE;
 proto          return PROTO;
+protochain     {
+#ifdef NO_PROTOCHAIN
+                 bpf_error("%s not supported", yytext);
+#else
+                 return PROTOCHAIN;
+#endif
+               }
 
 gateway                return GATEWAY;
 
+type           return TYPE;
+subtype                return SUBTYPE;
+direction|dir  return DIR;
+address1|addr1 return ADDR1;
+address2|addr2 return ADDR2;
+address3|addr3 return ADDR3;
+address4|addr4 return ADDR4;
+
 less           return LESS;
 greater                return GREATER;
-byte           return BYTE;
+byte           return CBYTE;
 broadcast      return TK_BROADCAST;
 multicast      return TK_MULTICAST;
 
@@ -123,7 +269,43 @@ len|length return LEN;
 inbound                return INBOUND;
 outbound       return OUTBOUND;
 
-[ \n\t]                        ;
+vlan           return VLAN;
+mpls           return MPLS;
+pppoed         return PPPOED;
+pppoes         return PPPOES;
+
+lane           return LANE;
+llc            return LLC;
+metac          return METAC;
+bcc            return BCC;
+oam            return OAM;
+oamf4          return OAMF4;
+oamf4ec                return OAMF4EC;
+oamf4sc                return OAMF4SC;
+sc             return SC;
+ilmic          return ILMIC;
+vpi            return VPI;
+vci            return VCI;
+connectmsg     return CONNECTMSG;
+metaconnect    return METACONNECT;
+
+on|ifname      return PF_IFNAME;
+rset|ruleset   return PF_RSET;
+rnr|rulenum    return PF_RNR;
+srnr|subrulenum        return PF_SRNR;
+reason         return PF_REASON;
+action         return PF_ACTION;
+
+fisu           return FISU;
+lssu           return LSSU;
+lsu            return LSSU;
+msu            return MSU;
+sio            return SIO;
+opc            return OPC;
+dpc            return DPC;
+sls            return SLS;
+
+[ \r\n\t]              ;
 [+\-*/:\[\]!<>()&|=]   return yytext[0];
 ">="                   return GEQ;
 "<="                   return LEQ;
@@ -131,24 +313,82 @@ outbound  return OUTBOUND;
 "=="                   return '=';
 "<<"                   return LSH;
 ">>"                   return RSH;
+${B}                   { yylval.e = pcap_ether_aton(((char *)yytext)+1);
+                         return AID; }
 {N}                    { yylval.i = stoi((char *)yytext); return NUM; }
 ({N}\.{N})|({N}\.{N}\.{N})|({N}\.{N}\.{N}\.{N})        {
                        yylval.s = sdup((char *)yytext); return HID; }
 {B}:{B}:{B}:{B}:{B}:{B} { yylval.e = pcap_ether_aton((char *)yytext);
                          return EID; }
+{V6}                   {
+#ifdef INET6
+                         struct addrinfo hints, *res;
+                         memset(&hints, 0, sizeof(hints));
+                         hints.ai_family = AF_INET6;
+                         hints.ai_flags = AI_NUMERICHOST;
+                         if (getaddrinfo(yytext, NULL, &hints, &res))
+                               bpf_error("bogus IPv6 address %s", yytext);
+                         else {
+                               yylval.s = sdup((char *)yytext); return HID6;
+                         }
+#else
+                         bpf_error("IPv6 address %s not supported", yytext);
+#endif /*INET6*/
+                       }
 {B}:+({B}:+)+          { bpf_error("bogus ethernet address %s", yytext); }
-[A-Za-z0-9][-_.A-Za-z0-9]*[.A-Za-z0-9] {
+icmptype               { yylval.i = 0; return NUM; }
+icmpcode               { yylval.i = 1; return NUM; }
+icmp-echoreply         { yylval.i = 0; return NUM; }
+icmp-unreach           { yylval.i = 3; return NUM; }
+icmp-sourcequench      { yylval.i = 4; return NUM; }
+icmp-redirect          { yylval.i = 5; return NUM; }
+icmp-echo              { yylval.i = 8; return NUM; }
+icmp-routeradvert      { yylval.i = 9; return NUM; }
+icmp-routersolicit     { yylval.i = 10; return NUM; }
+icmp-timxceed          { yylval.i = 11; return NUM; }
+icmp-paramprob         { yylval.i = 12; return NUM; }
+icmp-tstamp            { yylval.i = 13; return NUM; }
+icmp-tstampreply       { yylval.i = 14; return NUM; }
+icmp-ireq              { yylval.i = 15; return NUM; }
+icmp-ireqreply         { yylval.i = 16; return NUM; }
+icmp-maskreq           { yylval.i = 17; return NUM; }
+icmp-maskreply         { yylval.i = 18; return NUM; }
+tcpflags               { yylval.i = 13; return NUM; }
+tcp-fin                        { yylval.i = 0x01; return NUM; }
+tcp-syn                        { yylval.i = 0x02; return NUM; }
+tcp-rst                        { yylval.i = 0x04; return NUM; }
+tcp-push               { yylval.i = 0x08; return NUM; }
+tcp-ack                        { yylval.i = 0x10; return NUM; }
+tcp-urg                        { yylval.i = 0x20; return NUM; }
+[A-Za-z0-9]([-_.A-Za-z0-9]*[.A-Za-z0-9])? {
                         yylval.s = sdup((char *)yytext); return ID; }
 "\\"[^ !()\n\t]+       { yylval.s = sdup((char *)yytext + 1); return ID; }
-[^ \[\]\t\n\-_.A-Za-z0-9!<>()&|=]+i {
-                       bpf_error("illegal token: %s\n", yytext); }
+[^ \[\]\t\n\-_.A-Za-z0-9!<>()&|=]+ {
+                       bpf_error("illegal token: %s", yytext); }
 .                      { bpf_error("illegal char '%c'", *yytext); }
 %%
 void
 lex_init(buf)
-       char *buf;
+       const char *buf;
 {
+#ifdef FLEX_SCANNER
+       in_buffer = yy_scan_string(buf);
+#else
        in_buffer = buf;
+#endif
+}
+
+/*
+ * Do any cleanup necessary after parsing.
+ */
+void
+lex_cleanup()
+{
+#ifdef FLEX_SCANNER
+       if (in_buffer != NULL)
+               yy_delete_buffer(in_buffer);
+       in_buffer = NULL;
+#endif
 }
 
 /*
@@ -200,4 +440,3 @@ stoi(s)
 
        return n;
 }
-