tcp_timestamping_client-only-last-byte.pkt 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // SPDX-License-Identifier: GPL-2.0
  2. // Test that tx timestamping sends timestamps only for
  3. // the last byte of each sendmsg.
  4. `./defaults.sh
  5. `
  6. // Create a socket and set it to non-blocking.
  7. 0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
  8. +0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
  9. +0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
  10. // Establish connection and verify that there was no error.
  11. +0 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
  12. +0 > S 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 8>
  13. +.01 < S. 0:0(0) ack 1 win 20000 <mss 1000,nop,nop,sackOK>
  14. +0 > . 1:1(0) ack 1
  15. +0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
  16. +0 fcntl(3, F_SETFL, O_RDWR) = 0 // set back to blocking
  17. +0 setsockopt(3, SOL_SOCKET, SO_TIMESTAMPING,
  18. [SOF_TIMESTAMPING_TX_SCHED | SOF_TIMESTAMPING_TX_SOFTWARE |
  19. SOF_TIMESTAMPING_TX_ACK | SOF_TIMESTAMPING_SOFTWARE |
  20. SOF_TIMESTAMPING_OPT_ID], 4) = 0
  21. +0 write(3, ..., 11000) = 11000
  22. +0 > P. 1:10001(10000) ack 1
  23. +.01 < . 1:1(0) ack 10001 win 4000
  24. +0 > P. 10001:11001(1000) ack 1
  25. +.01 < . 1:1(0) ack 11001 win 4000
  26. // Make sure that internal TCP timestamps are not overwritten and we have sane
  27. // RTT measurement.
  28. +0 %{
  29. assert 5000 <= tcpi_rtt <= 20000, 'srtt=%d us' % tcpi_rtt
  30. }%
  31. // SCM_TSTAMP_SCHED for the last byte should be received almost immediately
  32. // once 10001 is acked at t=20ms.
  33. // setsockopt(..., [SOF_TIMESTAMPING_SOFTWARE | SOF_TIMESTAMPING_OPT_ID], ...)
  34. // is called after when SYN is acked. So, we expect the last byte of the first
  35. // chunk to have a timestamp key of 10999 (i.e., 11000 - 1).
  36. +0 recvmsg(3, {msg_name(...)=...,
  37. msg_iov(1)=[{...,0}],
  38. msg_flags=MSG_ERRQUEUE|MSG_TRUNC,
  39. msg_control=[
  40. {cmsg_level=SOL_SOCKET,
  41. cmsg_type=SCM_TIMESTAMPING,
  42. cmsg_data={scm_sec=0,scm_nsec=20000000}},
  43. {cmsg_level=CMSG_LEVEL_IP,
  44. cmsg_type=CMSG_TYPE_RECVERR,
  45. cmsg_data={ee_errno=ENOMSG,
  46. ee_origin=SO_EE_ORIGIN_TIMESTAMPING,
  47. ee_type=0,
  48. ee_code=0,
  49. ee_info=SCM_TSTAMP_SCHED,
  50. ee_data=10999}}
  51. ]}, MSG_ERRQUEUE) = 0
  52. // SCM_TSTAMP_SND for the last byte should be received almost immediately
  53. // once 10001 is acked at t=20ms.
  54. +0 recvmsg(3, {msg_name(...)=...,
  55. msg_iov(1)=[{...,0}],
  56. msg_flags=MSG_ERRQUEUE|MSG_TRUNC,
  57. msg_control=[
  58. {cmsg_level=SOL_SOCKET,
  59. cmsg_type=SCM_TIMESTAMPING,
  60. cmsg_data={scm_sec=0,scm_nsec=20000000}},
  61. {cmsg_level=CMSG_LEVEL_IP,
  62. cmsg_type=CMSG_TYPE_RECVERR,
  63. cmsg_data={ee_errno=ENOMSG,
  64. ee_origin=SO_EE_ORIGIN_TIMESTAMPING,
  65. ee_type=0,
  66. ee_code=0,
  67. ee_info=SCM_TSTAMP_SND,
  68. ee_data=10999}}
  69. ]}, MSG_ERRQUEUE) = 0
  70. // SCM_TSTAMP_ACK for the last byte should be received at t=30ms.
  71. +0 recvmsg(3, {msg_name(...)=...,
  72. msg_iov(1)=[{...,0}],
  73. msg_flags=MSG_ERRQUEUE|MSG_TRUNC,
  74. msg_control=[
  75. {cmsg_level=SOL_SOCKET,
  76. cmsg_type=SCM_TIMESTAMPING,
  77. cmsg_data={scm_sec=0,scm_nsec=30000000}},
  78. {cmsg_level=CMSG_LEVEL_IP,
  79. cmsg_type=CMSG_TYPE_RECVERR,
  80. cmsg_data={ee_errno=ENOMSG,
  81. ee_origin=SO_EE_ORIGIN_TIMESTAMPING,
  82. ee_type=0,
  83. ee_code=0,
  84. ee_info=SCM_TSTAMP_ACK,
  85. ee_data=10999}}
  86. ]}, MSG_ERRQUEUE) = 0