google / packetdrill

The official Google release of packetdrill
GNU General Public License v2.0
887 stars 220 forks source link

net-test: packetdrill: add support of tcp option wildcard "wscale *" #75

Open chantra opened 1 year ago

chantra commented 1 year ago

Summary: In current script, we can either specify every tcp option of a packet, or use <...> for "any tcp options". This is not flexible enough, as some script may have requirements for some tcp options; while be flexible with other options.

This patch tries to address this by adding wildcard for option wscale. Specifically, "wscale *" in the tcp option list means any wscale value.

To mark a tcp option in the script as wildcard, we leverage the highest bit of tcp_option->kind, as TCPOPT_WILDCARD (0x80). tcp_option->kind of TCPOPT_WILDCARD | TCPOPT_WINDOW (0x83) means wscale option of any value.

verify_outbound_live_tcp_options() is updated to be able to understand TCPOPT_WILDCARD when set on the script packet and with TCPOPT_WINDOW.

Testing: Using a script that currently fail on my environment with wscale:

$ sudo ./packetdrill/run_all.py -S -v  -L -l
tcp/zerocopy/fastopen-client.pkt
FAIL
[/data/users/chantra/google-packetdrill/gtests/net/tcp/zerocopy/fastopen-client.pkt
(ipv4)]
stdout:
stderr:
fastopen-client.pkt:17: error handling packet: bad value outbound TCP
option 3
script packet:  0.000105 S 0:0(0) <mss 1460,sackOK,TS val 1000 ecr
0,nop,wscale 8,FO,nop,nop>
actual packet:  0.000095 S 0:0(0) win 65535 <mss 1460,sackOK,TS val 1000
ecr 0,nop,wscale 9,FO,nop,nop>
FAIL
[/data/users/chantra/google-packetdrill/gtests/net/tcp/zerocopy/fastopen-client.pkt
(ipv6)]
stdout:
stderr:
fastopen-client.pkt:17: error handling packet: bad value outbound TCP
option 3
script packet:  0.000157 S 0:0(0) <mss 1460,sackOK,TS val 1000 ecr
0,nop,wscale 8,FO,nop,nop>
actual packet:  0.000145 S 0:0(0) win 65535 <mss 1460,sackOK,TS val 1000
ecr 0,nop,wscale 9,FO,nop,nop>
FAIL
[/data/users/chantra/google-packetdrill/gtests/net/tcp/zerocopy/fastopen-client.pkt
(ipv4-mapped-v6)]
stdout:
stderr:
fastopen-client.pkt:17: error handling packet: bad value outbound TCP
option 3
script packet:  0.000118 S 0:0(0) <mss 1460,sackOK,TS val 1000 ecr
0,nop,wscale 8,FO,nop,nop>
actual packet:  0.000106 S 0:0(0) win 65535 <mss 1460,sackOK,TS val 1000
ecr 0,nop,wscale 9,FO,nop,nop>
Ran    3 tests:    0 passing,    3 failing,    0 timed out (2.69 sec):
tcp/zerocopy/fastopen-client.pkt

Changed the wscale to wildcard:

$ diff -ruN tcp/zerocopy/fastopen-client.pkt
tcp/zerocopy/fastopen-client-wscale-wildcard.pkt
--- tcp/zerocopy/fastopen-client.pkt    2023-06-27 18:36:22.956369457
-0700
+++ tcp/zerocopy/fastopen-client-wscale-wildcard.pkt    2023-06-27
18:37:29.306312093 -0700
@@ -14,7 +14,7 @@
    +0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
    +0 setsockopt(3, SOL_SOCKET, SO_ZEROCOPY, [1], 4) = 0
    +0 sendto(3, ..., 500, MSG_FASTOPEN|MSG_ZEROCOPY, ..., ...) = -1
EINPROGRESS (Operation now in progress)
-   +0 > S 0:0(0) <mss 1460,sackOK,TS val 1000 ecr 0,nop,wscale
    8,FO,nop,nop>
+   +0 > S 0:0(0) <mss 1460,sackOK,TS val 1000 ecr 0,nop,wscale
    *,FO,nop,nop>
  +.01 < S. 123:123(0) ack 1 win 14600 <mss 940,TS val 2000 ecr
