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