Week 4 Updates
Scenario for the week -
- PMTU discovery
I am currently working on PMTU discovery. Recently, I have been encoutering a strange error while running the test scripts for packetdrill.
So the current test script which I have made looks like this -
// Test for Path MTU Discovery // Establish the connection 0.000 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3 0.000 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0 0.000 bind(3, ..., ...) = 0 0.000 listen(3, 1) = 0 0.100 < S 0:0(0) win 65535 <mss 1460,sackOK,nop,nop,nop,wscale 7> 0.100 > S. 0:0(0) ack 1 <...> 0.200 < . 1:1(0) ack 1 win 65535 0.200 accept(3, ..., ...) = 4 // We send 10 data segments 0.200 write(4, ..., 14600) = 14600 0.200 > P. 1:14601(14600) ack 1 // On receiving 10 data segments at once, the client should send // an ICMP error saying that fragmentation is required. 0.250 < [1:1461(1460)] icmp unreachable frag_needed mtu 1200
So the first odd thing which happens is that I get variable behavior on running the same script at different times. These are the two logs which I get -
▶ sudo ./packetdrill -v tests/bsd/tcp/pmtu_discovery/pmtu.pkt inbound injected packet: 0.100013 S 0:0(0) win 65535 <mss 1460,sackOK,nop,nop,nop,wscale 7> outbound sniffed packet: 0.100398 S. 3901362643:3901362643(0) ack 1 win 65535 <mss 1160,nop,wscale 6,sackOK,eol,eol> inbound injected packet: 0.200013 . 1:1(0) ack 3901362644 win 65535 outbound sniffed packet: 0.200425 . 3901362644:3901363804(1160) ack 1 win 1033 tests/bsd/tcp/pmtu_discovery/pmtu.pkt:16: error handling packet: live packet field ipv4_total_length: expected: 14640 (0x3930) vs actual: 1200 (0x4b0) script packet: 0.200000 P. 1:14601(14600) ack 1 actual packet: 0.200425 . 1:1161(1160) ack 1 win 1033
▶ sudo ./packetdrill -v tests/bsd/tcp/pmtu_discovery/pmtu.pkt inbound injected packet: 0.100015 S 0:0(0) win 65535 <mss 1460,sackOK,nop,nop,nop,wscale 7> outbound sniffed packet: 0.100368 S. 1553908903:1553908903(0) ack 1 win 65535 <mss 1460,nop,wscale 6,sackOK,eol,eol> inbound injected packet: 0.200013 . 1:1(0) ack 1553908904 win 65535 outbound sniffed packet: 0.200425 . 1553908904:1553910364(1460) ack 1 win 1026 tests/bsd/tcp/pmtu_discovery/pmtu.pkt:16: error handling packet: live packet field ipv4_total_length: expected: 14640 (0x3930) vs actual: 1500 (0x5dc) script packet: 0.200000 P. 1:14601(14600) ack 1 actual packet: 0.200425 . 1:1461(1460) ack 1 win 1026
As it can be seen, I am getting different window sizes from server at different times. This seems odd.
The thing which I am not able to understand is why is it that I am getting an error on sending a P. at 0.200 ms. The expected behaviour should be that I get an ICMP message.
Update
Thanks to Michael for pointing out the mistake I was doing.
0.200 > P. 1:14601(14600) ack 1
This line means that I am sending down one big TCP segment to the NIC. This is supposed to work only if the card reports an interface MTU of more than 14600+ overhead, which is not true on FreeBSD.
One thing which I did wrong was I didn't explain the whole situation properly. Between the two log traces which I posted here, I also injected the ICMP packet just to test. Since FreeBSD stored this MTU of 1500 bytes for sometime, as a result I got the second log (which actually was scaring me the whole time )
The point which now remains, how will be able to implement this test ? I will have to figure out some other means for dealing with this problem.