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