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