1145519Sdarrenr/*	$FreeBSD: releng/10.2/contrib/ipfilter/lib/tcp_flags.c 170268 2007-06-04 02:54:36Z darrenr $	*/
2145510Sdarrenr
3145510Sdarrenr/*
4170268Sdarrenr * Copyright (C) 2000-2004 by Darren Reed.
5145510Sdarrenr *
6145510Sdarrenr * See the IPFILTER.LICENCE file for details on licencing.
7145510Sdarrenr *
8170268Sdarrenr * $Id: tcp_flags.c,v 1.8.2.1 2006/06/16 17:21:17 darrenr Exp $
9145510Sdarrenr */
10145510Sdarrenr
11145510Sdarrenr#include "ipf.h"
12145510Sdarrenr
13145510Sdarrenrextern	char	flagset[];
14145510Sdarrenrextern	u_char	flags[];
15145510Sdarrenr
16145510Sdarrenr
17145510Sdarrenru_char tcp_flags(flgs, mask, linenum)
18145510Sdarrenrchar *flgs;
19145510Sdarrenru_char *mask;
20145510Sdarrenrint    linenum;
21145510Sdarrenr{
22145510Sdarrenr	u_char tcpf = 0, tcpfm = 0;
23145510Sdarrenr	char *s;
24145510Sdarrenr
25145510Sdarrenr	s = strchr(flgs, '/');
26145510Sdarrenr	if (s)
27145510Sdarrenr		*s++ = '\0';
28145510Sdarrenr
29145510Sdarrenr	if (*flgs == '0') {
30145510Sdarrenr		tcpf = strtol(flgs, NULL, 0);
31145510Sdarrenr	} else {
32145510Sdarrenr		tcpf = tcpflags(flgs);
33145510Sdarrenr	}
34145510Sdarrenr
35145510Sdarrenr	if (s != NULL) {
36145510Sdarrenr		if (*s == '0')
37145510Sdarrenr			tcpfm = strtol(s, NULL, 0);
38145510Sdarrenr		else
39145510Sdarrenr			tcpfm = tcpflags(s);
40145510Sdarrenr	}
41145510Sdarrenr
42145510Sdarrenr	if (!tcpfm) {
43145510Sdarrenr		if (tcpf == TH_SYN)
44145510Sdarrenr			tcpfm = 0xff & ~(TH_ECN|TH_CWR);
45145510Sdarrenr		else
46145510Sdarrenr			tcpfm = 0xff & ~(TH_ECN);
47145510Sdarrenr	}
48145510Sdarrenr	*mask = tcpfm;
49145510Sdarrenr	return tcpf;
50145510Sdarrenr}
51