Skip to content
  • Gerlando Falauto's avatar
    tipc: pskb_copy() buffers when sending on more than one bearer · 488fc9af
    Gerlando Falauto authored
    
    
    When sending packets, TIPC bearers use skb_clone() before writing their
    hardware header. This will however NOT copy the data buffer.
    So when the same packet is sent over multiple bearers (to reach multiple
    nodes), the same socket buffer data will be treated by multiple
    tipc_media drivers which will write their own hardware header through
    dev_hard_header().
    Most of the time this is not a problem, because by the time the
    packet is processed by the second media, it has already been sent over
    the first one. However, when the first transmission is delayed (e.g.
    because of insufficient bandwidth or through a shaper), the next bearer
    will overwrite the hardware header, resulting in the packet being sent:
    a) with the wrong source address, when bearers of the same type,
    e.g. ethernet, are involved
    b) with a completely corrupt header, or even dropped, when bearers of
    different types are involved.
    
    So when the same socket buffer is to be sent multiple times, send a
    pskb_copy() instead (from the second instance on), and release it
    afterwards (the bearer will skb_clone() it anyway).
    
    Signed-off-by: default avatarGerlando Falauto <gerlando.falauto@keymile.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    488fc9af