1000,sackOK,nop,wscale 6, FO abcd1234,nop,nop>
    +0 > . 1:1(0) ack 1 <nop,nop,TS val 1001 ecr 2000>

@@ -35,7 +35,7 @@
    +0 fcntl(5, F_SETFL, O_RDWR|O_NONBLOCK) = 0
    +0 setsockopt(5, SOL_SOCKET, SO_ZEROCOPY, [1], 4) = 0
    +0 sendto(5, ..., 500, MSG_FASTOPEN|MSG_ZEROCOPY, ..., ...) = 500
-   +0 > S 0:500(500) <mss 1460,nop,nop,sackOK,nop,wscale 8,FO
    abcd1234,nop,nop>
+   +0 > S 0:500(500) <mss 1460,nop,nop,sackOK,nop,wscale *,FO
    abcd1234,nop,nop>
  +.05 < S. 5678:5678(0) ack 501 win 14600 <mss
1460,nop,nop,sackOK,nop,wscale 6>
    +0 > . 501:501(0) ack 1

and confirmed the test now pass:

$ sudo ./packetdrill/run_all.py -S -v  -L -l
tcp/zerocopy/fastopen-client-wscale-wildcard.pkt
OK
[/data/users/chantra/google-packetdrill/gtests/net/tcp/zerocopy/fastopen-client-wscale-wildcard.pkt
(ipv4)]
stdout:
stderr:
OK
[/data/users/chantra/google-packetdrill/gtests/net/tcp/zerocopy/fastopen-client-wscale-wildcard.pkt
(ipv6)]
stdout:
stderr:
OK
[/data/users/chantra/google-packetdrill/gtests/net/tcp/zerocopy/fastopen-client-wscale-wildcard.pkt
(ipv4-mapped-v6)]
stdout:
stderr:
Ran    3 tests:    3 passing,    0 failing,    0 timed out (7.91 sec):
tcp/zerocopy/fastopen-client-wscale-wildcard.pkt

and also still work properly when the wscale is matching expectations:

$ diff -ruN tcp/zerocopy/fastopen-client.pkt tcp/zerocopy/fastopen-client-correct-wscale.pkt
--- tcp/zerocopy/fastopen-client.pkt    2023-06-27 18:36:22.956369457
-0700
+++ tcp/zerocopy/fastopen-client-correct-wscale.pkt     2023-06-27
18:39:24.630212385 -0700
@@ -14,7 +14,7 @@
    +0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
    +0 setsockopt(3, SOL_SOCKET, SO_ZEROCOPY, [1], 4) = 0
    +0 sendto(3, ..., 500, MSG_FASTOPEN|MSG_ZEROCOPY, ..., ...) = -1
EINPROGRESS (Operation now in progress)
-   +0 > S 0:0(0) <mss 1460,sackOK,TS val 1000 ecr 0,nop,wscale
    8,FO,nop,nop>
+   +0 > S 0:0(0) <mss 1460,sackOK,TS val 1000 ecr 0,nop,wscale
    9,FO,nop,nop>
  +.01 < S. 123:123(0) ack 1 win 14600 <mss 940,TS val 2000 ecr
1000,sackOK,nop,wscale 6, FO abcd1234,nop,nop>
    +0 > . 1:1(0) ack 1 <nop,nop,TS val 1001 ecr 2000>

@@ -35,7 +35,7 @@
    +0 fcntl(5, F_SETFL, O_RDWR|O_NONBLOCK) = 0
    +0 setsockopt(5, SOL_SOCKET, SO_ZEROCOPY, [1], 4) = 0
    +0 sendto(5, ..., 500, MSG_FASTOPEN|MSG_ZEROCOPY, ..., ...) = 500
-   +0 > S 0:500(500) <mss 1460,nop,nop,sackOK,nop,wscale 8,FO
    abcd1234,nop,nop>
+   +0 > S 0:500(500) <mss 1460,nop,nop,sackOK,nop,wscale 9,FO
    abcd1234,nop,nop>
  +.05 < S. 5678:5678(0) ack 501 win 14600 <mss
