ieee802154: 6lowpan: ensure header compression does not corrupt ipv6 header
authorSimon Vincent <simon.vincent@xsilon.com>
Wed, 24 Sep 2014 10:21:33 +0000 (12:21 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 24 Sep 2014 12:15:08 +0000 (14:15 +0200)
commitf19f4f9525cf32f97341fac20ce66392e86a1b67
treee0f0090d9b1b96fa67f29a8dfbf639e80a07d4b8
parentca079ad6af0d9948101992d03e7145ab8b426f66
ieee802154: 6lowpan: ensure header compression does not corrupt ipv6 header

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: Simon Vincent <simon.vincent@xsilon.com>
Signed-off-by: Alexander Aring <alex.aring@gmail.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/ieee802154/6lowpan_rtnl.c