예제 #1
0
static void test_zonecut_params(void **state)
{
	/* NULL args */
	struct kr_zonecut cut;
	assert_int_not_equal(kr_zonecut_init(NULL, NULL, NULL), 0);
	assert_int_not_equal(kr_zonecut_init(&cut, NULL, NULL), 0);
	kr_zonecut_deinit(NULL);
	kr_zonecut_set(NULL, NULL);
	kr_zonecut_set(&cut, NULL);
	assert_int_not_equal(kr_zonecut_add(NULL, NULL, NULL), 0);
	assert_null((void *)kr_zonecut_find(NULL, NULL));
	assert_null((void *)kr_zonecut_find(&cut, NULL));
	assert_int_not_equal(kr_zonecut_set_sbelt(NULL, NULL), 0);
	assert_int_not_equal(kr_zonecut_find_cached(NULL, NULL, NULL, NULL, 0), 0);
}
예제 #2
0
static void test_zonecut_filter(void **state)
{
	struct kr_zonecut cut;
	kr_zonecut_init(&cut, (const uint8_t *)"", NULL);

	/* IPv4 */
	uint32_t ip4 = 0; /* 0.0.0.0 */
	TEST_IP(cut, ip4, kr_error(EILSEQ));
	ip4 = htonl(0x7f000002); /* 127.0.0.2 */
	TEST_IP(cut, ip4, kr_error(EILSEQ));
	ip4 = htonl(0x7fffffff); /* 127.255.255.255 */
	TEST_IP(cut, ip4, kr_error(EILSEQ));
	ip4 = htonl(0xff000001); /* 255.0.0.1 */
	TEST_IP(cut, ip4, 0);
	/* IPv6 */
	struct in6_addr ip6;
	memset(&ip6, 0, sizeof(ip6)); /* :: */
	TEST_IP(cut, ip6.s6_addr, kr_error(EILSEQ));
	ip6.s6_addr[15] = 0x01; /* ::1 */
	TEST_IP(cut, ip6.s6_addr, kr_error(EILSEQ));
	ip6.s6_addr[15] = 0x02; /* ::2 */
	TEST_IP(cut, ip6.s6_addr, 0);

	kr_zonecut_deinit(&cut);
}
예제 #3
0
static int load(struct kr_module *module, const char *path)
{
	auto_fclose FILE *fp = fopen(path, "r");
	if (fp == NULL) {
		DEBUG_MSG(NULL, "reading '%s' failed: %s\n", path, strerror(errno));
		return kr_error(errno);
	} else {
		DEBUG_MSG(NULL, "reading '%s'\n", path);
	}

	/* Create pool and copy itself */
	mm_ctx_t _pool = {
		.ctx = mp_new(4096),
		.alloc = (mm_alloc_t) mp_alloc
	};
	mm_ctx_t *pool = mm_alloc(&_pool, sizeof(*pool));
	if (!pool) {
		return kr_error(ENOMEM);
	}
	memcpy(pool, &_pool, sizeof(*pool));

	/* Load file to map */
	struct kr_zonecut *hints = mm_alloc(pool, sizeof(*hints));
	kr_zonecut_init(hints, (const uint8_t *)(""), pool);
	module->data = hints;
	return load_map(hints, fp);
}
예제 #4
0
static void test_zonecut_copy(void **state)
{
	const knot_dname_t *root = (const uint8_t *)"";
	struct kr_zonecut cut1, cut2;
	kr_zonecut_init(&cut1, root, NULL);
	kr_zonecut_init(&cut2, root, NULL);
	/* Insert some values */
	assert_int_equal(kr_zonecut_add(&cut1, (const uint8_t *)"dead", NULL), 0);
	assert_int_equal(kr_zonecut_add(&cut1, (const uint8_t *)"beef", NULL), 0);
	/* Copy */
	assert_int_equal(kr_zonecut_copy(&cut2, &cut1), 0);
	/* Check if exist */
	assert_non_null(kr_zonecut_find(&cut2, (const uint8_t *)"dead"));
	assert_non_null(kr_zonecut_find(&cut2, (const uint8_t *)"beef"));
	assert_null(kr_zonecut_find(&cut2, (const uint8_t *)"corn"));
	kr_zonecut_deinit(&cut1);
	kr_zonecut_deinit(&cut2);
}
예제 #5
0
static int init_resolver(struct engine *engine)
{
	/* Open resolution context */
	engine->resolver.trust_anchors = map_make();
	engine->resolver.negative_anchors = map_make();
	engine->resolver.pool = engine->pool;
	engine->resolver.modules = &engine->modules;
	/* Create OPT RR */
	engine->resolver.opt_rr = mm_alloc(engine->pool, sizeof(knot_rrset_t));
	if (!engine->resolver.opt_rr) {
		return kr_error(ENOMEM);
	}
	knot_edns_init(engine->resolver.opt_rr, KR_EDNS_PAYLOAD, 0, KR_EDNS_VERSION, engine->pool);
	/* Set default root hints */
	kr_zonecut_init(&engine->resolver.root_hints, (const uint8_t *)"", engine->pool);
	kr_zonecut_set_sbelt(&engine->resolver, &engine->resolver.root_hints);
	/* Open NS rtt + reputation cache */
	engine->resolver.cache_rtt = mm_alloc(engine->pool, lru_size(kr_nsrep_lru_t, LRU_RTT_SIZE));
	if (engine->resolver.cache_rtt) {
		lru_init(engine->resolver.cache_rtt, LRU_RTT_SIZE);
	}
	engine->resolver.cache_rep = mm_alloc(engine->pool, lru_size(kr_nsrep_lru_t, LRU_REP_SIZE));
	if (engine->resolver.cache_rep) {
		lru_init(engine->resolver.cache_rep, LRU_REP_SIZE);
	}

	/* Load basic modules */
	engine_register(engine, "iterate", NULL, NULL);
	engine_register(engine, "validate", NULL, NULL);
	engine_register(engine, "rrcache", NULL, NULL);
	engine_register(engine, "pktcache", NULL, NULL);

	/* Initialize storage backends */
	struct storage_api lmdb = {
		"lmdb://", knot_db_lmdb_api, knot_db_lmdb_mkopts
	};

	return array_push(engine->storage_registry, lmdb);
}