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