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; }
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; }