xref: /freebsd/sbin/ipf/libipf/tcp_flags.c (revision ec0ea6efa1ad229d75c394c1a9b9cac33af2b1d3)
1 /*	$FreeBSD$	*/
2 
3 /*
4  * Copyright (C) 2000-2004 by Darren Reed.
5  *
6  * See the IPFILTER.LICENCE file for details on licencing.
7  *
8  * $Id: tcp_flags.c,v 1.8.2.1 2006/06/16 17:21:17 darrenr Exp $
9  */
10 
11 #include "ipf.h"
12 
13 extern	char	flagset[];
14 extern	u_char	flags[];
15 
16 
17 u_char tcp_flags(flgs, mask, linenum)
18 char *flgs;
19 u_char *mask;
20 int    linenum;
21 {
22 	u_char tcpf = 0, tcpfm = 0;
23 	char *s;
24 
25 	s = strchr(flgs, '/');
26 	if (s)
27 		*s++ = '\0';
28 
29 	if (*flgs == '0') {
30 		tcpf = strtol(flgs, NULL, 0);
31 	} else {
32 		tcpf = tcpflags(flgs);
33 	}
34 
35 	if (s != NULL) {
36 		if (*s == '0')
37 			tcpfm = strtol(s, NULL, 0);
38 		else
39 			tcpfm = tcpflags(s);
40 	}
41 
42 	if (!tcpfm) {
43 		if (tcpf == TH_SYN)
44 			tcpfm = 0xff & ~(TH_ECN|TH_CWR);
45 		else
46 			tcpfm = 0xff & ~(TH_ECN);
47 	}
48 	*mask = tcpfm;
49 	return tcpf;
50 }
51