From: Simon Vincent <simon.vincent@xsilon.com>
To: Alexander Aring <alex.aring@gmail.com>
Cc: linux-wpan@vger.kernel.org, werner@almesberger.net, mkl@pengutronix.de
Subject: Re: 6lowpan raw socket problems
Date: Fri, 19 Sep 2014 10:57:32 +0100 [thread overview]
Message-ID: <541BFE0C.1050707@xsilon.com> (raw)
In-Reply-To: <20140919093335.GB17051@omega>
On 19/09/14 10:33, Alexander Aring wrote:
> On Fri, Sep 19, 2014 at 09:27:05AM +0100, Simon Vincent wrote:
> ...
>>> Yep, then you could try to test what I did there. Simple save the
>>> address information in reserved skb data and then replacing data in
>>> lowpan_xmit callback. This also solves the capture on lowpan interfaces.
>>>
>>> lowpan_xmit should be save to replacing the header.
>> I am not 100% sure it is safe to replace the header at any point. How can
> me, too. We need to check that.
>
>> you guarantee that the skb has been read by the user application RAW socket
>> by this point? The user might not read the socket for seconds/minutes/hours.
>>
> no this can't happen. I need to dig into the code and running some
> ftrace to check if this can work. The RAW socket should not involved here.
>
> My theory is:
>
> The current behaviour is maybe (Maybe, because it's an assumption).
>
> - IPv6 neighbor discovery magic
> - calling create callback of header ops
> This callback is only there to add data there not replacing data.
> We do REPLACING the data so we can't parse the skb IPv6 header
> anymore.
> - After calling create callback of header ops IPv6 stack parse the
> IPv6 header data which is inside of skb. We already replaced the
> IPv6 header with 6LoWPAN header, so we can't parse it anymore but
> IPv6 does it. -> WEIRD things happen.
> - Finally lowpan interface calling xmit callback, this is at the end
> of doing Layer 3 things, so we should sure that nobody parse it there.
> What we do there is to queue the skb in the lower wpan interface.
>
>
> The solution would be (maybe):
> - IPv6 neighbor discovery magic
> - calling create callback of header ops
> Putting necessary address information in skb reserved data. What
> this means, see below. We don't replace the IPv6 header.
> - After calling create callback of header ops IPv6 stack parse the
> IPv6 header data which is inside of skb. We don't replace the
> IPv6 header with 6LoWPAN header. -> all things are fine.
> - Finally lowpan interface calling xmit callback, this is at the end
> of doing Layer 3 things. Here we start to replacing IPv6 header
> with 6LoWPAN header. The thing is, we need the address information
> from create callback, that's why we saved it in skb reserved data.
>
>
It does not look like it is safe to do it at xmit callback either. I
have added debug printing out skb_shinfo(skb)->dataref in the compress
function as well as the lowpan_xmit function and there are 3 refs to the
data at both points. This makes sense as the packet would be sent to the
802.15.4/ethernet/rawsocket as it is a multicast packet.
I think the only solution is to do a full copy of the packet in the
6lowpan layer. Then we can modify the headers as much as we like. I know
there is an overhead doing this but I can't see another way of avoiding
this issue.
Simon
>
> What is the skb reserved data?
>
> We have a headroom and tailroom and then 4 pointers in the skb.
> _________________________________________________________________
> | headroom | used skb data.... | tailroom |
> ^---------------^------------------------------^----------------^
>
> The '^' chars are pointers (don't know the real name in sk_buff struct,
> but data should be pointed at begin of "used skb data".
>
> What I did in the rework is:
> - check if headroom is big enough to save "struct lowpan_addr"
> - place lowpan_addr information in pointer:
> (skb->data - (sizeof(struct lowpan_addr))).
>
> So this will crash when somebody make a skb_pull and skb_push in the
> middle of callback "create" of header_ops and lowpan_xmit callback.
> And manipulate data in there, or he do that like above without calling
> skb_foo functions.
> I don't know if there exist a state that this could happen.
> But I think in create callback of header_ops we have already the full
> IPv6 header, so I don't see why some IPv6 stack implementation should
> replacing it afterwards.
>
> Do you follow this here?
>
>> Also who should free the skb?
>>
>> Is is worth clarifying this with the netdev mailing list?
> To make a real solution for this issue, of course. I have only this one
> idea. To save address information into skb reserved data. We can't use
> skb->cb here, I already want to tried that. David Miller said to me that
> skb->cb could be overwritten by traffic control framework.
>
> I would first give a try if the above one fix your issue with RAW
> sockets.
>
> I cc Marc here, a co-worker of mine. Maybe he has also some other
> solution for this.
>
> - Alex
next prev parent reply other threads:[~2014-09-19 9:57 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-18 7:46 6lowpan raw socket problems Simon Vincent
2014-09-18 8:33 ` Alexander Aring
2014-09-18 8:37 ` Simon Vincent
2014-09-18 8:45 ` Alexander Aring
2014-09-18 8:54 ` Alexander Aring
2014-09-18 9:03 ` Simon Vincent
2014-09-18 9:44 ` Alexander Aring
2014-09-18 9:45 ` Alexander Aring
2014-09-18 14:02 ` Simon Vincent
2014-09-18 14:19 ` Alexander Aring
2014-09-18 15:54 ` Simon Vincent
2014-09-18 16:30 ` Alexander Aring
2014-09-18 16:37 ` Alexander Aring
2014-09-18 17:03 ` Simon Vincent
2014-09-18 17:09 ` Alexander Aring
2014-09-19 8:27 ` Simon Vincent
2014-09-19 9:33 ` Alexander Aring
2014-09-19 9:57 ` Simon Vincent [this message]
2014-09-19 10:15 ` Alexander Aring
2014-09-19 10:39 ` Alexander Aring
2014-09-19 11:08 ` Alexander Aring
2014-09-19 11:27 ` Simon Vincent
2014-09-19 11:45 ` Alexander Aring
2014-09-19 11:50 ` Alexander Aring
2014-09-19 11:59 ` Alexander Aring
2014-09-19 12:00 ` Simon Vincent
2014-09-19 12:06 ` Alexander Aring
2014-09-19 12:38 ` Alexander Aring
2014-09-19 12:44 ` Simon Vincent
2014-09-19 12:55 ` Alexander Aring
2014-09-19 12:57 ` Alexander Aring
2014-09-19 14:14 ` Simon Vincent
2014-09-19 14:21 ` Alexander Aring
2014-09-19 14:22 ` Alexander Aring
[not found] <5419ABD6.70607@xsilon.com>
2014-09-17 15:43 ` Simon Vincent
[not found] <1409567774.3120.57.camel@jrissane-mobl.ger.corp.intel.com>
2014-09-01 11:38 ` 6lowpan status Alexander Aring
2014-09-02 6:08 ` Jukka Rissanen
2014-09-02 7:12 ` Alexander Aring
2014-09-02 7:26 ` Alexander Aring
2014-09-02 14:21 ` 6lowpan raw socket problems Simon Vincent
2014-09-02 14:43 ` Alexander Aring
2014-09-02 14:51 ` Simon Vincent
2014-09-02 15:18 ` Alexander Aring
2014-09-02 15:37 ` Alexander Aring
2014-09-02 16:06 ` Simon Vincent
2014-09-02 16:26 ` Alexander Aring
2014-09-02 18:53 ` Martin Townsend
2014-09-08 10:43 ` Alexander Aring
2014-09-17 13:30 ` Simon Vincent
2014-09-17 13:57 ` Alexander Aring
[not found] ` <5419A9DD.5070804@xsilon.com>
2014-09-17 16:03 ` Alexander Aring
2014-09-17 16:17 ` Alexander Aring
2014-09-18 7:55 ` Simon Vincent
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=541BFE0C.1050707@xsilon.com \
--to=simon.vincent@xsilon.com \
--cc=alex.aring@gmail.com \
--cc=linux-wpan@vger.kernel.org \
--cc=mkl@pengutronix.de \
--cc=werner@almesberger.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.