const uint16_t *kr_gc_key_consistent(knot_db_val_t key)
{
const static uint16_t NSEC1 = KNOT_RRTYPE_NSEC;
+ const static uint16_t NSEC3 = KNOT_RRTYPE_NSEC3;
uint8_t *p = key.data;
while(*p != 0) {
while(*p++ != 0) {
return (p + 2 - (uint8_t *)key.data >= key.len ? NULL : (uint16_t *)(p + 1));
case '1':
return &NSEC1;
+ case '3':
+ return &NSEC3;
default:
return NULL;
}
}
-// expects that key is consistent!
-static uint8_t entry_labels(knot_db_val_t *key)
+/// expects that key is consistent! CACHE_KEY_DEF
+static uint8_t entry_labels(knot_db_val_t *key, uint16_t rrtype)
{
uint8_t lab = 0, *p = key->data;
while (*p != 0) {
}
lab++;
}
+ if (rrtype == KNOT_RRTYPE_NSEC3) {
+ // We don't know the number of labels so easily,
+ // but let's classify everything as directly
+ // below the zone apex (that's most common).
+ ++lab;
+ }
return lab;
}
info.rrtype = *entry_type;
info.entry_size = key.len + val.len;
info.expires_in = entry->time + entry->ttl - now;
- info.no_labels = entry_labels(&key);
+ info.no_labels = entry_labels(&key, *entry_type);
ret = callback(&key, &info, ctx);
}