bool rrl_slip_roll(int n_slip) { /* Now n_slip means every Nth answer slips. * That represents a chance of 1/N that answer slips. * Therefore, on average, from 100 answers 100/N will slip. */ int threshold = RRL_SLIP_MAX / n_slip; int roll = dnssec_random_uint16_t() % RRL_SLIP_MAX; return (roll < threshold); }
knot_pkt_t* create_empty_packet(const size_t max_size) { // Create packet skeleton. knot_pkt_t *packet = knot_pkt_new(NULL, max_size, NULL); if (packet == NULL) { DBG_NULL; return NULL; } // Set random sequence id. knot_wire_set_id(packet->wire, dnssec_random_uint16_t()); return packet; }
/*! \brief Create zone query packet. */ static knot_pkt_t *zone_query(const zone_t *zone, uint16_t pkt_type, knot_mm_t *mm) { /* Determine query type and opcode. */ uint16_t query_type = KNOT_RRTYPE_SOA; uint16_t opcode = KNOT_OPCODE_QUERY; switch(pkt_type) { case KNOT_QUERY_AXFR: query_type = KNOT_RRTYPE_AXFR; break; case KNOT_QUERY_IXFR: query_type = KNOT_RRTYPE_IXFR; break; case KNOT_QUERY_NOTIFY: opcode = KNOT_OPCODE_NOTIFY; break; } knot_pkt_t *pkt = knot_pkt_new(NULL, KNOT_WIRE_MAX_PKTSIZE, mm); if (pkt == NULL) { return NULL; } knot_wire_set_id(pkt->wire, dnssec_random_uint16_t()); knot_wire_set_opcode(pkt->wire, opcode); if (pkt_type == KNOT_QUERY_NOTIFY) { knot_wire_set_aa(pkt->wire); } knot_pkt_put_question(pkt, zone->name, KNOT_CLASS_IN, query_type); /* Put current SOA (optional). */ zone_contents_t *contents = zone->contents; if (pkt_type == KNOT_QUERY_IXFR) { /* RFC1995, SOA in AUTHORITY. */ knot_pkt_begin(pkt, KNOT_AUTHORITY); knot_rrset_t soa_rr = node_rrset(contents->apex, KNOT_RRTYPE_SOA); knot_pkt_put(pkt, KNOT_COMPR_HINT_QNAME, &soa_rr, 0); } else if (pkt_type == KNOT_QUERY_NOTIFY) { /* RFC1996, SOA in ANSWER. */ knot_pkt_begin(pkt, KNOT_ANSWER); knot_rrset_t soa_rr = node_rrset(contents->apex, KNOT_RRTYPE_SOA); knot_pkt_put(pkt, KNOT_COMPR_HINT_QNAME, &soa_rr, 0); } return pkt; }
/*! \brief Calculate TCP throttle time (random). */ static inline int tcp_throttle() { return TCP_THROTTLE_LO + (dnssec_random_uint16_t() % TCP_THROTTLE_HI); }