Knot-DNS-sorted-rrset

今天发现Knot2.7.4新增了answer rrset rotation.(官网介绍是在2.7.3就已经支持,但实际在2.7.4中才有该功能)

经过实际测试发现,该版本仅对非ECS查询的普通响应进行了排序,针对ECS的响应仍然是按照配置文件的书写顺序固定返回。

 

其中排序的核心是这个函数,主要逻辑如下:

根据参数 rotate 标定的起始位置,将配置的记录不改变前后次序的条件下,重新排序填充到响应报文

_public_
int knot_rrset_to_wire_extra(const knot_rrset_t *rrset, uint8_t *wire,
                             uint16_t max_size, uint16_t rotate,
                             knot_compr_t *compr, uint16_t flags)
{
	if (rrset == NULL || wire == NULL) {
		return KNOT_EINVAL;
	}
	if (rrset->rrs.count == 0) {
		return 0;
	}
	if (rotate != 0) {
		rotate %= rrset->rrs.count;
	}

	uint8_t *write = wire;
	size_t capacity = max_size;

	uint16_t count = rrset->rrs.count;
	for (uint16_t i = rotate; i < count + rotate; i++) {
		uint16_t pos = (i < count) ? i : (i - count);
		int ret = write_rr(rrset, pos, &write, &capacity, compr, flags);
		if (ret != KNOT_EOK) {
			return ret;
		}
	}

	return write - wire;
}

对于非ECS的普通查询:

put_answer() -> process_query_put_rr() -> knot_pkt_put_rotate() -> knot_rrset_to_wire_extra()


	uint16_t rotate = conf()->cache.srv_ans_rotate ? knot_wire_get_id(qdata->query->wire) : 0;
	uint16_t prev_count = pkt->rrset_count;
	ret = knot_pkt_put_rotate(pkt, compr_hint, &to_add, rotate, flags);
	if (ret != KNOT_EOK && (flags & KNOT_PF_FREE)) {
		knot_rrset_clear(&to_add, &pkt->mm);
		return ret;
	}

从这段代码可以看出,在 process_query_put_rr() 中根据查询ID产生rotate,通过层层传递给 knot_rrset_to_wire_extra() 排序的起始位置。

对于ECS的查询:

geoip_process() -> knot_pkt_put() -> knot_pkt_put_rotate() -> knot_rrset_to_wire_extra()

/*! \brief Same as knot_pkt_put_rotate but without rrset rotation. */
static inline int knot_pkt_put(knot_pkt_t *pkt, uint16_t compr_hint,
                               const knot_rrset_t *rr, uint16_t flags)
{
	return knot_pkt_put_rotate(pkt, compr_hint, rr, 0, flags);
}

从这段代码可以看出,在knot_pkt_put() 中 传递进去的rotate参数是0,也就是说这里并没有对响应rr进行排序。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值