|
3 | 3 |
|
4 | 4 | #include <linux/vm_sockets.h>
|
5 | 5 |
|
| 6 | +/* include/linux/net.h */ |
| 7 | +#define SOCK_TYPE_MASK 0xf |
| 8 | + |
6 | 9 | #define IO_TIMEOUT_SEC 30
|
7 | 10 | #define MAX_STRERR_LEN 256
|
8 | 11 | #define MAX_TEST_NAME 80
|
@@ -312,54 +315,6 @@ static inline int add_to_sockmap(int sock_mapfd, int fd1, int fd2)
|
312 | 315 | return xbpf_map_update_elem(sock_mapfd, &key, &value, BPF_NOEXIST);
|
313 | 316 | }
|
314 | 317 |
|
315 |
| -static inline int create_pair(int s, int family, int sotype, int *c, int *p) |
316 |
| -{ |
317 |
| - struct sockaddr_storage addr; |
318 |
| - socklen_t len; |
319 |
| - int err = 0; |
320 |
| - |
321 |
| - len = sizeof(addr); |
322 |
| - err = xgetsockname(s, sockaddr(&addr), &len); |
323 |
| - if (err) |
324 |
| - return err; |
325 |
| - |
326 |
| - *c = xsocket(family, sotype, 0); |
327 |
| - if (*c < 0) |
328 |
| - return errno; |
329 |
| - err = xconnect(*c, sockaddr(&addr), len); |
330 |
| - if (err) { |
331 |
| - err = errno; |
332 |
| - goto close_cli0; |
333 |
| - } |
334 |
| - |
335 |
| - *p = xaccept_nonblock(s, NULL, NULL); |
336 |
| - if (*p < 0) { |
337 |
| - err = errno; |
338 |
| - goto close_cli0; |
339 |
| - } |
340 |
| - return err; |
341 |
| -close_cli0: |
342 |
| - close(*c); |
343 |
| - return err; |
344 |
| -} |
345 |
| - |
346 |
| -static inline int create_socket_pairs(int s, int family, int sotype, |
347 |
| - int *c0, int *c1, int *p0, int *p1) |
348 |
| -{ |
349 |
| - int err; |
350 |
| - |
351 |
| - err = create_pair(s, family, sotype, c0, p0); |
352 |
| - if (err) |
353 |
| - return err; |
354 |
| - |
355 |
| - err = create_pair(s, family, sotype, c1, p1); |
356 |
| - if (err) { |
357 |
| - close(*c0); |
358 |
| - close(*p0); |
359 |
| - } |
360 |
| - return err; |
361 |
| -} |
362 |
| - |
363 | 318 | static inline int enable_reuseport(int s, int progfd)
|
364 | 319 | {
|
365 | 320 | int err, one = 1;
|
@@ -412,5 +367,92 @@ static inline int socket_loopback(int family, int sotype)
|
412 | 367 | return socket_loopback_reuseport(family, sotype, -1);
|
413 | 368 | }
|
414 | 369 |
|
| 370 | +static inline int create_pair(int family, int sotype, int *p0, int *p1) |
| 371 | +{ |
| 372 | + struct sockaddr_storage addr; |
| 373 | + socklen_t len = sizeof(addr); |
| 374 | + int s, c, p, err; |
| 375 | + |
| 376 | + s = socket_loopback(family, sotype); |
| 377 | + if (s < 0) |
| 378 | + return s; |
| 379 | + |
| 380 | + err = xgetsockname(s, sockaddr(&addr), &len); |
| 381 | + if (err) |
| 382 | + goto close_s; |
| 383 | + |
| 384 | + c = xsocket(family, sotype, 0); |
| 385 | + if (c < 0) { |
| 386 | + err = c; |
| 387 | + goto close_s; |
| 388 | + } |
| 389 | + |
| 390 | + err = connect(c, sockaddr(&addr), len); |
| 391 | + if (err) { |
| 392 | + if (errno != EINPROGRESS) { |
| 393 | + FAIL_ERRNO("connect"); |
| 394 | + goto close_c; |
| 395 | + } |
| 396 | + |
| 397 | + err = poll_connect(c, IO_TIMEOUT_SEC); |
| 398 | + if (err) { |
| 399 | + FAIL_ERRNO("poll_connect"); |
| 400 | + goto close_c; |
| 401 | + } |
| 402 | + } |
| 403 | + |
| 404 | + switch (sotype & SOCK_TYPE_MASK) { |
| 405 | + case SOCK_DGRAM: |
| 406 | + err = xgetsockname(c, sockaddr(&addr), &len); |
| 407 | + if (err) |
| 408 | + goto close_c; |
| 409 | + |
| 410 | + err = xconnect(s, sockaddr(&addr), len); |
| 411 | + if (!err) { |
| 412 | + *p0 = s; |
| 413 | + *p1 = c; |
| 414 | + return err; |
| 415 | + } |
| 416 | + break; |
| 417 | + case SOCK_STREAM: |
| 418 | + case SOCK_SEQPACKET: |
| 419 | + p = xaccept_nonblock(s, NULL, NULL); |
| 420 | + if (p >= 0) { |
| 421 | + *p0 = p; |
| 422 | + *p1 = c; |
| 423 | + goto close_s; |
| 424 | + } |
| 425 | + |
| 426 | + err = p; |
| 427 | + break; |
| 428 | + default: |
| 429 | + FAIL("Unsupported socket type %#x", sotype); |
| 430 | + err = -EOPNOTSUPP; |
| 431 | + } |
| 432 | + |
| 433 | +close_c: |
| 434 | + close(c); |
| 435 | +close_s: |
| 436 | + close(s); |
| 437 | + return err; |
| 438 | +} |
| 439 | + |
| 440 | +static inline int create_socket_pairs(int s, int family, int sotype, |
| 441 | + int *c0, int *c1, int *p0, int *p1) |
| 442 | +{ |
| 443 | + int err; |
| 444 | + |
| 445 | + err = create_pair(family, sotype, c0, p0); |
| 446 | + if (err) |
| 447 | + return err; |
| 448 | + |
| 449 | + err = create_pair(family, sotype, c1, p1); |
| 450 | + if (err) { |
| 451 | + close(*c0); |
| 452 | + close(*p0); |
| 453 | + } |
| 454 | + |
| 455 | + return err; |
| 456 | +} |
415 | 457 |
|
416 | 458 | #endif // __SOCKMAP_HELPERS__
|
0 commit comments