• Hannes Frederic Sowa's avatar
    ipv4: fix DO and PROBE pmtu mode regarding local fragmentation with UFO/CORK · daba287b
    Hannes Frederic Sowa authored
    UFO as well as UDP_CORK do not respect IP_PMTUDISC_DO and
    IP_PMTUDISC_PROBE well enough.
    
    UFO enabled packet delivery just appends all frags to the cork and hands
    it over to the network card. So we just deliver non-DF udp fragments
    (DF-flag may get overwritten by hardware or virtual UFO enabled
    interface).
    
    UDP_CORK does enqueue the data until the cork is disengaged. At this
    point it sets the correct IP_DF and local_df flags and hands it over to
    ip_fragment which in this case will generate an icmp error which gets
    appended to the error socket queue. This is not reflected in the syscall
    error (of course, if UFO is enabled this also won't happen).
    
    Improve this by checking the pmtudisc flags before appending data to the
    socket and if we still can fit all data in one packet when IP_PMTUDISC_DO
    or IP_PMTUDISC_PROBE is set, only then proceed.
    
    We use (mtu-fragheaderlen) to check for the maximum length because we
    ensure not to generate a fragment and non-fragmented data does not need
    to have its length aligned on 64 bit boundaries. Also the passed in
    ip_options are already aligned correctly.
    
    Maybe, we can relax some other checks around ip_fragment. This needs
    more research.
    Signed-off-by: default avatarHannes Frederic Sowa <hannes@stressinduktion.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    daba287b
ip_output.c 38.1 KB