• Simon Vincent's avatar
    ieee802154: 6lowpan: ensure header compression does not corrupt ipv6 header · f19f4f95
    Simon Vincent authored
    The 6lowpan ipv6 header compression was causing problems for other interfaces
    that expected a ipv6 header to still be in place, as we were replacing the
    ipv6 header with a compressed version. This happened if you sent a packet to a
    multicast address as the packet would be output on 802.15.4, ethernet, and also
    be sent to the loopback interface. The skb data was shared between these
    interfaces so all interfaces ended up with a compressed ipv6 header.
    
    The solution is to ensure that before we do any header compression we are not
    sharing the skb or skb data with any other interface. If we are then we must
    take a copy of the skb and skb data before modifying the ipv6 header.
    The only place we can copy the skb is inside the xmit function so we don't
    leave dangling references to skb.
    
    This patch moves all the header compression to inside the xmit function. Very
    little code has been changed it has mostly been moved from lowpan_header_create
    to lowpan_xmit. At the top of the xmit function we now check if the skb is
    shared and if so copy it. In lowpan_header_create all we do now is store the
    source and destination addresses for use later when we compress the header.
    Signed-off-by: default avatarSimon Vincent <simon.vincent@xsilon.com>
    Signed-off-by: default avatarAlexander Aring <alex.aring@gmail.com>
    Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
    f19f4f95
6lowpan_rtnl.c 18.5 KB