iplang_l.l revision 34739
1%e 1500 2%p 4000 3%a 4000 4%o 6000 5%{ 6/* 7 * Copyright (C) 1997 by Darren Reed. 8 * 9 * Redistribution and use in source and binary forms are permitted 10 * provided that this notice is preserved and due credit is given 11 * to the original author and the contributors. 12 * 13 * $Id: iplang_l.l,v 2.0.2.15.2.2 1997/12/10 09:54:15 darrenr Exp $ 14 */ 15#include <stdio.h> 16#include <string.h> 17#include <sys/param.h> 18#if defined(__SVR4) || defined(__sysv__) 19#include <sys/stream.h> 20#endif 21#include <sys/types.h> 22#include <netinet/in_systm.h> 23#include <netinet/in.h> 24#include "y.tab.h" 25#include "ip_compat.h" 26#include "ipf.h" 27 28#ifndef __P 29# ifdef __STDC__ 30# define __P(x) x 31# else 32# define __P(x) () 33# endif 34#endif 35 36extern int opts; 37 38int lineNum = 0, proto = 0, oldproto = 0, next = -1, laststate = 0; 39int *prstack = NULL, numpr = 0, state = 0, token = 0; 40 41void yyerror __P((char *)); 42void push_proto __P((void)); 43void pop_proto __P((void)); 44int next_state __P((int, int)); 45int next_item __P((int)); 46int save_token __P((void)); 47void swallow __P((void)); 48int yylex __P((void)); 49%} 50 51%% 52[ \t\r] ; 53\n { lineNum++; swallow(); } 54interface | 55iface { return next_state(IL_INTERFACE, -1); } 56name | 57ifname { return next_state(IL_IFNAME, IL_TOKEN); } 58router { return next_state(IL_DEFROUTER, IL_TOKEN); } 59mtu { return next_state(IL_MTU, IL_NUMBER); } 60eaddr { return next_state(IL_EADDR, IL_TOKEN); } 61v4addr { return next_state(IL_V4ADDR, IL_TOKEN); } 62ipv4 { return next_state(IL_IPV4, -1); } 63v { return next_state(IL_V4V, IL_TOKEN); } 64proto { return next_state(IL_V4PROTO, IL_TOKEN); } 65hl { return next_state(IL_V4HL, IL_TOKEN); } 66id { return next_state(IL_V4ID, IL_TOKEN); } 67ttl { return next_state(IL_V4TTL, IL_TOKEN); } 68tos { return next_state(IL_V4TOS, IL_TOKEN); } 69src { return next_state(IL_V4SRC, IL_TOKEN); } 70dst { return next_state(IL_V4DST, IL_TOKEN); } 71opt { return next_state(IL_OPT, -1); } 72len { return next_state(IL_LEN, IL_TOKEN); } 73off { return next_state(IL_OFF, IL_TOKEN); } 74sum { return next_state(IL_SUM, IL_TOKEN); } 75tcp { return next_state(IL_TCP, -1); } 76sport { return next_state(IL_SPORT, IL_TOKEN); } 77dport { return next_state(IL_DPORT, IL_TOKEN); } 78seq { return next_state(IL_TCPSEQ, IL_TOKEN); } 79ack { return next_state(IL_TCPACK, IL_TOKEN); } 80flags { return next_state(IL_TCPFL, IL_TOKEN); } 81urp { return next_state(IL_TCPURP, IL_TOKEN); } 82win { return next_state(IL_TCPWIN, IL_TOKEN); } 83udp { return next_state(IL_UDP, -1); } 84send { return next_state(IL_SEND, -1); } 85via { return next_state(IL_VIA, IL_TOKEN); } 86arp { return next_state(IL_ARP, -1); } 87data { return next_state(IL_DATA, -1); } 88value { return next_state(IL_DVALUE, IL_TOKEN); } 89file { return next_state(IL_DFILE, IL_TOKEN); } 90nop { return next_state(IL_IPO_NOP, -1); } 91eol { return next_state(IL_IPO_EOL, -1); } 92rr { return next_state(IL_IPO_RR, -1); } 93zsu { return next_state(IL_IPO_ZSU, -1); } 94mtup { return next_state(IL_IPO_MTUP, -1); } 95mtur { return next_state(IL_IPO_MTUR, -1); } 96encode { return next_state(IL_IPO_ENCODE, -1); } 97ts { return next_state(IL_IPO_TS, -1); } 98tr { return next_state(IL_IPO_TR, -1); } 99sec { return next_state(IL_IPO_SEC, -1); } 100secclass { return next_state(IL_IPO_SECCLASS, IL_TOKEN); } 101lsrr { return next_state(IL_IPO_LSRR, -1); } 102esec { return next_state(IL_IPO_ESEC, -1); } 103cipso { return next_state(IL_IPO_CIPSO, -1); } 104satid { return next_state(IL_IPO_SATID, -1); } 105ssrr { return next_state(IL_IPO_SSRR, -1); } 106addext { return next_state(IL_IPO_ADDEXT, -1); } 107visa { return next_state(IL_IPO_VISA, -1); } 108imitd { return next_state(IL_IPO_IMITD, -1); } 109eip { return next_state(IL_IPO_EIP, -1); } 110finn { return next_state(IL_IPO_FINN, -1); } 111mss { return next_state(IL_TCPO_MSS, IL_TOKEN); } 112wscale { return next_state(IL_TCPO_MSS, IL_TOKEN); } 113reserv-4 { return next_state(IL_IPS_RESERV4, -1); } 114topsecret { return next_state(IL_IPS_TOPSECRET, -1); } 115secret { return next_state(IL_IPS_SECRET, -1); } 116reserv-3 { return next_state(IL_IPS_RESERV3, -1); } 117confid { return next_state(IL_IPS_CONFID, -1); } 118unclass { return next_state(IL_IPS_UNCLASS, -1); } 119reserv-2 { return next_state(IL_IPS_RESERV2, -1); } 120reserv-1 { return next_state(IL_IPS_RESERV1, -1); } 121icmp { return next_state(IL_ICMP, -1); } 122type { return next_state(IL_ICMPTYPE, -1); } 123code { return next_state(IL_ICMPCODE, -1); } 124echorep { return next_state(IL_ICMP_ECHOREPLY, -1); } 125unreach { return next_state(IL_ICMP_UNREACH, -1); } 126squench { return next_state(IL_ICMP_SOURCEQUENCH, -1); } 127redir { return next_state(IL_ICMP_REDIRECT, -1); } 128echo { return next_state(IL_ICMP_ECHO, -1); } 129routerad { return next_state(IL_ICMP_ROUTERADVERT, -1); } 130routersol { return next_state(IL_ICMP_ROUTERSOLICIT, -1); } 131timex { return next_state(IL_ICMP_TIMXCEED, -1); } 132paramprob { return next_state(IL_ICMP_PARAMPROB, -1); } 133timest { return next_state(IL_ICMP_TSTAMP, -1); } 134timestrep { return next_state(IL_ICMP_TSTAMPREPLY, -1); } 135inforeq { return next_state(IL_ICMP_IREQ, -1); } 136inforep { return next_state(IL_ICMP_IREQREPLY, -1); } 137maskreq { return next_state(IL_ICMP_MASKREQ, -1); } 138maskrep { return next_state(IL_ICMP_MASKREPLY, -1); } 139net-unr { return next_state(IL_ICMP_UNREACH_NET, -1); } 140host-unr { return next_state(IL_ICMP_UNREACH_HOST, -1); } 141proto-unr { return next_state(IL_ICMP_UNREACH_PROTOCOL, -1); } 142port-unr { return next_state(IL_ICMP_UNREACH_PORT, -1); } 143needfrag { return next_state(IL_ICMP_UNREACH_NEEDFRAG, -1); } 144srcfail { return next_state(IL_ICMP_UNREACH_SRCFAIL, -1); } 145net-unk { return next_state(IL_ICMP_UNREACH_NET_UNKNOWN, -1); } 146host-unk { return next_state(IL_ICMP_UNREACH_HOST_UNKNOWN, -1); } 147isolate { return next_state(IL_ICMP_UNREACH_ISOLATED, -1); } 148net-prohib { return next_state(IL_ICMP_UNREACH_NET_PROHIB, -1); } 149host-prohib { return next_state(IL_ICMP_UNREACH_HOST_PROHIB, -1); } 150net-tos { return next_state(IL_ICMP_UNREACH_TOSNET, -1); } 151host-tos { return next_state(IL_ICMP_UNREACH_TOSHOST, -1); } 152filter-prohib { return next_state(IL_ICMP_UNREACH_FILTER_PROHIB, -1); } 153host-preced { return next_state(IL_ICMP_UNREACH_HOST_PRECEDENCE, -1); } 154cutoff-preced { return next_state(IL_ICMP_UNREACH_PRECEDENCE_CUTOFF, -1); } 155net-redir { return next_state(IL_ICMP_REDIRECT_NET, -1); } 156host-redir { return next_state(IL_ICMP_REDIRECT_HOST, -1); } 157tos-net-redir { return next_state(IL_ICMP_REDIRECT_TOSNET, -1); } 158tos-host-redir { return next_state(IL_ICMP_REDIRECT_TOSHOST, -1); } 159intrans { return next_state(IL_ICMP_TIMXCEED_INTRANS, -1); } 160reass { return next_state(IL_ICMP_TIMXCEED_REASS, -1); } 161optabsent { return next_state(IL_ICMP_PARAMPROB_OPTABSENT, -1); } 162otime { return next_state(IL_ICMP_OTIME, -1); } 163rtime { return next_state(IL_ICMP_RTIME, -1); } 164ttime { return next_state(IL_ICMP_TTIME, -1); } 165icmpseq { return next_state(IL_ICMP_SEQ, -1); } 166icmpid { return next_state(IL_ICMP_SEQ, -1); } 167\377 { return 0; } /* EOF */ 168\{ { push_proto(); return next_item('{'); } 169\} { pop_proto(); return next_item('}'); } 170\. { return next_item(IL_DOT); } 171; { return next_item(';'); } 172[0-9]+ { return next_item(IL_NUMBER); } 173[0-9a-fA-F] { return next_item(IL_HEXDIGIT); } 174: { return next_item(IL_COLON); } 175#[^\n]* { return next_item(IL_COMMENT); } 176[^ {}\n\t;]* { return next_item(IL_TOKEN); } 177\"[^\"]*\" { return next_item(IL_TOKEN); } 178%% 179void yyerror(msg) 180char *msg; 181{ 182 fprintf(stderr, "%s error at \"%s\", line %d\n", msg, yytext, 183 lineNum + 1); 184 exit(1); 185} 186 187 188void push_proto() 189{ 190 numpr++; 191 if (!prstack) 192 prstack = (int *)malloc(sizeof(int)); 193 else 194 prstack = (int *)realloc((char *)prstack, numpr * sizeof(int)); 195 prstack[numpr - 1] = oldproto; 196} 197 198 199void pop_proto() 200{ 201 numpr--; 202 proto = prstack[numpr]; 203 if (!numpr) { 204 free(prstack); 205 prstack = NULL; 206 return; 207 } 208 prstack = (int *)realloc((char *)prstack, numpr * sizeof(int)); 209} 210 211 212int save_token() 213{ 214 215 yylval.str = strdup(yytext); 216 return IL_TOKEN; 217} 218 219 220int next_item(nstate) 221int nstate; 222{ 223 if (next == IL_TOKEN) { 224 next = -1; 225 return save_token(); 226 } 227 next = -1; 228 if (nstate == IL_NUMBER) 229 yylval.num = atoi(yytext); 230 token++; 231 return nstate; 232} 233 234 235int next_state(nstate, fornext) 236int nstate, fornext; 237{ 238 token++; 239 240 if (next == IL_TOKEN) { 241 next = -1; 242 return save_token(); 243 } 244 245 next = fornext; 246 247 switch (nstate) 248 { 249 case IL_IPV4 : 250 case IL_TCP : 251 case IL_UDP : 252 case IL_ICMP : 253 case IL_DATA : 254 case IL_INTERFACE : 255 case IL_ARP : 256 oldproto = proto; 257 proto = nstate; 258 break; 259 case IL_SUM : 260 if (proto == IL_IPV4) 261 nstate = IL_V4SUM; 262 else if (proto == IL_TCP) 263 nstate = IL_TCPSUM; 264 else if (proto == IL_UDP) 265 nstate = IL_UDPSUM; 266 break; 267 case IL_OPT : 268 if (proto == IL_IPV4) 269 nstate = IL_V4OPT; 270 else if (proto == IL_TCP) 271 nstate = IL_TCPOPT; 272 break; 273 case IL_IPO_NOP : 274 if (proto == IL_TCP) 275 nstate = IL_TCPO_NOP; 276 break; 277 case IL_IPO_EOL : 278 if (proto == IL_TCP) 279 nstate = IL_TCPO_EOL; 280 break; 281 case IL_IPO_TS : 282 if (proto == IL_TCP) 283 nstate = IL_TCPO_TS; 284 break; 285 case IL_OFF : 286 if (proto == IL_IPV4) 287 nstate = IL_V4OFF; 288 else if (proto == IL_TCP) 289 nstate = IL_TCPOFF; 290 break; 291 case IL_LEN : 292 if (proto == IL_IPV4) 293 nstate = IL_V4LEN; 294 else if (proto == IL_UDP) 295 nstate = IL_UDPLEN; 296 break; 297 } 298 return nstate; 299} 300 301 302void swallow() 303{ 304 int c = input(); 305 306 if (c == '#') { 307 while ((c != '\n') && (c != EOF)) 308 c = input(); 309 } 310 unput(c); 311} 312