• L
    tcp: prohibit TCP_REPAIR_OPTIONS if data was already sent · 0c175da7
    Lu Wei 提交于
    If setsockopt with option name of TCP_REPAIR_OPTIONS and opt_code
    of TCPOPT_SACK_PERM is called to enable sack after data is sent
    and dupacks are received , it will trigger a warning in function
    tcp_verify_left_out() as follows:
    
    ============================================
    WARNING: CPU: 8 PID: 0 at net/ipv4/tcp_input.c:2132
    tcp_timeout_mark_lost+0x154/0x160
    tcp_enter_loss+0x2b/0x290
    tcp_retransmit_timer+0x50b/0x640
    tcp_write_timer_handler+0x1c8/0x340
    tcp_write_timer+0xe5/0x140
    call_timer_fn+0x3a/0x1b0
    __run_timers.part.0+0x1bf/0x2d0
    run_timer_softirq+0x43/0xb0
    __do_softirq+0xfd/0x373
    __irq_exit_rcu+0xf6/0x140
    
    The warning is caused in the following steps:
    1. a socket named socketA is created
    2. socketA enters repair mode without build a connection
    3. socketA calls connect() and its state is changed to TCP_ESTABLISHED
       directly
    4. socketA leaves repair mode
    5. socketA calls sendmsg() to send data, packets_out and sack_outs(dup
       ack receives) increase
    6. socketA enters repair mode again
    7. socketA calls setsockopt with TCPOPT_SACK_PERM to enable sack
    8. retransmit timer expires, it calls tcp_timeout_mark_lost(), lost_out
       increases
    9. sack_outs + lost_out > packets_out triggers since lost_out and
       sack_outs increase repeatly
    
    In function tcp_timeout_mark_lost(), tp->sacked_out will be cleared if
    Step7 not happen and the warning will not be triggered. As suggested by
    Denis and Eric, TCP_REPAIR_OPTIONS should be prohibited if data was
    already sent.
    
    socket-tcp tests in CRIU has been tested as follows:
    $ sudo ./test/zdtm.py run -t zdtm/static/socket-tcp*  --keep-going \
           --ignore-taint
    
    socket-tcp* represent all socket-tcp tests in test/zdtm/static/.
    
    Fixes: b139ba4e ("tcp: Repair connection-time negotiated parameters")
    Signed-off-by: NLu Wei <luwei32@huawei.com>
    Reviewed-by: NEric Dumazet <edumazet@google.com>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    0c175da7
tcp.c 127.0 KB