예제 #1
0
void init_constants(void)
{
	happy(anyaddr(AF_INET, &ipv4_any));
	happy(anyaddr(AF_INET6, &ipv6_any));

	happy(addrtosubnet(&ipv4_any, &ipv4_wildcard));
	happy(addrtosubnet(&ipv6_any, &ipv6_wildcard));

	happy(initsubnet(&ipv4_any, 0, '0', &ipv4_all));
	happy(initsubnet(&ipv6_any, 0, '0', &ipv6_all));
}
예제 #2
0
파일: dag.cpp 프로젝트: linux-wpan/unstrung
prefix_node *dag_network::add_address(const ip_address addr)
{
    ip_subnet vs;

    initsubnet(&addr, 128, 0, &vs);
    return add_address(vs);
}
예제 #3
0
/*
 - ttosubnet - convert text "addr/mask" to address and mask
 * Mask can be integer bit count.
 */
err_t
ttosubnet(const char *src, size_t srclen,int af,ip_subnet *dst)
{
	const char *slash;
	const char *colon;
	const char *mask;
	size_t mlen;
	const char *oops;
	unsigned long bc;
	static char def[] = DEFAULTSUBNET;
#	define	DEFLEN	(sizeof(def) - 1)	/* -1 for NUL */
	static char defis4[] = "0/0";
#	define	DEFIS4LEN	(sizeof(defis4) - 1)
	static char defis6[] = "::/0";
#	define	DEFIS6LEN	(sizeof(defis6) - 1)
	ip_address addrtmp;
	ip_address masktmp;
	int nbits;
	int i;

	if (srclen == 0)
		srclen = strlen(src);
	if (srclen == 0)
		return "empty string";

	switch (af) {
	case AF_INET:
		nbits = 32;
		break;
	case AF_INET6:
		nbits = 128;
		break;
	default:
		return "unknown address family in ttosubnet";
		break;
	}

	if (srclen == DEFLEN && strncmp(src, def, srclen) == 0) {
		src = (af == AF_INET) ? defis4 : defis6;
		srclen = (af == AF_INET) ? DEFIS4LEN : DEFIS6LEN;
	}

	slash = memchr(src, '/', srclen);
	if (slash == NULL)
		return "no / in subnet specification";
	mask = slash + 1;
	mlen = srclen - (mask - src);
	oops = ttoaddr(src, slash-src, af, &addrtmp);
	if (oops != NULL)
		return oops;

	/* extract port, as last : */
	colon = memchr(mask, ':', mlen);
	if (colon == 0)
	{
		setportof(0, &addrtmp);
	}
	else
	{
		unsigned long port;

		oops =  ttoul(colon+1, mlen-(colon-mask+1), 0, &port);
		if (oops != NULL)
			return oops;
		setportof(htons(port), &addrtmp);
		mlen = colon - mask;
	}

	/*extract mask */
	oops = ttoul(mask, mlen, 10, &bc);
	if (oops == NULL) {
		/* ttoul succeeded, it's a bit-count mask */
		if (bc > nbits)
			return "subnet mask bit count too large";
		i = bc;
	} else if(af == AF_INET) {
		oops = ttoaddr(mask, mlen, af, &masktmp);
		if (oops != NULL)
			return oops;
		i = masktocount(&masktmp);
		if (i < 0)
			return "non-contiguous or otherwise erroneous mask";
	} else {
	  return "masks are not permitted for IPv6 addresses";
	}
	return initsubnet(&addrtmp, i, '0', dst);
}