tcp_timestamping_server.pkt 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. // SPDX-License-Identifier: GPL-2.0
  2. // Test tx timestamping for server-side (IPv4).
  3. `./defaults.sh
  4. `
  5. // Initialize connection
  6. 0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
  7. +0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
  8. +0 bind(3, ..., ...) = 0
  9. +0 listen(3, 1) = 0
  10. +0 < S 0:0(0) win 32792 <mss 1000,sackOK,nop,nop,nop,wscale 10>
  11. +0 > S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
  12. +.01 < . 1:1(0) ack 1 win 514
  13. +0 accept(3, ..., ...) = 4
  14. +0 setsockopt(4, SOL_SOCKET, SO_TIMESTAMPING,
  15. [SOF_TIMESTAMPING_TX_SCHED | SOF_TIMESTAMPING_TX_SOFTWARE |
  16. SOF_TIMESTAMPING_TX_ACK | SOF_TIMESTAMPING_SOFTWARE |
  17. SOF_TIMESTAMPING_OPT_ID], 4) = 0
  18. // Write two 2KB chunks.
  19. // setsockopt(..., [SOF_TIMESTAMPING_SOFTWARE | SOF_TIMESTAMPING_OPT_ID], ...)
  20. // is called after when SYN is acked. So, we expect the last byte of the first
  21. // and the second chunks to have timestamp keys of 1999 (i.e., 2000 - 1) and
  22. // 3999 (i.e., 4000 - 1) respectively.
  23. +0 write(4, ..., 2000) = 2000
  24. +0 write(4, ..., 2000) = 2000
  25. +0 > P. 1:2001(2000) ack 1
  26. +0 > P. 2001:4001(2000) ack 1
  27. +.01 < . 1:1(0) ack 2001 win 514
  28. +.01 < . 1:1(0) ack 4001 win 514
  29. // Make sure that internal TCP timestamps are not overwritten and we have sane
  30. // RTT measurement.
  31. +0 %{
  32. assert 5000 <= tcpi_rtt <= 20000, 'srtt=%d us' % tcpi_rtt
  33. }%
  34. // SCM_TSTAMP_SCHED for the first chunk should be received almost immediately
  35. // after write at t=10ms.
  36. +0 recvmsg(4, {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=10000000}},
  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=1999}}
  51. ]}, MSG_ERRQUEUE) = 0
  52. // SCM_TSTAMP_SND for the first chunk should be received almost immediately
  53. // after write at t=10ms.
  54. +0 recvmsg(4, {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=10000000}},
  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=1999}}
  69. ]}, MSG_ERRQUEUE) = 0
  70. // SCM_TSTAMP_SCHED for the second chunk should be received almost immediately
  71. // after that at t=10ms.
  72. +0 recvmsg(4, {msg_name(...)=...,
  73. msg_iov(1)=[{...,0}],
  74. msg_flags=MSG_ERRQUEUE|MSG_TRUNC,
  75. msg_control=[
  76. {cmsg_level=SOL_SOCKET,
  77. cmsg_type=SCM_TIMESTAMPING,
  78. cmsg_data={scm_sec=0,scm_nsec=10000000}},
  79. {cmsg_level=CMSG_LEVEL_IP,
  80. cmsg_type=CMSG_TYPE_RECVERR,
  81. cmsg_data={ee_errno=ENOMSG,
  82. ee_origin=SO_EE_ORIGIN_TIMESTAMPING,
  83. ee_type=0,
  84. ee_code=0,
  85. ee_info=SCM_TSTAMP_SCHED,
  86. ee_data=3999}}
  87. ]}, MSG_ERRQUEUE) = 0
  88. // SCM_TSTAMP_SND for the second chunk should be received almost immediately
  89. // after that at t=10ms.
  90. +0 recvmsg(4, {msg_name(...)=...,
  91. msg_iov(1)=[{...,0}],
  92. msg_flags=MSG_ERRQUEUE|MSG_TRUNC,
  93. msg_control=[
  94. {cmsg_level=SOL_SOCKET,
  95. cmsg_type=SCM_TIMESTAMPING,
  96. cmsg_data={scm_sec=0,scm_nsec=10000000}},
  97. {cmsg_level=CMSG_LEVEL_IP,
  98. cmsg_type=CMSG_TYPE_RECVERR,
  99. cmsg_data={ee_errno=ENOMSG,
  100. ee_origin=SO_EE_ORIGIN_TIMESTAMPING,
  101. ee_type=0,
  102. ee_code=0,
  103. ee_info=SCM_TSTAMP_SND,
  104. ee_data=3999}}
  105. ]}, MSG_ERRQUEUE) = 0
  106. // SCM_TSTAMP_ACK for the first chunk should be received at t=20ms.
  107. +0 recvmsg(4, {msg_name(...)=...,
  108. msg_iov(1)=[{...,0}],
  109. msg_flags=MSG_ERRQUEUE|MSG_TRUNC,
  110. msg_control=[
  111. {cmsg_level=SOL_SOCKET,
  112. cmsg_type=SCM_TIMESTAMPING,
  113. cmsg_data={scm_sec=0,scm_nsec=20000000}},
  114. {cmsg_level=CMSG_LEVEL_IP,
  115. cmsg_type=CMSG_TYPE_RECVERR,
  116. cmsg_data={ee_errno=ENOMSG,
  117. ee_origin=SO_EE_ORIGIN_TIMESTAMPING,
  118. ee_type=0,
  119. ee_code=0,
  120. ee_info=SCM_TSTAMP_ACK,
  121. ee_data=1999}}
  122. ]}, MSG_ERRQUEUE) = 0
  123. // SCM_TSTAMP_ACK for the second chunk should be received at t=30ms.
  124. +0 recvmsg(4, {msg_name(...)=...,
  125. msg_iov(1)=[{...,0}],
  126. msg_flags=MSG_ERRQUEUE|MSG_TRUNC,
  127. msg_control=[
  128. {cmsg_level=SOL_SOCKET,
  129. cmsg_type=SCM_TIMESTAMPING,
  130. cmsg_data={scm_sec=0,scm_nsec=30000000}},
  131. {cmsg_level=CMSG_LEVEL_IP,
  132. cmsg_type=CMSG_TYPE_RECVERR,
  133. cmsg_data={ee_errno=ENOMSG,
  134. ee_origin=SO_EE_ORIGIN_TIMESTAMPING,
  135. ee_type=0,
  136. ee_code=0,
  137. ee_info=SCM_TSTAMP_ACK,
  138. ee_data=3999}}
  139. ]}, MSG_ERRQUEUE) = 0