| // SPDX-License-Identifier: GPL-2.0 |
| #include <stdio.h> |
| #include <string.h> |
| |
| #include <ynl.h> |
| |
| #include <arpa/inet.h> |
| #include <net/if.h> |
| |
| #include <kselftest_harness.h> |
| |
| #include "rt-addr-user.h" |
| |
| static void rt_addr_print(struct __test_metadata *_metadata, |
| struct rt_addr_getaddr_rsp *a) |
| { |
| char ifname[IF_NAMESIZE]; |
| char addr_str[64]; |
| const char *addr; |
| const char *name; |
| |
| name = if_indextoname(a->_hdr.ifa_index, ifname); |
| EXPECT_NE(NULL, name); |
| if (name) |
| ksft_print_msg("%16s: ", name); |
| |
| EXPECT_TRUE(a->_len.address == 4 || a->_len.address == 16); |
| switch (a->_len.address) { |
| case 4: |
| addr = inet_ntop(AF_INET, a->address, |
| addr_str, sizeof(addr_str)); |
| break; |
| case 16: |
| addr = inet_ntop(AF_INET6, a->address, |
| addr_str, sizeof(addr_str)); |
| break; |
| default: |
| addr = NULL; |
| break; |
| } |
| if (addr) |
| printf("%s", addr); |
| else |
| printf("[%d]", a->_len.address); |
| |
| printf("\n"); |
| } |
| |
| FIXTURE(rt_addr) |
| { |
| struct ynl_sock *ys; |
| }; |
| |
| FIXTURE_SETUP(rt_addr) |
| { |
| struct ynl_error yerr; |
| |
| self->ys = ynl_sock_create(&ynl_rt_addr_family, &yerr); |
| ASSERT_NE(NULL, self->ys) |
| TH_LOG("failed to create rt-addr socket: %s", yerr.msg); |
| } |
| |
| FIXTURE_TEARDOWN(rt_addr) |
| { |
| ynl_sock_destroy(self->ys); |
| } |
| |
| TEST_F(rt_addr, dump) |
| { |
| struct rt_addr_getaddr_list *rsp; |
| struct rt_addr_getaddr_req *req; |
| struct in6_addr v6_expected; |
| struct in_addr v4_expected; |
| bool found_v4 = false; |
| bool found_v6 = false; |
| |
| /* The bash wrapper for this test adds these addresses on nsim0, |
| * make sure we can find them in the dump. |
| */ |
| inet_pton(AF_INET, "192.168.1.1", &v4_expected); |
| inet_pton(AF_INET6, "2001:db8::1", &v6_expected); |
| |
| req = rt_addr_getaddr_req_alloc(); |
| ASSERT_NE(NULL, req); |
| |
| rsp = rt_addr_getaddr_dump(self->ys, req); |
| rt_addr_getaddr_req_free(req); |
| ASSERT_NE(NULL, rsp) { |
| TH_LOG("dump failed: %s", self->ys->err.msg); |
| } |
| |
| ASSERT_FALSE(ynl_dump_empty(rsp)) { |
| rt_addr_getaddr_list_free(rsp); |
| TH_LOG("no addresses reported"); |
| } |
| |
| ynl_dump_foreach(rsp, addr) { |
| rt_addr_print(_metadata, addr); |
| |
| found_v4 |= addr->_len.address == 4 && |
| !memcmp(addr->address, &v4_expected, 4); |
| found_v6 |= addr->_len.address == 16 && |
| !memcmp(addr->address, &v6_expected, 16); |
| } |
| rt_addr_getaddr_list_free(rsp); |
| |
| EXPECT_TRUE(found_v4); |
| EXPECT_TRUE(found_v6); |
| } |
| |
| TEST_HARNESS_MAIN |