1 /*
2 * IFLA_INET6_* protocol-specific netlink attribute decoding check common code.
3 *
4 * Copyright (c) 2018-2022 The strace developers.
5 * All rights reserved.
6 *
7 * SPDX-License-Identifier: GPL-2.0-or-later
8 */
9
10 #ifndef STRACE_TESTS_NLATTR_IFLA_AF_INET6
11 # define STRACE_TESTS_NLATTR_IFLA_AF_INET6
12
13 # include "tests.h"
14
15 static void
16 print_arr_val(uint32_t *val, size_t idx, const char *idx_str)
17 {
18 if (idx_str)
19 printf("[%s]=", idx_str);
20 else
21 printf("[%zu]=", idx);
22
23 printf("%d", *val);
24 }
25
26 static void
27 print_arr_uval(uint64_t *val, size_t idx, const char *idx_str)
28 {
29 if (idx_str)
30 printf("[%s]=", idx_str);
31 else
32 printf("[%zu]=", idx);
33
34 printf("%" PRIu64, *val);
35 }
36
37 static void
38 print_inet6_conf_val(uint32_t *val, size_t idx)
39 {
40 static const char * const strs[] = {
41 XLAT_KNOWN(0, "DEVCONF_FORWARDING"),
42 XLAT_KNOWN(1, "DEVCONF_HOPLIMIT"),
43 };
44
45 print_arr_val(val, idx, idx < ARRAY_SIZE(strs) ? strs[idx] : NULL);
46 }
47
48 static void
49 print_inet6_stats_val(uint64_t *val, size_t idx)
50 {
51 static const char * const strs[] = {
52 XLAT_KNOWN(0, "IPSTATS_MIB_NUM"),
53 XLAT_KNOWN(1, "IPSTATS_MIB_INPKTS"),
54 };
55
56 print_arr_uval(val, idx, idx < ARRAY_SIZE(strs) ? strs[idx] : NULL);
57 }
58
59 static void
60 print_icmp6_stats_val(uint64_t *val, size_t idx)
61 {
62 static const char * const strs[] = {
63 XLAT_KNOWN(0, "ICMP6_MIB_NUM"),
64 XLAT_KNOWN(1, "ICMP6_MIB_INMSGS"),
65 XLAT_KNOWN(2, "ICMP6_MIB_INERRORS"),
66 XLAT_KNOWN(3, "ICMP6_MIB_OUTMSGS"),
67 XLAT_KNOWN(4, "ICMP6_MIB_OUTERRORS"),
68 XLAT_KNOWN(5, "ICMP6_MIB_CSUMERRORS"),
69 XLAT_UNKNOWN(6, "ICMP6_MIB_???"),
70 };
71
72 print_arr_uval(val, idx, idx < ARRAY_SIZE(strs) ? strs[idx] : NULL);
73 }
74
75 static void
76 check_ifla_af_inet6(int fd, void *nlh0, size_t hdrlen,
77 void (*init_msg)(struct nlmsghdr *, unsigned int),
78 void (*print_msg)(unsigned int),
79 void *pattern, size_t depth)
80 {
81 static const uint8_t unknown_msg[] = { 0xab, 0xac, 0xdb, 0xcd };
82
83 /* Undecoded, unknown */
84 TEST_NESTED_NLATTR_OBJECT_EX_(fd, nlh0, hdrlen, init_msg, print_msg,
85 0, XLAT_KNOWN(0, "IFLA_INET6_UNSPEC"),
86 pattern, unknown_msg, print_quoted_hex,
87 depth,
88 printf("\"\\xab\\xac\\xdb\\xcd\""));
89 TEST_NESTED_NLATTR_OBJECT_EX_(fd, nlh0, hdrlen, init_msg, print_msg,
90 10, "0xa" NRAW(" /* IFLA_INET6_??? */"),
91 pattern, unknown_msg, print_quoted_hex,
92 depth,
93 printf("\"\\xab\\xac\\xdb\\xcd\""));
94
95
96 /* IFLA_INET6_FLAGS */
97 static const struct {
98 uint32_t flags;
99 const char *str;
100 } inet6_flags[] = {
101 { 0xf, "0xf" NRAW(" /* IF_??? */") },
102 { ARG_XLAT_KNOWN(0x10, "IF_RS_SENT") },
103 { ARG_XLAT_KNOWN(0xc0, "IF_RA_MANAGED|IF_RA_OTHERCONF") },
104 { ARG_XLAT_KNOWN(0xdeadc0de, "IF_RS_SENT|IF_RA_MANAGED"
105 "|IF_RA_OTHERCONF|IF_READY"
106 "|0x5eadc00e") },
107 };
108
109 for (size_t i = 0; i < ARRAY_SIZE(inet6_flags); i++) {
110 TEST_NESTED_NLATTR_OBJECT_EX_(fd, nlh0, hdrlen,
111 init_msg, print_msg,
112 1, XLAT_KNOWN(0x1,
113 "IFLA_INET6_FLAGS"),
114 pattern, inet6_flags[i].flags,
115 print_quoted_hex, depth,
116 printf("%s", inet6_flags[i].str));
117 }
118
119
120 /* IFLA_INET6_CONF */
121 uint32_t inet6_conf_vals[] = { 0xdeadc0de, 0xda7aface };
122 TEST_NESTED_NLATTR_ARRAY_EX_(fd, nlh0, hdrlen, init_msg, print_msg,
123 IFLA_INET6_CONF,
124 XLAT_KNOWN(0x2, "IFLA_INET6_CONF"),
125 pattern, inet6_conf_vals, depth,
126 print_inet6_conf_val);
127
128
129 /* IFLA_INET6_STATS */
130 uint64_t inet6_stats_vals[] = { 0xdeadc0deda7aface, 0xdec0deedbadc0ded };
131 TEST_NESTED_NLATTR_ARRAY_EX_(fd, nlh0, hdrlen, init_msg, print_msg,
132 IFLA_INET6_STATS,
133 XLAT_KNOWN(0x3, "IFLA_INET6_STATS"),
134 pattern, inet6_stats_vals, depth,
135 print_inet6_stats_val);
136
137
138 /* IFLA_INET6_MCAST */
139 TEST_NESTED_NLATTR_OBJECT_EX_(fd, nlh0, hdrlen, init_msg, print_msg,
140 4, XLAT_KNOWN(0x4, "IFLA_INET6_MCAST"),
141 pattern, unknown_msg, print_quoted_hex,
142 depth,
143 printf("\"\\xab\\xac\\xdb\\xcd\""));
144
145
146 /* IFLA_INET6_CACHEINFO */
147 static const struct ifla_cacheinfo ci = {
148 0xbadc0ded, 0xfacebeef, 0xdecafeed, 0xdeadfeed,
149 };
150 TEST_NESTED_NLATTR_OBJECT_EX_(fd, nlh0, hdrlen, init_msg, print_msg, 5,
151 XLAT_KNOWN(0x5, "IFLA_INET6_CACHEINFO"),
152 pattern, ci, print_quoted_hex, depth,
153 printf("{");
154 PRINT_FIELD_U(ci, max_reasm_len);
155 printf(", ");
156 PRINT_FIELD_U(ci, tstamp);
157 printf(", ");
158 PRINT_FIELD_U(ci, reachable_time);
159 printf(", ");
160 PRINT_FIELD_U(ci, retrans_time);
161 printf("}"));
162
163
164 /* IFLA_INET6_ICMP6STATS */
165 uint64_t icmp6_stats_vals[] = {
166 0xdeadc0deda7aface, 0xdec0deedbadc0ded, 0xfacebeefdeadfeed,
167 0xdeadc0deda7afacd, 0xdec0deedbadc0dee, 0xfacebeefdeadfeef,
168 0xdeadc0deda7afacc
169 };
170 TEST_NESTED_NLATTR_ARRAY_EX_(fd, nlh0, hdrlen, init_msg, print_msg,
171 IFLA_INET6_ICMP6STATS,
172 XLAT_KNOWN(0x6, "IFLA_INET6_ICMP6STATS"),
173 pattern, icmp6_stats_vals, depth,
174 print_icmp6_stats_val);
175
176
177 /* IFLA_INET6_TOKEN */
178 uint8_t inet6_addr[16] = {
179 0xba, 0xdc, 0x0d, 0xed, 0xfa, 0xce, 0xbe, 0xef,
180 0xde, 0xca, 0xfe, 0xed, 0xde, 0xad, 0xfe, 0xed,
181 };
182 TEST_NESTED_NLATTR_OBJECT_EX_(fd, nlh0, hdrlen, init_msg, print_msg,
183 7, XLAT_KNOWN(0x7, "IFLA_INET6_TOKEN"),
184 pattern, inet6_addr, print_quoted_hex,
185 depth,
186 printf(XLAT_KNOWN_FMT("%s", "%s"),
187 XLAT_SEL("\"\\xba\\xdc\\x0d\\xed"
188 "\\xfa\\xce\\xbe\\xef"
189 "\\xde\\xca\\xfe\\xed"
190 "\\xde\\xad\\xfe\\xed\"",
191 "inet_pton(AF_INET6"
192 ", \"badc:ded:face:beef"
193 ":deca:feed:dead:feed\")")));
194
195
196 /* IFLA_INET6_ADDR_GEN_MODE */
197 static const struct {
198 uint8_t flags;
199 const char *str;
200 } agms[] = {
201 { ARG_XLAT_KNOWN(0, "IN6_ADDR_GEN_MODE_EUI64") },
202 { ARG_XLAT_KNOWN(0x3, "IN6_ADDR_GEN_MODE_RANDOM") },
203 { ARG_XLAT_UNKNOWN(0x4, "IN6_ADDR_GEN_MODE_???") },
204 { ARG_XLAT_UNKNOWN(0xff, "IN6_ADDR_GEN_MODE_???") },
205 };
206
207 for (size_t i = 0; i < ARRAY_SIZE(agms); i++) {
208 TEST_NESTED_NLATTR_OBJECT_EX_(fd, nlh0, hdrlen,
209 init_msg, print_msg, 8,
210 XLAT_KNOWN(0x8, "IFLA_INET6_ADDR_GEN_MODE"),
211 pattern, agms[i].flags,
212 print_quoted_hex, depth,
213 printf("%s", agms[i].str));
214 }
215
216
217 /* IFLA_INET6_RA_MTU */
218 static const uint32_t ra_mtu = 0xdeadc0de;
219 TEST_NESTED_NLATTR_OBJECT_EX_(fd, nlh0, hdrlen, init_msg, print_msg,
220 9, XLAT_KNOWN(0x9, "IFLA_INET6_RA_MTU"),
221 pattern, ra_mtu, print_quoted_hex, depth,
222 printf("3735929054"));
223 }
224
225 #endif /* STRACE_TESTS_NLATTR_IFLA_AF_INET6 */