xref: /linux/tools/net/ynl/tests/rt-addr.c (revision 91a4855d6c03e770e42f17c798a36a3c46e63de2)
1e0aa0c61SJakub Kicinski // SPDX-License-Identifier: GPL-2.0
2e0aa0c61SJakub Kicinski #include <stdio.h>
3e0aa0c61SJakub Kicinski #include <string.h>
4e0aa0c61SJakub Kicinski 
5e0aa0c61SJakub Kicinski #include <ynl.h>
6e0aa0c61SJakub Kicinski 
7e0aa0c61SJakub Kicinski #include <arpa/inet.h>
8e0aa0c61SJakub Kicinski #include <net/if.h>
9e0aa0c61SJakub Kicinski 
10*e7a39b8fSJakub Kicinski #include <kselftest_harness.h>
11*e7a39b8fSJakub Kicinski 
12e0aa0c61SJakub Kicinski #include "rt-addr-user.h"
13e0aa0c61SJakub Kicinski 
14*e7a39b8fSJakub Kicinski static void rt_addr_print(struct __test_metadata *_metadata,
15*e7a39b8fSJakub Kicinski 			  struct rt_addr_getaddr_rsp *a)
16e0aa0c61SJakub Kicinski {
17e0aa0c61SJakub Kicinski 	char ifname[IF_NAMESIZE];
18e0aa0c61SJakub Kicinski 	char addr_str[64];
19e0aa0c61SJakub Kicinski 	const char *addr;
20e0aa0c61SJakub Kicinski 	const char *name;
21e0aa0c61SJakub Kicinski 
22e0aa0c61SJakub Kicinski 	name = if_indextoname(a->_hdr.ifa_index, ifname);
23*e7a39b8fSJakub Kicinski 	EXPECT_NE(NULL, name);
24e0aa0c61SJakub Kicinski 	if (name)
25*e7a39b8fSJakub Kicinski 		ksft_print_msg("%16s: ", name);
26e0aa0c61SJakub Kicinski 
27*e7a39b8fSJakub Kicinski 	EXPECT_TRUE(a->_len.address == 4 || a->_len.address == 16);
28e0aa0c61SJakub Kicinski 	switch (a->_len.address) {
29e0aa0c61SJakub Kicinski 	case 4:
30e0aa0c61SJakub Kicinski 		addr = inet_ntop(AF_INET, a->address,
31e0aa0c61SJakub Kicinski 				 addr_str, sizeof(addr_str));
32e0aa0c61SJakub Kicinski 		break;
33e0aa0c61SJakub Kicinski 	case 16:
34e0aa0c61SJakub Kicinski 		addr = inet_ntop(AF_INET6, a->address,
35e0aa0c61SJakub Kicinski 				 addr_str, sizeof(addr_str));
36e0aa0c61SJakub Kicinski 		break;
37e0aa0c61SJakub Kicinski 	default:
38e0aa0c61SJakub Kicinski 		addr = NULL;
39e0aa0c61SJakub Kicinski 		break;
40e0aa0c61SJakub Kicinski 	}
41e0aa0c61SJakub Kicinski 	if (addr)
42e0aa0c61SJakub Kicinski 		printf("%s", addr);
43e0aa0c61SJakub Kicinski 	else
44e0aa0c61SJakub Kicinski 		printf("[%d]", a->_len.address);
45e0aa0c61SJakub Kicinski 
46e0aa0c61SJakub Kicinski 	printf("\n");
47e0aa0c61SJakub Kicinski }
48e0aa0c61SJakub Kicinski 
49*e7a39b8fSJakub Kicinski FIXTURE(rt_addr)
50*e7a39b8fSJakub Kicinski {
51*e7a39b8fSJakub Kicinski 	struct ynl_sock *ys;
52*e7a39b8fSJakub Kicinski };
53*e7a39b8fSJakub Kicinski 
54*e7a39b8fSJakub Kicinski FIXTURE_SETUP(rt_addr)
55*e7a39b8fSJakub Kicinski {
56*e7a39b8fSJakub Kicinski 	struct ynl_error yerr;
57*e7a39b8fSJakub Kicinski 
58*e7a39b8fSJakub Kicinski 	self->ys = ynl_sock_create(&ynl_rt_addr_family, &yerr);
59*e7a39b8fSJakub Kicinski 	ASSERT_NE(NULL, self->ys)
60*e7a39b8fSJakub Kicinski 		TH_LOG("failed to create rt-addr socket: %s", yerr.msg);
61*e7a39b8fSJakub Kicinski }
62*e7a39b8fSJakub Kicinski 
63*e7a39b8fSJakub Kicinski FIXTURE_TEARDOWN(rt_addr)
64*e7a39b8fSJakub Kicinski {
65*e7a39b8fSJakub Kicinski 	ynl_sock_destroy(self->ys);
66*e7a39b8fSJakub Kicinski }
67*e7a39b8fSJakub Kicinski 
68*e7a39b8fSJakub Kicinski TEST_F(rt_addr, dump)
69e0aa0c61SJakub Kicinski {
70e0aa0c61SJakub Kicinski 	struct rt_addr_getaddr_list *rsp;
71e0aa0c61SJakub Kicinski 	struct rt_addr_getaddr_req *req;
72*e7a39b8fSJakub Kicinski 	struct in6_addr v6_expected;
73*e7a39b8fSJakub Kicinski 	struct in_addr v4_expected;
74*e7a39b8fSJakub Kicinski 	bool found_v4 = false;
75*e7a39b8fSJakub Kicinski 	bool found_v6 = false;
76e0aa0c61SJakub Kicinski 
77*e7a39b8fSJakub Kicinski 	/* The bash wrapper for this test adds these addresses on nsim0,
78*e7a39b8fSJakub Kicinski 	 * make sure we can find them in the dump.
79*e7a39b8fSJakub Kicinski 	 */
80*e7a39b8fSJakub Kicinski 	inet_pton(AF_INET, "192.168.1.1", &v4_expected);
81*e7a39b8fSJakub Kicinski 	inet_pton(AF_INET6, "2001:db8::1", &v6_expected);
82e0aa0c61SJakub Kicinski 
83e0aa0c61SJakub Kicinski 	req = rt_addr_getaddr_req_alloc();
84*e7a39b8fSJakub Kicinski 	ASSERT_NE(NULL, req);
85e0aa0c61SJakub Kicinski 
86*e7a39b8fSJakub Kicinski 	rsp = rt_addr_getaddr_dump(self->ys, req);
87e0aa0c61SJakub Kicinski 	rt_addr_getaddr_req_free(req);
88*e7a39b8fSJakub Kicinski 	ASSERT_NE(NULL, rsp) {
89*e7a39b8fSJakub Kicinski 		TH_LOG("dump failed: %s", self->ys->err.msg);
90*e7a39b8fSJakub Kicinski 	}
91e0aa0c61SJakub Kicinski 
92*e7a39b8fSJakub Kicinski 	ASSERT_FALSE(ynl_dump_empty(rsp)) {
93*e7a39b8fSJakub Kicinski 		rt_addr_getaddr_list_free(rsp);
94*e7a39b8fSJakub Kicinski 		TH_LOG("no addresses reported");
95*e7a39b8fSJakub Kicinski 	}
96*e7a39b8fSJakub Kicinski 
97*e7a39b8fSJakub Kicinski 	ynl_dump_foreach(rsp, addr) {
98*e7a39b8fSJakub Kicinski 		rt_addr_print(_metadata, addr);
99*e7a39b8fSJakub Kicinski 
100*e7a39b8fSJakub Kicinski 		found_v4 |= addr->_len.address == 4 &&
101*e7a39b8fSJakub Kicinski 			    !memcmp(addr->address, &v4_expected, 4);
102*e7a39b8fSJakub Kicinski 		found_v6 |= addr->_len.address == 16 &&
103*e7a39b8fSJakub Kicinski 			    !memcmp(addr->address, &v6_expected, 16);
104*e7a39b8fSJakub Kicinski 	}
105e0aa0c61SJakub Kicinski 	rt_addr_getaddr_list_free(rsp);
106e0aa0c61SJakub Kicinski 
107*e7a39b8fSJakub Kicinski 	EXPECT_TRUE(found_v4);
108*e7a39b8fSJakub Kicinski 	EXPECT_TRUE(found_v6);
109e0aa0c61SJakub Kicinski }
110*e7a39b8fSJakub Kicinski 
111*e7a39b8fSJakub Kicinski TEST_HARNESS_MAIN
112