1145510Sdarrenr/*
2254219Scy * Copyright (C) 2012 by Darren Reed.
3145510Sdarrenr *
4145510Sdarrenr * See the IPFILTER.LICENCE file for details on licencing.
5145510Sdarrenr *
6254219Scy * $Id$
7145510Sdarrenr */
8145510Sdarrenr
9145510Sdarrenr#include "ipf.h"
10145510Sdarrenr
11145510Sdarrenr
12254219Scyint genmask(family, msk, mskp)
13254219Scy	int family;
14254219Scy	char *msk;
15254219Scy	i6addr_t *mskp;
16145510Sdarrenr{
17145510Sdarrenr	char *endptr = 0L;
18254219Scy	u_32_t addr;
19145510Sdarrenr	int bits;
20145510Sdarrenr
21145510Sdarrenr	if (strchr(msk, '.') || strchr(msk, 'x') || strchr(msk, ':')) {
22145510Sdarrenr		/* possibly of the form xxx.xxx.xxx.xxx
23145510Sdarrenr		 * or 0xYYYYYYYY */
24254219Scy		switch (family)
25254219Scy		{
26254219Scy#ifdef USE_INET6
27254219Scy		case AF_INET6 :
28254219Scy			if (inet_pton(AF_INET6, msk, &mskp->in4) != 1)
29145510Sdarrenr				return -1;
30254219Scy			break;
31145510Sdarrenr#endif
32254219Scy		case AF_INET :
33254219Scy			if (inet_aton(msk, &mskp->in4) == 0)
34254219Scy				return -1;
35254219Scy			break;
36254219Scy		default :
37145510Sdarrenr			return -1;
38254219Scy			/*NOTREACHED*/
39254219Scy		}
40145510Sdarrenr	} else {
41145510Sdarrenr		/*
42145510Sdarrenr		 * set x most significant bits
43145510Sdarrenr		 */
44145510Sdarrenr		bits = (int)strtol(msk, &endptr, 0);
45254219Scy
46254219Scy		switch (family)
47254219Scy		{
48254219Scy		case AF_INET6 :
49254219Scy			if ((*endptr != '\0') || (bits < 0) || (bits > 128))
50254219Scy				return -1;
51254219Scy			fill6bits(bits, mskp->i6);
52254219Scy			break;
53254219Scy		case AF_INET :
54254219Scy			if (*endptr != '\0' || bits > 32 || bits < 0)
55254219Scy				return -1;
56254219Scy			if (bits == 0)
57254219Scy				addr = 0;
58254219Scy			else
59254219Scy				addr = htonl(0xffffffff << (32 - bits));
60254219Scy			mskp->in4.s_addr = addr;
61254219Scy			break;
62254219Scy		default :
63145510Sdarrenr			return -1;
64254219Scy			/*NOTREACHED*/
65254219Scy		}
66145510Sdarrenr	}
67145510Sdarrenr	return 0;
68145510Sdarrenr}
69