iplang_l.l revision 145510
1145510Sdarrenr/* $NetBSD$ */ 2145510Sdarrenr 331183Speter%{ 431183Speter/* 553024Sguido * Copyright (C) 1997-1998 by Darren Reed. 631183Speter * 7145510Sdarrenr * See the IPFILTER.LICENCE file for details on licencing. 831183Speter * 9145510Sdarrenr * Id: iplang_l.l,v 2.8 2003/07/28 01:15:31 darrenr Exp 1031183Speter */ 1131183Speter#include <stdio.h> 1231183Speter#include <string.h> 1331183Speter#include <sys/param.h> 1431183Speter#if defined(__SVR4) || defined(__sysv__) 1531183Speter#include <sys/stream.h> 1631183Speter#endif 1731183Speter#include <sys/types.h> 1831183Speter#include <netinet/in_systm.h> 1931183Speter#include <netinet/in.h> 20145510Sdarrenr#include "iplang_y.h" 2131183Speter#include "ipf.h" 2231183Speter 2331183Speter#ifndef __P 2431183Speter# ifdef __STDC__ 2531183Speter# define __P(x) x 2631183Speter# else 2731183Speter# define __P(x) () 2831183Speter# endif 2931183Speter#endif 3031183Speter 3131183Speterextern int opts; 3231183Speter 3360841Sdarrenrint lineNum = 0, ipproto = 0, oldipproto = 0, next = -1, laststate = 0; 3431183Speterint *prstack = NULL, numpr = 0, state = 0, token = 0; 3531183Speter 3631183Spetervoid yyerror __P((char *)); 3731183Spetervoid push_proto __P((void)); 3831183Spetervoid pop_proto __P((void)); 3931183Speterint next_state __P((int, int)); 4031183Speterint next_item __P((int)); 4131183Speterint save_token __P((void)); 4231183Spetervoid swallow __P((void)); 4331183Speterint yylex __P((void)); 4437074Speter 45145510Sdarrenrstruct lwordtab { 4637074Speter char *word; 4737074Speter int state; 4837074Speter int next; 4937074Speter}; 5037074Speter 51145510Sdarrenrstruct lwordtab words[] = { 5237074Speter { "interface", IL_INTERFACE, -1 }, 5337074Speter { "iface", IL_INTERFACE, -1 }, 5437074Speter { "name", IL_IFNAME, IL_TOKEN }, 5537074Speter { "ifname", IL_IFNAME, IL_TOKEN }, 5637074Speter { "router", IL_DEFROUTER, IL_TOKEN }, 5737074Speter { "mtu", IL_MTU, IL_NUMBER }, 5837074Speter { "eaddr", IL_EADDR, IL_TOKEN }, 5937074Speter { "v4addr", IL_V4ADDR, IL_TOKEN }, 6037074Speter { "ipv4", IL_IPV4, -1 }, 6137074Speter { "v", IL_V4V, IL_TOKEN }, 6237074Speter { "proto", IL_V4PROTO, IL_TOKEN }, 6337074Speter { "hl", IL_V4HL, IL_TOKEN }, 6437074Speter { "id", IL_V4ID, IL_TOKEN }, 6537074Speter { "ttl", IL_V4TTL, IL_TOKEN }, 6637074Speter { "tos", IL_V4TOS, IL_TOKEN }, 6737074Speter { "src", IL_V4SRC, IL_TOKEN }, 6837074Speter { "dst", IL_V4DST, IL_TOKEN }, 6937074Speter { "opt", IL_OPT, -1 }, 7037074Speter { "len", IL_LEN, IL_TOKEN }, 7137074Speter { "off", IL_OFF, IL_TOKEN }, 7237074Speter { "sum", IL_SUM, IL_TOKEN }, 7337074Speter { "tcp", IL_TCP, -1 }, 7437074Speter { "sport", IL_SPORT, IL_TOKEN }, 7537074Speter { "dport", IL_DPORT, IL_TOKEN }, 7637074Speter { "seq", IL_TCPSEQ, IL_TOKEN }, 7737074Speter { "ack", IL_TCPACK, IL_TOKEN }, 7837074Speter { "flags", IL_TCPFL, IL_TOKEN }, 7937074Speter { "urp", IL_TCPURP, IL_TOKEN }, 8037074Speter { "win", IL_TCPWIN, IL_TOKEN }, 8137074Speter { "udp", IL_UDP, -1 }, 8237074Speter { "send", IL_SEND, -1 }, 8337074Speter { "via", IL_VIA, IL_TOKEN }, 8437074Speter { "arp", IL_ARP, -1 }, 8537074Speter { "data", IL_DATA, -1 }, 8637074Speter { "value", IL_DVALUE, IL_TOKEN }, 8737074Speter { "file", IL_DFILE, IL_TOKEN }, 8837074Speter { "nop", IL_IPO_NOP, -1 }, 8937074Speter { "eol", IL_IPO_EOL, -1 }, 9037074Speter { "rr", IL_IPO_RR, -1 }, 9137074Speter { "zsu", IL_IPO_ZSU, -1 }, 9237074Speter { "mtup", IL_IPO_MTUP, -1 }, 9337074Speter { "mtur", IL_IPO_MTUR, -1 }, 9437074Speter { "encode", IL_IPO_ENCODE, -1 }, 9537074Speter { "ts", IL_IPO_TS, -1 }, 9637074Speter { "tr", IL_IPO_TR, -1 }, 9737074Speter { "sec", IL_IPO_SEC, -1 }, 9837074Speter { "secclass", IL_IPO_SECCLASS, IL_TOKEN }, 9937074Speter { "lsrr", IL_IPO_LSRR, -1 }, 10037074Speter { "esec", IL_IPO_ESEC, -1 }, 10137074Speter { "cipso", IL_IPO_CIPSO, -1 }, 10237074Speter { "satid", IL_IPO_SATID, -1 }, 10337074Speter { "ssrr", IL_IPO_SSRR, -1 }, 10437074Speter { "addext", IL_IPO_ADDEXT, -1 }, 10537074Speter { "visa", IL_IPO_VISA, -1 }, 10637074Speter { "imitd", IL_IPO_IMITD, -1 }, 10737074Speter { "eip", IL_IPO_EIP, -1 }, 10837074Speter { "finn", IL_IPO_FINN, -1 }, 10937074Speter { "mss", IL_TCPO_MSS, IL_TOKEN }, 11037074Speter { "wscale", IL_TCPO_WSCALE, IL_TOKEN }, 11137074Speter { "reserv-4", IL_IPS_RESERV4, -1 }, 11237074Speter { "topsecret", IL_IPS_TOPSECRET, -1 }, 11337074Speter { "secret", IL_IPS_SECRET, -1 }, 11437074Speter { "reserv-3", IL_IPS_RESERV3, -1 }, 11537074Speter { "confid", IL_IPS_CONFID, -1 }, 11637074Speter { "unclass", IL_IPS_UNCLASS, -1 }, 11737074Speter { "reserv-2", IL_IPS_RESERV2, -1 }, 11837074Speter { "reserv-1", IL_IPS_RESERV1, -1 }, 11937074Speter { "icmp", IL_ICMP, -1 }, 12037074Speter { "type", IL_ICMPTYPE, -1 }, 12137074Speter { "code", IL_ICMPCODE, -1 }, 12237074Speter { "echorep", IL_ICMP_ECHOREPLY, -1 }, 12337074Speter { "unreach", IL_ICMP_UNREACH, -1 }, 12437074Speter { "squench", IL_ICMP_SOURCEQUENCH, -1 }, 12537074Speter { "redir", IL_ICMP_REDIRECT, -1 }, 12637074Speter { "echo", IL_ICMP_ECHO, -1 }, 12737074Speter { "routerad", IL_ICMP_ROUTERADVERT, -1 }, 12837074Speter { "routersol", IL_ICMP_ROUTERSOLICIT, -1 }, 12937074Speter { "timex", IL_ICMP_TIMXCEED, -1 }, 13037074Speter { "paramprob", IL_ICMP_PARAMPROB, -1 }, 13137074Speter { "timest", IL_ICMP_TSTAMP, -1 }, 13237074Speter { "timestrep", IL_ICMP_TSTAMPREPLY, -1 }, 13337074Speter { "inforeq", IL_ICMP_IREQ, -1 }, 13437074Speter { "inforep", IL_ICMP_IREQREPLY, -1 }, 13537074Speter { "maskreq", IL_ICMP_MASKREQ, -1 }, 13637074Speter { "maskrep", IL_ICMP_MASKREPLY, -1 }, 13737074Speter { "net-unr", IL_ICMP_UNREACH_NET, -1 }, 13837074Speter { "host-unr", IL_ICMP_UNREACH_HOST, -1 }, 13937074Speter { "proto-unr", IL_ICMP_UNREACH_PROTOCOL, -1 }, 14037074Speter { "port-unr", IL_ICMP_UNREACH_PORT, -1 }, 14137074Speter { "needfrag", IL_ICMP_UNREACH_NEEDFRAG, -1 }, 14237074Speter { "srcfail", IL_ICMP_UNREACH_SRCFAIL, -1 }, 14337074Speter { "net-unk", IL_ICMP_UNREACH_NET_UNKNOWN, -1 }, 14437074Speter { "host-unk", IL_ICMP_UNREACH_HOST_UNKNOWN, -1 }, 14537074Speter { "isolate", IL_ICMP_UNREACH_ISOLATED, -1 }, 14637074Speter { "net-prohib", IL_ICMP_UNREACH_NET_PROHIB, -1 }, 14737074Speter { "host-prohib", IL_ICMP_UNREACH_HOST_PROHIB, -1 }, 14837074Speter { "net-tos", IL_ICMP_UNREACH_TOSNET, -1 }, 14937074Speter { "host-tos", IL_ICMP_UNREACH_TOSHOST, -1 }, 15037074Speter { "filter-prohib", IL_ICMP_UNREACH_FILTER_PROHIB, -1 }, 15137074Speter { "host-preced", IL_ICMP_UNREACH_HOST_PRECEDENCE, -1 }, 15237074Speter { "cutoff-preced", IL_ICMP_UNREACH_PRECEDENCE_CUTOFF, -1 }, 15337074Speter { "net-redir", IL_ICMP_REDIRECT_NET, -1 }, 15437074Speter { "host-redir", IL_ICMP_REDIRECT_HOST, -1 }, 15537074Speter { "tos-net-redir", IL_ICMP_REDIRECT_TOSNET, -1 }, 15637074Speter { "tos-host-redir", IL_ICMP_REDIRECT_TOSHOST, -1 }, 15737074Speter { "intrans", IL_ICMP_TIMXCEED_INTRANS, -1 }, 15837074Speter { "reass", IL_ICMP_TIMXCEED_REASS, -1 }, 15937074Speter { "optabsent", IL_ICMP_PARAMPROB_OPTABSENT, -1 }, 16037074Speter { "otime", IL_ICMP_OTIME, -1 }, 16137074Speter { "rtime", IL_ICMP_RTIME, -1 }, 16237074Speter { "ttime", IL_ICMP_TTIME, -1 }, 16337074Speter { "icmpseq", IL_ICMP_SEQ, -1 }, 16437074Speter { "icmpid", IL_ICMP_SEQ, -1 }, 16537074Speter { ".", IL_DOT, -1 }, 16637074Speter { NULL, 0, 0 } 16737074Speter}; 16831183Speter%} 16937074Speterwhite [ \t\r]+ 17031183Speter%% 17137074Speter{white} ; 17231183Speter\n { lineNum++; swallow(); } 17331183Speter\{ { push_proto(); return next_item('{'); } 17431183Speter\} { pop_proto(); return next_item('}'); } 17531183Speter; { return next_item(';'); } 17631183Speter[0-9]+ { return next_item(IL_NUMBER); } 17731183Speter[0-9a-fA-F] { return next_item(IL_HEXDIGIT); } 17831183Speter: { return next_item(IL_COLON); } 17931183Speter#[^\n]* { return next_item(IL_COMMENT); } 18037074Speter[^ \{\}\n\t;:{}]* { return next_item(IL_TOKEN); } 18131183Speter\"[^\"]*\" { return next_item(IL_TOKEN); } 18231183Speter%% 18331183Spetervoid yyerror(msg) 18431183Speterchar *msg; 18531183Speter{ 18631183Speter fprintf(stderr, "%s error at \"%s\", line %d\n", msg, yytext, 18731183Speter lineNum + 1); 18831183Speter exit(1); 18931183Speter} 19031183Speter 19131183Speter 19231183Spetervoid push_proto() 19331183Speter{ 19431183Speter numpr++; 19531183Speter if (!prstack) 19631183Speter prstack = (int *)malloc(sizeof(int)); 19731183Speter else 19831183Speter prstack = (int *)realloc((char *)prstack, numpr * sizeof(int)); 19960841Sdarrenr prstack[numpr - 1] = oldipproto; 20031183Speter} 20131183Speter 20231183Speter 20331183Spetervoid pop_proto() 20431183Speter{ 20531183Speter numpr--; 20660841Sdarrenr ipproto = prstack[numpr]; 20731183Speter if (!numpr) { 20831183Speter free(prstack); 20931183Speter prstack = NULL; 21031183Speter return; 21131183Speter } 21231183Speter prstack = (int *)realloc((char *)prstack, numpr * sizeof(int)); 21331183Speter} 21431183Speter 21531183Speter 21631183Speterint save_token() 21731183Speter{ 21831183Speter 219145510Sdarrenr yylval.str = strdup((char *)yytext); 22031183Speter return IL_TOKEN; 22131183Speter} 22231183Speter 22331183Speter 22431183Speterint next_item(nstate) 22531183Speterint nstate; 22631183Speter{ 227145510Sdarrenr struct lwordtab *wt; 22837074Speter 22937074Speter if (opts & OPT_DEBUG) 23037074Speter printf("text=[%s] id=%d next=%d\n", yytext, nstate, next); 23131183Speter if (next == IL_TOKEN) { 23231183Speter next = -1; 23331183Speter return save_token(); 23431183Speter } 23537074Speter token++; 23637074Speter 23737074Speter for (wt = words; wt->word; wt++) 238145510Sdarrenr if (!strcasecmp(wt->word, (char *)yytext)) 23937074Speter return next_state(wt->state, wt->next); 24037074Speter if (opts & OPT_DEBUG) 24137074Speter printf("unknown keyword=[%s]\n", yytext); 24231183Speter next = -1; 24331183Speter if (nstate == IL_NUMBER) 244145510Sdarrenr yylval.num = atoi((char *)yytext); 24531183Speter token++; 24631183Speter return nstate; 24731183Speter} 24831183Speter 24931183Speter 25031183Speterint next_state(nstate, fornext) 25131183Speterint nstate, fornext; 25231183Speter{ 25331183Speter next = fornext; 25431183Speter 25531183Speter switch (nstate) 25631183Speter { 25731183Speter case IL_IPV4 : 25831183Speter case IL_TCP : 25931183Speter case IL_UDP : 26031183Speter case IL_ICMP : 26131183Speter case IL_DATA : 26231183Speter case IL_INTERFACE : 26331183Speter case IL_ARP : 26460841Sdarrenr oldipproto = ipproto; 26560841Sdarrenr ipproto = nstate; 26631183Speter break; 26731183Speter case IL_SUM : 26860841Sdarrenr if (ipproto == IL_IPV4) 26931183Speter nstate = IL_V4SUM; 27060841Sdarrenr else if (ipproto == IL_TCP) 27131183Speter nstate = IL_TCPSUM; 27260841Sdarrenr else if (ipproto == IL_UDP) 27331183Speter nstate = IL_UDPSUM; 27431183Speter break; 27531183Speter case IL_OPT : 27660841Sdarrenr if (ipproto == IL_IPV4) 27731183Speter nstate = IL_V4OPT; 27860841Sdarrenr else if (ipproto == IL_TCP) 27931183Speter nstate = IL_TCPOPT; 28031183Speter break; 28131183Speter case IL_IPO_NOP : 28260841Sdarrenr if (ipproto == IL_TCP) 28331183Speter nstate = IL_TCPO_NOP; 28431183Speter break; 28531183Speter case IL_IPO_EOL : 28660841Sdarrenr if (ipproto == IL_TCP) 28731183Speter nstate = IL_TCPO_EOL; 28831183Speter break; 28931183Speter case IL_IPO_TS : 29060841Sdarrenr if (ipproto == IL_TCP) 29131183Speter nstate = IL_TCPO_TS; 29231183Speter break; 29331183Speter case IL_OFF : 29460841Sdarrenr if (ipproto == IL_IPV4) 29531183Speter nstate = IL_V4OFF; 29660841Sdarrenr else if (ipproto == IL_TCP) 29731183Speter nstate = IL_TCPOFF; 29831183Speter break; 29931183Speter case IL_LEN : 30060841Sdarrenr if (ipproto == IL_IPV4) 30131183Speter nstate = IL_V4LEN; 30260841Sdarrenr else if (ipproto == IL_UDP) 30331183Speter nstate = IL_UDPLEN; 30431183Speter break; 30531183Speter } 30631183Speter return nstate; 30731183Speter} 30831183Speter 30931183Speter 31031183Spetervoid swallow() 31131183Speter{ 31253024Sguido int c; 31331183Speter 31453024Sguido c = input(); 31553024Sguido 31631183Speter if (c == '#') { 31731183Speter while ((c != '\n') && (c != EOF)) 31831183Speter c = input(); 31931183Speter } 320130887Sdarrenr if (c != EOF) 321130887Sdarrenr unput(c); 32231183Speter} 323