bind_timewait.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Copyright Amazon.com Inc. or its affiliates. */
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include "../kselftest_harness.h"
  6. FIXTURE(bind_timewait)
  7. {
  8. struct sockaddr_in addr;
  9. socklen_t addrlen;
  10. };
  11. FIXTURE_VARIANT(bind_timewait)
  12. {
  13. __u32 addr_const;
  14. };
  15. FIXTURE_VARIANT_ADD(bind_timewait, localhost)
  16. {
  17. .addr_const = INADDR_LOOPBACK
  18. };
  19. FIXTURE_VARIANT_ADD(bind_timewait, addrany)
  20. {
  21. .addr_const = INADDR_ANY
  22. };
  23. FIXTURE_SETUP(bind_timewait)
  24. {
  25. self->addr.sin_family = AF_INET;
  26. self->addr.sin_port = 0;
  27. self->addr.sin_addr.s_addr = htonl(variant->addr_const);
  28. self->addrlen = sizeof(self->addr);
  29. }
  30. FIXTURE_TEARDOWN(bind_timewait)
  31. {
  32. }
  33. void create_timewait_socket(struct __test_metadata *_metadata,
  34. FIXTURE_DATA(bind_timewait) *self)
  35. {
  36. int server_fd, client_fd, child_fd, ret;
  37. struct sockaddr_in addr;
  38. socklen_t addrlen;
  39. server_fd = socket(AF_INET, SOCK_STREAM, 0);
  40. ASSERT_GT(server_fd, 0);
  41. ret = bind(server_fd, (struct sockaddr *)&self->addr, self->addrlen);
  42. ASSERT_EQ(ret, 0);
  43. ret = listen(server_fd, 1);
  44. ASSERT_EQ(ret, 0);
  45. ret = getsockname(server_fd, (struct sockaddr *)&self->addr, &self->addrlen);
  46. ASSERT_EQ(ret, 0);
  47. client_fd = socket(AF_INET, SOCK_STREAM, 0);
  48. ASSERT_GT(client_fd, 0);
  49. ret = connect(client_fd, (struct sockaddr *)&self->addr, self->addrlen);
  50. ASSERT_EQ(ret, 0);
  51. addrlen = sizeof(addr);
  52. child_fd = accept(server_fd, (struct sockaddr *)&addr, &addrlen);
  53. ASSERT_GT(child_fd, 0);
  54. close(child_fd);
  55. close(client_fd);
  56. close(server_fd);
  57. }
  58. TEST_F(bind_timewait, 1)
  59. {
  60. int fd, ret;
  61. create_timewait_socket(_metadata, self);
  62. fd = socket(AF_INET, SOCK_STREAM, 0);
  63. ASSERT_GT(fd, 0);
  64. ret = bind(fd, (struct sockaddr *)&self->addr, self->addrlen);
  65. ASSERT_EQ(ret, -1);
  66. ASSERT_EQ(errno, EADDRINUSE);
  67. close(fd);
  68. }
  69. TEST_HARNESS_MAIN