示例#1
0
/*
 * @brief test ipv4 parsing
 */
static void test_v4(void)
{
	struct lrtr_ip_addr addr;
	char buf[INET_ADDRSTRLEN];

	lrtr_ip_str_to_addr("0.0.0.0", &addr);
	assert(addr.ver == LRTR_IPV4);
	assert(addr.u.addr4.addr == 0);
	lrtr_ip_addr_to_str(&addr, buf, sizeof(buf));
	assert(strcmp("0.0.0.0", buf) == 0);

	lrtr_ip_str_to_addr("255.255.255.255", &addr);
	assert(addr.ver == LRTR_IPV4);
	assert(addr.u.addr4.addr == 0xffffffff);
	lrtr_ip_addr_to_str(&addr, buf, sizeof(buf));
	assert(strcmp("255.255.255.255", buf) == 0);

	lrtr_ip_str_to_addr("0.2.6.7", &addr);
	assert(addr.ver == LRTR_IPV4);
	assert(addr.u.addr4.addr == 0x20607);
	lrtr_ip_addr_to_str(&addr, buf, sizeof(buf));
	assert(strcmp("0.2.6.7", buf) == 0);

	lrtr_ip_str_to_addr("78.69.255.0", &addr);
	assert(addr.ver == LRTR_IPV4);
	assert(addr.u.addr4.addr == 0x4e45ff00);
	lrtr_ip_addr_to_str(&addr, buf, sizeof(buf));
	assert(strcmp("78.69.255.0", buf) == 0);

	lrtr_ip_str_to_addr("1.1.1.1", &addr);
	assert(addr.ver == LRTR_IPV4);
	assert(addr.u.addr4.addr == 0x1010101);
	lrtr_ip_addr_to_str(&addr, buf, sizeof(buf));
	assert(strcmp("1.1.1.1", buf) == 0);

	lrtr_ip_str_to_addr("5.0.255.255", &addr);
	assert(addr.ver == LRTR_IPV4);
	assert(addr.u.addr4.addr == 0x500ffff);
	lrtr_ip_addr_to_str(&addr, buf, sizeof(buf));
	assert(strcmp("5.0.255.255", buf) == 0);

	lrtr_ip_str_to_addr("8.9.6.3", &addr);
	assert(addr.ver == LRTR_IPV4);
	assert(addr.u.addr4.addr == 0x8090603);
	lrtr_ip_addr_to_str(&addr, buf, sizeof(buf));
	assert(strcmp("8.9.6.3", buf) == 0);

	/* check some malformed addresses */
	assert(lrtr_ip_str_to_addr("8,3,4,5", &addr) == -1);
	assert(lrtr_ip_str_to_addr("8.4.5", &addr) == -1);
}
示例#2
0
/*
 * @brief test ip comparsions
 */
void test_cmp(void)
{
	struct lrtr_ip_addr addr1, addr2;

	lrtr_ip_str_to_addr("2001:0:4136:e378:8000:63bf:3fff:fdd2", &addr1);
	lrtr_ip_str_to_addr("2001:0:4136:e378:8000:63bf:3fff:fdd2", &addr2);

	assert(lrtr_ip_addr_equal(addr1, addr2) == true);

	lrtr_ip_str_to_addr("2001:0:4136:e378:8000:63bf:3fff:fdd3", &addr2);
	assert(lrtr_ip_addr_equal(addr1, addr2) == false);

	lrtr_ip_str_to_addr("141.22.5.22", &addr2);
	assert(lrtr_ip_addr_equal(addr1, addr2) == false);

	lrtr_ip_str_to_addr("141.22.5.22", &addr1);
	assert(lrtr_ip_addr_equal(addr1, addr2) == true);

	lrtr_ip_str_to_addr("141.26.5.23", &addr1);
}
示例#3
0
/*
 * @brief test ipv6 parsing
 */
