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