iplang_l.l revision 31183
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.1 1997/11/05 11:04:04 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\{ { push_proto(); return next_item('{'); } 168\} { pop_proto(); return next_item('}'); } 169\. { return next_item(IL_DOT); } 170; { return next_item(';'); } 171[0-9]+ { return next_item(IL_NUMBER); } 172[0-9a-fA-F] { return next_item(IL_HEXDIGIT); } 173: { return next_item(IL_COLON); } 174#[^\n]* { return next_item(IL_COMMENT); } 175[^ {}\n\t;]* { return next_item(IL_TOKEN); } 176\"[^\"]*\" { return next_item(IL_TOKEN); } 177%% 178void yyerror(msg) 179char *msg; 180{ 181 fprintf(stderr, "%s error at \"%s\", line %d\n", msg, yytext, 182 lineNum + 1); 183 exit(1); 184} 185 186 187void push_proto() 188{ 189 numpr++; 190 if (!prstack) 191 prstack = (int *)malloc(sizeof(int)); 192 else 193 prstack = (int *)realloc((char *)prstack, numpr * sizeof(int)); 194 prstack[numpr - 1] = oldproto; 195} 196 197 198void pop_proto() 199{ 200 numpr--; 201 proto = prstack[numpr]; 202 if (!numpr) { 203 free(prstack); 204 prstack = NULL; 205 return; 206 } 207 prstack = (int *)realloc((char *)prstack, numpr * sizeof(int)); 208} 209 210 211int save_token() 212{ 213 static char *buf = NULL; 214 215 if (buf && (buf == yylval.str)) 216 free(buf); 217 buf = yylval.str = strdup(yytext); 218 return IL_TOKEN; 219} 220 221 222int next_item(nstate) 223int nstate; 224{ 225 if (next == IL_TOKEN) { 226 next = -1; 227 return save_token(); 228 } 229 next = -1; 230 if (nstate == IL_NUMBER) 231 yylval.num = atoi(yytext); 232 token++; 233 return nstate; 234} 235 236 237int next_state(nstate, fornext) 238int nstate, fornext; 239{ 240 token++; 241 242 if (next == IL_TOKEN) { 243 next = -1; 244 return save_token(); 245 } 246 247 next = fornext; 248 249 switch (nstate) 250 { 251 case IL_IPV4 : 252 case IL_TCP : 253 case IL_UDP : 254 case IL_ICMP : 255 case IL_DATA : 256 case IL_INTERFACE : 257 case IL_ARP : 258 oldproto = proto; 259 proto = nstate; 260 break; 261 case IL_SUM : 262 if (proto == IL_IPV4) 263 nstate = IL_V4SUM; 264 else if (proto == IL_TCP) 265 nstate = IL_TCPSUM; 266 else if (proto == IL_UDP) 267 nstate = IL_UDPSUM; 268 break; 269 case IL_OPT : 270 if (proto == IL_IPV4) 271 nstate = IL_V4OPT; 272 else if (proto == IL_TCP) 273 nstate = IL_TCPOPT; 274 break; 275 case IL_IPO_NOP : 276 if (proto == IL_TCP) 277 nstate = IL_TCPO_NOP; 278 break; 279 case IL_IPO_EOL : 280 if (proto == IL_TCP) 281 nstate = IL_TCPO_EOL; 282 break; 283 case IL_IPO_TS : 284 if (proto == IL_TCP) 285 nstate = IL_TCPO_TS; 286 break; 287 case IL_OFF : 288 if (proto == IL_IPV4) 289 nstate = IL_V4OFF; 290 else if (proto == IL_TCP) 291 nstate = IL_TCPOFF; 292 break; 293 case IL_LEN : 294 if (proto == IL_IPV4) 295 nstate = IL_V4LEN; 296 else if (proto == IL_UDP) 297 nstate = IL_UDPLEN; 298 break; 299 } 300 return nstate; 301} 302 303 304void swallow() 305{ 306 int c = input(); 307 308 if (c == '#') { 309 while ((c != '\n') && (c != EOF)) 310 c = input(); 311 } 312 unput(c); 313} 314