xref: /freebsd/sbin/ipf/libipf/tcp_flags.c (revision 347dd0539f3a75fdf2128dd4620ca99e96f311e9)
141edb306SCy Schubert 
241edb306SCy Schubert /*
341edb306SCy Schubert  * Copyright (C) 2000-2004 by Darren Reed.
441edb306SCy Schubert  *
541edb306SCy Schubert  * See the IPFILTER.LICENCE file for details on licencing.
641edb306SCy Schubert  *
741edb306SCy Schubert  * $Id: tcp_flags.c,v 1.8.2.1 2006/06/16 17:21:17 darrenr Exp $
841edb306SCy Schubert  */
941edb306SCy Schubert 
1041edb306SCy Schubert #include "ipf.h"
1141edb306SCy Schubert 
1241edb306SCy Schubert extern	char	 flagset[];
13*347dd053SRichard Scheffenegger extern	uint16_t flags[];
1441edb306SCy Schubert 
1541edb306SCy Schubert 
tcp_flags(char * flgs,uint16_t * mask,int linenum)16*347dd053SRichard Scheffenegger uint16_t tcp_flags(char *flgs, uint16_t *mask, int linenum)
1741edb306SCy Schubert {
18*347dd053SRichard Scheffenegger 	uint16_t tcpf = 0, tcpfm = 0;
1941edb306SCy Schubert 	char *s;
2041edb306SCy Schubert 
2141edb306SCy Schubert 	s = strchr(flgs, '/');
2241edb306SCy Schubert 	if (s)
2341edb306SCy Schubert 		*s++ = '\0';
2441edb306SCy Schubert 
2541edb306SCy Schubert 	if (*flgs == '0') {
2641edb306SCy Schubert 		tcpf = strtol(flgs, NULL, 0);
2741edb306SCy Schubert 	} else {
2841edb306SCy Schubert 		tcpf = tcpflags(flgs);
2941edb306SCy Schubert 	}
3041edb306SCy Schubert 
3141edb306SCy Schubert 	if (s != NULL) {
3241edb306SCy Schubert 		if (*s == '0')
3341edb306SCy Schubert 			tcpfm = strtol(s, NULL, 0);
3441edb306SCy Schubert 		else
3541edb306SCy Schubert 			tcpfm = tcpflags(s);
3641edb306SCy Schubert 	}
3741edb306SCy Schubert 
3841edb306SCy Schubert 	if (!tcpfm) {
3941edb306SCy Schubert 		if (tcpf == TH_SYN)
40*347dd053SRichard Scheffenegger 			tcpfm = TH_FLAGS & ~(TH_ECN|TH_CWR);
4141edb306SCy Schubert 		else
42*347dd053SRichard Scheffenegger 			tcpfm = TH_FLAGS & ~(TH_ECN);
4341edb306SCy Schubert 	}
4441edb306SCy Schubert 	*mask = tcpfm;
452582ae57SCy Schubert 	return (tcpf);
4641edb306SCy Schubert }
47