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