• Eric Dumazet's avatar
    ip: take care of last fragment in ip_append_data · 59104f06
    Eric Dumazet authored
    While investigating a bit, I found ip_fragment() slow path was taken
    because ip_append_data() provides following layout for a send(MTU +
    N*(MTU - 20)) syscall :
    
    - one skb with 1500 (mtu) bytes
    - N fragments of 1480 (mtu-20) bytes (before adding IP header)
    last fragment gets 17 bytes of trail data because of following bit:
    
    	if (datalen == length + fraggap)
    		alloclen += rt->dst.trailer_len;
    
    Then esp4 adds 16 bytes of data (while trailer_len is 17... hmm...
    another bug ?)
    
    In ip_fragment(), we notice last fragment is too big (1496 + 20) > mtu,
    so we take slow path, building another skb chain.
    
    In order to avoid taking slow path, we should correct ip_append_data()
    to make sure last fragment has real trail space, under mtu...
    Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    59104f06
ip_output.c 35.8 KB