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