1460,nop,nop,sackOK,nop,wscale 6>
    +0 > . 501:501(0) ack 1

with

$ sudo ./packetdrill/run_all.py -S -v  -L -l tcp/zerocopy/fastopen-client-correct-wscale.pkt
OK
[/data/users/chantra/google-packetdrill/gtests/net/tcp/zerocopy/fastopen-client-correct-wscale.pkt
(ipv4)]
stdout:
stderr:
OK
[/data/users/chantra/google-packetdrill/gtests/net/tcp/zerocopy/fastopen-client-correct-wscale.pkt
(ipv6)]
stdout:
stderr:
OK
[/data/users/chantra/google-packetdrill/gtests/net/tcp/zerocopy/fastopen-client-correct-wscale.pkt
(ipv4-mapped-v6)]
stdout:
stderr:
Ran    3 tests:    3 passing,    0 failing,    0 timed out (8.16 sec):
tcp/zerocopy/fastopen-client-correct-wscale.pkt

Also comfirmed that wscale wildcard would not cause and option which has 0x80 set to pass.

For instance with:

$ diff -ruN tcp/fastopen/server/simple2.pkt
tcp/fastopen/server/simple2-wscale.pkt
--- tcp/fastopen/server/simple2.pkt     2023-06-27 17:28:58.547790456
-0700
+++ tcp/fastopen/server/simple2-wscale.pkt      2023-06-27
19:00:49.460036441 -0700
@@ -22,7 +22,7 @@

    +0 < S 9873242:9873242(0) win 10000 <mss 1012,FOEXP,sackOK,TS val 1
ecr 0,nop,wscale 7>
 // Test the cookie is as expected by encoding both IPs w/ key
-   +0 > S. 0:0(0) ack 9873243 <mss 1460,sackOK,TS val 10000 ecr
    1,nop,wscale 8, FOEXP 1313a2da994a0951>
+   +0 > S. 0:0(0) ack 9873243 <mss 1460,sackOK,TS val 10000 ecr
    1,nop,wscale *, FOEXP f49b0ef989d9f624>
   +.1 < . 1:1(0) ack 1 win 257 <nop,nop,TS val 2 ecr 10000>
    +0 accept(3, ..., ...) = 4
    +0 close(4) = 0
@@ -38,8 +38,8 @@
    +0 bind(3, ..., ...) = 0
    +0 listen(3, 1) = 0

- +.05 < S 19124022:19125022(1000) win 10000 <mss 1012,FOEXP
  1313a2da994a0951,sackOK,TS val 10 ecr 0,nop,wscale 7>
-   +0 > S. 0:0(0) ack 19125023 <mss 1460,sackOK,TS val 100000 ecr
    10,nop,wscale 8>
+ +.05 < S 19124022:19125022(1000) win 10000 <mss 1012,FOEXP
  f49b0ef989d9f624,sackOK,TS val 10 ecr 0,nop,wscale 7>
+   +0 > S. 0:0(0) ack 19125023 <mss 1460,sackOK,TS val 100000 ecr
    10,nop,wscale 9>
    +0 accept(3, ..., ...) = 4

 `/tmp/sysctl_restore_${PPID}.sh`

The test fails at handling Fast Open Experimental

simple2-wscale.pkt:25: error handling packet: bad value outbound TCP
option 254
script packet:  0.000163 S. 0:0(0) ack 9873243 <mss 1460,sackOK,TS val
10000 ecr 1,nop,wscale *,FOEXP f49b0ef989d9f624>
actual packet:  0.000159 S. 0:0(0) ack 9873243 win 65535 <mss
1460,sackOK,TS val 10000 ecr 1,nop,wscale 9,FOEXP 792f542eed8979b8>
OK
[/data/users/chantra/google-packetdrill/gtests/net/tcp/fastopen/server/simple2-wscale.pkt
(ipv4-mapped-v6)]
google-cla[bot] commented 1 year ago

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

chantra commented 1 year ago

@nealcardwell I forced pushed the change with my corp email address. CLA bot is now happy.