root/sbin/ipf/libipf/tcp_flags.c

/*
 * Copyright (C) 2000-2004 by Darren Reed.
 *
 * See the IPFILTER.LICENCE file for details on licencing.
 *
 * $Id: tcp_flags.c,v 1.8.2.1 2006/06/16 17:21:17 darrenr Exp $
 */

#include "ipf.h"

extern  char     flagset[];
extern  uint16_t flags[];


uint16_t tcp_flags(char *flgs, uint16_t *mask, int linenum)
{
        uint16_t tcpf = 0, tcpfm = 0;
        char *s;

        s = strchr(flgs, '/');
        if (s)
                *s++ = '\0';

        if (*flgs == '0') {
                tcpf = strtol(flgs, NULL, 0);
        } else {
                tcpf = tcpflags(flgs);
        }

        if (s != NULL) {
                if (*s == '0')
                        tcpfm = strtol(s, NULL, 0);
                else
                        tcpfm = tcpflags(s);
        }

        if (!tcpfm) {
                if (tcpf == TH_SYN)
                        tcpfm = TH_FLAGS & ~(TH_ECN|TH_CWR);
                else
                        tcpfm = TH_FLAGS & ~(TH_ECN);
        }
        *mask = tcpfm;
        return (tcpf);
}