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