]> git.baikalelectronics.ru Git - kernel.git/commit
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)
commit9d26b2a34ffe6639159df87b179f46ae4d0a3842
treee0f0090d9b1b96fa67f29a8dfbf639e80a07d4b8
parent99bb22d17a5fb4fdeb1579a3178ed30aa9f3a87e
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