static void test_v6(void)
{
	struct lrtr_ip_addr addr;
	char buf[INET6_ADDRSTRLEN];

	lrtr_ip_str_to_addr("fdf8:f53b:82e4::53", &addr);
	assert(addr.u.addr6.addr[0] == 0xfdf8f53b);
	assert(addr.u.addr6.addr[1] == 0x82e40000);
	assert(addr.u.addr6.addr[2] == 0);
	assert(addr.u.addr6.addr[3] == 0x53);
	lrtr_ip_addr_to_str(&addr, buf, sizeof(buf));
	assert(strcmp("fdf8:f53b:82e4::53", buf) == 0);

	lrtr_ip_str_to_addr("fe80::200:5aee:feaa:20a2", &addr);
	assert(addr.u.addr6.addr[0] == 0xfe800000);
	assert(addr.u.addr6.addr[1] == 0);
	assert(addr.u.addr6.addr[2] == 0x2005aee);
	assert(addr.u.addr6.addr[3] == 0xfeaa20a2);
	lrtr_ip_addr_to_str(&addr, buf, sizeof(buf));
	assert(strcmp("fe80::200:5aee:feaa:20a2", buf) == 0);

	lrtr_ip_str_to_addr("2001::1", &addr);
	assert(addr.u.addr6.addr[0] == 0x20010000);
	assert(addr.u.addr6.addr[1] == 0);
	assert(addr.u.addr6.addr[2] == 0);
	assert(addr.u.addr6.addr[3] == 0x1);
	lrtr_ip_addr_to_str(&addr, buf, sizeof(buf));
	assert(strcmp("2001::1", buf) == 0);

	lrtr_ip_str_to_addr("2001:0:4136:e378:8000:63bf:3fff:fdd2", &addr);
	assert(addr.u.addr6.addr[0] == 0x20010000);
	assert(addr.u.addr6.addr[1] == 0x4136e378);
	assert(addr.u.addr6.addr[2] == 0x800063bf);
	assert(addr.u.addr6.addr[3] == 0x3ffffdd2);
	lrtr_ip_addr_to_str(&addr, buf, sizeof(buf));
	assert(strcmp("2001:0:4136:e378:8000:63bf:3fff:fdd2", buf) == 0);

	lrtr_ip_str_to_addr("2001:2:6c::430", &addr);
	assert(addr.u.addr6.addr[0] == 0x20010002);
	assert(addr.u.addr6.addr[1] == 0x6C0000);
	assert(addr.u.addr6.addr[2] == 0);
	assert(addr.u.addr6.addr[3] == 0x430);
	lrtr_ip_addr_to_str(&addr, buf, sizeof(buf));
	assert(strcmp("2001:2:6c::430", buf) == 0);

	lrtr_ip_str_to_addr("2001:10:240:ab::a", &addr);
	assert(addr.u.addr6.addr[0] == 0x20010010);
	assert(addr.u.addr6.addr[1] == 0x24000AB);
	assert(addr.u.addr6.addr[2] == 0);
	assert(addr.u.addr6.addr[3] == 0xa);
	lrtr_ip_addr_to_str(&addr, buf, sizeof(buf));
	assert(strcmp("2001:10:240:ab::a", buf) == 0);

	lrtr_ip_str_to_addr("2002:cb0a:3cdd:1::1", &addr);
	assert(addr.u.addr6.addr[0] == 0x2002cb0a);
	assert(addr.u.addr6.addr[1] == 0x3cdd0001);
	assert(addr.u.addr6.addr[2] == 0);
	assert(addr.u.addr6.addr[3] == 0x1);
	lrtr_ip_addr_to_str(&addr, buf, sizeof(buf));
	assert(strcmp("2002:cb0a:3cdd:1::1", buf) == 0);

	lrtr_ip_str_to_addr("2001:db8:8:4::2", &addr);
	assert(addr.u.addr6.addr[0] == 0x20010db8);
	assert(addr.u.addr6.addr[1] == 0x80004);
	assert(addr.u.addr6.addr[2] == 0);
	assert(addr.u.addr6.addr[3] == 0x2);
	lrtr_ip_addr_to_str(&addr, buf, sizeof(buf));
	assert(strcmp("2001:db8:8:4::2", buf) == 0);

	lrtr_ip_str_to_addr("FF01:0:0:0:0:0:0:2", &addr);
	assert(addr.u.addr6.addr[0] == 0xff010000);
	assert(addr.u.addr6.addr[1] == 0);
	assert(addr.u.addr6.addr[2] == 0);
	assert(addr.u.addr6.addr[3] == 0x2);
	lrtr_ip_addr_to_str(&addr, buf, sizeof(buf));
	assert(strcmp("ff01::2", buf) == 0);

	lrtr_ip_str_to_addr("fdf8:f53b:82e4::53", &addr);
	assert(addr.u.addr6.addr[0] == 0xfdf8f53b);
	assert(addr.u.addr6.addr[1] == 0x82e40000);
	assert(addr.u.addr6.addr[2] == 0);
	assert(addr.u.addr6.addr[3] == 0x53);
	lrtr_ip_addr_to_str(&addr, buf, sizeof(buf));
	assert(strcmp("fdf8:f53b:82e4::53", buf) == 0);

	lrtr_ip_str_to_addr("fe80::200:5aee:feaa:20a2", &addr);
	assert(addr.u.addr6.addr[0] == 0xfe800000);
	assert(addr.u.addr6.addr[1] == 0);
	assert(addr.u.addr6.addr[2] == 0x2005aee);
	assert(addr.u.addr6.addr[3] == 0xfeaa20a2);
	lrtr_ip_addr_to_str(&addr, buf, sizeof(buf));
	assert(strcmp("fe80::200:5aee:feaa:20a2", buf) == 0);

	lrtr_ip_str_to_addr("2001::1", &addr);
	assert(addr.u.addr6.addr[0] == 0x20010000);
	assert(addr.u.addr6.addr[1] == 0);
	assert(addr.u.addr6.addr[2] == 0);
	assert(addr.u.addr6.addr[3] == 1);
	lrtr_ip_addr_to_str(&addr, buf, sizeof(buf));
	assert(strcmp("2001::1", buf) == 0);

	lrtr_ip_str_to_addr("2001:0:4136:e378:8000:63bf:3fff:fdd2", &addr);
	assert(addr.u.addr6.addr[0] == 0x20010000);
	assert(addr.u.addr6.addr[1] == 0x4136e378);
	assert(addr.u.addr6.addr[2] == 0x800063bf);
	assert(addr.u.addr6.addr[3] == 0x3ffffdd2);
	lrtr_ip_addr_to_str(&addr, buf, sizeof(buf));
	assert(strcmp("2001:0:4136:e378:8000:63bf:3fff:fdd2", buf) == 0);

	/* test embedded ipv4 */
	lrtr_ip_str_to_addr("::ffff:192.0.2.128", &addr);
	assert(addr.u.addr6.addr[0] == 0);
	assert(addr.u.addr6.addr[1] == 0);
	assert(addr.u.addr6.addr[2] == 0xffff);
	assert(addr.u.addr6.addr[3] == 0xc0000280);
	lrtr_ip_addr_to_str(&addr, buf, sizeof(buf));
	assert(strcmp("::ffff:192.0.2.128", buf) == 0);

	lrtr_ip_str_to_addr("::10.58.64.34", &addr);
	assert(addr.u.addr6.addr[0] == 0);
	assert(addr.u.addr6.addr[1] == 0);
	assert(addr.u.addr6.addr[2] == 0);
	assert(addr.u.addr6.addr[3] == 0xa3a4022);
	lrtr_ip_addr_to_str(&addr, buf, sizeof(buf));
	assert(strcmp("::10.58.64.34", buf) == 0);

	/* test check for mallformed embedded ipv4 */
	assert(lrtr_ip_str_to_addr("::ffff:192.0,2.128", &addr) == -1);

	/* buffer size check*/
	assert(lrtr_ip_addr_to_str(&addr, buf, 10) == -1);

	/* test leading single colon check */
	assert(lrtr_ip_str_to_addr(":ffff::ffff", &addr) == -1);

	/* test multiple double colons check */
	assert(lrtr_ip_str_to_addr("::ffff::ffff", &addr) == -1);

	/* test check for to long addresses */
	assert(lrtr_ip_str_to_addr("2001:0:6:8:0:f:3fff:fdd2:55", &addr) == -1);

	/* test check for to big groups */
	assert(lrtr_ip_str_to_addr("::fffff", &addr) == -1);

	/* check for null byte in address string */
	assert(lrtr_ip_str_to_addr("2001:\0::", &addr) == -1);
}
示例#4
0
/*
 * @brief Test IPv6 address bit operations required by trie
 */
