1145519Sdarrenr/* $FreeBSD$ */ 2145510Sdarrenr 3145510Sdarrenr/* 4255332Scy * Copyright (C) 2012 by Darren Reed. 5145510Sdarrenr * 6145510Sdarrenr * See the IPFILTER.LICENCE file for details on licencing. 7145510Sdarrenr * 8255332Scy * $Id$ 9145510Sdarrenr */ 10145510Sdarrenr 11145510Sdarrenr#include "ipf.h" 12145510Sdarrenr 13145510Sdarrenr 14145510Sdarrenr/* 15145510Sdarrenr * count consecutive 1's in bit mask. If the mask generated by counting 16145510Sdarrenr * consecutive 1's is different to that passed, return -1, else return # 17145510Sdarrenr * of bits. 18145510Sdarrenr */ 19145510Sdarrenrint count4bits(ip) 20255332Scy u_int ip; 21145510Sdarrenr{ 22145510Sdarrenr int cnt = 0, i, j; 23145510Sdarrenr u_int ipn; 24145510Sdarrenr 25145510Sdarrenr ip = ipn = ntohl(ip); 26145510Sdarrenr for (i = 32; i; i--, ipn *= 2) 27145510Sdarrenr if (ipn & 0x80000000) 28145510Sdarrenr cnt++; 29145510Sdarrenr else 30145510Sdarrenr break; 31145510Sdarrenr ipn = 0; 32145510Sdarrenr for (i = 32, j = cnt; i; i--, j--) { 33145510Sdarrenr ipn *= 2; 34145510Sdarrenr if (j > 0) 35145510Sdarrenr ipn++; 36145510Sdarrenr } 37145510Sdarrenr if (ipn == ip) 38145510Sdarrenr return cnt; 39145510Sdarrenr return -1; 40145510Sdarrenr} 41