コード例 #1
0
ファイル: rrl.c プロジェクト: gitter-badger/knot
static int rrl_classify(char *dst, size_t maxlen, const struct sockaddr_storage *a,
                        rrl_req_t *p, const zone_t *z, uint32_t seed)
{
    if (!dst || !p || !a || maxlen == 0) {
        return KNOT_EINVAL;
    }

    /* Class */
    uint8_t cls = rrl_clsid(p);
    *dst = cls;
    int blklen = sizeof(cls);

    /* Address (in network byteorder, adjust masks). */
    uint64_t nb = 0;
    if (a->ss_family == AF_INET6) {
        struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)a;
        nb = *((uint64_t*)(&ipv6->sin6_addr)) & RRL_V6_PREFIX;
    } else {
        struct sockaddr_in *ipv4 = (struct sockaddr_in *)a;
        nb = ((uint32_t)ipv4->sin_addr.s_addr) & RRL_V4_PREFIX;
    }
    if (blklen + sizeof(nb) > maxlen) return KNOT_ESPACE;
    memcpy(dst + blklen, (void*)&nb, sizeof(nb));
    blklen += sizeof(nb);

    /* Name */
    uint16_t *nlen = (uint16_t*)(dst + blklen);
    blklen += sizeof(uint16_t);
    int len = rrl_clsname(dst + blklen, maxlen - blklen, cls, p, z);
    if (len < 0)
        return len;
    *nlen = len;
    blklen += len;

    /* Seed. */
    if (blklen + sizeof(seed) > maxlen) return KNOT_ESPACE;
    if (memcpy(dst + blklen, (void*)&seed, sizeof(seed)) == 0) {
        blklen += sizeof(seed);
    }

    return blklen;
}
コード例 #2
0
ファイル: rrl.c プロジェクト: nice-redbull/knot
static int rrl_classify(char *dst, size_t maxlen, const sockaddr_t *a,
                        rrl_req_t *p, const knot_zone_t *z, uint32_t seed)
{
	if (!dst || !p || !a || maxlen == 0) {
		return KNOT_EINVAL;
	}

	/* Class */
	uint8_t cls = rrl_clsid(p);
	*dst = cls;
	int blklen = sizeof(cls);

	/* Address (in network byteorder, adjust masks). */
	uint64_t nb = 0;
	if (sockaddr_family(a) == AF_INET6) { /* Take the /56 prefix. */
		nb = *((uint64_t*)&a->addr6.sin6_addr) & RRL_V6_PREFIX;
	} else {                     /* Take the /24 prefix */
		nb = (uint32_t)a->addr4.sin_addr.s_addr & RRL_V4_PREFIX;
	}
	if (blklen + sizeof(nb) > maxlen) return KNOT_ESPACE;
	memcpy(dst + blklen, (void*)&nb, sizeof(nb));
	blklen += sizeof(nb);

	/* Name */
	uint16_t *nlen = (uint16_t*)(dst + blklen);
	blklen += sizeof(uint16_t);
	int len = rrl_clsname(dst + blklen, maxlen - blklen, cls, p, z);
	if (len < 0) return len;
	*nlen = len;
	blklen += len;

	/* Seed. */
	if (blklen + sizeof(seed) > maxlen) return KNOT_ESPACE;
	if (memcpy(dst + blklen, (void*)&seed, sizeof(seed)) == 0) {
		blklen += sizeof(seed);
	}

	return blklen;
}