static void get_bits_testv6(void)
{
	struct lrtr_ip_addr addr;
	struct lrtr_ip_addr result;

	addr.ver = LRTR_IPV6;
	addr.u.addr6.addr[0] = 0x22AABBCC;
	addr.u.addr6.addr[1] = 0xDDEEFF99;
	addr.u.addr6.addr[2] = 0x33001122;
	addr.u.addr6.addr[3] = 0x33445566;

	result = lrtr_ip_addr_get_bits(&addr, 0, 128);
	assert(result.u.addr6.addr[0] == addr.u.addr6.addr[0] &&
	       result.u.addr6.addr[1] == addr.u.addr6.addr[1] &&
	       result.u.addr6.addr[2] == addr.u.addr6.addr[2] &&
	       result.u.addr6.addr[3] == addr.u.addr6.addr[3]);

	result = lrtr_ip_addr_get_bits(&addr, 0, 64);
	assert(result.u.addr6.addr[0] == addr.u.addr6.addr[0] &&
	       result.u.addr6.addr[1] == addr.u.addr6.addr[1] &&
	       result.u.addr6.addr[2] == 0 &&
	       result.u.addr6.addr[3] == 0);

	bzero(&result, sizeof(result));
	result = lrtr_ip_addr_get_bits(&addr, 64, 64);
	assert(result.u.addr6.addr[0] == 0);
	assert(result.u.addr6.addr[1] == 0);
	assert(result.u.addr6.addr[2] == addr.u.addr6.addr[2]);
	assert(result.u.addr6.addr[3] == addr.u.addr6.addr[3]);

	result = lrtr_ip_addr_get_bits(&addr, 0, 8);
	assert(result.u.addr6.addr[0] == 0x22000000 &&
	       result.u.addr6.addr[1] == 0);

	result = lrtr_ip_addr_get_bits(&addr, 64, 8);
	assert(result.u.addr6.addr[1] == 0 &&
	       result.u.addr6.addr[2] == 0x33000000);

	result = lrtr_ip_addr_get_bits(&addr, 7, 8);
	assert(result.u.addr6.addr[0] == 0xAA0000 &&
	       result.u.addr6.addr[1] == 0);

	result = lrtr_ip_addr_get_bits(&addr, 68, 7);
	assert(result.u.addr6.addr[0] == 0 &&
	       result.u.addr6.addr[2] == 0x03000000);

	char buf[INET6_ADDRSTRLEN];

	lrtr_ip_str_to_addr("fe80::862b:2bff:fe9a:f50f", &addr);
	addr.ver = LRTR_IPV6;
	assert(addr.u.addr6.addr[0] == 0xfe800000);
	assert(addr.u.addr6.addr[1] == 0);
	assert(addr.u.addr6.addr[2] == 0x862b2bff);
	assert(addr.u.addr6.addr[3] == 0xfe9af50f);

	assert(lrtr_ip_str_to_addr("2001::", &addr) == 0);
	assert(addr.u.addr6.addr[0] == 0x20010000);
	assert(addr.u.addr6.addr[1] == 0);
	assert(addr.u.addr6.addr[2] == 0);
	assert(addr.u.addr6.addr[3] == 0);

	assert(lrtr_ip_addr_to_str(&addr, buf, sizeof(buf)) == 0);
	assert(strcmp("2001::", buf) == 0);

	lrtr_ip_str_to_addr("2001:0db8:85a3:08d3:1319:8a2e:0370:7344", &addr);
	assert(lrtr_ip_addr_to_str(&addr, buf, sizeof(buf)) == 0);
	assert(strcmp("2001:db8:85a3:8d3:1319:8a2e:370:7344", buf) == 0);

	result = lrtr_ip_addr_get_bits(&addr, 0, 16);
	assert(lrtr_ip_addr_to_str(&result, buf, sizeof(buf)) == 0);
	assert(lrtr_ip_str_cmp(&result, "2001::"));

	result = lrtr_ip_addr_get_bits(&addr, 16, 16);
	assert(lrtr_ip_addr_to_str(&result, buf, sizeof(buf)) == 0);
	assert(lrtr_ip_str_cmp(&result, "0:db8::"));
	result = lrtr_ip_addr_get_bits(&addr, 0, 1);
	assert(lrtr_ip_str_cmp(&result, "::"));

	result = lrtr_ip_addr_get_bits(&addr, 126, 1);
	assert(lrtr_ip_addr_to_str(&result, buf, sizeof(buf)) == 0);
	assert(lrtr_ip_str_cmp(&result, "::"));
}
示例#5
0
/*
 * @brief Test IPv4 address bit operations required by trie
 */
