Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'selftests-bpf-networking-test-cleanups'

Hoyeon Lee says:

====================
selftests/bpf: networking test cleanups

This series finishes the sockaddr_storage migration in the networking
selftests by removing the remaining open-coded IPv4/IPv6 wrappers
(addr_port/tuple in cls_redirect, sa46 in select_reuseport). The tests
now use sockaddr_storage directly. No other custom socket-address
wrappers remain after this series, so the churn stops here and behavior
is unchanged.
====================

Link: https://patch.msgid.link/20251121081332.2309838-1-hoyeon.lee@suse.com
Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>

+79 -114
+43 -79
tools/testing/selftests/bpf/prog_tests/cls_redirect.c
··· 22 22 23 23 static int duration = 0; 24 24 25 - struct addr_port { 26 - in_port_t port; 27 - union { 28 - struct in_addr in_addr; 29 - struct in6_addr in6_addr; 30 - }; 31 - }; 32 25 33 - struct tuple { 34 - int family; 35 - struct addr_port src; 36 - struct addr_port dst; 37 - }; 38 - 39 - static bool fill_addr_port(const struct sockaddr *sa, struct addr_port *ap) 40 - { 41 - const struct sockaddr_in6 *in6; 42 - const struct sockaddr_in *in; 43 - 44 - switch (sa->sa_family) { 45 - case AF_INET: 46 - in = (const struct sockaddr_in *)sa; 47 - ap->in_addr = in->sin_addr; 48 - ap->port = in->sin_port; 49 - return true; 50 - 51 - case AF_INET6: 52 - in6 = (const struct sockaddr_in6 *)sa; 53 - ap->in6_addr = in6->sin6_addr; 54 - ap->port = in6->sin6_port; 55 - return true; 56 - 57 - default: 58 - return false; 59 - } 60 - } 61 - 62 - static bool set_up_conn(const struct sockaddr *addr, socklen_t len, int type, 63 - int *server, int *conn, struct tuple *tuple) 26 + static bool set_up_conn(const struct sockaddr_storage *addr, socklen_t len, int type, 27 + int *server, int *conn, 28 + struct sockaddr_storage *src, 29 + struct sockaddr_storage *dst) 64 30 { 65 31 struct sockaddr_storage ss; 66 32 socklen_t slen = sizeof(ss); 67 - struct sockaddr *sa = (struct sockaddr *)&ss; 68 33 69 - *server = start_server_addr(type, (struct sockaddr_storage *)addr, len, NULL); 34 + *server = start_server_addr(type, addr, len, NULL); 70 35 if (*server < 0) 71 36 return false; 72 37 73 - if (CHECK_FAIL(getsockname(*server, sa, &slen))) 38 + if (CHECK_FAIL(getsockname(*server, (struct sockaddr *)&ss, &slen))) 74 39 goto close_server; 75 40 76 - *conn = connect_to_addr(type, (struct sockaddr_storage *)sa, slen, NULL); 41 + *conn = connect_to_addr(type, &ss, slen, NULL); 77 42 if (*conn < 0) 78 43 goto close_server; 79 44 80 45 /* We want to simulate packets arriving at conn, so we have to 81 46 * swap src and dst. 82 47 */ 83 - slen = sizeof(ss); 84 - if (CHECK_FAIL(getsockname(*conn, sa, &slen))) 48 + slen = sizeof(*dst); 49 + if (CHECK_FAIL(getsockname(*conn, (struct sockaddr *)dst, &slen))) 85 50 goto close_conn; 86 51 87 - if (CHECK_FAIL(!fill_addr_port(sa, &tuple->dst))) 52 + slen = sizeof(*src); 53 + if (CHECK_FAIL(getpeername(*conn, (struct sockaddr *)src, &slen))) 88 54 goto close_conn; 89 55 90 - slen = sizeof(ss); 91 - if (CHECK_FAIL(getpeername(*conn, sa, &slen))) 92 - goto close_conn; 93 - 94 - if (CHECK_FAIL(!fill_addr_port(sa, &tuple->src))) 95 - goto close_conn; 96 - 97 - tuple->family = ss.ss_family; 98 56 return true; 99 57 100 58 close_conn: ··· 68 110 { 69 111 struct sockaddr_in *addr4; 70 112 struct sockaddr_in6 *addr6; 113 + memset(addr, 0, sizeof(*addr)); 71 114 72 115 switch (family) { 73 116 case AF_INET: 74 117 addr4 = (struct sockaddr_in *)addr; 75 - memset(addr4, 0, sizeof(*addr4)); 76 118 addr4->sin_family = family; 77 119 addr4->sin_addr.s_addr = htonl(INADDR_LOOPBACK); 78 120 return sizeof(*addr4); 79 121 case AF_INET6: 80 122 addr6 = (struct sockaddr_in6 *)addr; 81 - memset(addr6, 0, sizeof(*addr6)); 82 123 addr6->sin6_family = family; 83 124 addr6->sin6_addr = in6addr_loopback; 84 125 return sizeof(*addr6); ··· 199 242 } 200 243 201 244 static size_t build_input(const struct test_cfg *test, void *const buf, 202 - const struct tuple *tuple) 245 + const struct sockaddr_storage *src, 246 + const struct sockaddr_storage *dst) 203 247 { 204 - in_port_t sport = tuple->src.port; 248 + struct sockaddr_in6 *src_in6 = (struct sockaddr_in6 *)src; 249 + struct sockaddr_in6 *dst_in6 = (struct sockaddr_in6 *)dst; 250 + struct sockaddr_in *src_in = (struct sockaddr_in *)src; 251 + struct sockaddr_in *dst_in = (struct sockaddr_in *)dst; 252 + sa_family_t family = src->ss_family; 253 + in_port_t sport, dport; 205 254 encap_headers_t encap; 206 255 struct iphdr ip; 207 256 struct ipv6hdr ipv6; ··· 217 254 uint8_t *p = buf; 218 255 int proto; 219 256 257 + sport = (family == AF_INET) ? src_in->sin_port : src_in6->sin6_port; 258 + dport = (family == AF_INET) ? dst_in->sin_port : dst_in6->sin6_port; 259 + 220 260 proto = IPPROTO_IPIP; 221 - if (tuple->family == AF_INET6) 261 + if (family == AF_INET6) 222 262 proto = IPPROTO_IPV6; 223 263 224 264 encap_init(&encap, test->hops == ONE_HOP ? 1 : 0, proto); ··· 236 270 if (test->type == UDP) 237 271 proto = IPPROTO_UDP; 238 272 239 - switch (tuple->family) { 273 + switch (family) { 240 274 case AF_INET: 241 275 ip = (struct iphdr){ 242 276 .ihl = 5, 243 277 .version = 4, 244 278 .ttl = IPDEFTTL, 245 279 .protocol = proto, 246 - .saddr = tuple->src.in_addr.s_addr, 247 - .daddr = tuple->dst.in_addr.s_addr, 280 + .saddr = src_in->sin_addr.s_addr, 281 + .daddr = dst_in->sin_addr.s_addr, 248 282 }; 249 283 p = mempcpy(p, &ip, sizeof(ip)); 250 284 break; ··· 253 287 .version = 6, 254 288 .hop_limit = IPDEFTTL, 255 289 .nexthdr = proto, 256 - .saddr = tuple->src.in6_addr, 257 - .daddr = tuple->dst.in6_addr, 290 + .saddr = src_in6->sin6_addr, 291 + .daddr = dst_in6->sin6_addr, 258 292 }; 259 293 p = mempcpy(p, &ipv6, sizeof(ipv6)); 260 294 break; ··· 269 303 case TCP: 270 304 tcp = (struct tcphdr){ 271 305 .source = sport, 272 - .dest = tuple->dst.port, 306 + .dest = dport, 307 + .syn = (test->flags == SYN), 308 + .ack = (test->flags == ACK), 273 309 }; 274 - if (test->flags == SYN) 275 - tcp.syn = true; 276 - if (test->flags == ACK) 277 - tcp.ack = true; 278 310 p = mempcpy(p, &tcp, sizeof(tcp)); 279 311 break; 280 312 case UDP: 281 313 udp = (struct udphdr){ 282 314 .source = sport, 283 - .dest = tuple->dst.port, 315 + .dest = dport, 284 316 }; 285 317 p = mempcpy(p, &udp, sizeof(udp)); 286 318 break; ··· 303 339 LIBBPF_OPTS(bpf_test_run_opts, tattr); 304 340 int families[] = { AF_INET, AF_INET6 }; 305 341 struct sockaddr_storage ss; 306 - struct sockaddr *addr; 307 342 socklen_t slen; 308 343 int i, j, err, prog_fd; 309 344 int servers[__NR_KIND][ARRAY_SIZE(families)] = {}; 310 345 int conns[__NR_KIND][ARRAY_SIZE(families)] = {}; 311 - struct tuple tuples[__NR_KIND][ARRAY_SIZE(families)]; 346 + struct sockaddr_storage srcs[__NR_KIND][ARRAY_SIZE(families)]; 347 + struct sockaddr_storage dsts[__NR_KIND][ARRAY_SIZE(families)]; 312 348 313 - addr = (struct sockaddr *)&ss; 314 349 for (i = 0; i < ARRAY_SIZE(families); i++) { 315 350 slen = prepare_addr(&ss, families[i]); 316 351 if (CHECK_FAIL(!slen)) 317 352 goto cleanup; 318 353 319 - if (CHECK_FAIL(!set_up_conn(addr, slen, SOCK_DGRAM, 354 + if (CHECK_FAIL(!set_up_conn(&ss, slen, SOCK_DGRAM, 320 355 &servers[UDP][i], &conns[UDP][i], 321 - &tuples[UDP][i]))) 356 + &srcs[UDP][i], &dsts[UDP][i]))) 322 357 goto cleanup; 323 358 324 - if (CHECK_FAIL(!set_up_conn(addr, slen, SOCK_STREAM, 359 + if (CHECK_FAIL(!set_up_conn(&ss, slen, SOCK_STREAM, 325 360 &servers[TCP][i], &conns[TCP][i], 326 - &tuples[TCP][i]))) 361 + &srcs[TCP][i], &dsts[TCP][i]))) 327 362 goto cleanup; 328 363 } 329 364 ··· 331 368 struct test_cfg *test = &tests[i]; 332 369 333 370 for (j = 0; j < ARRAY_SIZE(families); j++) { 334 - struct tuple *tuple = &tuples[test->type][j]; 371 + struct sockaddr_storage *src = &srcs[test->type][j]; 372 + struct sockaddr_storage *dst = &dsts[test->type][j]; 335 373 char input[256]; 336 374 char tmp[256]; 337 375 338 - test_str(tmp, sizeof(tmp), test, tuple->family); 376 + test_str(tmp, sizeof(tmp), test, families[j]); 339 377 if (!test__start_subtest(tmp)) 340 378 continue; 341 379 ··· 344 380 tattr.data_size_out = sizeof(tmp); 345 381 346 382 tattr.data_in = input; 347 - tattr.data_size_in = build_input(test, input, tuple); 383 + tattr.data_size_in = build_input(test, input, src, dst); 348 384 if (CHECK_FAIL(!tattr.data_size_in)) 349 385 continue; 350 386
+36 -35
tools/testing/selftests/bpf/prog_tests/select_reuseport.c
··· 41 41 static __u32 index_zero; 42 42 static int epfd; 43 43 44 - static union sa46 { 45 - struct sockaddr_in6 v6; 46 - struct sockaddr_in v4; 47 - sa_family_t family; 48 - } srv_sa; 44 + static struct sockaddr_storage srv_sa; 49 45 50 46 #define RET_IF(condition, tag, format...) ({ \ 51 47 if (CHECK_FAIL(condition)) { \ ··· 131 135 return 0; 132 136 } 133 137 134 - static void sa46_init_loopback(union sa46 *sa, sa_family_t family) 138 + static void ss_init_loopback(struct sockaddr_storage *sa, sa_family_t family) 135 139 { 136 140 memset(sa, 0, sizeof(*sa)); 137 - sa->family = family; 138 - if (sa->family == AF_INET6) 139 - sa->v6.sin6_addr = in6addr_loopback; 141 + sa->ss_family = family; 142 + if (sa->ss_family == AF_INET6) 143 + ((struct sockaddr_in6 *)sa)->sin6_addr = in6addr_loopback; 140 144 else 141 - sa->v4.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 145 + ((struct sockaddr_in *)sa)->sin_addr.s_addr = htonl(INADDR_LOOPBACK); 142 146 } 143 147 144 - static void sa46_init_inany(union sa46 *sa, sa_family_t family) 148 + static void ss_init_inany(struct sockaddr_storage *sa, sa_family_t family) 145 149 { 146 150 memset(sa, 0, sizeof(*sa)); 147 - sa->family = family; 148 - if (sa->family == AF_INET6) 149 - sa->v6.sin6_addr = in6addr_any; 151 + sa->ss_family = family; 152 + if (sa->ss_family == AF_INET6) 153 + ((struct sockaddr_in6 *)sa)->sin6_addr = in6addr_any; 150 154 else 151 - sa->v4.sin_addr.s_addr = INADDR_ANY; 155 + ((struct sockaddr_in *)sa)->sin_addr.s_addr = INADDR_ANY; 152 156 } 153 157 154 158 static int read_int_sysctl(const char *sysctl) ··· 224 228 int cli_fd) 225 229 { 226 230 struct data_check expected = {}, result; 227 - union sa46 cli_sa; 231 + struct sockaddr_storage cli_sa; 228 232 socklen_t addrlen; 229 233 int err; 230 234 ··· 247 251 } 248 252 249 253 if (family == AF_INET6) { 250 - expected.eth_protocol = htons(ETH_P_IPV6); 251 - expected.bind_inany = !srv_sa.v6.sin6_addr.s6_addr32[3] && 252 - !srv_sa.v6.sin6_addr.s6_addr32[2] && 253 - !srv_sa.v6.sin6_addr.s6_addr32[1] && 254 - !srv_sa.v6.sin6_addr.s6_addr32[0]; 254 + struct sockaddr_in6 *srv_v6 = (struct sockaddr_in6 *)&srv_sa; 255 + struct sockaddr_in6 *cli_v6 = (struct sockaddr_in6 *)&cli_sa; 255 256 256 - memcpy(&expected.skb_addrs[0], cli_sa.v6.sin6_addr.s6_addr32, 257 - sizeof(cli_sa.v6.sin6_addr)); 257 + expected.eth_protocol = htons(ETH_P_IPV6); 258 + expected.bind_inany = !srv_v6->sin6_addr.s6_addr32[3] && 259 + !srv_v6->sin6_addr.s6_addr32[2] && 260 + !srv_v6->sin6_addr.s6_addr32[1] && 261 + !srv_v6->sin6_addr.s6_addr32[0]; 262 + 263 + memcpy(&expected.skb_addrs[0], cli_v6->sin6_addr.s6_addr32, 264 + sizeof(cli_v6->sin6_addr)); 258 265 memcpy(&expected.skb_addrs[4], &in6addr_loopback, 259 266 sizeof(in6addr_loopback)); 260 - expected.skb_ports[0] = cli_sa.v6.sin6_port; 261 - expected.skb_ports[1] = srv_sa.v6.sin6_port; 267 + expected.skb_ports[0] = cli_v6->sin6_port; 268 + expected.skb_ports[1] = srv_v6->sin6_port; 262 269 } else { 263 - expected.eth_protocol = htons(ETH_P_IP); 264 - expected.bind_inany = !srv_sa.v4.sin_addr.s_addr; 270 + struct sockaddr_in *srv_v4 = (struct sockaddr_in *)&srv_sa; 271 + struct sockaddr_in *cli_v4 = (struct sockaddr_in *)&cli_sa; 265 272 266 - expected.skb_addrs[0] = cli_sa.v4.sin_addr.s_addr; 273 + expected.eth_protocol = htons(ETH_P_IP); 274 + expected.bind_inany = !srv_v4->sin_addr.s_addr; 275 + 276 + expected.skb_addrs[0] = cli_v4->sin_addr.s_addr; 267 277 expected.skb_addrs[1] = htonl(INADDR_LOOPBACK); 268 - expected.skb_ports[0] = cli_sa.v4.sin_port; 269 - expected.skb_ports[1] = srv_sa.v4.sin_port; 278 + expected.skb_ports[0] = cli_v4->sin_port; 279 + expected.skb_ports[1] = srv_v4->sin_port; 270 280 } 271 281 272 282 if (memcmp(&result, &expected, offsetof(struct data_check, ··· 366 364 static int send_data(int type, sa_family_t family, void *data, size_t len, 367 365 enum result expected) 368 366 { 369 - union sa46 cli_sa; 367 + struct sockaddr_storage cli_sa; 370 368 int fd, err; 371 369 372 370 fd = socket(family, type, 0); 373 371 RET_ERR(fd == -1, "socket()", "fd:%d errno:%d\n", fd, errno); 374 372 375 - sa46_init_loopback(&cli_sa, family); 373 + ss_init_loopback(&cli_sa, family); 376 374 err = bind(fd, (struct sockaddr *)&cli_sa, sizeof(cli_sa)); 377 375 RET_ERR(fd == -1, "bind(cli_sa)", "err:%d errno:%d\n", err, errno); 378 - 379 376 err = sendto(fd, data, len, MSG_FASTOPEN, (struct sockaddr *)&srv_sa, 380 377 sizeof(srv_sa)); 381 378 RET_ERR(err != len && expected >= PASS, ··· 590 589 socklen_t addrlen; 591 590 592 591 if (inany) 593 - sa46_init_inany(&srv_sa, family); 592 + ss_init_inany(&srv_sa, family); 594 593 else 595 - sa46_init_loopback(&srv_sa, family); 594 + ss_init_loopback(&srv_sa, family); 596 595 addrlen = sizeof(srv_sa); 597 596 598 597 /*