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