static void get_bits_testv4(void)
{
	struct lrtr_ip_addr addr;
	struct lrtr_ip_addr result;

	addr.ver = LRTR_IPV4;
	addr.u.addr4.addr = 0xAABBCC22;

	result = lrtr_ip_addr_get_bits(&addr, 0, 32);
	assert(result.u.addr4.addr == 0xAABBCC22);

	result = lrtr_ip_addr_get_bits(&addr, 0, 1);
	assert(result.u.addr4.addr == 0x80000000);

	result = lrtr_ip_addr_get_bits(&addr, 1, 1);
	assert(result.u.addr4.addr == 0);

	result = lrtr_ip_addr_get_bits(&addr, 2, 1);
	assert(result.u.addr4.addr == 0x20000000);

	result = lrtr_ip_addr_get_bits(&addr, 0, 8);
	assert(result.u.addr4.addr == 0xAA000000);

	result = lrtr_ip_addr_get_bits(&addr, 8, 8);
	assert(result.u.addr4.addr == 0x00BB0000);

	lrtr_ip_str_to_addr("10.10.10.0", &addr);

	result = lrtr_ip_addr_get_bits(&addr, 0, 8);
	assert(lrtr_ip_str_cmp(&result, "10.0.0.0"));

	result = lrtr_ip_addr_get_bits(&addr, 0, 16);
	assert(lrtr_ip_str_cmp(&result, "10.10.0.0"));

	result = lrtr_ip_addr_get_bits(&addr, 8, 8);
	assert(lrtr_ip_str_cmp(&result, "0.10.0.0"));

	result = lrtr_ip_addr_get_bits(&addr, 8, 24);
	assert(lrtr_ip_str_cmp(&result, "0.10.10.0"));

	result = lrtr_ip_addr_get_bits(&addr, 31, 1);
	assert(result.u.addr4.addr == 0);

	result = lrtr_ip_addr_get_bits(&addr, 0, 1);
	assert(result.u.addr4.addr == 0);

	result = lrtr_ip_addr_get_bits(&addr, 3, 3);
	assert(lrtr_ip_str_cmp(&result, "8.0.0.0"));

	assert(lrtr_ip_str_to_addr("132.200.0.0", &addr) == 0);
	result = lrtr_ip_addr_get_bits(&addr, 0, 1);
	assert(result.u.addr4.addr == 0x80000000);

	assert(lrtr_ip_str_to_addr("101.200.0.0", &addr) == 0);
	result = lrtr_ip_addr_get_bits(&addr, 0, 1);
	assert(result.u.addr4.addr == 0);

	addr.u.addr4.addr = 0x6D698000;
	result = lrtr_ip_addr_get_bits(&addr, 0, 19);
	assert(result.u.addr4.addr == 0x6D698000);

	/* ip_str_to_addr("109.105.128.0", &addr);
	 * result = ip_addr_get_bits(&addr, 0, 8);
	 * printf("%u\n", result.u.addr4.addr);
	 */
	char buf[INET_ADDRSTRLEN];

	assert(lrtr_ip_str_to_addr("10.10.10.5", &addr) == 0);
	assert(lrtr_ip_addr_to_str(&addr, buf, sizeof(buf)) == 0);
	assert(strcmp("10.10.10.5", buf) == 0);
}
示例#6
0
文件: rpki-rov.c 项目: CZ-NIC/rtrlib
int main(int argc, char *argv[])
{
	/* check arguments, need hostname/IP and port of cache-server */
	if (argc < 3) {
		printf("Usage: %s [host] [port]\n", argv[0]);
		return EXIT_FAILURE;
	}

	struct tr_socket tr_tcp;
	struct tr_tcp_config tcp_config = { argv[1], argv[2], NULL };
	struct rtr_socket rtr_tcp;
	struct rtr_mgr_config *conf;
	struct rtr_mgr_group groups[1];

	/* init a TCP transport and create rtr socket */
	tr_tcp_init(&tcp_config, &tr_tcp);
	rtr_tcp.tr_socket = &tr_tcp;

	/* create a rtr_mgr_group array with 1 element */
	groups[0].sockets = malloc(1 * sizeof(struct rtr_socket *));
	groups[0].sockets_len = 1;
	groups[0].sockets[0] = &rtr_tcp;
	groups[0].preference = 1;

	if (rtr_mgr_init(&conf, groups, 1, 30, 600, 600, NULL, NULL,
			 &connection_status_callback, NULL) < 0)
		return EXIT_FAILURE;

	rtr_mgr_start(conf);

	char input[256];
	int sleep_counter = 0;

	/* wait till at least one rtr_mgr_group is synchronized with server */
	while (!rtr_mgr_conf_in_sync(conf)) {
		if (connection_error(connection_status))
			return EXIT_FAILURE;

		sleep(1);
		sleep_counter++;
		if (sleep_counter >= connection_timeout) {
			/*
			 * Wait for input before printing "timeout",
			 * to avoid "broken pipee error while communicating
			 * with the Python program
			 */
			if (fgets(input, 256, stdin))
				;
			printf("timeout\n");
			fflush(stdout);
			return EXIT_FAILURE;
		}
	}

	char ip[128];
	int mask;
	int asn;
	int counter;
	/* loop for input */
	while (1) {
		int input_len;
		int spaces;

		/* recheck connection, exit on failure */
		if (connection_error(connection_status))
			return EXIT_FAILURE;

		/* try reading from stdin, exit on failure */
		if (!fgets(input, 256, stdin)) {
			printf("input error\n");
			return EXIT_FAILURE;
		}

		/* remove newline, if present */
		input_len = strlen(input) - 1;
		if (input[input_len] == '\n')
			input[input_len] = '\0';

		/* check if there are exactly 3 arguments */
		spaces = 0;
		for (counter = 0; counter < input_len; counter++) {
			if (input[counter] == ' ' &&
			    input[counter + 1] != ' ' &&
			    input[counter + 1] != '\0' && counter != 0)
				spaces++;
		}

		/* check input matching pattern */
		if (spaces != 2) {
			printf("Arguments required: IP Mask ASN\n");
			fflush(stdout);
			continue;
		}

		char delims[] = " ";
		char *input_tok = NULL;

		input_tok = strtok(input, delims);
		strcpy(ip, input_tok);
		input_tok = strtok(NULL, delims);
		mask = atoi(input_tok);
		input_tok = strtok(NULL, delims); asn = atoi(input_tok);

		struct lrtr_ip_addr pref;
		enum pfxv_state result;
		struct pfx_record *reason = NULL;
		unsigned int reason_len = 0;

		lrtr_ip_str_to_addr(ip, &pref);
		/* do validation */
		pfx_table_validate_r(groups[0].sockets[0]->pfx_table, &reason,
				     &reason_len, asn, &pref, mask, &result);

		int validity_code = -1;
		/* translate validation result */
		if (result == BGP_PFXV_STATE_VALID)
			validity_code = 0;
		else if (result == BGP_PFXV_STATE_NOT_FOUND)
			validity_code = 1;
		else if (result == BGP_PFXV_STATE_INVALID)
			validity_code = 2;

		/* IP Mask BGP-ASN| */
		printf("%s %d %d|", ip, mask, asn);

		/* ROA-ASN IP MaskMin MaskMax, ... */
		if (reason && (reason_len > 0)) {
			unsigned int i;

			for (i = 0; i < reason_len; i++) {
				char tmp[100];

				lrtr_ip_addr_to_str(&reason[i].prefix,
						    tmp, sizeof(tmp));
				printf("%u %s %u %u",
				       reason[i].asn, tmp,
				       reason[i].min_len,
				       reason[i].max_len);
				if ((i + 1) < reason_len)
					printf(",");
			}
		}

		/* |validity_code */
		printf("|%d", validity_code);

		printf("\n");
		fflush(stdout);
	}

	rtr_mgr_stop(conf);
	rtr_mgr_free(conf);
	free(groups[0].sockets);

	return EXIT_SUCCESS;
}
int test_rtr_validation()
{
  cfg_tr = bgpstream_rtr_start_connection(TEST_RPKI_VALIDATOR_URL,
                                          TEST_RPKI_VALIDATOR_PORT, NULL, NULL,
                                          NULL, NULL, NULL, NULL);
  struct pfx_table *pfxt = cfg_tr->groups[0].sockets[0]->pfx_table;

  struct pfx_record pfx_v4;
  char ipv4_address[INET_ADDRSTRLEN];
  pfx_v4.min_len = TEST_MIN_LEN;
  pfx_v4.max_len = TEST_MAX_LEN;
  pfx_v4.socket = TEST_SOCKET;
  pfx_v4.asn = TEST_ASN;
  strcpy(ipv4_address, TEST_IP_ADDR);
  lrtr_ip_str_to_addr(ipv4_address, &pfx_v4.prefix);
  pfx_table_remove(pfxt, &pfx_v4);

  struct pfx_record pfx_v6;
  char ipv6_address[INET6_ADDRSTRLEN];
  pfx_v6.min_len = 48;
  pfx_v6.max_len = 48;
  pfx_v6.socket = NULL;
  pfx_v6.asn = 12654;
  strcpy(ipv6_address, "2001:7fb:fd02::\0");
  lrtr_ip_str_to_addr(ipv6_address, &pfx_v6.prefix);
  pfx_table_remove(pfxt, &pfx_v6);

  struct reasoned_result res;

  CHECK("RTR: Add a valid pfx_record to pfx_table",
        pfx_table_add(pfxt, &pfx_v4) == PFX_SUCCESS);
  res = bgpstream_rtr_validate_reason(cfg_tr, pfx_v4.asn, ipv4_address,
                                      pfx_v4.max_len);
  CHECK("RTR: Compare valid IPv4 ROA with validation result",
        res.result == BGP_PFXV_STATE_VALID);

  CHECK("RTR: Add a valid pfx_record to pfx_table",
        pfx_table_add(pfxt, &pfx_v6) == PFX_SUCCESS);
  res = bgpstream_rtr_validate_reason(cfg_tr, pfx_v6.asn, ipv6_address,
                                      pfx_v6.max_len);
  CHECK("RTR: Compare valid IPv6 ROA with validation result",
        res.result == BGP_PFXV_STATE_VALID);

  res = bgpstream_rtr_validate_reason(cfg_tr, 196615, ipv4_address,
                                      pfx_v4.max_len);
  CHECK("RTR: Compare invalid (asn) IPv4 ROA with validation result",
        res.result == BGP_PFXV_STATE_INVALID);

  res = bgpstream_rtr_validate_reason(cfg_tr, 196615, ipv6_address,
                                      pfx_v6.max_len);
  CHECK("RTR: Compare invalid (asn) IPv6 ROA with validation result",
        res.result == BGP_PFXV_STATE_INVALID);

  res = bgpstream_rtr_validate_reason(cfg_tr, pfx_v4.asn, ipv4_address, 30);
  CHECK("RTR: Compare invalid (max len) IPv4 ROA with validation result",
        res.result == BGP_PFXV_STATE_INVALID);

  res = bgpstream_rtr_validate_reason(cfg_tr, pfx_v6.asn, ipv6_address, 50);
  CHECK("RTR: Compare invalid (max len) IPv6 ROA with validation result",
        res.result == BGP_PFXV_STATE_INVALID);

  pfx_v4.asn = 12345;
  lrtr_ip_str_to_addr("84.205.83.0\0", &pfx_v4.prefix);
  pfx_table_remove(pfxt, &pfx_v4);
  res = bgpstream_rtr_validate_reason(cfg_tr, 12345, "84.205.83.0\0",
                                      pfx_v4.max_len);
  CHECK("RTR: Compare none existend IPv4 ROA with validation result",
        res.result == BGP_PFXV_STATE_NOT_FOUND);

  pfx_v6.asn = 12345;
  lrtr_ip_str_to_addr("2001:7fb:ff03::\0", &pfx_v6.prefix);
  pfx_table_remove(pfxt, &pfx_v6);
  res = bgpstream_rtr_validate_reason(cfg_tr, 12345, "2001:7fb:ff03::\0",
                                      pfx_v6.max_len);
  CHECK("RTR: Compare none existend IPv6 ROA with validation result",
        res.result == BGP_PFXV_STATE_NOT_FOUND);

  free(res.reason);
  bgpstream_rtr_close_connection(cfg_tr);

  return 0;
}
int test_validation_process()
{
  bgpstream_set_rtr_config(TEST_RPKI_VALIDATOR_URL, TEST_RPKI_VALIDATOR_PORT,
                           NULL, NULL, NULL, true);

  cfg_tr =
      bgpstream_rtr_start_connection(rtr_server_conf.host, rtr_server_conf.port,
                                     NULL, NULL, NULL, NULL, NULL, NULL);
  struct pfx_table *pfxt = cfg_tr->groups[0].sockets[0]->pfx_table;
  bgpstream_elem_t *elem = bgpstream_elem_create();
  elem->annotations.rpki_validation_status =
      BGPSTREAM_ELEM_RPKI_VALIDATION_STATUS_NOTVALIDATED;

  uint8_t number_of_tests = 3;
  uint8_t pfxs_size = number_of_tests * number_of_tests;
  struct pfx_record pfxs[pfxs_size];

  int test_asn_index;
  for (test_asn_index = 0; test_asn_index < number_of_tests; test_asn_index++) {
    int test_pfx_index;
    for (test_pfx_index = 0; test_pfx_index < number_of_tests;
         test_pfx_index++) {
      struct pfx_record pfx;
      pfx.min_len = TEST_MIN_LEN - test_pfx_index;
      pfx.max_len = TEST_MAX_LEN - test_pfx_index;
      pfx.socket = TEST_SOCKET;
      pfx.asn = TEST_ASN + test_asn_index;
      char ip_address[INET_ADDRSTRLEN];
      strcpy(ip_address, TEST_IP_ADDR);
      lrtr_ip_str_to_addr(ip_address, &pfx.prefix);
      CHECK("RTR: Add a valid pfx_record to pfx_table",
            pfx_table_add(pfxt, &pfx) == PFX_SUCCESS);
      pfxs[(test_asn_index * number_of_tests) + test_pfx_index] = pfx;
      bgpstream_elem_get_rpki_validation_result(elem, ip_address, pfx.asn,
                                                pfx.max_len);
    }
  }

  bgpstream_rpki_validation_result_t val_table;
  val_table = elem->annotations.rpki_validation_result;
  int test_index;
  for (test_index = 0; test_index < pfxs_size; test_index++) {
    int asn_index;
    for (asn_index = 0; asn_index < val_table.asn_used; asn_index++) {
      if (val_table.asn_pfx[asn_index].asn == pfxs[test_index].asn) {
        CHECK("RTR: Inspect result struct to find added asn", true);
        int pfx_index;
        for (pfx_index = 0; pfx_index < val_table.asn_pfx[asn_index].pfx_used;
             pfx_index++) {
          char pfx_string[INET6_ADDRSTRLEN];
          lrtr_ip_addr_to_str(&pfxs[test_index].prefix, pfx_string,
                              INET6_ADDRSTRLEN);
          if (inet_ntoa(val_table.asn_pfx[asn_index]
                            .pfxs[pfx_index]
                            .pfx.address.ipv4) == pfx_string) {
            CHECK("RTR: Inspect result struct to find added pfx", true);
            CHECK("RTR: Compare max len of prefix ",
                  val_table.asn_pfx[asn_index].pfxs[pfx_index].max_pfx_len ==
                      pfxs[test_index].max_len);
          }
        }
      }
    }
  }
  return 0;
}