1 /*
2 * Copyright (c) 2017 JingPiao Chen <chenjingpiao@gmail.com>
3 * Copyright (c) 2017-2021 The strace developers.
4 * All rights reserved.
5 *
6 * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8
9 #include "tests.h"
10
11 #include <stdio.h>
12 #include "test_nlattr.h"
13 #include <linux/if.h>
14 #include <linux/if_arp.h>
15 #include <linux/if_link.h>
16 #include <linux/rtnetlink.h>
17
18 #define IFLA_ATTR IFLA_PORT_SELF
19 #include "nlattr_ifla.h"
20
21 int
22 main(void)
23 {
24 skip_if_unavailable("/proc/self/fd/");
25
26 const int fd = create_nl_socket(NETLINK_ROUTE);
27 void *nlh0 = midtail_alloc(NLMSG_SPACE(hdrlen), 2 * NLA_HDRLEN + 8);
28
29 static char pattern[4096];
30 fill_memory_ex(pattern, sizeof(pattern), 'a', 'z' - 'a' + 1);
31
32 const uint32_t num = 0xabacdbcd;
33 TEST_NESTED_NLATTR_OBJECT(fd, nlh0, hdrlen,
34 init_ifinfomsg, print_ifinfomsg,
35 IFLA_PORT_VF, pattern, num,
36 printf("%u", num));
37
38 static const struct ifla_port_vsi vsi = {
39 .vsi_mgr_id = 0xab,
40 .vsi_type_id = "abc",
41 .vsi_type_version = 0xef
42 };
43 TEST_NESTED_NLATTR_OBJECT(fd, nlh0, hdrlen,
44 init_ifinfomsg, print_ifinfomsg,
45 IFLA_PORT_VSI_TYPE, pattern, vsi,
46 printf("{");
47 PRINT_FIELD_U(vsi, vsi_mgr_id);
48 printf(", vsi_type_id=\"\\x61\\x62\\x63\"");
49 printf(", ");
50 PRINT_FIELD_U(vsi, vsi_type_version);
51 printf("}"));
52
53 static const struct ifla_port_vsi vsi2 = {
54 .vsi_mgr_id = 0xab,
55 .vsi_type_id = { 10, 0, 255 },
56 .vsi_type_version = 0xef,
57 .pad = { 0, 1, 2 },
58 };
59 TEST_NESTED_NLATTR_OBJECT(fd, nlh0, hdrlen,
60 init_ifinfomsg, print_ifinfomsg,
61 IFLA_PORT_VSI_TYPE, pattern, vsi2,
62 printf("{");
63 PRINT_FIELD_U(vsi2, vsi_mgr_id);
64 printf(", vsi_type_id=\"\\x0a\\x00\\xff\"");
65 printf(", ");
66 PRINT_FIELD_U(vsi2, vsi_type_version);
67 printf(", pad=\"\\x00\\x01\\x02\"");
68 printf("}"));
69
70 puts("+++ exited with 0 +++");
71 return 0;
72 }